Conway's Game of Life as a Dashboard Background

May 23, 2026 · random

This is purely cosmetic and I love it.

While building the dashboard for the challenge app, I wanted something in the header area — not a hero image, not a gradient, not empty space. Something alive.


The Idea

Conway's Game of Life running on a canvas behind the dashboard content. Each user gets their own simulation, seeded by their hex ID. So your Game of Life pattern is unique to you — deterministic randomness.


Implementation

It's a standard canvas-based cellular automaton:
- Grid of 5px cells
- ~20% initial population (seeded from user ID via a deterministic PRNG)
- Standard Conway rules: 2–3 neighbors to survive, exactly 3 to be born
- Dark gray cells (#1a1a1a) on near-black background (#0a0a0a)
- Runs at ~15fps (updates every 4 frames)

The seeded random is key. seededRandom(userId) produces the same initial state every time that user loads their dashboard. Your pattern is yours.


The Fun Part: Task Completion Injects Life

When you check off a task, the app calls injectCell() — a global function that places a random glider or r-pentomino pattern at a random position on the grid.

So completing tasks literally adds life to your background. The more you do, the more active your simulation becomes. It's completely cosmetic and has zero functional value. But it feels good. You check off "meditated today" and a little pattern starts propagating across your screen.


Performance

I was worried about battery drain on mobile. In practice:
- Uint8Array for the grid (not objects — no GC pressure)
- Canvas fillRect for rendering (no DOM manipulation)
- ResizeObserver adapts to container (no fixed dimensions)
- Slow mode on login page (every 12 frames instead of 4) to reduce CPU when the page is idle

On my phone it's fine. Canvas 2D is hardware-accelerated; the actual computation is just nested loops over a flat array.


Was This Necessary?

Absolutely not. The app works exactly the same without it. But every time I open my dashboard, I watch the patterns evolve for a second before I check off my tasks. It makes the tool feel personal — not just functional.

Sometimes the unnecessary things are what make you actually want to use something.


← back to blog