Work Note: Stream for Mac

Another slow start to the day. I’ve hit a point in my todo list of items I don’t want to do. 😄 That’s always a good sign. It means I’m getting to the end of what I’d like to do to get a 1.0 out the door.

Today I covered three things.

J and K Navigation

I like the way Reeder and Unread use the J and K keys to navigate between feed items, so I added that. I need to figure out if I want to add it to blog navigation as well.

Persist and Restore Window Positions

This was a lot easier than I expected! Thank you Interface Builder! I was able to set a couple properties and it’s taken care of for me.

BUG: Fix Feed Item Refresh

I had an ugly bug that would cause the feed items table view to not refresh properly. I was final able to find the set of properties I needed to tweak to make this do what I wanted. Now the middle column — feed items — now updates properly. Bug squashed.

What Next?

Well, I still have a list of things I’d like to do and I need to work on polishing up how the app feels. When redrawing feed item cells the associated favicon image doesn’t fill in as quickly as I’d like. I’ll just cache all of them so hopefully we won’t have that issue any longer.

I also added a new container type for blog display — leftmost column — so I can add static type items in the column. I need at least to column headers; Articles and Subscriptions, so I can have an All Articles item and have all of the blogs display under Subscriptions for a bit of separation. The All Articles item will behave the same way as Cmd+A and display all feed items mixed together in the middle column. It’s also where I’ll place the items saved to “Read Later” but that may not be a 1.0 item, we’ll see how it goes.

I also need to make sure to get my Action Extension “Subscribe in Stream” working on the Mac so folks will be able to subscribe right from Safari.

Oh, one other annoying thing. I created a separate target for the Mac build and I had to name it Stream-macOS because Xcode wouldn’t let me have two Stream Targets. I suspect this was a mistake and to fix it I’ll have to add a new Target to the existing Target. I know, that may sound weird, but there is a way to do it and I didn’t know about it until I read up on it today. That will be a real pain in the butt to fix because of file inclusion per target. Ack! Not looking forward to that! 🤣

Work Note: Stream for Mac

I got an early start this morning and managed to get to the coffee shop before they opened at 7AM. 😀

Once I got my coffee and settled in I got right to work. Got the app built and running then I noticed it wasn’t updating. DOH! Turns out my Mac had lost its mind and refused to connect to the network until I rebooted it. Even a Mac needs a reboot every now and then I suppose.

I’m still trying to figure out my feed item list UI rendering problem. When it reloads it goes through the proper code path; filters based on selection and tells the table view to reload itself. It does reload but half the time the items display off screen. I can get it to draw properly by scrolling the view. That’s when I noticed it would draw properly every other selection. 😳

Red sock.This got me thinking about my choice to use SwiftUI for the table view cells. One thing about that choice is cell reuse is kind of strange. The only way I’ve been able to get them to draw properly is to make a new view, just the SwiftUI part, so it gets laid out properly. I’m fairly certain I could get this working by using SwiftUI’s state mechanism but I decided to try doing a proper cell using AppKit and hook up the constraints manually. I have the cell put together and was working on constraints when I ran out of time for the day.

If I’m feeling rambunctious I may work on it a bit this week. If all else fails there’s always next Sunday.

Work Note: Stream for Mac

I was slow to start today. I wasn’t sure what I wanted to work on at first. It took me a couple hours to really get rolling.

So, what I did was fix a refresh bug that was bugging me. When I added a new blog the blog table view didn’t update. It took me a long time to decide how I wanted to fix it. I went through a bunch of ideas then I noticed that I’d already had some stuff in place that would allow me to fix it pretty quickly. Unfortunately it took me forever to get to that point. That’s now fixed. ✅

I had another bug that was really bugging me but I keep forgetting what it is until I run into it again. This week I decided to save the offending Atom feed into my collection of test feeds so I’d get it fixed. Bug exterminated. ✅

AHHHHHH!I have a small list of things to do before making a 1.0 release. Once I get those items completed I’ll put together a limited beta and collect some feedback. I need to do a lot of polishing. My tables flicker too much during updates because I reload everything and force the UI to render. Yeah, very heavy handed. If I can minimize the flicker I may ship it like that. Once the Mac version is out I can focus on catching it up to the iOS version and start adding new things to both at the same time. I have so much work ahead of me but that’s perfectly fine!

Work Note: Stream for Mac

Brain in a jarWorked on Stream for Mac today since we’re celebrating our granddaughters birthday tomorrow, should be a super good time. Looking forward to it.

So, today when I started I had to fix a couple of outlets in my Mac NIB for the main window. How this got busted I’ll never know but it was and it caused the app to crash at startup. I do this so rarely that I forget how to do it, so it sucked to have to start off that way. Fixed. ✅

Next thing on the fix it list was a bug I’d introduced three weeks back. When I’d refresh the blog list using a pull to refresh on the iOS build or Cmd+R for the Mac build it would make all the network requests and tell the view controller to do its thing, however I messed up my view model when I added the ability to filter down to single blog selection in the UI, whoops! That was a simple fix. ✅

I decided, with the time I had left, to add some keyboard support. Doing a Cmd+A will now select all feeds. I need to add an All item in the blog list so folks can click on it if they’d prefer to select to display all feed items for all blogs that way. Maybe next time.

I also added support for using the up and down arrows to navigate through the list of blogs or the list of feed items. That went together pretty quickly and I really like the results. Done. ✅

I’m going to add some vi support to the keyboard to do some navigating as well as making the space bar scroll the through the article you’re viewing or moving on to the next item once you reach the bottom of an article. Stuff like this are kind of table stakes in existing feed readers. Future addition.

Until next weekend I’ll have some new features to play with on my Mac. I’m tempted to start a TestFlight but it’s still so early days. Reach out if you’d like to try it now. It may crash and misbehave but it’s kind of fun to play with, if you can tolerate it. 😄

Work Note: Stream for Mac

More work on Stream for Mac today.

I renamed some stuff because I had Feed and FeedItem used in various places. A Feed represents the Blog’s RSS Feed information. A FeedItem is a single entry from an RSS feed for a particular feed.

Those are accurate names in my opinion but just glancing at them can be confusing in their use in the code. So, what I did was rename the table view BlogListTableView and the view model for it BlogViewModel. I also added new classes for table views called BlogItemCellView and BlogItemTableCellView. It made things a lot easier for me to read and understand. The base models of Feed and FeedItem remain as they were.

I finally got around to filling in the left side table view of the three columns. This is a simple list of blogs. I also added a little code to allow me to filter the list of feed items based on the selected row in the blog list. Simple, expected, stuff.

After doing that I adjusted the blog cell and feed item cell to use a different font for the blog title and feed item title. They look a lot better now. I also added some padding around the outer edge to space things out so they’re not all jammed together.

The final task was fetching and caching the favicon for each blog. That’s where I wrapped up for the day.

I can now display a list of blogs. By default all feed items display in the middle column. When you select an individual blog the middle column displays just the items for that blog. I still have to add a new top level item to the blog list to allow you to select All items, but not today.

Image of Stream for Mac

Stream Work Note

Red sock.Today I worked on some refactoring so I could support another column in the Mac version of stream and I migrated away from my singleton instance of the database because it just felt gross.🤮

That removes the only singleton in the app and I feel a lot better about it.

I’m splitting some functionality out of a view model and putting it into a different view model to better support the third column Stream will now have.

Yes, I’m adding a feed column. Stream for Mac is the only version that will have that extra column because it feels natural for the “Big Dog” app to have it.

I still plan on keeping the app extremely simple and will provide a Timeline Mode that hides the feed column so it behaves just like the Stream we’re accustomed to.

More to come. Today was a lot of infrastructure work and rebuilding the iOS to make sure it still works as expected.

The Mac version is in a bit of a busted state because I ran out of time today. But I’ll get it fixed ASAP. 😃

Until next week, take ‘er easy.

Work Note: Stream for Mac

I decided to go with working on Stream for Mac today.

The feed item cell has been a complete mess for years, yes, you read that right. It’s been a complete wreck for years now. I kept on insisting I do all the work using AppKit.

Today that changed. I needed to make progress and even though my SwiftUI experience is very limited I was able to get the general layout working the way I’d like it. It’s not complete by any means but each UI element is displaying in the place I want it to (mostly) and the cell resizes properly, oh, and the date label/text remains pinned to the right side of the cell. That was a big issue with my AppKit NIB attempt.

Polish, polish, polish is the next course of business with the new cell. It needs spacing updates, text size fixes, color changes, highlighting support, keyboard support, so many things. But, now that it lays out the way I want I can move forward.

This is the first SwiftUI code introduced to the Stream codebase, which began life in 2018.

Stream Work Note: Post Stream 1.6 Work

I was so focused on getting a single feature done for Stream 1.6, and add a little Liquid Glass support that I don’t know what I want to work on today. 🤣

Brain in a jarI want to get back to the Mac version but it feels like so much work. I need to get my table view cells to behave properly. Perhaps I’ll punt on having the date attached to the right side of the cell and put it somewhere on the left just to make some progress today. 🤔

Would different cell layouts between iOS and Mac versions put folks off?

Something else I’ve been considering is adding a third column to Stream for Mac! Yes, it would make it behave just like every other feed reader on the market. Going 100% against what Stream was built to be. My reasoning? It’s strange, at best. On iPhone it has a single column, on iPad it has two, so it makes sense that the Mac — being the big dog — would have three, right? RIGHT!?

Should I add keyboard shortcuts to better support iPad? That would also make the iPad app a better citizen on the Mac!

Do I being my journey into SwiftUI by replacing some of the lazy UI I threw together just to get 1.0 out the door?

Oh, how about that new subscribing UI I wanted to do? I got some lovely feedback from a friend about onboarding! I’ve been thinking about that a lot myself. It’s a great idea and I need it! Perhaps that’s my first SwiftUI code? I think y’all would like it, at least I hope you will.

Anywho. Lots of thoughts spinnging around in my brain. 🧠

I have such a huge list of things I want to add to Stream. Like full page parsing and stripping of formatting, fix some things that annoy me, syncing, connection to feed services like feedbin, recommendations (curated and LLM recommended), a Mac version, and the list goes on and on and on. 😃

Stream Work Note

I’ve managed to kick nine builds of Stream out to beta testers. That’s the most I’ve ever done! I owe this all to the four hours of time I’ve reserved on Sunday morning for working on Stream. It’s been seven weeks of work. Like I said in my last Stream Work Note I’m overjoyed at having this time to focus work on Stream and, of course, have a really great Mocha while I do it. 😄

During my testing I noticed that the one new feature I’ve been adding to the app would fail when Stream was tiled with another app. That really stunk because otherwise it looked great to me! Today I managed to fix that outstanding critter and it feels really great!

I’ve had two other bug reports come in specifically for my iPad support — thanks Lucian and Sean!

Red sock.The first bug was occuring when you’d pick a feed to subscribe to. That porting of the code has been synchronous since day one. I figured why do it asynchronously when the UI was going to be blocked while I added the feed to your list and parsed it. Well, newer versions of iPadOS didn’t like that and the app would crash hard. Yikes! Can’t have that. I fixed that bug earlier in the week or maybe last week, I don’t remember, but it’s out of the way and now asynchronously updates the app, be it iOS or iPadOS.

The second bug was a bit more difficult to fix only because I couldn’t reproduce it. It turns out it was happening consistently on iPadOS 16.8.2. So, I added that simulator setup and kerpow! 💣 It happened right away. YAY! 🥳 It turns out I’ve been stacking two navigation controllers on top of each other since I added iPad support a few years back. DOH! The OS was just tolerating it so I didn’t know. Well, it looks like Apple decided it wouldn’t allow that any longer, and rightfully so! I fixed that issue yesterday.

This morning was spent fixing the tiling bug and it’s now done and a new TestFlight build it up. If everything goes well with that build it could be my final build before Tuesday’s Apple Awe Dropping event. 🤞🏼

Have I ever mentioned I’d love to work on Stream full time? I didn’t think so. 😄

Stream Work Note

I’ve been going to Grit, my favorite coffee shop, for the last six Sunday’s to work on Stream. It’s been really rewarding to spend the morning working on it. I typically work from around 8AM to noon, then grab Chipotle for my daughter and I and head back home.

That four hours of time has given me so much joy and recharges me for the week ahead. I cannot imagine how much better Stream could be if I were able to do this five days a week for five to eight hours a day! I might actually be able to make some real progress on the Mac version! 😱

Today I’ve managed to kick a beta build out the door. What I expect to release is version 1.6.0 as soon as Apple opens the door for glassified releases. Now, don’t expect much. Even with my four hours at a time to work on it I’m still very slow and the feature I’ve added isn’t glassy, at all. It’s something I’ve wanted to add for a very long time. It’s a feature meant to make things easier to subscribe to feeds. That’s all I’ll say about it for now.

What’s next?

Well, I had wanted to create an entire new view for adding and managing your subscriptions. I really need a nice way to populate the app your first time launching it and give you some great options when you pop open the Subscribe view controller. My plan is to create a nice set of hand picked feeds for users and, perhaps, add a set of recommended feeds using Apple’s built in LLM models. We’ll see at some point I hope! As long as I’m able to continue spending my Sunday mornings coding I think I’ll be able to achieve a lot on the app. I have a lot of features to add and bugs to fix! There are a lot of usability things I could do to improve the app and a few bugs I need to take care of.

Where’s the Mac version?

Brain in a jarThis is a tough one. And it’s only tough because I don’t know AppKit as well as I do UIKit. Yes, Stream is still 100% UIKit and the Mac parts I’ve done are all AppKit. I’m thinking I may do some new features in SwiftUI because I need the practice. I’ve never built anything with SwiftUI.

I’ve struggled to get layout on the Mac working the way I’d like. My table view cells look like crap and even with help from a dear friend — hi, Josh — I haven’t been able to get it right. It’s terribly frustrating and makes me want to jump out a window.🤣 Maybe SwiftUI will let me make those cells work on Mac?🤞🏼

Stream Work Note

I haven’t done a development work note in a long time.

I’ve started working on a new feature for Stream that required creating an App Group so I can share data.

I’ve added everything to my new Action Target and I have the code put together using existing classes, it was honestly pretty easy to do.

Brain in a jarNow comes the interesting bit. If I understand how an App Group works I am going to have to move my existing database to the group container so the extension will be able to access it?

If that’s not the case I’m sure someone will let me know. 😂

The thing I’ve never tried to do is open a SQLite database from two processes. Does that even work?

If it doesn’t work, things are gonna get very interesting.

I can always create a separate database just for the Action Extension that matches the structure of the main database and have the main app import it at a later time.

I’m hoping I’ll be able to open it from the main app and the extension and have it work as expected, but I’m not holding my breath.

I just looked at my Cotton Bureau store earnings. I’ve sold one t-shirt and one phone case, if I’m reading it correctly. 🤣

Thank you to whoever bought the t-shirt. I do appreciate the business! 🙏🏼

I bought the case. Guess I should go grab a t-shirt while supplies last!

Holy cow, when did this happen? 😃

I just decided to browse around the App Store to see if Stream was anywhere in the Apps tab, and it was! 😍

It’s under Apps You Might’ve Missed. Thank you! 🙏🏼

P.S. The reason it doesn’t look like I’ve installed it is because I’m running a Beta build.

Daniel Jalkut

Did you know that Paolo Pasco, the winner of both the 2024 and 2025 American Crossword Puzzle Tournament, uses MY APP, Black Ink?

That is so cool! I’d be thrilled to hear from dedicated Stream or RxCalc users!

Cotton Bureau Sales! 🥳

Got my first sales report from Cotton Bureau and was super excited to see how many t-shirts and cases I’d sold! 😃

One. I sold one phone case and zero t-shirts. Oh, and that one case was sold to me, so it doesn’t count. 😳🤣

If you like the Stream icon head over to Cotton Bureau and buy a t-shirt or phone case!

Apple Newsroom

Apple honors 2024 App Store Award winners

Congratulations to all the winners!

Not gonna lie, I’d love to have one of those blue beauties on my shelf. 😍

My apps need to be so much more polished and feature rich before I could even dream of such an honor. I have the likes of Unread, Reeder, and NetNewsWire to compete with. All beautifully designed and developed.

Having said that, you should go download Stream and leave me a tip! 😃

Thinking of Stream for Mac

The old Voodoo Pad iconI’ve neglected Stream for far too long and I don’t know when I’ll have the gumption to get back on it. Learning AppKit has been a slow and arduous process. I really hate when I suck at something. I know, I know, doing the work will make me better but I just don’t have the energy that 20 something me had to stay up all night learning and doing.

Once of these days I’ll get it finished. It may take years to get there but I’ll get there, I hope. 🤞🏼

Of course finishing off the 1.0 of Stream for Mac would allow me to work on Rooster, which is a new codebase and 100% SwiftUI. 😄

C++? Are you crazy, Rob?

Brain in a jarThere is this weird part of me that wants to go back to writing cross platform C++. All of my cross platform work was for Windows and Linux. The itch has been there since I moved to iOS code — and I spent [two years in between iOS dev jobs working on a cross platform SDK for Pelco’s video encoding, decoding, and recording devices, all in C++. It never made it to Linux but I spent a whole lotta time working on Pelco’s X SDK. That was our version of a cross platform SDK we used internally to build a cool pipeline framework called MPF, or Media Processing Framework.

Why the draw. I’m not sure, but I think it’s probably because it’s the language I know best and I did a lot of work with the Windows API, which was also a strong suit.

I still haven’t, and don’t think I ever will, embrace the Mac like I did Windows. At the time I was a Windows dev the platform was simple, before COM and OLE 2.0. The Windows API was so straightforward.

None of that is true any longer. Not for Windows or C++. I bet I wouldn’t even recognize modern C++. C++ 11 changed A LOT in the language and it’s only advanced since. As for the Windows API, folks still use it but you should be doing something different, like using WinUI 3.

The thing is, I REALLY want to complete Stream for Mac and my new super top secret project: Rooster. Yeah, it’s not so top secret, and I finally gave it a code name, but if you know me you can probably suss out what it would be given my love of blogging.

StreamKit?

I’ve been thinking about breaking Stream’s inner workings into a separate package.

It would include; networking, parsing(RSS, JSON Feed, Atom, and HTML), data models, database(?), and any utilities around those items. The database bit is a stretch and should really remain outside of the package. It wouldn’t force a storage mechanism on anyone.

I’d like to do this to keep me honest about my separation of concerns and I just like the modularity of it.

It would, of course, use Swift Package Manager to create the package.

The big question rolling around my brain is this: Do I open source it?

Why not you ask? Well, it’s simple. I’m afraid my code will be dragged through the mud and that would destroy me. I love and appreciate constructive feedback and would absolutely take PR’s.

To get where I’d love to have it means creating the SPM and using it internally for Stream for iOS and Stream for Mac. I’d also like to make sure I’m using all the new async/await strictness put in place with Swift 6.

If I can get that far I’d consider open sourcing it. Maybe. 🤣

The other question is, would anyone use it?

Stream for Mac Update

You’d think since Stream for Mac looks this bad I’d get to work on it, you’d be wrong! 🤣

I really do need to get back to it. I started working on the add feeds modal and realized I needed to fix up some of the code that does that to work better on the Mac. It’s also forcing me to look at adding async/await to the app, which is something I really need to do.

Stream for Mac: Work Note

Brain in a jarI managed to work on Stream for Mac for a little while yesterday. I got a bit confused about how menus operate on the Mac — from a developer standpoint. I’m an old Windows developer of 20 years turned iOS developer in 2009 and now exploring the Mac and AppKit (yeah, I know, it’s old and busted now.) I got hung up on who “owns” the menu in a Mac App. I’d never had to think about it before, now I have a better understanding of how the Mac and first responder work.

I was kind of beating my head against the concept until our internet connection decided to stop working and I was kind of forced to walk away for a bit. That was intimately the key to figuring it out. I asked some questions on the Core Intuition Slack, using my phone, got some great answers to my noob questions, and read about menus and first responder in a book I have available in Kindle. The book I used was Programming Swift! Mac Apps 1 Swift 3 Edition by Nick Smith. I jumped to Chapter 8 Menus, Toolbars, and First Responder and that did the trick. I’m hoping I’ll be able to carve out some time today to put my newfound knowledge to use. 🤞🏼

I have other chores to take care of first. Hopefully they don’t take too long. Heh, they always take too long. 😂

How cool is this! To be included with the likes of NetNewsWire, Unread, and Reeder is quite an honor! ❤️

I’d like to be an Indie Dev

Steven Beschloss

I love architecture. A beautiful structure—like the iconic Flatiron Building in New York (seen here)— inspires me. It’s not just the aesthetic pleasure of the shape, the materials, the details and its placement, but recognizing how much thinking, planning and executing it took for the original idea to become reality. Unlike other art forms, architecture can’t just be beautiful; it also has to be functional.

The title of Mr. Beschloss’ piece is What Job Do You Wish You Had?.

This is an easy answer for me. I love building software, just like I’m doing now, but I’d like to be doing it independently.

Brain in a jarI would love to wake up every morning and work on Hayseed projects like Stream and unnamed project.

The reality is I don’t have the means to do that. I am bound to my salary and I no longer have my 20 something boulders energy to stay up most of the night working on my dream.

Until retirement I’ll keep hacking away an hour here an hour there on my projects in hope I will be able to break out some day.

Even if someday doesn’t arrive for me I am finding the most joy programming my own apps. No overhead, no meetings, just writing code. That’s just the way I like it. 😃

It was a record sales week for my little apps!

Yes, I’m genuinely happy about this.