Time to work on Stream.
Time to work on Stream.
grug tempted to reach for club and yell “big brain no maintain code! big brain move on next architecture committee leave code for grug deal with!”
I love The Grug Brained Developer. Grug make laugh. š¤£
I was able to make it to the coffee shop and work on Stream today. Iāve been revisiting how to construct a good AppKit cell view ā NSCellView ā that does exactly what I want. And I continue to fail.
Iāve tried using constructing a cell using a NIB. It didnāt work as Iād wanted it to and I could never get it right. I abandoned that attempt.
Next I tried doing it in code. I managed to get the same exact results. It didnāt resize properly. I abandoned it.
I decided I should do it in SwiftUI. It only took me an hour or so of tweaks to make it work exactly like I wanted! Yay! š„³
Next I had to get the little blue read/unread indicator working. I tried a lot of stuff but I couldnāt make it work driving it from an AppKit view (more on this later.)
So, I decided to give AppKit another try. This time using NSGridView in code. I wasnāt able to get the results I was after. So, you guessed it, I abandoned the attempt.
I thought Iād be clever and let Claude do it for me because Iām so darned hung up on it working as an AppKit cell.
I gave Claude a description of what I wanted, pointed it at the working SwiftUI version, told it to use my coding style, and turned it loose. At first glance I was surprised. What it built worked exactly like my AppKit versions. The date wasnāt pinned to the right of the cell view and things didnāt flow properly as I resized the cell. These are the exact same issues my hand built versions had. š³
I went back to Claude and explained what I wanted to change and why. It went to work and made some tweaks. I thought, this is it!
Nope. Not it. Still has the same issue. The code was tweaked but I got the exact same results. š³
I was puzzled to say the least.
At that point I was ready to declare I was a completely incompetent developer, throw my computer in a lake, and go hide away in the woods somewhere until I died.
I decided that was a little extreme and decided Iād go back to the working SwiftUI version.
Now, how do I actually get the darned blue read/unread dot to update properly?
I poked around at how Combine and SwiftUI work and how to properly expose and use a property when it updated. This time I went right to my model and made the very simple changes. Those worked as expected. š„³
Now, to be clear, Iād tried some combination of things prior to this attempt and they all failed. Why didnāt I do it this way to start with? Well, Iām dumb, and stubborn, and wanted it to work a certain way, so I kept trying to do it my way. Sure, I used Combine and @Publish and ObservableObject, and the other macro Iām forgetting at the moment, or some other combination of those.
This time I told myself āJust bite the bullet and do it exactly like the documentation says, donāt try to fit it into your model.ā
It works. Iām happy about it.
I stubbed out Command+click options on the cell and added some print statements just to make sure it did stuff. It did.
I packaged up my laptop and headed home. Now I sit here tying this up. Iāve been banging my head against a wall off and on since December of last year. I am an idiot and maybe I should quit?
Problem is, I really want to make this app. š
Time to hit publish and go mow the lawn, where Iāll think about my next steps for Stream for Mac. For the time being Iām freed of that burden I carried for so long.
Now I can do the features I need to ship the first release.
That is a good feeling. šš¼
Out of curiosity I just configured a new MacBook Air. Iām pretty sure itās the one Iād buy if I were in the market for a new laptop.
Hereās the configuration:
⢠15in.
⢠Sky Blue
⢠32GB Memory
⢠1TB SSD
⢠Included power adapter
⢠Yearly AppleCare+
Total price: $1,899
My work laptop is a 16in M2 MacBook Pro with 32GB memory and 1TB storage and itās a great computer. Fast and reliable.
The Air would definitely be enough horsepower for my app development.
Sitting at Grit ā my favorite coffee shop ā sipping my mocha trying to decide what to work on.
Stream for Mac, Stream for iOS, or Thunder Chicken?
It should be Stream for Mac. I havenāt worked on it in a while because Iāve been working on Thunder Chicken.
Iāve thought about doing a German localization for Stream.
Adding a right mouse action menu to the Mac version of Stream, and whatever else I can complete.
What about having Claude create an NSCellView for me that sizes properly when the column itās in resizes. I could never get this working properly but did it in SwiftUI rather quickly.
How about completing the first full implementation of a network client for Thunder Chicken? Get posts, create posts, update post, delete posts, etc. I have an abstraction so I can support multiple blogging platforms.
Oh, I forgot about Arrgly. Itās my link shortener that uses YOURLS for its backend. I have a new SwiftUI version of it I need to finish off, just because.
Decisions, decisions.
This would be a welcome UI change in macOS. I keep thinking about older operating system UIs and I miss that more chiseled look. Iāve also always loved the color versions of Mac icons and the angle theyāre drawn.
I think Iām just feeling nostalgic but Iād love to see a modern take on this older MacOS look.
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. š
Iād done some work on a function last week that determined if a certain permission level was valid for a particular type of user account in our app. The requirements depended on multiple different factors including account type, language, and some other sub data types. I paired with some other devs on the team because they knew way more about the account types than I did, yes, they were convoluted and a few special cases had to be accounted for and even included a check for language spoken and region of a country.
This function had been a lot more straight forward but we were expanding the application to work with more account types so the unit test requirements doubled. When I went to update them I was struggling a bit, remember, Iām using TypeScript and Iām still really bad at it.
After scratching my head for a bit I opened Cline in Visual Studio Code and asked it to āwrite unit tests for [filename].tsā and it got to to work. It churned away for a while then started outputting new code. After checking some outputs and clicking Save a few times my brand new unit tests were complete.
It worked. Color me shocked. š³
I can now see doing this for most, if not all, of my unit test needs on this project and probably others. As much as I enjoy writing unit tests, no, seriously, I do enjoy it, this saved me quite a bit of time. Just incredible.
And it seems retro in the worst way that weāre still using anything other than a scripting language for most of our code. We should be using something simple and light that can configure toolbars, handle networking callbacks, query databases, manage views, and so on. And maybe with a DSL for SwiftUI-like declarative UI.
Almost none of that code needs to be in a lower-level language like Swift or Objective-C. It really doesnāt. (I say this as a performance junkie!)
It could be in Ruby, Lua, Python, or JavaScript. Better still would be a new language invented specifically for the problem of writing apps, something designed to make the common challenges of app writing easier.
We did have this stuff decades ago. Not for app making in general, sure ā but now itās 25 years later, and a company like Apple could make this real for all its app makers.
Where to start? Letās start by saying I agree 100% with Brent. Having a built in scripting language with dynamic UI updating and easier ways to build code and UI would be absolutely incredible! And, like Brent says, Iād love to see Apple make this happen.
A hojillion years ago when I worked at Visio we had VBA (Visual Basic for Applications) integrated right into Visio. It was a fantastic way to build custom Add-Ons for Visio. You could embed your VBA solution right into your template or document so folks could invoke it right from the app. This allowed folks to make fancy automation to fit their particular need and do it in a high level scripting language that could control Visio in all kinds of ways! I loved it! I spent a lot of time working on Add-Ons to Visio in C and C++ but I used VBA to test things before implementing them as an Add-On ā Add-Ons had the advantage of being usable app wide.
Iām not sure how VBA is used in Visio today but before I left Microsoft had added a way to build your solution code into binary form so it could be signed before including it as a part of your solution package. It was such a marvelous development environment.
Now, if youāve ever used VBA in Visio, Excel, or Word you know exactly how powerful it is. Could you imagine having access to something like that within your Xcode dev environment that was fully integrated, or even supported like VBA in an application? Yes, itās a lot of work to make something like VBA work but it is so worth it.
Brent mentions Ruby, Lua, Python, and JavaScript as the scripting languages but I have to say Microsoftās Visual Basic for Applications is so much easier to understand and use than any of those languages and it was easy to open functionality to it using Microsoft COM, IDispatch specifically, in the app. I know, COM has a bad reputation for being difficult. Yes, like I said earlier, itās a LOT of work, but itās so worth it when you can open all that power to your users and yourself! Taking that to the next level, like Brentās talking about, would be a huge boon to Apple Platform Developers. AppKit, UIKit, SwiftUI, Objective-C, and Swift are still too deep to move quickly. If developers creating code for any of Appleās platforms ever took some time to use VBA theyād see what Iām talking about. The paradigm is a bit different than theyāre used to but, hell, I was so confused when I came to iOS development! Theyād get used it after a time.
Building UI and code behind VBA forms is so easy. Drag and drop a UI, double-click on the element youād like to add code for, and write your code. Thatās it. Itās that easy! I would totally embrace this idea for application development on Apple platforms.
You can build at a higher level today using awesome tools like Xojo that give you a very Visual Basic like experience complete with a drag-and-drop forms builder just like Visual Basic!
Psst, did you know that folks have been scripting applications for iOS, complete with dynamic UI updating, with React Native? Yeah, itās true! Iāve been working on an application like that for the last two years. Weāve almost completely rewritten the application in 100% React Native, which uses JavaScript as its backing language and a way to build UI in a very HTML/CSS manner. Think SwiftUI with web technologies. It works.
I know of many applications using Electron to deliver cross platform apps, like 1Password. They used Rust for mission critical code and put an Electron āfront endā on top of it. Microsoft has fully embraced React Native. They like it so much theyāre the primary maintainer of React Native for Windows!
Am I saying React Native is a perfect solution? Hell no! Itās a terrible developer experience in my opinion. Most folks use Visual Studio Code ā I prefer Nova myself ā as their editor and donāt have a nice debugger to fall back on. Nothing is integrated. Itās a bunch of tools losely hung together by duct tape that let you kind of see whatās happening in your app. Hey, if you think console.log is the height of debugging then this environment is for you! š¤£
In the end I, like Brent, would love to see a modern scripting environment thatās embedable or standalone that is fully supported by and used by Apple internally to create applications. The embedded environment is very enticing to me. Something like Visual Basic for stand alone development and Visual Basic for Applications for embedded scripting would be absolutely incredible!
Modern means easy to use UI builder and code behind that is a super simple language like BASIC and on top of it make it easy for third-parites to make extensions to the environment and provide code modules that give developers the power they need for specialized applications.
Look at Xojo. Thatās it. Apple, buy it and make a version thatās 100% built for your platforms and is embedable in applications.
ChatGPT and other AI services are basically killing @Iconfactory and I’m not exaggerating or being hyperbolical.
Reading this sent chills down my spine.
Iconfactory has a very long history of creating beloved applications and designs for Mac and iOS.
Their designers craft beautiful interfaces, icons, and other illustrations.
To think they could go away because people are using AI generated slop designs and icons is gut wrenching.
Iām a huge fan of Iconfactory work. I use their apps everyday. Two in particular; Tot and Tapestry.
Iām writing this blog post using Tot. Itās perfect for it. Simple text editor with Markdown support and automatic save that syncs with iCloud. Itās an example of simplicity that is absolutely useful. Iāve been using Tot for years to write all of my blog posts, including Saturday Morning Coffee. āļø
Tapestry is a new app. It is a new take on feed readers. Sure, itās a competitor to Stream but itās beautifully designed and implemented.
Iām a Wallaroo and xScope user and Iāve heard wonderful things about Linea Sketch.
Their craft is second to none.
Stream had the honor of being featured in the App Store in October of 2023. I worked with Iconfactory to create the banner Apple needed for the feature. It was a completely painless process and the results were beautiful and better than I couldāve imagined.
If you need someone to design your app, icon, or other materials, give Iconfactory a shout you will not regret it. ā¤ļø
Something we’ve become very good at, at WillowTree, is migrating native code to React Native incrementally. I’ve been working on a project for the last year-and-a-half to migrate a pretty big application to React Native and we’re not there yet. We’ve finally hit critical mass in the React Native codebase to begin the transition to a full React Native based application.
To start the migration we built bridges to the native iOS and Android applications to handle things like; networking, navigation, analytics, telemetry, and events.
Since the native applications had great code written for all of those things we were able to leverage it to build a brand new user interface using React Native. At one point we had a Platform Team who built out the Bridges between React Native and Native. Those teams consisted of two native iOS and Android developers and a React Native team of two. The two React Native developers built up the TypeScript side of things for communication between React Native and Native, leveraging our native bridges.
To make writing new React Native UI easier we had individual teams working on specific parts of the UI by feature. A mono-repo was created so the team could use Expo to quickly iterate the parts of their feature. The React Native Platform team made sure the App Team could mock everything and use the bridges as theyād be used with the native application. It worked out really well.
Since each feature area had its own team we would take their code and make a package out of it. Those NPM packages were then referenced and used in the native iOS and Android applications.
Letās say we had a Social feature. That feature team would do everything to make that feature work as expected, complete with UI, business logic, and any navigation necessary to complete the feature. That feature would be bundled up into a package and deployed to a private NPM repository.
The native application would reference that package in its packages.json file by its version number and it would be installed using NPM. Once we had it packaged into the native application we would reference it using the supplied Meta React Native library code in each native application. Once the React Native Framework was strapped up it was easy to wrap up each React Native feature and display its UI, where it was completely controlled by the React Native developers.
To supply the React Native code with models ready for consumption we bridged to the native applications since each had already implemented network and data caching code. The React Native bridge allowed the caller to supply all the arguments necessary to make a network request and the bridge code bundled it up, sent the request, received data (or POSTed it), updated any local caches, and forwarded it to the React Native code where it would become a TypeScript model object ready for them to consume. It was some of the first code we created and really opened the door to productivity right away.
Iām going to talk about this from an iOS perspective, since itās what I know.
This was a bit tricky. Navigation from React Native to Native isnāt a straight line. When creating a React Native feature we first constructed an RCTRootView. This would ask the React Native framework to load a particular feature and host it inside the RCTRootView. Once the React Native code was loaded it was running in its own little sandbox, so to speak. It didnāt have any knowledge of the outside world, except through our native bridging code.
Our navigation bridge was quite simple. It was a single method that allowed code to navigate to a native UI View Controller or to a React Native View Controller based on the name of the UI the developer wanted to navigate to. Yes, the bridging code had to know about every view controller in the application, to an extent. The developers of the iOS and Android code thought ahead and created a really nice set of routing classes. Those were leveraged to display most view controllers, native or react native.
While each feature was self contained this navigation bridge was there to provide the glue that allowed us to display anything we wanted.
One bit that felt weird was the need for the React Native code to know when it had to close itself. The native code built the UI and was hands off at that point but we had to know when to tear down that UI. The React Native code would tell us when it had to go away. Unbalanced, but a compromise that worked beautifully.
There are a few more bridges we built. Each defined in a separate package supplied by our private NPM repository and built into the native applications. Iām not going to get into those now. This post was kind of off the cuff and I could go really deep into the architecture, but that is for another day, if at all. š
I will say this. If you were not aware you were looking at a hybrid React Native / Native application you wouldnāt know. Since React Native uses native controls for each platform you are truly getting a native application. Sure itās using the JavaScript engine from the platform for writing code and sure the UI is described in web technologies, but the Meta React Native framework does all the work to display 100% native UI controls. Thatās what makes it difficult to tell the difference.
At work we’ve started using Bruno. It’s nice but it’s also an Electron App. I’m already learning React Native on iOS because we are getting a lot of requests for applications written using React Native. We build apps for clients so it makes sense for their apps to be written once so they work on both Android and iOS. They get their money’s worth, I suppose. It’s all about squeezing more out of us. But what does that say about craft? To me it says it doesn’t matter. We’ve fallen into the Accenture trap. We are hired guns who need to pound out code everyday at the fastest possible pace, with high quality of course, and use the lowest common denominator toolset. š¤¢š¤®
Anyway, I’m feeling a bit spicy this morning for some reason. I really need to improve my SwiftUI and pound all the new concurrency stuff into my tiny brain but I’m torn because to be useful to my company I need to become a React Native expert.
Guess I’ll have to use Stream and Top Secret Project to learn SwiftUI and Swift Concurrency. šš¼
Gotta say it, the Dutch Brothers Coffee app is really well done. Itās beautiful, stable, has a personality, and does exactly what itās supposed to do. Lets you order and pay for coffee.
I wonder who makes it? Do they do all dev work in house or do they have a studio, like WillowTree, work on it? Iām super curious.
If you know, send a message my way, rob.fahrni@gmail.com.


Iā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. š
There 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.
Since we can use Swift to write code for Windows Iām excited to give it a try.
Iām hoping I can bring over all of Streamās model, network, utility, and view model code over without changes, or perhaps few changes?
The other thing Iām thinking is, I should be able to port my C++ framework for building Windows apps to Swift. That would be something really special and would allow me to do a full version of Stream for Windows. Heck, if my shared code comes right over and I can rebuild my Framework in Swift, I should be able to do a Windows release pretty quickly.
Of course I really need to focus on the Mac version first.
Hey, Microsoft, can you make Visual Studio support Swift as a first class citizen so we can build and debug using it? Please? šš¼
Craig Hockenberry ⢠Iconfactory
This post will explain the technology behind Project Tapestry and how we tested it as a prototype. Weāll keep this discussion at a fairly basic level: if youāre a web or app developer, youāll have no problems following along.
And if you think Iām going to describe RSS feeds now, think again! Weāve come up with something completely new.
I’m excitedly looking forward to seeing the final product and I hope they make their stretch goal of bringing it to the Mac. š¤š¼ Please, go read about Project Tapestry, and if you’re so inclined please support their effort. I backed them early, it was a no brainer for me.
I really wanted to talk about the choice the Iconfactory made to create a highly extensible platform for plugins. It’s a darned great idea! And I love their choice of pushing network requests through Project Tapestry itself as a way to guarantee plugins can’t phish out user data or credentials to exploit later. šš¼
As I was reading the post I came across Craig’s mention of the app having a sendRequest method used by the JavaScript code to make network requests. This grabbed my attention and made me realize this is a way better version of a React Native application.
What I mean by that is, React Native is hosted inside a native iOS application framework and uses native iOS controls on its view controllers or its version of a view controller. The JavaScript code drives everything from networking to user interface (it uses UIKit internally) to render content for the user to interact with. This allows developers to write their app using straight web technologies and run it on iOS and Android.
The project I’m currently involved in is an existing eight year old iOS application built with a mix of UIKit and SwiftUI. On the flip side the Android app of the same age is built using Java and Kotlin with a mix of the original XML based UI and modern Jetpack Compose. They’ve both taken very similar and not unexpected paths.
Something our client wanted to do is integrate React Native into the existing applications. This has been done before by Airbnb and more recently by Shopify. Each with very different outcomes.
So all of that to say, ours has been successful, in my opinion. We’ve been able to fully integrate React Native and carve out a little set of API’s in the native application we expose to the React Native developers to do work the native application is already doing for them for free. Part of which is all the networking calls.
In the Tapestry blog post Craig points out sendRequest. It’s the call they use to handle requests to the internet for the JavaScript plugin. In our application we’ve exposed a makeRequest call that handles doing any type of network request; GET, POST, PUT, PATCH, or DELETE, and returns a Promise to the caller. Hey, sounds like the Tapestry code! š
I have it on my todo list to learn JavaScript. It’s been there for years and years because I knew I’d need it at some point. I really need it now. I can’t see React Native projects going away for the WillowTree team. They’re a very popular way for our clients to get cross platform code and get an iOS and Android app out the door simultaneously without having to spend time, money, and effort on two completely separate code bases.
Over the course of our integration work I’ve done a smidge of TypeScript code to allow other TypeScript devs on the team to make calls into the APIs we’ve exposed in the native application.
It’s been fun and I see a place for JavaScript/TypeScript in my native development world.
As for what Iconfactory is doing, I think it’s a much better version of what React Native does. It gives them the best of both worlds. A beautiful, hand crafted, fully native UI, that gives JavaScript developers the ability to extend the app. That’s a lovely thing. ā¤ļø
I 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. š
Iām on a project at work using React Native but not in the typical way, which is to say it didnāt start as a React Native project. Itās an exiting app out in the world actively uses by, Iād imagine, tens and tens of thousands of people. Perhaps hundreds of thousands. Bottom line is, itās a frontline app and is important to our client.
Our client has a large team of React developers and a team dedicated to the design and development of reusable React components for the company. Theyāve done an amazing job creating a platform for their devs to build on and would like to have those devs build mobile experiences as well. I canāt blame them. Theyāre very good at it.
They currently have native iOS and Android apps that are almost ten years old and use various frameworks and technologies. Your typical legacy codebase. Thatās nothing new or frightening. All code develops its rough patches over time and as time goes by we go in and turn the soil so to speak. We replace outdated frameworks developed out of necessity with new platform supplied frameworks and our code is more robust and easier to read and maintain, especially for developers coming right out of school.
With all that in mind hereās what our client is looking to do. We are building new features in React Native and leveraging much of the internal native code to fetch network data, build models, and return that data to React Native code. The API or Interface to the native code is well defined and implemented on iOS and Android. The React Native team code is the same for both platforms. Iām part of the platform team integrating React Native into the existing app and providing the API/Interfaces to the React Native developers.
Like I said, this is a non-standard way of doing this but itās been done by others with stories of success and failure. I believe we are on track to have a story of success. Itās not going to be free of bumps along the way but weāre making really great progress and I believe we will hit a steady working state as soon as next week. That means the foundation to strap up and host React Native code is in place and working as expected. Now itās time to build out the API more thoroughly, driven by our React Native developers need for specific data or business logic. Itās a single app, purpose built, API. The idea is to hide any ugly code on the native side and keep the API to the app clean for the React Native developers.
One of the extremely cool things about how weāre approaching it is how our React Native devs work.
They work inside of a separate application while theyāre developing new views and logic. It allows them to move more quickly and not have to rely on the native apps to update before writing their code. It also means they donāt have to worry about keeping the existing native app building on their computers. That can be a headache, I wish it werenāt, but it can be. More on that in a bit.
How does it work? Well, when you create a brand new React Native project you run some tool to generate the project for you. It creates the scaffolding for your React Native code as well and iOS and Android host app projects complete with the frameworks necessary to build the native host apps. On iOS uses CocoaPods. I donāt know what Android used.
That allows the React Native Developers to run ahead of the platform native developers to build their UIās.
We negotiate with the React Native development team to define an API signature for the native apps. They build a mock version of that in their development host app that matches the agreed upon signature and go about coding.
We build out the platform side to do the true implementation. When we have something to test we pull over a packaged version of the React Native code and give it a spin. If there are problems we work directly with the React Native developers to figure it out. Once itās ironed out itās wash, rinse, repeat. We currently have a feature built by WillowTree and one built by our client working in the development host and in the existing native applications.
Itās pretty darned magical when it works! š§š¼āāļø
Getting the React Native frameworks and nuanced build settings and scripts in place has been a bit of a struggle but I think we may finally have all that figured out. But it is painful for a native developer whoās used to opening Xcode, loading the project, hitting build, and it runs. Sure, we may have to use CocoaPods to get started, but thatās rare now since Apple introduced Swift Package Manager, or SPM.
SPM is integrated into Xcode and works really well. Iāve never had an issue with it, knock wood, and went through Stream a couple years back and replaced my use of Carthage and CocoaPods with SPM. Itās been glorious.
This option is, unfortunately, not available to React Native projects AFAIK. Thatās fine. CocoaPods works and is familiar.
The one really ugly bit, at least to me, is the requirement to use npm. I know web devs are accustomed to using it but it feels really strange and fragile to use these two package managers to be able to build and run an app that includes React Native. I know Iāve run into random issues I canāt explain when node packages change or are added but thatās just me being a big whiny cry baby developer. I understand it well enough to be dangerous but I donāt currently have that deep knowledge I like to have. Iām learning new stuff everyday but Iāve only scratched the surface.
I can see why companies are making this choice, especially companies with an army of React developers. It makes complete sense for them to build great UI with their existing developers. And, yes, you can build a great iOS UI with React Native. Iāve witnessed it first hand. If you didnāt know a view was React Native you wouldnāt know the difference in this app. Itās seamless. Itās great in that way.
but oof ā it still feels like Iām working with a business decision, rather than a sharp tool.
I think Angeloās quote above is a nice TL;DR for me. On the downside I really dislike the tooling. It feels so arcane. Iād love to see something integrated into the Xcode UI for package management and project settings. Thatās probably asking a bit much but Iād rather have some do an amazing job of all this scaffolding so I can just hit the build button to run the app.
All that said, itās still worth using. šš¼
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.
I 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. š
Good morning from Charlottesville, Virginia! āļø
Weāve been home for a week now and itās been really nice to sleep in our own bed!
Now, if we could get Cocoa to sleep past 5:30AM Iād be thrilled. š
I hope you have a nice cup of coffee or tea ready and I hope you enjoy the links.
Wagner chief Yevgeny Prigozhin has refused to surrender, and called Vladimir Putin “deeply mistaken” following the Russian president’s address describing his actions as betrayal.
I heard about this as I was crawling in bed. I hope the Wagner Group is able to destabilize Putin and end the war in Ukraine.
Probably too much to hope for. š
I wanted to address Reddit’s continued, provably false statements, as well as answer some questions from the community, and also just say thanks.
I love this openness from Christian Selig. If folks donāt know, Christian tapes his conversations with Reddit folks. Itās been very interesting to read bit the transcript heās shared. Itās clear they have lied.
I just wish Christian had posted this all to a weblog so it would have a more permanent home. Who knows whatās going to happen with his subreddit.
After a bruising week of protests and locked-down forums, things started to get back to normal Tuesday on Reddit, as ā oh wait, whatās this?
Subreddit moderators are doing all they can to screw things up on Reddit. I applaud their effort.
If you want to watch pop culture eat itself, go see The Flash, a movie that starts out as a sprightly superhero adventure, then dissolves into a self-referential requiem for the DC Universe.
Iām torn about seeing this movie given all the hubbub surrounding Ezra Miller but I really want to see Michael Keatons older Batman!
These days, distributed version control systems like Git have “won the war” of version control. One of the arguments I used to hear when DVCSs were gaining traction was around how easy it is to branch and merge with a VCS like Git. However, I’m a big fan of Trunk-Based Development (TBD), and I want to tell you why.
Iād imagine most folks I work with today have no clue how we used to work. I didnāt use git for version control full time until around 2014 Iād imagine? I found it terribly frustrating to work with at first but know Iām fine with it.
Anywho, up until 2014 Iād worked with so many different version control systems. Iād imagine I worked with CVS the longest and we had one main branch ā trunk ā and everyone committed directly to it. Yes, breaking the build was definitely frowned upon so you had to be very careful about your commits!
When North Carolina Gov. Patrick McCrory signed House Bill 2 into law, I wonder if he was thinking long-range about what the result might be. I canāt see him and his staff wondering out loud if their thick-skulled, cracker logic might result in Bruce Springsteen not only canceling his upcoming show in Greensboro, depriving the state of revenue and its residents of a Springsteen concert, but inspiring Mr. Boss to issue a press release that more people have read than will ever peruse House Bill 2.
Henry Rollins seems to be a really great dude. Part punk, part philosopher, always interesting to listen to or read.
Seven years after the Brexit referendum, the proportion of Britons who want to rejoin the EU has climbed to its highest levels since 2016, according to a new survey.
I mean, duh! The British version of MAGA didnāt work out so well. Itās been terrible for so many. I hope they rejoin the EU.
The NASCAR Next Gen Garage 56 Chevrolet Camaro ZL1 was a hit from day one in Le Mans, among fans, media and even other competitors. And it was fast on track, consistently putting down lap times that bettered cars in the GT class. The car ran near the top of the GT field for more than 20 hours until a drive line issue sidelined the team for more than an hour. Overall, the car was running at the finish, completed 285 laps on the 8.4-mile circuit and finished 39th in the 62-car field.
This car is an absolute beast and looked out of place at Le Mans. It would also look out of place on a NASCAR track. It is a beautiful car with some really excellent engineering. Oh, yeah, and it is super fast! Good old American V8 horsepower under the hood.
I kind of wish Iād been more of a car guy when I was younger. My Dad certainly is and has built some beautiful cars in his time. His ā37 Chevy Coup Street Rod is stunning and he used to drag race a 454 powered ā51 Anglia.
I had the opportunity to learn a lot but didnāt. If I could do it today Iād love to be a mechanic or engineer for a NASCAR, IndyCar, or F1 team. Iād love to specialize in engines. I do find them fascinating and would love to rebuild one again. I rebuilt a Chevy small block in High School my senior year. Yeah, I took auto shop because I wanted to do something āeasy.ā š
After 21 years, Cadillac Racing marked our return to the iconic 24 Hours of Le Mans on June 10ā11 with our highest finish ever in front of a record audience of 325,000 spectators. Our No. 2 V-Series.R led laps for the first time in Cadillac history and finished on the podium in 3rd, with the No. 3 just behind in 4th, and the No. 311 fighting back for 10th in class.
Thereās an article on Jalopnik that includes a video of one of these cars doing a bump start and it sounds mean. It instantly made me think of the Batmobile for some reason.
Now, letās get more American manufacturers back in NASCAR. Cadillac would be a super interesting entry! I think Dodge is an obvious entry for NASCAR Cup, Xfinity, and Truck series given their history of legendary cars like the Challenger and their RAM trucks.
Cadillac would be super cool to see in NASCAR Cup racing but it may be too lowbrow for them? š¤£
Renting an RV and embarking on a road trip across America can seem like more of a fantasy trip than a real thing you actually do. But you can truly make it a reality. And if you do, it can turn into a thrilling and liberating experience that will leave you with unforgettable memories. Hereās why you should take the plunge.
This is something I dream about all the time but I canāt quite get Kim convinced we need to sell everything and go all in on the RV lifestyle.
As a compromise weād like to acquire a smaller RV and do some two week to one month excursions to see if we like it. It would also be great for week long camping trips with the entire family.
Maybe someday itāll be a reality? š¤š¼
When former NBC Universal executive Linda Yaccarino was named Twitter’s next CEO last month, advertisers breathed a sigh of relief.
I donāt expect Ms. Yaccarino to last very long at Twitter. I think my original quesstimate was six months but I could see it lasting as long as a year.
Musk is too much of a control freak. The kind of boss Iād hate working for.
The best piece of advice I ever got from my VP of Engineering and CTO at Pelco was āYou have to convince people your vision is the right way to go so they follow. You wonāt get their best work if youāre a tyrant.ā It was something like that. Basically be a leader, not a bully.
This blog post is meant to be read in order. Later answers are shorter because they rely on the information presented in the earlier answers.
This is a really nice piece if youāre following along with the TFG Top Secret documents prosecution. Dude is such a knucklehead and honestly believes he has magical powers to declassify things with his mind. Dumbass.
The engineers reminded him of their commutes. The working parents reminded him of school pickup times. Mr. Medina replied with arguments he has delineated so often that they have come to feel like personal mantras: Being near each other makes the work better. Mr. Medina approached three years of mushy remote-plus-office work as an experiment. His takeaway was that ideas bubble up more organically in the clamor of the office.
I believe with all my heart CEOās like this are real control freaks and must have the adoration of their people surrounding them at all times. I can have these ah-ha moments, Slack someone, and fire up a zoom call to have the same conversations. Itās just not face to face in a building I have to commute to.
If our company demanded everyone come to the office, of course Iād comply, but I really donāt believe itās necessary.
Just my horrible opinion.
A federal court heard both sides during a trial where trans youth, their parents, and their doctors challenged a law banning gender affirming care in Arkansas. The court found that the law violated the right to due process and to equal treatment under the constitution, and ordered the law struck down because Arkansas failed to demonstrate a compelling state interest justifying the unequal treatment.
We really need the courts to continue overturning these idiotic and dangerous laws.
You cannot force people to be someone they are not and denying them healthcare because theyāre different than you is barbaric.
Apparently Metaās Project 92 is going to federate with a limited set of Mastodon instances, pay them, and allow them to display Meta ads in exchange for a cut.
Embrace and extend. Amirite?
Letās see how this plays out.

As The Verge reports(Opens in a new window), a Meta executive demonstrated a preview version of the Twitter alternative, which is known internally as “Project 92,” at a company-wide meeting this week. When it arrives, the final name is expected to be Threads, a name we first heard about in 2021 as a way for Facebook users to post connected messages.
There is much consternation on Mastodon around Project 92. Itās rumored to support the Mastodon API and folks are not happy about it. Why? I have no idea.
Facebook has kind of skirted around the edge of blogging for a long time and Iām surprised they never turned Pages into a blogging platform. All they need is the ability to add titles, support for bold and italic, images, and links. That should cover 99% of post needs.
Add API support for getting, creating, updating, and deleting those posts and you could have a really great blogging solution.
Good morning from Myrtle Beach, South Carolina! āļø
Kim and I rented a place for a week to share with our kids, grandkids, and our dogs! We arrived around 7PM Friday evening, got setup, had some pizza, and pretty much passed out.
We havenāt had time to do any real recon of the are but I did manage to find a decent pizza joint and a Food Lion so we could pick up odds and ends to stock the fridge for the week.
From Friday to Tuesday itās all about our kids and grandkids. Tuesday forward itāll just be Kim and I and our oldest grandchild until next Saturday.
I was hoping to get some extra bunk time but that aināt gonna happen with a puppy who thinks 5:30AM is play time. š¤£
Weāre going to have a great time at the beach and whatever else we can drum up.
Enjoy the links.
But even just a small taste of VisionOS made me feel confident that it is going to be the next major platform for Apple and Apple developers, alongside MacOS and iOS/iPadOS.
I wasnāt too excited about any new AR/VR headset Apple was set to release, then I saw it in the keynote.
At first I was disappointed because they were showing someone in an office using it to replace their monitor(s) and thatās kind of boring.
The we see someone celebrating a childās birthday wearing the headset. Really? What a complete douchebag. No, seriously, thatās a really bad move.
But, when I saw them demonstrate watching movies with it, I was excited! That is what Iād use it for!
Am I spending $3,500 anytime soon on one? Hell no! Itās still to early for me, especially at that price. Itās hard to justify it.
Donald Trump himself broke the news this evening that heās been indictedāmaking him the first former president to ever be charged with a federal crime.
King ding dong himself is finally being indicted for his retention of government documents. Itās not about him accidentally having a few mixed in with his other papers, itās about boxes of them, not returning them on request, and lying that he did return them.
The right like to say āWhat about Biden and Pence?ā Indeed, what about them. They self reported having documents and turned them over right away.
TFG is a real garbage human wrapped in a suit. My hope is, at a minimum, heās banned from running for any federal office ever again.
Easy question ā hard answer, how to I convert a hex string to hex byte string in C?
Go along for the ride. I havenāt taken the time to think through how to solve this and I only have nits to pick with Colinās solution.
Richmondās post-graduation mass shooting reflects Americaās gun violence epidemic
This is so sickening. The shooting is absolutely horrific but to do it at a graduation? Itās heartbreaking how callous our nation has become.š
This document is the reference guide describing how to mix Swift and C++
Since this was done as an official way to use C++ from Swift there was all kinds of thought out into safety. Thatās fine, but if you have a great hunk of C++ that has been thoroughly tested and you feel good about it you probably donāt need the training wheels provided by this support.
Just wrap your C++ in a thin layer of Objective-C++ and call it from your Swift code without penalty. š¤·š»āāļø
Goodbye, CNN’s Chris Licht. But what’s the lesson?
I know he screwed the pooch with that TFG interview thing but man, that was pretty quick.
The number of 2019 Mac Pros sold cannot be huge, but the new oneās numbers are going to be even smaller. As a Mac Pro fan that worries me. Yes, there are users who are reliant on PCI solutions and Iām sure those folks will upgrade to this new machine at some point.
Who is this computer for? Thatās the question on most folks minds. When I heard it wasnāt nearly as expandable as the 2019 version it made me wonder why they bothered? Beyond the awesome SOC it doesnāt have more to offer than its 2019 counterpart.
Then again, Iāve never been the target of this computer. Iām still using a 2019 MacBook Pro and Iām fine with it. Heck, I have a brand new M2 based MacBook Pro sitting in a box waiting for me to set it up. š¤£
But as Adams scanned the bustling crowd of King Penguins, elephant seals, and Antarctic fur seals, he spotted something bizarre in the distance.
Go check out the post. This bird is gorgeous and I want it.
Could The NASCAR Garage 56 Camaro Beat Every GTE Car At Le Mans?
Iād love to watch this all the way through but thatās not gonna happen. I hope NASCAR has partnered with someone to do a full documentary on it. The process from concept to reality to running the race. I hope it makes it the full 24 hours. That alone would be a huge victory.

Good morning!
I couldnāt wait to get started this morning. I got my pot started and sat down to put this post together. When the coffee finished I poured my first cup. I almost let that cup get too cool to drink. The shame! Iāve since remedied the situation and have resolved to not let it happen with my second cup! āļø
Enjoy the linkage!
Espresso is basically magic. The more I learn about what goes on inside the black box that is the portafilter, the more certain I am of it.
Yes, pulling a really great shot feels like magic. When Haileigh ā our oldest daughter ā was a barista at a very snobby coffee shop sheād spend the morning adjusting the grinder. That would result in a half to one pound of coffee being ground just to get it properly set up. Was the espresso great? It certainly was. šŖ
Now Disney is cancelling plans to build a massive nearly $1 billion office complex in Orlando, costing the state more than 2,000 six-figure jobs.
I would love to see Bob Iger move jobs out of Florida. The state has gone full fascist under DeSantis and isnāt a safe place for LGBTQ+, black and brown folks, women, and children. Their educational system is teaching them to become white supremacists and intolerant and even their institutions of higher education are under attack.
If you can, get out.
TLDR: Render Disneyās Moana scene in less than 10.000 lines of Swift code.
Man, I love the field I work in and the nerds who comprise it. I say that with the utmost respect.
Monday morning, American democracy became more brittle, at least in Florida, where Governor Ron DeSantis signed a bill that prohibits the stateās public colleges and universities from continuing their diversity, equity, and inclusion (DEI) programs.
Ah, yes, more of Floridaās fascist Governor making Florida a worse place to live. It makes me wonder if heās setting it up to secede from our Union, kind of like Texas? Itās like the South is trying itās damndest to rise again. We canāt let that happen.
Ok, it didnāt exactly go down like that, and no, it wasnāt ātake this job and shove itā either, but I actually did it. I left a great job that I enjoyed, and now Iām officially self employed. What hell am I thinking!?
Matt is going Indie and Iām more than a bit jealous! I wish I could pull it off. Iām pulling for you to be wildly successful Matt! šš¼
Iād like the record to show that I resisted getting AirPods for a long time.Ā
This is a really great piece by everybodyās favorite swole woman, Casey Johnston.
Her post is all about her quest to recover her lost ā and subsequently stolen ā AirPods. Go read the piece, itās really good.
Five years later Iām still as happy with this decision as I was then. I post to my site, and it gets cross-posted to social media. Today that means Mastodon. Eventually it may mean something else. But no matter what, steveroy.ca will always be the source of truth.
Making your weblog the hub of your social media presence is smart and the proper way to own your content. Itās why I started posting more short content without titles here. While I canāt auto post my content to Mastodon ā I could but Micro.blog has some limitations ā I do re-post most of my short posts there.
Actor and trans icon Elliot Page has opened up about how gender-affirming care changed his life in a moving Instagram post.
Iāve read stories like this time and again. As soon as a trans persons begins or completes their transition they become a much happier person. Iām happy for Elliot and wish him many long, happy, and fruitful years ahead.
The Compute team at Netflix is charged with managing all AWS and containerized workloads at Netflix, including autoscaling, deployment of containers, issue remediation, etc. As part of this team, I work on fixing strange things that users report.
The modern day hero of computing is the DevOps engineer. Theyāre a mix of geeky computer tech and software developer all rolled into one extremely busy package.
If youāre a Unix/Linux geek Iād imagine youāll enjoy the piece.
New cars are getting too expensive, but the value from some of the old standards from Honda, Toyota and Hyundai is still there
Yep, cars are crazy expensive. Yep, good inexpensive cars are impossible to find. Yep, there are good used cars on the market.
Your mileage may vary. š
That day I decided to write my own pastebin service. And of course, I was going to write it in Rust.
Neat little piece about one persons quest to make their own thing. All in Rust of course. Because why not?
The offering of āthoughts and prayersā after each murderous mass shooting has become a nauseating refrain. You know the drill: The speakers/tweeters utter this blood-stained phrase (or a close variant) like robots.
Thoughts and prayers is the GOP way to get evangelical Christian support. Thatās all it is, a ploy for votes, an an easy one at that. Just drop a few simple words on social media and gain support for your Godliness. Disgusting, the whole lot. š¤¬
I suspect Jesus would support an end to the violence.
Activision Blizzard’s mandatory return-to-office policy is causing an unnecessary loss of talent, to the point where it could affect development of major titles like World of Warcraft and Diablo 4, according to some Blizzard developers.
Return to office has been a real hot button topic all over the country. Many jobs, like mine, donāt really require me to drive to the office.
Now, having said that, a lot of folks NEED and LOVE the interaction they have in person in an office. Our CEO is a prime example. He believes in person work is the best way to work. Thatās all fine and good. Just remember others of us find it distracting, especially in open space offices.
I work in an all remote team at WillowTree but I think about going into the office once in a while for a little human interaction. š
One other note. Iād probably find it more tolerable since becoming an Engineering Director because I spend most of my day interacting with other folks. But developer Rob loves quiet and an open floor plan office was horrible for that. I can control my home workspace. At the office Iād have to find a place to hide to do meaningful work as a developer.
I like to tease my JavaScript friends when I get the chance. Most of them own up to the fact itās a terrible language.š
Itās the language of the web. No way around it at the moment. Some other thing will come along to replace it. I suppose WebAssembly could eventually be ubiquitous enough to allow us to code in other languages daily but it seems JavaScript is here to stay.

Ok, got a new app idea.
Micro Manager!
It does everything for Micro.blog but posting. Allows you to manage your tags, photo uploads, and whatever else you wish you could do from the native iOS and Mac client apps.