There is a specific look people give you at a co-working space when they ask what you're building and you say "an app that replaces twenty-five apps."
I got the same look on Reddit a couple of weeks ago, except on Reddit it came with words. The top comment was "AI psychosis." I replied "could be, at least I got a GitHub repo out of it," which I still think is the correct response.
Then I went back and read every comment, including the ones that stung, and the honest read is that the people saying "I don't even get what this is about" were right. I'd posted a timeline of my life, ten screenshots, a lot of exclamation points, and at no point did I explain what the system actually is. "Random facts mushed together" was a fair summary.
So I spent the time since doing the thing I should have done first: writing down how the system works, one step at a time, in plain English, with a diagram for every step, and then rebuilding the home page around that explanation. Fourteen steps. This post is the walk. Each number is a stage the data passes through; inside a step, the moves are the things a person does. Every step ends with what's actually running today, because that's where the last post went wrong.
This post is for the annoying people. Here's the pipe, in order.
01 / Name the problem, list the tools, sort them into families
Twenty-five tools run a normal financial life: calendar, tasks, time, CRM, contracts, invoicing, payments, bill pay, payroll, expenses, travel, mileage, budget, banking, fixed assets, retirement, brokerage, trade log, debt, sales tax, entity filings, bookkeeping, tax, compliance, FP&A. Four moves: name the problem, list the tools, create the families, move each tool under its family. The families are the work, money in, money out, what you own, what you owe, and the proof. The problem is that none of these tools knows what the others did, so to see your whole picture you copy numbers out of each one into a spreadsheet, and the spreadsheet is only as current as the last time you typed into it. I'm an accountant. I have built that spreadsheet more times than I'd like to admit.
[image: step 1]
02 / Pick the providers behind the tools
A tool is a job. A provider is a company you hire to feed that job. Go tool by tool and ask one question: does this tool's data arrive from outside, someone else telling you what happened? If yes, pick the company that sends it. If no, the tool stays home: the system is that tool, and its data gets born here. Nine move, sixteen stay home. Nobody sends an API for your tasks, your invoices, or your budget, so the system doesn't import those tools, it is them. For the nine, today it's Plaid for banks, Stripe for card money, Tastytrade for trades and market data, Finnhub for company numbers, FRED for the economy, the SEC for filings, LiteAPI for flights and hotels, Viator for activities, Google Places for locations, Travel Buddy for visas, and the law itself: eCFR, US Code, Federal Register, IRS bulletins. Four AI providers (Anthropic, OpenAI, xAI, Voyage) belong to no tool and serve every step. A provider is rows in a table, not code. Swap Plaid for Teller and you add a row. The Swiss commenter from last time who can't use Plaid at all is a real gap, and the answer is a row plus a manual-entry path that's far more obvious than it is now.
[image: step 2]
03 / Import the data and store what arrived
Ask each provider for its data. The answer comes back and gets stored as one row, word for word, before anyone decides what it means. That row is an arrival, and it's stamped eleven ways: who sent it, which connection, what it is, their ID, our ID, the raw payload, a fingerprint (a hash of the payload), when we asked, when it arrived, when we read it, and how far it got. Three promises follow. Nothing is ever edited: a provider correction is a new row. Nothing is ever asked twice: if our parsing fails we re-read the stored copy. Nothing is ever claimed: the fingerprint proves we stored exactly what they sent, which is different from proving they were right. If you've done data engineering this is a raw landing zone with content hashes and you're allowed to be unimpressed; most personal finance software does the opposite and throws the original away. On the live site that's 121 feeds from 20 providers, counted August 24, because the last thread taught me not to put a number on a public page I hadn't counted.
Today: the word-for-word payload and fingerprint are live on the regulation pulls and the audit log. The money feeds still land already parsed. The arrivals table for money is the shape being built.
[image: step 3]
04 / Label every feed by its kind
Fold the arrivals into feeds: one provider, one resource, one feed. Plaid's two bank connections are one feed. Ask of each feed what it really is. The answer is one of six kinds:
- reference: a fact about the world (a quote, a filing, a regulation)
- registry: one of your accounts or people
- event: something that happened (a transaction, a payout, a booking)
- snapshot: how things stood at one moment (holdings)
- derived: math we ran, including everything the AIs produce, never a source
- posting: debits and credits
Write the answer down as one rule row, the feed and its kind, and the system applies it to every arrival of that feed forever after. The rule is not a guess buried in code. It's a row anyone can read and argue with. When a new provider shows up we add rows, not code and not tables. The line for derived is who did the math: if we ordered it, it's derived; a provider's own published math is reference.
[image: step 4]
05 / One table per kind
Six kinds, six tables. Send every feed's arrivals to the table its kind names, then look at what landed. The outside world only ever fills four of the six: reference, registry, event, snapshot. Derived is filled only by math we ordered. Posting stays empty. Nobody sends you debits and credits, not Plaid, not Stripe, not your broker. I classified all 121 feeds and posting took zero. That is the entire reason bookkeeping exists as a job, and I'd never seen it stated that plainly, including by me.
[image: step 5]
06 / Separate what happened to you from what you did
Take everything the system holds, the six tables plus the sixteen stay-home tools, and ask of each one: did the world hand it to you, or did you make it? World-given lands in observed: it arrived finished and you can't edit it. You-made lands in authored. The four AI feeds are authored too, because you ordered the math. The sixteen are yours, and at this point in the walk they have no table. That's the one gap left.
[image: step 6]
07 / Run the loop
Every tool runs the same four beats. Discover: look at your options. Decide: pick one, and the pick becomes a draft. Commit: pull the trigger, the world moves. Record: it's written down forever. Book a flight, place a trade, send an invoice, file with the state: same loop, different nouns. Twenty-five tools, twenty-five loops, one shape.
Today: hotel bookings commit for real. The rest run discover, decide, draft. Commit is the beat being wired, tool by tool.
[image: step 7]
08 / Store everything you do in one master table
Every record the loops write gets the same shape: a document with four fields. What it is. Its life story (draft → committed → settled). Its pieces. Who did it and when. An invoice's pieces are line items; a trade's are legs; a payroll run's are employees and wages. Different names, same shape, so one table holds all twenty-five.
Today: each tool keeps its own table. One table holding every document is the shape being built.
[image: step 8]
09 / Match what happened to what you did
Observed meets authored. Take a money event the world reported, pull out its key (amount, date, reference), find the document in the master table with the same key, and match them. The deposit finds its invoice. The fill finds its order. The card charge finds its booking. Matched means real; the world just confirmed what you did. Fourteen of the twenty-five tools move money and get matched. The other eleven move no money and need no match; they're real the moment you commit.
Today: card charges find their hotel bookings and propose the match. You approve it.
[image: step 9]
10 / Let the rules write the lines
Same trick as step 4. A rule is one written row that makes one decision; there the rules gave kinds, here they write lines. Each matched event has a rule: which account takes the debit, which takes the credit. The rule writes the lines into the posting table and you never type them. Watch it on one sale. $100, Stripe keeps $3.20, $96.80 lands in the bank. The rule writes three lines: Revenue 100.00, Fees 3.20, Cash 96.80, and the deposit matches the bank to the penny. Eleven tools never touch money and never write a line: calendar, tasks, time, CRM, contracts, mileage, budget, trade log, bookkeeping, compliance, FP&A. Your hours reach the books one way only, through payroll.
Today: the posting table holds zero lines. The rules writing them is the bookkeeping pipe being built. To reconcile with the last post: I said I'd built a double-entry ledger, and I did; it's what the books tab runs on now, with real Plaid transactions. This step describes the next version, where rules write the lines from matched events instead of me picking accounts. I have a working ledger. I don't have this one yet.
[image: step 10]
11 / Turn the lines into answers
Every answer is math on the lines. Each answer is a lens that pulls exactly the lines it reads and nothing else. What do I owe in tax: income so far times the rules, with the rules pulled from the IRS and US Code feeds. How long can I last: cash divided by what I burn each month. How is my trading doing: wins, losses, and open risk from fills, positions, and live quotes. How is my business doing: money in minus money out. Never typed, never stale. Notice what these steps are: 9 and 10 are the bookkeeping system, 11 is the tax module and the runway screen. Nothing got bolted on; the back half of the pipe is the product.
Today: the trading lens reads live. Tax, runway, and the business result wait on the posting pipe, because the lines have to exist before they can add up.
[image: step 11]
12 / Open the two windows
Take every dated thing the pipe made: the lines from step 10, the documents from step 8 that carry a date, and the real deadlines (estimated tax April 15, June 15, September 15, January 15; the S-corp return March 16; 1099s and W-2s February 2; the extended 1040 October 15). Pull out when it is: a moment is a dot, a span is a bar. It appears in both windows at once, as a row in the ledger and on its day in the calendar. Same thing, two views. The $96.80 is a ledger row and a dot on September 22.
Today: the calendar window is live at /hub. The ledger window fills as the posting pipe lands its lines.
[image: step 12]
13 / Watch one dollar run the whole machine
Take the $100 sale and run it down all eight beats: discover, decide, commit, the world answers, match, lines written, math runs, you look. Then open every door, all twenty-five, and run their records down the same eight. Fourteen lanes throw a shadow on the ledger. Eleven run the whole loop and write nothing, because no money moved. Nobody typed a debit anywhere in the story. Two more truths from the drawing: when a trade closes the gain gets its own line (sell for 5,300 what you bought for 5,000 and it writes debit Cash 5,300, credit Investments 5,000, credit Gain 300), and your hours never write a line by themselves, only a payroll run does.
Today: the travel match runs. The project lane is wired end to end: a task lands for review, and accepting it fires the build that answers it.
[image: step 13]
14 / Prove every number
Take one number off the screen, the $96.80 on "how long can I last," and walk it backward. Seven hops: the number, the line that fed it, the rule that wrote the line, the match that made it real, the invoice you committed, the Stripe arrival, and the fingerprint made from the payload the moment it landed. Each hop has a check, and the checks run at build; a failed check is a failed build. Recompute the fingerprint and it still matches. Nothing between the screen and the provider's words was edited. Nothing was asked twice. Nothing is claimed without the fingerprint. That's why you can believe the screen, and it's the reason an accountant built this at all.
Today: every regulation pull is hashed the moment it lands, citation checks re-fetch the source and re-hash it, and the audit log hash-chains every entry. The money feeds don't have fingerprints yet; see step 3.
[image: step 14]
Twenty-five tools. And now every one knows what the others did.
The boring stuff you asked about
The 1,175 branches: every AI prompt gets its own branch, I review the PR, squash-merge, and the next prompt cuts from main, so the AI never builds on its own unreviewed work. I just wasn't deleting them after merge. Cleaned up.
Which data goes to the AI: the AIs classify, explain, and score. They don't move money. I'm adding a page that shows exactly what gets sent to each provider, because "trust me" is not an answer.
Trust: I wouldn't connect my bank to an app I found on Reddit either. The source is public, it's self-hostable, and I'm user number one with my own real accounts, which is the only argument I've got.
The design: still flat. I'm not a front-end person. This time I spent the hours on the explanation instead of the paint, on purpose.
Same question as last time, because it's the only one that matters: if all your apps became one, what would you need it to do?
Repo: github.com/Temple-Stuart/temple-stuart-accounting
Site: www.templestuart.com . All fourteen diagrams are on the home page, no account needed.
Not financial advice. Not tax advice. Round three, roast away.