Files
wanderbooks/site/index.html
T

293 lines
25 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>wanderbooks — turn Claude or Codex into a full bookkeeping system, free</title>
<meta name="description" content="wanderbooks is a free, open-source accounting engine for Claude Code and Codex. Connect it and the AI you already use becomes a complete bookkeeping system: receipts, statements, taxes, your CPA's package, in a folder you own. A free alternative to QuickBooks Online.">
<link rel="canonical" href="https://wanderbooks.ai/">
<meta property="og:title" content="wanderbooks — turn Claude or Codex into a full bookkeeping system, free">
<meta property="og:description" content="Free and open source. Connect it to Claude Code or Codex and get a complete bookkeeping system in a folder you own. No subscription, no account.">
<meta property="og:url" content="https://wanderbooks.ai/">
<meta property="og:image" content="https://wanderbooks.ai/assets/overview.png">
<meta name="twitter:card" content="summary_large_image">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
<style>
:root {
--bg: #f6f6f4; --surface: #fff; --border: #e4e4e0; --text: #1b1b1f;
--muted: #67676f; --faint: #9c9ca4; --accent: #4f46e5; --accent-soft: #eeeefd;
--code-bg: #1b1b1f; --code-text: #ececee; --positive: #15803d; --negative: #b91c1c;
}
@media (prefers-color-scheme: dark) {
:root:not([data-theme="light"]) {
--bg: #111214; --surface: #191a1d; --border: #2a2b30; --text: #ececee;
--muted: #a3a3ac; --faint: #6e6e78; --accent: #8b93fa; --accent-soft: #242545;
--code-bg: #0b0b0d; --code-text: #ececee; --positive: #4ade80; --negative: #f87171;
}
}
* { box-sizing: border-box; }
html { -webkit-text-size-adjust: 100%; scroll-behavior: smooth; }
body {
margin: 0; background: var(--bg); color: var(--text);
font: 400 17px/1.6 Inter, system-ui, -apple-system, "Segoe UI", sans-serif;
font-feature-settings: "tnum", "cv11";
}
a { color: var(--accent); text-decoration: none; }
a:hover { text-decoration: underline; }
.wrap { max-width: 1120px; margin: 0 auto; padding: 0 24px; }
header { display: flex; align-items: center; justify-content: space-between; padding: 22px 0; }
.brand { display: flex; align-items: center; gap: 10px; font-weight: 600; font-size: 17px; color: var(--text); }
.brand:hover { text-decoration: none; }
.brand .mark { width: 28px; height: 28px; border-radius: 8px; background: var(--accent); color: #fff; display: grid; place-items: center; font-weight: 700; }
nav a { color: var(--muted); margin-left: 22px; font-size: 15px; }
.hero { padding: 48px 0 32px; max-width: 840px; }
.eyebrow { color: var(--accent); font-weight: 600; font-size: 14px; letter-spacing: .05em; text-transform: uppercase; margin-bottom: 14px; }
h1 { font-size: clamp(38px, 6vw, 62px); line-height: 1.04; letter-spacing: -0.03em; margin: 0 0 20px; font-weight: 700; }
.lede { font-size: clamp(18px, 2.2vw, 21px); color: var(--muted); margin: 0 0 30px; max-width: 720px; }
.lede b { color: var(--text); font-weight: 600; }
.install { background: var(--code-bg); color: var(--code-text); border-radius: 12px; padding: 16px 18px; display: flex; gap: 14px; align-items: flex-start; font: 500 14.5px/1.55 ui-monospace, "SF Mono", Menlo, Consolas, monospace; }
.install code { flex: 1; min-width: 0; white-space: normal; overflow-wrap: anywhere; }
.install .prompt { color: #8b93fa; user-select: none; }
.copy { flex: none; background: #2a2b30; color: #ececee; border: 0; border-radius: 8px; padding: 7px 12px; font: 500 13px Inter, sans-serif; cursor: pointer; }
.copy:hover { background: #3a3b42; }
.note { color: var(--faint); font-size: 14px; margin-top: 12px; }
.equation { display: grid; grid-template-columns: 1fr auto 1fr auto 1.3fr; gap: 12px; align-items: stretch; margin: 0 0 26px; }
.equation .term { background: var(--surface); border: 1px solid var(--border); border-radius: 12px; padding: 14px 16px; }
.equation .term.result { border-color: var(--accent); background: var(--accent-soft); }
.equation .t { font-weight: 600; font-size: 16px; line-height: 1.3; }
.equation .d { color: var(--muted); font-size: 13.5px; margin-top: 4px; line-height: 1.4; }
.equation .op { align-self: center; color: var(--faint); font-size: 26px; font-weight: 300; }
@media (max-width: 760px) { .equation { grid-template-columns: 1fr; } .equation .op { justify-self: center; line-height: 1; } }
.shot { margin: 40px 0 8px; border-radius: 14px; border: 1px solid var(--border); overflow: hidden; box-shadow: 0 24px 60px -24px rgba(0,0,0,.25); background: var(--surface); }
.shot img { display: block; width: 100%; height: auto; }
.shot.dark { display: none; }
@media (prefers-color-scheme: dark) { .shot.light { display: none; } .shot.dark { display: block; } }
.caption { color: var(--faint); font-size: 14px; text-align: center; margin: 10px 0 0; }
section { padding: 72px 0 8px; }
h2 { font-size: clamp(27px, 3.6vw, 38px); letter-spacing: -0.02em; line-height: 1.12; margin: 0 0 14px; }
.sub { color: var(--muted); max-width: 740px; margin: 0 0 32px; font-size: 18px; }
.grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 18px; }
.grid.two-col { grid-template-columns: repeat(2, 1fr); }
.card { background: var(--surface); border: 1px solid var(--border); border-radius: 14px; padding: 22px; }
.card h3 { margin: 0 0 8px; font-size: 18px; }
.card p { margin: 0; color: var(--muted); font-size: 15.5px; }
.card .k { color: var(--accent); font-weight: 600; font-size: 13px; letter-spacing: .04em; text-transform: uppercase; margin-bottom: 8px; }
.ask { display: flex; flex-direction: column; gap: 10px; }
.ask .say { font-size: 16.5px; font-weight: 500; color: var(--text); line-height: 1.45; }
.ask .say::before { content: "“"; color: var(--accent); font-weight: 700; margin-right: 1px; }
.ask .say::after { content: "”"; color: var(--accent); font-weight: 700; }
.ask p { font-size: 14.5px; }
.two { display: grid; grid-template-columns: 1fr 1fr; gap: 32px; align-items: center; }
.two .shot { margin: 0; }
ul.ticks, ul.crosses { list-style: none; padding: 0; margin: 0; }
ul.ticks li, ul.crosses li { padding: 7px 0 7px 28px; position: relative; color: var(--muted); }
ul.ticks li b, ul.crosses li b { color: var(--text); font-weight: 600; }
ul.ticks li::before { content: "✓"; position: absolute; left: 0; color: var(--positive); font-weight: 700; }
ul.crosses li::before { content: "–"; position: absolute; left: 4px; color: var(--faint); font-weight: 700; }
table.vs { width: 100%; border-collapse: separate; border-spacing: 0; background: var(--surface); border: 1px solid var(--border); border-radius: 14px; overflow: hidden; font-size: 15.5px; }
table.vs th, table.vs td { text-align: left; padding: 14px 18px; vertical-align: top; border-bottom: 1px solid var(--border); }
table.vs tr:last-child td { border-bottom: 0; }
table.vs th { font-size: 13px; letter-spacing: .04em; text-transform: uppercase; color: var(--muted); font-weight: 600; background: var(--bg); }
table.vs td:first-child { color: var(--muted); width: 22%; font-weight: 500; }
table.vs td:nth-child(2) { color: var(--text); width: 42%; }
table.vs td:nth-child(3) { color: var(--muted); }
.callout { border-left: 3px solid var(--accent); padding: 4px 0 4px 18px; margin: 28px 0 0; color: var(--muted); font-size: 17px; max-width: 760px; }
.callout b { color: var(--text); }
details { background: var(--surface); border: 1px solid var(--border); border-radius: 12px; padding: 16px 20px; margin-bottom: 12px; }
details summary { cursor: pointer; font-weight: 600; font-size: 16.5px; list-style: none; }
details summary::-webkit-details-marker { display: none; }
details summary::after { content: "+"; float: right; color: var(--faint); font-weight: 400; }
details[open] summary::after { content: "–"; }
details p { color: var(--muted); margin: 12px 0 0; font-size: 15.5px; }
code.inline { font: 500 14px ui-monospace, Menlo, Consolas, monospace; background: var(--accent-soft); padding: 2px 6px; border-radius: 6px; color: var(--text); }
footer { padding: 72px 0 48px; color: var(--faint); font-size: 14px; display: flex; justify-content: space-between; gap: 20px; flex-wrap: wrap; }
@media (max-width: 860px) {
.grid, .grid.two-col, .two { grid-template-columns: 1fr; }
nav { display: none; }
table.vs td:first-child { width: auto; }
table.vs th, table.vs td { padding: 12px; }
}
</style>
</head>
<body>
<div class="wrap">
<header>
<a class="brand" href="#"><span class="mark">w</span>wanderbooks</a>
<nav>
<a href="#ask">What you can ask</a>
<a href="#quickbooks">vs. QuickBooks</a>
<a href="#cpa">Your CPA</a>
<a href="#install">Install</a>
<a href="https://git.swaits.com/swaits/wanderbooks">Source</a>
</nav>
</header>
<div class="hero">
<div class="eyebrow">Free and open source</div>
<h1>Turn Claude or Codex into a full bookkeeping system.</h1>
<p class="lede">wanderbooks is a <b>free</b> accounting engine your AI connects to. Plug it into <b>Claude Code or Codex</b>, the AI you already use, and you have complete double-entry books: it finds your receipts, records and categorizes everything, fixes mistakes the way an accountant would, and hands your CPA a clean package. <b>No subscription. No account. Nothing to buy.</b> Your books live in a folder you own.</p>
<div class="equation">
<div class="term"><div class="t">Claude Code or Codex</div><div class="d">the AI you already use</div></div>
<div class="op">+</div>
<div class="term"><div class="t">wanderbooks</div><div class="d">free, open source, an MCP server</div></div>
<div class="op">=</div>
<div class="term result"><div class="t">A complete bookkeeping system</div><div class="d">books, receipts, statements, taxes, your CPA's package</div></div>
</div>
<div class="install">
<span class="prompt">$</span>
<code id="cmd">curl -fsSL https://wanderbooks.ai/install.sh | sh -s -- ~/Books/YourCompany</code>
<button class="copy" id="copy">Copy</button>
</div>
<p class="note">One line installs everything, makes your books, and starts your bookkeeper in Claude Code. Using Codex? Add <code class="inline">--codex</code> to the end. Linux and macOS; Windows via WSL2.</p>
</div>
<div class="shot light"><img src="assets/overview.png" alt="The wanderbooks overview: cash, what you owe, spending, revenue, runway, a cash chart, and what needs attention" width="1440" height="920"></div>
<div class="shot dark"><img src="assets/overview-dark.png" alt="The wanderbooks overview in dark mode" width="1440" height="920"></div>
<p class="caption">The viewer, on a demo company. You work by talking to Claude or Codex; the viewer is for looking.</p>
<section id="ask">
<h2>Just ask.</h2>
<p class="sub">Your bookkeeper is the AI you already use, working through an accounting engine that won't let it be wrong. Talk to it the way you'd talk to a good bookkeeper. It does the work, shows you the result, and waits for your OK before anything is posted.</p>
<div class="grid">
<div class="card ask"><div class="say">Find the receipt for the $106.38 Apple charge in my email and record it.</div><p>Searches your inbox, files the receipt as a PDF, drafts the entry with the right accounts, and shows you the preview.</p></div>
<div class="card ask"><div class="say">Here's last month's bank export. Categorize everything.</div><p>Imports the transactions as drafts, proposes an account for each from how you've booked them before, and asks about the ones it isn't sure of.</p></div>
<div class="card ask"><div class="say">The domain renewal went to the wrong account. Fix it.</div><p>Reverses the entry and records it correctly. Nothing is ever erased; the history shows exactly what changed and why.</p></div>
<div class="card ask"><div class="say">Why did software spending jump in March?</div><p>Traces the number to the entries and receipts behind it, and tells you what's new.</p></div>
<div class="card ask"><div class="say">Can we afford to hire someone at $6,000 a month?</div><p>Works it out from your actual cash, burn, and what's coming in, and shows its math.</p></div>
<div class="card ask"><div class="say">We paid the designer $2,400 this year. Does she need a 1099?</div><p>Checks the threshold for the year, whether payments were by card, and whether her W-9 is on file.</p></div>
<div class="card ask"><div class="say">Close September.</div><p>Checks for missing receipts and unposted drafts, reconciles to your bank statement, posts depreciation and amortization, and closes the period.</p></div>
<div class="card ask"><div class="say">Get Krista everything she needs for our tax return.</div><p>Builds the CPA package: every statement, the ledgers, the tax summary, the 1099 worksheet, and every receipt, indexed.</p></div>
<div class="card ask"><div class="say">Move us off QuickBooks.</div><p>Rebuilds your history from QuickBooks' exports and checks every statement against QuickBooks, to the cent, before you cancel.</p></div>
</div>
</section>
<section id="quickbooks">
<h2>Why not QuickBooks Online?</h2>
<p class="sub">QuickBooks rents you access to your own financial history, raises the rent every year, and makes leaving painful. You still do the bookkeeping yourself, in forms. wanderbooks turns that around.</p>
<table class="vs">
<tr><th></th><th>wanderbooks</th><th>QuickBooks Online</th></tr>
<tr><td>Where your books live</td><td>A folder on your computer, under git. Plain, documented files.</td><td>Intuit's servers. You get access while you pay.</td></tr>
<tr><td>What it costs</td><td>Nothing. Free and open source, forever. It runs on the Claude or ChatGPT plan you already have.</td><td>A monthly subscription per company, and the price keeps rising.</td></tr>
<tr><td>Who does the bookkeeping</td><td>An AI bookkeeper: receipts, entries, categories, fixes, closes.</td><td>You do, in screens and forms. Or you pay someone.</td></tr>
<tr><td>Receipts</td><td>Required over a threshold you set, enforced on every entry, shown right beside it.</td><td>Optional attachments.</td></tr>
<tr><td>Audit trail</td><td>Every change is a hash-chained event; nothing is ever edited or erased.</td><td>An audit log inside their app.</td></tr>
<tr><td>Leaving</td><td>Your files are the books. Standard exports any time, including QuickBooks formats.</td><td>Export what you can, and hope.</td></tr>
</table>
<p class="callout"><b>Can it really replace QuickBooks?</b> For most small businesses, yes. Here's exactly what you get, and what you don't (yet).</p>
<div class="grid two-col" style="margin-top:22px">
<div class="card">
<h3>What it does</h3>
<ul class="ticks">
<li><b>Real double-entry books</b>: chart of accounts, journal, general ledger, trial balance.</li>
<li><b>Statements</b>: P&amp;L, balance sheet, cash flow, owners' equity; by month, quarter, or year; with comparisons.</li>
<li><b>Invoices and bills</b>, with receivables and payables aging.</li>
<li><b>Tax-ready</b>: tax categories for Schedule C, 1065, 1120-S, and 1120; a 1099 worksheet.</li>
<li><b>The rest of a real business</b>: fixed assets and depreciation, prepaid expenses and deferred revenue, recurring entries, platform payouts, classes, foreign-currency lines, period close, bank reconciliation.</li>
</ul>
</div>
<div class="card">
<h3>What it doesn't (yet)</h3>
<ul class="crosses">
<li><b>Automatic bank feeds.</b> Hand it your bank's CSV export or statements; it does the rest.</li>
<li><b>Payroll processing.</b> It records payroll you run elsewhere (Gusto, ADP), taxes and all.</li>
<li><b>Sending invoices and taking payments.</b> It tracks them; your payment processor collects.</li>
<li><b>Logins for your team.</b> Others get a read-only copy (below) or their own session with the bookkeeper.</li>
<li><b>Point-and-click setup.</b> Today you run one command in a terminal. After that it's plain English.</li>
</ul>
</div>
</div>
</section>
<section id="cpa">
<div class="two">
<div>
<h2>“But my CPA works in QuickBooks.”</h2>
<p class="sub">Your CPA doesn't need QuickBooks. They need your numbers, the evidence behind them, and files their software can read. wanderbooks gives them more than a QuickBooks login ever did.</p>
<ul class="ticks">
<li><b>One package, ready to send</b>: P&amp;L, balance sheet, cash flow, equity, and trial balance as PDF and Excel; the general ledger and journal; the tax summary.</li>
<li><b>Every receipt</b> behind the year's entries, indexed by entry, date, and amount.</li>
<li><b>QuickBooks-compatible</b>: the journal as an IIF file that imports into QuickBooks Desktop, if that's where their workflow lives.</li>
<li><b>The 1099 worksheet</b>, with W-9 status.</li>
<li><b>A live, read-only view</b> if they want to look around: share the books folder privately and they open it in the viewer. Nothing they do can change your books.</li>
</ul>
</div>
<div class="shot"><img src="assets/pnl.png" alt="A profit and loss statement in wanderbooks with interval columns and drill-down" width="1440" height="920"></div>
</div>
</section>
<section>
<div class="two">
<div class="shot"><img src="assets/entry.png" alt="A transaction with its lines, its rendered receipt, and its history" width="1440" height="920"></div>
<div>
<h2>Talk to change. Look in the viewer.</h2>
<p class="sub">Everything that changes your books happens in conversation with Claude or Codex. The viewer is the other half: a live, read-only window on the books for browsing, searching, and reports. Whatever your bookkeeper posts shows up there in a fraction of a second, and every number goes all the way down: click an amount on a statement for the transactions behind it, then a transaction for its lines, the receipt itself, and its history.</p>
<ul class="ticks">
<li><b>Browse and search</b> every transaction, account, receipt, and document.</li>
<li><b>Reports</b> over any dates, by month, quarter, or year, with comparisons; copy any of them into a spreadsheet.</li>
<li><b>Answers first</b>: cash, runway, profit, and what needs attention, in a sentence.</li>
<li><b>Needs attention</b> finds missing receipts, unposted drafts, overdue invoices, 1099 vendors without a W-9, and hands you the prompt to fix each.</li>
<li><b>All the data</b>: the full journal, every receipt and document, light and dark.</li>
</ul>
</div>
</div>
</section>
<section id="trust">
<h2>Built so you can trust it.</h2>
<p class="sub">An AI is keeping your books, so the books have to be impossible to quietly get wrong.</p>
<div class="grid">
<div class="card"><h3>The engine enforces accounting</h3><p>Every entry balances exactly; money is exact decimal, never floating point. Posted entries are permanent; corrections are reversing entries. The receipt rule is enforced by the server, not left to the AI's judgment.</p></div>
<div class="card"><h3>A tamper-evident journal</h3><p>Every change is an event hash-chained to the one before. The database is checked against the journal table by table, and rebuilt if it ever drifts; every receipt is checked against its hash. The viewer shows you the result.</p></div>
<div class="card"><h3>You approve what matters</h3><p>The bookkeeper previews every posting before it happens and waits for you. The viewer can't change anything at all.</p></div>
</div>
</section>
<section id="install">
<h2>Install</h2>
<p class="sub">The one line at the top does everything: installs Rust if you don't have it, builds wanderbooks, makes your books folder with the bookkeeper wired in, and starts a session to set up your company.</p>
<div class="grid">
<div class="card"><h3>Linux</h3><p>Needs a C compiler and git (<code class="inline">build-essential</code> on Debian and Ubuntu). The installer tells you if anything's missing.</p></div>
<div class="card"><h3>macOS</h3><p>Needs Apple's command line tools: <code class="inline">xcode-select --install</code>.</p></div>
<div class="card"><h3>Windows</h3><p>Run it inside WSL2 (<code class="inline">wsl --install</code>, then Ubuntu). On Windows 11 the viewer opens as a normal window. Native Windows is on the way.</p></div>
</div>
<p class="note" style="margin-top:24px">Already installed? <code class="inline">wanderbooks new ~/Books/AnotherCompany</code>. In a books folder, <code class="inline">just agent</code> (or <code class="inline">just codex</code>) starts your bookkeeper and <code class="inline">just gui</code> opens the viewer.</p>
</section>
<section id="faq">
<h2>Questions</h2>
<details><summary>What does it cost?</summary><p>Nothing. wanderbooks is free and open source (MIT or Apache-2.0), with no account and no subscription. The bookkeeper is the AI you already use: Claude Code (included with Claude Pro and Max, or on API credits) or Codex (included with ChatGPT plans, or on API credits). There's nothing else to buy.</p></details>
<details><summary>Wait, what's an MCP server?</summary><p>MCP is the standard way AI tools like Claude Code and Codex plug into other software. wanderbooks is an accounting engine that speaks it: your AI calls its tools to draft entries, attach receipts, and run reports, and the engine enforces the accounting rules. The one-line installer sets it up; you never have to touch it.</p></details>
<details><summary>Do I need to be technical?</summary><p>You need to paste one command into a terminal, once. After that you talk to your bookkeeper in plain English, in Claude Code or Codex, and look at your books in the viewer whenever you like.</p></details>
<details><summary>How does it find my receipts?</summary><p>Give your AI access to your email (in Claude, an email connector like Gmail's or the Claude browser extension with your mail open) and ask. It searches for the vendor and amount, files one clean PDF per receipt, and attaches it to the entry. It asks before downloading anything, and it never types passwords or account numbers.</p></details>
<details><summary>Where's my data, and what does the AI see?</summary><p>Your books are files on your computer: a journal, your receipts, and a settings file, in a git repository you control. Nothing is uploaded to wanderbooks; there is no wanderbooks server. What your bookkeeper reads to help you goes to your AI provider (Anthropic or OpenAI), like any other conversation with it.</p></details>
<details><summary>What if the AI gets something wrong?</summary><p>Every posting is previewed before it happens. If something slips through, it's corrected the way accountants do it, with a reversing entry, so the mistake and the fix are both on the record. The engine itself refuses anything that doesn't balance, anything without a required receipt, and anything in a closed period.</p></details>
<details><summary>Is this real accounting, or a spreadsheet with an AI on top?</summary><p>Real double-entry accounting, with the rules enforced in code: exact decimal money, balanced entries, immutable posting, closes, depreciation, accrual or cash basis. Its statements are tested against hand-computed numbers, golden files, and property tests.</p></details>
<details><summary>Can I bring my history from QuickBooks or a spreadsheet?</summary><p>Yes. Export your chart of accounts, journal, and reports, and ask your bookkeeper to move you over. It rebuilds the history and compares every statement against the old system, to the cent, before calling it done. Keep the old system read-only until you've closed a month in wanderbooks.</p></details>
</section>
<footer>
<span>wanderbooks is open source (MIT or Apache-2.0). It keeps books; it isn't tax or legal advice.</span>
<span><a href="https://git.swaits.com/swaits/wanderbooks">Source</a></span>
</footer>
</div>
<script>
// On a preview deploy, point the one-liner at the preview's own install.sh.
(function () {
var cmd = document.getElementById("cmd");
if (location.protocol === "https:" && location.hostname !== "wanderbooks.ai") {
cmd.textContent = "curl -fsSL " + location.origin + "/install.sh | sh -s -- ~/Books/YourCompany";
}
document.getElementById("copy").addEventListener("click", function () {
var b = this;
navigator.clipboard.writeText(cmd.textContent).then(function () {
b.textContent = "Copied";
setTimeout(function () { b.textContent = "Copy"; }, 1500);
});
});
})();
</script>
</body>
</html>