DEV Community

Cover image for Spotify Built “Honk” to Replace Coding. I Built My Own for $15.
Phil Rentier Digital
Phil Rentier Digital

Posted on • Originally published at rentierdigital.xyz

Spotify Built “Honk” to Replace Coding. I Built My Own for $15.

Cool. Neither have I.

The difference is nobody held an earnings call about my setup. Probably because it runs on a $5 VPS and some duct-tape n8n workflows instead of a proprietary system with a cute name and a PR team.

TL;DR: Spotify's "Honk" is not magic. It's 4 boring pieces duct-taped together: a chat trigger, an AI coding agent, a CI pipeline, and a notification loop. You can wire the same thing this weekend with n8n, Claude Code's CLI mode, a GitHub Actions workflow, and a Slack webhook. Total infrastructure cost: ~$15/month. I'll show you how — and more importantly, I'll tell you what breaks when you actually run it.

The most overhyped earnings call of 2026

So Spotify's co-CEO goes on a Q4 call and says his best engineers deploy features from Slack on their morning commute. He credits an internal system called "Honk" (built on Claude Code) and drops the line that launched a thousand LinkedIn essays: the company shipped 50+ features in 2025 using this setup.

The internet melted. Software engineering is dead. Developers are obsolete. Start learning plumbing.

Meanwhile, one engineer on X replied: "best devs haven't coded since december but somehow the shuffle button still doesn't work." Another called it "speedrunning technical debt." And honestly — both sides are right, and both sides are missing the point.

The interesting question isn't "did Spotify automate coding?" It's how — because when you strip the PR layer off, what remains is almost embarrassingly simple.

Here's what Spotify actually described:

  1. Engineer sends a message in Slack
  2. Claude Code picks it up and writes the code
  3. Code goes through CI/testing
  4. Engineer gets a build notification to review
  5. They merge from their phone

That's a webhook, a headless AI call, a git push, and a Slack notification.

I've been building variations of this since January — except mine costs less than a Netflix subscription and nobody's writing about it in Fortune. But since everybody wants the behind-the-scenes, let me show you the actual wiring. Every piece. No hype.

Shipping isn't about having the fanciest system. It's about wiring 4 boring things together and trusting the duct tape.

The trigger is the least interesting part (and it's all anyone talks about)

Everyone fixated on the "from Slack on their phone" angle like Spotify invented telepathy. A Google engineer on X even reframed the whole thing as "the job moved upstream." Deep stuff. Except it's a webhook.

{
  "nodes": [
    {
      "name": "Slack Trigger",
      "type": "n8n-nodes-base.slackTrigger",
      "parameters": {
        "event": "message",
        "channelId": "C_YOUR_DEPLOY_CHANNEL"
      }
    },
    {
      "name": "Parse Command",
      "type": "n8n-nodes-base.code",
      "parameters": {
        "jsCode": "const msg = $input.first().json.text;\nconst match = msg.match(/^honk\\s+(.+)/i);\nif (!match) return [];\nreturn [{ json: { task: match[1], user: $input.first().json.user } }];"
      }
    }
  ]
}
Enter fullscreen mode Exit fullscreen mode

You type honk fix the checkout race condition on mobile in a Slack channel. n8n catches it, parses the command, passes the task downstream. Could be Discord. Could be Telegram. Could be a curl command from the Shortcuts app on your iPhone while you're waiting for your kid's dentist appointment.

The trigger technology doesn't matter. At all. It's the least interesting brick in the stack and somehow it's the part that went viral.

The brain — and why most people get this brick catastrophically wrong

This is where the article would normally drop a bash script and move on. But the brain is the only brick that actually matters, and it's the one that will destroy your codebase if you configure it like most tutorials suggest.

The core idea: claude -p (or --print) runs Claude Code headless. No interactive terminal. No human in the loop. You feed it a prompt, it does the work, it outputs the result. An autonomous agent with commit access to your repo.

Sounds terrifying? Good. It should. Because without constraints, headless Claude Code is the dev equivalent of giving your car keys to a teenager who "technically has a learner's permit."

The secret isn't the command. It's what you don't let it do.

#!/bin/bash
TASK="$1"
REPO_DIR="/home/deploy/my-saas"
BRANCH="honk/$(date +%s)"

cd "$REPO_DIR"
git checkout -b "$BRANCH"

claude -p "You are working on a Next.js + Convex + Clerk SaaS app.
Your task: $TASK

Rules:
- Run the existing tests before AND after changes
- If tests fail after your changes, fix them or revert
- Commit with a descriptive message prefixed with [honk]
- Do NOT modify .env files
- Do NOT touch auth configuration
- Do NOT install new dependencies without explicit approval" \
  --allowedTools "Bash(npm test:*),Bash(npx convex*),Edit,Read,Write" \
  --max-turns 30

if [ $? -eq 0 ]; then
    git push origin "$BRANCH"
else
    git checkout main
    git branch -D "$BRANCH"
fi
Enter fullscreen mode Exit fullscreen mode

That --allowedTools flag is doing all the heavy lifting. You're giving Claude permission to run your test suite and Convex commands, but blocking everything else. No rm -rf. No random npm installs. No "let me just quickly refactor your entire auth layer because I have opinions about your token rotation strategy."

If you've read my Prompt Contracts piece, this is the exact same principle applied to unattended execution. Vibe coding is gambling. Prompt contracts are insurance. And when there's no human watching at 4 AM, insurance is all you've got.

An autonomous agent without a test suite is a random number generator with git access.

Most headless Claude tutorials skip this part.

They show you claude -p "build me a feature" with zero constraints and call it automation. That's not automation. That's a prayer with a cron job.

The pipeline (you already have this one)

Here's a secret that undermines half the mystique: the CI/CD brick is the exact same GitHub Actions workflow you've been running for months. You literally just add a branch trigger.

name: Honk Pipeline
on:
  push:
    branches: ['honk/*']

jobs:
  validate:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: npm ci
      - run: npm test
      - run: npx tsc --noEmit
      - run: npm run build
      - name: Deploy to preview
        if: success()
        run: npx vercel --token=${{ secrets.VERCEL_TOKEN }}
        id: deploy
      - name: Notify Slack
        if: always()
        uses: slackapi/slack-github-action@v2
        with:
          webhook: ${{ secrets.SLACK_WEBHOOK }}
          payload: |
            {
              "text": "${{ job.status == 'success' && '✅' || '❌' }} Honk task done\nBranch: ${{ github.ref_name }}\nPreview: ${{ steps.deploy.outputs.url || 'Build failed' }}"
            }
Enter fullscreen mode Exit fullscreen mode

Test, typecheck, build, deploy to Vercel preview, notify. That's it. The Vercel preview URL means you get a live deployement to poke on your phone before anything hits production. Spotify's engineers get a custom build pushed to Slack. You get a link. Same idea, different polish level.

The whole "deploying from your phone on the morning commute" narrative that broke the internet? It's a preview link in a Slack notification. I'm not being dismissive — it's genuinely useful. But it's also something you can wire in about 20 minutes if you already have CI set up.

If you don't have CI set up — stop reading this article and go set up CI. Seriously. Everything downstream of "no tests, no pipeline" is just expensive chaos.

Closing the loop: merge from your couch

The Slack notification lands. You tap the preview link. You check if Claude actually fixed the checkout bug or if it solved the problem by removing the checkout page entirely. (Don't laugh — happened to me twice. Claude's idea of "simplifying the user flow" can get… creative.)

If it looks good, you merge the PR from your phone. GitHub mobile works fine for this.

The whole round-trip — from Slack command to production deploy — takes about 15–20 minutes depending on your CI speed and how fast Claude works.

And yeah, you can do this from the beach, from the couch, from a dentist's waiting room. Spotify's CEO made it sound like a paradigm shift. It's more like… a really good shortcut. But a shortcut that compounds. Two bugs fixed before breakfast becomes five features shipped per week becomes a velocity that solo devs weren't supposed to have.

When automation gets cheap, attention becomes the only expensive thing left.

The honest gap (and why it matters less than you think)

I'd be lying if I said my weekend project matches what Spotify built. It doesn't. And the hot takes calling Honk "just a wrapper" are naive.

Spotify has context you can't buy. Years of internal docs, Slack history, Jira tickets, institutional knowledge about why that one function in the payments module has 47 comments saying "DO NOT TOUCH." Their Claude instances presumably swim in proprietary context that makes outputs dramatically better.

Your Claude has a CLAUDE.md file and whatever you rememberd to put in it.

They have a fleet. Spotify published a 3-part engineering blog about Honk before the earnings call. They're running agent fleet management — queueing, priorities, resource allocation, monitoring, rollback. Your n8n workflow runs one task at a time. That's fine. Different scale, different needs. An indie SaaS doesn't need air traffic control for its one airplane.

But the architecture is the same. Trigger → brain → pipeline → notify → review → ship. The quality gap comes from what gets fed into the brain, not from how the pieces connect. And that's the part the LinkedIn thought leaders keep missing. They're writing eulogies for software engineering while the actual technical innovation is… a webhook and a shell script.

The real differentiator isn't the system.

It's the constraints.

Spotify has an entire platform team making sure Honk doesn't go rogue. You have --allowedTools and a well-written prompt contract. At scale, their approach wins. At solo-dev scale, yours is more than enough.

What actually breaks (because nobody writes this part)

I've been running headless Claude Code for a couple months now. Here's the stuff the "AI replaced coding!!" crowd doesn't mention.

Claude gets creative when you don't want it to. I woke up one morning to 6 merged PRs on my SaaS. Spent the next hour figuring out what half of them did.

One "bug fix" had quietly refactored a Convex mutation into a pattern I'd never seen before. Worked fine. Tests passed.

I still have no idea why it changed the approach.

That's not a bug — it's a trust problem that scales with velocity.

Context window bankruptcy is real. On complex tasks, Claude starts strong and degrades. By turn 25 of 30, it's forgotten constraints from the original prompt and starts improvising. The --max-turns 30 in my script isn't arbitrary — it's the point where I noticed reliability dropping off a cliff. Going to 50 turns doesn't get you 50 turns of quality. It gets you 25 good turns and 25 turns of Claude jazz-improvising over your codebase.

The "50 features" claim needs an asterisk. One indie dev on X said it best: "Spotify hasn't had a meaningful new feature since like 2019. Changing the colour of a button is not a feature." Harsh — but velocity without direction is just motion. I've caught myself shipping honk-generated changes just because they were ready, not because they were needed. Fast deployment rewards action bias. Sometimes the right move is git branch -D honk/* and going for a walk.

Speed without taste is just technical debt with better PR.

Should you actually build this?

Depends on your stack.

Yes, if: you have a predictable codebase (Next.js, Convex, whatever — something with patterns Claude can learn), a test suite that actually covers the critical paths, and the discipline to review before merging. The investment is a weekend of wiring, $15/month in VPS, and writing constraints that would make a compliance officer proud.

No, if: your codebase has no tests. Absolutely do not build this. An autonomous AI agent deploying untested code is not automation — it's a slot machine wired to your git remote. Build tests first. Come back in a month.

And if you're an enterprise thinking about "building our own Honk" — look at Claude Code's new --worktree mode and agent teams feature first. The DIY approach works for solo devs because one person understands the whole system. At 200 engineers, you need what Spotify actually built: a managed platform with guardrails, not a bash script and ambition.

For the rest of us — the indie hackers, the solopreneurs, the "I build my SaaS from a kitchen table in Mérida" crowd — the $15 version ships code. Real code. To real users. While you sleep, while you eat breakfast, while your kids argue about whose turn it is on the iPad.

Spotify has Honk. You have webhooks and constraints. The gap between a billion-dollar music company and a solo dev with a VPS has never been thinner. Build accordingly.


I wrote about rebuilding my entire OpenClaw infrastructure for $15 after Anthropic killed third-party tokens. If you want the VPS setup that makes all of this possible, start there.

Next up: I'm wiring Claude Code's new --worktree flag into this pipeline to run parallel tasks. Multiple Honks. A whole flock. That article might break me or my MacBook — but either way you'll hear about it.

Follow me if you want to read it before the hype cycle finds it.

Top comments (0)