The Ecosystem
Five projects that speak to each other. Each essential, each focused.
LlizardOS
cold blooded efficiency
Custom Void Linux firmware for the Spotify Car Thing. Boots in seconds, runs on minimal resources.
Llizard
where salamanders render
Plugin-based GUI framework in C. Renders with raylib, communicates via Redis, and hosts salamander plugins.
Janus
two faces, one purpose
Android BLE GATT server. Exposes your phone's media as Bluetooth characteristics for any device to consume.
Mercury
swift messenger
Go BLE client daemon. Scans for Janus, pulls media data, and pushes it to Redis. The bridge between phone and device.
Salamander
they live where others cannot
A simple C plugin system for Llizard. Enables dynamic loading of new features like media players, games, and utilities.
Data Flow Architecture
How the pieces fit together.
┌─────────────────────────────────────────────────────────────────────────┐
│ YOUR ANDROID PHONE │
│ ┌───────────────────────────────────────────────────────────────────┐ │
│ │ JANUS (BLE Server) │ │
│ │ - Track Title/Artist/Album (UUID 0x2001-0x2003) │ │
│ │ - Playback State (UUID 0x2004) │ │
│ │ - Album Art (UUID 0x2005) - chunked transfer │ │
│ │ - Lyrics (UUID 0x2006) - LRC format │ │
│ └───────────────────────────────────────────────────────────────────┘ │
└─────────────────────────────┬───────────────────────────────────────────┘
│ BLE GATT Protocol
│ (Wireless)
▼
┌─────────────────────────────────────────────────────────────────────────┐
│ SPOTIFY CAR THING DEVICE │
│ ┌───────────────────────────────────────────────────────────────────┐ │
│ │ LLIZARD OS (Void Linux) │ │
│ │ - musl libc, runit init, DRM/KMS graphics │ │
│ │ - boots in <10 seconds, minimal footprint │ │
│ └───────────────────────────────────────────────────────────────────┘ │
│ │ │
│ ┌───────────────────────────▼───────────────────────────────────────┐ │
│ │ MERCURY (BLE Client Daemon) │ │
│ │ - Scans for Janus BLE server │ │
│ │ - Pulls GATT characteristic data │ │
│ │ - Chunks album art reassembly │ │
│ │ - Auto-reconnection on signal loss │ │
│ └───────────────────────────┬───────────────────────────────────────┘ │
│ │ │
│ │ Redis Protocol (localhost) │
│ │ │
│ ┌───────────────────────────▼───────────────────────────────────────┐ │
│ │ REDIS (Data Store) │ │
│ │ - media:title, media:artist, media:album │ │
│ │ - media:state, media:position, media:duration │ │
│ │ - media:albumart (base64), media:lyrics │ │
│ └───────────────────────────┬───────────────────────────────────────┘ │
│ │ │
│ │ llz_sdk API calls │
│ │ │
│ ┌───────────────────────────▼───────────────────────────────────────┐ │
│ │ LLIZARD (GUI Framework) │ │
│ │ - raylib/raygui rendering via DRM │ │
│ │ - Plugin host, event dispatcher │ │
│ │ - Input handling (knob, buttons, touch) │ │
│ └───────────────────────────┬───────────────────────────────────────┘ │
│ │ │
│ │ Plugin API (dynamic loading) │
│ │ │
│ ┌───────────────────────────▼───────────────────────────────────────┐ │
│ │ SALAMANDERS (Plugins) │ │
│ │ - media_player.so : Now playing UI │ │
│ │ - spotify_clone.so : Full playback control │ │
│ │ - snake.so : Classic snake game │ │
│ │ - weather.so : Local weather display │ │
│ └───────────────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────────────┘Data Flow
- Janus exposes phone media via BLE GATT.
- Mercury connects to Janus over Bluetooth.
- Mercury pulls media data and pushes it to Redis.
- Llizard plugins read from Redis via the SDK.
- Salamanders render the UI.
Why This Architecture?
- Decoupled: Each component has one job.
- Resilient: Redis acts as a message buffer.
- Flexible: Swap components without breaking others.
- Efficient: BLE for wireless, Redis for IPC.