a self-hosted version of postbaby.org
This was created out of necessity for a sticky-note solution with rapid arrangement, editing, and color-coding capability, thanks to its intuitive key-bindings.
🖼️ Supported on both landscape and portrait-oriented monitors, as well as mobile devices.
Important
Docker users upgrading: this is not a drop-in upgrade for old Docker deployments.
The old static/Caddy container behavior is gone.
The container now runs the Go app on port 8080, Compose maps 8080:8080, /app/data is required for persistence, and first run uses /setup.
Read docs/NAS.md before upgrading.
Important
Browser-local v1.35 users upgrading: old flat localStorage["items"] notes are not auto-migrated in this release.
Upgrading will usually show a fresh board or default notes instead of the old v1.35 notes.
The old raw browser storage may still exist in the browser profile, but the current app does not surface or import it.
Important
After upgrading: if the app looks broken, hard refresh once. Installed PWA users should close and reopen the app, and if needed clear site data. Static/PWA upgrades can behave oddly when filenames and paths change.
- Clone the repository and open
index.htmldirectly, or serve the repo root as static files. - No backend, login, or server sync is required.
- Notes stay in this browser only.
- Rename
.env.exampleto.env. - Run:
docker compose up --build -d- Open http://localhost:8080/.
- On a fresh database, Postbaby redirects to
/setup. - Create the bootstrap user and sign in.
The default Compose setup persists data in ./postbaby-data on the host and mounts it to /app/data in the container.
For NAS and Portainer-specific setups, see docs/NAS.md.
static: browser-local / ephemeral behavior, no login, no server sync.selfhosted: Go backend + SQLite +/setup+/login+ cookie-session sync.cloud: hosted signup/login/logout + entitlement-gated account sync + billing-aware flows.
- The current app uses IndexedDB as the primary browser-local store.
- Current-era browser-local keys can be migrated into IndexedDB or used as fallback data if needed.
- In self-hosted mode, the browser stays local-first and syncs account-backed snapshots to the server.
- Export and import are available from Settings in the current app.
Origin warning: browser-local notes live in the storage bucket for the exact origin you used.
https://postbaby.org, http://localhost:8080, and file://... do not share data.
If you test locally on a different origin, do not expect notes from another origin to appear automatically.
- The app serves the committed
js/script.jsfile directly. - Self-hosters do not need to build or regenerate frontend assets for normal deployment.
- Maintainer-only scripts such as
npm run build:public-js,npm run verify:public-js, andnpm run test:public-js-buildare used only when updating the generated frontend artifact.
Right-clickon blank canvas or pressnto create a new item.Right-clickon an existing item (or tab) to delete it, or drag the item to the toilet roll to delete.Left-clickon an existing item (or tab) to cycle through its colors.Double-clickon an existing item (or tab) to edit its text.- Press
Deleteto remove the current multi-selection. - Press
cto clear all items in the active tab. - Press
Tabto cycle tabs andShift + Tabto cycle in reverse. - Press keys
1-9to jump to corresponding tabs. - Press
gto cycle grid modes in the active tab. - Press
CTRL + right-clickto move to the next shape. - Press
SHIFT + CTRL + right-clickto move to the previous shape. - Drag on empty canvas to create a multi-selection box.
- Hold
Shiftand drag from an item to draw a line. - Hold
Ctrland drag from an item to draw an arrow. - Press
CTRL + ALT + Hto re-enable first-time-run welcome notes. Left-clickthe toilet roll / trash icon to open settings.
Long-pressto create a new item.Long-pressan existing item (or tab) to delete it.Double tapto edit an existing item (or tab) text.Single tapan existing item (or tab) to change its color.Single tapthe toilet roll / trash icon to open settings.- Desktop keyboard shortcuts still work if a physical keyboard is connected.
- Old static/Caddy Docker deployments are not interchangeable with this build.
- The app now ships as one codebase with a Go backend for self-hosted sync mode.
- The self-hosted container listens on
8080, not80. - Persistent data must be mounted to
/app/data. - First-run account setup happens at
/setup. - Existing users should read docs/NAS.md before upgrading.
Please see the accompanying LICENSE document contained within this repository.
- ❤️ it? Buy me a ☕


