Skip to content

NextCandy/renewlet

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

198 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Renewlet

Renewlet

简体中文 · English

Self-hosted React Go and PocketBase Docker Cloudflare Workers Mobile web Memory 20-30MiB MIT License

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.

Renewlet dashboard showing monthly spend, upcoming renewals, and spending distribution

Features

  • 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.

Docker Quick Start

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 -d

Open:

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 -d

If 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.

Cloudflare Workers

Deploy to Cloudflare

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.

Upgrade

Back up data and config before upgrading:

tar -czf renewlet-backup-$(date +%F).tgz .env docker-compose.yml data

If 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 -f

Docker 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.

Common Commands

docker compose ps
docker compose logs -f
docker compose down

Common .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.

Screenshots

AI recognition
Renewlet AI recognition dialog showing the input state before turning text content into editable subscription drafts
Public subscription status page
Renewlet public subscription status page showing public subscription totals, prices, and subscription cards
Subscriptions
Renewlet subscriptions view with filters, tags, statuses, and service logos
Statistics
Renewlet statistics view with budget usage, category spending, and payment method charts
Renewal calendar
Renewlet renewal calendar showing monthly renewal events and estimated spend
Notifications
Renewlet notification settings showing channels and email configuration

Mobile

Mobile subscriptions
Renewlet mobile subscriptions view with filters, subscription cards, logos, prices, and tags
Mobile notification methods
Renewlet mobile notification methods view showing the email channel and SMTP email configuration

Contributing

Issues, documentation fixes, tests, and pull requests are welcome. For larger changes, open an issue first with the goal, use case, and rough approach.

Acknowledgements

  • LINUX DO: Renewlet thanks the LINUX DO community for open-source project discussion.

License

Renewlet is open-sourced under the MIT License.

About

Self-hosted subscription tracker for recurring renewals, with timezone-aware reminders, six notification channels, budgets, and spending insights.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages

  • TypeScript 76.0%
  • Go 20.5%
  • JavaScript 1.9%
  • CSS 1.0%
  • Go Template 0.2%
  • HTML 0.2%
  • Other 0.2%