Renewlet is a self-hosted subscription ledger for tracking recurring charges and sending renewal reminders.
It records renewal dates, prices, currencies, categories, payment methods, logos, budgets, notes, and notification settings. It can run as a single Docker container, or on Cloudflare Workers with D1, R2, and Cron Triggers.
- Subscription records with billing cycles, statuses, tags, websites, notes, logos, categories, and payment methods.
- Reminder jobs based on each user's IANA time zone, local notification time, reminder days, repeat reminders, delivery history, and failed-send retries.
- Notifications through Telegram, Notifyx, Webhook, WeCom Bot, SMTP email, Bark, and ServerChan.
- Monthly and yearly cost normalization, budget usage, category charts, payment-method charts, and inactive-subscription savings.
- AI recognition for bill screenshots, notes, CSV/TSV, and pasted table text; drafts are reviewed before import.
- Global private ICS feed and per-subscription calendar feeds.
- Public subscription status pages with per-subscription visibility and optional price display.
- Import and export for Renewlet data, old Renewlet
subscriptions.json, and Wallos files. - Uploaded logos, image URLs, built-in icon sources, and favicon fallback suggestions.
- Docker deployment with React, Go/PocketBase, SQLite, and static assets in one container.
- Cloudflare Workers deployment with React static assets, Worker API, D1, R2, and Cron Triggers.
- Mobile web views for subscriptions, filters, statistics, calendar, and settings.
Requirements: Docker and Docker Compose v2.
mkdir -p renewlet && cd renewlet
curl -fsSL https://raw.githubusercontent.com/zhiyingzzhou/renewlet/main/deploy/docker-deploy.sh | bash
docker compose up -dOpen:
http://localhost:3000/setup
The deploy script creates docker-compose.yml, .env, and data/, then writes PB_ENCRYPTION_KEY and CRON_SECRET.
For production, pin a stable image tag:
sed -i.bak 's#RENEWLET_IMAGE=.*#RENEWLET_IMAGE="zhiyingzzhou/renewlet:0.1.0"#' .env
docker compose pull
docker compose up -dIf Docker Hub is unavailable, use GHCR:
RENEWLET_IMAGE="ghcr.io/zhiyingzzhou/renewlet:0.1.0"Demo Mode uses the same image and login page:
RENEWLET_DEMO_MODE="true"Visitors sign in with demo@renewlet.local / renewlet-demo. Demo data resets on startup and every 2 hours, while setup and real external side effects are disabled.
Use the deploy button for a Cloudflare-managed repository, or follow Cloudflare Workers deploy to manage D1, R2, GitHub Actions, and secrets yourself.
Do not click the deploy button again to upgrade. One-click deploy users update the repository connected in Cloudflare Builds; manual deploy users sync their fork and run Cloudflare Worker. Cloudflare updates must apply D1 migrations before publishing the Worker.
Back up data and config before upgrading:
tar -czf renewlet-backup-$(date +%F).tgz .env docker-compose.yml dataIf you deployed Renewlet before 2026-06-04, open the old version before upgrading and export subscriptions.json from Export subscriptions. After upgrading, import it from Import data. This file is only for subscription migration; keep the backup above as well.
Upgrade with Docker Compose:
sed -i.bak 's#RENEWLET_IMAGE=.*#RENEWLET_IMAGE="zhiyingzzhou/renewlet:0.1.0"#' .env
docker compose pull
docker compose up -d
docker compose logs -fDocker release images with the current binary layout can also update from the version badge at the top of Renewlet. Older images must run docker compose pull && docker compose up -d once before in-app updates become available.
docker compose ps
docker compose logs -f
docker compose downCommon .env values:
| Variable | Purpose |
|---|---|
PORT |
Public port, 3000 by default. |
RENEWLET_IMAGE |
Docker image, zhiyingzzhou/renewlet:latest by default. |
TZ |
Container time zone for logs. Reminder times use each user's time zone. |
PB_ENCRYPTION_KEY |
Encryption key for sensitive PocketBase settings. Do not rotate it casually after deployment. |
CRON_SECRET |
Bearer secret for external Cron calls to /api/cron/notifications. |
RENEWLET_DEMO_MODE |
Docker Demo Mode switch, false by default. |
NOTIFICATION_SCHEDULER_ENABLED |
Built-in notification scheduler switch, true by default. |
The full Docker environment template is in .env.example.
AI recognition
|
Public subscription status page
|
Subscriptions
|
Statistics
|
Renewal calendar
|
Notifications
|
Mobile subscriptions
|
Mobile notification methods
|
Issues, documentation fixes, tests, and pull requests are welcome. For larger changes, open an issue first with the goal, use case, and rough approach.
- LINUX DO: Renewlet thanks the LINUX DO community for open-source project discussion.
Renewlet is open-sourced under the MIT License.








