Renewlet is a self-hosted subscription ledger for recurring expenses. See what you spend, what is due next, and get a reminder before renewal.
Run it in a single Docker container or deploy it to Cloudflare Workers.
Sign in with demo@renewlet.local / renewlet-demo. Data resets regularly; do not enter real information or credentials.
- Keep prices, billing cycles, renewal dates, payment methods, and notes in one place.
- Review monthly or yearly spending, track a budget, and convert between currencies.
- Send reminders in your timezone through Telegram, Notifyx, Webhook, WeCom, DingTalk, email, Bark, ServerChan, Discord, or PushPlus.
- Turn screenshots, notes, or tables into editable drafts, then review them before import. You can also import or export Renewlet data, or migrate from Wallos.
- Add all or individual subscriptions to a calendar, or share a public status page with prices hidden when needed.
- Secure the account with an authenticator, recovery codes, or passkeys, and optionally protect password login with Cloudflare Turnstile.
- Connect CLI tools, Shortcuts, and other automation through the read-only Public API.
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 -dAfter it starts, open:
http://localhost:3000/setup
Create the first administrator. 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.3.28"#' .env
docker compose pull
docker compose up -dIf Docker Hub is unavailable, use GHCR:
RENEWLET_IMAGE="ghcr.io/zhiyingzzhou/renewlet:0.3.28"Click the button to deploy. To manage the Cloudflare resources yourself, follow the Cloudflare Workers deployment guide.
For upgrades, update the existing repository as described in the guide instead of clicking the deploy button again.
Back up your data and configuration first:
tar -czf renewlet-backup-$(date +%F).tgz .env docker-compose.yml dataUpdate the Docker image:
sed -i.bak 's#RENEWLET_IMAGE=.*#RENEWLET_IMAGE="zhiyingzzhou/renewlet:0.3.28"#' .env
docker compose pull
docker compose up -d
docker compose logs -fYou can also update in the app by clicking the version number at the top of Renewlet and opening System Update.
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 |
Time zone for logs; reminders use each user's time zone. |
PB_ENCRYPTION_KEY |
Encryption key for sensitive settings. Do not change it after deployment. |
CRON_SECRET |
Bearer secret for external Cron requests. |
RENEWLET_DEMO_MODE |
Enables demo mode. false by default. |
RENEWLET_CUSTOM_HEAD_HTML |
Optional custom <head> content. Empty by default. |
NOTIFICATION_SCHEDULER_ENABLED |
Enables the built-in notification scheduler. true by default. |
HTTP_PROXY / HTTPS_PROXY / NO_PROXY |
Recommended proxy variables for outbound HTTP(S) requests from the Docker server. |
The full Docker environment template is in .env.example.
To proxy HTTP(S) requests made by the Docker server, set these values in .env:
HTTP_PROXY="http://host.docker.internal:7890"
HTTPS_PROXY="http://host.docker.internal:7890"
NO_PROXY="localhost,127.0.0.1,.local"Use the uppercase names by default. The lowercase alternatives are http_proxy, https_proxy, and no_proxy. Do not set both forms; when both are present, Go uses the uppercase value.
If the proxy runs on the host, use an address the container can reach instead of localhost or 127.0.0.1. Recreate the container after a change:
docker compose up -d --force-recreateTo add a third-party service such as Microsoft Clarity, copy the provider's <head> code into RENEWLET_CUSTOM_HEAD_HTML unchanged. Wrap multiline values in single quotes when using a Docker .env file.
Only add code you trust; it can access data on Renewlet pages. Restart the Docker container after a change, or rebuild and redeploy Cloudflare.
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.
Renewlet is open-sourced under the MIT License.








