Sticky notes for the Linux desktop, built with Rust and Qt 6/QML. Keep notes in independent windows, search your library, and capture ideas without an account or a cloud service. Notes stay on your machine.
Download releases · Build from source · Contribute
BetterNotes is a working project name. The current version is 0.1.11, a Linux preview; desktop compatibility still needs testing across environments. Windows and macOS are not current release targets.
- Independent sticky windows with autosave, resizing, collapse and saved window state.
- Rich text editing, automatic bulleted and numbered lists, checklists, links, colors, and light, dark or system themes.
- Images and animated GIFs: pick them or drop them onto a note, drag a corner to resize, right-click to save a copy.
- SQLite storage, FTS5 search, tags, priorities and archiving.
- Quick Capture, a command palette, a system tray and start-at-login settings.
- Reminders for each note (one-time or repeating), editable from the note or the library, with desktop notifications; file attachments.
- JSON/Markdown import and export, database and attachment backups, and restore.
- A CLI sharing the Rust core with the GUI, plus local single-instance IPC.
- Locked notes: encrypt a note's text with a master password (see below).
- English and Turkish interface.
- Offline use without accounts, telemetry or a remote server.
Desktop integration depends on the session and package format; see Linux desktop behavior.
The quickest way, for your user only and without root, installs the latest
AppImage with its menu entry and icon, and checks it against SHA256SUMS:
curl -fsSL https://raw.githubusercontent.com/thebanri/BetterNotes/main/install.sh | shRun the same command again to update. To remove it (your notes are kept):
curl -fsSL https://raw.githubusercontent.com/thebanri/BetterNotes/main/install.sh | sh -s -- --uninstallTo use your distribution's package manager instead, open GitHub Releases and expand Assets on the Latest release. Packages are currently built for x86_64 / amd64.
| Format | Target | Install the downloaded file |
|---|---|---|
.deb |
Debian 13; Ubuntu compatibility checked on the rolling image | sudo apt install ./betternotes_<version>_amd64.deb |
.rpm |
Fedora; built and checked on the current Fedora image | sudo dnf install ./betternotes-<version>-1.fc<release>.x86_64.rpm |
.pkg.tar.zst |
Arch Linux; check dependency versions on derivatives | sudo pacman -U ./betternotes-<version>-1-x86_64.pkg.tar.zst |
.AppImage |
Linux with glibc 2.35+ and compatible desktop libraries | Make executable and run; see below |
.flatpak |
Distributions with Flatpak and the KDE runtime | Install the bundle; see below |
Replace placeholders with the actual asset filename. Native packages use system Qt and their package manager installs dependencies. The AppImage bundles Qt; Flatpak uses the KDE runtime. The AppImage is built on Ubuntu 22.04 and smoke-tested on Ubuntu 24.04. These checks do not certify every distribution or desktop session.
For the current preview:
chmod +x BetterNotes-0.1.11-x86_64.AppImage
./BetterNotes-0.1.11-x86_64.AppImageIf FUSE is unavailable, run with extraction enabled:
APPIMAGE_EXTRACT_AND_RUN=1 ./BetterNotes-0.1.11-x86_64.AppImageAdd Flathub as a source for the KDE runtime, then install the downloaded bundle:
flatpak remote-add --user --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
flatpak install --user ./BetterNotes-0.1.11-x86_64.flatpak
flatpak run org.betternotes.BetterNotesBetterNotes itself is not published on Flathub. The bundle has additional KDE integration and autostart limitations.
A build from source or an AppImage has no menu entry of its own. Run it once with
install (or turn on Show in applications menu in the settings) to add one
for your user, with its icon; no root is needed:
./target/release/betternotes install # copies the binary to ~/.local/bin
./BetterNotes-0.1.11-x86_64.AppImage install # launches the AppImage where it is
betternotes uninstall # removes the entry, icons and copied binary; notes stayThe entry goes to $XDG_DATA_HOME/applications and the icons to
$XDG_DATA_HOME/icons/hicolor. On Wayland, desktops that do not support the
xdg-toplevel-icon protocol show the window icon only once this entry exists.
Package and Flatpak installs already have one.
Download SHA256SUMS from the same release into the directory containing your
package, then run:
sha256sum --check --ignore-missing SHA256SUMSYour package must appear with OK. Checksums detect damaged or mismatched downloads;
these packages are not independently signed.
For builds between releases, successful Packages runs provide build artifacts (GitHub sign-in required), or you can build locally.
Wayland and X11 are both targets. Positioning, stacking, focus and tray availability vary between desktops; headless CI tests verify startup, not compositor behavior.
- X11: saved positions are restored and Qt window hints are used.
- Wayland: the compositor generally controls placement and activation. KDE Plasma has optional KWin integration for note placement and layering; this requires host tools that are unavailable in the Flatpak sandbox.
- Show desktop / minimize all: sticky notes stay on screen like desktop widgets (Settings → Keep notes visible when showing the desktop, on by default). On Wayland this uses the wlr-layer-shell protocol through LayerShellQt: KDE Plasma, Hyprland, Sway and other wlroots compositors. There notes are moved and resized by BetterNotes itself, stay out of the taskbar and window switcher, and a note keeps to one monitor while being dragged, jumping to the monitor under it when released. On X11 notes get the desktop window type (dock while pinned); this is untested on XFCE, Cinnamon and MATE, where desktop icons may cover unpinned notes. GNOME on Wayland offers no way for an app to keep windows on screen through "show desktop", so there notes stay ordinary windows. Builds without LayerShellQt (see Build from source) leave notes as ordinary windows on Wayland too. Smooth dragging and resizing on Wayland use the compositor's relative-pointer protocol; without it, the position-based fallback can still jitter.
- System tray: requires a tray host. The library window remains available when the session has none.
- Global Quick Capture: bind
betternotes --quick-capturein your desktop's shortcut settings. The in-app shortcut does not register a desktop-wide hotkey. - Reminders: require BetterNotes to remain running; notification delivery depends on the desktop notification service.
Use betternotes --diagnostics when reporting desktop integration issues.
Lock a note from its ⋯ menu or its card's menu. The first time, you choose a master password; every locked note uses it. A locked note's text is encrypted with XChaCha20-Poly1305 under a key derived from the password with Argon2id, is left out of search and previews, and opens only after you enter the password. The key stays in memory until Lock Now (Settings) or quitting.
- The password is not stored and cannot be recovered. Without it, locked notes cannot be opened.
- Titles, attached files and images are not encrypted.
- Exports and backups keep locked text encrypted; importing it needs the same password.
| Shortcut | Action / scope |
|---|---|
Ctrl+N |
New note in the library |
Ctrl+F |
Focus library search |
Ctrl+K / Ctrl+Shift+P |
Open the library command palette |
Ctrl+Alt+Space |
Quick Capture while the library is active |
Ctrl+S |
Save the active sticky note immediately |
Ctrl+W |
Close the active sticky window, preserving its note |
Ctrl+Q |
Save and quit |
Ctrl+B / Ctrl+I / Ctrl+U |
Bold / italic / underline in the editor |
betternotes new "Configure nginx" "Check the server configuration"
betternotes list
betternotes search nginx
betternotes show 1
betternotes archive 1
betternotes archive 1 --unarchive
betternotes --quick-capture
betternotes export notes.json
betternotes export ./markdown-notes/
betternotes import notes.json
betternotes backup ~/Backups
betternotes restore /path/to/betternotes-backup-directory
betternotes install
betternotes uninstall
betternotes --helpNotes are stored in $XDG_DATA_HOME/betternotes/notes.sqlite3, falling back to
~/.local/share/betternotes/notes.sqlite3. Attachments live alongside the database.
Flatpak uses its own sandbox data directory. Back up before switching builds or
restoring older data.
Use a current stable Rust toolchain, a C++17 compiler, pkg-config, SQLite
headers, and Qt 6.5+ with Qt Quick, QML, Quick Controls and the appropriate
Wayland/X11 plugins. GUI tests additionally need Qt 6.7+ and the QtTest QML
module. Cargo invokes CXX-Qt and Qt build tools; no separate CMake invocation is
needed.
On Arch Linux / CachyOS:
sudo pacman -S --needed base-devel rust pkgconf sqlite qt6-base qt6-declarative qt6-wayland layer-shell-qtDesktop widgets (notes that stay through "show desktop") are optional at
build time: they need LayerShellQt built for the same Qt (Wayland) and Qt's
private QtGui headers (X11). The build uses whichever it finds next to Qt, and
BETTERNOTES_LAYER_SHELL_PREFIX points it at LayerShellQt elsewhere;
packaging/linux/build-layer-shell-qt.sh
builds one for a Qt that lacks it. BETTERNOTES_NO_DESKTOP_WIDGETS=1 leaves
both out.
For Debian 13, use the complete development and QML dependency list in CI. Fedora dependencies are listed in the RPM recipe. Distribution Qt packages older than 6.5 need a newer Qt installation to build the app.
git clone https://github.com/thebanri/BetterNotes.git
cd BetterNotes
cargo build --release --locked
./target/release/betternotesSet QMAKE=/path/to/qt6/bin/qmake if Qt is not discovered automatically.
To create distributable packages, follow the packaging guide.
Rust owns application logic, data and platform services. QML owns presentation
and interaction. crates/core is Qt-independent; app provides the CXX-Qt bridge;
qml contains windows, components and themes.
cargo fmt --check
cargo check --locked
cargo clippy --all-targets --all-features --locked -- -D warnings
cargo test --locked
cargo build --release --lockedSee contributing, packaging and security reporting.
MIT.