I Built a 1,000-Night Reading Challenge (And Why That Number Matters)

Share
I Built a 1,000-Night Reading Challenge (And Why That Number Matters)
Photo by Kate Williams / Unsplash

A few days ago I came across a Ray Bradbury quote that I couldn't stop thinking about. He was giving advice to a young writer, and he said:

"What you’ve got to do from this night forward is stuff your head with more different things from various fields . . . I’ll give you a program to follow every night, very simple program. For the next thousand nights, before you go to bed every night, read one short story. That’ll take you ten minutes, 15 minutes. Okay, then read one poem a night from the vast history of poetry. Stay away from most modern poems. It’s crap. It’s not poetry! It’s not poetry. Now if you want to kid yourself and write lines that look like poems, go ahead and do it, but you’ll go nowhere. Read the great poets, go back and read Shakespeare, read Alexander Pope, read Robert Frost. But one poem a night, one short story a night, one essay a night, for the next 1,000 nights. From various fields: archaeology, zoology, biology, all the great philosophers of time, comparing them. Read the essays of Aldous Huxley, read Loren Eiseley, great anthropologist. . . I want you to read essays in every field. On politics, analyzing literature, pick your own. But that means that every night then, before you go to bed, you’re stuffing your head with one poem, one short story, one essay—at the end of a thousand nights, Jesus God, you’ll be full of stuff, won’t you?"

It's the idea that if you expose yourself to enough different things: poetry and philosophy and anthropology (and tech, which I added) you eventually stop thinking in straight lines and start thinking in patterns. You start making connections across domains. You become, as he put it, "full of stuff."

I wanted that. And I wanted a system to help me get there.


The Problem With Reading Lists

The obvious solution is a reading list. But reading lists have a fatal flaw: they have no teeth. You build them when you're feeling ambitious and ignore them when you're not. They sit in a Notion doc somewhere accruing digital dust.

What I wanted wasn't just a list that I'd have to browse to. It was a full-fledged application. Something that showed up for me every night and said: here's what you're reading tonight. No need to make decisions. So I just get a Discord notification every night with a link to a simple, minimal static page with readings of all types for that night.

That's what 1000 Nights is. For 1,000 consecutive days, it assigns you five things to read:

  • 📖 A poem — Shakespeare, Keats, Dickinson, Whitman, Owen, Frost
  • 📚 A short story — Chekhov, Kafka, Poe, O. Henry, Borges
  • 🖊️ A literary essay — Orwell, Montaigne, Baldwin, Woolf, Emerson
  • 💻 A tech blog post — Paul Graham, Joel Spolsky, Dan Luu, Rich Hickey
  • 🌐 An insightful essay — Aeon, Nautilus, The Marginalian, Longreads

Day 1, day 42, day 1000 — everything is pre-assigned, nothing repeats.


How It Actually Works

I used Google's Antigravity to plan, implement, and orchestrate the whole thing. Given the complexity (very simple) it performed beautifully.

The whole thing is a static site. It has no backend, database or auth. The entire architecture is just three files — index.html, style.css, app.js — and a 1MB JSON blob committed to the repo.

The Reading List Generator

The interesting part happens before you visit the site. A local Node.js script (npm run generate) builds the 1,000-day reading list once and commits it to the repository:

  1. It fetches ~1,047 poems from PoetryDB, pulling from a handpicked list of canonical poets.
  2. It shuffles each content pool independently using Fisher-Yates.
  3. It zips the five pools together into 1,000 day entries.
  4. It writes everything to data/reading-list.json and verifies uniqueness.

The resulting JSON file is ~1MB and gets served as a static asset by GitHub Pages. The app fetches it once, caches it in the browser, and that's the entire data layer.

The Router

Routing is purely hash-based (eg., /#/day/42 ), which means it works natively on GitHub Pages with no server-side redirects or custom 404 hacks. The app also supports filter query params: /#/day/42?poem=1&tech=1 shows only poems and tech posts, and that URL is shareable. Whoever opens it gets the same filtered view.

One quirk I ran into: PoetryDB returns data as raw JSON when you link directly to it. So originally, clicking "Read" on a poem would dump you into a wall of API JSON. Not exactly the contemplative reading experience I was going for. The fix was to generate Google Search URLs instead (?q=Emily+Dickinson+Safe+in+their+Alabaster+Chambers+poem) — which almost always surfaces the poem on Poetry Foundation or a beautifully formatted page as the first result.

Nightly Discord Notifications

There's a GitHub Actions cron job that fires every evening. It reads config.json to find the startDate, computes today's day number (floor((today - start) / 86400) + 1), pulls that day's entry from the JSON file, and POSTs a rich embed to a Discord webhook. Just bash + jq + curl.


What Bradbury Was Really Saying

I think the deeper insight in the quote is something Bradbury only implies. He's not saying reading is virtuous. He's saying cross-domain exposure is structural. The more different fields you absorb, the more raw material you have to combine. Good ideas are usually just two things that haven't been introduced to each other yet.

A poem about impermanence and a paper about distributed systems are more related than they appear. An Orwell essay on political language and a Joel Spolsky post on software specs are basically the same essay in different clothes. When you read across fields every single night, you start to feel these connections viscerally.


It's Public

The whole thing is public. You can visit any day directly:

https://redplusblue.github.io/1000-nights/#/day/1
https://redplusblue.github.io/1000-nights/#/day/365

Fork it, set your own startDate, add your own webhook. The content belongs to its authors — the project is just the index.


The source code is on GitHub.