Skip to content

Releases: csader/splitflap-os

v0.3.0

Choose a tag to compare

@csader csader released this 24 Jun 23:26

What's New

Universal Firmware Provisioning

Automatically discover, identify, assign, diagnose, and de-provision modules running Universal Firmware — all from the Calibration page. (#51)

  • Passive RS-485 listener detects unprovisioned module advertisements
  • Identify modules by homing them physically
  • Assign and de-provision bus IDs with firmware acknowledgement
  • Built-in diagnostics: health snapshot, Hall sensor test, and mechanical consistency test
  • Transaction-safe serial lock ownership for all command/response exchanges

Calibration: Immediate Preview on Adjustment

Fine-tune corrections now move the module immediately using the firmware g (absolute step goto) command, so you can see the compensation without re-sending the character index. (#52)

Contributors

v0.2.7

Choose a tag to compare

@csader csader released this 24 Jun 13:00

What's New

  • SplitFlap Gateway (MQTT) — Drive the display remotely through an ESP32 gateway over MQTT instead of a local serial port. Configure broker, port, topic prefix, and optional credentials in the Settings UI. (#50@avandeputte)

v0.2.6

Choose a tag to compare

@csader csader released this 11 Jun 17:12

Skip Network/Hotspot in Install Script

For users running Splitflap OS on non-Pi hardware (Docker, NAS, Fedora, etc.), the install script now supports skipping all networking setup:

sudo bash setup/install.sh --skip-network

What gets skipped

  • network-manager package install
  • NetworkManager configuration
  • splitflap-network.service (hotspot fallback)

The main Flask app service installs and runs as normal. This pairs with v0.2.5's configurable serial port for full Docker/NAS support.

v0.2.5

Choose a tag to compare

@csader csader released this 11 Jun 16:47

Configurable Serial Port

The serial port is now fully configurable — no more hardcoded /dev/ttyUSB0.

What's new

  • Settings UI — new Serial Port section with auto-detect dropdown and manual entry for custom paths (e.g. /tmp/ttyVSF0)
  • Environment variable — set SPLITFLAP_SERIAL_PORT for Docker or headless deployments
  • Persists in settings.json — survives restarts without needing env vars
  • Runtime reconnect — change ports without restarting the server

Priority order

SPLITFLAP_SERIAL_PORT env var > serial_port in settings.json > /dev/ttyUSB0 default

Docker support

No install script needed — just run the Flask app directly with your port mapped:

docker run -e SPLITFLAP_SERIAL_PORT=/tmp/ttyVSF0 ...

v0.2.4

Choose a tag to compare

@csader csader released this 30 May 00:41

Continuous Random Spin

Fixes the Random Spin app so modules move independently and continuously, with no collective pause.

Changes

  • Each module maintains independent dwell/spin state (no synchronized frame replacements)
  • Added skip_rotation_wait manifest flag — server no longer waits for all modules to settle before sending the next frame
  • Modules receive new targets before finishing their current move, producing constant chaotic motion

Also included (since v0.2.1)

  • Fix update poll to verify version actually changed before declaring success (v0.2.2)
  • Fix /apply_update 500 errors: safe.directory, dirty tree handling, better error messages (v0.2.3)

Upgrade note

If you are on v0.2.0, the update button has a bug. Update manually once:

cd /opt/splitflap-os
git pull origin main
sudo systemctl restart splitflap.service

After that, future UI updates will work correctly.

v0.2.2

Choose a tag to compare

@csader csader released this 29 May 16:01

Fixes

Update mechanism now verifies version change (#47 feedback)

The update poll was declaring success as soon as the server responded, without checking if the version actually changed. If the service restart failed or hadn't happened yet, it would show "Update complete! v0.2.0" while still on the old version.

Now waits for the server to either go down or return a different version before declaring success. Shows a clear failure message if the version never changes.

Independent per-module random spin (v0.2.1)

Each module now maintains its own dwell/spin state instead of generating synchronized full-frame replacements. No more full-line reveal where all modules pause together.

v0.2.1

Choose a tag to compare

@csader csader released this 29 May 15:47

Fix: Independent per-module random spin

Resolves feedback on #47 — each module now maintains its own dwell/spin state instead of generating synchronized full-frame replacements. No more "full line reveal" where all modules pause together.

Changes

  • Each module independently dwells and spins on its own schedule
  • ~8% chance per tick of a module arriving at its target (naturally staggers stops)
  • Configurable dwell time via anim_speed setting
  • Version bump to 0.2.1

v0.2.0

Choose a tag to compare

@csader csader released this 29 May 04:08

What's New

  • Unified transition style + speed — 13 order-based styles (diagonal, spiral, center-out, etc.) + sync + slot machine. Global default in Settings, per-app override, per-page override in compose and playlists.
  • Schedules + Quiet Hours — time-based app/playlist switching with day-of-week support and overnight ranges. Quiet hours stop the display and suppress notifications.
  • App Triggers — event-driven display interrupts. 16 trigger-capable apps (sports score changes, weather alerts, stock thresholds, ISS overhead, and more). Background check loop with exponential backoff and per-trigger cooldowns.
  • Global location support — location search replaces US-only ZIP code. Works worldwide. Auto-sets timezone. Per-app location override for weather.
  • Random Spin animation — continuous random flaps with staggered module timing for organic motion and sound.

Improvements

  • Default (global) option in compose and playlist style dropdowns
  • Sim reflects active transition style in real-time
  • Smart speed defaults per style (slot→80ms, sync→0ms)
  • Trigger system caches geocoding and 52-week stock data to reduce API load
  • Exponential backoff on trigger failures prevents rate-limit issues on Pi
  • Weather, ISS, and dashboard apps use coordinates directly (no more US-only geocoding)

v0.1.13 — Currency, Venv Install & Bug Fixes

Choose a tag to compare

@csader csader released this 18 May 22:15

What's New

Currency Symbol Setting

  • New Currency Symbol setting in Settings (default $)
  • Set to £, , ¥, etc. — Stocks and Crypto apps display your currency automatically
  • Works transparently: apps output $, the server maps it to the correct flap position

Multi-Countdown Support (by @InertiaImpact)

  • Up to 5 simultaneous countdowns, each with its own name and target date
  • Per-slot enable/disable toggles
  • Improved display handling for narrow signs

BirdNET Fixes

  • Last 3 mode now shows last 3 unique species instead of last 3 detections
  • Fixed cache not invalidating when display mode changes
  • Fixed settings not being read correctly

Bug Fixes & Improvements

Install & Compatibility

  • Trixie/Bookworm fix: installer now uses a Python venv, avoiding PEP 668 externally-managed-environment errors
  • --prefer-binary flag for much faster installs on Pi Zero W (uses pre-built wheels instead of compiling)
  • OTA updater now detects missing venv and runs install.sh automatically on first update

Data Hygiene

  • Removed legacy defaults that showed other people's data to new users: nhl_teams (BOS,DAL), stocks_list (MSFT,GOOG,NVDA), yt_channel_id, mbta_stop/mbta_route
  • Removed broken migration code that caused NHL scores to appear even with no teams configured

v0.1.12 — Weather, Planes, Calibration & More

Choose a tag to compare

@csader csader released this 12 May 20:14

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)

  • notice field type — info/warning/success/error boxes in settings modals
  • disabled_when — conditionally disable fields based on other values
  • polling_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