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.
Kitchen Table · entry⌘S to save

## 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
Raw markdown on the left, typeset on the right — the split keeps both honest.

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.
A month of eveningsscroll back
RadiantSteadyEvenHeavyWeathered
Five hand-drawn marks — a month at a glance, no charts required.

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.
sourdough4 entries · full text
  • 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…

Search reaches into every entry body — your words, findable years later.

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.
Kitchen Table shared · FamilyMLJA
Maya's screen · 06:41

The market at six a.m.

Bought the last sourdough before the crowd thickened…

Jonas's screen · 06:41

landing, streaming — no refresh

edits and deletions stream too the 3 a.m. page stays yours
One notebook, two screens, zero refreshes — and a per-entry opt-out, visibly honored.

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.
Group · Family2 members
  • ML

    Maya Lindqvist

    maya@… · owner

  • JA

    Jonas Adeyemi

    jonas@… · member

  • Share a link

    revocable any time

Groups stay small on purpose; invite links are revocable and expirable.

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.
enforcement, not promises
  • 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
The security posture, itemized. The RLS policies are in the repo, in SQL.

Start your first notebook.

Free forever for the journal itself — three notebooks, one shared, every feature above. Google sign-in takes about nine seconds.