A multi-tenant web app that connects estimating (BOQ and MTO), project tracking, payroll and cash flow, replacing group chats, notebooks and spreadsheets. Built solo with AI assistance.
Small and mid-size contractors in the Philippines usually keep the estimate in one spreadsheet, expenses in a notebook, payroll worked out by hand and schedules in group chats. BuildTrack is built for owner-operators and small teams who estimate their own jobs and run their own crews, and their estimates follow local reference material such as Fajardo's tables and Philippine pricing conventions. That material shaped the core of the product.
With the estimate, expenses and payroll in separate places, every number has to be re-checked before anyone trusts it.
A foundation pour that slips two weeks doesn't look urgent until every phase after it is two weeks late.
The true cost of a job usually shows up when the client asks for it.
Take-offs have to use Fajardo's published tables and theoretical formulas, priced from the organization's own rates.
In estimating, a value that is wrong but looks plausible is worse than an error.
Every contractor's data must stay isolated from every other, including demo and view-only accounts.
The product enforces its important rules at the lowest layer that can hold them: the database for isolation and read-only access, a strict parser for input, and additive migrations for live data.
Every table carries an organization id with row-level security policies, so a bug in a page can't leak another company's data. Demo accounts are read-only through database triggers, not hidden buttons, and paid AI endpoints check the same flag on the server.
Dimension fields accept 350cm, 2in or 0.2m and convert to the field's own unit when the user leaves it. An unrecognized unit is rejected with a message, never guessed. One shared component reached 42 fields across two builders, because the forms are schema-driven.
Moving the Expense Log from one material per expense to multi-material lines meant a new table, a backfill of existing rows and deprecating the old columns instead of dropping them. The same recipe was later applied to equipment lines.
A dark-mode refactor passed the type checker and still crashed in the browser, because the theme helper only works inside a live render context. Separately, light-pinned pages such as payslips inherited dark text from the body. Both were found by reproducing them in a running app, then fixed with a pattern that holds across the app.
BuildTrack covers the whole job from estimate to cash position, in one system and one set of numbers, from a phone on site or from a desk. It was built solo with AI assistance.
A Material Take-Off engine across 13+ construction divisions (concrete, rebar, masonry, roofing, plumbing and more). It uses Fajardo's published tables and theoretical formulas, feeds a BOQ priced from the organization's own rate library, and syncs quantities across.
The Structural Builder adds marks, an interactive 3D preview and printable summaries. AI Fill turns a plain-language description into a line item that the user reviews before applying. Paid AI endpoints are guarded on the server, so view-only accounts can't use up quota.
Phases with cascading-delay detection, budget vs. actual, change orders, a materials log with low-stock flags, an expense log and a daily work log.
Time logs turn into payroll: daily and hourly rates, overtime, deductions and cash advances. Payslips are printable, and the payout flows into cash flow.
Multiple bank accounts, with every expense automatically creating its matching cash-out entry.
Multi-tenant SaaS with roles and team invites, trial and subscription gating, a view-only demo mode, light and dark themes driven by CSS variables, product tours, print reports and a full data export.
Isolation and read-only access are enforced where they can't be bypassed, not by hiding things in the UI.
An unrecognized unit is rejected with a message. A value that is wrong but looks fine is worse than an error.
Many formulas rest on metric-only empirical tables, so results are not converted to imperial. That would mean inventing numbers with no source.
Live schema changes add and backfill first and deprecate old columns, so nothing is lost on a live database.
It only makes sense where a catalog sits behind each line (materials, equipment). For Meals or Office it would be one more blank amount field, so I explained that instead of shipping empty UI.
Feet in, feet out would mean converting metric-only empirical tables and inventing numbers with no source. I shipped the input flexibility and left the calculated side alone.
I traced a hidden dependency first: it was the only way to attach a receipt photo to an outflow. I shipped the removal only after extending receipt upload to auto-generated entries, so nothing was lost.
BuildTrack is live with trial contractors. It is about 44K lines of TypeScript with 102 database migrations and around 35 pages, built solo with AI assistance over roughly 10 weeks (first commit 2026-07-11). This page reports no user, retention or revenue figures. Next: test coverage is thin today, so unit tests for the calculation engine come first, followed by an audit trail of who logged what, which is deliberately deferred, and area unit conversion with an optional display-unit setting for results.