Some weeks bring a new feature. These two weeks brought something else: they got a whole set of things working that we thought had been working all along. That is a more uncomfortable and more honest kind of progress — and if you use OutaStory on a phone, it is the kind you notice immediately.
The three sentences it comes down to:
- Push notifications now genuinely arrive on your phone for the first time. Not "more reliably" — for the first time at all.
- The reader turns pages again, instantly, with your thumb, and the buttons are where your thumb already is.
- The catalogue can be found again — 7,448 stories were simply unreachable through the categories.
Alongside that: Premium that keeps its promise again, prices in your own currency, advertising that actually pays authors, and a pile of small things you don't name but do see. In order.
Your phone rings — for the first time, for real
Let's start with the one that hurt the most.
OutaStory has been sending notifications since the apps existed: a new instalment of a serial you follow, a comment under your story, a reply, an approval. On the website they arrived. On not one single phone, Android or iPhone, has any of them ever arrived.
Not "rarely". Not "unreliably". Not once, ever.
The reason was as mundane as it is annoying: the app was built without a single identifier, and without it the notification system never starts at all. No crash, no error message, no red line anywhere. The phone never registered with the service — and a device that never registered is never sent anything. The number that would have given it all away sat in our own dashboard the entire time: zero mobile subscribers. It sat there, and nobody read it.
That is fixed, and we checked it on real hardware: a test notification arrives on iPhone, and it arrives on Android. Both with a phone in hand, not with a green tick in a dashboard.
Three more things on the same subject:
- Tapping a notification now takes you somewhere. Before, the app opened but dropped you on the home screen — for every kind of notification. Now the thing it is about opens.
- "Instalment 2 is out" opens instalment 2. Not the story's overview page, from which you get to click your way onward. The right instalment, in the reader, straight away.
- The permission prompt appears at a sensible moment. It used to slide over whichever page happened to load first — for authors that meant "My Stories", where it sat on top of the "New Story" button and swallowed clicks. Now we ask in your notification settings, or right after you finish a story. In other words, when the question makes sense.
And: notifications can finally be deleted
This one was reported by a reader — very politely, assuming he was doing something wrong. He wasn't. The feature simply did not exist, on any platform, ever.
Now every notification has an × to dismiss it, and there is "Delete read" for everything at once. The count on the bell updates immediately. Incidentally: the list used to load every notification you had ever received each time you opened it; it is now sensibly bounded, and noticeably faster for it.
The reader: turning pages, where turning pages belongs
A reader wrote to say he could open a story but not read on. He tapped "Next" and nothing happened. Seven times in a row. "Page 1 of 52."
He was right, and it was worse than he thought: turning pages was broken for everybody — on the web, on Android and on iPhone, with the button, the swipe and the arrow key alike. The reader was re-reading its own current page number from a place that had been reset in the meantime, and so navigated faithfully to exactly the page you were already on. That is repaired — and it taught us that the most-used gesture on the platform deserves a permanent test of its own. It now has one.
Underneath that one lay three more we would probably not have found otherwise:
- The swipe was silently dead on every third page. Not randomly — systematically, on exactly the pages that carry an ad break. The buttons worked there; the swipe did not. And, importantly, Premium members were affected too, even though they see no ads there at all.
- On a phone, the page-turn controls sat up to 807 pixels below the edge of the screen. So on every single page you first had to scroll to the bottom to move on. The bar is now pinned to the bottom of the screen, where your thumb already is. No scrolling.
- Every page turn re-downloaded the entire story. On a 52-page story that meant roughly 80 KB and a brief loading spinner — on every single turn. Now it only reloads when the story actually changes. Turning is instant, and noticeably cheaper on mobile data.
Serials finally behave like serials
This one was triggered by a reader complaining that we "always show the wrong instalment". That was also true, and in four places at once:
- Clicking "Instalment 2" took you to instalment 1. Every chapter link pointed at the first page, full stop. On the story that was reported, instalment 2 actually starts on page 7. Chapter links now land where the chapter really begins.
- The audiobook player announced the wrong instalment — "Chapter 1 of 2" while instalment 3 was playing. And read-along could, in the worst case, highlight another chapter's text; today it prefers to highlight nothing at all over highlighting the wrong thing.
- There was no way to jump between instalments inside the reader. Now a button in the top bar opens the instalment list and takes you straight there. On stories with a single chapter, the button stays out of the way.
- Your reading position drifted. It was a plain page number — so when an author expanded an earlier instalment after the fact, "Continue reading" suddenly pointed at a different part of the text. We now remember the chapter and your position within it. You come back to the same sentence, even if something was added before it.
Premium means ad-free again — and prices are right again
Two things we simply owed you.
Premium members were shown ads in the apps anyway. We reproduced it on a real device: an account with the gold PREMIUM badge on screen — and an ad banner underneath it. The cause: the banner in the mobile apps is a single view that persists for the whole life of the app, and nothing considered itself responsible for taking it down when the sign-in state changed. Now exactly one thing owns that, and a second refuses an ad request outright when there is no entitlement. Verified on device across four states.
The apps showed everyone the euro price. Everywhere. So a customer in the US App Store saw a price in euros and was charged in dollars. Every app now shows the price its own store will actually charge — in the store's currency, in the country's own formatting.
On Fire tablets a purchase could never technically have worked. The Amazon build was missing a key file the Appstore uses to sign its own responses — it had never been in a single one of our Amazon builds. Every purchase attempt therefore aborted before it began. That is fixed, and the release pipeline now checks that the file is genuinely inside the package before anything ships.
And the most uncomfortable number in this section: on 14 purchases by six customers on Fire tablets, money was taken and nothing was credited. Two independent faults in how we match a store's answers to the request that asked for them left the confirmation running into nothing. Both are fixed; every answer is now matched using the store's own transaction id. If this affected you and your credit or subscription never arrived, get in touch — we will put it right.
And a place you only notice when it hits you personally: notices from the stores about renewals, cancellations and refunds were arriving unreliably. The three endpoints that receive them fell asleep when nothing happened for a while, and the first notice afterwards ran into a timeout. On Amazon this channel had therefore never worked. The receivers now stay awake; in testing the same notice answered in 0.09 seconds instead of giving up after 25.
In preparation but deliberately not switched on: the Samsung Galaxy Store is getting its own payment route. It is now fully built — checkout, verification, credit packs and the matching legal texts. It stays off until we can turn it on honestly; a Buy button that leads nowhere is worse than no button at all.
Advertising that actually pays authors
Our share has always been the same: 55 per cent of advertising revenue goes to the author whose story carried the ad. That number has not changed and will not change.
What has changed is everything between "an ad was shown next to your story" and "it is in your account". That stretch was broken in several places — and every one of those breaks had the same property: it was silent. An impression that is never reported produces no error message. It produces nothing at all.
- Not one impression from the apps had ever reached an author's account. Mobile advertising has been running since 14 July. The ledger held exactly one network the whole time, and it was not the apps'. The cause was the same quirk as the Premium banner: a view that lives for the whole life of the app — the attribution was created once per view, and so could be booked exactly once per app launch. It is now created per actual impression, including every automatic refresh.
- Anything worth less than a cent was rounded to zero. We stored revenue in whole cents. A single banner impression is typically worth a tenth to half a cent — so it was stored as zero. Not "roughly zero": exactly zero. We now count in millionths internally and round only at the very end, when it enters an account.
- Impressions for signed-out readers were thrown away. People reading without an account see ads — deliberately, because ad-free is precisely what Premium buys. But the app could present no credential for those readers, so the report was refused. Real ads, shown, paying nobody. They count now.
- Ad slots without a single visible pixel were counted anyway. That sounds like more money and is the opposite: it dilutes the pot everyone's share is computed from. Not counted any more.
- Ads on pages without a story — home, categories, search — were not recorded at all. They are recorded now and explicitly marked as our own inventory, so they can never be confused with "an author went missing here".
One thing we have to say plainly, because it would otherwise sound like more than it is: our current banner network has earned €0.00 to date. What we repaired is the pipe, not the tap. But you repair a broken pipe before the water comes, not after.
Advertising and young readers
Also new and important to us: for readers under 16, ads are now explicitly flagged as child- or minor-directed, not personalised, and limited to the lowest content rating. Where we don't know the age, a stricter rating than the adult one still applies. For all of this, no age information leaves the device — the classification happens locally.
And three small irritations in the same corner are gone: a fullscreen ad in the reader could become unclosable on older devices (it now closes itself if it has to), our own in-house promos were invisible to every English-speaking visitor, and several ad slots on the website had accidentally been left completely blank by an earlier correction.
Covers without ghost titles — and voices you can upload at all again
Looking closely at freshly generated AI covers, we noticed something easy to mistake for an image effect: underneath the cleanly typeset title lay a second, painted one. Faint, slightly warped, in the model's own lettering — and in exactly the place our own title sits.
The cause was embarrassingly logical. We had given the image model the title in the text ("for the story «…»"), asked it to leave a calm area free for a title, and then asked it not to paint any text. An image model reads that as a task description, not a prohibition. Now the model simply doesn't know the title — it gets the description, the mood and the genre, and the area stays free without anyone being tempted to fill it.
Right next to it sat a second fault that mostly hit German titles: on long compound words the title line laid itself on top of itself. "Das" over "GEISTER/HAUS". The reason was that the layout stage estimated line height from the number of characters, while the actual rendering measures the real letters and wrapped onto two lines — growing upward into the line above. Today the layout measures with the same method used to draw, shrinks the whole block evenly if it has to, and avoids breaks that leave a stub like "Geisterhau/s".
And a curiosity we found while tidying up our libraries: four font files in our project weren't fonts at all. They were HTML error pages that had at some point been downloaded instead of the real file and shipped along — large enough that nobody ever noticed. The consequence: our cover and social-media images had been typeset in a fallback typeface rather than our own the whole time. The real fonts are in place, every font file is checked at build time, and if one is missing the build now fails loudly instead of quietly producing something pretty in the wrong typeface.
With voices it was blunter. Anyone trying to record their own narration voice simply got an error — reliably, on every real recording. Short test clips went through, but a voice sample has to be at least 45 seconds long, and from that size upward the analysis failed every time. The reason was deep in the toolchain: the analysis program reads only as much of a file as it needs to identify it and then exits successfully — whereupon writing the remainder failed, and we treated that as an error, even though the analysis had long since finished correctly. Now only the analysis program decides whether something worked.
In the same pass we switched on two improvements that were built but had never actually been enabled on any server: recordings are now denoised and stripped of background noise by default before they become a voice. Anyone recording at home without a studio — which is to say, everyone — gets an audibly cleaner voice out of it.
Smaller, but irritating: profile pictures were sometimes rejected even though they were perfectly fine. Windows' own file dialog offers JPEG images with a .jfif extension — and those were exactly the ones our server turned away. So we offered you a file and then refused it. We now look inside the file rather than at its name.
So that people can find you
This section matters most to everyone who writes here — even though almost nothing changes on the site itself.
We spent two weeks checking what we actually tell search engines about ourselves. The result was uncomfortable:
- Of 714 category addresses in our sitemap, 670 led nowhere. For years we had been handing Google a map that pointed at empty fields 94 per cent of the time.
- The word "German" appeared in that map exactly zero times. Over 4,000 addresses, and not one hint that every page has a German edition — on a platform whose audience mostly reads German. Every address now carries its German twin.
- 3,236 author and story pages had nothing but a name as their search headline. Not "Short story by …", not the genre, not the fact that you can listen to it. Just the name. Every headline now describes what you will find there.
- The descriptions under category results broke off mid-sentence — on 158 of 713 pages, because an appended boilerplate line ate almost the entire character budget. Today the hand-written text survives intact in four cases out of five.
And the find that is directly noticeable to you as a reader: 7,448 stories were completely unreachable through the categories. Part of our genre tree stores its addresses with a slash in them, and those were packaged in one place in a way that could no longer match any page at all. Entire shelves — the whole classics section — were therefore empty in the browser while being full. They are back.
In brief, alongside that: there is now an overview page for all stories (there simply wasn't one — the address answered "not found"), six categories deep in the tree got an address for the very first time, 27 dead blog addresses are gone from the sitemap, English blog posts are no longer served in German, and the blog speaks German in its own interface when the text is German.
Afterwards we measured the whole thing rather than believing it: 2,927 addresses, each fetched twice — once as a browser, once as Google — 5,854 requests in total. Result: all fine, and not a single difference between what a person sees and what a search engine sees.
We have also started doing the same for AI assistants: audiobook markup so that "where can I listen to X?" can find us at all, machine-readable speaker and contest pages, and a plain text file that truthfully explains to a language model what exists here — it previously stated a catalogue size that was off by more than a factor of two.
And because honesty is worth more here than a nice number: our visibility in AI answers is currently zero. Across 15 test questions and three models, we were not mentioned once. That is not caused by missing markup, and markup will not change it — that needs time and people talking about us. In these two weeks we built the preconditions, not the result.
Getting in, getting started, publishing
A bundle of things that all have the same shape: they looked like they worked.
- The "Sign in" button on the age gate did nothing. Anyone opening a 16+ story without an account got an age prompt with a button that was simply inert on the website. It now signs you in and brings you back to exactly the story you were standing in front of.
- There was no reachable place to enter your date of birth. Anyone who tried was sent round in a circle — and stayed permanently locked out of every 16+ story as a result. The field is now where you would look for it, and the prompt in your profile leads there too.
- When completing your profile, we guessed your first name and saved it without asking. Sign-in providers often hand over a display name, which we split at the last space — which goes wrong constantly for a single username or an email address. Now you see what we suggested, along with a note on where it came from, and can correct it before it ends up anywhere.
- The "New Story" button on "My Stories" created nothing for four months. It switched a tab, and that was it. It now creates a draft and opens the editor — the way you would expect.
- Editing a published story created a new version on every click. One author ended up with V2, V3 and V4 of the same story sitting in his drafts. "Edit" now reopens the existing version, and the draft list tells you what a row actually is: "new version of a published story", or "superseded — version N is already live".
- A rejected change to a running serial reported "story not found". Precisely the wrong thing to say: you assume something is broken and save again, and again. It now tells you which field was refused.
Speed, and a few things you don't name
We carried on with speed where we left off two weeks ago — this time less on big rebuilds, more on ballast. And the ballast was considerable: the home page shrank from roughly 1.15 MB to 450 KB, a little over a third of its old size.
- An entire third-party design framework has left the website. We measured how much of it was doing anything at all: 30 rules out of 2,775. The rest was weight every single page carried without ever having an effect. Replaced by a tiny first-party foundation — verified across nine pages at two screen widths, with not one unintended difference.
- Scripts nobody needs immediately no longer block the page. Analytics starts only when the browser has room; the notification SDK only when something actually needs it — on the home page 91 per cent of it went unused.
- The cookie notice was waiting on twelve stylesheets before it was allowed to start — 580 milliseconds of that alone showed up in the measurements. It now runs earlier, without changing anything about the order in which consent is handled.
- The cached home-page payload is now compressed and stripped of everything the home page doesn't display. It had become the single largest item on the page.
- Cover images request the size they actually need again, and the browser is allowed to keep the home page's first big image instead of re-checking it every hour.
And two outages that happened along the way, which we don't want to gloss over: our blog and both sitemaps were briefly unreachable altogether (a fault in a piece of work whose whole purpose was to make those pages easier to find), and during one deployment the home page showed an empty catalogue for just under fourteen minutes. Both are fixed, and for the second there is now a rule that makes it impossible to ship that class of change the same way again.
Alongside that, the class of small things you don't mention individually and notice clearly in aggregate:
- In dark mode, individual panels lit up light grey — most visibly on the earnings page. The cause was 17 colour names that don't exist, which therefore quietly fell back to a light default. All corrected.
- Eleven pages ended flush against the bottom edge of the screen, with no spacing at all — home, categories, search, authors, notifications, profile, favourites and downloads. Also a name that didn't exist.
- The desktop sidebar has been reordered and can now be collapsed to a narrow icon rail. Your choice is remembered.
- The age rating has disappeared from the cover tiles again. It simply didn't look good there; on the story's own page it is of course still shown.
- The contact address in our legal texts was plain text, not a clickable link. It now opens your mail program.
- The link to our AI guidelines in the contest rules led nowhere — in five places, in both languages, to an address that has never existed.
- Speakers who opened their invitation link a second time saw an error page. The link consumed itself entirely on acceptance, so afterwards the page could find nothing. It now simply says: "You have already accepted this invitation."
- Moderators can now look at the item that was reported. Previously the report list had three buttons per row — all three of them decisions, none of them a look at the thing being decided.
AI, openly declared
Since the beginning of August, Europe has required AI-generated content to be labelled. We took that as an occasion not just to do the minimum, but to be consistent about it:
- Every AI-generated image carries a machine-readable marker, regardless of which of our tools produced it — covers, category artwork, images in our emails. The marker is always embedded last, because it would otherwise be lost again when the image is resized.
- Narration voices, AI covers and the writing assistant now visibly tell you they are AI — at the point where you use them, not only somewhere in the fine print. And readers see the AI declaration their authors already made, on the story card, on the detail page and above the reader itself.
- And one that annoyed us: on Facebook, stories written by people were being labelled as "AI content". The reason was a marker that refers to the cover image — often AI-generated in our case — which Facebook applied to the whole post. For an author who wrote her text herself, that is simply a false statement about her work. Fixed.
And a correction: the writing prompts became emails
Two weeks ago we announced writing prompts here: a daily nudge to write, derived from what is culturally happening that day, as pages of their own under /prompts/….
Those pages no longer exist, and that is deliberate.
Reading what was actually being produced made one simple thing clear: a prompt is an invitation, not a destination. Nobody visits a website to collect a writing exercise — but plenty of people happily read a short email that reminds them on a Tuesday morning that they meant to start something. Building pages for it would have meant diluting our catalogue with machine-written text. We don't want that: what stands on OutaStory should have been written by people.
So the prompt now goes where it belongs — to your inbox, with the image, the nudge, and a button that opens an empty draft in the editor for you. At most once a week per person, matched to what you enjoy reading anyway, unsubscribable at any time, and of course marked as AI-written. The reasoning behind it has now been verified end to end — before that, and this is part of the truth, it had never produced a single usable prompt.
And the editorial line stays what it was: it is always about your story. The occasion supplies mood and moment — never someone else's characters.
Where things stand
- Six platforms — web, iPhone & iPad, Mac, Android, Windows and Fire tablets. Plus the Samsung Galaxy Store and Uptodown for anyone running Android without Google.
- Over 9,000 stories in the catalogue, German and English, many with an audio edition.
- 7,448 stories reachable through the categories again.
- 713 categories across 25 main shelves, named and described in both languages throughout.
- 5,854 requests to verify our own pages — as a browser and as a search engine, with identical results.
- Two weeks in which push notifications went from "never" to "proven on both systems".
- Five messages from readers and authors, which turned into more than a dozen fixed defects.
What comes next
First: the writing prompts by email. The pipeline is in place and verified; what matters now is that the first email that goes out is genuinely good. We keep reading along before anyone receives one.
Second: the first euro actually paid out from advertising. The pipe is repaired, at every point we found. What is missing now is a month-end run that goes through from beginning to end and lands in an author's account. We will report on that when it has happened — not before.
Third: becoming visible. We spent two weeks making sure we can be found. Whether we are found will be decided over the coming weeks, and we will measure it against the baseline we wrote down beforehand.
To close, the same as last time, only with more emphasis: tell us what looks wrong. The broken page turn, the wrong instalment, the notification that couldn't be deleted, the blocked age rating — those were all emails from readers. Not one of those defects ever produced an error message. They were silent. You weren't, and that is why they are gone.
Thank you for reading, for writing, and for looking closely.
