- Change app ID from io.github.outlay to com.outlay.app across all files - Add AppStream metainfo with full feature description, 16 screenshots, and v0.1.0 release - Update desktop file with expanded metadata (StartupNotify, SingleMainWindow) - Add summary and description fields to GSchema keys - Move toast overlay outside ScrolledWindow so notifications stay visible in viewport - Embed tray icon as ARGB pixmap data for reliable system tray display - Register hicolor icon theme path for taskbar icon on Wayland - Remove unused icon variants (old naming, web favicons, SVG, ICO, shadow) - Add screenshots to data/screenshots/ - Update build script with metainfo and screenshot bundling
Outlay
Personal finance for people, not corporations.
Track expenses, plan budgets, and take direct control of your money.
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
- Features at a Glance
- Installation
- Building from Source
- Views and Functionality
- Import and Export
- Multi-Currency Support
- Notifications
- System Tray
- Keyboard and Workflow
- Architecture
- Data Storage
- Packaging
- Contributing
- License
🧭 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
AppImage (Recommended)
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+3and it evaluates to15.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
.outlaybackup 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. |
| 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. |
| 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 databasesettings.json- All application settingsmeta.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+taxor100/3and 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
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.