Subscription management is a task most developers and teams wish was easier out of the box. Tracking recurring costs across multiple services, currencies, and payment schedules often ends up in spreadsheets or costly SaaS tools. SubTrackr tackles this problem with a surprisingly simple approach: a single-file SQLite database, a Go backend, and a Docker-first deployment model that requires no external dependencies. The result is a lightweight, self-hosted subscription tracker you can run anywhere with minimal fuss.
What SubTrackr does and how it’s built
SubTrackr is a subscription tracking application written in Go. It focuses on simplicity and minimal setup while providing the core features you’d expect from a subscription manager: recording subscriptions, tracking billing cycles, and optionally converting currencies.
Architecturally, SubTrackr is a single backend service exposing a web interface on port 8080. It uses SQLite as its database, stored as a file within a Docker volume, making it easy to back up or migrate. The backend is built with the Gin web framework, evident from the environment variable GIN_MODE=release used in the Docker configs.
A notable design choice is that SubTrackr has zero external dependencies out of the box. It doesn’t require an external database server or additional services. This design keeps the deployment footprint small and the operational complexity low.
Currency conversion is supported but optional. If you provide a Fixer.io API key via environment variables, SubTrackr can automatically convert subscription costs to your preferred currency. This feature adds convenience for users managing subscriptions across multiple currencies but doesn’t add complexity for those who don’t need it.
Regarding platform support, the project offers multi-architecture Docker images supporting AMD64 and ARM64, including Apple Silicon. This means it runs natively on most modern desktop and server platforms without emulation.
Technical strengths and design tradeoffs
What distinguishes SubTrackr is its pragmatic simplicity. Using SQLite as a file-based database aligns well with the goal of zero external dependencies. SQLite is battle-tested, lightweight, and sufficient for the scale of data a subscription tracker typically handles.
The Docker-first approach is another strength. The provided Docker Compose file demonstrates a clear, minimal configuration:
version: '3.8'
services:
subtrackr:
image: ghcr.io/bscott/subtrackr:latest
container_name: subtrackr
ports:
- "8080:8080"
volumes:
- ./data:/app/data
environment:
- GIN_MODE=release
- DATABASE_PATH=/app/data/subtrackr.db
# Optional: Enable automatic currency conversion (requires Fixer.io API key)
# - FIXER_API_KEY=your_fixer_api_key_here
restart: unless-stopped
This pattern ensures data persistence through volume mounts and promotes a production-friendly restart policy. The environment variables allow runtime configuration without rebuilding the image.
The choice of Gin for the web framework suggests a focus on performance and simplicity. Gin is known for a straightforward API and efficient routing, which supports responsive UI interactions even under moderate load.
The tradeoff here is that SQLite and file-based storage might limit scalability if you want to track thousands of subscriptions or have many concurrent users. However, for personal or small-team use cases, this tradeoff favors ease of deployment and maintenance.
The optional currency conversion depends on an external API, which breaks the zero-dependency promise when enabled. This is a conscious design choice to keep the core system simple, letting users opt-in to this feature as needed.
Quick start with Docker
SubTrackr provides a very clear path to get started using Docker, which is recommended for most users.
Option 1: Docker Compose
- Create a
docker-compose.ymlfile with the following contents:
version: '3.8'
services:
subtrackr:
image: ghcr.io/bscott/subtrackr:latest
container_name: subtrackr
ports:
- "8080:8080"
volumes:
- ./data:/app/data
environment:
- GIN_MODE=release
- DATABASE_PATH=/app/data/subtrackr.db
# Optional: Enable automatic currency conversion (requires Fixer.io API key)
# - FIXER_API_KEY=your_fixer_api_key_here
restart: unless-stopped
- Start the container:
docker-compose up -d
- Access the UI by opening your browser at
http://localhost:8080.
Option 2: Docker Run
For a quicker test without Docker Compose, run:
docker run -d \
--name subtrackr \
-p 8080:8080 \
-v $(pwd)/data:/app/data \
-e GIN_MODE=release \
ghcr.io/bscott/subtrackr:latest
This command runs the container in detached mode, exposing port 8080 and persisting data locally.
Verdict
SubTrackr is a solid choice if you want a no-frills, self-hosted subscription tracker that you can deploy quickly with Docker. Its zero external dependencies design and SQLite backend make it lightweight and easy to maintain.
It’s particularly suited for individuals or small teams managing a moderate number of subscriptions without needing complex multi-user features or enterprise-grade scalability.
The tradeoffs — file-based storage and optional dependency on an external currency conversion API — are reasonable for this domain and clearly documented.
If you want a subscription tracker you can just spin up in a Docker container without fussing with databases or complex setups, SubTrackr is worth a look. For larger scale or multi-user SaaS requirements, this project might not fit out of the box but could still serve as a robust base for customization.
Related Articles
- rclone: modular Go CLI for syncing with 100+ cloud storage providers — rclone is a Go-based CLI tool for syncing files across 100+ cloud providers with features like data integrity checks, fl
- Sampler: lightweight terminal telemetry with Go-powered sparklines — Sampler is a Go CLI tool for terminal telemetry, visualizing server metrics via sparklines from various data sources. Ea
- Portracker: A lightweight self-hosted port monitoring tool with secure Docker proxy integration — Portracker is a self-hosted port monitoring tool with embedded SQLite and Docker socket proxy for secure, read-only Dock
- HolyClaude: a battle-tested Docker AI dev workstation solving real container quirks — HolyClaude bundles Claude Code, 7 AI CLIs, a headless browser, and 50+ dev tools in a Docker container that fixes 15+ re
- yt-dlp: modular extractor architecture for unified media downloading — yt-dlp is a Python CLI tool with 1,800+ site extractors for audio/video downloading, featuring extensible plugins, multi
→ GitHub Repo: bscott/subtrackr ⭐ 427 · Go