Skip to content

cubancodepath/actual-expo

Repository files navigation

Actual Budget Mobile

A native iOS client for Actual Budget — the open-source, self-hosted personal finance app. Local-first, privacy-focused budgeting with CRDT-based sync.

Budget Accounts Transactions New Transaction

Privacy Mode Budget Light

Features

  • Zero-based budgeting — Assign every dollar to a category with goals and progress bars
  • Fast transaction entry — Calculator toolbar, auto-category rules, under 10 seconds
  • Offline-first — All data in SQLite on your device. Works without internet
  • Encrypted sync — CRDT-based sync with your own server. Optional AES-256-GCM encryption
  • Privacy mode — Blur all amounts with one tap
  • Scheduled transactions — Recurring transactions with status tracking
  • Account reconciliation — Match your balances with bank statements
  • Light & dark theme — Follows your system preference
  • Multi-language — English and Spanish (i18n with react-i18next)
  • Native iOS — Swipe gestures, context menus, haptic feedback

Requirements

Getting Started

Prerequisites

  • Node.js 18+
  • Expo CLI
  • Xcode 15+ (for iOS builds)

Installation

git clone https://github.com/cubancodepath/actual-expo.git
cd actual-expo
npm install

Development

# Start Expo dev server
npm start

# Build and run on iOS simulator (development variant)
npm run ios

# Build and run production variant on simulator
npm run ios:prod

# Start local Actual Budget server
docker-compose up

Testing

# Unit tests (Vitest)
npm test

# Type checking
npx tsc --noEmit

# E2E tests (Maestro — requires app running in simulator)
npm run e2e

Tech Stack

Layer Technology
Framework Expo 55 / React Native 0.83
Navigation Expo Router (file-based)
State Zustand 5
Database expo-sqlite (raw SQL)
Sync CRDT with Merkle tree diff (ported from Actual's loot-core)
Encryption AES-256-GCM via @noble/ciphers
Crash reporting Sentry
i18n react-i18next
Testing Vitest + Maestro

Architecture

src/
├── accounts/        # Account CRUD (raw SQL)
├── budgets/         # Budget calculations, to-budget
├── categories/      # Category queries
├── crdt/            # HLC timestamps, Merkle tree
├── db/              # SQLite connection, schema, migrations
├── encryption/      # AES-256-GCM, PBKDF2 key derivation
├── goals/           # Goal engine (schedule, savings, spending)
├── payees/          # Payee queries
├── rules/           # Auto-categorization rule engine
├── schedules/       # Recurring transactions, recurrence logic
├── services/        # Auth, budget files, encryption service
├── stores/          # Zustand stores
├── sync/            # Full sync, encoder, undo system
├── transactions/    # Transaction CRUD, queries, split logic
├── presentation/    # UI components, hooks, theme, navigation
└── i18n/            # Internationalization config

app/                 # Expo Router file-based routes
├── (public)/        # Login, onboarding
├── (files)/         # Budget file selection
└── (auth)/          # Main app (tabs, modals, settings)

Contributing

Contributions are welcome! Please open an issue or submit a pull request.

Related

License

MIT

About

Native iOS client for Actual Budget — open-source, self-hosted, offline-first budgeting with CRDT sync

Topics

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages