/* eslint-disable */
/* Data for cards + overlay content */

const APPS = [
  {
    id: 'task15',
    name: 'Task15',
    kicker: 'iOS · 2026',
    tags: ['SwiftUI', 'Solo', 'Live'],
    desc: 'A quiet task manager built around fifteen-minute chunks. Plan a day in the realistic shape of an hour.',
    lede: 'Plan a day in the realistic shape of an hour. Most things worth doing happen in fifteen-minute increments.',
    meta: { Role: 'Founder / Designer / Engineer', Stack: 'SwiftUI · CloudKit', Status: 'Live on App Store', Year: '2026' },
    body: [
      { h: 'Why fifteen minutes', p: 'Hours are a lie we tell ourselves. Most working blocks are interrupted before they finish, and most useful work is shorter than people pretend. Task15 makes the smallest meaningful unit the canvas, so the day becomes honest.' },
      { p: 'The result is a planner that feels less like a list and more like a map of the day — chunked, colour-coded, and forgiving when you misjudge.' },
      { h: 'Design notes', p: 'Liquid Glass surfaces over a tinted background, system gestures throughout, and a single-screen day view that doubles as the focus surface. No notifications, no streaks, no badges.' }
    ],
    thumbKind: 'app-task15'
  },
  {
    id: 'cipher',
    name: 'Cipher',
    kicker: 'iOS · 2025',
    tags: ['SwiftUI', 'E2E', 'Beta'],
    desc: 'A quiet decision journal. End-to-end encrypted. Built for ambiguous moments.',
    lede: 'A decision journal for the moments that don\'t fit a meeting. Encrypted, calm, slow on purpose.',
    meta: { Role: 'Founder / Designer', Stack: 'SwiftUI · CryptoKit', Status: 'Closed beta', Year: '2025' },
    body: [
      { h: 'A decision is a unit', p: 'Every consequential decision deserves five minutes of writing — context, options, leaning, why. Cipher is built around that small ritual, not around productivity.' },
      { p: 'Notes are encrypted on-device. The reading view fades older entries to grey so the present feels brighter.' }
    ],
    thumbKind: 'app-cipher'
  },
  {
    id: 'northbound',
    name: 'Northbound',
    kicker: 'iOS · 2024',
    tags: ['watchOS', 'GPS', 'Archive'],
    desc: 'GPS dead-reckoning for the unmapped. A compass that holds a line.',
    lede: 'A walking compass for places without paths. Dead-reckons the line you intended even when the trail disappears.',
    meta: { Role: 'Co-founder', Stack: 'SwiftUI · CoreLocation', Status: 'Archived 2025', Year: '2024' },
    body: [
      { h: 'A compass that holds a line', p: 'You set a bearing at the trailhead. As you walk, Northbound integrates your motion against that line and tells you, at each step, how far off you\'ve drifted. It does this without a map.' },
      { p: 'Originally a tool for moorland walking. Now archived; ideas being folded into a future build.' }
    ],
    thumbKind: 'app-northbound'
  },
  {
    id: 'lattice',
    name: 'Lattice',
    kicker: 'iPadOS · 2023',
    tags: ['iPad', 'Concept'],
    desc: 'Spatial reading for long-form research. A grid that becomes a map.',
    lede: 'A canvas for thinking with sources. Lay out clippings, draw threads, find what you keep coming back to.',
    meta: { Role: 'Designer', Stack: 'PencilKit · iPadOS', Status: 'Concept', Year: '2023' },
    body: [
      { h: 'Reading as cartography', p: 'Notes about a topic want to live next to each other in space, not under each other in time. Lattice gives them a grid, then lets you bend the grid into the shape of your own argument.' }
    ],
    thumbKind: 'app-lattice'
  },
  {
    id: 'kiln',
    name: 'Kiln',
    kicker: 'macOS · 2023',
    tags: ['macOS', 'Writing'],
    desc: 'A long-form writing environment that hides the toolbar. Plain text in, finished pieces out.',
    lede: 'A writing environment that gets out of the way. Markdown in, manuscript out.',
    meta: { Role: 'Designer / Engineer', Stack: 'AppKit · Markdown', Status: 'Personal use', Year: '2023' },
    body: [
      { h: 'Just the page', p: 'Most writing apps mistake settings for features. Kiln has fonts, a word count, and a typewriter cursor. Everything else is a keyboard shortcut you don\'t need to remember the first time.' }
    ],
    thumbKind: 'app-kiln'
  }
];

const PRINTS = [
  { id: 'caddy',   name: 'Desk Caddy',     kicker: 'PETG · 2026', tags: ['Functional'],     desc: 'A modular desk caddy for pens, cards, and small machines.', glyph: 'caddy',   meta: { Material: 'PETG · 0.2mm', Time: '7h 20m', Year: '2026' }, body: [{ p: 'A two-part nesting caddy with a magnetised lid. Designed around the things I actually leave on a desk overnight.' }] },
  { id: 'bracket', name: 'Bracket-A',      kicker: 'PLA · 2026',  tags: ['Hardware'],       desc: 'A wall bracket for a 3-axis spirit level. Slot-fits standard rails.', glyph: 'bracket', meta: { Material: 'PLA · 0.2mm', Time: '3h 10m', Year: '2026' }, body: [{ p: 'Bracket-A clips onto a 19mm rail and holds a stock spirit level at 90°. Slim wings keep weight off the rail.' }] },
  { id: 'coil',    name: 'Coil-S',         kicker: 'TPU · 2026',  tags: ['Cable'],          desc: 'A flexible cable spool with magnetic mounting feet.',         glyph: 'coil',    meta: { Material: 'TPU 95A', Time: '2h 40m', Year: '2026' }, body: [{ p: 'TPU shore-95A spool that sticks to a steel desk leg. The flex helps thread cables in without snagging.' }] },
  { id: 'pivot',   name: 'Pivot',          kicker: 'PLA · 2025',  tags: ['Mechanism'],      desc: 'A friction-fit camera pivot for a desk-mounted Continuity Camera.', glyph: 'pivot', meta: { Material: 'PLA · 0.16mm', Time: '5h 50m', Year: '2025' }, body: [{ p: 'Three-piece friction joint that takes an iPhone in landscape on a c-clamp. Tight enough to hold a meeting, loose enough to nudge.' }] },
  { id: 'mosaic',  name: 'Mosaic Tray',    kicker: 'PLA · 2025',  tags: ['Functional'],     desc: 'A hex-cell tray for small parts and screws. Stackable.',      glyph: 'mosaic', meta: { Material: 'PLA · 0.2mm', Time: '4h 50m', Year: '2025' }, body: [{ p: 'Twenty-nine hex cells in a knurled frame. Footprint matches a standard A6 notebook.' }] }
];

const ESSAYS = [
  {
    id: 'patience',
    name: 'On patience & small machines',
    kicker: '26 APR 2026 · 6 min',
    tags: ['Essay', 'Maker'],
    desc: 'Why I let the printer take all night. A short piece on the kind of attention that small mechanical things teach you.',
    lede: 'Why I let the printer take all night.',
    meta: { Date: '26 April 2026', Read: '6 minutes', Tags: 'Patience · Maker' },
    body: [
      { p: 'A 3D printer is a strange object to live with. You set it going, and the only thing you can do for the next six hours is wait, and occasionally peek.' },
      { p: 'But that is precisely the gift. There is nothing to optimise. The print will finish when it finishes; there is no version of you that finishes the print faster by checking on it more often. The only useful state is patience.' },
      { h: 'Slow as a feature', p: 'Most of the things I want to do well take longer than the time I want to give them. The printer is a daily reminder that the right answer is not faster — it is to start sooner and walk away.' }
    ]
  },
  {
    id: 'fifteen',
    name: 'The fifteen-minute republic',
    kicker: '12 MAR 2026 · 9 min',
    tags: ['Essay', 'Time'],
    desc: 'A short defence of small chunks of time as the basic unit of a working life.',
    lede: 'In defence of the smallest meaningful unit of time.',
    meta: { Date: '12 March 2026', Read: '9 minutes', Tags: 'Time · Productivity' },
    body: [
      { p: 'Fifteen minutes is enough time to write the first paragraph, sketch the first frame, debug one stupid thing, send the email you\'ve been not-sending. It is also short enough that you can almost always find one.' },
      { p: 'Hours are aspirational. Days are political. But fifteen minutes is just there.' }
    ]
  },
  {
    id: 'sinologist',
    name: 'Notes from a recovering sinologist',
    kicker: '02 FEB 2026 · 12 min',
    tags: ['Essay', 'China'],
    desc: 'On reading too much Chinese history and the strange currency it gives you when arguing about the present.',
    lede: 'What three years of classical Chinese leaves you with when the textbook closes.',
    meta: { Date: '02 February 2026', Read: '12 minutes', Tags: 'China · Memoir' },
    body: [{ p: 'I studied Chinese for long enough to forget most of it, which is — I now think — the correct dose. Enough to feel the shape of the language; not enough to mistake fluency for understanding.' }]
  },
  {
    id: 'founder',
    name: 'Why founders should still print things',
    kicker: '14 JAN 2026 · 5 min',
    tags: ['Essay', 'Founder'],
    desc: 'Software people who never make physical objects miss something useful about constraint.',
    lede: 'Software people miss the room where the lights stay on past midnight.',
    meta: { Date: '14 January 2026', Read: '5 minutes', Tags: 'Founder · Making' },
    body: [{ p: 'Constraints in software are easy to ignore — you can usually buy your way out of one. Constraints in the physical world are harder to ignore because they keep being true.' }]
  },
  {
    id: 'recovering',
    name: 'Three careers, four cities, one notebook',
    kicker: '08 DEC 2025 · 8 min',
    tags: ['Essay', 'Career'],
    desc: 'On switching career every five years and what survives the switch.',
    lede: 'On switching career every five years and what survives the switch.',
    meta: { Date: '08 December 2025', Read: '8 minutes', Tags: 'Career · Memoir' },
    body: [{ p: 'I have been three different professionals so far. The only thing that has come with me to every desk is a small notebook, and the habit of writing in it before opening anything that pings.' }]
  }
];

window.APPS = APPS;
window.PRINTS = PRINTS;
window.ESSAYS = ESSAYS;
