Noureddine RAMDI / SubTrackr: a lightweight subscription tracker with Docker-first deployment in Go

Created Sat, 23 May 2026 20:41:14 +0000 Modified Sat, 23 May 2026 20:41:27 +0000

bscott/subtrackr

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

  1. Create a docker-compose.yml file 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
  1. Start the container:
docker-compose up -d
  1. 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.


→ GitHub Repo: bscott/subtrackr ⭐ 427 · Go