Stripe test mode
One house, eight worlds — the new design becomes the only interface (and the old one is gone for good)

One house, eight worlds — the new design becomes the only interface (and the old one is gone for good)

designredesignuidesign systemweltenthemestypografiemauiwartungzuverlässigkeitalpha
Fiction
![A designer's desk with digital cover art, a drawing tablet and stylus — creative craft and a design system taking shape](https://images.unsplash.com/photo-1558655146-9f40138edfeb?w=1600&h=840&q=80&fm=jpg&fit=crop&crop=entropy) *Photo: Unsplash* There are two ways to rebuild an interface. The loud one: switch everything at once, replace the old overnight, and then spend three weeks fixing every other click. And the quiet one: raise the new alongside the old, week after week, behind a switch that at first nobody but you can see — and only flip it once every single page truly holds. OutaStory chose the quiet way. Over many weeks, a **completely new interface** grew in parallel with the existing platform — page by page, from the home page through the reading mode into the last back-office corners. The whole time it ran muted in the background, visible only through a preview address. This week the switch was thrown. The new design is now the **only interface** — on the web and, with the next app release, in the apps too. And the genuinely remarkable part isn't that the new is here. It's that the **old is gone**. Entirely. Not disabled, not commented out, not "still lying around just in case" — but removed, down to the last line and the last switch that could tell old and new apart. Why that was the harder and more important half of the work is the story of this week. ## What changes for you The visible first. The new OutaStory is calmer, clearer, and at the same time noticeably more characterful — a contradiction only at first glance. **A shared visual grammar.** Before, every page had grown on its own; now they all share the same grammar of spacing, corners, shadows, and focus rings. Lists — in profile, management, moderation — sit on one continuous, framed surface instead of loose cards with gaps between them. Forms breathe evenly. None of it is spectacular; it's the kind of order you don't notice, because nothing gets in the way anymore. **Two self-hosted typefaces.** For headings, an editorial serif with personality; for body text, a clear, quiet sans. Both live on our own server — no detour through a third-party font service, no waiting second before text appears. **Calm density where the work happens.** The writing, publishing, and management surfaces are deliberately sober: no glass, no big stage, tighter lines, hairline dividers. An author stuck in chapter three doesn't need decoration, she needs room and quiet. The stage stays reserved for the places where a story is allowed to shine. ![A warmly furnished, calm, coherent living room in natural light — calm density over effect](https://images.unsplash.com/photo-1618221195710-dd6b41faaea6?w=1600&q=80&fm=jpg&fit=crop) *Photo: Unsplash* ## Eight worlds But the real heart of the new design is none of that — it's the **choice of theme**. OutaStory is a platform for stories, and stories have moods. So the interface itself gets moods: **eight curated "worlds,"** each with its own palette, its own light, its own character — from a deep, star-clear night blue through a warm parchment tone to a soft, muted red. You pick a world in your profile, and the whole platform puts it on, light or dark. What's interesting about this step is what came **before** it. In development, we'd experimented with far more themes — over two dozen. That's the advantage of a switch nobody but you stands behind: you get to be generous with experiments. For graduation, we deliberately **cut from over twenty down to eight** — not because the others were bad, but because eight clear, well-kept worlds are worth more than twenty of which half are just "also there." And because every extra world has to be maintained, tested, and thought through forever. So that nobody who had chosen one of the retired worlds suddenly faces a broken interface, a one-time, gently-guided migration translates every old choice to the nearest of the eight survivors — silently, on first load. Anyone who had picked a still-living world keeps it unchanged. ## Why the tearing-down is the harder half Now the quiet part, the one I'm honestly proudest of. For months the platform carried **two interfaces at once** — the old and the new, separated by a switch. Nearly every page existed in two versions, branched at exactly that point: "if new, show this; otherwise show that." During the build phase that's exactly right — it's the safety net that lets you show the new without touching the old. But it's ballast you must not keep. Two parallel interfaces mean two places for every bug, two versions of every decision, and a slow drift apart that gets more expensive every week. So graduation wasn't one step but two. First the new was made the **default** — the switch pointed forward from then on. And then, the actual cleanup, the branch was **removed everywhere**: at eighty-seven surfaces the old version cut out, the new markup made the only one remaining, and finally the switch mechanism itself deleted — the whole machinery that could ever tell old from new is gone. What's left is a platform with **one** interface, one source of truth, no dead parallel universe in the basement. This kind of work has no shiny screenshot. It's invisible — precisely when it succeeds: if, after removing the old, **nothing** in the new tips over, you did it right. Tens of thousands of automated tests confirmed after every round that this was exactly the case. ## Under the hood: maintenance with judgement Between the design rounds ran the least spectacular yet still important upkeep: bringing the toolbox up to date. Around a dozen of the libraries OutaStory stands on were updated — and a few deliberately **not**. The "deliberately not" is the more interesting part. A newer update isn't automatically a better update. Five building blocks we intentionally left where they were, each for a concrete, documented reason — among them one we know from experience that a hasty jump once triggered a disruption, and two that are deliberately pinned to a specific, vetted version for security reasons. "Always everything on the latest version" sounds like diligence but is often the opposite: diligence means deciding for each building block individually — and justifying the decision. Two bigger jumps we did make — the image tools and the MP3 decoder each skipped a major version. Such jumps almost always bring a small breaking point (the image library had marked a rounded-corner function as obsolete), and that's exactly what the test net is for: it showed the breaking point immediately, the migration was a handful of lines, and the proof that audio durations were still correct afterwards came from a test that computes through a real MP3 file. ## A bug that broke in exactly the right way And then there was one more thing that broke — in the best possible way. The background services that generate narration, covers, and descriptions refused to start. The reason: a central building block had at some point grown a new dependency, and in exactly those four services the one counterpart that provides that dependency was missing. Present everywhere else — here not. The beautiful thing about it: these services **check their own wiring at startup** and refuse to run if something is missing — loudly, immediately, before a single real task goes through. It's the exact opposite of the silent bugs we've written about here twice already — the search that found nothing for anyone, and the audio durations that quadrupled. A service that honestly aborts at startup isn't a nuisance; it's a gift. It fails where only development sees it, instead of later where it hits real people. The fix was a single line — the missing wiring put in the right place, so the services provide for themselves, no matter what context they run in. ## The apps follow The new design isn't only a web thing. Because the apps share the same core with the web, they carry the new design too — it arrives with the next store release on iOS and Android. The code for it is finished and verified; what remains is the run on real devices before the new version goes to the stores. Because an app doesn't render in the same browser as the desktop machine, and the last few percent of polish on an interface are always decided on the device in your hand. ## Numbers - **Design graduation**: made the new the default, removed the branch at **eighty-seven** surfaces, deleted the entire switch mechanism, consolidated the themes from **over twenty down to eight** well-kept worlds — with a gentle migration for every retired choice. - **Maintenance**: around a dozen libraries updated, five deliberately held with a reason, two major-version jumps cleanly absorbed. - **One startup bug** in the background services — caught at startup, fixed with one line, before it reached anyone. - **Tests**: still green in the high tens of thousands; every cleanup round backed by the full suite. ## What's next - **The new design onto devices** — the device run for the apps on iOS and Android, before the new version goes to the stores. - **Sanding more edges** — now that there's only one interface, every polish lands in exactly one place. - **Privacy sign-offs before public launch** — the documented review gates for the assistant and youth protection stay the condition before any switches are flipped for the public. A few months ago, OutaStory was a platform you read. Then one that reads to you. Then one that listens. This week it gained no new ability — it learned **how it looks** when it's fully itself: one interface, one visual language, eight worlds to choose from, and no old scaffolding left for the future to snag on. If you notice something about the new look — a world that feels wrong in one corner, a page that steps out of line — that is exactly the most valuable feedback right now. Freshly painted walls show every scratch first.

Comments (0)

No comments yet.

Comments are closed for this post.

An unhandled error has occurred. Reload 🗙

Rejoining the server...

Rejoin failed... trying again in seconds.

Failed to rejoin.
Please retry or reload the page.

The session has been paused by the server.

Failed to resume the session.
Please reload the page.