I recently published a Homey app — Violet + BADU Blue Pool Control (app thread) — for a pool controller. That thread is about the app. This one is about how it was built, because the process was interesting in itself: the app was written without using a traditional IDE at all. Everything happened in Claude Code in the terminal, with GitHub for version control. Over time, the setup also grew into an automated, self‑checking development loop.
Here is how it went.
How it began — a few talks that changed my mind
I have worked in software development for a few decades, and I had clear opinions about how it should be done. A few talks changed that, and they are the reason I tried this at all.
The one that stayed with me was Boris Cherny (Creator and Head of Claude Code) saying that, once Claude Code existed, he basically stopped opening an IDE and did not go back to it. For someone who spent his whole career working inside an editor, that was surprising.
If you want to see what changed my mind, these are the talks:
- Why Coding Is Solved, and What Comes Next — Boris Cherny (the “the bottleneck moves” idea I come back to at the end): https://www.youtube.com/watch?v=SlGRN8jh2RI&t=802s
- Reflecting on a year of Claude Code: https://www.youtube.com/watch?v=Hth_tLaC2j8
- A live agentic‑coding session (Boris Cherny & Jarred Sumner): https://www.youtube.com/watch?v=DlTCu_pNDHE
So I decided to test the idea on a real and unfamiliar project. I am a solid C#/.NET developer, and JavaScript is close enough to read, but I had never written a Homey app, never used this controller’s local API, and the pool‑chemistry maths I wanted (a live Langelier Saturation Index safety net to protect my heat exchanger from corrosion) was new to me. That made it a good test: if IDE‑free, agent‑driven development only works on small toy problems, a project like this would show it.
The traditional path would have been several weeks of learning the SDK, working out the controller’s API, and then writing and debugging everything by hand. Instead, I stayed in the role of engineer and domain expert, and let the agent do the typing.
Superpowers: the basis for working without an IDE
What made this real engineering, and not just “chatting with an AI until something works”, was a set of workflow skills called Superpowers (by Jesse Vincent / obra). It gives the agent a fixed process and does not let it skip steps:
- brainstorming a design before writing any code,
- writing plans from that design,
- test‑driven development — tests first, then the code,
- systematic debugging instead of trial and error,
- a code review and a verification step at the end.
Two community skills handle the Homey‑specific parts: a homey‑app skill (everything Claude Code needs to now abount Homey SDK, conventions etc in one place) and a homey‑cli skill (using the Homey CLI, inspecting the live device, building flows from the terminal, way more functionality than the Homey MCP Server). This let the agent check its work against my real Homey while it worked.
The project was built milestone by milestone. Each milestone was turned into a spec, then a plan, then implemented test‑first, then validated and released, with:
- a committed progress dashboard for every milestone,
- git hooks that block broken manifest/changelog JSON and prevent secrets from being committed,
- automated security reviews (a dedicated review subagent and a written threat model) for anything that writes to the controller,
- everything in two languages (EN/DE), including the tests.
The result: an app with about 40 device capabilities, the LSI engine, optional write control, and a full unit‑test suite — from the first milestone to a Store test release in roughly two weeks of part‑time evenings (around 30–40 hours of my own time). If I had built it the traditional way, alone, while learning the SDK, working out the controller’s API, checking the chemistry, and doing the write path safely in two languages, I would estimate several months of spare‑time work (150–250 hours). The AI did not replace the engineering decisions; it mainly saved time on the parts that would have cost the most: learning the platform and the domain.
The next step: making the loop run on its own
Once the app was ready for the Store, I became more interested in the development loop than in the app itself. A short self‑assessment put my setup at level 3 of 4: the inner loop was verified (hooks, TDD, subagent checks), but there was no automated outer loop, no CI, and the test results did not actually block anything. This produced a list of 12 concrete improvements.
So I pointed the agent at its own toolchain. Using the /claude‑automation‑recommender skill (which analyses a repository and suggests hooks, subagents, CI and skills) together with the Fable 5 model, I worked through all 12. The main ones:
- Blocking gates — failing tests or a failing type‑check now block the commit; a missing changelog or version bump blocks a publish.
- CI and a heartbeat — GitHub Actions runs the tests and
homey app validateon every push, plus a nightly run. - A mock harness — the glue code in the device driver (where the one real crash had happened) is now tested every time.
- A read‑only live‑smoke test against the real controller.
- A stop‑verify hook — a work session cannot end with failing tests or a failing validate.
- A nightly triage routine that runs the suite and writes the findings into an inbox file that every new session reads first.
- Hook telemetry feeding a workflow “retro” — a small meta‑loop that learns from repeated friction.
- Condition‑driven milestone loops (
/goal) with a separate, cheaper model as the checker. - Model tiering — mechanical work runs on a small, fast model, and only the checking and judging steps use the strongest model, so the checker is never the weak point.
This moved the setup to level 4: an automated outer loop — nightly CI and triage, test feedback that really blocks, and telemetry as a basis for improvement.
Making it reusable
The last step was to move the whole setup out of the pool project and into a portable skill/plugin — skill‑agentic‑loop‑framework — so the same setup can be used on the next project from day one, instead of being rebuilt each time. GitHub - tnsturm/skill-agentic-loop-framework · GitHub
How well it works today
- The inner loop is verified by the hooks, TDD, subagent checks and the retro meta‑loop. The outer loop runs on its own: nightly CI stays green, and the triage inbox gets filled.
- The human still makes the decisions. Push and publish stay manual steps — the agent never ships on its own. My real work is the domain knowledge, testing on the real hardware, and the decisions.
- A good example: I evaluated moving the trickiest file to TypeScript and, after a proper test, decided not to do it — it would have added risk and kept two diverging build artefacts for no real type‑safety gain (the strict JavaScript check already covered that). The loop is good at doing the work; deciding whether to do it is still my job.
- Known bugs are not ignored — they are frozen as
todotests that describe the correct behaviour, so every run lists them without turning green until they are properly fixed. - Model tiering keeps the cost reasonable — you do not pay for the strongest model on mechanical work, and you never save money on the checker.
In short: I shipped an app well outside my previous experience, and I got a reusable, self‑checking development loop as a side effect.
Tools, if you want to try this
- Superpowers (the workflow skills — brainstorming, plans, TDD, debugging, review) — GitHub - obra/superpowers: An agentic skills framework & software development methodology that works. · GitHub
- homey‑cli skill for Claude Code — Homey-cli skill for Claude Code - drive Homey /build flows from terminal and AI agents
- homey‑app skill — GitHub - dvflw/homey-app-skill · GitHub
/claude‑automation‑recommender— the Claude Code skill that suggests hooks/subagents/CI/skills for a repository.skill‑agentic‑loop‑framework— the extracted, portable loop setup. GitHub - tnsturm/skill-agentic-loop-framework · GitHub- The example that got me started — Andi Wirz building a published Homey app with Claude without hand‑writing code: How I built a Homey app with Claude AI — without writing a single line of code myself | wirzfamily.ch
The bottleneck moves
Boris Cherny describes the whole change with one idea: the bottleneck moves. First the hard part is writing the code. Once that is automated, the hard part becomes verification. Once that is automated, it becomes the decision to merge and ship. After that, he expects it to be planning. His rule: “Every time there’s a new bottleneck, you have to automate that bottleneck.”
Back to the start
This brings me back to where I began: Boris Cherny not opening an IDE anymore. A few weeks ago that surprised me. After building and shipping a real app this way, and watching the bottleneck move step by step, it no longer looks like a bold claim to me. It looks like the direction things are going.
Happy to answer questions about any part of the workflow. The app itself is here: [Violet + BADU Blue — Pool control for Homey - Apps - Homey Community Forum] (and a German write‑up on poolsteuerung.de: [Violet + BADU Blue in Homey Pro – neue App mit LSI Berechnung - PoolDigital Forum]). The source is on GitHub: GitHub - tnsturm/violet-homey-app · GitHub