TexFaber

Journal

The Wiki Builds Itself Now

J.H.

A chapter opening in TexFaber, with a small-caps chapter line, the title, and a large sunk initial that the text wraps around.

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.

Diagram of four stages: the wiki engine, the Mac app, joining them together, and the browser version, with TexFaber Social running alongside.
Four climbs, in order. None of them joined up yet.

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.

The Library in TexFaber, showing four book covers on a shelf with a navigation rail on the left.
The Library. Books on a shelf, not rows in a list.
The Write screen, showing a binder of acts and chapters on the left and a typeset manuscript page in the centre.
Write. The binder on the left, the page in the middle.
The Plot screen, showing four plotlines each broken into numbered beats.
Plot. Each line broken into its beats.

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.

The same chapter shown five times, opening as Plain, Classic, Illuminated, Plate and Modern.
The same chapter, opened five ways. Plate is the empty one — that page is where the illustration goes.

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.

Bar chart of hours worked per day from late June to mid September, rising from two to four hours a day in July to eight to eighteen hours a day in September.
70 of 79 days. The longest break was three days.

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.

A diagram of a four-step loop: prompt, wait, test, repeat, with the figure 343 to 1 at the centre.
Prompt, wait, test, repeat. For sixteen hours at a time.

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.

The Library and the editor, first passes. August 2026.
AugustThe Library and the editor, first passes.
The Library and the editor, first passes. August 2026.
AugustThe Library and the editor, first passes.
The Library and the editor, first passes. August 2026.
AugustThe Library and the editor, first passes.
The Library and the editor, first passes. August 2026.
AugustThe Library and the editor, first passes.
The Library and the editor, first passes. August 2026.
AugustThe Library and the editor, first passes.
The Library and the editor, first passes. August 2026.
AugustThe Library and the editor, first passes.
The Library and the editor, first passes. August 2026.
AugustThe Library and the editor, first passes.
Plot — and a long argument with glass that ended in abandoning it. August 2026.
AugustPlot — and a long argument with glass that ended in abandoning it.
Plot — and a long argument with glass that ended in abandoning it. August 2026.
AugustPlot — and a long argument with glass that ended in abandoning it.
Plot — and a long argument with glass that ended in abandoning it. August 2026.
AugustPlot — and a long argument with glass that ended in abandoning it.
Plot — and a long argument with glass that ended in abandoning it. August 2026.
AugustPlot — and a long argument with glass that ended in abandoning it.
Plot — and a long argument with glass that ended in abandoning it. August 2026.
AugustPlot — and a long argument with glass that ended in abandoning it.
Plot — and a long argument with glass that ended in abandoning it. August 2026.
AugustPlot — and a long argument with glass that ended in abandoning it.
Plot — and a long argument with glass that ended in abandoning it. August 2026.
AugustPlot — and a long argument with glass that ended in abandoning it.
Plot — and a long argument with glass that ended in abandoning it. August 2026.
AugustPlot — and a long argument with glass that ended in abandoning it.
Plot — and a long argument with glass that ended in abandoning it. August 2026.
AugustPlot — and a long argument with glass that ended in abandoning it.
Plot — and a long argument with glass that ended in abandoning it. August 2026.
AugustPlot — and a long argument with glass that ended in abandoning it.
Plot — and a long argument with glass that ended in abandoning it. August 2026.
AugustPlot — and a long argument with glass that ended in abandoning it.
Plot — and a long argument with glass that ended in abandoning it. August 2026.
AugustPlot — and a long argument with glass that ended in abandoning it.
Plot — and a long argument with glass that ended in abandoning it. August 2026.
AugustPlot — and a long argument with glass that ended in abandoning it.
Plot — and a long argument with glass that ended in abandoning it. August 2026.
AugustPlot — and a long argument with glass that ended in abandoning it.
Plot — and a long argument with glass that ended in abandoning it. August 2026.
AugustPlot — and a long argument with glass that ended in abandoning it.
Plot — and a long argument with glass that ended in abandoning it. August 2026.
AugustPlot — and a long argument with glass that ended in abandoning it.
Plot — and a long argument with glass that ended in abandoning it. August 2026.
AugustPlot — and a long argument with glass that ended in abandoning it.
Plot — and a long argument with glass that ended in abandoning it. August 2026.
AugustPlot — and a long argument with glass that ended in abandoning it.
Plot — and a long argument with glass that ended in abandoning it. August 2026.
AugustPlot — and a long argument with glass that ended in abandoning it.
Plot — and a long argument with glass that ended in abandoning it. August 2026.
AugustPlot — and a long argument with glass that ended in abandoning it.
Plot — and a long argument with glass that ended in abandoning it. August 2026.
AugustPlot — and a long argument with glass that ended in abandoning it.
Sidebars, corners and full-width layouts. August 2026.
AugustSidebars, corners and full-width layouts.
Sidebars, corners and full-width layouts. August 2026.
AugustSidebars, corners and full-width layouts.
Sidebars, corners and full-width layouts. August 2026.
AugustSidebars, corners and full-width layouts.
Sidebars, corners and full-width layouts. August 2026.
AugustSidebars, corners and full-width layouts.
Sidebars, corners and full-width layouts. August 2026.
AugustSidebars, corners and full-width layouts.
Sidebars, corners and full-width layouts. August 2026.
AugustSidebars, corners and full-width layouts.
Sidebars, corners and full-width layouts. August 2026.
AugustSidebars, corners and full-width layouts.
Sidebars, corners and full-width layouts. August 2026.
AugustSidebars, corners and full-width layouts.
Sidebars, corners and full-width layouts. August 2026.
AugustSidebars, corners and full-width layouts.
Sidebars, corners and full-width layouts. August 2026.
AugustSidebars, corners and full-width layouts.
Sidebars, corners and full-width layouts. August 2026.
AugustSidebars, corners and full-width layouts.
Sidebars, corners and full-width layouts. August 2026.
AugustSidebars, corners and full-width layouts.
The wiki, when it was called Chronicle. Several of these are the app launching empty. August 2026.
AugustThe wiki, when it was called Chronicle. Several of these are the app launching empty.
The wiki, when it was called Chronicle. Several of these are the app launching empty. August 2026.
AugustThe wiki, when it was called Chronicle. Several of these are the app launching empty.
The wiki, when it was called Chronicle. Several of these are the app launching empty. August 2026.
AugustThe wiki, when it was called Chronicle. Several of these are the app launching empty.
The wiki, when it was called Chronicle. Several of these are the app launching empty. August 2026.
AugustThe wiki, when it was called Chronicle. Several of these are the app launching empty.
The wiki, when it was called Chronicle. Several of these are the app launching empty. August 2026.
AugustThe wiki, when it was called Chronicle. Several of these are the app launching empty.
The wiki, when it was called Chronicle. Several of these are the app launching empty. August 2026.
AugustThe wiki, when it was called Chronicle. Several of these are the app launching empty.
The wiki, when it was called Chronicle. Several of these are the app launching empty. August 2026.
AugustThe wiki, when it was called Chronicle. Several of these are the app launching empty.
The wiki, when it was called Chronicle. Several of these are the app launching empty. August 2026.
AugustThe wiki, when it was called Chronicle. Several of these are the app launching empty.
The wiki, when it was called Chronicle. Several of these are the app launching empty. August 2026.
AugustThe wiki, when it was called Chronicle. Several of these are the app launching empty.
A first look at analytics. August 2026.
AugustA first look at analytics.
A first look at analytics. August 2026.
AugustA first look at analytics.
The timeline, rebuilt four times. August 2026.
AugustThe timeline, rebuilt four times.
The timeline, rebuilt four times. August 2026.
AugustThe timeline, rebuilt four times.
The timeline, rebuilt four times. August 2026.
AugustThe timeline, rebuilt four times.
The timeline, rebuilt four times. August 2026.
AugustThe timeline, rebuilt four times.
The timeline, rebuilt four times. August 2026.
AugustThe timeline, rebuilt four times.
The timeline, rebuilt four times. August 2026.
AugustThe timeline, rebuilt four times.
The Library accordion, at the end of that run. August 2026.
AugustThe Library accordion, at the end of that run.
A rebuild. Quieter, and the panels start to settle. 4 September 2026.
4 SeptemberA rebuild. Quieter, and the panels start to settle.
Write, before the page existed. 4 September 2026.
4 SeptemberWrite, before the page existed.
Plot, with the beats written out. 4 September 2026.
4 SeptemberPlot, with the beats written out.
The chronology board. 4 September 2026.
4 SeptemberThe chronology board.
Desk. The day’s work, in nine cards. 15 September 2026.
15 SeptemberDesk. The day’s work, in nine cards.
Library. Books on a shelf. 15 September 2026.
15 SeptemberLibrary. Books on a shelf.
Write. Binder on the left, the page in the middle. 15 September 2026.
15 SeptemberWrite. Binder on the left, the page in the middle.
Write. The tools that act on the text. 15 September 2026.
15 SeptemberWrite. The tools that act on the text.
Focus Mode. The window itself is the frame. 15 September 2026.
15 SeptemberFocus Mode. The window itself is the frame.
Plot. Each line broken into its beats. 15 September 2026.
15 SeptemberPlot. Each line broken into its beats.
Plot. The timeline again, three months on. 15 September 2026.
15 SeptemberPlot. The timeline again, three months on.
Wiki. The people in the book. 15 September 2026.
15 SeptemberWiki. The people in the book.
Wiki. What happened, and when. 15 September 2026.
15 SeptemberWiki. What happened, and when.
Wiki. Questions the book has not answered yet. 15 September 2026.
15 SeptemberWiki. Questions the book has not answered yet.
Analysis. The manuscript, read back. 15 September 2026.
15 SeptemberAnalysis. The manuscript, read back.
Analysis. The manuscript, measured. 15 September 2026.
15 SeptemberAnalysis. The manuscript, measured.
Social. The workshop feed. 15 September 2026.
15 SeptemberSocial. The workshop feed.
Social. Other writers. 15 September 2026.
15 SeptemberSocial. Other writers.
Desk. The awards, and their seals. 15 September 2026.
15 SeptemberDesk. The awards, and their seals.

Thanks for reading.

J.H.

Written by Opus 5 on behalf of Jamie Heerlyn.

Next: A Conversation with DeepSeek, Part One →