Calgary, Alberta · Software & AI consulting
Custom software for the way your company actually works.
I build the tools small and mid-sized companies can't buy off the shelf — and then put AI to work on the parts of the week still being done by hand. It starts with one task, not a strategy deck.
- web apps merged into one deploy
- 4 → 1web apps merged into one deploy
- intake channels, one record
- 5intake channels, one record
- vendor accounts in one directory
- 1,309vendor accounts in one directory
- languages from one codebase
- 3languages from one codebase
01The premise
Most AI projects fail
at the first step, not the last.
The pitch is usually a platform, chosen at the top, arriving as a pilot. It demos well and is quietly abandoned within two quarters — because the work it was meant to automate had never been written down in the first place.
The version that works is smaller and starts lower. Find one task a person does by hand every week, that follows the same steps every time, and that somebody else is waiting on. Automate that one. Then let what you learn choose the next.
Done in that order, AI stops being a project and becomes a property of how the company runs. That's what people mean when they say they want it at the centre.
02How it goes
The rungs are not optional.
Every engagement moves up this in order. Skipping to the interesting part is exactly what produces the pilot nobody uses.
Rung 1
One shape
Every way work arrives becomes the same record. Until that's true, nothing downstream can be automated, because there's nothing consistent to automate.
At Innova, five intake channels now produce one indistinguishable service request.
Rung 2
One source
Pull the systems you already pay for into one place, attach them to your real records, and never let a sync silently overwrite a person.
Innova's contact list holds our phone number and their email on the same person, on purpose.
Rung 3
One bounded job for the model
AI enters here — doing a narrow, checkable task inside a workflow you already run, not making decisions you'd have to audit.
Innova's phone agent calls a model once per turn to fill one field. The script stays a script.
Rung 4
Ask the business questions
Once the record is complete and the history is in one place, you can ask it things the original tools were never able to answer.
Ingesting Innova's mailbox through Graph backfills five years of history, not just today onward.
03What I do
Five kinds of work, one thread running through them.
Getting the work into one shape
Requests arrive by phone, text, email, a portal you don't control and a person walking up. Each one becomes the same record, so it can be triaged, measured and chased.
- Web and QR-code intake forms
- Inbound SMS and phone handling
- Scrapers and syncs for portals you can't change
- Triage rules written down instead of held in someone's head
AI on the parts that cost an afternoon
Not a chatbot bolted to the homepage. A model doing one bounded job inside a workflow you already run — reading, extracting, drafting, classifying — with a person still holding the decision.
- Phone agents that fill in a form, not hold a conversation
- Mail and document ingest that attaches to your real records
- Extraction and classification with a human check on the way out
- Drafting that leaves the sending to you
Internal tools that fit how you work
The scheduling board, the contact list, the tender package, the report nobody wants to assemble by hand. Built around your actual process rather than around a product's opinion of it.
- Scheduling and booking systems
- Directories that sync with your system of record
- Admin dashboards for people who aren't technical
- One-off tools that retire a spreadsheet
Consolidation and rescue
Four apps that should be one. A WordPress install doing an application's job. Three copies of the same logic drifting apart. Usually the fix is smaller than it looks, and finding that out is the first week.
- Merging separate apps into one deploy
- Rebuilds that keep every existing URL working
- Untangling shared accounts, keys and databases
- Taking over a codebase someone else left
Sites that do a job
Fast, accessible, and built so the copy can be changed without calling me. Multilingual where your customers need it, and honest when a form fails to send.
- Marketing sites with a real contact path
- Multilingual sites from one set of components
- Client portals with login and document exchange
- Content in one place, never buried in components
04Selected work
Three companies, none of them software companies.
A construction firm, a thrift shop and an accounting practice. The problems rhyme more than you'd expect.
2026 — ongoing
Innova Developments
Construction & property development
Four disconnected apps became one, then the phone learned to take a service request.
Innova had four separate web apps, three copies of the same database client, and a service desk that ran on whoever happened to answer. The work started as a merge and turned into the thing this studio is actually about: getting every way a job arrives into one shape, then letting AI handle the parts that were costing a person an afternoon.
- Next.js
- Neon Postgres
- Twilio Voice & SMS
- Claude API
- Microsoft Graph
2026
Scavenger
Retail — thrift shop, Calgary
A shift board for a shop staffed by volunteers, where the database refuses to double-book.
A thrift shop was scheduling its floor staff through a signup page built for a single weekend. It became an open-ended calendar that keeps working month after month — with the opening hours as data rather than code, and the fairness rules the owner ran informally written into the software.
- Next.js
- Postgres
- Twilio SMS
- Vercel
2026
Dynasty Advisory
Accounting & financial advisory
A WordPress marketing site rebuilt as an application, with the client portal already designed into it.
An accounting firm's site was a WordPress install doing a brochure's job slowly. The rebuild kept the brand exactly — colours and type lifted from the live stylesheet rather than reinterpreted — and made the next two phases, client login and document exchange, an extension rather than a second rewrite.
- Next.js
- TypeScript
- Tailwind
- Server Actions
- Zod
There is probably one task in your week
that shouldn't be yours.
Tell me what it is and roughly how often it happens. If it's a fit I'll say what I'd build and what it costs. If it isn't, I'll say that too.