Repository navigation
Highlights
This release is primarily a hardening and maintenance release. The main focus was on making TeddyCloud more reliable under real network conditions, cleaning up shutdown and restart behavior, fixing Docker and web build issues, and tightening certificate and cloud integration handling.
Networking and Cloud Reliability
A large set of fixes improved HTTP handling, cloud passthrough, download robustness, and callback error propagation.
Improved request lifecycle and error handling
- Reworked web_request lifecycle handling for cleaner teardown and more reliable error propagation.
- Extended error_t usage across body, response, and header callbacks so failures are consistently surfaced instead of being silently ignored.
- Fixed several places where downstream disconnects, write failures, or disk write errors were not aborting the operation correctly.
- Distinguishes transport/request failures from HTTP non-200 responses more cleanly.
Safer body and header passthrough
- Fixed multiple passthrough callbacks so they now return errors when writes or sends fail.
- Prevented uninitialized stack data from being sent in header passthrough.
- Fixed callback bugs including variable shadowing, NULL dereferences, and dangling pointer issues.
Redirect and range handling
- Added support for relative redirects in web_request_impl.
- Fixed HTTP redirect handling more broadly.
- Fixed ranged /api/content requests so only the advertised Content-Length is read and forwarded.
Download robustness
- Download callbacks for Tonies, Tonieboxes, reverse proxy cache, OTA bodies, and generic downloads now abort correctly on open/write failure.
- Reverse proxy cached responses now verify writes correctly before serving.
Content, Cache, and Metadata Fixes
Tonies and Tonies V2
- Added Tonies V2 cache loading and teardown support.
- Improved startup refresh behavior for toniesV2.json.
- Switched Tonies JSON updates to raw GitHub URLs.
- Hardened update handling so HTTP errors and request failures are handled distinctly.
Freshness and cache correctness
- Fixed several freshness and cache edge cases.
- Fixed stale freshness byte handling.
- Fixed cache allocation and extension/query trimming edge cases.
- Fixed multiple loader and parser issues across content JSON, TAP, and V1/V3 metadata handling.
General hardening
- Addressed a large set of pre-existing bugs involving:
- unchecked allocations
- parser bounds issues
- type bugs
- NULL dereferences
- memory leaks
- incorrect sizeof(...) usage
Certificates, TLS, and Cloud Trust
Boxine CA validation and trust handling
- Switched Boxine CA validation to parsed X.509 data instead of weaker assumptions.
Current trust behavior
- Cloud trust CA is again configurable via the normal ca.der path and WebIF.
- The repo now ships a default Boxine root CA as contrib/certs/client/ca.der, so fresh installs will have a sane default
Docker, Build, and Release Pipeline
Docker build improvements
- Improved Docker build preflight checks.
- Reworked the Ubuntu Docker build so the web UI is rebuilt during image creation instead of relying on stale prebuilt assets.
- Added proper Node.js version handling so builds use a supported modern Node release instead of Ubuntu’s outdated default package.
Release workflow cleanup
- Simplified GitHub workflows to a cleaner GHCR multi-arch publishing flow.
- Restricted Docker publish workflow triggers appropriately.
- Adjusted fork/version tag handling to use the pctc_ prefix consistently.
- Removed unused Debian and Alpine Dockerfiles and related cruft.
Web UI and Fork Integration
Reverse proxy and version target fixes
- Fixed reverse proxy framing issues.
- Updated GitHub integration and reverse target naming from develop to master for the maintained fork path.
- Updated the web submodule multiple times to align the frontend with backend behavior.
Plugin loading fix
- Restored the /api/plugins/getPlugins response format to the original bare array form.
- This fixed the WebIF plugin loading error:
- Loading plugins failed
- TypeError: ...sort is not a function
Restart, Shutdown, and Memory Leak Fixes
A series of fixes cleaned up restart behavior and shutdown-time leaks, especially around MQTT and Home Assistant entity handling.
MQTT / Home Assistant cleanup
- Added proper cleanup for dynamically allocated MQTT Home Assistant entity strings.
- Moved cleanup to the correct shutdown path so it happens after worker/task completion.
- Fixed leaks for skipped MQTT settings entities that were allocated but never added.
- Preserved a bounded shutdown timeout so restart does not hang indefinitely.
Result
- WebIF-triggered restart no longer produces the previous LeakSanitizer shutdown leak reports.
Miscellaneous Fixes
- Fixed optional status-code handling in web downloads.
- Fixed reverse proxy/cache behavior in more edge cases.
- Cleaned up a small Alpine-only MQTT thread leftover.
- Added a local verification workflow.
User-Visible Outcome
Compared with 3b69cbe, this release makes TeddyCloud:
- more reliable when talking to upstream HTTP/TLS services
- safer under client disconnects and write failures
- cleaner to build in Docker
- less prone to stale frontend/backend mismatches
- cleaner on restart and shutdown
- more predictable around Tonies metadata, cache, and cloud trust configuration
Notable Operational Changes
- Docker images now rebuild web assets during build.
- The maintained reverse target is master, not develop.
- Plugin API output is back to the expected array format.
- Cloud trust CA is configurable again through ca.der / WebIF, with a default Boxine CA shipped in the repo.