Connect multiple open banking providers to your Actual Budget server.
Discord
Β·
Website
Β·
Feedback
Lunch Flow is a tool that allows you to connect your banks globally to the tools you love. We currently support multiple open banking providers (GoCardless, Finicity, MX, Finverse, and more ...).
-
π Easy Setup: Simple configuration process for both Lunch Flow and Actual Budget connections
-
π Account Mapping: Interactive terminal UI to map Lunch Flow accounts to Actual Budget accounts
-
π Transaction Import: Import transactions with proper mapping and deduplication
-
π Sync Start Dates: Configure per-account sync start dates to control import scope
-
π Connection Testing: Test and verify connections to both services
-
π± Terminal UI: Beautiful, interactive command-line interface
-
π Direct Import Command: Run imports directly from command line for automation
-
π Deduplication: Prevents importing duplicate transactions
-
π³ Docker Support: Run in containers with built-in cron scheduling for automated syncs
-
β° Automatic Scheduling: Configure flexible sync schedules with cron expressions
-
π¦ Persistent Configuration: Volume-based config storage for easy portability
A simple command to install!
npx @lunchflow/actual-flow
or using pnpm
pnpm dlx @lunchflow/actual-flow
Run actual-flow in a Docker container manually or with automatic scheduled syncs.
- Create a
docker-compose.ymlfile:
services:
actual-flow:
image: ghcr.io/lukaswinter/actual-flow:latest
container_name: actual-flow
volumes:
# Persist configuration
- ./data:/data
environment:
# Optional: Set timezone for cron (default is UTC)
- TZ=UTC
# Optional: Set cron schedule (default is "0 2 * * *" - daily at 2 AM)
# Examples:
# - "0 */6 * * *" (every 6 hours)
# - "*/30 * * * *" (every 30 minutes)
# - "0 8,20 * * *" (daily at 8 AM and 8 PM)
- CRON_SCHEDULE=0 2 * * *
restart: unless-stopped- Start the container:
docker compose up -d- Configure on first run (interactive mode):
docker compose run --rm actual-flow interactiveThe configuration will be saved in ./data/config.json and persisted across container restarts.
Alternatively, use Docker directly:
# Run in cron mode (automatic daily sync)
docker run -d \
--name actual-flow \
-v $(pwd)/data:/data \
-e TZ=UTC \
-e CRON_SCHEDULE="0 2 * * *" \
ghcr.io/lukaswinter/actual-flow:latest cron
# Initial configuration
docker run --rm -it \
-v $(pwd)/data:/data \
ghcr.io/lukaswinter/actual-flow:latest interactiveThe tool will guide you through the initial setup process:
- Lunch Flow API Key: Enter your Lunch Flow API key
- Lunch Flow Base URL: Enter the API base URL (default: https://api.lunchflow.com)
- Actual Budget Server URL: Enter your Actual Budget server URL (default: http://localhost:5007)
- Actual Budget Budget Sync ID: Enter your budget sync ID
- Actual Budget Password: Enter password if required
Configuration is saved to config.json in the project directory.
The tool supports both interactive and non-interactive modes:
# Interactive mode (default)
actual-flow
# Direct import (non-interactive)
actual-flow import
# Show help
actual-flow helpCron Mode (Default): Automatically syncs on a schedule
docker compose up -d
#OR
docker run -d \
--name actual-flow \
-v $(pwd)/data:/data \
-e TZ=UTC \
-e CRON_SCHEDULE="0 2 * * *" \
ghcr.io/lukaswinter/actual-flow:latest cronInteractive Mode: Configure settings manually
docker compose run --rm actual-flow interactive
#OR
docker run --rm -it \
-v $(pwd)/data:/data \
ghcr.io/lukaswinter/actual-flow:latest interactiveDirect Import: One-time import without interaction
docker compose run --rm actual-flow import
#OR
docker run --rm -it \
-v $(pwd)/data:/data \
ghcr.io/lukaswinter/actual-flow:latest importManual Sync: Trigger an immediate sync
docker exec actual-flow /usr/local/bin/docker-entrypoint.sh sync# View all logs
docker logs actual-flow
# Follow logs in real-time
docker logs -f actual-flow
# View cron log file
docker exec actual-flow tail -f /var/log/actual-flow.logSet the CRON_SCHEDULE environment variable to customize sync frequency:
environment:
# Every 6 hours
- CRON_SCHEDULE=0 */6 * * *
# Every 30 minutes
- CRON_SCHEDULE=*/30 * * * *
# Daily at 8 AM and 8 PM
- CRON_SCHEDULE=0 8,20 * * *The tool provides an interactive menu with the following options:
- π Test connections: Verify connections to both Lunch Flow and Actual Budget
- π List available budgets: Show all budgets available on your Actual Budget server
- π Configure account mappings: Map Lunch Flow accounts to Actual Budget accounts
- π Show current mappings: Display currently configured account mappings
- π₯ Import transactions: Import transactions for a selected date range
- βοΈ Reconfigure credentials: Update API credentials
- β Exit: Exit the application
When configuring account mappings, you'll see:
- All available Lunch Flow accounts
- All available Actual Budget accounts
- Interactive selection to map each Lunch Flow account to an Actual Budget account
- Optional sync start date for each mapping (YYYY-MM-DD format)
- Option to skip accounts that don't need mapping
You can configure a sync start date for each account mapping to control which transactions are imported:
- Only transactions on or after the specified date will be imported
- Leave empty to import all available transactions
- Useful for limiting historical data or starting fresh with specific accounts
- Review a preview of transactions to be imported
- Confirm the import
- Monitor progress with real-time feedback
- Automatic deduplication prevents importing existing transactions
- Automatically imports transactions without confirmation prompts
- Perfect for automation, cron jobs, or CI/CD pipelines
- Shows transaction preview and processing summary
- Respects configured sync start dates for each account
# Run import every day at 2 AM
0 2 * * * npx @lunchflow/actual-flow importThe Docker image includes a built-in cron scheduler:
services:
actual-flow:
image: ghcr.io/lukaswinter/actual-flow:latest
environment:
- CRON_SCHEDULE=0 2 * * * # Daily at 2 AM
restart: unless-stoppedYou can also trigger Docker syncs from your system's cron:
# Run manual sync every 6 hours
0 */6 * * * docker exec actual-flow /usr/local/bin/docker-entrypoint.sh syncThe Docker implementation uses a multi-stage build process:
- Build Stage: Compiles TypeScript and builds native dependencies
- Production Stage: Minimal Alpine-based runtime with only production dependencies
- Configuration: Persisted in
/datavolume for easy backup and portability - Logging: All sync operations logged to
/var/log/actual-flow.log
| Variable | Default | Description |
|---|---|---|
CRON_SCHEDULE |
0 2 * * * |
Cron expression for automatic sync schedule |
TZ |
UTC |
Timezone for cron scheduling |
/data: Configuration and Actual Budget cache storageconfig.json: Your saved credentials and account mappingsactual-data/: Actual Budget local cache
Made with β€οΈ for the Actual Budget community
