March 2026

I turned GitHub's contribution graph into a life journal

You have approximately 1,000 months to live. What if you could see them all at once — and the color of each one told you how it felt?

The Shower Thought

I was staring at my GitHub contribution graph — that green grid of squares showing a year of commits — and I had one of those thoughts that won't leave you alone:

What if this grid represented my entire life instead of my code?

If the average person lives to 83, that's roughly 1,000 months. Twelve columns, 83 rows. Each square is one month. Some would be bright — the months that mattered. Some would be dim — the months you barely remember. And a lot of them would be empty, because most of us don't document the ordinary months. We document the Instagram moments and forget the rest.

I pulled up a spreadsheet and counted. I'm on month 420. That means 580 squares left. Seeing that number hit differently than hearing "you're 35." Five hundred and eighty months. Not abstract years. Specific, countable squares.

The Problem with How We Document Life

We have infinite tools for sharing our lives publicly and almost none for reflecting on them privately. Instagram rewards performance. TikTok rewards virality. Twitter rewards outrage. None of them reward sitting quietly with a photo from three years ago and asking yourself: how did that month actually feel?

The tools we have optimize for engagement — likes, followers, algorithmic reach. But the moments that define a life aren't the ones that get likes. They're the ones you barely photographed. The Tuesday you realized you were happy for no reason. The month after the loss. The first morning in a new city.

These moments deserve a place. Not a feed. Not a timeline. A grid.

What I Built

Lifetale is a life journal shaped like a heatmap. Your birthday determines the grid. Each square is one month. The color reflects how that month felt — not how many posts you made.

Here's the key design decision that makes it different from every other journaling app:

The grid color is driven by a 1-5 "meaningfulness" rating, not by post count. A single post about your wedding, rated 5/5 ("life-defining"), makes that square glow brighter than a month with 10 routine check-ins rated 2/5. The grid measures the quality of your experience, not the quantity of your output.

This was an intentional rejection of the engagement-metric model. Most apps reward you for doing more. Lifetale rewards you for feeling deeply.

How It Works

When you open the app for the first time, it asks you a few questions. Not the usual sign-up form — more like a conversation:

  • "Do you have a partner? When did you meet?"
  • "Did you get married? When?"
  • "Do you have children? What are their names?"
  • "When did you graduate?"

Each answer places a milestone on your grid. Then it scans your photo library — locally, nothing uploaded — and lights up the months where photos exist. Your grid goes from a blank wall to a map of your life in about two minutes.

From there, you tap any month to open it. You see a day-by-day mood calendar, your device photos from that period, and any posts you've written. You can write a journal entry, attach a photo, rate how the experience felt, and the square deepens in color.

Circles, Not Followers

Lifetale has no public profiles, no followers, no algorithmic feed. Instead, you create "circles" — small private groups (family, close friends, partner) who can see each other's grids.

When you view someone else's grid, you can see which months they've shared. You can react with an emoji. And you can write them a "letter to a square" — a private note attached to one of their months. Not a comment. A letter. "I remember this month. You were so brave."

There's also a "life overlap" feature: when viewing a circle member's grid, shared months (since you both joined) are highlighted. You can see the months before you knew each other, dimmed. It's a quiet, powerful way to visualize a relationship.

The Technical Bits

For the HN crowd, here's the stack:

  • Mobile: React Native (Expo), deployed via TestFlight/EAS
  • API: Hono on Cloudflare Workers
  • Database: Cloudflare D1 (SQLite at the edge)
  • Media: Cloudflare R2 (S3-compatible, zero egress)
  • Auth: Passwordless magic codes via Resend
  • Marketing: Static site on Cloudflare Pages
  • Private posts: IndexedDB on device (never hits the server)

The local-first architecture was a deliberate choice. Private posts stay in IndexedDB on the device. Photos are scanned locally. Only posts explicitly shared with a circle go to the server. The grid itself is computed from a merge of local + remote data.

What I Learned

Building Lifetale taught me something I didn't expect: the constraint is the feature. Instagram has infinite scroll because more = more engagement. Lifetale has exactly 1,000 squares because that's all you get. You can't add more. You can't scroll past them. You just fill them, one month at a time, and the grid tells you the truth about how you spent your time.

The grid is a mirror. And mirrors don't need algorithms.

Try It

Lifetale is in beta on TestFlight. If you'd like to try it, join the waitlist and I'll send you a TestFlight invite. You can also enter your birthday on the homepage to see what your grid looks like — no sign-up required.

I'd love to hear what you think. The most interesting feedback so far has been about which squares people want to fill first — it's never the ones you'd expect.