I really didn't know what I wanted to accomplish with this release when I started (not that I don’t have an extensive feature backlog), but it kind of came together nicely in the end. Stability has never been better. We now have solid options for local recording while not being tied to SMB (min.io). We've got Azure Blob Storage support for cloud recording. And YouTube Live Streaming is maturing nicely.
No one actually asked for this, but I realized it would be pretty painless to accomplish because back in the day camera snapshots, event recordings and the like were all stored in Azure. I was already using Azure for other things (namely our STUN/TURN servers, when we were tied to WebRTC), it was cheaper than AWS and it had an API and I didn't understand (at the time) what alternatives existed (namely S3). Anyway, since I had all of that code already, I just needed to port it over to a Streamie Integration, and a few more things (like listing files and directories), and then tie it into the UI ... and there we go. Learn more.
I've been working for a while to migrate off our self-hosted Bedrock database (it's a long story). Cloudflare D1 is truly usable at this point. After extensive testing, I've made D1 the primary database for the API server while still "mirror writing" to Bedrock, which makes switching back to Bedrock (if that becomes necessary) a painless process.
Once D1 reaches General Availability (in early 2024, or so they say), I will scale back Bedrock to a single node until I'm truly confident (or my patience just finally runs out), and then I can deploy API servers to a secondary data center. Everything already sits behind Cloudflare's load balancer, so nothing short of a Cloudflare service outage should cause a backend outage for Streamie.
So, one surprising issue I ran into while migrating from Bedrock (which is distributed SQLite) to D1 (which is also SQLite) is that D1 effectively limits any object to 100KB, because I'm naively treating SQLite as a key-value store. Where this is an issue is ONVIF camera configurations. Normally they're quite small, but sometimes there's a camera or NVR out there that Streamie doesn't correctly handle, resulting in dozens or 100s of saved ONVIF event types. As a solution, on the API server, when saving a camera configuration, if it is an ONVIF or UniFi camera, we parse the configuration, remove all of the event types, and record each event type individually as a separate database record. Conversely, when reading an ONVIF or UniFi camera configuration, those separate database records are read and joined back into the camera configuration before returning it to the app. Lastly, if I haven't done so already, I will limit the number of event types per camera configuration; probably to 100.
This feature is just the start. Each Streamie device has a built-in web server that you can activate in the Settings tab. With this feature enabled, you can use a web browser to review your 24/7 NAS, S3 or Azure recordings. Whatever Streamie can access in the app, you can access in your browser.
Live streaming, event viewing and more is all in the words.
- Makes some bitrate adjustments to remote streaming video encoding; increases it slightly.
- Resolves some ONVIF caching issues that caused weird behavioral problems. You know, cache invalidation is one of the two difficult problems in computer science....
- Makes some nice improvements to the Event Recording Playback screen to match the recent changes to the NAS Recording Playback screen.
- Improves the behavior of the app in the face of corrupt data in our native format.
- Makes some nice improvements to the NAS Recording Playback screen. It all looks legit now.
- Adds a new Web Portal feature that lets you browse your NAS Recordings in a web browser instead of just in the app. Go to the Settings tab to enable the service on a Streamie device.
- Adds a keep-alive feature to help Streamie keep working in situations where it might otherwise find itself in the background.
- Adds a new scalable Record Only streamer. Create a Group of the cameras you want to record, choose the "Record" function for that Group and then start streaming the new Group. You'll see snapshots that are periodically refreshed. Streamie will record the cameras (if recording is set up), but will not expend any resources decoding the video streams, meaning that CPU + IO end up being your only bottlenecks.
- Somehow the old "Hide" feature was still present in Groups. It has been removed. To hide a Group from a particular device (or set of devices) use the Permissions feature in the Settings tabl.
- Fixes an issue where toggling Debugging did not work, which is annoying because enabling debugging is the first step in diagnosing an issue.
- Fixes this massive issue of rapid API updates being pushed by Streamie due to a hashing issues. Whoops.
- When relying on Device Offline alerts, if a device reconnects to a different API server, that will now result in the alert being cancelled correctly.
- Adds 24/7 recording support for Azure Blob Storage. It is shockingly similar to S3, while still being quite different in ways. See the new help doc here.
- Adds backend support for a new version of Modes, which will include schedules, so that certain events can be tied to, for instance, business hours.
- Removes the annoying 2-second delay when saving an integration, since we are no longer hamstrung with Bedrock.
- The Settings ==> Integrations screen is now always sorted alphabetically by Integration type.
- Massive S3 compatibility improvements. Streamie has been tested and verified to work with AWS S3, Backblaze B2 and MinIO -- in addition to Cloudflare R2. I'm hoping that's a diverse enough bit of testing to assume support exists for any standards-compliant S3 service.
- Adds some janky support to YouTube Live Streaming for muting the audio stream. I'm going to try to improve this before this next release goes out, if time permits.
- Optimizes (in a small way) camera recording, by checking for the existence of the directory to which we want to write a recording, instead of trying to create that whole directory structure each and every time.
- Removes our local (and outdated) copy of AMSMB2 from the Streamie project, and switches over to Swift Package Manager, which I should have done ages ago. I was hoping this would fix a frequent crash a user has been experiencing, but no such luck.
- Updates how camera configurations are stored, to limit the max size of a camera configuration. More on this in the Database details section, above.
- Fixes an issue related to remote streaming quality. I had previously changed the bitrates associated with each quality name, but I didn't update the default remote streaming quality accordingly, resulting in really terrible (but VERY low bandwidth) remote streaming quality.
- Various improvements related to relay connections for remote streaming.
- I've been toying around with Cloudflare AI image classifier, which is enabled in Streamie at the moment, but serves no function at the moment; it's mildly interesting to see how it (mis)classifies various scenes.
- Improves the feedback to the user in the Recordings screen when it comes to remote connecting, which is now located in the Options menu.
- Improves the Module rendering process so that if one component of the Module fails to render, the rest will go on (as best as possible). The issue here was that sometimes a linked image was inaccessible, and then the whole thing stopped, which was silly.
- Going back ages, there was the option to hide a camera, group, file server, etc. That feature was essentially a stopgap measure until Permissions was introduced. So, I've removed that silly feature now.
- Ports the camera recording Cameras and Dates view controllers to the Screen framework.
- Updates the API server to use Cloudflare D1 as the primary database, while still "mirror writing" to Bedrock.
- Ports the Home ==> Accounts screen to the Screen framework. This eliminates more platform-specific UI code, which is awesome.
- Adds "Widespread Frost" images for the weather module
Streamie provides a best-in-class user experience on your iPhone, iPad, Apple TV and Apple Silicon Mac, with an intuitive user interface that makes it simple to discover, stream, record, monitor and share your HomeKit, Google Nest, Ubiquiti UniFi Protect and ONVIF-compatible IP and RTSP cameras. Streamie keeps you informed with motion event notifications and it works with most cameras using its advanced audio and video codec support. You can watch your cameras from anywhere, record 24/7 to your private NAS, remotely manage multiple locations, device permissions and seamlessly synchronize settings across your devices; configure Hubitat smart home automations, live stream to YouTube and rely on the in-app technical support system when you need help (but you can also reach us by phone). Download Streamie today. Lastly, Streamie is solar powered!