StreamUpdated 23 July 2026

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

July 2026

Trade Time v4.36.11 — the source audit →

Every exchange page on Trade Time cites the exchange's own website for its hours and holidays. This release is the audit of those citations: all 60 checked against what the cited page actually says, 38 repaired — dead links, moved pages, one that had quietly become last year's calendar.

The audit also found three real calendar bugs. India was missing a holiday. Milan was missing New Year's Eve. And Singapore had three wrong dates — the site would have given the wrong open-or-closed answer five days next year. All fixed, and a new test now pins every page's source links to the dataset, so a repaired citation can never silently drift out of what visitors see. A scheduled re-check makes the whole holiday set fail loudly each December, before the year turns rather than after.

Trade Time v4.36.0 — the first ask →

Trade Time has been free since the first day — no ads, nothing gated — and it stays that way. It has also never asked for anything. This release adds one quiet line: a coffee link in the app footer, and at the bottom of every exchange page.

Two deliberate limits. It is a plain tip — no memberships, no tiers, no perks — because a tip with nothing given in return is a gift, and the moment something is given back it becomes a sale, with the tax and registration that follow. And it stays off the developer docs entirely: a payment prompt on a page documenting a free API reads like a catch.

Both limits are held by tests rather than by memory — 131 of them, including one that fails the build if a paid link is ever added anywhere on the site.

Trade Time v4.35.0 — a page for every exchange, and one look across the whole site →

The question people actually search — "is the NYSE open right now?" — now has its own answer page for each of the 30 exchanges, plus a hub at tradeti.me/exchanges: live status, the day's hours in your timezone, and the trading week laid out. A real bug fell out of building them — the Gulf and Israeli markets that trade Sunday–Thursday were being shown a Saturday/Sunday weekend everywhere; the trading week is now data-driven and correct. And the whole site — the app, the exchange pages, the developer docs — finally wears one consistent header, footer, and local-time clock.

Trade Time v4.34.0 — a public API and an MCP server for the market data →

Two releases on back-to-back days made Trade Time's data usable from outside the site. v4.33.0 moved hosting to Cloudflare Pages and shipped a documented free REST API with runnable examples and a live playground. v4.34.0 finished the job: api.tradeti.me for code, an open-source MCP server (tradetime-mcp on npm and the official MCP registry — npx -y tradetime-mcp) so an AI agent can ask "is the NYSE open?" in plain words, and developer docs rebuilt as first-timer-friendly pages at tradeti.me/developers. Same trading-calendar data behind all of it; free and keyless in this phase.

Battle of Ideas — the strongest case for and against, both sides argued at full strength →

Ask an LLM a contested question and you get a smoothed-down answer. But the models argue well if you make them. So I built a small experiment: for a claim like "nuclear should be the backbone of the clean-energy transition" or "humans have free will," one AI steelmans each side, a second red-teams every argument, and a third checks the load-bearing sources against the open web. The result is a map of the disagreement — both columns side by side, every argument carrying its assumptions, counters, and receipts.

It's AI-generated and says so — judged on merit, not authorship. The source-checking earns its keep: on the remote-work claim it caught the famous "23 minutes to refocus" statistic, traced it to a magazine interview rather than the study everyone cites, and dropped the argument. v0.1, six claims, live at battle-of-ideas.com.

Second Brain Starter Kit — the file-based memory system, as a template →

I run my work through a plain-files second brain: a wiki an AI assistant reads and writes, an inbox that gets processed daily, and the operating rules that keep it honest. This kit is that system with my life removed — fifty-odd files you can clone and start filling in. Markdown all the way down; no app, no lock-in. MIT-licensed — my first open-source release. Get it on GitHub →

This site now serves from Cloudflare's edge →

Until today every page here was served from one shared server in Europe. Now the site is served from the Cloudflare datacenter nearest to you — same pages, byte-identical, about fifty times less distance for most visitors. Deploys became atomic with instant rollback, which beats uploading files one at a time over FTP and hoping.

Moving it surfaced a bug I'm glad to have found: the Contact link on every page built an email address that had never existed — clicks have bounced since this version of the site launched. It works now, and points at my own domain: me@nicolaijohannesen.com.

Mission Control — one screen for the one-person company

A cockpit that pulls the moving parts into one screen: what's queued to review and ship, marketing drafts it reads aloud to me, and a verdict on each item with the why attached. It went from first version to sixth in a day, because reviewing from one screen turns out to beat hunting through files every single time.

Trade Time v4.32.10 — faster reloads, clearer closed-market reasons, no white flash →

The run since v4.32.5: the hour ruler, overlap bar, and every exchange's session bars now line up on one shared 24-hour plot (v4.32.6). Translations got cacheable and version-keyed, so a returning visit serves your language from cache instead of downloading it again (v4.32.8). Every closed exchange now says why — Holiday or Weekend (v4.32.9). And this release fixes the white flash on reload, makes offline mode work reliably on the live server, and gives the dark prerender legible contrast.

June 2026

Book Editor — the authoring cockpit I write the books in →

A project page for the local-first tool I edit the books in. It keeps each book's standard — its Northstar, brief, evidence, and target length — on screen beside the prose, so every edit is made in full view of the bar it has to clear. There's a multi-book library, an editorial ladder of fixed passes, pinned margin notes, read-aloud, and a version history that snapshots everything that can change. In-house and local-only, never deployed — which is why the page has a screenshot instead of a link. Read the project page →

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.

Trade Time 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.

Trade Time 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 →

Trade Time 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.

Trade Time v4.30.4 — it installs like an app now

Adding Trade Time 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. Trade Time 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.

Trade Time 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.

May 2026

Trade Time 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.

Trade Time — 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.