Technical overviewClient-side generation and static hosting

Deep Time Machine

A keyless toy that composes a grounded geological scene in the browser.

Source code

Inspect the implementation, commit history, and project documentation.

Role
Solo developer: concept, generator, fact base, container, Kubernetes deployment
Evidence status
Live at deeptime.pesanth.com; served static and keyless from a hardened nginx pod, verified end to end on 2026-09-05
Verified
2026-09-05

01

Purpose and scope

One button drops you on a weighted-random moment in Earth's 4.54-billion-year history and composes a short second-person scene for it, entirely in the browser, by sampling a fixed bank of real facts for that interval. It runs static and keyless, so it cannot invent a figure, species, or date. Live at deeptime.pesanth.com.

What it is used for

  • Draw a random moment and read a scene grounded in that interval's facts.
  • Switch between an eventful weighting and a true-to-duration one that lands most draws in the microbial Precambrian.
  • Copy a link that pins the moment to share it.
  • JavaScript
  • HTML
  • nginx
  • Docker
  • Kubernetes

02

Architecture

Client experience

Client

Browser

Desktop and mobile visitors

Frontend

Static page

index.html: timeline, scene, controls

Runs in the page · no network

In-browser generation

Generator

Weighted draw

Picks an interval by weight or by duration

Generator

Scene composer

Samples the interval's facts, orders sky to life

Reads · static JSON

Fact base

Timeline data

intervals.json

18 intervals: range, weight, seed scene

Fact data

beats.json

197 typed facts, the only source of prose

Served by

Delivery

Web server

nginx container

Static files on a non-root, read-only pod

Kubernetes

k3s cluster

Single replica, default-deny network policy

Public ingress

Cloudflare Tunnel

Outbound-only ingress, TLS at the edge

Text equivalent: The page ships three static files: index.html and two JSON files. On each press it draws a weighted interval, samples that interval's facts from beats.json, and composes a second-person scene in the browser, with no server call and no key. nginx serves the files from a non-root, read-only pod on a single-node k3s cluster, reached through Traefik behind a Cloudflare Tunnel.

03

Engineering decisions

Generate in the browser, not on a server

The page ships three static files and composes each scene on the device, so there is no model to call, no key on the box, and nothing to rate-limit but bandwidth.

Recombine ground truth, never invent it

Every sentence is drawn from a fixed fact base and ordered by sense, so the generator cannot produce a figure, species, or date that is not already written down.

Two honest weightings

An eventful draw favours the charismatic chapters; a true-to-duration draw weights by interval length, so most moments land in the long microbial Precambrian.

Fail down to a written seed

If the fact base does not load, each interval still has a hand-written seed scene, and a shared link renders that stable seed so a pinned date never contradicts its prose.

04

Verification evidence

  • intervals.json defined 18 geological intervals and beats.json carried 197 typed facts across them, the composer's only source of prose.
  • Every composed sentence resolved to a fact in that bank, since the composer samples only from it; when the bank was withheld the scene fell back to the interval's written seed.
  • The running container served only index.html, intervals.json, and beats.json, made no outbound call, and held no key.
verified-2026-09-05
$ python -m http.server --directory public
$ GET /intervals.json → 200 · 18 intervals
$ GET /beats.json → 200 · 197 facts
$ draw → interval sampled, scene composed from its facts
✓ every sentence traced to beats.json, none invented

05

Limitations