Colin Calnan

Twenty years building software

Lake Country, British Columbia

colin.calnan@gmail.com

I build the machine,
not the posts.

Design the brand. Build the pipeline that renders in it. Publish on a schedule with nobody in the loop. Those three usually belong to three different people. I do all three, in text, images and video, on work that shipped and that other people used. I build with AI coding agents, spec first, and every piece below says exactly how. Three builds with live pages of their own come first, then four case studies, then the smaller things I keep building.

189,277 Impressions on posts these pipelines made and published 139 measured posts, 14 months, to August 2026
57,288 Views on one reel, cut out of an unattended gig recording by a script Instagram, a single post, same source
225 Posts generated, rendered and shipped across three brands 102 video, 79 image, 21 carousel, 23 text

Builds

Live pages, kept up to date

The foot stomper in Colin's fingers, a small grey board with a blue button, its screen reading FOOT TRIG, ARMED in green, tap counter at 1.
Music hardware · August 2026

Foot Stomper

A kick drum I wear on my foot, because a stomp box was wrecking my hip. An accelerometer on the instep feels a tap or a stomp and sends a bass drum over Bluetooth MIDI. It catches 39 of 40 taps with zero false triggers, measured, and it's still on the bench.

Read the build →
Colin playing acoustic guitar at a mic in a bright function room, filmed from the phone clipped to his speaker stand.
Music and AI · May 2026

Gig Splitter

Two hours of gig video in, a captioned reel per song out, named by what I played. Loudness finds the songs, Whisper hears the lyrics, Claude names the song, and the most repeated line picks the chorus. Run on six gigs, and the page shows where it still breaks.

Read the build →
The top of the Bold Talks page: a pale teal-grey page under a teal, yellow and violet stripe, the huge title BOLD TALKS, and a line saying it is the design system every page is built on.
Design system · June 2026

Bold Talks

The design system every page here is built on. It started with Shawn Kanungo's keynote slides and became a design.md an AI agent reads before it builds anything, inspired by Vercel's. Pages in minutes, not hours.

Read the build →

How I build

Spec-driven, with AI, on the record

I build with spec-driven development. I packaged the method as a skill any coding agent can run, and it's public: github.com/colincalnan/sdd. The agent writes most of the code. I own what gets built and what counts as done.

A constitution before any code. Every repo starts with a mission (what it is, who it's for, how we'll know it worked), a tech stack with the rules the agent must never break, and a roadmap of phases that each ship on their own.

An intent interview before every phase. What's wanted, the constraints, what failure looks like, what success looks like, and what it touches. If any of the five is missing the agent stops and asks, rather than filling the gap with a guess.

A dated spec, then the code. Requirements, a plan in task groups, and a validation file that says how done gets proven, with checks the agent can run itself. Done means validated, not merely written. The rule underneath all of it: I stay in the loop the whole way, rather than turning up at the end to approve a diff.

How a thing is built is a separate question from whether it uses AI when it runs, so each piece says both. The gig splitter runs Whisper and Claude every time. The foot stomper runs none: it's firmware, a threshold and a timer.

Foot Stomper, the specs folder

specs/
  mission.md
  tech-stack.md
  roadmap.md
  method.md
  2026-08-28-project-scaffold/
  2026-08-28-sampling-and-power/
  2026-08-31-adaptive-detection/
    requirements.md
    plan.md
    validation.md
    STATUS.md
BuildBuilt with
Foot StomperClaude Code and the SDD skill, 34 of 34 commits co-authored
Gig SplitterClaude Code, 17 of 17, before SDD was a skill
Lake Country ZoningClaude Code, 29 of 30
Home network checkupClaude Code, 13 of 17
This portfolioClaude Code, every commit
Gig PulseVS Code with GitHub Copilot
Set List EasyVS Code with GitHub Copilot
Tidy RecipesLovable to test the idea, 5 of 25 commits, then Claude Code

Commit counts from each project's git history, 10 Sep 2026. The foot stomper's first six firmware versions came out of one claude.ai conversation, the night before the repository existed. Advisor Assist and Wines of the Okanagan were built in 2022 and 2023, before any of these tools.

Selected work

Four, in depth

Generative media SaaS

Advisor Assist

A subscription that wrote and posted a financial advisor's social media for them, every month, on their own branding, without them doing anything.

Three advisors' feeds. Every card generated, branded and published by the pipeline, on a schedule, without them or me touching it.

Financial advisors know their clients need to hear from them every week. Almost none of them post, because writing is not the job they trained for. So we sold them the posting. They paid, connected their accounts, and their feed filled itself.

01
The source

They buy a tier and connect their own accounts

They pay through Stripe, which sets their plan. Then they link their own LinkedIn, Facebook and Instagram themselves, through a handoff that means I never see a password. Everything the system needs about them now lives on one row: what they paid for, which accounts to post to, their firm, their hashtags, their brand colours.

02
The generation

A year of posts, written before the year starts

An advisor's year has a shape: tax season, the new year, RRSP deadlines. So we took two years of my partner's own posts, fed them in as the voice to copy, and wrote a whole year of content against that calendar in one go. Written ahead, not on the day. That is what made it cheap enough to run for everybody, every month.

03
The template

Their brand, composited in, four ways

The four designs are not pictures, they are forms with slots. Their logo goes in one slot, their three brand colours in others, so every post comes out looking like their firm rather than like a template. What they paid for decides how much gets filled in.

Two of the four templates. The Elite one has a slot along the bottom for the advisor's own logo and the Basic one does not, which is what paying more actually bought.
04
The publish

Once a month, unattended

Once a month, at one minute past midnight, it wakes up, goes through the customer list, and hands each advisor off to be built and posted. Their month goes out on the days it was meant to. Nobody watches it happen.

Five Pipedream workflows: the emitter, two listeners, a JWT generator and a profile guard.
AI
Built in 2022 and 2023, before Claude Code existed.
Role
Built the product. A partner brought the advisor relationships.
Decision
Copy was generated in batch, against a calendar, rather than per post at publish time. It cost a month of lead time and it is why the pipeline could run for every advisor every month without a model in the hot path.
Status
Ran live, posting to advisors' own feeds on a schedule.
  • Next.js
  • TypeScript
  • Pipedream
  • Airtable
  • Stripe
  • Ayrshare
  • BannerBear
  • OpenAI API
Generative media pipeline

Wines of the Okanagan

An Instagram account that builds itself out of a public winery database.

Four kinds of post, four templates, one account. The profile card is the one I still like: body, tannins, sweetness, acidity and alcohol arrive as numbers in a column and leave as meters, with the bar length and the colour dot drawn from the values. Every one of these is a row in a table. Nobody laid any of them out.

Every winery in the province is listed in a public database and every one of them wants to be found. Nobody was turning that list into something people would follow.

01
The source

The winery database, read through its API

The database is public, so I pulled the whole thing into a spreadsheet: one row per wine, with the producer, the vintage, how it tastes, the winery's handle and a photo of the bottle. Once the facts are in a table, the only question left is what they should look like.

02
The template

Twenty-eight named layers, not artwork

Every part of the card has a name, so the design can go and fetch its own content. The tasting notes are the good bit: the bar next to "tannins" is as long as the number in that column, and the little colour dot is the wine's actual colour. Nobody sets those. That is the whole trick, and it is why adding a new kind of post later meant making a new form, not building a new thing.

The BannerBear editor. Every field on the card is addressable.
03
The generation

Five series over the same table

Five kinds of post, all off the same table: a tasting profile, an award score, a tasting note, a fact about the region, and a winery of the week. They look nothing like each other and still read as one account, which is the hard part. Winery events came from somewhere else entirely, pulled out of an inbox.

04
The publish

It posts itself

Everything goes out on a schedule with nobody approving anything, through the Instagram publishing API. I also subscribed to every winery newsletter and ran a job that read the incoming mail for deals and events and pushed those out through their own template.

AI
Built in 2023, before Claude Code existed.
Role
Everything. Brand, scraper, templates, generation, scheduling, both accounts.
Decision
Every field on the card is a named layer rather than baked into the artwork. It costs more up front, and it is the reason a new kind of post was a new template rather than a new build.
  • Make.com
  • Airtable
  • BannerBear
  • Instagram Graph API
  • API scraping
Brand, site, product

Safe Family InternetSiteGuides

A brand, a set of guides and the machine that produces them, made to get parents to change one thing at home tonight.

The biggest thing the brand produced: a roughly 200 slide deck, delivered to a full theatre. The slide, the phone frame, the type and the instruction all came off the same token file as the guides and the posts.

An internet safety initiative I started in Lake Country. Parents are told constantly that the internet is dangerous for their kids and almost nobody tells them what to change, or in what order. So I built the answer, and then I built the brand that carries it, so other people could use it without me in the room.

01
The idea

One model, and everything hangs off it

Everything hangs off one idea: there are four layers between a stranger and your kid, and you should fix them in order. The apps, then the device, then the home network, then the people around them. Every guide, every slide and every post is one step inside one of those four.

The castle model. Information architecture, not a diagram drawn afterwards.
02
The template

A brand, and the rules for using it

A shield, a name, and a logo that animates from unprotected to protected, exported as 22 files covering every colourway and size so a volunteer never has to crop one. Under it a design system: the colours, the type, and seven kinds of slide. The deck, the guides, the posts and the site all read from it.

Four of the twenty-two exports. Every colourway and size anyone might need, so nobody ever has to crop one themselves.
03
The generation

Everything comes out on brand without a designer

Take screenshots on your phone, drop the folder in, and out come eight branded step-by-step guides, each screen framed with a pink box around the thing to tap. Posts work the same way: type the words, get finished slides in the right colours and fonts. A roughly 200 slide deck came off the same system.

Left, what you take on your phone. Right, what comes out. Nobody drew the one on the right.
04
The video

The talk becomes a month of clips

The evening was filmed end to end. The same cutter I use on my own gigs listens to the recording, finds where one point stops and the next begins, cuts them out and burns the captions on. 19 clips came out of one evening, then went into the schedule alongside the carousels.

Three frames from one clip. The yellow caption block is the same one the slides use.
05
The publish

Out to the platforms, and into people's homes

The slides post straight to Instagram and LinkedIn as proper swipeable posts, with no Canva and no scheduler in between. The guides sit behind an email form that checks the address, adds it to the list and sends the download. 260 sign-ups claimed every seat for one night in a town of 15,000.

Three slides from one post. Same type, same colours, same footer, and not one of them laid out by hand.
AI
Built with Claude Code alongside other tools. The carousel maker runs as a Claude Code skill: type the words, get the slides.
Role
Everything. Brand, copy, design, build, deploy, and the talk it all supports.
Result
260 sign-ups claimed every seat, 38 more on the waitlist, and 48 households ran a home network checkup. Covered by CBC Daybreak and AM1150.
  • Netlify
  • Serverless functions
  • Brevo API
  • Airtable
  • Design system
Video pipeline

Colin Calnan MusicBuild

A two hour recording of a gig goes in on Saturday morning. Twenty three captioned clips come out, named after the songs, ready to post.

Three nights, three venues, one phone on a stand each time. Every clip on that account came out of a recording like these without anyone opening an editor.

I play covers most weekends and there is always a phone clipped to the speaker stand recording the whole set. That footage used to sit on a drive because going through two hours to find the good bits is a job nobody does twice.

01
The source

One phone, one long file

Nothing is set up for this. The phone is on the stand for every gig anyway, so the input is free and it arrives whether I do anything or not. The whole problem is what happens to it afterwards.

02
The detection

Find the quiet bits

A song is loud and the gap after it is not. So the script reads the loudness of the whole recording, draws a line across it, and calls everything above the line a song and everything below it a gap. No transcription, no model, just the shape of the sound.

One gig, 120 minutes. Each shaded band is a song it found. The white gaps are me talking between them.
03
The cut

Cut, caption, name

Each band becomes its own vertical clip with the captions burned on. The file names come from what was actually played. 23 clips from one night, and I did not watch any of the footage.

The output folder. Every song its own clip, every clip its own captions, all named by what was played, so the folder is already a set list.
04
The publish

A month of posts from one evening

They go out on a schedule over the following weeks. One of them has 57,288 views, which is more than anything else I have ever put online. The same script now runs on talk footage too: one evening at the theatre came back as 19 clips.

A month of the account. Every one of these is a clip the script found and cut, with a line written over it afterwards.
AI
Built in Claude Code, 17 of 17 commits. When it runs, Whisper hears the lyrics and Claude names the song. Finding the songs and the chorus is plain code.
Role
Everything, and I am the only user. Every decision got tested at a real gig that week.
Decision
It finds songs from loudness alone, not from listening to the words. Cruder, and it means it works on a talk, a set, or anything else with pauses in it, for nothing per run.
  • Python
  • librosa
  • ffmpeg
  • Whisper
  • Buffer API

Craft

Things I keep building

Public writing

Loops

Getting an agent to finish a job instead of stopping halfway is a skill, and almost nobody writes it down. So I did: fifteen free lessons on designing agent loops, what makes a check real rather than two optimists agreeing, and where to keep a person in the chair. It is how I work every day, in Claude Code and Codex.

Geospatial tool

Lake Country Zoning

Before a designer can sketch anything they need to know how much of the lot they can build on, which means reading the zoning bylaw and measuring in from every edge by a different amount. Half an hour, every time. Type an address into this and it comes back in fifteen seconds, drawn on the lot.

Product, on Supabase

Tidy Recipes

Every recipe online sits under a life story and a wall of ads. Paste the link and you get the ingredients and steps on one screen, scaled to however many you're feeding. Supabase does the sign-in and the saved library, and an edge function has GPT read each recipe once and caches it, so the second person to paste that link costs nothing. A WordPress plugin gives publishers the same cook mode on their own pages with no AI at all, because it reads the recipe data they already publish.

Product, with payments

Set List Easy

You know six chords and you have a two hour gig on Friday. Every song list online is sorted by artist or decade, never by how hard it is to play. So this one is. People pay for it.

Live tool, on stage

Gig PulseAppSite

Every musician thinks they know which songs work. Nobody writes it down, because you cannot take notes with a guitar on. So this is one tap: applause is worth one, dancing two, singing three, screaming five. After enough gigs it tells you which songs to keep. 120 songs scored so far.

Instrumentation

Social metrics

Pulls the numbers back out of everything I post and tells me the truth, including the unwelcome part: reach behaves like a lottery, so the useful question is how often you buy a ticket.

The part software cannot do

The thread through all of it is the same, and it is not the code. It is taking something complicated or frightening and making a person who is not an expert know exactly what to do next. Tools keep getting better at producing output. They are not getting better at knowing which output was worth making, or at earning the trust required for someone to act on it.

I would rather show it than describe it.

Open full size