Pure and Vile
- Brand
- KIRA
- Year
- 2015
- Format
- Capsule collection(s)
- Location
- Montreal, Canada
- Materials
- Various mediums and treatments on canvas
ˈki.ra; a proponent of rumination and stealth execution. It is, at its core, the all-seeing warrior at the behest of hell.

NSM
nonspiritual matter; nothing dies. it is recreated. reborn. forever.
Plate 01 — set out
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/projects
Map, listings, builders. No account.
/c/{clientId}
Agent-branded. Link-based, no sign-in.
/dashboard/*
Browse, clients, worksheets, deals.
/brokerage/*
Seats, board, exclusive stock, brand.
/admin/*
Tenants, accounts, stages, CMS.
Promise.allSettled, tagged and revalidated.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.
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.
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.
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.
| Source | Endpoint | What it carries | Cadence |
|---|---|---|---|
| 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 |
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.
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.
Ivory ground, navy type, a hairline chip. Scarcity written as restraint — the invitation reads like a private placement, because a founding cohort is one.
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.
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.
The same three styles recut to 9:16, chip moved to the safe zone, supporting line dropped.
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."
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.
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.
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.
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.
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.
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.
Answers every new lead and missed call in seconds — SMS, email and voice — qualifies, then books.
Asks at the right moment, routes to Google, drafts on-brand responses for approval.
Qualifies and books straight to the calendar, sends reminders, cuts no-shows.
Answers FAQs and routes leads 24/7, handing the hot ones to Speed-to-Lead.
Runs months-long nurture and reactivates the cold database — buyers hiding in the CRM.
Writes plain-English weekly reports and flags anomalies before they cost anything.
AI proposes. You approve. It executes.
The agent prepares the reply, review response or follow-up.
A human reviews and approves before anything sends.
Proven low-risk flows auto-send. High-risk verticals stay human-approved, permanently.
Every route is a file; the URL is the filename. Static HTML on Hostinger LiteSpeed — what is in the repo is what is served.
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.
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."
One file on purpose: shared hosting, one upload.
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.
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.
Revenue comes from signed agreements only. Sent and opened are pipeline.
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.
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.
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.
The lead appears on the board with its source form named, ready to triage. Nothing is emailed to a human inbox to be lost.
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.
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.
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.