iOS apps / StoryReader

StoryReader app icon

StoryReader

Reads plain-text stories from an iCloud folder and asks for a rating at the end.

Work in progress: first milestone built, last worked on in July 2026. Not on the App Store yet.

The StoryReader library titled Stories with five fables, the first rated five stars, the second four stars and three still unrated with empty stars.
The library. Empty stars mean not read yet.
The StoryReader reader showing the fable The Crow and the Pitcher in full, followed by a five-star rating and a one-line comment.
The end of a story, with the rating and the comment. Screenshots from the iOS Simulator, with Aesop's fables as sample stories.

What it is for

StoryReader is for stories that are kept as plain text files in an iCloud folder. It does two things: I can read them on the phone, and it remembers what I thought of each one.

How it works

There are two screens. The library lists the text files of one folder with their star rating, and a story without a rating shows empty stars (that is the "to read" sign). The reader shows the story, and after the last line come five stars and a comment field.

There is no save button. Rating, comment and reading position are saved when you leave the reader or when the app goes to the background. You pick the folder once in the system's document picker, and the app remembers the permission, so it needs no storage of its own.

What is interesting about it

One index file, inside the folder

All ratings live in a single JSON file next to the stories, so they sync wherever the stories sync, and I can open the file in a text editor. A database file would be the usual choice, but SQLite inside a synced folder is a known way to corrupt it.

A story is known by its name and by its content

Each entry stores the filename and a hash of the text (SHA-256, cut to 16 hex characters). A file matches its entry if either one matches, and the other one is then updated. A renamed file keeps its rating through the hash. A story with a fixed typo keeps its rating through the filename. Only a file where both changed counts as a new story, and the old entry is kept for one more load before it is removed.

Non-goals, written down first

No editing, no rich text, no search, no tags, no layout for iPad. The design document with these limits, the data model and the decisions came before the code, and the first working version was done the same day.

Data

The app contains no network code of its own. It reads and writes files in the folder you picked, and the syncing is left to iCloud.

Status

The first milestone was built on 2026-07-13 and checked in the simulator from end to end: pick a folder, read, rate, leave, and the index file appears. The next day it ran on an iPhone 16 Pro. The matching rules and the index file are covered by 10 unit tests.

It has not been worked on since July 2026. Open before a release: two items from the run on the phone (a layout warning while scrolling, and files that are not downloaded yet should be fetched automatically), and a test with a sync conflict, of which I have no record. Some of the reading ideas went into Aloud in the meantime. StoryReader is not on the App Store yet. A release under Volary AB is planned, without a date so far.

The picture in the icon was generated with an image model from my description.

Back to the iOS apps