IV

Igloo V1

My first attempt at a smart home platform

  • Written Icon

    Written:

    2025-03-14

  • Updated Icon

    Updated:

    2026-04-26

GitHub Icon GitHub (V1 Branch)

When I first started /projects/igloo[Igloo], I wanted to replace Home Assistant with something much simpler and more reliable. I was a bit naive coming into this, and it turned out to be a lot harder than I though. Overall, I would call this version a failure, but I learned a lot, and knew how to approach the V2.

Stack

The platform was built with Rust & Tokio. It was my first substantial Tokio project, and I think some of the questionable architectural decisions reflect that 🫠.

The backend used Axum to expose a REST API and WebSocket for interaction. This connected to a SolidJS frontend:

Igloo V1

Configuration

Everything was configured in a single immutable Ron file (users, permissions, provider configs, devices, zones, UI elements, and scripts) which sounded great at first, but quickly became tedious.

Users had to: * Generate password hashes manually with igloo hash PASSWD * Edit a Ron file for all configuration changes * Restart the system to add or remove devices * Understand the configuration file structure before using the system

While I do think this system improves upon Home Assistant’s YAML system, I think the configuration file is always going to be a pain point. It requires users to spend a significant amount of time browsing documentation just to get Igloo working.

Device Model

The device model/abstraction was heavily inspired by Home Assistant: a device is represented by any number of entities, where each entity has a name, and follows a defined structure (Light, Switch, etc.). I added an additional layer of hierarchy above devices called zones (usually for physical location/rooms). This system works, but has a lot of room for improvement.

It used hard-coded entity types (as compared to code generation), which created cascading complexity. For each entity type, I needed to define: - A struct to store the entity’s state - An enum for commands (requests to the entity) - An enum for state updates from the entity

Interface

The interface to the device model (API, WebSockets, automations) used a CLI-style. It enabled multi-entity control (ex. controlling kitchen lights together) without needing explicit virtual entities/helpers. This seemed like a cool idea, but only worked in simple cases, and put requirements on the naming of devices/zones/entities. Examples:

list devices kitchen
light all off
light kitchen.sink off

Device Drivers / Integrations

Igloo had a monolithic architecture, integrating device drivers directly into itself. I only implemented 1 driver which took substantially more time than expected.