Skip to content

Repository files navigation

Jot

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.

Jot in action

Install · Features · Hyprland · Voice · Keys · Develop


Why

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.

Features

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.

Install

Prebuilt release (Arch / any modern Linux x86_64)

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.sh

Drops 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.

AUR (Arch)

yay -S jot-bin     # prebuilt binary

From source

sudo pacman -S --needed gtk4 libadwaita sqlite alsa-lib rust
git clone https://github.com/Iann29/jot.git
cd jot && ./scripts/install.sh

Windows

Grab 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.FFmpeg

ffmpeg 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.exe

gl 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.

Hyprland integration

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 reload

After 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

Voice transcription

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.

GIF recording

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-clipboard

Use it:

  1. Press Super+R (or click the ● button next to the mic in the header).
  2. Drag with slurp to pick a region — Esc cancels.
  3. The mini-overlay appears bottom-right with the timer. Click Stop when you're done.
  4. 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.
  5. 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.

Keyboard shortcuts

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.

Where things live

~/.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)

Development

cargo run                    # debug build
cargo run --release          # production build
RUST_LOG=jot=debug cargo run # verbose logs
cargo clippy --all-targets   # lint
cargo fmt                    # format

The interesting bits:

  • src/window.rs — UI: header bar, sidebar list, editor, autosave, voice + image plumbing
  • src/db.rs — SQLite layer (single connection, WAL mode, migrations)
  • src/app.rs — single-instance toggle + GTK application setup
  • src/themes.rs — light/dark CSS swap, follows the system color scheme
  • src/markdown_tags.rs — single-pass scanner that applies gtk::TextTags for bold/italic/code/headings/lists
  • src/transcribe.rs — mic capture + VAD + Groq Whisper client
  • src/gif_recorder.rs — slurp + wf-recorder + ffmpeg pipeline with subprocess RAII guards
  • src/recorder_window.rs — mini overlay UI (Recording / Converting / Done)
  • src/image_canvas.rs — pan/zoom image preview (single WidgetImpl::snapshot)
  • src/export.rs — markdown export with image bundling
  • src/dark.css / src/light.css — the look (rounded, glassy, transparent)

Capturing screenshots & GIFs

The scripts/ folder ships helpers for keeping README assets fresh:

scripts/capture-screenshot.sh hero --seed hero
scripts/record-gif.sh paste-image 8

The screenshot script backs up your real notes.db before swapping in a curated seed, and restores it on exit (or Ctrl+C).

License

MIT — see LICENSE.

Acknowledgements

  • 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

About

Lightning-fast floating notes for tiling Wayland compositors. Rust + GTK 4.

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages