Outlay

Outlay

Personal finance for people, not corporations.
Track expenses, plan budgets, and take direct control of your money.

License: CC0 Rust GTK4 libadwaita SQLite Linux Wayland AppImage No Tracking No Ads


Outlay is a desktop finance app built with Rust and GTK4. It runs entirely on your machine, stores everything locally in SQLite, and never phones home. No accounts, no cloud sync, no subscriptions, no data harvesting. Your financial data stays yours - no middlemen, no landlords between you and your own information.

It exists because tracking your spending shouldn't require handing your most intimate data to some company's servers. Every feature is available to everyone equally - no premium tiers, no artificial scarcity, no paywalls.

Released into the public domain under CC0. Take it, use it, change it, share it. It belongs to the commons.


Table of Contents


🧭 Overview

Outlay is a native Linux application for personal income and expense tracking. It is built from scratch in Rust using GTK4 and libadwaita 1.8 for a modern GNOME-native experience. Everything runs locally - the database is a single SQLite file on your disk, exchange rates are cached after fetching, and there is no telemetry or network activity beyond currency conversion lookups.

The goal is simple: give people a tool that is genuinely useful for managing their own money, without any of the usual strings attached. No venture capital, no growth metrics, no engagement loops. Just a straightforward app that does what it says.


Features at a Glance

Area What it does
Transaction logging Quick expense/income entry with categories, notes, payees, tags, and inline math
History browsing Day-grouped transaction list with search, category filters, batch operations
Charts Donut charts, bar charts, and smooth trend lines with monthly navigation
Budgets Per-category monthly budgets with progress bars, rollover, pace tracking, sparklines
Recurring Automated transaction generation for daily/weekly/biweekly/monthly/yearly patterns
Subscriptions Lifecycle tracking with monthly/yearly cost summaries, linked to recurring
Savings goals Target amounts with deadlines, progress tracking, color-coded visualization
Credit cards Balance and utilization tracking, statement cycle management
Wishlist Want-to-buy items with priority, pricing, and purchase status
Forecast Cash flow projections based on recurring patterns and historical averages
Insights Spending anomaly detection, monthly recaps, year-over-year comparisons
Achievements 16+ unlockable badges for financial milestones and healthy habits
Streaks No-spend and on-budget streak tracking with personal bests
Calendar Spending heatmap with per-day drill-down
Multi-currency 40+ currencies with automatic exchange rate fetching and caching
Import/Export CSV, JSON, OFX, QIF, PDF - bring your data in, take your data out
Backup Full-state .outlay archive files for portability and safekeeping
System tray Minimize to tray, quick-add popup, persistent background operation
Notifications Budget alerts, bill reminders, weekly digests, achievement unlocks
OCR Extract amounts from receipt images via Tesseract
NLP Natural language parsing for quick transaction entry

📦 Installation

Download the latest AppImage from the releases page, make it executable, and run:

chmod +x Outlay-*.AppImage
./Outlay-*.AppImage

No installation required. It carries everything it needs. Works on any modern Linux distribution.

From Source

See Building from Source below.


🛠️ Building from Source

Dependencies

You will need:

  • Rust toolchain (stable, 2024 edition)
  • GTK4 development libraries (4.10+)
  • libadwaita development libraries (1.8+)
  • SQLite3 development headers
  • pkg-config

On Debian/Ubuntu:

sudo apt install libgtk-4-dev libadwaita-1-dev libsqlite3-dev pkg-config

On Fedora:

sudo dnf install gtk4-devel libadwaita-devel sqlite-devel pkg-config

On Arch:

sudo pacman -S gtk4 libadwaita sqlite pkg-config

Build and Run

git clone https://git.lashman.live/lashman/outlay.git
cd outlay
cargo build --release
./target/release/outlay-gtk

Demo Data

To populate the app with two years of realistic sample data for testing:

cargo run -p outlay-core --bin seed-demo

This wipes the existing database and creates a fresh one filled with transactions, budgets, recurring items, subscriptions, and goals across various categories.


🖥 Views and Functionality

📝 Log View

The default view. A quick-entry form for logging transactions.

  • Toggle between expense and income modes
  • Amount field with auto-focus and inline arithmetic (type 12.50+3 and it evaluates to 15.50)
  • Currency selector with 40+ options
  • Category dropdown filtered by transaction type
  • Date picker defaulting to today
  • Optional note and payee fields
  • Toast confirmation on save

The form is designed for speed. Open the app, type a number, pick a category, save. Three seconds and you are done. No friction, no unnecessary steps - because tracking expenses should be easier than not tracking them.

📜 History

Browse all your transactions grouped by day.

  • Month navigation with previous/next controls
  • Full-text search across notes, payees, and categories
  • Category filter chips for quick narrowing
  • Tag-based filtering
  • Day headers with date labels ("Today", "Yesterday", "Feb 27")
  • Per-transaction display: category icon, name, amount (color-coded green/red), note
  • Daily subtotals showing income, expenses, and net
  • Selection mode for batch delete operations
  • Inline edit and delete per transaction
  • Spending anomaly banners when unusual patterns are detected

Every transaction you have ever logged is here, organized chronologically. Nothing hidden, nothing summarized away. Your complete financial record, accessible and transparent.

📊 Charts

Visual breakdowns of where your money goes and comes from.

  • Donut chart: Category breakdown for the selected month, color-coded, with interactive segments
  • Bar chart: Side-by-side monthly income vs expense comparison over time
  • Net trend line: Smooth 12-month running balance curve using monotone Hermite interpolation (no jagged lines, no Bezier overshoot)
  • Month and range selector for all chart types
  • Theme-aware rendering (adapts to light and dark modes)
  • Touch-friendly interactions

The charts use Cairo for rendering directly onto GTK DrawingAreas. The smoothing algorithm is Fritsch-Carlson monotone cubic Hermite interpolation, which guarantees the curve passes through every data point without overshooting between them.

💰 Budgets

Set spending limits per category and track progress through the month.

  • Per-category budget amounts with visual progress bars
  • Color coding: green (on track), yellow (75%+), red (over budget)
  • Monthly overview card showing total budgeted vs total spent
  • Sparkline mini-charts showing 4-month spending trend per category
  • Budget rollover support (carry unused amounts to next month)
  • Daily pace indicator: your actual daily spend vs what you can afford per day
  • "Safe to spend" calculation
  • Copy budgets from previous month for quick setup
  • Three budget cycle modes:
    • Calendar: Standard month (1st to last day)
    • Payday: Custom start date (e.g. the 15th)
    • Rolling: 30-day sliding window
  • Budget threshold notifications at 75%, 90%, and 100%

Budgets are a tool for self-awareness, not punishment. The pace indicator in particular is useful - it tells you "at your current rate, here is where you will end up" so you can make informed choices about the rest of the month.

🔄 Recurring Transactions

Automate regular income and expenses.

  • Define transactions that repeat: daily, weekly, biweekly, monthly, or yearly
  • Set start and optional end dates
  • Mark items as bills with configurable reminder days
  • Pause and resume with optional resume date
  • Active and paused sections displayed separately
  • Linked to subscriptions for bidirectional sync (pause one, the other pauses too)
  • Auto-generation on app launch catches up on any missed occurrences
  • Toast notification: "Added N recurring transaction(s)"

When you open Outlay after being away for a week, it quietly generates all the recurring transactions that would have occurred. No manual intervention needed. The system respects end dates, pause states, and frequency rules.

🔔 Subscriptions

Track your subscription services separately from raw recurring transactions.

  • Active and paused subscription lists
  • Monthly cost summary across all active subscriptions
  • Yearly cost projection
  • Per-subscription details: name, amount, frequency, currency, next due date
  • Add, edit, delete, and pause/resume controls
  • Bidirectional link with recurring transactions:
    • Pausing a subscription pauses its linked recurring transaction
    • Deleting either cascades properly (no orphaned records, no constraint errors)
    • Status changes propagate instantly between views

The subscription view gives you a clear answer to "how much am I paying per month for services?" - a number that tends to creep up quietly if nobody is watching.

🎯 Savings Goals

Set targets and track your progress toward them.

  • Create goals with a name, target amount, currency, and optional deadline
  • Track current savings against the target with progress bars
  • Color and icon customization per goal
  • Active and completed goal sections
  • Mark goals as complete when reached
  • Achievement unlocks tied to goal completion milestones

Goals work as a simple ledger - you set a target, and manually update your saved amount as you make progress. This keeps it flexible enough for any kind of saving, whether it is a vacation fund, an emergency cushion, or pooling resources with others for a shared purpose.

💳 Credit Cards

Keep tabs on credit card balances and utilization.

  • Track multiple cards with individual limits and balances
  • Statement close day and payment due day per card
  • Utilization percentage calculation and display
  • Color-coded card entries
  • Active/inactive toggle
  • Total balance and total limit summary cards

This is a straightforward tracking tool - enter your balances manually to maintain awareness of where you stand. No bank API integration, no sharing credentials with third parties.

🛒 Wishlist

A place for things you want but have not bought yet.

  • Item name, estimated cost, optional category and URL
  • Priority levels for ordering
  • Purchase status toggle
  • Total wishlist value calculation

The wishlist is a cooling-off buffer. Writing something down instead of buying it immediately is one of the simplest ways to reduce impulse spending. If you still want it in a week, it will be here waiting. No algorithmic nudges pushing you to buy.

🔮 Forecast

Project your future cash flow based on existing patterns.

  • Projections based on recurring transaction schedules
  • 3-month average spending calculations
  • Income projections from recurring income sources
  • Estimated balance for upcoming months (3, 6, and 12 month horizons)
  • Monthly net forecast: expected income minus expected expenses
  • Visual comparison of projected income vs expenses

The forecast makes no assumptions about growth or lifestyle inflation. It simply extends your current patterns forward so you can see where things are heading and adjust if needed.

🏆 Insights and Achievements

Analytics and light gamification to encourage healthy financial habits.

Streaks:

  • No-spend streak: consecutive days without logging an expense
  • Budget streak: consecutive months finishing under budget
  • Current vs personal best tracking

Achievements (16+ badges):

  • First Transaction
  • 7-Day and 30-Day No-Spend streaks
  • 1, 3, 6, and 12 Months Under Budget
  • First Goal Completed, 5 Goals Completed
  • 100, 500, and 1000 Transactions logged
  • First Recurring Transaction set up
  • Big Saver (50%+ savings rate in a month)
  • Category Master (10+ categories used)
  • Streak Champion (14+ day no-spend streak)
  • Year Under Budget

Monthly Recap:

  • Category-by-category spending breakdown with percentages
  • Total income, expenses, and net for the month
  • Transaction count
  • Month-over-month and year-over-year change indicators
  • Year and month navigation

Anomaly Detection:

  • Automatic flagging of unusual spending patterns
  • Category-specific insights ("You spent 200% of your average in Groceries this month")
  • Interactive links to filtered history for investigation

The achievements are meant to be encouraging without being manipulative. There are no daily login rewards, no streaks designed to create anxiety, and no leaderboards. Just quiet recognition when you hit a milestone that matters to you.

📅 Calendar Heatmap

A visual grid showing daily spending intensity.

  • Month calendar layout with day-of-week headers
  • Each cell colored by spending amount (darker green = higher spending)
  • Click any day to see its transactions
  • Daily totals calculated automatically

A quick way to spot patterns - maybe you spend more on weekends, or there is a consistent spike mid-month. The heatmap makes these rhythms visible at a glance.

⚙️ Settings

Configure Outlay to work the way you need.

  • Theme: System, Light, or Dark mode
  • Base currency: Set your home currency for conversions and reports
  • Categories: Add, edit, reorder, and manage expense/income categories with icons and colors
  • Notifications: Toggle recurring transaction alerts, budget warnings, and bill reminders
  • Backup: Create and restore full-state .outlay backup archives
  • Export: Generate PDF reports, CSV spreadsheets, and JSON data dumps
  • Import: Bring in data from CSV, JSON, OFX, QIF, and PDF bank statements

📤 Import and Export

Outlay believes your data should flow freely. No lock-in, no proprietary formats, no friction for leaving.

Export Formats

Format Description
CSV Standard comma-separated values. Opens in any spreadsheet. Date, category, amount, currency, note, type.
JSON Complete structured export of the entire database. Includes schema version and all tables. Ideal for programmatic access or full migration.
OFX Open Financial Exchange. Bank-compatible format for importing into other financial tools.
QIF Quicken Interchange Format. Legacy compatibility with older financial software.
PDF Formatted monthly financial report with summary, category breakdown, top expenses, and budget comparison.

Import Formats

Format Description
CSV Configurable column mapping. Auto-detects categories by name, creates missing ones as needed.
JSON Restore from a previous JSON export. Merge into existing data or replace entirely. Schema validation included.
OFX Parse bank statements in OFX format. Multi-currency support.
QIF Import from Quicken or other apps that export QIF.
PDF Extract transactions from PDF bank statements using text parsing. Multi-page support.

Full Backup

The .outlay backup format is a ZIP archive containing:

  • outlay.db - Complete SQLite database
  • settings.json - All application settings
  • meta.json - App version, export date, schema version

Create a backup, copy it to another machine, restore it, and you have an exact replica of your entire financial history. Your data is portable because it should be - you should never feel trapped by the tools you use.


🌍 Multi-Currency Support

Outlay supports 40+ currencies with automatic exchange rate conversion.

Supported currencies
Code Currency
USD US Dollar
EUR Euro
GBP British Pound
JPY Japanese Yen
CAD Canadian Dollar
AUD Australian Dollar
CHF Swiss Franc
CNY Chinese Yuan
INR Indian Rupee
BRL Brazilian Real
MXN Mexican Peso
ARS Argentine Peso
CLP Chilean Peso
COP Colombian Peso
PEN Peruvian Sol
UYU Uruguayan Peso
SGD Singapore Dollar
HKD Hong Kong Dollar
KRW South Korean Won
THB Thai Baht
TWD New Taiwan Dollar
PHP Philippine Peso
MYR Malaysian Ringgit
IDR Indonesian Rupiah
VND Vietnamese Dong
PKR Pakistani Rupee
BDT Bangladeshi Taka
SEK Swedish Krona
NOK Norwegian Krone
DKK Danish Krone
PLN Polish Zloty
CZK Czech Koruna
HUF Hungarian Forint
RON Romanian Leu
BGN Bulgarian Lev
HRK Croatian Kuna
RUB Russian Ruble
ZAR South African Rand
EGP Egyptian Pound
NGN Nigerian Naira
KES Kenyan Shilling
TRY Turkish Lira
ILS Israeli Shekel
SAR Saudi Riyal
AED UAE Dirham
QAR Qatari Riyal

How it works:

  • Set your base currency in Settings
  • When logging a transaction in a different currency, the exchange rate is fetched automatically
  • Primary rate source: fawazahmed0/exchange-api (free, open, no API key required, no rate limits)
  • Fallback source: Frankfurter (also free and open)
  • Rates are cached in the database for 24 hours
  • Every transaction stores the exchange rate at the time of entry, preserving historical accuracy
  • Reports and charts convert everything to your base currency

The exchange rate sources are free and open services run by volunteers. No corporate API keys, no billing tiers, no rate limiting designed to push you toward a paid plan.


🔔 Notifications

Outlay uses native GNOME desktop notifications to keep you informed without being intrusive.

  • Budget alerts: Warnings at 75%, 90%, and 100%+ of your budget threshold per category
  • Bill reminders: Configurable advance notice (e.g. 3 days before due) for bills marked in recurring transactions
  • Recurring generation: Confirmation when recurring transactions are auto-generated on launch
  • Weekly digest: Summary of spending if 7+ days since last digest
  • Backup reminder: Gentle nudge if 30+ days since last backup and you have 50+ transactions
  • Achievement unlocks: Toast notification when you earn a new badge
  • Spending anomalies: Alert on startup if unusual spending patterns are detected

Notifications are de-duplicated (you will not get the same budget warning twice) and can be toggled per type in Settings. They exist to help you stay aware, not to create anxiety or generate "engagement."


🗔 System Tray

Outlay integrates with the freedesktop.org system tray specification via DBus.

  • Minimize to tray instead of quitting
  • Tray menu options:
    • Show Outlay - Restore the main window
    • Quick Add - Popup for rapid transaction entry without opening the full app
    • Log Expense - Open directly to expense entry
    • Log Income - Open directly to income entry
    • Quit - Actually close the application

The Quick Add popup is designed for those moments when you just bought something and want to log it in five seconds without switching context.


⌨️ Keyboard and Workflow

The interface follows standard GTK4 and GNOME conventions.

  • Amount field auto-focuses on the Log view for immediate typing
  • Inline arithmetic in the amount field: type 24.99+tax or 100/3 and the result is calculated
  • Expression evaluator supports +, -, *, /, and parentheses
  • Standard keyboard navigation throughout (Tab, Enter, Escape)
  • Adaptive layout: sidebar collapses to a stack on narrow windows

🏗 Architecture

Outlay is structured as a Cargo workspace with two crates:

outlay/
  outlay-core/          # Library crate - all business logic
    src/
      lib.rs            # Module declarations
      models.rs         # Data structures and enums
      db.rs             # SQLite operations, migrations, queries
      exchange.rs       # Currency conversion service
      recurring.rs      # Recurring transaction generator
      notifications.rs  # Alert and reminder system
      backup.rs         # Full-state backup/restore
      nlp.rs            # Natural language transaction parsing
      ocr.rs            # Receipt image scanning
      expr.rs           # Arithmetic expression evaluator
      sankey.rs         # Sankey diagram layout engine
      seed.rs           # Demo data generator
      export_csv.rs     # CSV export
      export_json.rs    # JSON export
      export_ofx.rs     # OFX export
      export_qif.rs     # QIF export
      export_pdf.rs     # PDF report generation
      import_csv.rs     # CSV import
      import_json.rs    # JSON import
      import_ofx.rs     # OFX import
      import_qif.rs     # QIF import
      import_pdf.rs     # PDF statement import
      bin/
        seed_demo.rs    # Demo data seeder binary
  outlay-gtk/           # Binary crate - GTK4 user interface
    src/
      main.rs           # Application entry, initialization, notifications
      window.rs         # Main window scaffold, navigation, view wiring
      log_view.rs       # Transaction entry form
      history_view.rs   # Transaction browsing and filtering
      charts_view.rs    # Financial charts and visualization
      budgets_view.rs   # Budget management and progress
      recurring_view.rs # Recurring transaction management
      subscriptions_view.rs  # Subscription tracking
      goals_view.rs     # Savings goal management
      credit_cards_view.rs   # Credit card tracking
      wishlist_view.rs  # Wishlist management
      forecast_view.rs  # Cash flow projections
      insights_view.rs  # Analytics, achievements, streaks
      calendar_view.rs  # Spending heatmap
      settings_view.rs  # Configuration interface
      quick_add.rs      # Tray popup for rapid entry
      edit_dialog.rs    # Transaction editing dialog
      date_picker.rs    # Calendar date selector
      category_combo.rs # Filterable category dropdown
      numpad.rs         # On-screen calculator keypad
      month_nav.rs      # Month navigation controls
      sparkline.rs      # Mini trend line widget
      icon_theme.rs     # Tabler icon integration
      tray.rs           # System tray integration
      style.css         # Application stylesheet
    data/
      fonts/            # Bundled typefaces
      icons/            # App icon (all sizes) + action icons
    build.rs            # Build-time resource compilation
  scripts/
    build-appimage.sh   # AppImage packaging script
  docs/
    plans/              # Design documentation

Key Technical Decisions

  • Raw GTK4 bindings instead of a framework like Relm4. More verbose, but no hidden abstractions.
  • SQLite with WAL mode for reliable concurrent reads during UI updates.
  • Foreign keys enforced at the database level. Cascade deletes are explicit in application code to maintain control over what gets removed.
  • Schema migrations built into the database module. The app upgrades the database automatically on launch.
  • Exchange rates cached locally to minimize network requests. Only fetched when needed, only re-fetched after 24 hours.
  • All chart rendering via Cairo on GTK DrawingAreas. No web views, no JavaScript, no Electron.
  • Monotone Hermite interpolation for chart curves. Guarantees smooth lines that pass through every data point without overshooting.

Dependencies

The core dependencies, all freely licensed:

Crate Purpose
gtk4 GUI toolkit
libadwaita GNOME UI patterns
rusqlite SQLite bindings (bundled)
cairo-rs 2D rendering for charts
reqwest HTTP client for exchange rates
tokio Async runtime
serde / serde_json Serialization
chrono Date and time handling
genpdf PDF report generation
pdf-extract PDF statement parsing
csv CSV reading/writing
zip Backup archive creation
ksni System tray (freedesktop DBus)
rand Demo data generation
thiserror Error type definitions

💾 Data Storage

All data lives in a single SQLite file:

~/.local/share/outlay/outlay.db

The database contains 19 tables covering transactions, categories, budgets, recurring items, subscriptions, goals, credit cards, wishlist items, tags, splits, templates, rules, streaks, achievements, attachments, exchange rates, notifications, and settings.

There is no cloud component. Your financial history never leaves your machine unless you explicitly export or back it up. This is by design - financial data is deeply personal, and keeping it local is the most straightforward way to ensure it stays under your control.

Schema migrations happen automatically. When a new version adds tables or columns, the app detects the current schema version and applies the necessary changes on launch.


📦 Packaging

AppImage

The recommended distribution format. Built on Ubuntu 22.04 for broad glibc compatibility.

The AppImage bundles:

  • GTK4 and libadwaita libraries
  • GLib schemas and Adwaita theme
  • Bundled fonts (JetBrains Mono for the UI, Liberation Sans for PDF reports)
  • All icon assets
  • Optional: Tesseract OCR engine and language data

Build it yourself:

./scripts/build-appimage.sh

The resulting AppImage is a single file that runs on any modern Linux distribution without installation. Download it, make it executable, run it. When a new version comes out, replace the file. No package managers, no repositories, no gatekeepers.

Environment Variables

The AppImage sets:

  • GDK_BACKEND=wayland,x11 - Wayland-first with X11 fallback
  • Font configuration for bundled typefaces
  • GSettings schema paths for desktop integration

🤝 Contributing

Outlay is public domain software. There are no contributor license agreements, no copyright assignment forms, and no corporate ownership to navigate. If you want to help, help. If you want to fork it and take it in a different direction, do that. The code belongs to everyone equally.

Some ways to contribute:

  • Report bugs: Open an issue describing what happened and how to reproduce it
  • Suggest features: Ideas are welcome, especially ones that help people manage money without being patronizing about it
  • Submit patches: Fork, branch, make your changes, open a pull request
  • Translate: The UI strings could use localization for non-English speakers
  • Test: Run it on different distributions, window managers, and screen sizes
  • Share: Tell someone who might find it useful

There is no formal governance structure. Good ideas get merged. Decisions are made by the people doing the work.


⚖️ License

CC0

Outlay is released under the CC0 1.0 Universal public domain dedication.

To the extent possible under law, the author has waived all copyright and related or neighboring rights to this work. You can copy, modify, distribute, and perform the work, even for commercial purposes, all without asking permission.

This is not "open source with conditions." This is public domain. It belongs to no one and everyone simultaneously. Use it however you see fit.

See CC0 1.0 Universal for the full legal text.


Built with care for people who want to understand where their money goes.
No tracking. No ads. No subscriptions. No data collection. No corporate interests.
Just software that belongs to the commons.

Description
Personal finance and expense tracking app built with Rust, GTK4 and libadwaita
Readme 4.1 MiB
Outlay v1.0 Latest
2026-03-03 22:18:04 +02:00
Languages
Rust 98.9%
CSS 0.7%
Shell 0.4%