Changelog
User-facing changes, newest first. Internal refactors and test-only changes are omitted — the canonical engineering changelog lives in the repo.
Unreleased
in progressAdded
- Ruby and Python get command-line tools.
gem install freshjotsandpip install freshjotsnow install afreshjotscommand-line tool alongside the importable client library — the same command surface as the npm and Homebrew CLIs (create, append, ls, rm, mv, folders, encrypt, and the rest), with the same one-line confirmations and-q/--quietflag. Every install path — npm, Homebrew, RubyGems, PyPI — now gives you the samefreshjotscommand. - Command-line clients confirm every action. The
freshjotsCLIs (npm and Homebrew) now print a one-line confirmation for every write —created #12 deploy-log,deleted #12,moved #12 -> folder 3— so a script or a person always sees what happened; add-q/--quietto silence them for log-streaming loops. The npm CLI also now accepts a note body positionally (freshjots create "Title" "body"), matching the docs and the other clients. - Web clipper. A one-click bookmarklet saves the page you're reading — its title, URL, and any text you've selected — straight into a Fresh Jots note, with no extension to install. Drag it to your bookmarks bar once; clicking it opens a prefilled note for you to review and save. Setup and the bookmarklet live at /web-clipper.
- Install Fresh Jots as an app. Fresh Jots is a Progressive Web App — install it to your phone's home screen or desktop and it runs in its own standalone window, with a "Quick note" shortcut and a share target so you can send text or a link straight from another app's share sheet into a new note at
/quick. - Tamper-evident notarization — every note, every plan. Every note is cryptographically notarized, free tier included, no card: its content is hashed — an append-only log entry by entry as each arrives, a note you edit snapshotted once a day — and every account's new hashes are folded into a daily Merkle tree whose root is anchored to the Bitcoin blockchain via OpenTimestamps, a permanent public timestamp neither you nor we can alter afterward. Background at /notarized-notes.
- RFC 3161 trusted timestamps. Alongside the daily Bitcoin anchor, content that lands as it is written — an append-only log entry, a captured AI-session note — is independently timestamped the instant it arrives by an RFC 3161 timestamping authority, so it carries verifiable proof of existence immediately rather than waiting on the daily anchor to confirm.
- One-page proof verifier at /verify — upload or paste a note's proof (and, optionally, your own copy of the note) and get a plain-language verdict in the browser. Any signed-in user, any plan; nothing you submit is stored. The command-line walkthrough lives at /notarization.
- Provenance dashboard + one-click proof downloads.
/settings/provenancelists your notarized notes with each note's tamper-evidence status, filtering, sorting, a trusted-timestamp filter, note title and linked machine name, and an in-browser verifier — plus one-click download of any note's proof bundle. On the Dev and Team plans, with a 14-day trial of the full Dev surface. - Verifiable proof bundled with every export. The full-account export now includes a self-verifiable
proof.jsonalongside each note, and a single note's.txtdownload comes paired with its proof — so you, or anyone you hand it to, can verify a note offline against Bitcoin, trusting no one, us included. - Client-encrypted notes — store what we can't read. Encrypt a note's body on your own machine and send the ciphertext with
client_encrypted: true(via the API or MCP). Fresh Jots stores and returns the ciphertext byte-for-byte, never sees your key, and cannot decrypt, search, or recover it — nor can anyone who compels or breaches us. The web editor is read-only for these notes (change them through the API); dead-man and append alerts still fire on silence, and the note can still be notarized. Personal plans only, including Free. Details at /encrypted-notes. - Find & Replace and Undo / Redo in the note editor. The plain-text editor gains Find & Replace and full Undo / Redo, and now shows the note's API / CLI id in its metadata strip so you can address the same note from a script.
- Browser-extension capture token. Any active subscriber (Personal included) can mint a single-note, append-only capture token from
/settings/extension_tokenfor a clip utility or browser extension — separate from the Dev-tier API tokens, so a grab-and-append helper never carries your full API surface. - Free read-only MCP access. Non-Dev users can connect an AI client to Fresh Jots over MCP (OAuth 2.1) with free, read-only access — read and list your notes from Claude and other MCP clients without a Dev subscription. Writes still require the Dev or Team API tier.
- Live-updating dashboards and lists. Creating, renaming, deleting, restoring, or moving a note or folder now updates your home dashboard, folder lists, and notes list in real time over Turbo Streams — including changes made in another tab or, on a team, by a teammate.
- Send a test webhook. Any note with an outbound webhook gets a one-click test delivery that sends a signed sample payload, so you can confirm your endpoint and signature check before wiring up real events.
- Chat-platform webhook formats. An outbound note webhook can post straight into Slack, Discord, Google Chat, Mattermost, or Rocket.Chat — pick the format per note and the payload is reshaped to that platform's incoming-webhook schema instead of the default signed
note.appendedJSON envelope. Chat formats carry no HMAC signature, since those receivers can't verify one, so the unguessable hook URL is the credential. - Append-only notes explainer at /append-only-notes — what log-stream notes are, how inbound-webhook and API appends work, and when to reach for one.
- "Dev" tier renamed. The middle paid plan is now called Dev (it was "Pro") — same $149/year price and the same features, just a clearer name for the developer / API tier.
- Team tier (NEW) — $179/seat/year. Multi-seat workspace with shared notes, shared folders, owner / admin / member roles, dead-man alerts with one-click ack, per-team API tokens, and a 90-day audit log. 2-seat minimum, up to 25 seats. Manage from /team after subscribing.
- Team notes at
/team/notes— every team feature from the personal side: full CRUD, search/sort/filter, soft-delete + undo, public share links, append-only locking, revisions, bulk delete. Notes carry the writer's user id for audit and the workspace id for visibility. - Team folders at
/team/folders— workspace-shared folder containers (100/team max). A personal "Q4" folder and a team "Q4" coexist freely; the API scope-validates folder ids so a team token can never park a team note in a personal folder. - Team API tokens at
/team/api_tokens— owner/admin-only bearer tokens that hit the team's pool, not the actor's personal pool. Same/api/v1/*surface, same wire format; bulk endpoint enabled on every team token. 30 active tokens per team. - Team dead-man alerts + one-click ack. Overdue append-only team notes email every accepted member; the first ack mutes the alert team-wide for 4 hours so the same outage doesn't page everyone repeatedly. Ack works from any phone/tab without sign-in (signed token, 24h TTL).
- Team audit log at
/team/audit_events— owner/admin-only. Every workspace write recorded with who/what/when, 90-day retention. - Team note comments + @mentions. Team notes carry threaded comments with
@namemention autocomplete over the workspace roster. Comments are immutable once posted; the author or a team owner/admin can delete and undo them. - In-app notifications. A notification bell surfaces when you're @mentioned or someone replies on a team note, with mark-as-read and per-user preferences (mute mentions or replies) under
/settings. - Live presence and edit-conflict guard on team notes. See who else is viewing a team note in real time, with autosave and a guard that stops one member's save from silently overwriting a teammate's concurrent edit.
- Read-only "viewer" team role. A fourth role beside owner / admin / member: a viewer reads and exports team notes and folders but can't write or mint API tokens — enforced in the browser, the API, and MCP.
- Team ownership succession & transfer. An owner can name a successor (ownership auto-transfers if the owner's account goes inactive) or hand ownership over manually, and an over-seated banner warns when accepted members exceed the paid seat count.
- Public per-note share links. Toggle Share on any note to mint a public, read-only URL — anyone with the link can read; toggle off to revoke instantly. Pages set
noindexso search engines won't list them. - Service limits page at /limits — single canonical reference for every cap and rate limit, pulled live from running configuration.
- End-User License Agreement at /eula.
- Per-user API error log at
/settings/api_errors— every 4xx your bearer-token requests received, newest first. - Idempotency-Key header on API write endpoints — opt-in, 24h dedup window per user, stable error code on conflict.
- Durable inbound webhook buffer.
POST /h/:tokennow persists every accepted delivery to the database before formatting, so a Rails restart, hot-note contention, or a transient database blip no longer drops in-flight events. Failed deliveries surface on/settings/monitoringas a dead-letter panel with one-click Replay and Delete. Senders get back a 200 OK with anX-Ingestion-Idresponse header so a curl-ion the sender side correlates to the buffer row on this side. Dev / Team only — same tier gate as inbound-inbox tokens. - Free-tier usage meter on the dashboard and notes list.
- Welcome note auto-created on first signup; welcome email sent on first confirmation.
- Folder view pagination (30 notes per page).
- SEO metadata: per-page descriptions, Open Graph / Twitter cards, canonical URLs, branded titles.
- Sign-up rate limit (5/hour/IP) and per-email login throttle (5/20 min) in
Rack::Attack. - Honeypot field on the sign-up form.
- API tier (Dev and Team plans) — bearer-token REST API at
/api/v1, with notes and folders resources, atomic append, bulk creates, append-by-filename addressing, and /settings/api_tokens for token management. - 14-day API trial token on signup (code mode). Picking the developer onboarding mode mints a free
mn_…bearer token usable against/api/v1/*for 14 days, with no plan attached. Plaintext is shown once on the post-onboarding flash and emailed alongside a one-line curl example; a Trial badge marks the row on /settings/api_tokens until it expires. Expired trial rows are swept daily; non-trial tokens are never swept. - Pricing redesigned to four tiers: Free, Personal ($24/yr), Dev ($149/yr or $15/mo), Team ($179/seat/yr).
- Lapsed paid users transition to read-only — every existing note remains readable + exportable for up to 12 months after the last payment.
- Plan-change flow with downgrade gates — switching to a lower tier surfaces a per-cap blocker list.
- Public API docs at /docs.
- Sign in with Google or GitHub. Create an account or sign in with a Google or GitHub identity alongside the usual email and password; when two-factor is on, an OAuth sign-in passes through the same one-time-code challenge.
- Two-factor authentication. Turn on TOTP two-factor from
/settings/security— scan the QR code into any authenticator app, confirm a code, and save 10 one-time recovery codes. A sign-in challenge and a step-up re-authentication on sensitive account changes follow automatically. - Sign out other devices. One button on
/settings/securityends every other browser and device signed in to your account while keeping the current session, so a lost or shared device can be cut off instantly. - Outbound webhooks and dead-man's-switch alerts. On the Dev and Team plans, give an append-only note an outbound webhook URL and every accepted append POSTs a signed JSON payload (HMAC-SHA256 in the
X-FreshJots-Signatureheader); a persistently failing endpoint is disabled automatically so it can't drain the queue. Set a dead-man deadline on the same note and Fresh Jots emails you — or a chosen alert address — when it goes silent past the deadline, resetting the moment the next append lands. Background at /dead-mans-switch. - Import from other notes apps. Options → Import takes an upload of Markdown, HTML, plain-text, RTF, Word (
.docx), OpenDocument (.odt), or Evernote (.enex) files — or a.zipof them, whose nested folders become folders — and turns each file into a note. Large archives are parsed in the background. - Note revision history. Each note keeps a running history of earlier versions; open History to review them and restore any earlier revision in place.
- Download a note as PDF or Word. Any note exports to a formatted PDF or a Word
.docx, alongside the existing plain-text.txtdownload. - Pinned notes. Pin the notes you reach for most and they surface in a dedicated Pinned strip at the top of your dashboard.
- Trash with 30-day restore. Deleting a note moves it to /trash rather than erasing it — an Undo link appears right after deletion, and the note stays restorable there for 30 days before it's purged for good.
- Public status page at /status — a live snapshot of service health plus a running incident log, readable without signing in.
bin/backup— Postgres dump runner with retention pruning and optional rsync/S3 off-host copy.- Sentry error tracking (no-op unless
SENTRY_DSNis set).
Changed
- More depth on buttons. Primary buttons and calls to action now carry a subtle gradient and soft shadow for a bit more depth.
- Dev tier now billable monthly. The Dev tier can be paid $15/month as well as $149/year (annual works out to roughly two months free). Personal and Team stay annual-only; switch billing interval from the billing portal.
- Append-only notes are deletable. A locked (append-only) note now deletes, soft-delete-undoes, and purges exactly like any other note — the lock governs how it's written, not whether it can be removed.
- Note hashid in the API. API note responses now include each note's signed hashid alongside the integer id, and note endpoints accept that hashid — the same identifier used in web URLs and over MCP.
- Full-account export is now async, delivered by email. Options → Download all enqueues a background job, builds the archive off-request, and emails a one-time signed download link valid for 24 hours.
- API token expiry policy. Tokens default to 90-day expiry; user-set expiries beyond 1 year are rejected.
- Notes list Latest sort now orders by
updated_at(most recently edited) rather thancreated_at. - Dev per-note plain-text limit raised from 1.5 MB to 3 MB, matching the Team tier. Free and Personal stay at 1 MB. No migration — existing notes are unaffected; Dev scripts can now POST larger single payloads in one request.
Fixed
- Live updates now survive moving around the app. Real-time updates could quietly stop after you navigated within a session — for example, opening a note and then returning to your dashboard. A note created or deleted elsewhere (from a script, the API, another tab, or a teammate) would no longer appear or disappear on its own until you reloaded the page. Your home dashboard, notes lists, folder views, append-only note bodies, the notification bell, and — on a team — live note comments and presence now keep their real-time connection across in-app navigation, so they update live without a refresh.
Security
- Obfuscated note URLs. Web note URLs now use a signed, non-sequential hashid (e.g.
/notes/aB3xY…) instead of the raw database id, so note ids can't be guessed or enumerated from a URL. - Webhook signing secrets encrypted at rest. Per-note outbound-webhook signing secrets are now stored with application-level encryption, and legacy unencrypted-read support was dropped.
- Hardened MCP endpoint. The
/mcpOAuth surface gained tiered rate limits, RFC 8707 resource binding (access tokens are bound to this server as their audience), and paged resource listing. - Tighter auth gates and data hygiene. Two-factor and PKCE/OAuth gates were tightened, and a sweep purges orphaned ActionText (rich-text) rows so a deleted note body leaves nothing behind.
- Visibility enforced on the API and MCP. The read-only viewer role is enforced on the REST API and MCP, MCP resources are narrowed to what the caller may see, and per-token note scoping was hardened.
- Email-change abuse window tightened. Devise's email-change endpoint is capped at 3/day per account and 3/day per target address.
- Tighter throttles on expensive surfaces. Note writes 120 → 30/min/user; per-note PDF/DOCX/TXT downloads 60 → 10/min; billing portal/change-plan 30 → 5/min; full-account export request 5 → 2/hour.
- api_errors log scoping. The per-user error log is read through
current_user.api_errorsonly — wrong-owner lookups return nothing rather than leaking another user's request paths.
Removed
- Legacy flat monthly subscription plan — the paid lineup moved to the annual Personal, Dev, and Team tiers. (The Dev tier has since re-introduced a monthly option — see Changed above.)
- 30-day trial infrastructure — the freemium 10-note cap replaced it.
The canonical, engineering-detail changelog lives in the repository as CHANGELOG.md.
This page is the user-facing curated view. Spotted something missing? Email
support@freshjots.com.