Jamon Profile picture
Jun 9 15 tweets 4 min read Read on X
Apple today took a shot at React Native and other cross-platform frameworks.

I have thoughts.

First, the quote in question, from their keynote (around the 40 minute mark):

"Some other frameworks promise the ability to write code once for Android and iOS.

And that may sound good, but by the time you've written custom code to adapt each platform's conventions, connected to hardware with platform-specific APIs, implemented accessibility, and then filled in functionality gaps by adding additional logic and relying on a host of plugins, you've likely written a lot more code than you'd planned on.

And you are still left with an app that could be slower, look out of place, and can't directly take advantage of features like Live Activities and widgets.

Apple's native frameworks are uncompromisingly focused on helping you build the best apps."
First, their direct claims:

That you will write more code than you'd planned on.

First off -- this is cleverly worded. Notice they don't say "...you will write more code than you would have written for two separate apps."

This statement, honestly, could apply to any software project. I've never encountered a coding project where the end result was "wow, we wrote way less code than we thought we would" ... this is an evergreen claim.
Secondly, the specifics:

- custom code to adapt each platform's conventions

This is honestly pretty rare. Mostly, it just works, because React Native uses the platform's primitives. Less than 1% of the code in any of the many React Native / Expo project we've worked on is dedicated to platform-specific UI changes. It just isn't an issue in practice.
- connected to hardware for platform-specific APIs

This is also rare, for most apps. And when this is necessary, you just ... drop into native code and write it how you would if it were a native app, and add a little bit of boilerplate to hook it up so React Native can orchestrate it.

This is a React Native strength, not a weakness.
- accessibility

Probably the most valid complaint, but it can be done in React Native and done well.

Also: some of the worst accessibility experiences I've had were on native apps in the iOS app store.

What matters is a developer actually caring about accessibility.
- relying on a host of plugins

Valid observation, but these are overwhelmingly open source.

What do you do when an Apple API has a bug? Report and wait. You have no ability to fix it yourself.
Second direct claim:

That your app could be slower

@jmeistrich went and put time into his Legend List and made it incredibly fast, using just JavaScript. The speed limit isn't React Native.

Just like accessibility, it just takes a developer who cares about performance.
The new architecture in particular opens up so many more options for performance, as well.

Sure, your app could be slower. It could also be faster, faster to market, take less time, smaller team, cost less, and allow you to build a business around it.
Third direct claim:

That your app might look out of place

Google doesn't think so. They named an Expo / React Native app the best app of 2024.

Not to mention the many times Expo / RN apps have topped the App Store for many categories.

Actual users like (well-built) React Native apps. And maybe we should listen to...actual users.

Fourth direct claim:

That your app can't directly take advantage of features like Live Activities and widgets

"Directly" is doing the heavy lifting here. But, as @tarikpnrc has shown more than once, it is not difficult.

@tarikpnrc Tarik even just dropped a PencilKit Expo Module:

I get that Apple doesn't want it to be easier for app developers to develop for both iOS and Android.

But it's getting old.

Apple has made a ton of money off of React Native apps and it's enabled countless businesses. It's time that they give it the respect it deserves.
Apologies, it's the Platforms State of the Union, not the WWDC keynote. Link here:

• • •

Missing some Tweet in this thread? You can try to force a refresh
 

Keep Current with Jamon

Jamon Profile picture

Stay in touch and get notified when new unrolls are available from this author!

Read all threads

This Thread may be Removed Anytime!

PDF

Twitter may remove this content at anytime! Save it as PDF for later use!

Try unrolling a thread yourself!

how to unroll video
  1. Follow @ThreadReaderApp to mention us!

  2. From a Twitter thread mention us with a keyword "unroll"
@threadreaderapp unroll

Practice here first or read more on our help page!

More from @jamonholmgren

Sep 22, 2024
Bun wildly simplifies my stack.

I’m rebuilding an internal web app that we’ve had since 2016. So far, I have a grand total of 1 npm runtime dependencies (jwt-token).

Our previous version of this tool, using Next, had 826 (!!!) NPM dependencies.

I also have zero build steps. Just ship the files directly to the server.

I’m using:

- Bun as a JS runtime
- Bun as a package manager
- Bun.serve as a webserver
- Bun’s websocket server for realtime
- TypeScript on server side
- JSDoc on the client side
- REMEMBER: no build steps!
- not even TypeScript in the deps
- HTML via template strings
- CSS
- Hosted on DigitalOcean droplet
- In-memory state (just a JS object)
- JSON file for persistence
- JS’s setInterval for scheduled tasks
- git to deploy
- Cursor to generate and edit code

I’ll talk more about each of these below.Image
- Bun as a runtime

Bun replaces Node, of course, and brings a ton of speed as a runtime.

I just install Bun and then run it

bun run ./src/index.ts

This is also how I run it on the server.
- Bun as a package manager

This is how most people use Bun.

bun install

It’s lightning fast, but also, I only have 1 runtime dep (and a few dev dependencies, which are all type related like @types/bun), so of course it’s fast.
Read 35 tweets
Feb 12, 2024
One time I pulled down a new client’s repo and found this commit from the previous dev
Image
OK by popular demand, I found more details.

First -- here's the document . 😅

Secondly, now that I know the client name, I for sure know why this dev got screwed. I have a lot of stories about Don. README-ASSHOLES.md
Image
I built their original Rails website in 2012. It was an ecommerce website and we built it from scratch with an admin panel and everything.

I think all-in, it was about a $15-20k project, and I did get paid by them.
Read 12 tweets
Jul 15, 2023
My experience raising 4 kids, in a thread:

* First years are a lot of physical work, but I can still remember that freshly bathed baby smell as they lay sleeping on my chest. One of my fondest memories and times of my life.

(She’s now 15!) https://t.co/LeCPjJUShH
Image
* Elementary years are pretty good. Some running around but we had more time where they were out at school and they also are learning to do more themselves. The introduction of more of a more rigid schedule was a big adjustment, and we had to plan trips more. Image
* Middle school years are harder because it’s a transition for them *and* for us — them to the complex social dynamics, and us to being a different kind of parent who can help them navigate that rather than wiping their butts or carrying them around. Also developing more complex… https://t.co/xRBXyI8RZNtwitter.com/i/web/status/1…
Image
Read 9 tweets
Apr 15, 2023
Want to know how easy it is to grab API keys out of a compiled iPhone app?

Buckle up. 👇
DISCLAIMER: This is for security research only. Responsibly disclose vulnerabilities you find to the relevant developers! I MEAN THIS. Don't be a tool.
First, install the open source ipatool.

brew tap majd/repo
brew install ipatool Screenshot of downloading i...
Read 15 tweets
Apr 14, 2023
I once again am asking mobile devs to not ship their API keys in their app bundles.

(No, compiling it into native code won’t make it any more secure. I could extract it from native code in 5 minutes, and that’s not an exaggeration.)

(No, putting it in react-native-env etc won’t… twitter.com/i/web/status/1…
How do you store the API key, then?

Same way you would in a website. Store it server-side, have the app authenticate the user, send them a user-specific token, and then they can use that to ask your server to ask the API something for them.

Only thing exposed is that specific… twitter.com/i/web/status/1…
Ironically, I had to implement this server-side handling of secure tokens a couple times today; haven't done that in months.
Read 7 tweets
Aug 11, 2022
Leaving aside solutions like React Query, I'll talk a bit more about React state management libraries and why I dislike selectors. I'll take a few popular state management libraries and contrast them to MobX (or MST).
So let's do a tiny component that shows Bears, Beets, and Battlestar Galacticas. It'll show the bears and beets, but not the BSGs, so we can measure if the component is rerendering when it shouldn't. Image
Caveat: I'm not an expert in all of these libraries, so if you know a better, more idiomatic way to do this, please let me know, and I'll adjust accordingly.
Read 28 tweets

Did Thread Reader help you today?

Support us! We are indie developers!


This site is made by just two indie developers on a laptop doing marketing, support and development! Read more about the story.

Become a Premium Member ($3/month or $30/year) and get exclusive features!

Become Premium

Don't want to be a Premium member but still want to support us?

Make a small donation by buying us coffee ($5) or help with server cost ($10)

Donate via Paypal

Or Donate anonymously using crypto!

Ethereum

0xfe58350B80634f60Fa6Dc149a72b4DFbc17D341E copy

Bitcoin

3ATGMxNzCUFzxpMCHL5sWSt4DVtS8UqXpi copy

Thank you for your support!

Follow Us!

:(