Andres Perez

Over the last few weeks I've been building small, real software with Claude Code as my pair, running on one ~$5/month server. Each started as a conversation and ended as a deployed service with tests and a runbook.

Here's what we've shipped, and what I learned about working this way.

Projects

A navy and gold mihrab arch framing the title 1,001 Emails

1,001 Emails

Live since Sept 2026thousandemailsandanemail.com

Burton's Thousand Nights and a Night, delivered one night at a time at 8pm in your own timezone. Everyone starts at Night 1 whenever they sign up, so each subscriber is on their own schedule instead of one shared broadcast.

  • A segmenter turns 10 OCR'd Project Gutenberg volumes into all 1,001 nights. It has to cope with typo'd ordinals, front matter leaking between volumes, and footnote markers, and it finds Shahrazad's dawn cliffhanger in about 99% of nights.
  • Before settling on a translation, we compared Lane and Payne by reading their actual texts. Only Burton keeps the nightly breaks all the way through, so switching would have meant inventing our own break points for 99% of the book.
  • The page is framed like a mosque mihrab, with Surah Yusuf running around the border. The Arabic is never typed by hand: it's pulled from one source, checked verse by verse against a second, and pinned by a hash in the tests.
  • FastAPI
  • APScheduler
  • Postgres
  • Postmark
  • nginx
A night-time New York skyline in falling snow

NYC Nordic Ski

Live since Sept 2026nycnordicski.com

A members-only carpool board for New York cross-country skiers. You can post a car trip with spare seats or a local outing by transit, and others join, comment, and get reminded the day before.

  • Membership is by application, and people who haven't been approved see no trip data at all. That check runs before any database lookup.
  • There are no passwords: sign-in is Google OAuth or an emailed magic link, with Cloudflare Turnstile on the email form. The rest of the site runs no JavaScript under a strict CSP.
  • Members can download or delete their own data, and an admin tool handles privacy requests from people who can't sign back in.
  • FastAPI
  • SQLAlchemy + Alembic
  • Postgres
  • OAuth
  • Postmark
The storytime link preview card

storytime

In betastorytime.andresperez.co

A social reading app. You track a book chapter by chapter and discuss each chapter with other readers, without spoilers.

  • The spoiler model: you can't see a chapter's comments until you've marked that chapter read. Commenters can also flag a remark that reaches further ahead, and it stays blurred until you click it.
  • Book metadata comes from the Open Library API. The backend is shaped like an API so a mobile client wouldn't mean a rewrite.
  • FastAPI
  • Jinja
  • raw SQL
  • Google OAuth
An astronomical clock dial beside the words Doomsday Practice

Doomsday Practice

Live since Oct 2026doomsday.andresperez.co

A trainer for Conway's Doomsday algorithm, for working out the weekday of any date in your head. It picks a random Gregorian date between 1582 and 3000 and walks you through it one step at a time: century anchor, year's doomsday, nearest doomsday date, answer.

  • It's a single static HTML file with no backend, plus a timer, guess buttons, and stats kept locally.
  • HTML/CSS/JS
  • static
A monochord dial, the Music Trainer link preview

Music Trainer

Coming soonmusic.andresperez.co

Ear and theory drills for jam sessions: transposition, intervals, and perfect pitch. Your computer keyboard acts as a piano.

  • Singing mode lets you answer by voice. It detects pitch in the browser (YIN/autocorrelation) and accepts a note once you've held it steady for about 300ms.
  • Keys are mapped by physical position (KeyboardEvent.code), so the piano layout works on Dvorak too. The music-theory core has unit tests.
  • ES modules
  • Web Audio
  • node:test

How I work with Claude

I make the product calls; Claude helps me make them well. Translation choice, the spoiler model, membership by application: each decision got real research and a plain recommendation, and then I decided.

Verify, don't guess. We read the actual Gutenberg texts before comparing translations. We checked the nginx logs to confirm iMessage was really fetching the preview image. We wrote route tests to prove one subscriber's token can't read another's data.

Small and cheap on purpose. Everything runs on one Hetzner box behind nginx, with Postmark for email and no managed cloud services, so moving to another host takes a database dump and a DNS change. I run the server and DNS myself from runbooks we wrote together.

Write down what broke. I once took a site down by deploying code before the schema change, and a deploy script once broke after it pulled a new copy of itself mid-run. Each of those became a fixed script and a line in the runbook.