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) <noreply@anthropic.com>
This commit is contained in:
Patrick Mulligan 2026-07-30 20:46:55 +02:00
commit 6f330d49d4
3 changed files with 289 additions and 0 deletions

3
.gitignore vendored
View file

@ -17,4 +17,7 @@ dist-ssr
*.log *.log
pnpm-debug.log* pnpm-debug.log*
# python venv used to run Fava (see ledger/run-fava.sh)
.venv/
.claude/ .claude/

267
ledger/lantern.beancount Normal file
View file

@ -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 (JanJul 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

19
ledger/run-fava.sh Executable file
View file

@ -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()"