An interactive data-visualization explorable of consumer-hardware history, 1975–2026 — what a desktop, laptop, and GPU shipped with (RAM, storage, clock, cores/threads, VRAM, battery) and what it cost, across a 12-era timeline viewable through three switchable era schemes.
Built as a Dioxus 0.7 (Rust → WebAssembly) app. It embeds into
dhilipsiva.dev at /silicon-eras/.
All values are representative (plausible, sourced-where-noted, not exhaustively cited) — the UI says so. Improving the data is a one-file change.
- 01 trajectories — era-band chart; envelope (entry↔top) or 3-line tiers; log/linear; absolute or indexed (÷ first shipping era); plateau guides; landmark pins.
- 02 price — 4 series (desktop/laptop typical, gpu mainstream + thin flagship); 2026-USD ↔ nominal;
a budget time machine (
$input + era scrubber → the best tier that budget bought). - 03 transitions — 5 categorical swimlanes (storage · os · graphics · laptop lcd · firmware) whose segment edges follow real years across whatever era scheme is active.
- 04 inspect / compare — two era cards + a per-metric
b ÷ adiff panel. - 05 spread — top÷entry lollipops per metric, always log.
Cross-cutting: three era schemes (named 12 / decades 6 / epochs 4), an era-range brush, an inspector
drawer, keyboard control (←→ scrub · 1–5 views · L log · Enter drawer · Esc), URL-shareable
state, and dark/light inherited from the host page.
Requires Rust ≥ 1.85, the wasm target, and dx (dioxus-cli) v0.7.9:
rustup target add wasm32-unknown-unknown
cargo install dioxus-cli --version 0.7.9
# dev server (hot reload) — the app crate lives in app/
cd app && dx serve
# → open the printed http://localhost:… URL
# production build (assets resolve under /silicon-eras/)
cd app && dx build --release --platform web --base-path silicon-eras
# tests (data parser + chart logic)
cargo testOn Windows, if dx build stalls in wasm-opt, add to app/Dioxus.toml:
[web.wasm-opt]
level = 0dataset.csv the data (see “Editing the data” below)
app/ Dioxus web app — build.rs parses dataset.csv → embedded JSON at build time
src/ components, state store, DOM glue
assets/quine.css vendored QUINE design tokens (dark + light)
crates/
silicon-model/ typed data model (shared)
silicon-parse/ CSV → model parser + warnings report (build-time only)
silicon-viz/ pure chart logic (scales, aggregation, geometry) — no DOM, unit-tested
Design references (the source of truth for look/behavior): HANDOFF.md, Silicon Eras.dc.html
(the original prototype), CLAUDE.md (port strategy), and DESIGN_DIVERGENCE.md (every place the real
data forced a deviation).
All numbers come from dataset.csv — it's parsed to typed data at build time (by
crates/silicon-parse) and baked into the wasm, so a data edit + rebuild is all it takes. There is no
database and no runtime fetch.
Format. Long CSV, RFC-4180: one row per table × era × tier — table ∈ {desktop, laptop, gpu},
tier ∈ {entry, typical, top}. Each era therefore has 3 rows per table. The 21 columns:
| column | meaning |
|---|---|
table |
desktop | laptop | gpu |
era_label, era_start, era_end |
era name + its real-year span (a table's eras must share the same year spans) |
tier |
entry | typical | top |
cpu_or_gpu |
chip/label (free text) |
clock, cores_threads, ram, storage, vram, battery_life |
the numeric metrics |
rom_firmware, graphics_display, os |
categorical prose (firmware/graphics/os) |
price_nominal_usd, price_2026_usd |
prices (integers) — fill what you have |
landmark_price_anchor, correction_notes |
free-text notes |
confidence |
documented | representative_estimate |
source_urls |
one or more URLs joined by ; |
Value formats the parser understands:
- Numbers + units:
4 KB,2.8 GHz,16 GB. Decimal units — bytes/KB/MB/GB/TB,Hz/kHz/MHz/GHz; battery in hours (~8h). - Ranges:
16-64 KB→{min, max, mid}; units may cross within a range (256 bytes-1 KB,512 KB-1 MB). Trailing type/qualifier text is ignored (768 MB GDDR3,16 GB (Copilot+ floor)). - Cores:
8 cores / 16 threads,1 core; 2 threads (HT),6-8 cores(cores → primary, threads → secondary). - No value:
none,shared,n/a, or an empty cell → treated as null (never zero). - Estimate: a cell with
~,up to, or≈, or a row withconfidence = representative_estimate→ drawn dashed with a≈marker. - Prices: plain integers (
4600). Leave blank where unknown — the app showsn/a/no price datahonestly (e.g. GPU prices aren't in the dataset yet). source_urls: split on;(not,).⚠️ Any field containing a comma must be double-quoted (a URL with a comma, a note, etc.) or the row will mis-parse.
To add or update data:
- Edit
dataset.csv(keep RFC-4180 quoting — quote fields with commas). - Validate:
cargo test -p silicon-parse. The whole-dataset test asserts the shape and that every cell parses;build.rsalso writes a warnings report toapp/target/**/warnings.txtfor any cell it couldn't fully parse. - See it:
cd app && dx serve(build.rsre-parses on change).
Propose an edit via GitHub: the app's ⤓ edit data header link opens dataset.csv here — send a PR;
a redeploy picks it up automatically (the data is parsed at build time).
Bigger changes: adding an era = add its 3 tiers × the applicable tables as new rows (eras are
derived from the CSV). Adding a new metric or swimlane is a code change (crates/silicon-model +
crates/silicon-parse), not data-only.
MIT OR Apache-2.0.