---
title: "My standing desk, in Home Assistant"
url: https://gardiner.today/past/ha-desky
tense: past
edition: "2026.11.02"
updated: "2026-11-02"
---

# My standing desk, in Home Assistant

ha-desky

Independent. Developer, July 2025 to now.

A Home Assistant integration that controls Desky standing desks over the Bluetooth already in them. It was my first Python, vibe-coded with Claude Code in three days, and fourteen months later I reworked it to reach Silver on Home Assistant’s quality scale. [github](https://github.com/j0rdsta/ha-desky)

## Highlights

- [no extra board](https://gardiner.today/past/ha-desky#the-desk): It talks to the desk over the Bluetooth already in its controller, with no board added to the desk.
- [three days](https://gardiner.today/past/ha-desky#three-days): Version one, my first Python, written with Claude Code while I worked out how the desk talks.
- [people relied on it](https://gardiner.today/past/ha-desky#people-used-it): Other people installed it, reported errors and wrote back, for something I built for my own desk.
- [grown up to Silver](https://gardiner.today/past/ha-desky#growing-it-up): A week of rework: a 95% coverage gate, CI on every pull request and Silver on Home Assistant’s quality scale.

## The desk

My desk at home is a Desky. Its controller already has Bluetooth, which the Desky app uses to move it and store presets. I wanted the desk in Home Assistant with the rest of the house, so scenes, voice and automations could move it too, without adding a board to the desk the way Upsy Desky does. I’d also never written Python, and I’d been meaning to try Claude Code on something real, so the desk became my first Python project, and a real test of Claude Code.

**the call i made**: Add a board to the desk, or use the Bluetooth it already has?

- Took: The Bluetooth it already has. Nothing to fit, and the controller can already do the work.
- Turned down: A board, as Upsy Desky adds. More hardware on the desk for something it could already do.

It’s an integration, a custom component you install through HACS, and it needs no extra hardware. It reaches the desk over the same Bluetooth connection the Desky app uses, through the computer’s Bluetooth adapter or an ESPHome Bluetooth proxy. It’s open source under the MIT licence, and unofficial: I’m not affiliated with Desky.

Ask Ardo: [why did he build ha-desky?](https://gardiner.today/future?q=why%20did%20he%20build%20ha-desky%3F)

## Three days

Version one took three days, from 29 July 2025. Claude Code wrote most of the Python while I worked out how the desk talks: the frames it expects, the handshake it needs before it will listen (the controller ignores commands while its display is asleep), and the heights it reports back. By 1 August it could move the desk, show its height live, run its four presets and set the LED strip, lock and vibration, and it had tests and HACS packaging. It was vibe-coded, and the only bar was that it worked on my desk.

Ask Ardo: [how long did the first version of ha-desky take?](https://gardiner.today/future?q=how%20long%20did%20the%20first%20version%20of%20ha-desky%20take%3F)

## People used it

Then other people installed it. One user’s height controls did nothing until they unplugged the Upsy Desky board they’d been using before the integration existed. They wrote back: “everything started to work! It’s awesome!” Others reported connection errors and warnings after a reboot. People were relying on something I’d built in three days for my own desk.

> “everything started to work! It’s awesome!”
>
> a user, on unplugging their old board

Ask Ardo: [what happened when other people installed ha-desky?](https://gardiner.today/future?q=what%20happened%20when%20other%20people%20installed%20ha-desky%3F)

## Growing it up

In October 2026 I spent a week reworking it, still with Claude Code. It now has tests behind a 95% coverage gate, CI on every pull request, conventional commits and automated releases through release-please. It also has a documentation site with protocol notes for contributors, and safety guidance, since it moves furniture. The guidance says to keep the hand controller within reach. I worked through Home Assistant’s quality scale to Silver and released version 2.0.0 on 9 October 2026. It’s listed in the HACS default store, soon to be Home Assistant’s Marketplace.

**95%**, test coverage, a gate every pull request has to pass

**the call i made**: Document it as a remote, or as something that moves furniture?

- Took: As something that moves furniture. The docs say to move it only when someone is at the desk.
- Turned down: As a remote. Easier to read, until a desk moves with nobody there.

It works from dashboards, scenes and voice assistants. It detects collisions on moves started from Home Assistant, and it stays connected, so changes arrive as they happen.

I added a sit and stand sensor for my own day, with the time kept in long-term statistics. Three blueprints cover a sit and stand reminder, a scheduled stand and a collision alert. Diagnostics for bug reports hide the desk’s Bluetooth address and serial number.

Ask Ardo: [what changed when he reworked ha-desky?](https://gardiner.today/future?q=what%20changed%20when%20he%20reworked%20ha-desky%3F)

## Ask about ha-desky

Ardo has read this case study and the rest of the site. Ask it what I didn’t cover, and it shows the pages its answer rests on.

Ask Ardo: [how did he work out what the desk’s bluetooth expects?](https://gardiner.today/future?q=how%20did%20he%20work%20out%20what%20the%20desk%E2%80%99s%20bluetooth%20expects%3F)

## Read next

- [Hey you, let’s brew](https://gardiner.today/past/hai-coffee) (Hai! Coffee): Another project of my own, built for something I use every day.
- [The product is me](https://gardiner.today/past/this-site) (gardiner.today): Also built with Claude Code, at a much bigger size.

[All case studies](https://gardiner.today/past#case-studies)

I live and work in Magandjin, the Jagera name for Brisbane, Australia, on the Country of the Turrbal and Jagera peoples. I pay my respects to their Elders, past, present and emerging. Sovereignty was never ceded.
