Subs

Subs

Docker app from grtgbln's Repository

Overview

A simplistic open-source subscription cost tracker

Subs

Open source subscription tracker built for people who want a fast, simple way to understand recurring costs.

Subs helps you log your subscriptions, view totals across currencies, and keep track of upcoming payments without sending your data to third-party services.

Live Demo

Try it now: subs.ajnart.fr

Demo GIF

What You Can Do

  • Add, edit, and delete subscriptions
  • Track billing cycles (daily, weekly, monthly, yearly)
  • Show next payment date with automatic future-date calculation
  • Search, sort, and filter subscriptions
  • View totals in multiple currencies with conversion rates
  • Import and export your subscriptions as JSON
  • Use keyboard shortcuts for common actions
  • Use a responsive interface on desktop and mobile

Tech Stack

  • Remix + React
  • Tailwind CSS + shadcn/ui
  • Zustand for client-side state
  • Playwright for end-to-end tests
  • Biome for linting/formatting

Storage Options

Subs supports two persistence modes:

  1. Browser storage
  2. Server-side JSON file storage

The mode is controlled by USE_LOCAL_STORAGE.

  • USE_LOCAL_STORAGE=true: use browser local storage
  • USE_LOCAL_STORAGE=false (default): use server endpoint storage in data/config.json

Quick Start

Requirements

  • Node.js 20+
  • npm or Bun

Install

Using npm:

npm install

Using Bun:

bun install

Run Development Server

Using npm:

npm run dev

Using Bun:

bun run dev

Open http://localhost:3000.

Scripts

  • npm run dev - start local development server
  • npm run build - create production build
  • npm run start - run production build
  • npm run test - run Playwright tests
  • npm run test:ui - open Playwright UI mode
  • npm run typecheck - TypeScript type checking
  • npm run lint - lint with Biome
  • npm run format - format with Biome

Docker

Run with Docker:

docker run -p 7574:7574 -v ./data:/app/data --name subs --rm ghcr.io/ajnart/subs

Then open http://localhost:7574.

Docker Compose

services:
  subs:
    image: ghcr.io/ajnart/subs
    container_name: subs
    ports:
      - "7574:7574"
    restart: unless-stopped
    volumes:
      - ./data:/app/data
    # environment:
    #   - USE_LOCAL_STORAGE=true

Start it:

docker compose up -d

Keyboard Shortcuts

  • n - open Add Subscription
  • / - focus Search
  • Ctrl/Cmd + e - export JSON
  • Ctrl/Cmd + i - import JSON
  • ? - open keyboard shortcuts dialog
  • Escape - close open dialog/popover

Project Structure

  • app/routes/_index.tsx - main dashboard view
  • app/components/ - UI and feature components
  • app/store/subscriptionStore.ts - subscription state and persistence
  • app/utils/nextPaymentDate.ts - billing cycle date logic
  • tests/ - Playwright test suite

Contributing

Contributions are welcome.

  1. Fork and clone the repository.
  2. Create a feature branch.
  3. Run checks before opening a PR:
npm run typecheck
npm run test
  1. Open a pull request with a clear description of changes.

License

MIT

Install Subs on Unraid in a few clicks.

Find Subs in Community Apps on your Unraid server, review the template, and click Install. Unraid handles the Docker app or plugin setup from the published template.

Open the Apps tab on your Unraid server Search Community Apps for Subs Review the template variables and paths Click Install

Related apps

Details

Repository
ghcr.io/ajnart/subs:latest
Last Updated2026-07-15
First Seen2024-10-13

Runtime arguments

Web UI
http://[IP]:[PORT:3000]
Network
bridge
Privileged
false

Template configuration

Web UI PortPorttcp

Container Port: 3000

Target
3000
Default
3000
Value
3000
Database PathPathrw

Database directory

Target
/database
Default
/mnt/user/appdata/subs/database
Value
/mnt/user/appdata/subs/database
Database URLVariable

Internal database URL

Target
DATABASE_URL
Default
file:/database/db.sqlite
Value
file:/database/db.sqlite
Use KV DatabaseVariable

Use KV database instead of localStorage

Target
NEXT_PUBLIC_USE_SQLITE
Default
false|true