Mingüini is an all-in-one personal productivity platform — habits, tasks, projects, focus sessions, time tracking, and a lot more, all in one place instead of five separate subscriptions. It's live in alpha today at minguini.com.
The pitch is simple: replace your entire productivity stack with one app. But a simple pitch hides a hard engineering problem — thirteen feature modules sharing one auth boundary and one database is exactly the kind of surface area that turns into a mess unless every module is built the same way.
This case study covers both sides of that bet: the product decision to go all-in-one instead of shipping one more single-purpose app, and the architecture that keeps that many modules from drifting apart.
The Challenge
The everyday version of the problem is the one the product itself answers: most people manage their day across five different apps — a task manager, a Pomodoro timer, a habit tracker, a project manager, a time tracker — each with its own subscription, its own data model, and no shared context between them.
The harder version is the one we had to solve to build it. "All-in-one" is exactly where most productivity products collapse, into either a bloated everything-app or a shallow one that does nothing well. Thirteen feature areas — tasks, habits, pomodoro, projects, notes, time tracking, study, readings, workouts, money, reminders, billing, and articles — sharing one auth boundary, one database, and one UI language is a surface area that turns into a mess unless every module is built the same way from day one.
The Approach
We settled on one data model, one auth boundary, one design system, and exactly one way to read or write data. Every module, from Tasks to Finance, is a thin vertical slice over the same primitives, so adding a new one is the same shape of work as the last one, not a bespoke integration.
One shared foundation
Every module is a thin vertical slice over the same primitives, so adding one is the same shape of work as the last.
adding a module is the same shape of work as the last one
The other decision was to let the product grow in public without growing complicated. Modules ship behind a global feature-flag layer admins can toggle instantly, and every user can hide the modules they personally don't use — so the sidebar of an all-in-one app is only ever as big as the stack that one person actually wants.
One Data Model, Thirteen Modules
Next.js 16 on the App Router with React Server Components and React 19. Server Actions are the only data-access path — 21 action modules, about 10,200 lines, each following the same contract: session check, Zod validation, a Prisma write, a cache revalidation, and a typed success/error result. There's no REST layer for app data at all, which is exactly what keeps thirteen modules from drifting apart.
Session check
Validates the HTTP-only session cookie before anything else runs.
Zod validation
Parses and validates the input against a typed schema.
Prisma write
Reads or writes Postgres through the native pg driver adapter.
Revalidate cache
Invalidates the affected Next.js cache paths.
Typed result
Returns a typed success/error result — never a thrown exception.
21 action modules · ~10,200 lines · no REST layer for app data
PostgreSQL through Prisma 7 on the native pg driver adapter: an 808-line schema, 36 models and 14 enums, 43 ordered migrations, and a hard no-drift policy — every schema change is a real migration, never a push. Composite indexes carry the heavier UI, like the five-day drag-and-drop task board with optimistic reordering. Auth is email/password plus Google OAuth, issuing HTTP-only session cookies validated on every route and every action.
Feature gating runs on two layers. A global flag lets us switch a module off for everyone instantly if something breaks, and a per-user preference lets each person hide the modules they don't personally use — so the sidebar of an all-in-one app never has to feel like one. Plan gating sits on top of that, with payment-provider webhooks keeping subscription status in sync for the paid tier.
Global flag · Admin-controlled
Switches a module off for everyone instantly if something breaks.
Plan gate · Webhook-synced
Payment-provider webhooks keep subscription status in sync for the paid tier.
User preference · Per-person
Each person hides the modules they don't personally use.
Sidebar
Only ever as big as the stack that one person actually wants.
the sidebar of an all-in-one app never has to feel like one
The parts that run with no one watching: a cron job checks every user's reminders once a minute, resolves each one against that user's own timezone, and delivers it as a real push notification through a service worker rather than an in-app toast. Mingüini installs as a PWA with an offline fallback instead of shipping a native app, and a calendar integration pulls the day's meetings straight onto the dashboard. The whole interface runs on one perceptually-uniform color system that adapts to light, dark, and a handful of user-picked palettes, served in English and Spanish from the same codebase.
Cron, every minute
Checks every user's reminders once a minute.
Per-user timezone
Resolves each reminder against that user's own timezone.
Service-worker push
Delivers it as a real push notification, not an in-app toast.
What We Shipped
Thirteen feature modules live behind one sidebar today:
Tasks
A five-day drag-and-drop board with optimistic reordering, deadlines, and auto-linkified URLs, plus a dashboard of reorderable, show/hide cards
Habits and Pomodoro
A monthly habit grid with streaks, and configurable focus/rest sessions with sounds, push notifications, and a backfillable session log
Projects, Notes, and Time Tracking
Pinning and soft delete, notes linked to projects, and hours logged against them with filters and summaries
Study, Readings, and Workouts
Topics and exam scheduling with flashcard decks and a study mode, a categorized reading list, and an exercise library with custom routines
Finance
Multi-currency income and expenses with installments, exchange rates, loans with amortization schedules, and long-range projections
Reminders, Billing, and Operations
An admin console with global module flags plus bug-report and feature-request queues, an in-app changelog, and an articles library
Results
Mingüini has been in continuous development for about six months, built and tested the way we'd build any production product:
437
commits since the first scaffold (Feb 2026)
~56,000
lines of TypeScript across 330 files
232
React components
36
database models across 43 migrations
941
unit tests across 27 suites
~149
Playwright E2E tests, desktop and mobile
A full pre-push gate
Runs locally before any change reaches the shared branch, with 100% function coverage enforced on the server-action layer.




