This makes the code much easier to follow and shortens main.rs from >1000 lines to around 150.
Banks2FF
A robust command-line tool to synchronize bank transactions between various sources and destinations. Currently supports GoCardless (formerly Nordigen) to Firefly III, with extensible architecture for additional sources and destinations.
✨ Key Benefits
- Automatic Transaction Sync: Keep your Firefly III finances up-to-date with your bank accounts
- Intelligent Caching: Reduces GoCardless API calls by up to 99% through encrypted local storage
- Multi-Currency Support: Handles international transactions and foreign currencies correctly
- Smart Duplicate Detection: Avoids double-counting transactions automatically
- Reliable Operation: Continues working even when some accounts need attention
- Safe Preview Mode: Test changes before applying them to your finances
- Rate Limit Aware: Works within API limits to ensure consistent access
- Smart Account Linking: Automatically match bank accounts to Firefly III accounts, with interactive and intelligent manual linking options
🚀 Quick Start
Prerequisites
- Rust (latest stable)
- GoCardless Bank Account Data account
- Running Firefly III instance
Setup
- Copy environment template:
cp env.example .env - Fill in your credentials in
.env:GOCARDLESS_ID: Your GoCardless Secret IDGOCARDLESS_KEY: Your GoCardless Secret KeyFIREFLY_III_URL: Your Firefly instance URLFIREFLY_III_API_KEY: Your Personal Access TokenBANKS2FF_CACHE_KEY: Required encryption key for secure transaction caching
Usage
# Sync all accounts (automatic date range)
cargo run -p banks2ff -- sync gocardless firefly
# Preview changes without saving
cargo run -p banks2ff -- --dry-run sync gocardless firefly
# Sync specific date range
cargo run -p banks2ff -- sync gocardless firefly --start 2023-01-01 --end 2023-01-31
# List available sources and destinations
cargo run -p banks2ff -- sources
cargo run -p banks2ff -- destinations
# Inspect accounts
cargo run -p banks2ff -- accounts list
cargo run -p banks2ff -- accounts list gocardless # Only GoCardless accounts
cargo run -p banks2ff -- accounts list firefly # Only Firefly III accounts
cargo run -p banks2ff -- accounts status
# Manage account links
cargo run -p banks2ff -- accounts link list
cargo run -p banks2ff -- accounts link create # Interactive mode - guided account selection
cargo run -p banks2ff -- accounts link create "Account Name" # Smart mode - auto-detect source/destination
cargo run -p banks2ff -- accounts link create <source> <dest> # Direct mode - for scripts
# Inspect transactions and cache
cargo run -p banks2ff -- transactions list <account_id>
cargo run -p banks2ff -- transactions cache-status
🖥️ CLI Structure
Banks2FF uses a structured command-line interface with the following commands:
sync <SOURCE> <DESTINATION>- Synchronize transactions between source and destinationsources- List all available source typesdestinations- List all available destination typesaccounts list [gocardless|firefly]- List all discovered accounts (optionally filter by adapter type)accounts status- Show sync status for all accountsaccounts link- Manage account links between sources and destinations (with interactive and smart modes)transactions list <account_id>- Show transaction information for a specific accounttransactions cache-status- Display cache status and statisticstransactions clear-cache- Clear transaction cache (implementation pending)
Use cargo run -p banks2ff -- --help for detailed command information.
📋 What It Does
Banks2FF automatically:
- Connects to your bank accounts via GoCardless
- Discovers accounts and provides intelligent linking between GoCardless and Firefly III
- Downloads new transactions since your last sync
- Adds them to Firefly III (avoiding duplicates)
- Handles errors gracefully - keeps working even if some accounts have issues
The account linking system automatically matches accounts by IBAN, but also provides interactive tools for manual linking when needed.
🔗 Smart Account Linking
Banks2FF provides multiple ways to link your bank accounts to Firefly III accounts:
Interactive Mode
cargo run -p banks2ff -- accounts link create
Shows you unlinked bank accounts and guides you through selecting destination accounts with human-readable names.
Smart Resolution
cargo run -p banks2ff -- accounts link create "Main Checking"
Automatically finds accounts by name, IBAN, or ID and shows appropriate linking options.
Direct Linking (for Scripts)
cargo run -p banks2ff -- accounts link create <source_id> <destination_id>
Perfect for automation - uses exact account IDs for reliable scripting.
Key Features
- Auto-Linking: Automatically matches accounts with identical IBANs during sync
- Manual Override: Create custom links when auto-matching isn't sufficient
- Constraint Enforcement: One bank account can only link to one Firefly account (prevents duplicates)
- Human-Friendly: Uses account names and masked IBANs for easy identification
🔐 Secure Transaction Caching
Banks2FF automatically caches your transaction data to make future syncs much faster:
- Faster Syncs: Reuses previously downloaded data instead of re-fetching from the bank
- API Efficiency: Dramatically reduces the number of calls made to GoCardless
- Secure Storage: Your financial data is safely encrypted on your local machine
- Automatic Management: The cache works transparently in the background
The cache requires BANKS2FF_CACHE_KEY to be set in your .env file for secure encryption (see env.example for key generation instructions).
🔧 Troubleshooting
- Unknown source/destination? Use
sourcesanddestinationscommands to see what's available - Account not syncing? Check that the IBAN matches between GoCardless and Firefly III, or use
accounts link createfor interactive linking - Can't find account by name? Use
accounts listto see all available accounts with their IDs and names - Link creation failed? Each bank account can only link to one Firefly account - check existing links with
accounts link list - Missing transactions? The tool syncs from the last transaction date forward
- Rate limited? The tool automatically handles API limits and retries appropriately
For technical details, see docs/architecture.md