
How to Make an App Like LiquidPlanner

How to Make an App Like LiquidPlanner
Project management software has quietly become one of the most competitive categories in B2B SaaS — and yet, most tools in the space still do the same thing: they let teams create tasks, assign owners, and drag bars around a Gantt chart. LiquidPlanner took a different path. Instead of asking users to guess a single deadline for every task, it asks for a best-case and worst-case estimate, then uses a predictive scheduling engine to model thousands of possible outcomes and tell you when work will probably finish.
That single design decision is what makes LiquidPlanner interesting to clone — and what makes it genuinely difficult to build. This guide walks through what it actually takes to make an app like LiquidPlanner, from the scheduling engine at its core to the architecture, tech stack, timeline, and budget you'll need.
What Makes LiquidPlanner Different
Before writing a line of code, it's worth being precise about what you're rebuilding. LiquidPlanner is not simply a task tracker with a nicer UI. Its differentiators are:
Ranged estimation. Every task carries an effort range (e.g. "4 to 10 hours") rather than a fixed number. This acknowledges the uncertainty that exists in all knowledge work.
Priority-driven scheduling. Work is ordered by a priority list, not by manually entered start dates. Move a project up the list, and every downstream date recalculates automatically.
Monte Carlo forecasting. The engine simulates many possible schedules to produce probabilistic finish dates — typically expressed as percentile confidence levels (50%, 90%, 98%).
Resource-aware planning. The schedule respects each person's availability, working hours, time off, and concurrent assignments. Over-allocate someone and the forecast slips automatically instead of silently lying to you.
Integrated time tracking. Logged hours feed back into remaining effort, which re-tunes the forecast in a continuous loop.
If you build tasks, boards, and comments but skip the predictive engine, you've built a Trello competitor, not a LiquidPlanner competitor. The scheduling logic is the product.
Core Feature Set
Foundational Features (MVP)
- Workspaces and user management — organisations, teams, role-based permissions, invitations, SSO readiness
- Project and task hierarchy — portfolios → projects → sub-folders → tasks → sub-tasks, with unlimited nesting
- Ranged effort estimates — low/high hour inputs with sensible defaults and bulk editing
- Priority ordering — drag-and-drop ranked backlog that drives the schedule
- Resource profiles — availability per person, working calendars, holidays, PTO, capacity percentages
- The scheduling engine — the predictive core that turns estimates + priorities + availability into dates
- Timesheets and time logging — start/stop timers, manual entry, approval workflows
- Dashboards and views — project view, my-work view, workload view, Gantt-style timeline
- Notifications and activity feeds — in-app, email, digest options
Differentiating Features (Phase 2)
- Risk and confidence indicators — visual flags when a deadline has a low probability of being met
- Scenario planning — "what if we add two developers?" or "what if this project jumps to the top?"
- Baselines and variance tracking — compare current forecast against the original plan
- Custom fields and workflows — per-organisation data models
- Reporting and analytics — burn-down, capacity utilisation, estimation accuracy over time
- Integrations — Slack, Jira, GitHub, Google Calendar, Outlook, Zapier, accounting tools
- Public API and webhooks — essential for enterprise adoption
- Mobile apps — time logging, task updates, notifications
Estimation Accuracy Feedback
One under-appreciated feature worth building early: track how each person's actual hours compare to their estimated ranges. Over time you can surface a personal "estimation bias" score and even auto-adjust ranges. It's a strong retention hook and a genuine differentiator.
Building the Scheduling Engine
This is the hard part, so let's go deep.
Step 1: Model the Inputs
Your engine needs a clean, well-defined input set:
Task {
id
projectId
assigneeIds[]
effortLow (hours)
effortHigh (hours)
hoursLogged
dependencies[] // finish-to-start, start-to-start, etc.
constraints // hard deadline, earliest start, fixed date
priorityRank
}
Resource {
id
availability // hours per day, per weekday
calendarExceptions // PTO, holidays, part-time
concurrencyLimit // max simultaneous tasks
}
Remaining effort is max(0, effort - hoursLogged), applied to both the low and high bounds.
Step 2: Build the Deterministic Scheduler
Before adding probability, build a scheduler that answers: given fixed effort values, when does everything finish?
The algorithm is essentially a priority-ordered resource-constrained project scheduling (RCPSP) pass:
- Topologically sort tasks by dependency graph; detect and reject cycles.
- Walk the priority-ranked list.
- For each task, find the earliest window where (a) all dependencies are satisfied, (b) every assignee has free capacity, and (c) no constraint is violated.
- Allocate hours across working days using each resource's calendar.
- Record the computed start and finish.
Run this once with all effortLow values and once with all effortHigh values and you already have a crude best-case/worst-case range — useful as a fallback and a sanity check.
Step 3: Add Monte Carlo Simulation
Now the interesting bit. For each simulation run:
- Sample a duration for every task from a distribution bounded by its low and high estimates. A PERT/Beta distribution is the standard choice — it weights outcomes toward the middle while allowing tail risk. A triangular distribution is a simpler, faster approximation.
- Run the deterministic scheduler with those sampled values.
- Record each task's and project's finish date.
Repeat several thousand times, then sort the resulting finish dates and read off percentiles. The 50th percentile is your "expected" date; the 90th is what you communicate to stakeholders.
runs = 5000
results = []
for i in 1..runs:
sampled = sampleDurations(tasks) // PERT per task
schedule = deterministicSchedule(sampled, resources, priorities)
results.push(schedule.finishDates)
p50 = percentile(results, 50)
p90 = percentile(results, 90)
Step 4: Make It Fast Enough
Five thousand full schedule passes over a 10,000-task workspace is not something you run inside an HTTP request. Practical techniques:
- Incremental recalculation. Only re-simulate the sub-graph affected by a change, plus everything downstream in priority order.
- Debounced batch jobs. Collect edits over a few seconds, then recalculate once.
- Background workers. Push simulation to a queue (Celery, Sidekiq, BullMQ) and stream results back over WebSockets.
- Native compute. Write the hot loop in Rust, Go, or C++ and expose it as a service or native extension. This is one of the few places where language choice genuinely matters.
- Reduce run count adaptively. Small workspaces may converge at 500 runs; only scale up when variance demands it.
- Cache aggressively. Store simulation output with a hash of the inputs; skip recomputation when nothing relevant changed.
- Optimistic UI. Show the deterministic estimate instantly, then replace it with the probabilistic result when the job completes.
Step 5: Communicate Uncertainty Well
A probabilistic forecast is worthless if users don't understand it. Design choices that work:
- Show a date range with a confidence band, not a single date
- Use colour to signal risk against committed deadlines (green / amber / red)
- Offer a plain-language summary: "There's an 85% chance this ships before March 14"
- Let users toggle the confidence level they want to plan against
- Explain why a date moved — "Priya is now over-allocated in week of Feb 3"
That last point matters enormously. The biggest complaint about automated schedulers is that dates change and nobody knows why. Build an explainability layer from day one.
System Architecture
A workable architecture for a LiquidPlanner-style app:
Client layer — React or Next.js web app, plus React Native or Flutter mobile clients for time logging and updates.
API gateway — REST for CRUD, GraphQL where clients need flexible nested queries, WebSockets for live schedule updates and presence.
Application services — decomposed into logical services:
- Identity & access (auth, orgs, roles, SSO/SAML)
- Work items (projects, tasks, comments, attachments)
- Resources & calendars
- Time tracking
- Scheduling engine (isolated, stateless, horizontally scalable)
- Notifications
- Reporting & analytics
- Integrations
Data layer — PostgreSQL as the system of record (its recursive CTEs handle task hierarchies elegantly), Redis for caching and job queues, a columnar store or data warehouse for analytics, and object storage for attachments.
Async layer — a message broker (RabbitMQ, Kafka, or SQS) connecting write events to the scheduling recalculation pipeline.
Keep the scheduling engine stateless and independently deployable. It's the component most likely to need different scaling characteristics, different hardware, and the most frequent iteration.
Recommended Tech Stack
| Layer | Options |
|---|---|
| Web frontend | React + TypeScript, Next.js, Zustand/Redux Toolkit, TanStack Query |
| Visualisation | D3.js, visx, or a commercial Gantt library for the timeline view |
| Mobile | React Native or Flutter |
| Backend API | Node.js (NestJS), Python (FastAPI/Django), or Go |
| Scheduling engine | Go, Rust, or Python + NumPy for rapid prototyping |
| Database | PostgreSQL, Redis |
| Queue | BullMQ, Celery, or Kafka |
| Search | Elasticsearch or Postgres full-text |
| Realtime | WebSockets (Socket.IO, Phoenix Channels, or Ably) |
| Infra | AWS/GCP, Docker, Kubernetes, Terraform |
| Observability | Datadog or Grafana + Prometheus, Sentry |
Data Model Considerations
A few schema decisions will haunt you if you get them wrong:
Hierarchy storage. Adjacency lists are simple but require recursive queries. Materialised paths or nested sets make reads fast but writes expensive. For most project tools, an adjacency list with a cached materialised path column is the pragmatic middle ground.
Priority ordering. Don't use integer ranks — reordering forces mass updates. Use fractional ranking (LexoRank or similar string-based ordering) so a reorder touches exactly one row.
Time entries. Store these immutably and append-only. Approval workflows, billing, and audit trails all depend on being able to reconstruct history.
Schedule snapshots. Persist each computed schedule with a version and timestamp. Baselines, variance reports, and "why did this date change?" all require history.
Multi-tenancy. Row-level security with a tenant ID is usually sufficient early on; schema-per-tenant becomes attractive for large enterprise customers with data residency requirements.
UX Design Priorities
LiquidPlanner's reputation includes a fair share of "powerful but complex" feedback. That's your opening.
Progressive disclosure. A new user should be able to create a project and add tasks without ever seeing a confidence percentile. Reveal the advanced planning layer as they grow into it.
Sensible defaults for estimates. Asking for two numbers instead of one doubles friction. Offer a single-number input that auto-generates a range (e.g. ±40%), and let power users override.
Fast, keyboard-driven editing. Project managers live in these tools. Inline editing, bulk actions, command palette, and keyboard shortcuts are not luxuries.
Views for different roles. An executive wants portfolio health. A manager wants workload and risk. An individual contributor wants a clean list of what to do today. Build all three.
Explain the maths. A small "how was this calculated?" panel that shows contributing factors builds enormous trust.
Development Roadmap
Phase 1 — Discovery and design (4–6 weeks) Competitor analysis, user interviews, feature prioritisation, information architecture, wireframes, and high-fidelity designs for core flows.
Phase 2 — Foundation (6–8 weeks) Auth, multi-tenancy, data model, project/task CRUD, basic UI shell, CI/CD pipeline.
Phase 3 — Scheduling engine (8–12 weeks) Deterministic scheduler, dependency resolution, resource allocation, Monte Carlo layer, performance tuning. Budget generously here; this phase almost always overruns.
Phase 4 — Planning UI (6–8 weeks) Timeline/Gantt views, workload charts, priority drag-and-drop, confidence visualisations.
Phase 5 — Time tracking and reporting (4–6 weeks) Timers, timesheets, approvals, dashboards, exports.
Phase 6 — Integrations and mobile (6–10 weeks) Public API, webhooks, key third-party connectors, mobile clients.
Phase 7 — Hardening and launch (4–6 weeks) Load testing, security audit, SOC 2 groundwork, documentation, onboarding flows, beta programme.
Total: roughly 9 to 14 months for a credible, production-grade v1 with a small-to-mid-sized team.
Cost Estimate
Costs vary enormously by region and team composition. Broad ranges for a full build:
| Scope | Estimated cost |
|---|---|
| Lean MVP (web only, simplified scheduling) | $80,000 – $150,000 |
| Full-featured v1 (web + mobile + Monte Carlo engine) | $180,000 – $350,000 |
| Enterprise-grade (SSO, compliance, advanced analytics, integrations) | $350,000 – $600,000+ |
Add ongoing costs: infrastructure (compute for simulations is not trivial), support, and a maintenance budget of roughly 15–20% of build cost annually.
Monetisation Models
- Per-user subscription tiers — the industry default; differentiate on features, project limits, and support SLAs
- Usage-based add-ons — extra simulation depth, longer history retention, advanced analytics
- Enterprise licensing — SSO, audit logs, dedicated infrastructure, custom contracts
- Freemium — free for small teams, which drives bottom-up adoption inside larger organisations
- Professional services — onboarding, migration, and configuration consulting carry high margins in this category
Go-to-Market Positioning
Competing head-on with Asana, Monday.com, ClickUp, and Wrike on general-purpose project management is a losing battle. The winning play is specificity:
- Vertical focus. Engineering teams, agencies, construction, clinical trials, or manufacturing all have distinct scheduling constraints and will pay for a tool that speaks their language.
- Uncertainty as the wedge. Market on the promise of "deadlines you can actually trust" — a message no board-and-card tool can credibly make.
- Migration on-ramps. Importers for Jira, Asana, MS Project, and CSV remove the single biggest switching barrier.
- Proof through data. Publish research on estimation accuracy and schedule reliability. It's content marketing that doubles as product validation.
Common Pitfalls
Underestimating the engine. Teams routinely budget four weeks for scheduling logic and spend four months. Prototype it first, before committing to a timeline.
Ignoring performance early. A scheduler that works beautifully on 200 tasks can become unusable at 20,000. Test with realistic data volumes from week one.
Over-engineering the UI before the maths works. Beautiful Gantt charts rendering wrong dates help nobody.
Neglecting explainability. If users can't understand why dates changed, they'll stop trusting the tool and revert to spreadsheets.
Skipping the import path. No team abandons years of project history. Migration tooling is a launch requirement, not a nice-to-have.
Final Thoughts
Building an app like LiquidPlanner means building a forecasting product wearing the clothes of a task manager. The tables, boards, and comment threads are table stakes — you can ship those in a few months with a competent team. The predictive scheduling engine is where the real intellectual property lives, and it deserves the majority of your engineering attention, your best people, and a realistic timeline.
Get the engine right, wrap it in an interface that makes probability feel intuitive rather than intimidating, and pick a vertical where unreliable deadlines cost real money. That combination is a genuinely defensible product in a crowded market.
Have a project in mind? Contact Sodio Technologies to discuss your requirements and explore the right technology solution for your business.
/// Work with us
Talk to the engineers who'd build it
You'll get a technical scope, timeline and cost estimate from the people doing the work, not an account manager. In-house team, no subcontracting, since 2016.
