Skip to content

v1.2 — Public share links + audit hardening

Latest

Choose a tag to compare

@Kyrzin Kyrzin released this 16 Jul 18:07

First tagged release since 1.0. Two things happened: a new feature — public share links — and six hardening passes driven by a multi-agent security audit.

✨ New: public read-only share links

Share any note with a link — no account needed on the reader's side.

  • Share button on a note generates /share/<token> (256-bit random token) with optional expiry; revoke any time.
  • Access tab in Settings lists everything that is currently public — the antidote to "shared and forgot". Permanent links sort to the top.
  • Threat model in one sentence: a link is access — revoke the ones you no longer need.
  • The public page is deliberately austere: rendered markdown only, wikilinks degrade to plain text (no probing for other notes' existence), hardened renderer shared with the app, CSP default-src 'none', X-Robots-Tag: noindex, its own rate-limit bucket, and a single indistinguishable 404 for invalid/expired/revoked tokens.
  • Sharing is intentionally not exposed over MCP — an agent must not be able to silently publish your notes.

🔐 Security hardening (audit follow-ups)

  • OAuth now issues revocable per-client tokens instead of handing out the master secret: 256-bit random, sha256-only at rest, 90-day sliding expiry, scoped to the MCP endpoint only. "Connected clients" section in Settings with one-click revoke.
  • PKCE is S256-only; redirect_uri validation; rate limiting on failed auth attempts.
  • X-Frame-Options, non-root USER in the Docker image, wildcard escaping in MCP get_note lookups.

🛠 Reliability & polish

  • Embeddings fix: notes exceeding the local model's context window silently never got embedded (36 of 85 in the wild). Adaptive head-truncation + retry of pending embeddings on startup — semantic search now covers everything.
  • Migration runner: schema applies itself on startup.
  • Markdown export/import — your notes are never locked in.
  • CI on every push and PR (tsc, lint, tests, production build); pagination on GET /api/notes; atomic renames; [[Title#Section]] wikilink support; SECURITY.md and a backup recipe in docs/.

⚖️ License

Relicensed from PolyForm Noncommercial to AGPL-3.0 (commercial license available on request).

Upgrading: git pull && docker compose up -d --build — migrations apply automatically. See docs/upgrading.md.