Subtrackr
Self-hosted Subscription Tracker
Install / Use
/learn @bscott/SubtrackrREADME
SubTrackr
A self-hosted subscription management application built with Go and HTMX. Track your subscriptions, visualize spending, and get renewal reminders.



🎨 Themes
Personalize your SubTrackr experience with 5 beautiful themes:
<table> <tr> <td align="center"> <img src="screenshots/christmas.png" alt="Christmas Theme" width="600"/><br/> <b>Christmas 🎄</b><br/> Festive and jolly! (with snowfall animation) </td> </tr> <tr> <td align="center"> <img src="screenshots/ocean.png" alt="Ocean Theme" width="600"/><br/> <b>Ocean</b><br/> Cool and refreshing </td> </tr> <tr> <td align="center"> <img src="screenshots/login.png" alt="Login Page" width="600"/><br/> <b>Optional Authentication</b><br/> Secure your data with optional login support </td> </tr> </table>Available themes: Default (Light), Dark, Christmas 🎄, Midnight (Purple), Ocean (Cyan)
Themes persist across all pages and are saved per user. Change themes anytime from Settings → Appearance.
🚀 Features
- 📊 Dashboard Overview: Real-time stats showing monthly/annual spending
- 💰 Subscription Management: Track all your subscriptions in one place with logos
- 📅 Calendar View: Visual calendar showing all subscription renewal dates with iCal export and subscription URL
- 📈 Analytics: Visualize spending by category and track savings
- 🔔 Email Notifications: Get reminders before subscriptions renew
- 📱 Pushover Notifications: Receive push notifications on your mobile device
- 📤 Data Export: Export your data as CSV, JSON, or iCal format
- 🎨 Beautiful Themes: 5 stunning themes including a festive Christmas theme with snowfall animation
- 🌍 Multi-Currency Support: Support for USD, EUR, GBP, JPY, RUB, SEK, PLN, INR, CHF, BRL, COP, BDT, and CNY (with optional real-time conversion)
- 🤖 MCP Server: AI integration via Model Context Protocol for Claude and other AI assistants
- 🐳 Docker Ready: Easy deployment with Docker
- 🔒 Self-Hosted: Your data stays on your server
- 📱 Mobile Responsive: Optimized mobile experience with hamburger menu navigation
🏗️ Tech Stack
- Backend: Go with Gin framework
- Database: SQLite (no external database needed!)
- Frontend: HTMX + Tailwind CSS
- Deployment: Docker & Docker Compose
🚀 Quick Start
SubTrackr is available as a multi-platform Docker image supporting both AMD64 and ARM64 architectures (including Apple Silicon).
Note: SubTrackr works fully out-of-the-box with no external dependencies. The Fixer.io API key is completely optional for currency conversion features.
Option 1: Docker Compose (Recommended)
- Create docker-compose.yml:
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 SubTrackr: Open http://localhost:8080
Option 2: Docker Run
docker run -d \
--name subtrackr \
-p 8080:8080 \
-v $(pwd)/data:/app/data \
-e GIN_MODE=release \
ghcr.io/bscott/subtrackr:latest
# Optional: With currency conversion enabled
docker run -d \
--name subtrackr \
-p 8080:8080 \
-v $(pwd)/data:/app/data \
-e GIN_MODE=release \
-e FIXER_API_KEY=your_fixer_api_key_here \
ghcr.io/bscott/subtrackr:latest
Option 3: Build from Source
- Clone the repository:
git clone https://github.com/bscott/subtrackr.git
cd subtrackr
- Build and run with Docker Compose:
docker-compose up -d --build
🐳 Deployment Guides
Portainer
-
Stack Deployment:
- Go to Stacks → Add Stack
- Name:
subtrackr - Paste the docker-compose.yml content
- Deploy the stack
-
Environment Variables (optional):
PORT=8080 DATABASE_PATH=/app/data/subtrackr.db GIN_MODE=release -
Volumes:
- Create a volume named
subtrackr-data - Mount to
/app/datain the container
- Create a volume named
Proxmox LXC Container
-
Create LXC Container:
# Create container (Ubuntu 22.04) pct create 200 local:vztmpl/ubuntu-22.04-standard_22.04-1_amd64.tar.gz \ --hostname subtrackr \ --memory 512 \ --cores 1 \ --net0 name=eth0,bridge=vmbr0,ip=dhcp \ --storage local-lvm \ --rootfs local-lvm:8 -
Install Docker in LXC:
pct start 200 pct enter 200 # Update and install Docker apt update && apt upgrade -y curl -fsSL https://get.docker.com | sh -
Deploy SubTrackr:
mkdir -p /opt/subtrackr cd /opt/subtrackr # Create docker-compose.yml nano docker-compose.yml # Paste the docker-compose content docker-compose up -d
Unraid
-
Community Applications:
- Search for "SubTrackr" in CA
- Configure paths and ports
- Apply
-
Manual Docker Template:
- Repository:
ghcr.io/bscott/subtrackr:latest - Port:
8080:8080 - Path:
/app/data→/mnt/user/appdata/subtrackr
- Repository:
Synology NAS
-
Using Docker Package:
- Open Docker package
- Registry → Search "subtrackr"
- Download latest image
- Create container with port 8080 and volume mapping
-
Using Container Manager (DSM 7.2+):
- Project → Create
- Upload docker-compose.yml
- Build and run
🔧 Configuration
Environment Variables
| Variable | Description | Default |
|----------|-------------|---------|
| PORT | Server port | 8080 |
| DATABASE_PATH | SQLite database file path | ./data/subtrackr.db |
| GIN_MODE | Gin framework mode (debug/release) | debug |
| FIXER_API_KEY | Fixer.io API key for currency conversion (optional) | None |
Currency Conversion (Optional)
SubTrackr supports automatic currency conversion using Fixer.io exchange rates:
Without API key: (Fully functional)
- Basic multi-currency support with display symbols
- Manual currency selection per subscription
- Subscriptions displayed in their original currency
- No automatic conversion between currencies
With Fixer.io API key:
- Real-time exchange rates (cached for 24 hours)
- Automatic conversion between any supported currencies
- Display original amount + converted amount in your preferred currency
Setup:
- Sign up for free at Fixer.io (1000 requests/month)
- Get your API key from the dashboard
- Add
FIXER_API_KEY=your_key_hereto your environment variables - Restart SubTrackr - currency conversion will be automatically enabled
Note: The free Fixer.io plan only allows EUR as the base currency. SubTrackr automatically handles cross-rate calculations (e.g., USD→INR goes through EUR) so all currency conversions work correctly regardless of this limitation.
Supported currencies: USD, EUR, GBP, JPY, RUB, SEK, PLN, INR, CHF, BRL, COP, BDT, CNY
Email Notifications (SMTP)
Configure SMTP settings in the web interface:
- Navigate to Settings → Email Notifications
- Enter your SMTP details:
- Gmail: smtp.gmail.com:587
- Outlook: smtp-mail.outlook.com:587
- Custom: Your SMTP server details
- Test connection
- Enable renewal reminders
Pushover Notifications
Receive push notifications on your mobile device via Pushover:
-
Get your Pushover credentials:
- Sign up at pushover.net (free account)
- Get your User Key from the dashboard
- Create an application at pushover.net/apps/build to get an Application Token
-
Configure in SubTrackr:
- Navigate to Settings → Pushover Notifications
- Enter your User Key and Application Token
- Click "Test Connection" to verify configuration
- Save settings
-
Notification Types:
- Renewal Reminders: Get notified before subscriptions renew (uses the same reminder days setting as email)
- High Cost Alerts: Receive alerts when adding expensive subscriptions (uses the same threshold as email alerts)
Note: Pushover notifications work alongside email notifications. Both will be sent when enabled, giving you multiple ways to stay informed about your subscriptions.
Data Persistence
Important: Always mount a volume to /app/data to persist your database!
volumes:
- ./data:/app/data # Local directory
# OR
- subtrackr-data:/app/data # Named volume
🔐 Security Recommendations
- Reverse Proxy: Use Nginx/Traefik for HTTPS
- Authentication: Add basic auth or OAuth2 proxy
- Network: Don't expose port 8080 directly to internet
- Backups: Regular backups of the data directory
Nginx Reverse Proxy Example
server {
server_name subtrackr.yourdomain.com;
location / {
proxy_pass http://localhost:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Traefik Labels
labels:
- "traefik.enable=true"
- "traefik.http.routers.subtrackr.rule=Host(`subtrackr.yourdomain.com`)"
- "traefik.http.routers.subtrackr.entrypoints=websecure"
- "traefik.http.r
