Features
A journal that earns its place in your morning.
Six decisions, made carefully: how you write, how the day is rated, how you find things again, how sharing works, how immediate it feels, and how privacy is actually enforced. Each one is below, with the interface itself as the evidence.
Writing
An editor that stays out of the way, then gets out a good book.
The writing half is mono-spaced and honest; the reading half is a serif set at a reading measure. Your hands stay in the raw text, your eyes get the typeset page, and the two never fight for the same space.
- Split-pane editorMarkdown left, typeset preview right. On phones they become a two-mode toggle.
- Command-S savesThe dirty indicator breathes until you do. No autosave surprises, no lost drafts.
- Borderless titlesThe title is the first line of the entry, not a form field asking to be filled.
## Sunday, the long walk
We took the river path past the mill
and turned back only when the
light went **amber**.
- herons, two
- the rowing crew, loud
- silence, finally
Sunday, the long walk
We took the river path past the mill and turned back only when the light went amber.
- herons, two
- the rowing crew, loud
- silence, finally
Moods
Five marks for the whole weather of a day.
Not a ten-point scale with decimal anxiety. Five hand-inked glyphs — from a wide sun to a weather front — each with a quiet color. Over a month they assemble into something you can read at a glance.
- One tap per entryOptional, obviously. The glyph sits where a star rating would, minus the arithmetic.
- Filter by moodEvery notebook has mood chips — see only the good weeks, or only the rough ones.
- A month at a glanceScrolling your entries becomes a small weather record of your life.
Tags & search
Your own taxonomy, and a search that actually finds it.
Tags are free text — #sourdough, #3am, #letter-to-dad — twenty per entry, no suggestions, no preset categories. Search runs across every entry body you own, full-text, with snippets so you can tell which hit matters.
- Free-text tagsUp to 20 per entry. The only structure is the structure you invent.
- Full-text searchTitle and body across all of your notebooks, paginated, private to you.
- Snippet resultsSearch results quote the matching line, so you recognize the entry before opening it.
- Sep 08Bread notes, week 36
…the starter finally smells like apples —
- Aug 31Bread notes, week 35
…second attempt at the sourdough batards…
- Aug 12The market at six a.m.
Bought the last sourdough before the crowd…
The shared notebook
Share exactly one notebook. Keep the rest of your head.
You link a single notebook to a small group — the kitchen-table notebook, not the 3 a.m. one. Entries stream to the group as you save them. Every other notebook stays sealed, and even inside the shared one, each entry can opt out.
- Live streamingInserts, edits, deletions — the group sees them the moment they are saved.
- Per-entry opt-outA quiet toggle keeps any single entry private inside an otherwise shared notebook.
- Instant revokeUnlink the notebook and it turns private again — for everyone, in one move.
The market at six a.m.
Bought the last sourdough before the crowd thickened…
landing, streaming — no refresh
Groups & invites
Small circles, one link, doors that lock themselves.
A group is a handful of people you actually know. The owner shares one link that can expire on its own and die on command; new members either walk straight in or wait for approval — the owner's call. Members can leave; owners can remove; nothing is discoverable or public.
- Owner & member rolesThe owner links notebooks and manages members. Members read and write into shared notebooks.
- One link per groupExpiring on your terms, revocable any time — rotating it kills the old one instantly.
- Ask first, or walk inOwners choose per group: instant join, or a request queue they approve one by one.
- ML
Maya Lindqvist
maya@… · owner
- JA
Jonas Adeyemi
jonas@… · member
Share a link
revocable any time
Underneath
Private where it counts: in the database, not the interface.
Every query in Echoes runs against Postgres row-level security policies bound to your session. If a row should not reach you, the database itself declines it — no route, script, or clever request can ask around the rule. Rate-limited auth, expiring tokens, and an invite model built to be narrow.
- RLS on every tableVisibility is enforced by Postgres policies checked on every single read and write.
- Identity from the sessionYour user id is derived from the verified token — never from the request body.
- Brute-force resistantLogin, signup and OAuth endpoints are rate-limited per IP behind one surface.
- Row-level security on profiles, notebooks, entries, groups, join requests
- Google OAuth via PKCE — the anon key never leaves the server
- Sliding-window rate limits on every auth endpoint
- Revocable invite links, expiring on your terms
- No trackers, no analytics beacons, no ad identifiers
Start your first notebook.
Free forever for the journal itself — three notebooks, one shared, every feature above. Google sign-in takes about nine seconds.