Stream
Things I've shipped, notes from work in progress, occasional photographs. Reverse-chronological. Updated when something is worth saying.
Shipped
19 June 2026
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.
Shipped
16 June 2026
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.
Shipped
15 June 2026
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.
Shipped
15 June 2026
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.
Shipped
15 June 2026
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.
Shipped
15 June 2026
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.
Shipped
10 June 2026
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 →
Shipped
13 June 2026
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.
Shipped
8 June 2026
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.
Essay
5 June 2026
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.
Shipped
4 June 2026
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.
Shipped
2 June 2026
A Constitution-led redesign of nicolaijohannesen.com — 34
documented decisions in one day, and the reusable substrate that
compounded as a byproduct. Read the project page.
Shipped
31 May 2026
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.
Shipped
22 May 2026
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.
Note
19 May 2026
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.