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.

01

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.

02

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.

TasksHabitsPomodoroProjectsNotesTime TrackingStudyReadingsWorkoutsFinanceRemindersBillingArticles

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.

one auth boundaryone Postgres schemaone design systemone data-access path

adding a module is the same shape of work as the last one

Thirteen feature modules, one shared foundation underneath.

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.

03

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.

01

Session check

Validates the HTTP-only session cookie before anything else runs.

02

Zod validation

Parses and validates the input against a typed schema.

03

Prisma write

Reads or writes Postgres through the native pg driver adapter.

04

Revalidate cache

Invalidates the affected Next.js cache paths.

05

Typed result

Returns a typed success/error result — never a thrown exception.

21 action modules · ~10,200 lines · no REST layer for app data

Every Server Action follows the same five-step contract.

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

A module clears three gates before it reaches a user's sidebar.

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.

Installs as a PWA with an offline fallbackA calendar integration pulls meetings onto the dashboard
The background layer that runs with no one watching.
04

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

05

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.

lint
typecheck
unit
e2e