…imit, keep default action and upload service in one config source and never toggle off a recording the plugin did not start - The settings panel resolved every config key at once. At 8 keys it sat
exactly at the limit, so adding any key pushed the trailing reads onto
rejected spawns and they rendered blank.
- The reset button unset 12 keys at once, so the trailing keys were never
unset but still reported success.
Both paths now run one call at a time and only advance from the callback,
so the number of keys no longer matters. grabit's config is now the only source:
- A plain left-click sends mode default, which passes no action flag, so
grabit applies its own default_action. The menu's explicit entries still
pass their own flag.
- Uploads no longer append a second --<service> flag. Bare -u already uses
grabit's service key, so captures and recordings now upload to the same
destination.
- The panel reads and writes default_action, service, and capture.cursor
through grabit, and the plugin settings they duplicated are gone.
- Clearing the upload service unsets the key, since grabit rejects an empty
value.
- The select offers pin, which grabit also accepts as a default action, so
an existing pin value is no longer shown as copy and overwritten. grabit --record toggles on the pid file: when a recording is already live it
stops that one instead of starting a new one. The foreign-recording guard did
not cover the start path, because process detection only ran from update()
while the state was non-idle. Choosing Start recording while an externally
started recording existed therefore stopped it, then reported that the
recording failed to start.
startRecording now checks for a live grabit --record before dispatching and
refuses when one is running. While idle the service owns no pid, so any live
--record at that point is foreign. If process detection is unavailable the
start proceeds as before rather than blocking recording entirely.
Plugin
snowballons/grabitplugin.toml)What it does
Grabit Launcher puts grabit's screenshot, screen-recording, OCR, translation, pin, and upload actions one click away in Noctalia. It ships a bar widget (left-click default action, right-click mode menu, middle-click last region, scroll for fullscreen/window), a two-column mode menu, a settings panel, a control-center shortcut, and a click-through recording indicator layer that shows "Recording"/"Paused" with a live elapsed time on every output. The service owns grabit process tracking (PID ownership, pause/resume, foreign-recording guard) and publishes state so the widget, shortcut, and layer stay in sync.
External dependencies
grabit— all capture, recording, pause/resume, pin, OCR/translation, and upload work; the plugin also reads and writes grabit's config through its CLI.sleep— the short delay before a capture so a closing panel is not captured.xdg-open— opens the grabit config directory from the settings panel.No network calls are made by the plugin itself. Uploads happen only inside grabit when the user picks an upload action.
Testing
Exercised on a live Sway session:
grabit set/unsetcalls foralso_save,format,filename/filename_preset,recording.fps/recording.format/recording.crf, andtranslate.targetwere verified against the binary, including rejection of invalid values.pin-grab/pin-releasespawns verified; the OCR + translate command was run directly against the binary.99a892d,--profile community) reportsValidated 1 plugin manifest(s).Screenshots / Videos
Checklist
Ready-for-review requirement: Every box in this section must be checked. If any statement is not true, keep the
pull request as Draft. An explanation does not replace a required check.
Manifest descriptions and all README prose must be English; no translated sections or localized README copies.
idafter the/inplugin.tomlexactly.plugin.toml,README.md,thumbnail.webp, andtranslations/en.json.README.mdfollows theREADME template, documents
every entry id and dependency, and includes exact panel IPC commands and launcher prefixes where applicable.
thumbnail.webpis present and relevant; for a new plugin I created it with the thumbnail generator, and for an update I regenerated it with the generator if the visual identity or user-facing appearance changed.versionfollows semver and is bumped in this PR;plugin_apiis the oldest API level this plugin requires.understand that language well enough to review and maintain it (no unreviewed machine/LLM translations).
catalog.toml; CI generates it.Code review attestation
Plugins run as trusted, unsandboxed Luau in the user's session. Confirm:
Ready-for-review requirement: Every attestation below must be checked.
licensedeclared inplugin.toml.