skydiary

A private AI journaling app: write a daily entry, get feedback from personas you create, with client-side encryption the business itself cannot read.

Journaling works, and everyone quits anyway, because nobody answers back. My wife and I both wanted feedback to keep the daily habit going, so we built the tool we wanted: write an entry, click once, and hear from a persona you created. An expert coach, Aristotle, your favorite fictional character, you at another age.

The live landing page at skydiary.app

Skydiary runs in production with billing, passwordless auth, background AI job queues, and Japanese as a first-class locale:

The same product, Japanese-first

Under the hood

Two design choices carry the product.

First, personas have real memory. Entries are chunked, embedded, and stored as native vectors in the database itself (libSQL F32 blobs, no separate vector store), so a persona commenting on today’s entry retrieves what you wrote weeks ago. Replies are statistically humanized: length drawn from a log-normal distribution, a banned list of LLM cliches, three candidates generated and one picked at random.

Second, the privacy claim is engineering, and the design docs came before the code. A master data key generated client-side, Argon2id key derivation at 1 GiB memory cost, AES-GCM for content, ECDH P-384 for multi-device key exchange, and an initialization-vector column beside every sensitive field in the schema. Set a data password and we cannot read your entries or reset your way into them.

Working notes from the encryption design: the key hierarchy, before any of it was built

The privacy pledge

Work quantified

About 15 months of solo build, live in production: Next.js, Prisma on Turso, tRPC, Stripe billing, full English and Japanese locale parity, and a cron-driven AI job queue for embeddings, tagging, and summaries.

← All projects