Lightning-fast floating notes for Linux (tiling Wayland compositors) and Windows.
A tiny, native Rust + GTK 4 app that pops over whatever you're doing, eats one thought, and gets out of the way.
Existing note apps are heavy (Electron), tied to a vendor (Apple Notes), or behave poorly on tiling Wayland compositors — they open in their own workspace, refuse to float, won't sit on top. Jot is the smallest possible knife for a specific cut: dump a thought now, find it later, never get in the way.
Single binary. ~5 MB of RAM at rest. Instant startup. One keystroke up, one keystroke gone.
| Floating, always-on-top Pops over any app on any workspace. Translucent so you can still see what's behind. |
Native, fast, tiny Rust + GTK 4 + libadwaita. Single binary, ~5 MB RAM, native Wayland. |
Auto-save everything Debounced save on every keystroke. SQLite-backed, daily backups. |
| Light & dark themes Pick System / Light / Dark. Follows runtime flips of the desktop preference. |
Markdown rendering Live-styles **bold**, *italic*, # headings, `code`, lists — without hiding the source. |
Search Filter the sidebar by title and body content. Ctrl+F and start typing. |
Paste / drop images Ctrl+V or drag from your file manager. Inline preview with click-to-zoom. |
Click-to-zoom canvas Click any inline image. Drag to pan, Ctrl+Scroll to zoom anchored at the cursor. |
Voice transcription Dictate with the mic. Powered by Groq Whisper Large v3 Turbo (~216× real-time). |
| Pinned, tagged & colored notes Pin to the top, group notes into sidebar tabs, and add color strips for fast scanning. |
Export as Markdown Single note or bulk; bundles inline images into a sibling images/ directory. |
Launcher-friendly Desktop entry registered. Type "jot" in Walker, Rofi, GNOME Shell, etc. |
| Copy blocks Wrap reusable text in {copy}...{/copy} and Jot renders it with a one-click clipboard button. |
sudo pacman -S --needed gtk4 libadwaita sqlite alsa-lib
curl -L -o jot.tar.gz https://github.com/Iann29/jot/releases/download/v1.7.0/jot-v1.7.0-x86_64-linux.tar.gz
tar -xzf jot.tar.gz && cd jot-v1.7.0-x86_64-linux && ./install.shDrops jot into ~/.local/bin, the desktop entry into ~/.local/share/applications, the icon into ~/.local/share/icons/hicolor/scalable/apps. Make sure ~/.local/bin is on your PATH.
yay -S jot-bin # prebuilt binarysudo pacman -S --needed gtk4 libadwaita sqlite alsa-lib rust
git clone https://github.com/Iann29/jot.git
cd jot && ./scripts/install.shGrab jot-v1.7.0-x86_64-windows.zip from the latest release, unzip it anywhere, and run jot.exe.
It's a portable build: the whole GTK4 + libadwaita runtime lives in that folder, nothing is installed and nothing is written to the registry. Deleting the folder removes the app; your notes stay put. Don't move jot.exe out of the folder — it resolves its DLLs, icon theme and GSettings schemas relative to itself.
Optional, for the before/after GIF compare editor:
winget install Gyan.FFmpegffmpeg isn't bundled (it would roughly double the download), so the compare editor looks for ffmpeg and ffprobe on your PATH and tells you what's missing if they aren't there. Restart Jot after installing.
Not on Windows: the Super+R screen-region GIF recorder is Linux/Wayland only — it drives wf-recorder, slurp and wl-copy, which have no Windows counterpart. GIF export from the compare editor works fine. The window is also fully opaque (the transparency slider is hidden — per-pixel alpha isn't wired up in GDK's win32 backend yet), Esc minimizes instead of hiding, and Alt+F4 / the close button saves and quits.
Where things live:
%LOCALAPPDATA%\jot\notes.db SQLite database (WAL mode)
%LOCALAPPDATA%\jot\images\ Pasted / dropped images
%LOCALAPPDATA%\jot\backups\ Daily snapshots (last 7)
%LOCALAPPDATA%\jot\jot.log Runtime log
%APPDATA%\jot\config.toml Window size, theme, font, Groq API key
%LOCALAPPDATA%\jot-panic.log Last crash message (if any)
Troubleshooting
Blank, black or garbled window. GTK 4.14+ picks a GPU renderer by default, which falls over on RDP sessions, VMs and machines with no Vulkan driver. Force the software path:
$env:GSK_RENDERER = "cairo"
.\jot.exegl is worth a try too. Set GSK_RENDERER as a user environment variable to make it stick.
jot.exe closes immediately with no window. Check %LOCALAPPDATA%\jot-panic.log and %LOCALAPPDATA%\jot\jot.log. If neither exists the process died before Rust ran, which almost always means a file was removed from the unzipped folder — re-extract the zip.
SmartScreen warns about an unknown publisher. These builds aren't code-signed. More info → Run anyway, or verify your download against the .sha256 published next to the zip on the release page.
Jot ships with a window-rule snippet — floating, centered, pinned across workspaces, rounded — plus a global Super+N toggle keybind:
cp data/hyprland/jot.conf ~/.config/hypr/jot.conf
echo 'source = ~/.config/hypr/jot.conf' >> ~/.config/hypr/hyprland.conf
hyprctl reloadAfter that, Super+N toggles Jot from anywhere.
What's in jot.conf?
# Toggle Jot from anywhere
bind = SUPER, N, exec, pgrep -x jot >/dev/null && hyprctl dispatch focuswindow ^(com\.amageweb\.Jot)$ || jot
# Window rules — float, center, pin to all workspaces, give it a fixed size
windowrulev2 = float, class:^(com\.amageweb\.Jot)$
windowrulev2 = center, class:^(com\.amageweb\.Jot)$
windowrulev2 = pin, class:^(com\.amageweb\.Jot)$
windowrulev2 = size 820 620, class:^(com\.amageweb\.Jot)$
windowrulev2 = rounding 14, class:^(com\.amageweb\.Jot)$
Sway / wlroots equivalent
for_window [app_id="com.amageweb.Jot"] floating enable, sticky enable, resize set 820 620, move position center
bindsym $mod+n exec pgrep -x jot >/dev/null && swaymsg "[app_id=com.amageweb.Jot] focus" || jot
Jot can transcribe speech into the editor using Groq Whisper Large v3 Turbo. Free for low volumes ($0.04 / hour), and Groq runs Whisper at ~216× real-time, so a 15-second utterance is transcribed in well under a second.
1. Get a Groq API key at console.groq.com/keys.
2. In Jot, open Settings → Voice, paste the key, click Save.
3. Click the mic in the header. Talk naturally — pauses between sentences become chunk boundaries. The text streams in chunk-by-chunk while you speak.
4. Click the mic again to stop. The final chunk flushes through; the editor goes back to "Saved …".
The key is stored in plain text at
~/.config/jot/config.toml. Audio is sent over TLS to Groq and is not stored on disk by Jot.
Jot bundles a tiny screen-region recorder so you don't need Kooha for clips to drop into chats and PRs. The mini-overlay is title-matched as Jot Recorder so Hyprland can rule it independently of the main window.
Setup (one-time) — install the helpers:
sudo pacman -S --needed wf-recorder slurp ffmpeg wl-clipboardUse it:
- Press
Super+R(or click the ● button next to the mic in the header). - Drag with
slurpto pick a region —Esccancels. - The mini-overlay appears bottom-right with the timer. Click Stop when you're done.
- ffmpeg's two-pass palette pipeline converts the MP4 to a sharp,
small GIF. The file lands in
~/Videos/gif/jot-YYYY-MM-DD-HHMMSS.gif. - From the overlay you can Save as… elsewhere, Copy the GIF to the system clipboard (paste into Slack/Discord/web apps), open it in your default viewer, Re-record, or Close.
Defaults: 24 fps, libx264 ultrafast capture → palette-aware GIF with Sierra2_4a dithering. The Kooha-killer.
| Key | Action |
|---|---|
Super+N |
Toggle window (Hyprland binding) |
Super+R |
Record a screen-region GIF |
Ctrl+N |
New note |
Ctrl+D |
Delete current note (toast to undo) |
Ctrl+F |
Focus search |
Ctrl+Z |
Undo (delete or text edits) |
Ctrl+V |
Paste (auto-detects images) |
Ctrl+click URL |
Open URL in default browser |
Drag image / .md |
Inline (image) or new note (text) |
| Click image | Open in pan/zoom canvas |
Ctrl+Scroll |
Zoom in canvas (anchored at cursor) |
Esc |
Close zoom / hide window |
The first non-image, non-empty line of every note becomes its title automatically. Notes are saved ~400 ms after your last keystroke.
Use the tag field above the editor to group notes into tabs in the sidebar. The color swatches next to it add a visible strip to each note row, including search results.
Reusable snippets can be written as:
{copy}
message or command to copy
{/copy}
Once saved, the snippet renders as a copy block with a clipboard button while the raw text remains in the note for export and sync-safe storage.
~/.local/share/jot/notes.db SQLite database (WAL mode)
~/.local/share/jot/images/ Pasted / dropped images
~/.local/share/jot/backups/ Daily snapshots (last 7)
~/Videos/gif/ GIF recordings (one per session)
~/.config/jot/config.toml Window size, opacity, theme, font, Groq API key
~/.local/share/applications/jot.desktop
~/.local/share/icons/hicolor/scalable/apps/jot.svg
~/.cache/jot-panic.log Last panic message (if any)
cargo run # debug build
cargo run --release # production build
RUST_LOG=jot=debug cargo run # verbose logs
cargo clippy --all-targets # lint
cargo fmt # formatThe interesting bits:
src/window.rs— UI: header bar, sidebar list, editor, autosave, voice + image plumbingsrc/db.rs— SQLite layer (single connection, WAL mode, migrations)src/app.rs— single-instance toggle + GTK application setupsrc/themes.rs— light/dark CSS swap, follows the system color schemesrc/markdown_tags.rs— single-pass scanner that appliesgtk::TextTags for bold/italic/code/headings/listssrc/transcribe.rs— mic capture + VAD + Groq Whisper clientsrc/gif_recorder.rs— slurp + wf-recorder + ffmpeg pipeline with subprocess RAII guardssrc/recorder_window.rs— mini overlay UI (Recording / Converting / Done)src/image_canvas.rs— pan/zoom image preview (singleWidgetImpl::snapshot)src/export.rs— markdown export with image bundlingsrc/dark.css/src/light.css— the look (rounded, glassy, transparent)
The scripts/ folder ships helpers for keeping README assets fresh:
scripts/capture-screenshot.sh hero --seed hero
scripts/record-gif.sh paste-image 8The screenshot script backs up your real notes.db before swapping in a curated seed, and restores it on exit (or Ctrl+C).
MIT — see LICENSE.
- GTK 4 and libadwaita — the toolkit
- Groq — fast Whisper inference
- cpal — cross-platform audio capture
- grim and wf-recorder — screen capture
- The Hyprland and Sway communities, for showing that a Linux desktop can feel good