chatnote

July 7, 2026 · View on GitHub

CI Docs License: Apache-2.0

Full documentation →

Your own note-to-self chatrooms — infinite rooms, like a private Telegram "Saved Messages". Self-hosted, open-source, Astro SSR + Prisma/SQLite.

Screenshots

Room list — persistent, ephemeral, incognito rooms with tags Room view — Markdown messages with headers, lists, code, links
Room list — all three room types, tags visible Persistent room — Markdown rendered server-side
Search across rooms, messages and tags Composer — type Markdown, attach images, Ctrl+Enter to send
Search across rooms, messages, and tags Composer — Markdown, image attach, Ctrl+Enter to send

Room types

TypeStorageLifetime
persistentSQLite (disk)until you delete it
ephemeralNode heap (RAM)TTL, or until the process restarts — not a retention guarantee
incognitoNode heap (RAM)until the tab closes (client-fired wipe via sendBeacon)

Features

  • Markdown messages — rendered server-side, sanitized (XSS-safe)
  • Image attachments — disk for persistent rooms, inline data-URL in RAM for ephemeral/incognito
  • Link previews — persistent rooms only, with SSRF guard
  • Room tags + search across names, messages, and tags
  • JSON import / export (persistent rooms)
  • Multi-user with password auth, or require_password = false anonymous demo mode
  • All limits configurable: per-user room cap, per-room message cap, image size, heap budget

Quick start

git clone https://github.com/didvc/chatnote
cd chatnote
npm install
cp config.example.toml config.toml
npm run db:push
npm run dev          # http://localhost:4321

Production:

npm run build
npm start

Config (config.toml)

Loaded once at server launch. See config.example.toml and the config reference.

Key flags:

FlagDefaultPurpose
require_passwordtrueSet false for anonymous demo mode
allow_image_uploadstrueSet false on public demos
allow_link_previewstrueServer-side link unfurling (persistent rooms only)
wipe_persistent_every"off"e.g. "1d" for a daily demo wipe

License

Apache-2.0


  • visited — Securely collect browsing history over browsers.
  • dead-mans-ping — Cross-platform CLI that HTTP-GET pings endpoints on mouse (in)activity — dead-man's switch, presence beacon, idle notifier.