ENSO is a modern subscription and recurring-expense manager that stops you from bleeding money on forgotten services.
ENSO uses Supabase (Postgres + Auth) as its backend: your subscriptions, payment history and budgets are synced securely across all your devices, protected by Row Level Security so only you can ever read or write your own data.
It's also an Installable PWA: add it to your home screen on iOS, Android or Desktop for an app-like experience (the interface shell works offline, though creating/syncing data requires a connection).
- ☁️ Cloud Sync: Sign in with Email, Google or GitHub. Your data follows you across devices.
- 💳 Subscription CRUD: Track recurring subscriptions and one-time expenses with price, currency, category and billing cycle.
- 🗄️ Archive & Restore: Soft-delete subscriptions without losing their payment history; restore them anytime.
- 🧾 Payment History: Log real payments (paid / skipped / pending) per subscription and see actual vs. projected spend.
- 🔮 Cashflow Forecast: A 30-day predictive curve to visualize upcoming cumulative spending.
- 🏢 Workspaces: Separate "Personal" expenses from "Business" overheads.
- 📅 Visual Calendar: A monthly grid view to spot spending clusters and renewal dates.
- 💰 Budgets: Set a monthly limit per category and track it against real spend.
- 🔔 Smart Notifications: Native browser alerts a few days before a recurring payment is due.
- 🌍 Multi-Currency Support: Track in USD, EUR or GBP with real-time FX normalization for KPIs (via the Frankfurter API, with offline fallback rates).
- 📊 Interactive Analytics: Monthly Run Rate (MRR) and category distribution charts.
- ⚡ Command Palette (⌘K): Navigate and manage subscriptions without touching the mouse.
- 📥 Import / Export: Back up your data as JSON, or bulk-import from CSV.
- Framework: Next.js 16 (App Router,
proxy.tsroute protection) - Language: TypeScript
- Backend / Auth / DB: Supabase (Postgres, Auth, Row Level Security)
- PWA Engine:
next-pwa+ generated Service Worker - Styling: Tailwind CSS 4, Framer Motion,
clsx - UI Components: Shadcn UI (Radix Primitives)
- State Management: Zustand
- Forms & Validation: React Hook Form + Zod
- Logic:
date-fnsfor recurring date algorithms - Charts: Recharts
Follow these steps to run ENSO locally on your machine.
- Node.js 18+
- pnpm (recommended) or npm/yarn
- A free Supabase account/project
git clone https://github.com/EdvinCodes/enso.git
cd ensopnpm installENSO requires a Supabase project for auth and data storage — there is no local/offline data store.
- Create a project at supabase.com.
- In Project Settings > API, copy your Project URL and anon public key.
- In the SQL Editor, run the migration in
supabase/migrations/001_initial_schema.sql. This creates thesubscriptions,paymentsandbudgetstables with Row Level Security policies. - In Authentication > Providers, enable Email. Optionally enable Google and/or GitHub for social login.
- In Authentication > URL Configuration, add your callback URL as an allowed redirect URL:
http://localhost:3000/auth/callback(development)https://your-domain.com/auth/callback(production)
Copy the example file and fill in your Supabase credentials:
cp .env.example .env.localNEXT_PUBLIC_SUPABASE_URL=https://your-project.supabase.co
NEXT_PUBLIC_SUPABASE_ANON_KEY=your-anon-keypnpm devNavigate to http://localhost:3000. Register an account, then you'll be redirected straight to the dashboard.
src/
├── app/
│ ├── page.tsx # Landing Page (Marketing)
│ ├── login/, register/ # Auth pages
│ ├── auth/callback/ # OAuth code exchange route
│ ├── dashboard/ # The actual App (auth-protected)
│ └── globals.css # Tailwind & Global Styles
├── proxy.ts # Route protection (Next.js 16 Proxy, ex-middleware)
├── components/
│ ├── ui/ # Shadcn reusable components
│ └── command-menu.tsx # Command palette (⌘K)
├── features/
│ ├── subscriptions/ # Core Domain Logic (Components, Zustand Store, Zod Schema)
│ ├── calendar/ # Calendar View Logic
│ ├── dashboard/ # Forecast & KPI Charts
│ └── settings/ # Budgets, Archive, Backup/CSV import-export
├── lib/
│ ├── supabase.ts # Supabase browser client
│ ├── dates.ts # Centralized Date & Payment Logic
│ ├── forecast.ts # Cashflow Projection Algorithms
│ ├── currency.ts # Multi-currency FX normalization
│ └── notifications.ts # Browser Notification API Logic
└── supabase/
└── migrations/ # SQL schema & RLS policies- Core Subscription Management (CRUD)
- Supabase Cloud Sync + Auth (Email, Google, GitHub)
- Dashboard, Calendar & Budgets
- Smart Notifications
- PWA Support (Install on Mobile/Desktop)
- Cashflow Forecast
- Automated tests (unit / e2e)
- End-to-End Encryption for sensitive fields
- Bank API Integration (Plaid/GoCardless)
Contributions are welcome! If you find a bug or have a feature request, please open an issue.
- Fork the Project
- Create your Feature Branch (
git checkout -b feature/AmazingFeature) - Commit your Changes (
git commit -m 'Add some AmazingFeature') - Push to the Branch (
git push origin feature/AmazingFeature) - Open a Pull Request
Distributed under the MIT License. See LICENSE for more information.
Built with ❤️ by Edvin