Agent skill

Beancount Migrate

by bex-co in bex-co/beancount-io

Migrate full transaction history from Mint, Monarch, QuickBooks Online or another category-tagged finance-app export into a fresh Beancount ledger.

MITAuto-check passedBusiness, Finance & HR

Install Beancount Migrate

skills CLI
$ npx skills add bex-co/beancount-io --skill beancount-migrate -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install bex-co/beancount-io beancount-migrate --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/bex-co/beancount-io.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/.claude/skills/beancount-migrate .claude/skills/beancount-migrate && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
beancount-migrate
GitHub stars
296
Token cost
~2.3k tokens
SKILL.md length
1,110 words
Files
9 (incl. references)
Skills in repo
27
Repo updated
First seen
Licence
MIT

At a glance

Migrate full transaction history from Mint, Monarch, QuickBooks Online or another category-tagged finance-app export into a fresh Beancount ledger.

  • Works in 6 steps: Identify → Scaffold → Map → …
  • Business, Finance & HR work in your project
  • SKILL.md covers Prefer bea, Scope — what this skill does…, Workflow and What NOT to do
  • Instructions only: no scripts, shell commands, URLs or credentials in SKILL.md

What it does

Beancount Migrate is an agent skill from bex-co/beancount-io. Migrate full transaction history from Mint, Monarch, QuickBooks Online or another category-tagged finance-app export into a fresh Beancount ledger. Confirm account/category mappings, pair transfers, preserve source IDs, write through bea and reconcile source counts and balances. Skip ongoing bank imports, populated-ledger merges and investment lot reconstruction.

Its SKILL.md is about 2.3k tokens, which your agent loads only when the skill is triggered. The skill folder holds 11 other files, including reference files (for example `evals/evals.json`, `references/mapping.md` and `references/mint.md`).

It sits in Business, Finance & HR. It works with QuickBooks. The repository describes itself as: 💰 Double-entry bookkeeping made easy — plain-text accounting for humans and AI agents. Polished iOS & Android app built with React Native + Expo. The licence is MIT.

When your agent uses it

  • Business, Finance & HR work in your project

Example prompts

  • “/beancount-migrate”

Workflow steps

6 steps, taken from the step headings in SKILL.md.

  1. Identify
  2. Scaffold
  3. Map
  4. Convert
  5. Verify
  6. Report

What it can do on your machine

Read from SKILL.md and the folder at commit 5614bc7. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    No scripts in the folder and no shell commands in SKILL.md.

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Beancount Migrate loads about 2.3k tokens when it runs, and up to ~5k if it reads all its reference files. Until then it costs about 96 tokens; SKILL.md has 1,110 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~96
When it runs · the whole SKILL.md, loaded when a task matches
~2.3k
With references · SKILL.md plus every file in references/, read only if the agent opens them
~5k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from bex-co/beancount-io at commit 5614bc7, republished under its MIT licence (© bex-co). 1,110 words, ~2,250 tokens.

Download SKILL.mdSave it as .claude/skills/beancount-migrate/SKILL.md (or your agent's skills folder). This skill also uses 8 other files; get the full folder from GitHub.
name
beancount-migrate
description
Migrate full transaction history from Mint, Monarch, QuickBooks Online or another category-tagged finance-app export into a fresh Beancount ledger. Confirm account/category mappings, pair transfers, preserve source IDs, write through bea and reconcile source counts and balances. Skip ongoing bank imports, populated-ledger merges and investment lot reconstruction.

beancount-migrate

Turn a finance-app export into a complete, verified beancount ledger — mapped accounts, full history, deduplicated transfers, opening balances, and a migration report that proves nothing was dropped.

This skill exists because every app shutdown (Mint, Bench, …) strands users with one CSV and no way to trust a conversion: categories don't map 1:1 to double-entry accounts, transfers appear twice (once per account), and a silently dropped row is invisible until a balance is wrong months later. The skill converts with receipts: every count and balance is reconciled against the source, and everything unmappable is surfaced, never guessed.

Prefer bea

Read beancount-init's references/bea-cli.md before running ledger commands: it defines explicit root/destination paths, JSON batches, checks, and safe retries. Without bea, use beancount-init's references/compatibility.md.

Compose beancount-init, then write approved accounts, transaction batches and endpoint assertions through bea. Fava is optional. Mapping, transfer pairing, source identities, and the migration report remain this skill's work.

Scope — what this skill does and does not touch

Does: convert one export (possibly covering many source accounts) into a fresh ledger; propose and confirm the account hierarchy before converting; pair transfers; construct opening balances; emit a migration report; run the root-ledger bea check.

Does not: talk to any app's API (exports only); backfill investment lots/prices (holdings rows are surfaced as follow-up work, not converted); merge into an existing populated ledger (offer beancount-import for that); invent category mappings the user didn't confirm.

Read references/mapping.md before proposing any hierarchy, and the per-source reference (references/mint.md, references/monarch.md, references/qbo.md) before parsing. Unknown source? Inspect the header, then follow mapping.md's generic path.

Workflow

Six phases, in order: Identify → Scaffold → Map → Convert → Verify → Report.

1. Identify

Inspect the export's header row and a few data rows. Recognize the source (Mint / Monarch / QBO — see references) or fall back to the generic category-tagged-CSV path. Establish: the distinct source accounts in the file, the distinct categories, the date range, the row count, and the sign/type convention. Ask for anything ambiguous — never guess signs or dates.

Also ask up front for each source account's current balance (from the old app or the real bank) — opening balances depend on it (see mapping.md). If the user also knows the balance at the start of the export period, collect it: anchoring on a stated opening (instead of back-deriving one) makes the endpoint assertion a real check rather than a tautology.

2. Scaffold

If there is no ledger, compose beancount-init with an explicit historical open date: the day before the earliest source row, so account opens also cover the opening-balance transactions. Run bea --no-input init . --currency CURRENCY --date OPEN_DATE through that flow. Do not initialize with today's date and patch the opens afterward. If a populated ledger already exists, offer beancount-import instead; this skill targets fresh starts.

3. Map

Propose, then confirm before converting:

  1. Account mapping — each source account → Assets:… or Liabilities:… (type from the source metadata or the user).
  2. Category mapping — each distinct source category → an Expenses:… or Income:… account, as a reviewable table (Groceries → Expenses:Food:Groceries). Follow references/mapping.md's shaping rules. Categories with no sensible mapping go to Expenses:Uncategorized — listed explicitly, never silently absorbed.
  3. Transfer categories — which source categories mean "transfer between my own accounts" (e.g. Mint's Transfer, Credit Card Payment). These pair up, not double-book (mapping.md).

Present all three tables together as one review; the user edits them in place and a single explicit yes covers all three — only then does Convert run.

Show full SKILL.md (546 more words)Show less
4. Convert
  • One transaction per non-transfer row: source-account posting at the row amount (ledger sign), counter-account from the confirmed category mapping.
  • Transfer pairs (same amount, opposite direction, ≤3 days apart, transfer-mapped categories, different source accounts) merge into one two-posting transaction. Unpaired transfer rows go to a transfers to review list, converted against Equity:Transfers-Review so totals still tie.
  • Every entry carries import-id metadata per the beancount-import convention (references/dedup.md there): native row ID if the export has one, else <source>:sha256:<16-hex> with the same normalization. A merged transfer pair covers two source rows — record one row's id as import-id and the other as import-id-2 so a later beancount-import of either account exact-matches its side and doesn't double-book the transfer.
  • Opening balances: prefer a stated opening when available; otherwise derive opening = stated current balance − Σ(converted rows) and label it as derived. Date it the day before the earliest row and post against the existing opening-equity account (bea init creates Equity:OpeningBalances). An endpoint assertion dated the day after the last row pins the stated ending balance; with a derived opening this is a consistency check, not independent evidence that source rows are complete.
  • Open each missing mapped account with bea --file "$ledger" --json --no-input add open --date "$open_date" --account "$account" --into "$open_target"; do not duplicate accounts already opened by init.
  • Build one approved JSON batch containing the opening transactions and converted history, including both IDs on merged transfers. Write it with bea --file "$ledger" --json --no-input add transactions --from "$batch" --into "$target".
  • Then write each passing endpoint assertion with bea --file "$ledger" --json --no-input add balance --date "$assertion_date" --account "$account" --amount "$amount" --into "$target". These are separate commands; a failed assertion does not undo the history batch. Inspect the ledger before resuming to avoid duplicating it.
5. Verify

Run the checks; a migration that can't show its math didn't happen:

  • Row count: source rows = non-transfer transactions written + 2×(transfer pairs merged) + skipped rows (each listed with a reason) — a merged pair is 2 source rows but 1 transaction, so count it on the pairs side, not the transactions side.
  • Balances: per account, opening + Σ(rows) must equal the stated current balance — this is what the appended balance assertion enforces via bea check.
  • bea --file "$ledger" --json --no-input check on the root ledger. Any failure: surface the exact output, do not report success.

If a stated opening plus the movements disagrees with the stated ending, the attempted balance assertion is refused before it is written — surface the delta and its likely causes (rows missing from the export, pending transactions, wrong stated balance); never adjust numbers to force a pass, never delete the assertion to hide it. Offer the residual as an explicit Equity:Migration-Residual posting only if the user explicitly accepts the discrepancy.

6. Report

End with the migration report (also saved as MIGRATION.md in the repo if the user wants):

Source: Mint export, 2023-01-05 … 2026-07-15, 2 accounts, 1,214 rows
Converted: 1,180 transactions   Transfer pairs merged: 16 (32 rows)
Skipped: 2 rows (listed below, with reasons)
Unmapped categories → Expenses:Uncategorized: "Misc" (14 rows), "Stuff" (3 rows)
Balances: Assets:Bank:Checking ✓ ties to 3,412.55   Liabilities:CC:Amex ✓ ties to -210.40
bea check: PASS
Next steps: refine Expenses:Uncategorized rows; optional `make start` for Fava if scaffolded; use beancount-import for ongoing weekly imports.

What NOT to do

  • Don't convert before the account and category mappings are explicitly confirmed.
  • Don't guess a mapping — unmapped means Expenses:Uncategorized, visibly reported.
  • Don't double-book transfers, and don't silently drop unpaired transfer rows.
  • Don't hide a count or balance delta — surface it; never force a tie-out.
  • Don't convert investment holdings/lots — flag as follow-up.
  • Don't write anything outside the fresh ledger repo (the user-approved beancount-init scaffold excepted), and no transactions before the mapping confirm.

© bex-co, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 8 other files (references) in skills/.claude/skills/beancount-migrate of bex-co/beancount-io.

  • SKILL.md
  • evals/evals.json
  • evals/files/eval1_mint.csv
  • evals/files/eval2_monarch.csv
  • evals/files/eval3_qbo.csv
  • references/mapping.md
  • references/mint.md
  • references/monarch.md
  • references/qbo.md

Open the folder on GitHubat commit 5614bc7

Compare with similar skills

Beancount Migrate next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Beancount Migrate compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Beancount Migrate this skillbex-co/beancount-io296—~2.3kAutomated safety check: PassMIT
Fondo Install Authjeremylongshore/tons-of-skills-marketplace2.8k—~883Automated safety check: PassMIT
Fondo Local Dev Loopjeremylongshore/tons-of-skills-marketplace2.8k—~1.3kAutomated safety check: NotesMIT
Fondo SDK Patternsjeremylongshore/tons-of-skills-marketplace2.8k—~1.5kAutomated safety check: PassMIT
Payroll Gl ReconciliationLeoYeAI/openclaw-master-skills2.2k—~6.2kAutomated safety check: PassMIT
Finance Opsericosiu/ai-marketing-skills3.6k1 repos~1.4kAutomated safety check: PassMIT

Similar skills

  • Fondo Install Auth

    jeremylongshore/tons-of-skills-marketplace

    Set up Fondo account and configure integrations with Gusto, QuickBooks, and bank accounts for automated startup bookkeeping and R&D tax credits.

    2.8k GitHub stars~883 tokensUpdated today
    Business, Finance & HRAuto-check passed
  • Fondo Local Dev Loop

    jeremylongshore/tons-of-skills-marketplace

    Configure local development workflows that integrate with Fondo for financial data, using Fondo exports with QuickBooks or accounting tools.

    2.8k GitHub stars~1.3k tokensUpdated today
    Business, Finance & HRAuto-check: notes
  • Fondo SDK Patterns

    jeremylongshore/tons-of-skills-marketplace

    Build internal tools that consume Fondo financial data exports with typed parsers, QuickBooks integration, and financial modeling patterns.

    2.8k GitHub stars~1.5k tokensUpdated today
    Business, Finance & HRAuto-check passed
  • Payroll Gl Reconciliation

    LeoYeAI/openclaw-master-skills

    Reconcile payroll processor reports (Gusto, ADP, Paychex, Rippling) to general ledger journal entries in QuickBooks Online, Xero, or other accounting software.

    2.2k GitHub stars~6.2k tokensUpdated 2 mo ago
    Business, Finance & HRAuto-check passed
  • Finance Ops

    ericosiu/ai-marketing-skills

    AI-powered financial analysis suite. An agent skill from ericosiu/ai-marketing-skills.

    3.6k GitHub starsUsed in 1 repo~1.4k tokens
    Business, Finance & HRAuto-check passed
  • Bookkeeping Close

    OneWave-AI/claude-skills

    Categorizes transactions, reconciles bank and card statements to the ledger, works a month-end checklist and prepares a close package, without ever forcing a balance.

    328 GitHub stars~2k tokensUpdated 7 days ago
    Business, Finance & HRAuto-check passed

More from bex-co/beancount-io

All 27 skills in this repo
  • Beancount Close

    bex-co/beancount-io

    Close an accounting period in a Beancount ledger by reconciling each active account through beancount-reconcile, checking assertions and recurring gaps, reviewing flags, then proposing a commit with…

    296 GitHub stars~1.4k tokensUpdated today
    Auto-check passed
  • Beancount Import

    bex-co/beancount-io

    Import a bank or card CSV, OFX/QFX, or QIF export into an existing Beancount ledger.

    296 GitHub stars~3k tokensUpdated today
    Auto-check passed
  • Beancount Importer Author

    bex-co/beancount-io

    Write or repair a reusable Beangulp importer from a sample bank export, with reviewed golden files and a passing test harness.

    296 GitHub stars~2k tokensUpdated today
    Auto-check passed
  • Beancount Init

    bex-co/beancount-io

    Scaffold a new Beancount ledger with bea init and validation, with optional Fava browser setup when requested.

    296 GitHub stars~1.2k tokensUpdated today
    Auto-check: notes
  • Beancount Options

    bex-co/beancount-io

    Record a described options trade or lifecycle event as validated Beancount transactions through bea, after review and confirmation.

    296 GitHub stars~3.7k tokensUpdated today
    Auto-check passed
  • Beancount Reconcile

    bex-co/beancount-io

    Reconcile one Beancount account against a CSV statement or pasted PDF text.

    296 GitHub stars~4.1k tokensUpdated today
    Auto-check passed

Works with

Questions about Beancount Migrate

What does Beancount Migrate do?

Migrate full transaction history from Mint, Monarch, QuickBooks Online or another category-tagged finance-app export into a fresh Beancount ledger. Beancount Migrate is an agent skill from bex-co/beancount-io. Migrate full transaction history from Mint, Monarch, QuickBooks Online or another category-tagged finance-app export into a fresh Beancount ledger.

When should I use Beancount Migrate?

Beancount Migrate fits situations like: business, Finance & HR work in your project.

How do I install Beancount Migrate in Claude Code?

Run `npx skills add bex-co/beancount-io --skill beancount-migrate -a claude-code`. Or copy the skill folder (skills/.claude/skills/beancount-migrate in bex-co/beancount-io) into .claude/skills/beancount-migrate in your project. Claude Code loads it when a task matches its description.

How do I install Beancount Migrate in Codex?

Run `npx skills add bex-co/beancount-io --skill beancount-migrate -a codex`. Or copy the skill folder (skills/.claude/skills/beancount-migrate in bex-co/beancount-io) into .agents/skills/beancount-migrate in your project. Codex loads it when a task matches its description.

Can I use Beancount Migrate in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add bex-co/beancount-io --skill beancount-migrate -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/beancount-migrate, .gemini/skills/beancount-migrate, .github/skills/beancount-migrate and .opencode/skills/beancount-migrate in your project.

What does Beancount Migrate need to run?

SKILL.md names no scripts, command-line tools or credentials: Beancount Migrate is instructions for the agent only.

Does Beancount Migrate access the network?

SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.

Is Beancount Migrate safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Beancount Migrate use?

Beancount Migrate is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Beancount Migrate use?

About 2.3k tokens (SKILL.md is roughly 9k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 2.7k tokens, read only when the agent opens those files.

What are the alternatives to Beancount Migrate?

Skills that share tags, products or a category with Beancount Migrate: Fondo Install Auth (jeremylongshore/tons-of-skills-marketplace, 2.8k stars), Fondo Local Dev Loop (jeremylongshore/tons-of-skills-marketplace, 2.8k stars), Fondo SDK Patterns (jeremylongshore/tons-of-skills-marketplace, 2.8k stars) and Payroll Gl Reconciliation (LeoYeAI/openclaw-master-skills, 2.2k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Beancount Migrate?

bex-co (a GitHub organization) maintains it in bex-co/beancount-io, which has 296 GitHub stars. The repository holds 27 skills in this directory. The repository was last updated on October 9, 2026.

Source: bex-co/beancount-io on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.