Releases: csader/splitflap-os
v0.1.12 — Weather, Planes, Calibration & More
What's New
Weather App — Major Update (by @InertiaImpact)
- 4 providers: Open-Meteo (free, no key), WeatherAPI.com, QWeather, OpenWeather
- Open-Meteo is now the default — works out of the box with no API key
- AQI, UV index, pollen — optional pages with color-coded status
- Temperature units: F, C, K
- Configurable refresh rate
- Adapts to any grid size including 4+ rows
- Caches last good pages on error
Existing users: If you had an OpenWeather API key, the provider defaulted to Open-Meteo after this update. Go to Weather settings and switch back to OpenWeather if needed.
Planes Overhead — API Usage Estimates (by @InertiaImpact)
- Per-provider API usage estimates with free tier warnings
Settings System Improvements (by @InertiaImpact)
noticefield type — info/warning/success/error boxes in settings modalsdisabled_when— conditionally disable fields based on other valuespolling_usage_estimate— config-driven API usage calculator with provider profiles- Better merge logic for live schema updates
Calibration Improvements
- Reset Offset button — jump to 2832 in one click (no more clicking +32 hundreds of times, closes #26)
- Direct offset input — type a target value and hit Set
- Auto fine-tune direction fixed — now goes 1→63 (1 step per transition) instead of 63→1 (~63 steps per transition)
Simulator
- Flap animation speed matches real hardware timing (~4.2s for full home, closes #27)
BirdNET App
- Compact display: bird name + confidence on one line
- Smart name shortening (White-Winged Dove → WW Dove, Carolina Chickadee → C. Chickadee)
- Leaderboard: single page with one bird per row, fills grid height
- Lucide icon
- Removed guessed color indicators
v0.1.11 — Inbox, BirdNET & Bug Fixes
What's New
Inbox — Push Messages to the Display
External services can now push messages directly to the display via HTTP, regardless of what app is running.
High-priority messages interrupt between pages — your display reacts to your world in real time.
curl -X POST http://splitflap.local/inbox \
-H "Authorization: Bearer <your-key>" \
-d '{"text": "CHICKEN DETECTED", "priority": "high"}'Setup: Settings > Inbox > Enable > Add Source. Each integration (Frigate, HA, n8n, OpenClaw, etc.) gets its own revocable API key.
Use cases: Frigate detections, laundry done, 3D print complete, calendar reminders, solar milestones, agent notifications, "WELCOME HOME" on arrival.
Endpoints:
POST /inbox— push a message (requires Bearer token)GET /inbox— list queueDELETE /inbox— clear queue or by source
BirdNET App
Polls a BirdNET-Pi instance for live bird detections. Shows latest detection, last 3 birds, or today's leaderboard. Maps bird species to flap color characters (cardinal→red, jay→blue, goldfinch→yellow, etc.).
Bug Fixes (v0.1.10)
- PUSH TO DISPLAY was silently failing (broken after Compose tab simplification)
- Compose grid not resizing when grid dimensions change
- Compose grid crash on init (race condition)
- Stale CSS/JS after update — now uses version as cache-busting string
- Update modal stuck on spinner after server restarts
- savedPlaylistList null error
v0.1.10 — Bug Fixes
Bug Fixes
PUSH TO DISPLAY was broken
sync() was reading removed DOM elements (modeToggle, delayInput, styleInput, speedInput) which returned null and threw a TypeError before the fetch fired. Fixed by removing dead references and using defaults.
Compose grid not resizing with grid dimensions
initComposeGrid() was missing from applyGridConfig() and the polling loop's dimension-change handler. All three code paths that change grid size now also resize the compose grid.
Compose grid crash on init
onChange fired during createComposeGrid initialization before composeGrid was assigned, causing getBuffer() on null. Fixed with a local _grid reference.
Stale CSS/JS after update
Static asset URLs now use the app version as the cache-busting string (?v=0.1.10). After each update, browsers automatically fetch fresh CSS/JS — no more unstyled page after clicking Reload.
Update modal stuck on spinner
Race condition where the poll could complete and show "Update complete" before the fetch().catch() fired, which then overwrote the state with "Restarting…". Fixed with a done flag.
savedPlaylistList null error
renderSavedPlaylists was crashing when the element didn't exist (removed from Compose tab). Added a null guard.
v0.1.9 — Bug Fixes
Bug Fixes
PUSH TO DISPLAY was broken
The Compose tab's "PUSH TO DISPLAY" button was silently failing. When we simplified the Compose tab (moving multi-page playlists to the Playlists tab), we removed the modeToggle, delayInput, styleInput, and speedInput elements — but sync() still tried to read them. document.getElementById() returned null, causing a TypeError before the fetch ever fired. Fixed by removing the dead references and using sensible defaults.
Compose grid not resizing with grid dimensions
The compose grid wasn't updating when grid dimensions were changed via Settings or applyGridConfig(). initComposeGrid() was missing from two code paths that change grid size — now all three paths (initial load, settings save, polling loop) resize the compose grid correctly.
v0.1.8 — Update Modal & UX Fixes
What's New
Update Progress Modal
- Clicking "Update Now" now opens a modal with step-by-step progress
- Shows: Downloading → Restarting → Complete
- Spinner animation during active steps
- Reload Page button appears when server comes back (no surprise auto-reload)
- Error state with Close button if update fails
Bug Fixes
- Fixed clicking the "update available" badge opening the hamburger menu instead of navigating to Settings
- Hamburger menu now closes (not toggles) when navigating to a settings page from outside the drawer
v0.1.7 — Grid Compatibility
What's New
Grid Compatibility
Apps now declare minimum grid requirements and adapt to non-standard grid sizes.
Adaptive apps (work on any grid size):
- Stocks & Crypto — chunk by
get_rows()instead of hardcoded 3; each ticker/coin gets its own page on smaller grids - Sports — 1-row (score only), 2-row (score+status), 3-row (league+score+status)
- Weather — 1-row (temp+desc), 2-row (temp+hi/lo), 3-row (city+temp+desc)
- Metro — 1-row (both directions), 2-row (two lines), 3-row (header+directions)
- ISS — 1-row (lat+lon), 2-row (header+coords), 3-row (full with crew count)
- Time — 1-row (just the time), 2+ rows (centered)
- Date — 2-row (date+weekday), 3-row (time+date+weekday)
- Countdown — 2-row (event+time), 3-row (event+time+REMAINING)
Incompatible app cards dim with the reason shown (e.g., "Requires 3+ rows") when the configured grid is too small.
Other Fixes
v0.1.6 — Updater & Installer Polish
What's New
Software Updater
- Clicking the green update badge in the top bar now scrolls directly to the Software Update section in Settings
- Dependencies updated automatically when
requirements.txtchanges (no manualinstall.shneeded) - Update errors shown in the UI instead of silently reloading
Installer
- Hotspot SSID/password preserved when re-running
install.shafter an update - Installer output now shows the UI URL (
http://<pi-ip>) instead of a misleading "Start now" message - Service starts immediately after install — no reboot or manual start needed
Updating
From the UI: Settings > Software Update > Update Now
Manually:
cd ~/splitflap-os
git pull origin main
sudo bash setup/install.shv0.1.5 — Updater & Installer Fixes
Bug Fixes
Software Updater
- Fixed "Update Now" failing when the service runs as root but the repo is owned by a regular user (git "dubious ownership" error)
- Update errors now shown in the UI instead of silently reloading
Installer
- Added
libopenblas0dependency — required by NumPy on Raspberry Pi OS Lite (minimal images don't include it, causing server crash on import)
Updating
If you're on v0.1.3 or earlier, update manually this one time:
cd ~/splitflap-os
git pull origin main
sudo bash setup/install.shAfter that, future updates can be done from Settings > Software Update in the UI.
v0.1.4 — Community Apps, Updater & Fixes
What's New
Community Contributions
- Planes Overhead app — track nearby aircraft with 5 provider options (OpenSky, FlightAware, FR24, AirLabs, Aviationstack)
- Advanced settings controls — segmented toggles, number steppers, conditional visibility, computed fields, inline toggles, declarative sync (PR #16 by @InertiaImpact)
- Narrow screen fix — top bar wraps gracefully on screens under 400px (PR #18 by @InertiaImpact)
- UTF-8 encoding — manifest and settings files explicitly use UTF-8 (PR #15 by @InertiaImpact)
Software Updater
- Update notifications in top bar and Settings page
- One-click "Update Now" — pulls latest and restarts automatically
- "Check Again" button to bypass 1-hour cache
- Warns if
requirements.txtchanged (prompts to runsetup/install.sh)
Setup & Hotspot Fixes
- Fixed hotspot activating on connected WiFi (was triggering after 30s regardless)
- Installer no longer copies to
/opt— runs from cloned repo directory - Services start immediately after install (no reboot required)
- MQTT disabled by default
- Added Updating section to README
- Added git install note for Raspberry Pi OS Lite users
UI
- App settings modal shows Lucide icon in title
- Sports modal: segmented controls for Show/League Name/Games per page
- Stepper controls on all number fields
- Small selects converted to segmented toggles
- Logo SVGs converted to outlines (no font dependency)
v0.1.3 — Software Updater & Setup Fixes
What's New
Software Updater
- Update notifications in the top bar and Settings page
- One-click "Update Now" button — pulls latest and restarts automatically
- "Release Notes" link to GitHub releases
- Checks against GitHub releases once per hour
Setup & Hotspot Fixes
- Fixed hotspot activating on connected WiFi networks (was triggering after 30s regardless)
- Installer no longer copies to /opt — runs from cloned repo directory
- Services start immediately after install (no reboot required)
- MQTT disabled by default (enable in Settings > MQTT)
- Added Updating section to README
UI
- App settings modal shows Lucide icon in title
- Sports modal: segmented controls for Show/League Name/Games per page
- Stepper controls on all number fields
- Small selects converted to segmented toggles