Never miss a renewal again. RenewVault tracks every contract, licence, subscription, certificate and insurance policy your business depends on — computes its status from the expiry date, emails the right person before it lapses, escalates when it does, and keeps an immutable record of every renewal.
Built on Frappe Framework v16 with a Frappe UI (Vue 3) single-page front end.
| Track anything with an expiry | Contracts, licences, AMCs, insurance, domains, certifications — modelled as Tracked Items with type, vendor, owner, assignee, issue/expiry dates and notes. |
| Status computes itself | Every item is Active → Expiring Soon → Expired (or Cancelled), derived from the expiry date on every save and re-derived nightly, so a list is never stale. The "expiring soon" window is configurable. |
| Reminders that actually fire | Per-item reminder rules ("30 days before", "7 days before") send email + in-app notification to the assignee, falling back to the owner. Every send is logged, and the log is checked first — so a reminder is never sent twice. |
| Escalation after expiry | Once an item lapses, RenewVault keeps nagging on a configurable interval until someone acts. |
| Renew in one click, with history | Renewing writes a Renewal History record — old expiry, new expiry, who did it, when, plus the renewal document as an attachment — then rolls the item forward. The history is append-only. |
| Manager dashboard | Counts by status and a "needs attention" queue sorted by urgency. |
| Real access control | RenewVault User sees only the items they own or are assigned; RenewVault Manager sees everything. Enforced server-side by permission-query + has_permission hooks — not just hidden buttons in the UI. |
| Full audit trail | Reminder Log and Renewal History give you a defensible answer to "were we warned?" |
A Frappe UI SPA at /renew_vault:
- Tracked Items — searchable, filterable list (title/vendor search; type, vendor, status, owner, assignee filters), sorted by expiry ascending.
- Item detail — fields, reminder rules, attachments, renewal history and reminder audit; Renew / Cancel / Edit actions.
- New / Edit forms — including an inline reminder-rule editor.
- Dashboard — status counts + needs-attention queue (managers only).
- Settings — expiring-soon window and escalation interval (managers only).
The Frappe desk UI works too — every DocType is a first-class desk form.
Tracked Item ──< Reminder Rule (child: days_before, label)
│
├──< Renewal History (old_expiry, new_expiry, renewed_by, renewed_on, attachment)
└──< Reminder Log (rule_days_before, sent_on, recipient, channel, status, error)
Document Type (master)
Vendor (master: title, contact_email)
RenewVault Settings (single: expiring_soon_days, escalation_interval)
cd $PATH_TO_YOUR_BENCH
bench get-app https://github.com/jkonoor/Renew_Vault.git --branch version-16
bench --site your.site install-app renew_vaultThe nightly job is registered via scheduler_events; make sure the bench
scheduler is enabled (bench --site your.site enable-scheduler).
cd apps/renew_vault/frontend
yarn install
yarn build # or: yarn dev for HMR against the siteBackend (Frappe/unittest) and end-to-end (Playwright, driving the real SPA):
bench --site your.site run-tests --app renew_vault # backend suite
npx playwright test # e2e suiteE2E specs live in e2e/tests/ with shared auth/seeding helpers in
e2e/helpers/; auth + CSRF are handled once by auth.setup.ts. CI runs both
on every push (.github/workflows/).
RenewVault was built with the tracer-bullet method from The Pragmatic Programmer — five phases, each a thin vertical slice through DocType → controller → API → SPA, tested and browser-verified before the next one started. The specs are checked in:
| Phase | Spec |
|---|---|
| 1 — Tracer bullet: Tracked Item, computed status, SPA list | specs/01_tracer_bullet_tracked_item.md |
| 2 — Full item + masters + CRUD UI | specs/02_full_item_masters_crud.md |
| 3 — Reminders + escalation (daily job) | specs/03_reminders_escalation.md |
| 4 — Renewals + actions + dashboard | specs/04_renewals_actions_dashboard.md |
| 5 — RBAC + polish + tests | specs/05_rbac_polish_tests.md |
PROGRESS.md is the build log: every slice records what changed, what was
tested, and what was verified in a real browser. Bug fixes ship with a
regression test that was confirmed to fail before the fix.
cd apps/renew_vault
pre-commit installPre-commit runs ruff, eslint, prettier and pyupgrade. Commits follow
Conventional Commits.
Joshy Sunny — jkonoor.official@gmail.com Available for Frappe / ERPNext consulting and full-stack development.