Sticky Notes Indicator: per-desktop notes, in-note search, periodic backups
  • Python 98.5%
  • CSS 1.5%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
2026-08-28 17:20:12 -04:00
Icons Initial commit 2026-08-28 17:20:12 -04:00
po Initial commit 2026-08-28 17:20:12 -04:00
stickynotes Initial commit 2026-08-28 17:20:12 -04:00
tests Initial commit 2026-08-28 17:20:12 -04:00
.gitignore Initial commit 2026-08-28 17:20:12 -04:00
COPYING Initial commit 2026-08-28 17:20:12 -04:00
GlobalDialogs.ui Initial commit 2026-08-28 17:20:12 -04:00
indicator-stickynotes-i18n.desktop.in Initial commit 2026-08-28 17:20:12 -04:00
indicator-stickynotes.desktop Initial commit 2026-08-28 17:20:12 -04:00
indicator-stickynotes.desktop.in Initial commit 2026-08-28 17:20:12 -04:00
indicator-stickynotes.py Initial commit 2026-08-28 17:20:12 -04:00
MANIFEST.in Initial commit 2026-08-28 17:20:12 -04:00
README.md Initial commit 2026-08-28 17:20:12 -04:00
SettingsCategory.ui Initial commit 2026-08-28 17:20:12 -04:00
setup.py Initial commit 2026-08-28 17:20:12 -04:00
StickyNotes.ui Initial commit 2026-08-28 17:20:12 -04:00
style.css Initial commit 2026-08-28 17:20:12 -04:00
style_global.css Initial commit 2026-08-28 17:20:12 -04:00

Indicator Stickynotes

Sticky notes for the Linux desktop, living in the system tray.

What this fork adds

Everything below is additional to upstream.

Multi-monitor aware placement

Upstream restored a note by moving it to a saved absolute position, which misplaces notes whenever the monitor layout changes. This fork records which monitor a note belongs to — preferring the monitor's stable connector name over its index — along with the note's position relative to that monitor, and restores it after the window manager has mapped the window rather than before.

  • Fix Offscreen Notes tray item, which rescues notes stranded on a disconnected monitor or beyond the current screen bounds.
  • Sizes are clamped to the target monitor so a note cannot be restored larger than the screen it lands on.

Per-note scroll mode and word wrap

Two independent toggles in each note's menu.

  • Scroll mode decides whether scrollbars appear. With it off, no scrollbars are shown and an ellipsis indicator marks overflowing content.
  • Word wrap decides whether long lines fold or run on. It is on by default; turning it off for a note gives that note a horizontal scrollbar that extends as far as its longest line.
  • Either way a note can be resized narrower than its content, and typing never widens the window.

Virtual desktop memory

  • Each note remembers the virtual desktop (or Awesome tag) it was left on and returns there on restart, instead of every note piling onto whichever desktop happened to be active at launch.
  • Notes the window manager keeps on all desktops retain that state.
  • Send to Back and Bring to Front tray items act on the notes visible on the active desktop, preserving their z-order relative to one another.

Editing

  • Ctrl+F searches within a note: all matches highlight, next/previous scrolls the matching line into view, and a counter shows the position. The search bar closes on Escape and hides when the note loses focus.
  • Redo works — Ctrl+Y or Ctrl+Shift+Z, alongside Ctrl+Z to undo. Neither runs while a note is locked.

Backups

Timestamped snapshots written periodically to any folders you choose, configured under Settings → Backups (folders, interval, how many to keep, and a Back Up Now button). Pruning only ever removes files carrying this application's own prefix, so a folder holding your own files is safe. The feature stays off until a folder is added.

Data safety and correctness

Fixes for defects found by auditing the fork against real failure conditions:

  • Saves are atomic. The data file was previously truncated before being rewritten, so a crash or kill mid-save destroyed every note. Snapshots go through the same atomic path.
  • A save can no longer overwrite a note's saved desktop before that note has been moved back to it — a race that silently and permanently rewrote the data file, and could not be undone by fixing the code alone.
  • Importing no longer crashes on a note without a uuid; every note is given a stable identity when it is created rather than when it is first saved.
  • Imported changes reach open notes. Merging into an already-open note left the on-screen text stale, which then overwrote the imported data on the next save.
  • Malformed data no longer poisons a note. A null body or properties in a hand-edited or corrupted file used to crash the note window and the lock action; unknown category ids from an import are validated.
  • The settings dialog no longer crashes when no note window is open — which was the case for every note whenever the app was last quit with all notes hidden.

Requirements

python3, python3-gi, gir1.2-gtk-3.0, gir1.2-gtksource-3.0, gettext

plus an AppIndicator typelib — gir1.2-ayatanaappindicator3-0.1 on current Debian/Ubuntu, or gir1.2-appindicator3-0.1 on older releases.

Install

Install under /usr/share — the package, its data files and the script must share one directory, because the code resolves its resources relative to its own location:

sudo python3 setup.py install \
    --install-lib=/usr/share/indicator-stickynotes \
    --install-data=/usr/share/indicator-stickynotes \
    --install-scripts=/usr/share/indicator-stickynotes

sudo ln -sf /usr/share/indicator-stickynotes/indicator-stickynotes.py \
            /usr/bin/indicator-stickynotes
sudo gtk-update-icon-cache /usr/share/icons/hicolor

The symlink is required: the desktop entry runs indicator-stickynotes, which is not otherwise on PATH. On Python 3.12 and later, install python3-setuptools first — setup.py needs distutils, which was removed from the standard library.

Notes are stored in ~/.config/indicator-stickynotes. That path is deliberately unchanged from upstream so an existing collection of notes keeps working after the rename.

Tests

python3 -m unittest discover -s tests

The suite covers the storage layer and the parts of the GUI layer that can be exercised without a display.