Stream

Things I've shipped, notes from work in progress, occasional photographs. Reverse-chronological. Updated when something is worth saying.

Let Them Struggle reader v2.4.6 — read either language by tapping its column

The side-by-side view now follows your finger to the right language: tap the English column and it reads English, tap the Danish and it reads Danish — and that choice sticks as the reading carries on, across chapters and after you switch apps. Tap any chapter headline — the title, the part, the chapter, the epigraph — to start reading from there. The bilingual title page was rebuilt so both languages sit in clean facing columns, and the layout is ready for a third language whenever one comes. Switching language mid-listen no longer stalls. Same calm reader, now properly two-handed about its two languages.

Let Them Struggle reader v2.4.0 — read-aloud that keeps up with you

Listening got a lot better. The reader now keeps your exact place — by eye or by ear — when you switch to another app and come back. While it reads aloud, the text scrolls to keep the spoken line in view, and you can tap any line to jump straight there. Read-aloud shows up on your lock screen and notification shade, with play, pause, and skip. And a new share button hands the free book to anyone in a single tap.

TradeTi.me v4.32.5 — a clearer timeline legend

Tablet feedback said the "Show legend" control didn't look pressable. Now it's a proper pill button with a resting border, and while collapsed it shows small colour dots in the exact band colours — violet for trading phases, amber for morning momentum, blue for the killzones — so it's obvious the control explains what the coloured bands on the timeline mean.

Let Them Struggle reader v2.3.0 — instant, reliable loading

The reader now paints the moment it opens. The cover, the two languages, and the title are there immediately; the book itself streams in behind them, so a slow or flaky connection no longer leaves you staring at a blank screen. If the book ever fails to load you get a clear retry instead of nothing. Same reader, same bilingual layout — it just starts faster and fails gracefully.

Let Them Struggle reader v2.2.0

The reader got a proper fit-and-finish pass: themed scrollbars that follow the light/dark setting, a choice of three typefaces, a text-size stepper so you can read at whatever scale works on your screen, reading-density presets, and a regrouped settings panel that keeps all the controls in one place. Same bilingual English/Danish layout; just easier to settle into.

TradeTi.me v4.32.3 — a quick tour, an honest update prompt, a clearer countdown

First-time visitors now get a quick tour that walks through the layout, so the value lands in about ten seconds. When a new version is waiting, the footer says so directly — "Update now" — and only while you're online, where applying it actually works, instead of going stale in the background. And the countdown got another pass: each market tells you which session is counting down and why — closes, opens, pre-market — not just a bare number.

Let Them Struggle — Part I, free to read

The first three chapters of the parenting book are readable now, in a custom reader built for it: English and Danish side by side, a hairline seam down the middle, installable, works offline. The bilingual layout is the point — the book and its Danish edition develop together, so the reader treats both as first-class rather than one as a translation bolted on afterwards.

It's the opening sample, free; the rest of the book is still being written. The reader is how Part I goes out to find readers before the whole thing exists. More on the project →

TradeTi.me v4.30.6 — a smarter, more honest countdown

Two passes. First, the countdown learned to say what actually matters for each market's state: Closes in while it's trading, Main in during pre-market, Opens in when it's shut — and hovering any exchange now shows every one of its sessions, converted to your local time.

Then the weekend. The same Friday-evening bug — "Opens in 7h" pointing at Saturday's pre-market instead of Monday's real open — had been fixed surface by surface and kept coming back, because each part of the app worked out the calendar on its own. v4.30.6 puts that logic in one place — a single market-calendar authority every surface asks instead of re-deriving. Fix the class, not the instance: the row bars, the countdowns, and the overlap strip now all agree about when a market is closed, and a clock-pinned test holds the Friday-evening case so it can't drift back.

TradeTi.me v4.30.4 — it installs like an app now

Adding TradeTi.me to a tablet home screen showed a giant, blurry, cropped globe on the launch screen before the page loaded. Small cause, outsized effect: the app icon was tagged "maskable" in the web manifest without the padding a maskable icon needs, so Android zoomed in and cropped it — and the icon was a low-resolution image to begin with.

The fix: regenerate every launcher icon crisply from the vector source, add a properly padded maskable variant, and split the manifest so the plain and maskable icons stop fighting. The same pass finished the install experience properly — iOS home-screen support, device splash screens, an install prompt. TradeTi.me is now a real installable app on Android and iOS: add it to your home screen and it opens full-screen with its own icon, no app store.

When the Market is a Complex Adaptive System →

New essay. Long-horizon investing in markets nobody controls — only steers. Amazon's 1999-2026 arc as the worked specimen: the peak-buyer at $113 sat through a 94% drawdown for ten years before breaking even, then compounded 45x; the bottom-buyer compounded a thousand times. Almost nobody held either.

The framework names three archetypes from the dot-com era — pure infrastructure builders that died (Cisco's stock took 25 years to recover; Nortel/Lucent/Global Crossing didn't), pure application plays that mostly died, and the third archetype that compounded across regime changes: application companies that built infrastructure for their own use and monetized the spare capacity. Amazon and Google are the canonical cases. Read the essay.

TradeTi.me v4.30.3 — first paint shows the value

The static page that loads before the React app used to say "loading live status" — placeholder text from the bundler. Crawlers, social-card scrapers, and the first second a human's eyes hit the page all saw the same useless line. Now the prerender carries the actual value proposition: "See when 30 major stock exchanges across 5 regions are open — in your local time." The page title is keyword-rich ("Global Stock Exchange Hours in Your Local Time — Trade Time") and the social card meta tags all align with that single message.

Yesterday's deploy had a different kind of bug — the JavaScript bundle was current but the static HTML prerender was a build behind. A crawler hitting the page saw old text; a human with JS got the new version. Today's deploy rebuilds both layers and verifies they agree — same version in raw HTML and in JS-hydrated DOM. The cache-busting check is now a Publishing SOP step so the half-shipped state doesn't repeat.

TradeTi.me v4.30.1 — three bugs gone

Three bugs in the trading-hours chart, all related to what happens across weekends and holidays. Closed-day bars were either invisible or painted onto the wrong local hours. The next-open countdown hardcoded one day on non-trading days instead of computing across the actual gap. The countdown format read either too vague or too precise.

Now: hours-primary format (6h 43m, 23h, 62h — what the eye actually reads), real next-open computed across weekend and holiday gaps, and the weekend-boundary clipping marked load-bearing in the code with a regression test, so a future cleanup pass doesn't quietly remove it.

TradeTi.me — the first version is live

I kept running into timezone friction when I traded from Asia. Earnings calls landed in the middle of the night, charts came labelled in timezones that weren't mine, and I had to do the conversion in my head every time. It was annoying.

So I built a small site that fixes it. One screen, your markets, your timezone. The first version is rough but it does the one thing.

A small principle for personal infrastructure

The wiki I keep has a rule that surprises people: every page gets a version number, bumped on every edit. Not a git hash — an integer the page itself shows. v3, v4, v5.

It sounds bureaucratic. In practice it's the single feature that makes the thing feel alive. When you can see a page has been touched seventeen times, you trust it differently than the first draft of the same idea.