A lightweight desktop sticker app for notes, timers, command output, and file previews.
Built with GPUI, powered by local SQLite, and designed to stay fast and simple.
- Markdown notes: quick editing, preview mode, and Ctrl+S save.
- Timers: countdown timers with an audible alert on completion.
- Command stickers: pin command output, with optional cron scheduling, env vars, and working directory. A scheduled sticker keeps running in the background even when its window is closed, and the sticker list shows which ones are running or waiting on their next tick.
- File / URL preview: preview files, folders, or URLs and pin them as stickers. Any number of previews can be open side by side; asking for the same files again raises the window that already shows them.
- Paint stickers: freehand drawing space for quick sketches.
- Show main window:
Ctrl + Alt + R(macOS also supportsCmd + Alt + R) - Toggle quick file preview:
Ctrl/Cmd + Alt - Open command for selected text:
Ctrl/Cmd + Space(consumed instead of forwarded to the active app) - Dismiss transient Rustickers windows:
Escis consumed for selection popups, quick previews, and selected-text command runs - Save in editor/markdown views:
Ctrl + S
Prerequisite: stable Rust toolchain.
Run the desktop app:
cargo runRun the CLI:
cargo run --bin rusticker --no-default-features --features cli -- --helpBuild release binaries:
cargo build --release --bin rustickers
cargo build --release --bin rusticker --no-default-features --features cliOutputs are written to target/release/.
rusticker is the scripting surface for the app. It writes to the same database the app reads, so
changes apply immediately when the app is running and on next launch when it is not.
| Command | What it does |
|---|---|
list [--state open|close|all] [--type <t>] [-s <text>] [-n <limit>] |
Find stickers |
show <id> [--content-only] |
Everything stored about one sticker |
result <id> |
What a command sticker last produced |
open <id> / close <id> |
Show or hide a sticker's window |
delete <id> [-y] |
Remove a sticker permanently |
view <path-or-url> |
Preview a file, folder or URL |
markdown [-c <text>] [-f <file>] |
Create a note sticker |
cmd <command> [...] |
Create a command sticker |
skill [list|show <name>|run <name>] |
Worked examples |
All of them accept the shared appearance options --width, --height, --left, --top,
--color (yellow, green, blue, pink, gray), --top-most and --closed. Markdown and command
stickers default to 400×300; file and URL stickers are sized from their content.
Passing a single file path or URL is treated as view <source> automatically, and trailing
options are forwarded.
rusticker cmd exposes everything a command sticker can do:
rusticker cmd "cargo test" --result text --dir . # run and show plain output
rusticker cmd "npm test 2>&1 | tail -20" --shell # use a shell for pipes and redirection
rusticker cmd "gh pr list" --cron "0 */5 * * * *" # re-run every five minutes
rusticker cmd "copilot -p {{RUSTICKERS_SELECTION}}" \
--accept-selection --result markdown --closed # answer whatever text you have selectedOutput can be rendered five ways with --result: text, markdown, html (an embedded browser
view), svg (an image) or source (the output is one file path or URL to preview). Other useful
flags are --stream, --no-window, --auto-close, --padding, --env KEY=VALUE and --idle.
Two things are worth knowing. A command sticker does not run through a shell by default: the
string is split with Windows argument rules and the program is looked up on PATH, so pipes and
&& are literal text until you add --shell. And a sticker created without --idle is armed,
meaning it runs when its window opens and again each time the app starts.
An armed sticker with --cron also keeps running with its window closed, for as long as the
app is running, so rusticker result <id> always has the latest output waiting. Combine it with
--no-window for a schedule that never puts anything on screen. In the sticker list, a spinner
marks a command that is running right now and a loop icon marks one waiting for its next tick.
Press Stop in the sticker to disarm it, or delete the sticker to stop it for good.
Add --json to any command to get exactly one JSON object on stdout, with an ok field so
success and failure parse the same way:
rusticker cmd "git status --short" --dir . --json # -> {"ok":true,"id":42,...}
rusticker result 42 --json # -> {"ok":true,"output":"...","has_run":true}rusticker skill list is a catalogue of ready-made stickers — selection-driven AI prompts,
scheduled watchers, HTML and SVG reports. skill show <name> explains one and prints the exact
rusticker command it is equivalent to, and skill run <name> --var key=value creates it.
--dry-run prints the command without creating anything.
Rustickers stores data in stickers.db under your app data directory and writes daily-rotated logs to a sibling logs/ directory.
Typical locations:
- Windows:
%LOCALAPPDATA%\rustickers\data\stickers.dband%LOCALAPPDATA%\rustickers\data\logs\ - macOS:
~/Library/Application Support/rustickers/data/stickers.dband~/Library/Application Support/rustickers/data/logs/ - Linux:
~/.local/share/rustickers/data/stickers.dband~/.local/share/rustickers/data/logs/
Log level precedence:
RUSTICKERS_LOGRUST_LOG- fallback:
trace(debug) /info(release)
Tagging (for example v0.1.0) triggers GitHub Actions release artifacts for Windows and macOS (UI + CLI bundles).
