Inspiration

We are the most documented generation in history and the least addressed. I have studied the Bhagavad Gita, a series of Vedic shlokas that exists purely because of transmission over thousands of years. It was composed for someone who didn't exist yet. In a similar but different manner, I also have forty thousand photos on a phone that were never meant for anyone in particular. Chrysalis exists in that gap: a place to write the way the Gita was written, not the way a camera roll is designed.

What it does

Chrysalis is one quiet room to write a single letter---to your future self, a child not yet here, a stranger in 2126. You open a floating book, its pages shuffle until one becomes yours, you write, you choose the day it opens, and you seal it. The letter becomes a small gold light in a star-drifted sky, waiting. The vault page (/letters) holds every letter you've sealed with its countdown, plus three letters already left there from 1936, 1972, and 1999. A third page, /why, makes the actual argument for writing forward, as a letter itself, with the full essay shipped alongside it as PAPER.md.

How we built it

Next.js 15, statically exported---no server, which means "private by design" is true by construction, not by policy. Tailwind v4 for styling, Fraunces and Newsreader for the two-register typography: a formal serif for the sealed letter itself, a warmer one for the surrounding interface. All of the actual logic---the letter store, the "time words" that turn a sealed date into human language, and the keepsake generator---lives in one file, src/lib/letters.ts, with its tests sitting directly beside it rather than scattered across components. Every animation is CSS transform and opacity only, and everything respects prefers-reduced-motion, because a product about patience shouldn't need to demand your attention to prove it works.

Challenges we ran into

The hard problem wasn't the writing interface---it was the second promise: letters outlive letterboxes. If the pitch is "your letter doesn't depend on us," the letter actually can't depend on us. The fix was making every sealed letter export as a single self-contained HTML file with its date and open-logic baked directly in, so it still works with the site, the company, and me all gone. Getting that file to be genuinely standalone---not a stub that quietly points back at the app---took more iteration than anything else in the project.

Accomplishments that we're proud of

Getting the privacy promise to be architecturally true instead of just stated: no accounts, no analytics, no database, not even environment variables---the whole thing runs on npm install and produces a static export. I'm also proud that the restraint is intentional rather than an absence of features: every animation, every font pairing, every empty space was a decision, not a default.

What we learned

That "no backend" is a design constraint, not a technical shortcut---it forces every feature to answer to privacy first, before convenience. And that is when the entire point of a product is that nothing loud is supposed to happen; restraint has to be engineered as deliberately as any feature would be.

What's next for Chrysalis

Letting letters be opened by someone other than the writer---a real path for the child-not-yet-here or the stranger-in-2126 framing, not just a future version of the same person. And extending the keepsake format so a sealed letter can carry more than text---a voice recording, an image---while keeping the same standalone, no-server guarantee.

Built With

  • css-animations
  • google-fonts-(fraunces
  • newsreader)
  • next.js-15
  • static-export
  • tailwind-css-v4
  • typescript
  • vercel
  • vitest
Share this project:

Updates