Last time I wrote about getting to seventy thousand words and losing track of my own story, and I ended on a promise: TexFaber would read the manuscript and build the story wiki itself, with as little typing as possible.
It does that now. This is what it looks like, and what it took.
I should say that this is not a comparison piece. I am building the thing I wanted to exist, and I would rather describe that than spend a post measuring it against other people’s work, which changes every month anyway.
01The wiki builds itself
The test I set myself was simple. Take a novel the software has never seen, that nothing in it was written for, and see whether what comes out is a wiki or a list of names.
Rachel Ray, by Anthony Trollope. Thirty chapters. It came back with 829 pages. Most of them are events — six hundred and ten of them — because in this wiki a thing that happens gets a page of its own, the same as a person does. The rest is sixty-seven people, a hundred and eight places, thirty-six objects, and three hundred and eighteen facts binding them together. I typed none of it.
An earlier version of this post said 1,480 pages and three hundred and thirty-nine people. Those were real numbers from an August run, and they were worse. Later passes folded hundreds of pointer pages onto the people they actually named — Rachel Ray has sixty-seven people in it, not three hundred and thirty-nine. The test the project sets itself is whether each person gets exactly one entry, and by that test the smaller number is the better one. Corrected 15 September.
A second book, Vice Versa, gave 729 pages on the same terms: seventy-two people, four hundred and ninety-two events, two hundred and eighteen binding facts.
What sits on a single page matters more than the count. For a character it holds every name the book uses for that person, the lines they speak, every chapter they appear in, where they first appear, what the story asserts about them, what it denies, and what they took part in.
A few things I care about more than the totals:
One person gets one page. In a third book, Lady Audley’s Secret, Lucy Graham is Lady Audley. Seven names, one entry, not seven.
The narrator counts as a character, even when they are only ever “I”.
Events are proper entries. Most tools stop at a list of characters. Six hundred and ten events out of one novel is a different kind of object, and it is the part that makes a timeline possible.
It accumulates. Chapter nine is checked against chapter one. When the book contradicts itself, it asks rather than guesses. The Trollope run raised three questions.
Nothing is asserted without its source. A fact appears with the sentence it came from, or it does not appear.
I am not going to explain how any of that works. It is the one part of this I would rather keep to myself for now, and there are a lot of moving parts in it. It works on real novels and it still needs a great deal more testing before I would call it finished.
02Why a Mac app, and why in this order
Most people building this would write a web app and stop. One codebase, every platform, updates land instantly, no app store to satisfy. That is the sensible default and I understand why people take it.
I am doing four things in sequence instead.
The wiki engine came first, and it is the part described above. The Mac app is what I am building now, and so far it is the interface only. After that the two get joined: the engine goes behind the app’s screens, and it stops being an interface and starts being an app. Then I go back to the web, and rebuild that interface to match this one, so that someone who is not on a Mac can still reach their work in a browser.
Nothing is joined up yet. There is a fourth piece, TexFaber Social — a network for writers, where a beta reader sees the chapters they have reached and nothing past them. It is the most complete thing I have built so far and close to finished in itself, but it still needs a good deal of testing, and the parts that would connect it to the Mac app and the web app do not exist yet. That comes later too.
Building native first looks eccentric until you notice that the tool I compared myself to last time did exactly the same. Scrivener began as a Mac app, written by a novelist who taught himself to code because nothing on the market did what he needed.
03What it looks like
The Mac app is 82,329 lines across seventy-six files: 81,986 of Objective-C, and one Swift file for App Intents. Seven sections: Desk, Library, Write, Plot, Wiki, Analysis and Social.
Two things about that number. Thirty thousand of those lines are not written but emitted — coordinate tables for the award emblems, produced by a tracer in the same repository and pasted into a single file. Hand-written, the app is a little over fifty-one thousand lines. And Objective-C is only the interface. The engine in section one is Python: 159,045 lines across 506 files. The web app is another 38,471, in JavaScript and JSX. The Objective-C is the smallest of the three, and it is the part a user actually looks at.
All seven obey one rule. The left column navigates, the centre is where you work, and the right inspects whatever is in the centre. The right side is never a second menu. I learned that by getting it wrong and ending up with forty-three panels that did nothing.
04A page is a page
This is the newest part, and the part I have enjoyed most.
The manuscript is set on actual pages rather than in a scrolling box. It has a trim size, the same one a paperback has. It has one ink, because that is what a press has. It has a running head and folio numbers, and it prints.
A chapter can open five ways: Plain, Classic, Illuminated, Plate, or Modern. Illuminated gives you the sunk initial at the top of this page, with the text wrapping around it. Plate puts a full-page illustration in as page one and starts the prose on page two.
None of this is decoration. If the app is going to take a book from the first sentence to something you can hold, it has to understand what a page is, and it may as well understand that from the beginning rather than have it bolted on at the end.
05What it actually took
I should say up front that I cannot give an exact figure, and neither can anyone else who has built something this way.
I have used ten or more AI tools on this, from at least eight companies: Claude, ChatGPT and Codex, Gemini and Antigravity, Grok, GLM, Kimi, MiniMax, Mistral, Hermes, Cursor, and a scattering of others through OpenRouter. Only two of them keep logs I can count. The earliest work was done in a web chat window with scripts copied into folders by hand, and that leaves no trace at all.
So the honest answer is a floor and a ceiling. From the two tools that can be counted, between 29 June and 15 September:
At least 543 hours. Across 70 of 79 calendar days, with a longest unbroken run of twenty-two. The heaviest day was just over eighteen hours, and there were five days above sixteen. Adding the tools I cannot count, the real figure is probably somewhere between seven and nine hundred hours.
I did not plan that shape, and I would not read the early part of it as short days. Those weeks look thin because the chart can only count hours spent writing code in these folders. The rest of the day went on the work that does not leave a file behind: research, testing other people’s software, evaluating models against each other, writing. A solo developer does not get to only build. There is no use making a good writing app that nobody ever hears of.
The token figures are stranger. Those same two tools read 43 billion tokens and wrote back about 126 million. That is roughly three hundred and forty read for every one written.
The ratio is the interesting part, not the total. On the Mac app, of twenty-three billion tokens read, only 651,707 were ever new. Everything else is the same conversation being read again, from the top, every single turn. That is what this kind of building actually is, and nobody puts this in a YouTube video.
The output figure is the one I find easiest to picture. A hundred and twenty-six million tokens is about ninety-four million words. Somewhere around a thousand novels’ worth of text, to produce one app that is not finished.
Two other things worth recording.
There is no Xcode project, and for the first sixty-five days there was no Xcode at all. The app is built by a shell script that calls the compiler directly. I installed Xcode on 10 September, after most of this was already made, and only because I had reached bugs I could not fix without it. It is still not the toolchain the rest of my system uses.
Every agent signs a register. One file per day. My prompts are kept word for word, and each agent writes down what it touched before it finishes. There is a companion document listing the mistakes I have made as the person directing all this, and entries in it require evidence. That has saved me more time than any individual model has.
06What is not done
The Mac app is an interface. The engine is not behind it yet, so the screens in this post are not yet wired to the thing described in section one.
The wiki engine is not finished and is not live.
The three pieces are not connected to each other.
Four of the nineteen award emblems are still undrawn.
And there is a bug in the screenshot above. In the Write picture, the chapter selected in the binder is chapter one, and the heading on the page still says chapter four, left over from the last one I looked at. The title, the text and the word count all update correctly; the page furniture does not. I found it while taking these pictures and I have left it in, because a post about building software that only shows the parts that work is not worth reading.
07What is next
Finish the interface. Put the engine behind it. Then the browser version, so that nobody has to own a particular computer to get at their own book.
There is a fourth thing after that, which is getting this into the Mac App Store, and it turns out the unusual choices here cost nothing on that front. What is missing is ordinary: sandboxing, and the signing that distribution needs. That is probably its own post.
Three months, screen by screen
Scroll the strip sideways, or pick a number. The first fifty-eight are August, captured automatically as the interface was argued with. Several of them are the app launching empty, which is also what building looks like.
Thanks for reading.
J.H.
Written by Opus 5 on behalf of Jamie Heerlyn.