MichaelJi

NABody of Work · 2015—2025 Email
KIRA

ˈki.ra; a proponent of rumination and stealth execution. It is, at its core, the all-seeing warrior at the behest of hell.

01

Pure and Vile

Brand
KIRA
Year
2015
Format
Capsule collection(s)
Location
Montreal, Canada
Materials
Various mediums and treatments on canvas
Collection ↗
00 — Montreal, 2015
0:00 / 0:00
02

Blu is the warmest colour

Brand
KIRA
Year
2016
Format
F/W16 Collection
Location
Toronto, Canada
Materials
Wool, Canvas, Embroidery, Silkscreen with wash treatments
Collection ↗
IS THE WARMEST COLOUR
Blu
Blu
Blu
Blu
Blu
Blu
Blu
Blu
Blu
Blu
Blu
Blu
Blu
Blu
Blu
Blu
Blu
Blu
Blu
Blu
Blu
Blu
Blu
Blu
Blu
Blu
Blu
Blu
Blu
Blu
Blu
Blu
Blu
Blu
Blu
Blu
WHO ARE YOU?
00 / 28
03

Nonspiritual Matter

Brand
KIRA
Year
2018
Format
F/W18 Collection
Location
Paris, France
Materials
WWII canvas, 1800 Indigo, Raw Canvas, Wool, Silk, Linen, Gallium, Mercury, Dyneema Composite, Kevlar, Carbon Fibre
Collection ↗

NSM

nonspiritual matter; nothing dies. it is recreated. reborn. forever.

NOTHING DIES. IT IS RECREATED. REBORN. FOREVER

01 / 70  ·  STATE 1 / 6
04

Product(s)

Brand
KIRA
Year
2015—2020
Format
Product development
Location
Made in Canada
Materials
Heavy GSM cardstock, zinc alloy, titanium, carbon fibre
20 items · are.na channel of record
Concept Mockups and specifications · 7
Production Objects manufactured · 13

Tags and cards

Garment charms

Lighters

Bags and packaging

3D screen print and material

Footwear

05

The Bloom

Brand
The Bloom
Year
2025
Format
Brand architecture
Location
thebloom-brand.vercel.app ↗
Fog standing in a dark conifer forest
Body of Work · Commercial 01 Precon Finder Inc. · Toronto
Logo construction, step one: an isometric diamond struck on the drafting grid
Logo construction, step two: the diamond extruded into two volumes
Logo construction, step three: the volumes resolved to two solid forms
Logo construction, step four: the finished PreconFinder mark

PreconFinder

Plate 01 — set out

Toronto, Canada · 2026 The operating system for Canadian preconstruction preconfinder.com ↗
06

PreconFinder

Client
Precon Finder Inc.
Year
2026
Format
Precon ERP SaaS
Scope
Brand · Product design · UI/UX · Front end · Backend · Data · Film · Social · GTM
Surfaces
Public · Client · Agent · Brokerage · Platform
Market
Greater Toronto Area
Visit the platform ↗
01 — The freeze
5,314GTA new-home sales · 2025
19% of the ten-year averageten-year average = 100%
BILD · Altus
1,599New condominium units sold · 2025
5% of the 2021 level−60% year over year
Urbanation
22,602Unsold units in inventory
3,897 completed and unsold18,705 still under construction
Urbanation Q2
7,243Units inside cancelled projects
28 projects pulledan all-time record
Urbanation
55%Q1-2025 units unsold
55% unsold70% pre-sold — the lender threshold
CMHC

Lasso CRM → Spark or Avesdo for inventory → Salesforce or Excel for allocations → DocuSign → separate commission sheets → HomeTrek post-closing. None of them talk to each other across the builder ↔ marketer ↔ broker triad.

Tool sprawl, as diagnosed in the PreconFinder pitch brief
02 — The mark
Construction: an isometric diamond on the grid
Construction: the diamond extruded into two volumes
Construction: scaffolding removed, two solid forms
Construction: the final mark
The mark on black
Combination logo and icon
Palette plates
005FC6
FFFFFF
000000
005FC6brand book
0066CCproduct tokens
3B6CFFfilm accent
03 — The system
01 · Public

Catalogue

/projects

Map, listings, builders. No account.

02 · Client

Portal

/c/{clientId}

Agent-branded. Link-based, no sign-in.

03 · Agent

Desk

/dashboard/*

Browse, clients, worksheets, deals.

04 · Brokerage

Floor

/brokerage/*

Seats, board, exclusive stock, brand.

05 · Platform

Operator

/admin/*

Tenants, accounts, stages, CMS.

A · Surfaces Public /projects · /builders catalogue · map · about Client portal /c/{clientId} link-based · no account Agent desk /dashboard/* browse · clients · deals Brokerage /brokerage/* agents · pipeline · brand Platform /admin/* tenants · stages · CMS no session — state travels in the link B · Access Firebase Auth · Google custom claims { role, brokerageId, agentId } Firestore rules isAdmin() · isBroker(bid) · isAgent(bid,aid) · belongsToBrokerage(bid) catch-all deny C · The spine — one path is the product brokerages/{brokerageId} tenant · plan · seats · logoUrl · ownerId agents/{agentId} uid · dealCount · savedProjectSlugs clients/{clientId} name · email · phone · projectSlugs[] deals/{dealId} stage · worksheet{} · allocation{} · timestamps documents/{docId} approved · scannedForMalware · uploadedBy projects/{slug} brokerage-exclusive inventory Root collections users/{uid} role · plan · stripeCustomerId projects/{id} 56 consolidated · 47 surfaced audit_logs/{id} append-only · admin read portal_sessions/{id} hashed token · expiry demo_requests/{id} status · createdAt D · Attached services Stripe subscriptions · webhook · seats Loops invite · share · demo · list Cloud Storage deal PDFs · logos · avatars Leaflet · CARTO price-pill markers · bounds filter Plausible · GA4 product · operations screen Every surface above resolves to the same document. What differs between them is only which fields the caller's claims allow through.
Application
Five route groups, a hand-written 16-component primitive library.
Next.js 15 · React 19
Data
Multi-tenant Firestore, Auth with custom claims, Storage, Admin SDK. Zod per document type.
Firebase 12 · Zod 4
Mapping
Markers are div icons, not pins — the asking price lives inside the marker.
Leaflet 1.9 · CARTO
Payments
Signed webhook syncs status, plan and seat count. Entitlement cascades to every agent.
Stripe 21
Film
Three compositions, 3,006 frames — a React tree, so the cut recompiles with the product.
Remotion 4
Intelligence
Seven external feeds behind one Promise.allSettled, tagged and revalidated.
BoC · StatCan · GA4
Catalogue
56 projects consolidated from 362 PDFs and 50 asset packages; 47 reach the UI.
56 → 47 live
04 — The surface

04 · The surface — scroll

Split map and list browse across the GTA Browse — markers are price pills, not pins.
Result list beside the map Sync — hover a card, its marker lights.
Client worksheet form Worksheet — five fields, prefilled.
Park Road listing with renderings Listing — Park Road, Yorkville. Gallery, stats, one action row.
Amenities, pricing details and agent intel Numbers — maintenance, parking, locker, capped charges.
Available units and the HST estimator Units — availability, then the rebate estimator.
HST rebate estimator, computed HST rebate — CAD 88,517 back, computed in place.
Agent view with commission and incentives Agent intel — commission beside the asking price.
Agent-branded client portal Portal — no account. The agent's name, not ours.
Client portal project page Client view — commission and incentives stripped out.
Worksheet submitted Submitted — the agent's board already knows.
Agent browse with filters Catalogue — platform stock and brokerage-exclusive, merged.
The client's saved projects Their list — saved on the client's own side.
The client's own deals Their deals — every inquiry, one list.
Map on mobileMap
Listing on mobileListing
Portal on mobilePortal
Desk on mobileDesk

00 / 100  ·  The surface

05 — The flows
Flow A

The client

Never signs up. Arrives on a link, and everything after that is built to be legible to somebody buying their first home — commission, co-op rate and builder incentives are stripped out of this view on purpose.

01
Discover

The public map. Leaflet over CARTO tiles, centred on downtown Toronto, every project a price pill so the entry price reads before the click.

Pan the map and a Search this area button promotes the viewport to a filter — four filter dimensions in all.

Map browse
02
Open a listing

Park Road, Yorkville. Renderings in a keyboard-driven lightbox, then units, types, price range and completion in one strip.

Three actions, no more: add to my list, share with client, view package.

Park Road listing
03
Their own portal

No account, no password. The agent sends a link and the client lands on a page headed "Recommended for {their name}", carrying the agent's photo, the brokerage's name, and a phone and mail button in the header.

It reads as the agent's own site, because that is exactly the job.

Client portal
04
Read the package

The client-safe project view: renderings, amenities, available units, deposit structure and the location. The agent's contact card takes the sidebar.

Removed from this view on purpose — estimated commission, co-op rate, builder incentives, and the commission-structure file, which is marked Restricted even for agents.

Client portal project page
05
Run the rebate

The Ontario HST rebate estimator, built into the page. Purchase price, buyer intent, first-time buyer, and the date the agreement was signed.

On this unit: CAD 34,045 federal plus CAD 54,472 Ontario — CAD 88,517 back. It is the single number a first-time buyer most needs and least often gets before committing.

HST rebate estimator
06
Submit a worksheet

Five fields — name, email, phone, unit preference, message — prefilled from the client record the agent already created.

One sentence carries the whole product: "A worksheet is a non-binding expression of interest — it helps your agent secure a unit allocation on your behalf."

Worksheet form
07
Confirmed

The submission writes a deal document under the agent, inside their brokerage, stamped stage: "submitted".

The agent's board updates in the same second.

Worksheet submitted
08
Track it

The client sees the same five-stage rail the agent works, plus a Next Steps panel naming in plain language who is being waited on and why.

The smallest feature in the build, and the one that removes the most friction — it retires the phone call that used to be the only way to ask where things stand.

Client deal tracker
The client's deals list
Flow B

The agent

The commercial core. Everything before a client says yes is preparation; everything after runs on five stages, each with one forward button and a one-click reverse.

01
The desk

Pipeline value, estimated commission at the 2.5% co-op rate, client count, saved projects — and the recent-worksheet feed. Every tile links into the work it summarises.

Beside it the catalogue: 47 platform projects and the brokerage's own exclusive stock merged into one list, with search, status, area and six price bands.

Agent browse
02
Qualify

The agent's project view is the client's view plus the numbers that decide whether it is worth pitching: estimated commission, co-op rate, deposit structure, and the builder incentives currently on the table.

That one line — the commission figure sitting beside the asking price — is why agents open the app.

Agent intel on Park Road
03
Add a client

Name, email, phone. Written live to Firestore under the agent, inside their brokerage.

The record owns a portal URL from the moment it exists — Open Client Portal and Copy Link sit on the row itself.

Client created
04
Share

Pick a client or create one inline. Copy the portal link, or flip the toggle and send a branded email carrying the agent's own name, address and number.

Share with client
05 stage 01
Inquiry received

"Client submits an inquiry. Review and approve to request the rest of the worksheet."

The row carries the whole submission — name, email, phone, unit preference, message, timestamp — and offers one action: Approve Inquiry.

Splitting intent from paperwork is the point. A buyer will give you five fields on a phone. They will not give you a SIN.

Inquiry received
06 stage 02
Worksheet confirmed → builder

Now the full worksheet is collected — SIN, occupation, driver's licence — and the handoff composes itself: the builder's allocation address, the client summary, the worksheet PDF, and a free note ("high floor, north-facing, budget flexible to $650K").

It stamps sentToBuilderAt. This is the step the industry currently performs in a group chat.

Send worksheet to builder
07 stage 03
Allocation pending

Confirm Allocation captures what the builder came back with: unit number, floor, price, parking and locker as toggles, the allocation PDF and notes.

Every party's view updates at once — the client's tracker, the brokerage board, and the platform's worksheet table.

Confirm allocation
08 stage 04
Signing & deposit

The allocated unit gets its own dark banner — it is the first thing everyone looks for.

The row then grows a deposit timeline: 5% on signing, 5% at 30 days, 5% at 90, 5% at 365, 80% on closing. From here the job is chasing money, not paperwork.

Signing and deposit
09 stage 05
Deal complete

"APS signed, deposit delivered — tracking payments."

The advance button here is deliberately quiet and grey. The app is waiting on the client, not the agent, and the interface should not pretend otherwise.

Every stage reverses in one click, because deals in this market go backwards as often as forwards.

Deal complete
Flow C

The brokerage

The broker of record wants four answers: who is producing, what is in the pipeline, what stock is ours alone, and does the client-facing product carry our name. These screens are captured on a brand-new tenant, so most of what follows is the zero state — day one is the screen every brokerage product gets wrong, and the only one a prospect sees before deciding to stay.

01
Take the Org plan

$595 CAD/month for up to 25 agent seats, or $476 billed yearly. Checkout provisions the brokerage, flips the buyer to role: broker, and sets the seat count.

Entitlement then cascades: while the brokerage is active every agent under it is active — and when it lapses they see "your brokerage plan has expired", not a dead app.

Pricing: Pro, Org, Enterprise
02
Get set up

Four steps, stated on the marketing page and kept to: book a demo, get set up, invite your agents, close more deals.

How it works
03
Seat the team

Invite by name and email. The seat reads pending sign-in until a first Google login links the account, so a half-onboarded roster is visible rather than silent.

Promote an agent to admin, or remove them — which unlinks the user and clears their clients and deals in the same operation.

Agent roster
04
Stock the shelf

Two tabs. Default is the 47-project platform catalogue. Custom is full CRUD on projects only this brokerage's agents can see, with cover and gallery images uploaded to Storage.

Exclusive stock is badged everywhere it appears, including inside the agent's merged catalogue.

Brokerage inventory
05
Watch the board

Every agent's deals fanned into one board, a column per stage, read from the same stage source as every other rail in this case study.

"Deals will appear here as your agents submit worksheets and progress through the pipeline" — the empty column explains itself instead of apologising.

Deal board
06
Read the room

Six tiles, named and captioned before they have a number to show: GCI closed, pipeline value, projected GCI at 2.5% commission, average deal size, days to close, deals per agent.

An owner learns what the product will measure by reading an empty screen.

Brokerage KPIs
07
Motivate

Bonus commission, client rebate, exclusive pricing, early access or custom — each with a validity window and a target of all agents or a named set.

And white label: a logo uploaded in settings replaces the PreconFinder mark in every agent's sidebar and on every client portal the brokerage sends. For a broker of record that is the difference between a tool they pay for and a tool they can put their licence behind.

Incentives
06 — The floor
Deal stage editor
Workflow as data — stage name, description, duration hint and advance-button text, editable per stage. "Changes apply everywhere deals appear — worksheets, dashboards, pipeline, and client portals." The order and count are fixed; the language is not.
Every worksheet across every brokerage
Every worksheet — platform-wide, sortable on submitted, updated, client, project, brokerage and stage. The one table that proves the tenancy model holds. Identities are masked here; they are not in the product.
Brokerage registry
Tenants — plan, subscription state, seats used against seats bought, and creation date for every brokerage, including the auto-provisioned solo workspaces.
Homepage content editor
Marketing CMS — the public homepage and about page are editable fields, not a deploy. Copy on a marketing site is operational data.
Seven-stage lead pipeline
Demand — a seven-stage board upstream of the deal: MQL → CQL → SQL → contact → PQL → allocation → sale, each lead carrying a score, a source, days in stage, budget and search criteria.
Unit-level inventory
Inventory desk — unit, type, floor, area, view, price, and a status the operator flips in place: available, reserved, booked, sold.
07 — The wire

Pre-construction has no EDI

No 850, no 856, no clearing house between a builder, a marketer and a brokerage. What exists instead is public statistical and financial data nobody in the industry reads on a schedule. The operations screen reads all of it, every hour, into one view.

Toronto neighbourhood pricing map with market snapshot
The room — twelve mapped GTA neighbourhoods sized by recent sales, beside the supply and rate snapshot. Average price per square foot is computed across the set, not quoted from one.
Workspace panels
Workspace — the operator's own day, on the same screen as the market. Local-first, and labelled as such.
Markets row
Markets — indices and crypto, then the two numbers that actually price a pre-construction deal: the Canadian prime rate and the Bank of Canada policy rate, in percentage points rather than percent change, because that is how a mortgage broker reads them.
SourceEndpointWhat it carriesCadence
Bank of Canada Valet /valet/observations/{ids}/json?recent=120 Prime V80691311, policy target V39079, bank rate V122530, CORRA AVG.INTWO 1 hour
Statistics Canada WDS getDataFromCubePidCoordAndLatestNPeriods Building permits, cube 34-10-0292, 36 latest periods, 8 coordinate series 1 hour
Google Analytics Data API properties/{id}:runReport · :runRealtimeReport Eight parallel reports — visitors, pageviews, signup events, two seven-day trends, live active users. Service-account JWT signed RS256 in node:crypto, no SDK live
Gmail API users/me/messages?q=… Demo bookings at 7 and 30 days, unread count — read from resultSizeEstimate, so no message body is ever fetched 1 hour
Loops/api/v1/lists Mailing list size. Campaign rates are fed manually — the API does not expose them, and the code says so rather than inventing a number 1 hour
Open-Meteo/v1/forecast?latitude=43.6532&longitude=-79.3832 Toronto temperature, wind and WMO condition code 15 min
Yahoo Finance v8 · CoinGecko /v8/finance/chart/{symbol} · /api/v3/simple/price Index and crypto last price against previous close 5 min

Failure is a design decision

All seven feeds run inside a single Promise.allSettled. One dead endpoint degrades to a null-state card carrying the name of the environment variable that would fix it — never a blank page, and never a fabricated number.

No placeholder data

The same discipline runs through the estate. The social tool states that live analytics need an OAuth connection and that no placeholder data is shown anywhere. The research microsite carries a caveat that nothing is fabricated. Every hard-coded dataset names the endpoint that will replace it.

08 — The kit
Style 01

Early access

Ivory ground, navy type, a hairline chip. Scarcity written as restraint — the invitation reads like a private placement, because a founding cohort is one.

An invitation to the quiet launch Cohort 01 is closing Be first
Style 02

Shock

One number, set enormous in a high-contrast serif, on ink or full cobalt. No illustration, no stock photography. The figure is the image — and each is footnoted to its source.

1,599 GTA condo sales in 2025 Minus 88 percent condo starts 7,243 units scrapped
Style 03

The solution

The turn. Same typography, now carrying a list instead of a number. Ivory returns to signal that the argument has moved from the problem to the answer.

One source of truth Not a CRM. An operating system. Every role. One platform.
Formats

Story & reel

The same three styles recut to 9:16, chip moved to the safe zone, supporting line dropped.

Early access story
Shock story
Solution story
Reel cover
Reel cover"From first tour to deal closed."

The engine

A copy engine writes to a strict JSON contract and may reach for live search when the pillar is signal or expose. Cards export to PNG or JPEG, singly or as a zip.

The system prompt is the brand book in code: "Headlines 2–8 words. Operator voice, not marketer voice. Never use emoji. Never use exclamation marks. White · black · blue."

Seven pillars

Expose · Educate · Proof · Behind-the-scenes · Product · Voices · Signal — crossed with four audiences to give a 28-cell template matrix, each cell pre-written.

Twelve months planned with post, story, reel and carousel counts and a follower target.

Email, same voice

A four-week launch series with images inlined as data URIs. An MJML onboarding sequence merge-tagged for Loops. A re-activation series that opens "we went quiet. fair."

And The Agent Briefing — four Tuesday emails, each titled with a single number, written to be forwarded unedited to the agent's own client.

Launch email, week one
Week 1"Precon Finder is live — and it's built for agents like you."
Launch email, week four
Week 4"Only 2 free pilot spots left."
MJML onboarding email
Onboarding — three moves to a first win.
Book a demo
Demo — role as four icon tiles, and a preferred-time field, because the ask is a calendar slot.
The Agent Briefing
The Agent Briefing — $130,000 the HST rebate trap · $1.3 billion the fund shopping for unsold inventory · $8,475 the cost most agents forget · $200,000 a home.
09 — The film
Social ad storyboard, draft 01
Board first — nine shots, four bands, every frame with a timecode, a burned caption, a voice-over line and an effects note. The board carries its own publishing rule: every frame is PII-free; worksheets, users and brokerages admin screens were intentionally excluded.
Board
9 shots · ~12 s
Cut
9 shots · 854 frames · 28.47 s
Kept
6 of 9 frames, 5 captions verbatim
Dropped
Shot 06 — brokerage dashboard

Motion is a spring punch on each hard cut, then a slow Ken Burns drift. Device shots carry a persistent sine float so a static screenshot never reads as a still.

The ad · PcfDemo28.47 s 9 shots · 1080×1920 · 30 fps854 f
Find your next home · BuyerDemo32.60 s 11 shots · per-shot Ken Burns978 f
The agent experience · ClientDemo39.13 s 12 shots · browser chrome1,174 f
m@michaelji.com
Michael Ji · NA ©2015—2026
Plate 01 · the containing circle
Syntra
Done-for-you AI growth operations · Toronto · CAD
scroll
01 — Identity

A mark that had
to survive a favicon.

Mark
comet-globe, 2 paths
Palette
8, closed
Typefaces
3
Kit
33 assets · 66 files

An orbit and a comet, drawn as two closed paths and filled with one gradient — Sky #5FB1FF into Deep #0041BF. The whole identity had to hold at 512 px on a LinkedIn banner and at 16 px in a browser tab, so the wordmark drops away below about 24 px and the mark carries alone. Everything above is a consequence of that one constraint.

Electric blue on near-black is the signature. Neutrals carry a slight blue bias so nothing reads as flat grey.

— the brand book, on why there is no true grey in the system
Ink
#07080C
Panel
#11131C
Electric Blue
#2D5BFF
Deep Blue
#0041BF
Sky
#5FB1FF
White
#FFFFFF
Grey
#9AA3B4
Signal Green
#3FD9A2
Ag
Display
Space Grotesk
Wordmark · headlines · numbers
Ag
Body
Inter
Paragraphs · UI · captions
Ag
Mono
IBM Plex Mono
Eyebrows · labels · metrics
Syntra logo lockups on dark, light and imagery
Lockups1600×600 / 1200×1200
The Syntra brand asset package cover
Asset package v1.033 assets · 10 categories
02 — Positioning

Sell the outcome,
not the hours.

Ladder
4 rungs
Crew
6 agents
Currency
CAD
Guardrails
CASL · PIPEDA

An agency sells hours; a tool hands you a login. Syntra sells a running system — so the offer had to be a ladder, not a menu. You land on the rung where you're losing the most, prove it, then climb. Nobody is ever pitched the whole thing at once.

Free wedge
Growth Audit + Reputation Snapshot
Human-delivered. Shows exactly where you're leaking money — before you spend a dollar.
$0
Rung 1 · entry
Syntra Capture & Convert
Speed-to-lead, missed-call text-back, reviews, nurture, CRO and attribution.
from $999/mo
Rung 2 · scale
Syntra Visibility & Growth Engine
Local SEO, Google Business Profile, content, GEO (AI search), managed paid acquisition.
from $1,999/mo
Rung 3 · ceiling
Syntra Operating System
The entire growth function run as one managed system, with a strategist on top.
let's talk

The crew

Six agents, each with one job. Start with one — usually Speed-to-Lead — and add the next only when the last one has paid for itself.

SL
Lead response
Speed-to-Lead

Answers every new lead and missed call in seconds — SMS, email and voice — qualifies, then books.

RV
Reputation
Review Agent

Asks at the right moment, routes to Google, drafts on-brand responses for approval.

BK
Scheduling
Booking Agent

Qualifies and books straight to the calendar, sends reminders, cuts no-shows.

CH
On-site
Website Chat

Answers FAQs and routes leads 24/7, handing the hot ones to Speed-to-Lead.

FU
Nurture
Follow-Up Agent

Runs months-long nurture and reactivates the cold database — buyers hiding in the CRM.

RP
Reporting
Reporting Agent

Writes plain-English weekly reports and flags anomalies before they cost anything.

AI proposes. You approve. It executes.

The line the whole positioning rests on — and the one the software actually enforces
1 · AI drafts
In your voice

The agent prepares the reply, review response or follow-up.

2 · You approve
Until it's proven

A human reviews and approves before anything sends.

3 · It runs
With spot-checks

Proven low-risk flows auto-send. High-risk verticals stay human-approved, permanently.

The Syntra homepage hero: the comet-globe with the six agents in orbit
index — the mark, load-bearingthe crew orbits the globe it was drawn from
The Syntra packages page showing the four-rung ladder
packagesthe ladder, live
The AI crew page showing all six agents
crewsix agents
03 — The public site

73 pages. One stylesheet.
No build step.

Every route is a file; the URL is the filename. Static HTML on Hostinger LiteSpeed — what is in the repo is what is served.

Syntra homepage
index
Home
the whole argument, once
Capture and Convert package page
package-*
Offers
7 pages
AI crew page
crew-*
The AI crew
7 pages
Dental industry page
industry-*
Verticals
9 pages
HVAC Toronto local landing page
{trade}-{city}
Local landing
12 pages
Integrations page
integrations-*
Your stack
13 pages · 18 tools
Audit hub page
audit-*
The free-audit funnel
8 pages
The two-minute diagnostic quiz
quiz
The diagnostic
routes you to a rung

The local pages are the reason the file count is what it is. HVAC in Toronto and HVAC in Calgary are separate documents with separate copy, because a page that says "serving Canada" ranks for nothing and converts nobody.

Every form on all 73 pages posts through one script. Add a page, add it to sitemap.xml — that is the entire contribution process, and it is written down because it is the only rule that gets forgotten.

04 — The decision

We killed the
good version.

Was
Next.js · Vercel · Supabase
Now
PHP 8 · SQLite
Deps removed
11 → 0
Build step
none

There was a real Next.js agency OS. App Router, TypeScript, a 22-model Prisma schema, Clerk for auth, Inngest for jobs, a design system ported from an approved preview. It ran. It was replaced by three files on a box that was already paid for.

The reasoning was not fashion. The agency needed a console that a two-person team could deploy at 11pm from a phone, that could not break because a dependency shifted, and that cost nothing on top of the hosting already bought for the marketing site. One upload, one file. Shared hosting cannot keep a Node process alive — so the design brief became "no process to keep alive."

Retired · syntra-os

The framework build

Next.js 14 · App Router · TypeScript · Prisma · Vercel + Supabase
Prisma models22
TS / TSX files33
Dependencies11
Build steprequired
Deploypipeline
Shipped · syntra-cms

Three files

PHP 8 · SQLite · Hostinger · Google SSO · one upload
Tables9
Files that matter3
Dependencies0
Build stepnone
Deployfile manager
api/index.php3,617 lines — every route, auth, mail, revenue
admin/index.html3,640 lines — the entire console
_cmsdata/schema.sql145 lines — applied on first hit

One file on purpose: shared hosting, one upload.

The comment at the top of a 3,617-line PHP file, explaining itself to whoever comes next

The database and the signed contracts live in _cmsdata/, one directory above public_html — so no request can ever reach them, and PDFs are served back through the API behind auth. The 22 models became 9 tables not by cutting scope but by deleting the ones that existed to satisfy the ORM.

05 — The console

The part clients
never see.

Views
6
Auth
Google SSO
Residency
SQLite · Hostinger
Capture
live, redacted

Six views run the whole business: Dashboard, Leads, Messages, Agreements, Clients, Settings. Everything below is the production console at real volume, with every figure and every client identity redacted. What survives is what the case study is actually about: the density, the structure, and the rules the software enforces.

Monthly earnings
$48,210
$9,340 held back
Booked contract value
$317,880
8 signed · avg $39,700
Signed rate
100%
7 of 7 · avg 1 hr to sign
Leads held
138
156 contacts · 22 consented
Syntra OS dashboard: revenue, pipeline and triage
Dashboard — revenue, pipeline, and what needs you todayidentities and figures redacted
Leads board with filters and columns
Leads134 rows · CSV import
Clients view grouped by contract size
Clientskey / growth / core
Agreements view with open, signed and lost rates
Agreements — send, track, signdrafts excluded, so the rates mean something
The agreement builder, client step
Agreement builder · step 1the exact legal entity
The agreement builder, package and fees step
step 2the ladder, priced
Settings: allowlist, SMTP and integrations
Settingskeys masked at capture
The admin sign-in screen
The doorGoogle SSO · password fallback

Revenue comes from signed agreements only. Sent and opened are pipeline.

Why the dashboard's biggest number is the one hardest to move

The builder's four steps — Client, Package & fees, Terms & options, Review & send — fill themselves from whichever rung you pick, and the published range is printed under the selector so the person quoting cannot drift from the page. When the site and the contract disagree, the signed contract wins and the page is what gets fixed.

The console's revenue maths is a direct port of the builder's own totals function rather than a reimplementation, so the number in the dashboard and the number on the signed PDF cannot diverge. A client counts toward monthly earnings only while its stage is automatic; a stage set by hand is shown as held back — visible, not silently dropped.

06 — End to end

Stranger to
signed.

Entry
any of 73 pages
Fan-out
2 destinations
Failure mode
either, safely
Exit
monthly revenue
A form any of 73 pages syntra.js fan-out Leads a row, triaged Agreement sent › opened › signed Revenue monthly earnings submit ?r=intake build signed in parallel Klaviyo public company_id may fail · lead still lands any outbound Consent gate CASL · PIPEDA no record, no send PIPELINE REVENUE
One submit, two independent destinations, one gate, one boundary. The fan-out exists so that neither the CMS nor Klaviyo is a single point of failure. The consent gate sits on everything outbound, not on the record itself. And the dashed line is the rule the dashboard is built around: sent and opened are pipeline; only a signature moves money across it.
01 — Submit

A form on any of 73 pages

Audit request, quiz result, contact, newsletter — every form on the site is handled by the same script. There is no per-page integration to forget.

02 — Fan-out

Two destinations, neither trusted

The submit goes to ?r=intake on the same origin and to Klaviyo. Because the first is first-party it needs no key at all. The two are deliberately independent, so one can fail without losing the lead — which is the entire reason the fan-out exists.

03 — Land

A row in Leads

The lead appears on the board with its source form named, ready to triage. Nothing is emailed to a human inbox to be lost.

04 — Consent

Nothing sends without a record

No email or SMS goes out without a valid consent record against that contact. CASL and PIPEDA are enforced by the schema, not by remembering.

05 — Agree

Built, sent, opened, signed

The builder produces the contract; the console tracks it through sent → opened → signed and files the executed PDF outside the web root. Seven of seven have signed, averaging an hour.

06 — Count

Only then is it revenue

A signature is what moves money into monthly earnings. Everything before it is pipeline, and the dashboard is built to make that distinction impossible to blur.

m@michaelji.com
Michael Ji · NA©2015—2025
PREV