MB, Musa Burke, home

All work

Renewly

A shared dashboard that tells small teams the last day they can safely cancel each paid tool, before it auto-renews.

Renewly dashboard with sample data. Ten tracked contracts, £1,923 monthly spend, and the three closest last-safe-cancel dates.
Year
2026
Role
Dashboard, design, contract logic, database rules and security. Built with a friend.
Stack
Next.js, TypeScript, Supabase, TanStack Query, Tailwind CSS
Code
GitHub

The problem

Small teams pay for many tools, and contracts don’t just “renew on a date”. They say things like “auto-renews annually unless cancelled 60 days before”. The date that costs money is the last day you’re allowed to cancel, and nobody owns it.

What Renewly does

Renewly works out a last-safe-cancel date from each contract’s renewal date and notice rule, including month-end dates and leap years. Around that: one shared list of every tool with its cost, owner and team, a renewals view of what needs a decision soon, spend analytics, and alerts before each window closes.

How it’s built

  • Next.js App Router and TypeScript.
  • Supabase for Postgres, auth and Row Level Security. Every contract is scoped to its organisation at the database level, not only hidden in the UI.
  • TanStack Query for server state with optimistic updates; Zustand only for the session.
  • Team invites by email (Resend), with role checks enforced in the database.

My part

I built Renewly with a friend, and we planned the flow and the tools together before writing code. My side: the dashboard and the whole design, the logic for adding contracts, the rules and relationships in the Supabase database, and teams with owner and member permissions. I also tested it for security and set up email 2FA, account deletion and invite email. Several things are still unfinished.

What I learned

It was my first time working with a database, a login system and a user base, so most of what I learnt was about protecting data: using SQL and Supabase to set the rules, stopping people reaching other accounts’ data by changing the URL and keeping the backend hidden from the frontend. It also showed me how much communication with a collaborator matters, and how important file and variable naming gets across a huge number of files.