003 — Transmits Goes Mobile
Show Notes
This is a crossover episode that was originally posted on, All Play, where I share some updates on the status of Transmits, some inconsistencies I had to work through, and what I plan on working on next. Enjoy.
After recording the last episode via Transmits, I mentioned that I needed to test recording on playback on mobile, specifically Mobile Safari (since I am an iPhone user), and Chrome on Android. My goal for Transmits is that I can launch the initial version as a progressive web app (PWA), so it’s crucial for it to work when added to the home screen on either iOS or Android devices.
Well, in classic fashion, once I went to test the app on mobile devices, it totally failed in Mobile Safari, and regular Safari for that matter. It turns out that Safari only supports saving files via the FileSystemSyncAccessHandle, which only works within the context of a Web Worker. So, I rolled up my sleeves and started refactoring the app to include a web worker–surprisingly the first one I have written!–and wire up the file saving to use it. Low and behold, this week’s episode was recorded on my iPhone, via Transmits running as a PWA!
Next up, I am working on a spike to get speech to text working for transcription running locally via a Web Assembly (WASM) wrapped version of OpenAI’s Whisper model. Once that is working, then will come defining the data models and start working on building out the cloud sync support. Not gonna lie, I am getting pretty stoked on this app so far, and I hope you will too!
If you want to get early access to start playing around, please join the mailing list here: https://www.transmits.io
To follow along, you can find me at ryanhefner.com, follow me on Twitter @ryanhefner, and keep up with the show on allplay.fm and @allplayfm.
Help yourself, while supporting the show, by trying some of the services that I use, and highly recommend:
Transistor FM
Fathom Analytics
Transcript
00:00 - 00:06
Hey. How's it going? I'm Ryan Hefner. Welcome to Transmits. Again, another crossover episode from All Play.
00:07 - 00:38
This is the episode where I discuss working on Transmits, and I had the original first recording, you know, that that was captured via the desktop browser. And at that point, I had not tested the app on mobile yet. Well, you'll find out in this episode, but you could probably guess what happened. I'll let I'll leave it there. So the episode from All Play regarding Transmits going mobile.
00:41 - 00:53
Hey. How's it going? This is Ryan Hefner, and this is the All Play podcast. So once again recording this from Transmits, the app that I'm working on. Last episode was the first recording.
00:54 - 01:27
Well, actually, the second recording ever made in the app, and that was done via the desktop. I then started to test it out and tried to see, you know, like, whether that would, that same code would work in mobile Safari, when the app was added to the home screen. And sure enough, in classic fashion, it did not. It turns out that the file system API is slightly different, at least in, Safari at the moment. So it only allows you to use a file system.
01:30 - 02:00
Was it? File system sync access handler, and essentially that that runs synchronously, but it can only be ran within the, scope of a web worker. So I went down the road of it's actually surprising. This is the first time I've actually set up a a web worker. I've done some service worker stuff, in the past, but but, actually, it was it was pretty straightforward.
02:01 - 02:50
Got the web worker working, tried to basically keep as much of the code that I needed and really just, like, partition out the the part that was required for writing files to the, OPFS, and got it working. So transmits now works in mobile Safari, and I also tested it in Chrome on Android. And things seem to be working pretty good. Actually, I do have one of these, like, I think it's called the BOOX Palma. It's one of the e ink kinda mobile phone looking things, and it does not work in the, like, default browser that's installed on that.
02:50 - 03:23
But, I installed Chrome on it, and it seemed to work fine. So I don't think too many people are gonna be using these one off browsers with transmits, or at least I'm not gonna worry about right now. But, you know, the 2 the 2 use cases of basically adding it to the home screen on iOS and then it to the home screen on Chrome or on Android, via Chrome seems to be working well. Yeah. So that's working.
03:24 - 04:03
Actually, like, looking back over the last couple of weeks, I've started tracking my time on transmits. And so far, I'm, like, at about 19 hours that I've logged since, I guess, June 20th. So over the last month, I've put in about 19 hours. I'd say most of that was probably just, like, researching and playing around. I guess and then also if you start breaking that down, that's like well, like, basically, like, 2 days change spread out over the course of a month.
04:03 - 04:38
So, unfortunately, my the time that I've been able to devote to transmits hasn't been that much, but I feel like I'm making some okay progress. Actually, last week, the family, you know, me and the the kids and the family, went to the Finger Lakes for a little vacation, which was cool. And then we also happened to hit up Niagara Falls on our way back, out of Buffalo, for our flight. That was pretty cool. But, yeah, that week did not result in too much getting done.
04:38 - 05:02
So then, over the weekend, I basically got into the whole iOS code and, figured figured all that stuff out, which is also the reason why I I missed the episode last week. So I was kinda making up for it this week. Yeah. What else to talk about? I mean, things are going right now.
05:02 - 05:59
The next thing that I wanna get kinda shimmed into the app is the whole, I wanna do basically, you know, audio to, or speech to text transcription in the app. And so there is a WASM package that uses the open a p open AI whisper model, and you can run that in the app locally. And so that's gonna be the next kinda little spike that I'm working on. Assuming that goes well, then next step would probably just be kinda cleaning some stuff up and also adding some additional kind of, like, organization stuff to the a p or to the interface. Right now, it just kind of has, like, default names for all the recordings and captures very little metadata, when the recording is captured.
05:59 - 06:39
Not to say that needs this for the for that this needs to be blown out with a lot of extra information, but but, yeah, it's a little light right now, and there's definitely some placeholder components that, you know, aren't what the final thing is gonna be. But it's working, and, yeah, and things are going. So, hopefully, I get the WASM stuff, the the whisper WASM stuff in, and we can see how that goes. That's really the next thing. And then who knows?
06:39 - 07:44
Maybe I'll start getting this out into people's hands and just let them check that out. But that's next on the on the road map. Trying to hit off like, take off all these kind of the main technical things that I wanna at least have as, like, core parts of the app right now. I'm still kind of background churning on the whole data model and what gets synced to, you know, to, like, a central server when and and all that. But, I actually am leaning on the idea that transmitts would probably just be freely accessible, for at least, like, local local recording and, basically, local use of the app until you actually wanna start, syncing across devices or or posting ups, recordings for access via, embedded pages or whatever.
07:45 - 08:13
But that's the goal right now. So I'm I'm gonna focus on the client stuff first, making sure the recording and data is all being captured properly, still just writing it to the local file system. And then once I get that, I'll working with the transcriptions as an additional file that's saved alongside the, metadata and the actual recording. Then I'm gonna work on the data sync and all that stuff. So there'll be a bunch of bunch of changes there.
08:14 - 09:38
And, and sure enough, as I keep working on all this stuff, there's just more and more potential opportunities for open source software that I am noting and kind of roughing in, to this initial version, but I'll probably end up breaking it out into, packages and and publishing those soon. I think I made reference to a file system API, package last week that with the whole web worker thing that my thoughts on that have kind of shifted a bit. And I'm still thinking through what's the best, like, ergonomic way to package that up and allow and allow for the web worker and the other the other code to work, you know, side by side and and be accessible via, like, an NPM package. It also started to make me think, I I'm probably gonna do a little bit of, like, baseline benchmarking once all this stuff is together and see if more of the file system stuff shouldn't be moved to the web worker. Right now, just for support purposes, I'm I'm only doing the writing via the web worker, but there's no reason why I couldn't do all the reads of the directories and files via that web worker, which would then free up the main thread.
09:38 - 10:19
But at the same time, the what's going on in the app right now isn't super intensive, so that'd be a little bit, like, premature optimization that isn't required, but might be something interesting once this gets if, like when I package up that that package like, if or when I package up that package and, get that out. So, yeah, I think hopefully, I'm under time. I don't know. I actually need to add a little time code recorder here so I can see how much time is accrued. So maybe that'll also be some of the little tweaks I start making to the interface as I'm working through the Wasm stuff.
10:21 - 10:31
But, yeah, that's my update. Again, this is the All Play podcast. I'm Ryan Hefner. You can find me on Twitter @ryanhefner . Check out my website, ryanhefner.com.
10:32 - 10:43
You can follow the podcast on Twitter @allplayfm , and you can find the podcast on its website, allplay.fm. Alright. Have a great one. Later.