• v0.2.0-rc.34 026a28388a

    v0.2.0-rc.34
    All checks were successful
    CI / Shell scripts and documentation links (push) Successful in 19s
    CI / Test the dependency floors the package advertises (push) Successful in 1m25s
    CI / Lint, type-check, test (library, 3.14) (push) Successful in 1m34s
    Publish / Refuse anything that is not a release tag (push) Successful in 1s
    CI / Lint, type-check, test (library, 3.11.0) (push) Successful in 1m37s
    Publish / Publish to PyPI (push) Successful in 27s
    CI / Type-check + test the integration (push) Successful in 2m25s
    Publish / Update the Homebrew tap formula (stable or -rc per tag) (push) Successful in 7m0s
    Publish / Create releases + Linux binary (Forgejo, NAS, GitHub) (push) Successful in 25m51s
    Publish / Bridge the macOS .pkg → NAS (push) Successful in 4s
    Publish / Add the bottle block to the tap (second pass) (push) Successful in 1m34s
    Publish / Prune the candidates this release supersedes (push) Has been skipped
    Install matrix (Linux) / Wait for v0.2.0-rc.34 to be installable (push) Successful in 28m6s
    Install matrix (Linux) / Linux installs (x86_64) (push) Successful in 8m8s
    Install matrix (Linux) / Linux installs (arm64) (push) Successful in 32m58s
    Install matrix (Linux) / Every Linux channel installed and ran (push) Successful in 0s
    Pre-release

    Cody Bryant released this 2026-08-19 15:27:23 -07:00 | 6 commits to main since this release

    The release where the robot stopped being read-only. Clean cycle and Reset are
    real buttons now, and whiskerless issues the certificates your broker needs
    instead of leaving that to you.

    Thanks to @CryingPecan, whose LitterHopper robot
    is behind much of the hopper work. Protocol detail lives in
    docs/devices/litter-robot-4/.

    Breaking changes

    • Broker usernames and passwords are gone--username, --password and
      WHISKERLESS_PASSWORD. Everything authenticates by certificate now.
    • One broker per machine. --host and --ca moved off the everyday commands
      onto setup. A separate broker is a separate store: point WHISKERLESS_HOME at
      it.
    • --port and --insecure are gone. The robot's port is fixed in its firmware
      and it always checks the broker's name, so both could only point the CLI somewhere
      the robot cannot follow. A saved port is ignored, not an error.
    • whiskerless adopt is removed. Re-provision instead.
    • The store moved to ~/whiskerless. Your old ~/.whiskerless is moved there
      on first run, and settings 0.2.0 no longer reads are dropped from your robot
      profiles at the same time. That run tells you what changed.
    • Every robot gets a certificate of its own, with no way to opt out. A robot
      holding one still works on a broker that allows anonymous clients, so there was
      nothing to trade — and whiskerless robots marks any robot still presenting the
      certificate it shipped with.
    • whiskerless has to be able to sign now, unless you say otherwise. A store
      holding a CA certificate but not its key is no longer an unstated arrangement —
      it read like a finished setup while quietly refusing to issue anything. setup
      asks for the key, or offers a new authority; the second answer means
      re-provisioning every robot. See Upgrading from 0.1.3 in the README for what
      that costs at the robot and at the broker.
    • setup --auth records how your store authenticates, for a signing key that
      lives somewhere else on purpose. supplied takes a certificate per robot from
      provision --robot-cert/--robot-key and never wants the CA key; anonymous
      leaves robots the certificate they shipped with. The mode is stored, so later
      commands behave the same way with no flags, and a mode your files can no longer
      carry out is an error naming both rather than a silent downgrade.
    • Each robot's certificate is kept at robots/<serial>/client/, where this
      machine's has always been kept at client/. A robot re-provisioned stays the
      same client to your broker, so ACLs and log lines keyed to it still point at it;
      provision --reissue replaces one deliberately. provision now says to back up
      afterwards, because it leaves behind material an earlier backup does not have.
    • Certificates you supply are checked before anything is written: they have to
      chain to your CA, be valid now, not be a CA themselves, and carry the robot's
      serial as their common name — which is where a broker gets the robot's username.
      Nothing is filed until it passes, and a robot's is filed only once the robot has
      accepted it, so a rejected or aborted run leaves the one you were using intact.
    • binary_sensor.…_waste_drawer_removedsensor.…_waste_drawer_last_moved.
      The robot never reports which way the drawer moved.
    • switch.…_panel_sleep_mode is now a binary sensor — the firmware refuses
      direct writes. Use the weekday schedule entities.
    • Clean cycle wait time is a number (3–30 minutes), not a select.
    • Library: Hazard.MOTOR, MotorCommandError, allow_motor,
      LitterRobot4Client and WhiskerlessAuthError are removed. Power still needs
      allow_dangerous.

    Added

    • Clean cycle and Reset buttons. Empty cycle, Power and WiFi ship disabled and
      marked (danger) — each costs a litter refill or takes the robot off the
      network. The CLI gains empty-cycle, power and wifi-toggle.
    • whiskerless runs a certificate authority for you. whiskerless setup makes
      the CA, your broker's certificate and this machine's identity, then prints the
      three files your broker needs. Bring your own with --ca and --ca-key.
    • Each robot gets its own certificate, written over BLE and named for its
      serial — so your broker can stop accepting anonymous clients.
    • whiskerless backup and whiskerless restore — the whole store in one
      optionally-encrypted file. The CA key is the one thing you cannot regenerate.
    • The CLI remembers your robots. provision saves them; robots, use and
      forget manage them. A second robot asks only for its serial and WiFi password.
    • Provisioning verifies the WiFi join, so a mistyped password fails loudly
      instead of leaving you a robot that never appears.
    • Litter level as a percentage — self-calibrating, or pinned with one press.
    • LitterHopper support: connected, fill gauge, and an out-of-litter alert the
      firmware never raises. A dispense arrives as three messages ~20 s apart, so the
      level survives a restart and one dispense cannot prove an empty hopper.
    • New entities: last cat visit, visit duration (disabled until your robot
      proves it reports one), waste drawer last moved, panel brightness for bright and
      dark rooms, and excess-weight detection.
    • whiskerless status, calibrate and panel-reset.
    • New install channels: apt and dnf repositories, Homebrew with prebuilt
      bottles, .deb/.rpm, a signed macOS .pkg, and standalone Linux binaries —
      none of which need a system Python. Packages are GPG-signed
      (4BBACD5A6FF38564); setup is in the README.

    Fixed

    • Cat detection no longer mistakes weight on the scale for a cat, handling the
      robot is not a visit, and long visits are no longer dropped.
    • robotStatus 10 is the clean cycle. Unmapped, its readings were published as
      real litter levels. Readings are also suppressed while the globe is not level.
    • The globe motor fault sensor watches the activity stream, where the fault
      actually appears — the state document sat at 0 through a real fifty-minute fault.
    • Panel sleep and wake times can be set, and the weekday schedule arms every
      day rather than only Sunday.
    • whiskerless setup survives a long hostname, and reissues the broker's
      certificate when you move the broker — if it holds your CA's key. A certificate
      it did not issue is reported, never overwritten.
    • Provisioning works where the network list is not a multiple of four. The
      robot's WiFi scan is fetched in pages, and the last page asked for more than
      remained — which this firmware answers by dropping the Bluetooth link, halfway
      through provisioning. It looked like flaky Bluetooth.
    • Provisioning tells you to hold Connect, and stops scanning the moment it
      finds your robot — it only advertises while you hold the button, and the scan
      was spending that window.
    • The robot's IP address is reported instead of "no lease yet". It answers
      "connected" before DHCP replies, so the address was read a moment too early.
    • Errors are sentences, not stack traces. --debug gives the traceback and
      the request log — with the WiFi password and the robot's key left out of it.
    • A short press of Connect toggles WiFi off, which the docs called harmless —
      the robot vanishes from your broker and looks dead. Hold it for pairing mode.
    • The declared Home Assistant minimum is correct (2025.3.0).

    Changed

    • The Refresh button is on by default, on existing installs too.
    • Manual calibration buttons ship disabled — the robot calibrates itself.
    Downloads