From 6f330d49d4540d6b0c16b3446b6fc8225121f454 Mon Sep 17 00:00:00 2001 From: Patrick Mulligan Date: Thu, 30 Jul 2026 20:46:55 +0200 Subject: [PATCH] feat(ledger): add Project Lantern beancount ledger + fava launcher A plain-text Beancount ledger tracking the mock project's first seven months (seed round, monthly burn, a $5k capitalized server purchase, a member reimbursement, a contributor equity grant, first pre-orders), plus budget directives and milestone events. Passes `bean-check`. `ledger/run-fava.sh` runs Fava from a local venv, working around the system package's missing `beanquery` dependency; `.venv/` is gitignored. Co-Authored-By: Claude Opus 4.8 (1M context) --- .gitignore | 3 + ledger/lantern.beancount | 267 +++++++++++++++++++++++++++++++++++++++ ledger/run-fava.sh | 19 +++ 3 files changed, 289 insertions(+) create mode 100644 ledger/lantern.beancount create mode 100755 ledger/run-fava.sh diff --git a/.gitignore b/.gitignore index ad5f2f7..5fb81ec 100644 --- a/.gitignore +++ b/.gitignore @@ -17,4 +17,7 @@ dist-ssr *.log pnpm-debug.log* +# python venv used to run Fava (see ledger/run-fava.sh) +.venv/ + .claude/ diff --git a/ledger/lantern.beancount b/ledger/lantern.beancount new file mode 100644 index 0000000..1506332 --- /dev/null +++ b/ledger/lantern.beancount @@ -0,0 +1,267 @@ +;; ============================================================================ +;; Project Lantern — mock ledger for the accounting pitch deck +;; ---------------------------------------------------------------------------- +;; A hardware project inside the Atitlán incubator collective. This ledger +;; tracks the project's first seven months (Jan–Jul 2026) so it can be opened +;; in Fava (`fava ledger/lantern.beancount`) to show the "real" reporting that +;; sits behind the simplified visualizations in the slide deck. +;; +;; Story beats mirrored in the deck: +;; - Seed investment received and put to work as budgeted +;; - Salaries, rent, utilities, software — the monthly burn +;; - A $5,000 server purchase (capitalized as an ASSET, not an expense) +;; - A member fronts cash for fuel and is owed a reimbursement (a LIABILITY) +;; - A contributor earns equity instead of cash (a claim on future profit) +;; - First pre-order revenue starts coming in +;; ============================================================================ + +option "title" "Project Lantern — Atitlán Collective" +option "operating_currency" "USD" + +;; ---------------------------------------------------------------------------- +;; Chart of accounts +;; ---------------------------------------------------------------------------- +2026-01-01 open Assets:Bank:Checking USD +2026-01-01 open Assets:Cash:PettyCash USD +2026-01-01 open Assets:Equipment:Servers USD + +2026-01-01 open Liabilities:CreditCard USD +2026-01-01 open Liabilities:Reimbursements:Alice USD + +2026-01-01 open Equity:Investors:Seed USD +2026-01-01 open Equity:Contributors:Bob USD + +2026-01-01 open Income:PreOrders USD + +2026-01-01 open Expenses:Salaries:Pat USD +2026-01-01 open Expenses:Salaries:Rayan USD +2026-01-01 open Expenses:Salaries:Sam USD +2026-01-01 open Expenses:Contributed:Engineering USD +2026-01-01 open Expenses:Materials USD +2026-01-01 open Expenses:Operations:Rent USD +2026-01-01 open Expenses:Operations:Utilities USD +2026-01-01 open Expenses:Operations:Software USD +2026-01-01 open Expenses:Travel:Fuel USD + +;; ---------------------------------------------------------------------------- +;; Budget — the plan the seed money was raised against (Fava reads these) +;; ---------------------------------------------------------------------------- +2026-01-01 custom "budget" Expenses:Salaries:Pat "monthly" 2500.00 USD +2026-01-01 custom "budget" Expenses:Salaries:Rayan "monthly" 1500.00 USD +2026-01-01 custom "budget" Expenses:Salaries:Sam "monthly" 2000.00 USD +2026-01-01 custom "budget" Expenses:Materials "monthly" 2500.00 USD +2026-01-01 custom "budget" Expenses:Operations:Rent "monthly" 800.00 USD +2026-01-01 custom "budget" Expenses:Operations:Utilities "monthly" 200.00 USD +2026-01-01 custom "budget" Expenses:Operations:Software "monthly" 150.00 USD + +;; ---------------------------------------------------------------------------- +;; Milestones (shown on Fava's events page) +;; ---------------------------------------------------------------------------- +2026-01-15 event "milestone" "Seed round closed — $100k in the bank" +2026-03-18 event "milestone" "Server cluster online (capital asset)" +2026-06-15 event "milestone" "First customer pre-orders received" + +;; ============================================================================ +;; JANUARY 2026 — the money arrives and is put to work +;; ============================================================================ + +2026-01-15 * "Atitlán Ventures" "Seed round — initial investment received" + Assets:Bank:Checking 100000.00 USD + Equity:Investors:Seed + +2026-01-16 * "Coworking Tikal" "January workspace" + Expenses:Operations:Rent 800.00 USD + Assets:Bank:Checking + +2026-01-16 * "Utilities co-op" "Power + internet" + Expenses:Operations:Utilities 200.00 USD + Assets:Bank:Checking + +2026-01-16 * "SaaS bundle" "Design + CAD + hosting subscriptions" + Expenses:Operations:Software 150.00 USD + Assets:Bank:Checking + +2026-01-31 * "Payroll" "January salaries" + Expenses:Salaries:Pat 2500.00 USD + Expenses:Salaries:Rayan 1500.00 USD + Expenses:Salaries:Sam 2000.00 USD + Assets:Bank:Checking + +;; ============================================================================ +;; FEBRUARY 2026 — petty cash float + first prototype parts on the card +;; ============================================================================ + +2026-02-02 * "Cash machine" "Withdraw petty-cash float for on-site purchases" + Assets:Cash:PettyCash 1000.00 USD + Assets:Bank:Checking + +2026-02-03 * "Coworking Tikal" "February workspace" + Expenses:Operations:Rent 800.00 USD + Assets:Bank:Checking + +2026-02-03 * "Utilities co-op" "Power + internet" + Expenses:Operations:Utilities 200.00 USD + Assets:Bank:Checking + +2026-02-03 * "SaaS bundle" "Subscriptions" + Expenses:Operations:Software 150.00 USD + Assets:Bank:Checking + +2026-02-10 * "Parts supplier" "Prototype components (company card)" + Expenses:Materials 3000.00 USD + Liabilities:CreditCard + +2026-02-28 * "Payroll" "February salaries" + Expenses:Salaries:Pat 2500.00 USD + Expenses:Salaries:Rayan 1500.00 USD + Expenses:Salaries:Sam 2000.00 USD + Assets:Bank:Checking + +;; ============================================================================ +;; MARCH 2026 — settle the card, then the $5,000 server purchase +;; ============================================================================ + +2026-03-03 * "Coworking Tikal" "March workspace" + Expenses:Operations:Rent 800.00 USD + Assets:Bank:Checking + +2026-03-03 * "Utilities co-op" "Power + internet" + Expenses:Operations:Utilities 200.00 USD + Assets:Bank:Checking + +2026-03-03 * "SaaS bundle" "Subscriptions" + Expenses:Operations:Software 150.00 USD + Assets:Bank:Checking + +2026-03-05 * "Company card" "Pay off February card balance" + Liabilities:CreditCard 3000.00 USD + Assets:Bank:Checking + +;; The headline example from the deck: the hardware team needs $5,000 for +;; servers. It is NOT an expense — it buys a durable asset, so net worth is +;; unchanged the instant it happens: cash down $5k, equipment up $5k. +2026-03-18 * "Rack & Stack Ltd" "Server cluster for build/test farm — CAPITAL PURCHASE" + Assets:Equipment:Servers 5000.00 USD + Assets:Bank:Checking + +2026-03-31 * "Payroll" "March salaries" + Expenses:Salaries:Pat 2500.00 USD + Expenses:Salaries:Rayan 1500.00 USD + Expenses:Salaries:Sam 2000.00 USD + Assets:Bank:Checking + +;; ============================================================================ +;; APRIL 2026 — a member fronts fuel money (owed back), more prototype parts +;; ============================================================================ + +2026-04-02 * "Coworking Tikal" "April workspace" + Expenses:Operations:Rent 800.00 USD + Assets:Bank:Checking + +2026-04-02 * "Utilities co-op" "Power + internet" + Expenses:Operations:Utilities 200.00 USD + Assets:Bank:Checking + +2026-04-02 * "SaaS bundle" "Subscriptions" + Expenses:Operations:Software 150.00 USD + Assets:Bank:Checking + +;; Alice pays for fuel out of her own pocket. The org now OWES her — that debt +;; is a liability the moment it is logged, so she can see exactly where she +;; stands without waiting for anyone's memory. +2026-04-05 * "Alice" "Fuel for the org vehicle — fronted by member" + Expenses:Travel:Fuel 65.00 USD + Liabilities:Reimbursements:Alice + +2026-04-12 * "Parts supplier" "Second prototype revision" + Expenses:Materials 4500.00 USD + Assets:Bank:Checking + +;; Alice is paid back — the liability clears. +2026-04-20 * "Alice" "Reimburse fronted fuel expense" + Liabilities:Reimbursements:Alice 65.00 USD + Assets:Bank:Checking + +2026-04-30 * "Payroll" "April salaries" + Expenses:Salaries:Pat 2500.00 USD + Expenses:Salaries:Rayan 1500.00 USD + Expenses:Salaries:Sam 2000.00 USD + Assets:Bank:Checking + +;; ============================================================================ +;; MAY 2026 — a contributor takes equity instead of cash +;; ============================================================================ + +2026-05-04 * "Coworking Tikal" "May workspace" + Expenses:Operations:Rent 800.00 USD + Assets:Bank:Checking + +2026-05-04 * "Utilities co-op" "Power + internet" + Expenses:Operations:Utilities 200.00 USD + Assets:Bank:Checking + +2026-05-04 * "SaaS bundle" "Subscriptions" + Expenses:Operations:Software 150.00 USD + Assets:Bank:Checking + +;; Bob contributes engineering work but is paid in EQUITY rather than cash. +;; No money leaves the bank; instead Bob gains a claim on future profit. +2026-05-01 * "Bob" "Contributed engineering — settled as equity grant" + Expenses:Contributed:Engineering 3000.00 USD + Equity:Contributors:Bob + +2026-05-20 * "Parts supplier" "Pre-production batch" + Expenses:Materials 6000.00 USD + Assets:Bank:Checking + +2026-05-29 * "Payroll" "May salaries" + Expenses:Salaries:Pat 2500.00 USD + Expenses:Salaries:Rayan 1500.00 USD + Expenses:Salaries:Sam 2000.00 USD + Assets:Bank:Checking + +;; ============================================================================ +;; JUNE 2026 — the first revenue arrives +;; ============================================================================ + +2026-06-02 * "Coworking Tikal" "June workspace" + Expenses:Operations:Rent 800.00 USD + Assets:Bank:Checking + +2026-06-02 * "Utilities co-op" "Power + internet" + Expenses:Operations:Utilities 200.00 USD + Assets:Bank:Checking + +2026-06-02 * "SaaS bundle" "Subscriptions" + Expenses:Operations:Software 150.00 USD + Assets:Bank:Checking + +2026-06-15 * "Early customers" "First pre-order deposits" + Assets:Bank:Checking 4000.00 USD + Income:PreOrders + +2026-06-30 * "Payroll" "June salaries" + Expenses:Salaries:Pat 2500.00 USD + Expenses:Salaries:Rayan 1500.00 USD + Expenses:Salaries:Sam 2000.00 USD + Assets:Bank:Checking + +;; ============================================================================ +;; JULY 2026 — steady state; more pre-orders +;; ============================================================================ + +2026-07-02 * "Coworking Tikal" "July workspace" + Expenses:Operations:Rent 800.00 USD + Assets:Bank:Checking + +2026-07-02 * "Utilities co-op" "Power + internet" + Expenses:Operations:Utilities 200.00 USD + Assets:Bank:Checking + +2026-07-02 * "SaaS bundle" "Subscriptions" + Expenses:Operations:Software 150.00 USD + Assets:Bank:Checking + +2026-07-10 * "Early customers" "Second pre-order batch" + Assets:Bank:Checking 2500.00 USD + Income:PreOrders diff --git a/ledger/run-fava.sh b/ledger/run-fava.sh new file mode 100755 index 0000000..0fa1b76 --- /dev/null +++ b/ledger/run-fava.sh @@ -0,0 +1,19 @@ +#!/usr/bin/env bash +# Launch Fava for the Project Lantern ledger. +# +# The system Fava (pacman) is missing its `beanquery` dependency, so we run it +# from a local venv that reuses system site-packages and adds only what's +# missing. First run creates the venv; afterwards it's instant. +set -euo pipefail +cd "$(dirname "$0")/.." + +PORT="${1:-5001}" + +if [ ! -x .venv/bin/python ]; then + echo "Creating local venv for Fava tooling..." + python -m venv --system-site-packages .venv + .venv/bin/pip install --quiet "beanquery" "simplejson<4" +fi + +exec .venv/bin/python -c "import sys; from fava.cli import main; \ +sys.argv=['fava','-p','${PORT}','ledger/lantern.beancount']; main()"