Overview
Discover what makes ExpenseOwl powerful
ExpenseOwl is a lightweight, single‑user expense tracking service designed for self‑hosting scenarios where speed and simplicity trump feature breadth. From a developer’s perspective, it exposes a minimal yet well‑structured API surface, leverages a modern JavaScript stack for the front end, and packs all runtime dependencies into a single binary or multi‑arch Docker image. The application focuses on three core use cases: adding transactions, visualizing monthly spend by category, and exporting/importing data. It intentionally omits complex budgeting, account hierarchies, or multi‑user authentication to keep the codebase approachable and the runtime footprint low.
Transaction CRUD
Category Management
Recurring Scheduler
Export/Import
Overview
ExpenseOwl is a lightweight, single‑user expense tracking service designed for self‑hosting scenarios where speed and simplicity trump feature breadth. From a developer’s perspective, it exposes a minimal yet well‑structured API surface, leverages a modern JavaScript stack for the front end, and packs all runtime dependencies into a single binary or multi‑arch Docker image. The application focuses on three core use cases: adding transactions, visualizing monthly spend by category, and exporting/importing data. It intentionally omits complex budgeting, account hierarchies, or multi‑user authentication to keep the codebase approachable and the runtime footprint low.
Technical Stack
| Layer | Technology | Rationale |
|---|---|---|
| Backend | Go (1.22+) | Compiled to a static binary, enabling zero‑dependency deployments and fast startup times. |
| Web Framework | net/http + html/template (no heavy frameworks) | Keeps the server lightweight; all rendering is done via embedded templates. |
| Persistence | SQLite (file‑based) | Provides ACID guarantees for a single‑user environment without the need for a separate DB service. |
| Frontend | Vue.js 3 (ESM) + Vite | Enables reactive UI components, interactive charts (Chart.js), and PWA capabilities. |
| Containerization | Docker multi‑arch (amd64, arm64) with a slim base image (Alpine) | Ensures the container runs on mainstream cloud providers and edge devices. |
The Go server exposes a small RESTful API (/api/v1/...) that the Vue front end consumes. All data is persisted in a single SQLite file (data.db), which the container can mount as a volume for persistence across restarts. The binary is built with -ldflags "-s -w" to strip debug symbols, keeping the image size under 30 MB.
Core Capabilities & APIs
- Transaction CRUD: Endpoints for creating, listing, updating, and deleting transactions. Each transaction includes
date,amount,category_id, optionaltags, and arecurringflag. - Category Management: CRUD for categories, including reordering and custom names. Categories are referenced by a UUID to avoid accidental renaming issues.
- Recurring Scheduler: A lightweight scheduler runs on server start, generating recurring transactions based on a cron‑like frequency (
daily,weekly,monthly). - Export/Import:
/api/v1/exportstreams CSV data;/api/v1/importaccepts a multipart file and replaces the current database (useful for backups or migrations). - Metrics Endpoint:
/metricsexposes Prometheus‑style counters (e.g.,transactions_total,recurring_runs) for observability. - Webhooks: Optional outbound POST hooks can be configured in settings to notify external services when a transaction is added or updated.
The API follows REST conventions and returns JSON payloads with appropriate HTTP status codes. Authentication is intentionally omitted; developers can wrap the service in an NGINX reverse proxy with basic auth or integrate it into a larger authentication layer if needed.
Deployment & Infrastructure
- Self‑Hosting: The application can run on any machine that supports Go binaries or Docker. For non‑Docker users, a single binary plus SQLite file is all that’s required.
- Container Orchestration: The Docker image includes a
docker-entrypoint.shthat initializes the database schema on first run. A typical deployment in Docker Compose looks like:
services:
expenseowl:
image: tanq16/expenseowl:latest
volumes:
- ./data:/app/data
ports:
- "8080:80"
- Scalability: Designed for single‑user workloads; however, the stateless API and SQLite file can be replicated across a cluster with shared storage (e.g., NFS) if a multi‑user scenario is required. For higher throughput, replace SQLite with PostgreSQL and adjust the migration scripts accordingly.
- Resource Footprint: The binary consumes <10 MiB RAM on startup; peak usage stays below 30 MiB even under moderate load. CPU usage is negligible, making it suitable for Raspberry Pi or cloud micro‑instances.
Integration & Extensibility
- Plugin Architecture: While no built‑in plugin system exists, the Go codebase exposes a simple
pluginspackage that can be extended by importing additional modules. Developers can add new endpoints or modify the scheduler without altering the core server. - Webhooks & Callbacks: The optional webhook feature allows integration with external services such as Slack, email notifications, or custom dashboards. Payloads include full transaction data and can be signed with HMAC for security.
- Custom Frontend: The Vue app is bundled as static assets; developers may replace it with a custom UI that consumes the same API, enabling mobile apps or desktop Electron wrappers.
- PWA Support: The front end registers a service worker and includes
manifest.json, allowing installation on Android, iOS (via Safari), and desktop browsers. This makes it possible to use the app offline while still syncing with the backend when online.
Developer Experience
- Configuration: All settings are stored in a JSON file (
config.json) that the server reads on startup. Developers can tweak defaults (currency symbol, start date) without recompiling. - Documentation: The GitHub repository contains a comprehensive
README.mdwith API reference, data model diagrams, and deployment examples. The code is well‑
Open SourceReady to get started?
Join the community and start self-hosting ExpenseOwl today
Related Apps in other
Immich
Self‑hosted photo and video manager
Syncthing
Peer‑to‑peer file sync, no central server
Strapi
Open-source headless CMS for modern developers
reveal.js
Create stunning web‑based presentations with HTML, CSS and JavaScript
Stirling-PDF
Local web PDF editor with split, merge, convert and more
MinIO
Fast, S3-compatible object storage for AI and analytics
Weekly Views
Repository Health
Information
Explore More Apps
Odoo
All-in-one open source business suite
Snapcast
Synchronized multiroom audio for your existing player
Pangolin
Secure tunneled reverse proxy for any network
Swetrix
Privacy‑first web analytics without cookies
HeyForm
Build conversational forms without code
MyIP
All‑in‑one IP and network diagnostics tool