TixWork
CHRONICLE · Apr 7 – Oct 4, 2026 · built solo

I built TixWork.
Then I built everything around it.

I'm Peter Filias. In six months I took a legacy maintenance app running a real 107-store franchise, rebuilt it into production-grade software, stood up the TixWork brand and a live marketing site with published pricing, shipped multi-vertical demos, and then built the next-generation multi-tenant platform beside it — the engine new operators now run on. Same founder, three surfaces, no team. Along the way I turned what this project generates for the business into something that actually compounds.

181
Days
Apr 7 → Oct 4, 2026 · still shipping
1,050+
Commits
Across product, platform, and brand repos
9
Prod releases
v3.0 → v3.7.1 on the founding customer
5
Vertical templates
Restaurant, hotel, fitness, daycare, fleet
1 founder (me) 107 stores live in production 178 Playwright tests on the founding app 3 repos — app, marketing, platform 5 vertical templates on one engine 155 platform PRs merged in 9 days $20 / location / month — published list 0 production data lost at cutover
Act I · Rebuild

36 days to a real platform. Then eight more releases.

Apr 7 → Jun 3, 2026

The founding customer — JK&T Wings, a 107-store franchise across five districts — was already running an earlier version of the maintenance app I'd built for them years before; the operation has run on it continuously for 17 years. By April 2026 that stack was carrying real daily traffic and every kind of age: no modern security posture, no tests, no mobile, shared hosting. I pulled a production snapshot on April 7 and rebuilt it in place.

Day 0 → Day 36: dedicated infrastructure, security hardening, executive analytics, mobile-first ticketing, preventive-maintenance automation, a verified email pipeline, and a Playwright merge gate. Zero-downtime cutover. Zero production data lost. Then I kept shipping — every release drawn from what the operator actually needed.

Before / After

What changed in the rebuild

Compressed from the full audit
01

Security & ops

— from shared-host debt to a deployable stack
Day 0
  • Plaintext passwords, SQL injection, CSRF gaps, XSS paths
  • Hardcoded credentials and secrets in source
  • Shared hosting, manual deploys, no staging
  • No tests, no CI, no migration system
Shipped
  • bcrypt, prepared statements, CSRF, XSS hardening, session regen
  • Env-driven secrets; PII scrubbed from history
  • DigitalOcean droplet, Docker, stage + prod, gate-checked deploys
  • Ordered SQL migrations + Playwright as the merge gate
02

Product depth

— tickets, email, analytics, PM, mobile
Day 0
  • One notes blob, no photo attachments, no audit trail
  • Raw mail() — hope it arrived
  • One ticket list; no charts, no exports
  • Not designed for phones; no PM scheduling
Shipped
  • Append-only comment threads, photos, AJAX, system audit comments
  • Verified Resend pipeline, inline photos, digests, inbound email later
  • Full reports module with charts, drill-through, CSV
  • 375 px-clean ticket flows + full PM auto-generation
Rebuild timeline

Highlights from the 36 days

Apr 7 → May 13
Apr 7–11
Day 0 — production snapshot + security hardening
Initial commit from the live host as the v2.0 baseline. By v2.1 on Apr 11: bcrypt, prepared statements, CSRF, XSS pass, session-fixation and brute-force protection, credentials to env.
Apr 17–20
Reports, modern theme, role-scoped KPIs
Executive analytics with charts and year compare. Sidebar-driven UI. Dashboard KPIs per role.
Apr 27–30
Comments, photos, mobile, PM, staging
Append-only threads, attachments, 375 px ticket forms, preventive maintenance cron, DO staging stack live.
May 7–13
Email verified · cutover · v3.0
Resend SPF/DKIM validated end-to-end. DNS flipped. Stage fixtures + gate-checked promote script. v3.0 live.
Kept shipping

v3.1 → v3.7.1 — eight releases in 21 days

May 13 → Jun 3

The rebuild got the founding customer onto a real platform. Every release after v3.0 started the same way: a real need in production, shipped as a platform capability. The founding customer stays on this release line; the public v3.x story closes at v3.7, and new product work now lands on the platform.

v3.1
May 18
Per-action notification preferences
Customer-owned email behavior — which ticket events fire is config, not hard-coded.
v3.2
May 19
User self-service profiles
Every role gets an account page — details, password, change log.
v3.3
May 21
Vendor lifecycle
RFQs via private links, side-by-side quotes, ranking and scorecards.
v3.4–3.5
May 28
Districts self-service + observability
Admins own their org structure. Impersonation, structured logging, sharper smoke coverage.
v3.6–3.7.1
Jun 1–3
Inbound email + reply management
Open a ticket from an inbox. Reply to comment, ack, or resolve — full lifecycle without the browser. Photos on the way in.
Act II · Company

I didn't just ship the product. I shipped the company surface.

May 8 → Oct 4, 2026

While the app kept moving, I stood up everything a product company needs to show itself: name, mark, site, story, verticals, a public price list, and demos you can see on a walkthrough. Same solo seat. Different repo — tixwork-com for brand and GTM, product staying in its own tree.

Brand

TixWork · From tix to fixed.

Naming locked. Ticket-lifecycle pip mark (open → in progress → done). Signal Orange / Graphite / Bone system. Favicon, social kit, embroidery pack — all designed and checked in by me.

Marketing site

tixwork.com is live

Cloudflare Worker, vanilla HTML/CSS, no build step. Home, features, pricing calculator, operator story + anonymized case study, docs hub with ROI calculator and roadmap, changelog, five vertical suites — restaurants, hotels, fitness, daycare, fleet — trust pages and Terms, plus my own contact chat wired into the CRM.

Demos

Multi-vertical demo stacks

Restaurant, hotel, fitness, daycare, and fleet — each on its own tenant config, same product underneath. Walkthrough-gated, never a public link. Monitors so a walkthrough never opens on a broken login.

This is the part most founder-engineers skip or hire out. I did the brand decision docs, the site copy, the vertical landings, the pricing math, the demo stacks, and the sales-facing story pages myself — because the product only lands if the company around it looks finished.

Company timeline

Brand → site → demos → price list

Selected beats
May 8–15
Name and mark locked
TixWork chosen. Pip mark replaces earlier explorations. Marketing theme and docs hub stand up.
May 20–28
tixwork.com live · vertical pages
Cloudflare Worker deploy. Hotel and fitness landings. Thesis and scope docs published.
Jun 12–22
Founding customer secured · story page
Commercial relationship with the founding operator locked in. Engineering chronicle moved here so tixwork.com stays operator-facing. Features page ships.
Jun–Aug
Demo fleet expands
Multi-vertical demo environment across restaurant, hotel, fitness, daycare, and fleet — same engine, different tenant packs.
Sep 13–14
Proof First marketing pass
Role Home screenshots, fleet vertical and $12-per-powered-unit pricing, ROI calculator, anonymized case study, claim comb. Public demo hostname scrubbed — walkthrough-gated only. Marketing matches the product.
Sep 15–16
Restaurants suite · home goes cross-vertical · own chat
Restaurants get the same five-page suite as every other vertical, and the home page becomes the cross-vertical overview. Square-logo embroidery pack lands. Zoho SalesIQ out; a first-party contact widget writes straight into Attio and emails the inbox.
Oct 2–4
Published list · pricing calculator · Terms
Changelog and roadmap refreshed for buyers, with analytics on the site. One published number: $20 per location per month, $99/month minimum ($1,188/yr), or a $999 60-day pilot credited in full. Fleet $12 per powered unit; hotels by room band from $149/property. Public calculator ships with no signup or checkout path on purpose. Terms of Service published, effective Oct 4.
Act III · One engine

The natural next chapter: one platform for every vertical.

Sep 6 → Oct 2026

By September the founding customer's production stack was solid enough that the future of TixWork — multi-tenant, multi-vertical, clean schema — belongs in a new repo beside it, not on top of it. Cash cow stays stable and still gets production polish when the operator needs it. New product ships next door. Same codebase for restaurant, hotel, daycare, fitness, and fleet: templates and seeds, never per-vertical forks.

Architecture

TypeScript · Postgres · one image

  • Hono API + React 19 desk UI + Drizzle / Postgres 16
  • 25 tables, 25 migrations, shared-DB tenancy
  • Five YAML vertical templates driving labels, nav, SLA, closeout
Shipped in 9 days — then weekly

Depth, not a splash page

  • Tickets, assets, PM, reports, vendors, estimates, RFQs
  • Role Homes, unique equipment, Help Center, host-first signup code
  • Since: Report a problem, location pages, inbound mail, plan & billing
How one person ships that fast

Agent factory + hard gates

  • Beads issue queue, PR stream, architect-review desk
  • 190 commits · 155 merged PRs · peak day 96 commits
  • JKT-style demo deploy gates + Playwright smoke CI

Demos and new operators now run on the one engine. What the founding customer teaches in production — report drills, photo UX, deploy discipline — feeds straight back into the platform. They stay on their app until they're ready to move over as a tenant like everyone else.

Platform timeline

Nine days that look like a quarter. Then the weekly desk.

Sep 6 → Oct 2026
Sep 6
Three-repo lock
tixwork-app for founding-customer production. tixwork-com for brand and marketing. tixwork-platform for the one-engine product.
Sep 7
Architecture locked · monorepo boots
Approved design. Docker Postgres. First templates and seeds. Asset register and cascading ticket create on the new stack.
Sep 9–11
Desk-first product · money & ops parity
Corrected course to desk-first (phone only when asked). PM, reports, vendor directory, costs and estimates land as real modules.
Sep 12–13
Self-serve + host-first signup
Onboarding wizard, mobile/PWA polish, CI smoke gate, then canonical tenant URLs and session handoff. Signup code shipped; public self-serve stays closed until I open it on purpose.
Sep 14
Parity loop · demo ops · founding-app polish
Platform: photo lightbox + report drills, Help Center by role, Stripe mode (stub refuse), auth email tokens, JKT-style demo deploy train (preflight, heartbeat, detached rebuild). Founding app: purge demo scaffolding (−13.5k lines), report drill parity (photo / PM / SLA) on prod, same-tab drills + lightbox gallery, Sentry live on stage and prod. Fifty platform PRs merged in one day — self-serve code path mostly green; live billing keys still human-gated on purpose.
Sep 15 → Oct
The desk, the mailbox, and the bill
Report a problem in three questions on every template. A page per location — open work, units, vendors; add one, manage regions, or archive a closed place with history kept. People invited by sign-in link, with coverage per location. Monday call sheet by email. Inbound mail on the new engine at tickets.tixwork.com: reply to comment, ack, or resolve; photos land on the ticket; a vendor's quote reply becomes an estimate. Plan & billing with annual terms, renewals, and hotel room counts. Plain work orders with a printable run sheet.
The point

Three surfaces. One founder. Still shipping.

A 107-store production customer live on software I rebuilt and keep polishing. A brand, marketing site, and published price list I designed and deployed myself. A multi-tenant one-engine platform I stood up in nine days beside the cash cow and kept shipping into October — so the next vertical doesn't need a fork.

That's TixWork. That's what six months looks like when you refuse to wait for a team.