All apps · 0 apps
Subs
Docker app from grtgbln's Repository
Overview
A simplistic open-source subscription cost tracker
Readme
View on GitHubSubs
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
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:
- Browser storage
- Server-side JSON file storage
The mode is controlled by USE_LOCAL_STORAGE.
USE_LOCAL_STORAGE=true: use browser local storageUSE_LOCAL_STORAGE=false(default): use server endpoint storage indata/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 servernpm run build- create production buildnpm run start- run production buildnpm run test- run Playwright testsnpm run test:ui- open Playwright UI modenpm run typecheck- TypeScript type checkingnpm run lint- lint with Biomenpm 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 SearchCtrl/Cmd + e- export JSONCtrl/Cmd + i- import JSON?- open keyboard shortcuts dialogEscape- close open dialog/popover
Project Structure
app/routes/_index.tsx- main dashboard viewapp/components/- UI and feature componentsapp/store/subscriptionStore.ts- subscription state and persistenceapp/utils/nextPaymentDate.ts- billing cycle date logictests/- Playwright test suite
Contributing
Contributions are welcome.
- Fork and clone the repository.
- Create a feature branch.
- Run checks before opening a PR:
npm run typecheck
npm run test
- Open a pull request with a clear description of changes.
License
MIT
Categories
Related apps
Explore more like this
Explore allDetails
Repository
ghcr.io/ajnart/subs:latestLast Updated2026-10-14
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