Skip to content

feat(jetbrains-provider): add JetBrains Provider launcher plugin - #148

Merged
ItsLemmy merged 2 commits into
noctalia-dev:mainfrom
Cleboost:jetbrains-provider
Aug 1, 2026
Merged

feat(jetbrains-provider): add JetBrains Provider launcher plugin#148
ItsLemmy merged 2 commits into
noctalia-dev:mainfrom
Cleboost:jetbrains-provider

Conversation

@Cleboost

Copy link
Copy Markdown
Contributor

Plugin

  • Id: cleboost/jetbrains-provider
  • New plugin
  • Update to an existing plugin (version bumped in plugin.toml)

What it does

Expose recent JetBrains IDE projects in the Noctalia launcher via /jb.

External dependencies

Testing

  • Tested on Niri
  • Tested on Hyprland
  • Tested on Sway
  • Tested on another compositor:
  • Noctalia version tested against: 5.0.0_beta.6
  • Plugin API level: 3

Screenshots / Videos

image

Checklist

  • The directory name matches the part of id after the / in plugin.toml exactly.
  • It ships plugin.toml, README.md, thumbnail.webp, and translations/en.json.
  • README.md follows the
    README template, documents
    every entry id and dependency, and includes exact panel IPC commands and launcher prefixes where applicable.
  • I created thumbnail.webp with the thumbnail generator.
  • version follows semver and is bumped in this PR; plugin_api is the oldest API level this plugin requires.
  • Every non-English translation in this PR uses a locale supported by Noctalia core, and I can read, write, and
    understand that language well enough to review and maintain it (no unreviewed machine/LLM translations).
  • I did not edit catalog.toml; CI generates it.
  • This PR touches exactly one plugin directory.

Code review attestation

Plugins run as trusted, unsandboxed Luau in the user's session. Confirm:

  • The code is readable and not obfuscated, minified, or generated.
  • It does not download and execute remote code.
  • Every network call, filesystem write, and spawned process is something the description above accounts for.
  • I have the right to publish this code under the license declared in plugin.toml.

Expose recent JetBrains IDE projects in the Noctalia launcher via /jb.
@ItsLemmy

Copy link
Copy Markdown
Contributor
  1. non-blocking - jetbrains-provider/scan_projects.sh:9-20

The PRODUCTS prefix list omits IntelliJ IDEA Community Edition. JetBrains names that
config directory IdeaIC (for example ~/.config/JetBrains/IdeaIC2024.1), which
does not prefix-match "IntelliJIdea" or any other entry, so product_name() returns
non-zero and the loop at scan_projects.sh:176 skips the whole file. Community Edition
users get zero results from an IDE the plugin claims to cover.

jetbrains-provider/README.md:5 states the plugin lists "recent projects from all
JetBrains IDEs", which overstates coverage. Android Studio (AndroidStudio) is
likewise unmatched. PyCharm Community is fine because PyCharmCE matches the
"PyCharm" prefix.

Relatedly, the Toolbox slug table at jetbrains-provider/scan_projects.sh:35-46 maps
IntelliJIdea to "intellij-idea". Toolbox app directory naming has changed across Toolbox
versions, so a wrong slug is plausible, but this degrades gracefully: find_icon falls
through to the system icon directories and resolveLauncher falls back to the bare command
on PATH. No failure, only a missing icon.

  1. non-blocking - jetbrains-provider/jb_provider.luau:110

An empty scan result is never cached: cachedProjects = #projects > 0 and projects or nil.
Combined with debounce_ms = 0 in jetbrains-provider/plugin.toml:48, a user whose IDEs are
not detected (see finding 1, or simply no JetBrains install) re-runs the full scan on
every single keystroke typed after /jb. Each run globs the config tree and spawns one awk
per IDE directory, bounded only by the host's global async-command cap.

The same gap costs every user the keystrokes typed before the first scan returns, since
cachedProjects stays nil until then and onQuery fires a new loadProjects each time.

zed-provider/zed_provider.luau, which this file is structurally derived from, assigns
cachedProjects = projects unconditionally and does not have this behavior. Caching the
empty table is sufficient, since onQuery already clears the cache when the filter is empty.

  1. non-blocking - jetbrains-provider/scan_projects.sh:123-163

parse_xml does not decode XML entity references. recentProjects.xml stores the project
path XML-escaped, so a project under a directory containing &, <, or > is emitted
literally. Verified against a synthetic recentProjects.xml: a key of
"$USER_HOME$/code/my project & 'quotes'" is reported as
"/tmp/.../code/my project & 'quotes'". The launcher shows the mangled name and
onActivate passes the mangled path to the IDE, so the project fails to open.

  1. non-blocking - jetbrains-provider/thumbnail.webp

The rendered thumbnail title reads "JetBrain Provider", missing the trailing "s". The
manifest name at jetbrains-provider/plugin.toml:2 is "JetBrains Provider". Cosmetic, but
the thumbnail is the catalog's primary user-visible branding.

@ItsLemmy
ItsLemmy marked this pull request as draft July 29, 2026 13:22
Support IdeaIC and Android Studio, decode XML entities in project paths,
align launcher caching with zed, and update the catalog thumbnail.
@Cleboost
Cleboost marked this pull request as ready for review July 31, 2026 21:03
@ItsLemmy
ItsLemmy merged commit 86b5ce6 into noctalia-dev:main Aug 1, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants