Release Notes for v3.19.0 (2024.05.29) — In Development




The primary focus of this release is Access Controls. In short, this allows Streamie to be unlocked only by authorized people, MFA style. Eventually, we’ll support authentication via LDAP (Active Directory), Email, SMS and more, but the feature is being driven by a client whose needs are just User/Pass and Email, so that’s where we’re starting.


Behind the scenes, this release incorporates significant refactoring leading to the replacement of a bunch of old code thereby permitting some significant improvements related to first-time-launch setup, account switching and backend load balancing.


Speaking of load balancing, what a journey that has been. In the beta days there was just the one API server and all was bliss. After launch we had multiple API servers but they were all at a single location, so a dual HAProxy setup worked great. Streamie works best if all of the devices on an account are connected to the same API server. HAProxy accomplished that with an account hash HTTP header. Eventually we migrated to Cloudflare’s D1 database which was the final step before we could spread the API servers apart geographically. Already being a fan of Cloudflare’s services it seemed natural to employ their Load Balancer in lieu of HAProxy. Thus began literally months of low priority support emails trying to figure out how to get LB to work with Tunnels. After all of that it turned out that their Hash-based origin server “sticky” feature doesn’t really work. Bringing this back around to the start: the refactoring mentioned earlier enables a deterministic routing to an API server that is now a part of the app launch and connection process. This still relies on CF LB to handle the routing request, but it doesn’t matter which API server handles it.


Finally, let me say how much I appreciate (and benefit from) the many active free (and paid!) users who rely on Streamie features that I don’t frequently use, and discover compatibility issues and the occasional regression and then report those issues. They usually end up with a beta build incorporating a fix within an hour. Don’t keep these things a secret.




- Fixes a long-standing API server issue, ultimately a memory leak but it caused other problems, where a client connection could begin, send a login request and then disconnect before the login request was processed. The disconnection was handled before the login request was handled and since the connection was already cleaned up, the login was sort of "orphaned". Later on when we would send notifications to that connection, they'd just queue up and never complete. What a mess.

- Various files are cached "on disk" but now all of that is put in a per-account directory so that there's no chance of data "leaking" between accounts AND the caches are retained when switching accounts, which was previously a major pain point.

- The Events screen now prompts for comfirmation before deleting a whole day's worth of events.

- I somehow let the "Classify" option make its way into production when it was just a prototype feature that used Cloudflare's AI image classifier to put on-screen details about the camera. It didn't really work very well and it certainly wasn't supposed to be in production.

- The icons used to represent various types of file servers have all been updated to a more uniform appearance. This is evident both in the app and the Web Portal.

- Adds Sections to the Cameras screen. Group your cameras by their location (Indoor, Outdoor) or whatever grouping you want. Cameras are now auto-sorted alphabetically. I'm sorry if you don't like that. It's just the way it has to be.

- Updates the Home Accounts Screen with better title1, title2 labels and less redundancy.

- Improves the naming of the various Home Objects Screens so that insteard of just saying "Add" they'll say "Add ".

- Improves the Camera Collection View Cell so that it provides a consistently sized Streamie placeholder icon based on whether or not the label is visibile.

- Updates the Access Control screens for Password and Email so that they show a "Loading..." label until the content is fully ready.

- Fixes a remote-file-server playback issue. When the KrillPacketReader calls scrub(0) on the ChinstrapFileServerInputStream, it deletes all of its cache and starts the read-ahead process again. We check to make sure the readOffset is not already at the scrub offset. This fixes the playback issue.

- Improves the user experience when reconnecting to the API server: if the connection has dropped, sendRequest() just tosses requests on the whenReady queue instead of showing the user the "Not connected" error.

- Updates the remote connection process to start with direct-connect and then fail to reverse-connect. I'm pretty sure my current home setup with UDM + Starlink makes Streamie think that we have UPnP support when we (probably) don't. I need to maybe let Penguin validate that UPnP is working for each client.

- Improves the UniFi Protect integration support with recent JSON changes.

- Updates the loading screen so that it shows some status details as Streamie starts up.

- After years of thinking about it, I finally merged the iOS and tvOS app delegate code into a single class, other than a few bits of platform-specific things (like user notifications on iOS).

- Replaces the tvOS launch image with a launch screen roughly the same as the iOS launch screen.

- Fixes a bug when editing File Servers on tvOS where the Quota values were not editable. [John Cahill]

- Adds the new notion of a "home node" so that each device on your account will (hopefully) connect to the same API server.

- Fixes a bug when editing File Servers on tvOS where, when browsing folders, if a folder was empty it was not possible to navigate to the Choose button. I've added a placeholder cell ("This folder is empty.") to quickly resolve this. [John Cahill]

- Adds a launch screen of sorts to replace the "black" time that happens during version checking and such before the main UI loads.

- Removes PenguinService, which is the original http-based mechanism for API communication which was largely replaced by Chinstrap (WebSockets) a while back. The last remaining bits were associated with app startup stuff, account creation and such, which I didn't want to touch because it took ages to get it really solid.

- Refactors the whole account-switching process so that we actually start an entirely new connection to the server and all of the associated app services, and then replacing the singletons in the app with the new stuff after the connection succeeds.

- Improves the naming of "Add Account" and "Join Account" to reduce confusion.

- Fixes the naming of the TOC (table-of-contents) file written out by Camera Recorder, which used the CMCCrypto.Account.accountId value, which is super weird; changed it to the publicKeyId for the active user.

- Fixes a bug related to remote streaming of UniFi cameras. The issue is that I wrote "#if SREAMIE" instead of STREAMIE, so the isReachable() implementation in CMCCameraUniFiSource used by Streamie was the stub that just returns a default value (false) instead of actually checking. [John Cahill]

- Fixes a Krill video timestamp calculation issue.

- Adds a spinner and a modal dialog to the Accounts screen that are visible when switching accounts.

- Adds support to ChinstrapFileServer for updating the download progress view as a file is downloaded. This is evident when downloading a NAS / S3 recording.

- Updates the file server collection view cell so that they demonstrate with a green background to the label that the current device uses that file server for recording.

- Adds some new icons for File Servers, representing the underlying type of file server (SMB, S3, Azure, etc.).

- When downloading a recording to share, there's now a download progress view with a cancel button.

- When configuring an S3 file server, all sections are hidden until the details have loaded.

- When configuring an S3 file server, you can now adjust timeouts related to the S3 requests.

- When configuring a file server, the output types options now include MP4 (along with SPF and MOV). This new output type does not include an audio track.

- Updates NestWebRtcStreamingSession so that the silent audio it generates starts with a timing offset of +1 second, which seems to be adequate for YouTubeServiceDash to get audio-video sync.

- Adds two badges to the File Server cell that indicate the number of cameras (bottom-left) and the number of members (bottom-right).

- Adds "Pause" support to Mode schedules. A mode can be paused until the next hour, next day or next week.

- Remotely lock, unlock Member screens if Access Controls are enabled.

- Adds the new Access Controls feature which allows you to set up authentication mechanisms to be used to unlock Streamie. For this initial release, the one supported mechanism is MFA via email.

- Trims whitespace from user-provided names like Permissions Groups, Access Groups, Account names and Modes.

- Removes the checkmarks from active Shares because they're already in a section dedicated to being active.

- Hides all of the sections in the Permissions and Permissions Group screens until the content has loaded.

- Adds a spinner when clicking "Apply" to Permissions.

- Fixes an issue where the Credentials screen had the name "Modes" on it (copy-pasta).

- Reverses the order for the Profile cell fields so that the label is in the upper location and the value is in the lower location, which is consistent with the rest of the app.

- Adds a spinner to the Save & Close button in the Profile screen.

- Finally, I've added support for Old Version Lockout. Starting with v3.19.0, the app can be disabled once it is too old. This is accomplished via a TXT DNS record for

- Resolves a text wrapping issue in OptionCollectionViewCell and a constraint issue in LabelCollectionViewCell.

- Fixes an integer overflow issue in CMCBufferView that was causing a crash because I was doing some silly math that CMTime actually has functions to perform.

- Replaces the old Modes feature with a new Modes feature that includes schedules (like business hours). All old Modes were ported over to the new Modes, so there should be no hiccups with older app versions.

- Fixes a YouTube Live Streaming issue associated with ContentDetails.startWithSlate, which is apparently not always present. [AP].

- Updates the CMCS3Service retry parameters to try to make it work better. [DM]

- Updates the Configure S3 FileServer screen and the Azure one so that the associated Integration name is shown in the Path cell.

- Updates BaseScreenViewController to support left and right navigation buttons.

- Fixes an issue where motion events would not produce recordings due to a stupid, stupid bug. [DD]

- Parallelizes some startup API requests.

- Third party package updates.




Related Topics


Release Notes


About Streamie


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!