The rise of Bolto

Issue #369.February 20, 2025.2 Minute read.
Bytes

Today’s issue: CSS features that make me a good person, (heart)breaking changes, and Lil Jon & The East Side Boyz.

Welcome to #3-6-9, damn you fine.


Eyeballs logo

The Main Thing

Balto the dog looking into the distance

Mfw I ship an app to the App Store without ever looking at the code

The rise of Bolto

No, that’s not the name of a new, AI-powered robot dog that transports medicine to sick kids in Alaska – it’s the nickname I just made up for the new Bolt + Expo integration that launched last week.

It might not technically “save children’s lives,” but it does let you use AI to build and ship cross-platform mobile apps without writing any code. So it’s still a hero to me.

Not long ago, building and shipping a functional mobile app on Android and iOS used to take full dev teams months/years to accomplish. You had to set up complex dev environments, write a bunch of platform-specific code, and pretend to be brave in front of your coworkers when the app store denied your submission for no reason.

Expo helped fix a lot of that by providing navigation, device APIs, and other building blocks to build and ship cross-platform apps from a single codebase – but you still had to actually write the code yourself.

That’s where Bolt comes in. Here’s what building a cross-platform mobile app looks like now:

  • Describe your app – Go to bolt.new, choose the Expo starter template, and type what you want (“Bumble for strategy-based board game enthusiasts”). It’ll give you an MVP in seconds.

  • Instant cross-platform preview – Whether you’re on Mac, Windows, or Linux, you can instantly generate mobile app code and preview it in real time for any platform by using Expo Go.

  • Easy export – You can keep iterating by prompting Bolt, or export the code locally to work on it manually.

  • Supabase integration – Bolt lets you easily connect to a Supabase backend, so you can integrate auth, real-time databases, and more.

  • Ship it – Deploy the app directly to iOS and Android from the cloud, without worrying about manual builds or signing certificates.

Bottom Line: If you could go back to 2017 and tell mobile devs how people would be building apps in The Year of our Bolt 2025, they would probably… avoid making eye contact with you and go back to battling Android Studio. But what a time to be alive.

        

QA Wolf logo

Our Friends
(With Benefits)

James Corden in the movie, Cats

Me pretending not to see the 87 failing tests

Make mobile testing simple

If you thought testing your web app was annoying, I double-dog dare you to try testing a mobile app.

You have to worry about thousands of different device configurations and edge cases – and your testing infrastructure fights you every step of the way.

That’s why so many teams just use QA Wolf. They get you:

  • Comprehensive feature coverage – They build tests to cover every gesture, sensor, camera function, UI/UX element, security check, and performance metric.

  • Unlimited parallel runs – So you can execute thousands of tests in minutes without needing a device farm, Grid, or TestNG.

  • Hassle-free maintenance – They investigate test failures, deal with flakes, and continuously update your test suite as your app evolves.

Schedule a personalized demo to learn more. They work on React Native, Flutter, and Native apps – and they save teams 9 hours per engineer per week.


Spot the Bug logo

Spot the Bug

Sponsored by Apryse

Their new PDF data extraction SDK enables you to programmatically extract text, tables, and form data from invoices, purchase orders, reports, and other PDF documents.

class ChatApp {
  constructor() {
    this.keywordRegex = /hello|hi|hey/g;
  }

  receiveMessage(message) {
    if (this.keywordRegex.test(message)) {
      this.sendGreeting();
    }
  }

  sendGreeting() {
    console.log("ChatApp: Hello, how can I assist you today?");
  }
}

let chatApp = new ChatApp();

chatApp.receiveMessage("hi, how are you?");
chatApp.receiveMessage("hello, can you help me?");

Cool Bits logo

Cool Bits

  1. The team that created Gatsby is back again with Mastra – a TypeScript agent framework that requires a disturbing lack of plugins so far.

  2. React Native 0.78 just came out and Bolt tells me that it’s been wonderful so far.

  3. Meticulous generates and maintains an exhaustive suite of e2e UI tests that cover every edge case of your web app. Relied on by Dropbox, Lattice, Bilt Rewards and hundreds of engineering organizations. Check it out. [sponsored]

  4. Jaz wrote about how Bluesky’s lossy timelines are an example of how “imperfect systems can be good.”

  5. Did you know that CSS transform and individual transform properties are additive? Neither did I. But now we both do, and that’s why we’re better than other people.

  6. hodlbod wrote an article called, Svelte 5 is not JavaScript about the struggles he’s faced upgrading his Svelte web app. Turns out, they don’t call them breaking changes for nothing.

  7. Speaking of breaking changes, React Router v7.2 just came out with type-safe hrefs and unstable support for the Vite Environment API.

  8. Amir Shalev is a senior designer who wrote about How he bridges the gap between design and development by using Bit’s modular components and real-time previews. [sponsored]

  9. Bramus from the Chrome team wrote about an upcoming CSS feature in his article, CSS @function + CSS if() = 🤯. I knew I should’ve paid more attention in Ms. Kim’s Algebra 2 class.

  10. Miriam Suzanne wrote about reimagining fluid typography.


Spot the Bug logo

Spot the Bug: Solution

Sponsored by Apryse

chatApp.receiveMessage("hi, how are you?"); // "ChatApp: Hello, how can I assist you today?"
chatApp.receiveMessage("hello, can you help me?"); // Logs nothing

In JavaScript, RegExp objects with the g (global) flag retain state between matches due to the lastIndex property, which can lead to unexpected results when reused across different inputs.

The solution is to create a fresh RegExp object for each incoming message, ensuring proper recognition and response to all greetings.

class ChatApp {
  receiveMessage(message) {
    let keywordRegex = /hello|hi|hey/g;
    if (keywordRegex.test(message)) {
      this.sendGreeting();
    }
  }

  sendGreeting() {
    console.log("ChatApp: Hello, how can I assist you today?");
  }
}

let chatApp = new ChatApp();

chatApp.receiveMessage("hi, how are you?"); // "ChatApp: Hello, how can I assist you today?"
chatApp.receiveMessage("hello, can you help me?"); // "ChatApp: Hello, how can I assist you today?"