open source · handwritten

Letters I write by hand, for one person each.

I write in a notebook and photograph the pages. A model reads my handwriting. I fix what it got wrong, mark what matters and send one link.

for you, visitor

a demo note · one page

demo

Hi. You found the place where my letters live. You will not see any of them here. Each one has a single link, and I send it to a single person.

The photo is my handwriting. The text is available to screen readers too.

Try the chips above. They work like in a real letter. Want to send letters like this? The code is below.

Anna

Four steps, one notebook.

  1. Write and photograph

    Several pages, by hand. A phone photo is enough. Upload one photograph for each sheet.

  2. A model reads it

    A vision model turns the handwriting into text. I check the words against the original photograph.

  3. Mark what to read first

    Correct the transcription, then add highlights in three kinds: important, note and question.

  4. Publish, then know

    Send the link. I can see if it was opened and answered with a reaction, without storing anyone’s IP.

Markdown in, marked text out.

Source · letter.md

:::theme{label="about the move"}
I packed the books first.
:mark[They were the hardest part.]{c=important}

:mark[I kept the blue mug.]{c=note}
:mark[Do you still have yours?]{c=ask}
:::

Rendered

The marks live in the markdown, so fixing a comma cannot shift them away from the words. Every kind has a color and its own underline style. The distinction survives in black and white, too.

remark-scanned-page

The reusable half: a remark plugin, a sanitize schema, a stylesheet and a React component. For journals, sketchbooks, class notes or letters. It does not choose your tags for you.

npm install remark-scanned-page

What I count, and what I don’t.

  • Opened, reacted to, where it came from
  • Country and device type
  • No IPs, public accounts or letter previews

The letter stays out of search engines and link-preview images. There is no public list to browse.

Clone it. It’s yours.

git clone https://github.com/imnotannamaria/from-anna
cd from-anna
npm install
cp .env.example .env.local
npm run db:migrate
npm run dev

What you configure

  • DatabaseA Postgres database for letters and read events
  • Photo storageA private Vercel Blob store for the pages
  • Model keyOpenRouter, for reading the handwriting
  • AuthClerk keys and an explicit author allowlist

Before transcribing, restrict model routing to providers that do not train on your data. Setup and environment variables are in the README (opens in a new tab).

There is no sign up here. This one is mine. The code is free to clone.

Get the code (opens in a new tab)