YouTube2Text

Jay Meistrich – How to Build the Fastest Apps: Break the Rules | App.js Conf 2026 — Transcript

by Software Mansion · 3,329 words · 588 segments · language en · Watch on YouTube

Full transcript

  1. 0:15Hello React Native developers.
  2. 0:18Uh
  3. 0:19Imagine having to follow William. Uh
  4. 0:21that was really cool. So here we go. Uh
  5. 0:24last year's App JS was my first
  6. 0:26conference talk ever and it was so much
  7. 0:28fun. It's great to be back here.
  8. 0:31That talk was about Legend List which
  9. 0:33was version 1.0.14 at the time.
  10. 0:37Since then there's been almost 1,400
  11. 0:38commits and it has over a million
  12. 0:40downloads per month now which is crazy.
  13. 0:43Uh
  14. 0:45>> [applause]
  15. 0:49>> Since then it now supports both React
  16. 0:51Native and React DOM. So it's now the
  17. 0:53fastest list library on both mobile and
  18. 0:55web.
  19. 0:56It's been super optimized for chat apps
  20. 0:58and even has this cool anchoring feature
  21. 1:00that can scroll user messages to the top
  22. 1:02built-in.
  23. 1:04And now it's on version 3 beta 56. It's
  24. 1:07even faster than V2. It's more stable.
  25. 1:10Initial scroll is finally perfect. That
  26. 1:12was the hardest thing.
  27. 1:14It supports animated item transition,
  28. 1:16tons of bug fixes. Uh
  29. 1:18I'm really excited about it.
  30. 1:20But it's just too many betas.
  31. 1:22So today I'm changing that.
  32. 1:24It's 3.0 stable.
  33. 1:27>> [applause]
  34. 1:31>> But that's actually not what I'm here to
  35. 1:33talk about today. I'm here to talk about
  36. 1:35performance.
  37. 1:36My plan for this talk was to cover a
  38. 1:38bunch of different performance topics.
  39. 1:41But as I benchmarked them and helped a
  40. 1:42few companies optimize their apps, I
  41. 1:45realized that one of these is so much
  42. 1:46more impactful than everything else and
  43. 1:49most apps are doing it the slow way
  44. 1:50without even knowing it.
  45. 1:52So we're not doing that at all. Today
  46. 1:54we're talking about completely
  47. 1:55rethinking app architecture.
  48. 1:57I want to talk about making apps that
  49. 1:59are really fast, not just fast for React
  50. 2:02Native app, better than native.
  51. 2:05I worked with Fernando Rojo on
  52. 2:07animations and list performance for
  53. 2:08Vercel's V0 iOS app.
  54. 2:11It's a beautiful AI chat app that just
  55. 2:13feels incredible to use.
  56. 2:15When it was announced, people couldn't
  57. 2:17believe it was React Native because it
  58. 2:18felt so good.
  59. 2:20And here's a React Native Mac app I'm
  60. 2:22working on.
  61. 2:23This video is me double-clicking the app
  62. 2:25and it's fully open and ready instantly.
  63. 2:28It opens a 10 MB markdown file in 20
  64. 2:30milliseconds.
  65. 2:32Let's look at that in
  66. 2:34in slow motion at 5% speed to see how
  67. 2:37crazy this is.
  68. 2:38It's actually already fully open,
  69. 2:40parsed, and rendering rich content
  70. 2:42before the window is finished opening.
  71. 2:46For comparison, here's Zed, which is a
  72. 2:48text editor built in Rust, known for
  73. 2:50being very fast.
  74. 2:52It opens the file quickly, but it takes
  75. 2:53over 4 seconds to parse and syntax
  76. 2:56highlight.
  77. 2:57Most other apps I tried either refused
  78. 2:59to open it, froze, or crashed. So, 20
  79. 3:02milliseconds is crazy.
  80. 3:05Uh here's another app I'm making. It's a
  81. 3:07React Native Mac MP3 player.
  82. 3:10It uses less CPU and memory than almost
  83. 3:12every other music app I tried,
  84. 3:14even the native Apple Music.
  85. 3:17These are React Native apps and they're
  86. 3:19faster than almost every other app on my
  87. 3:21computer.
  88. 3:22They're not just fast relative to
  89. 3:23Electron web view apps, they're faster
  90. 3:25than most native apps.
  91. 3:27Because React Native macOS is awesome.
  92. 3:30But mainly, React Native in 2026 is just
  93. 3:33so good.
  94. 3:34>> [snorts]
  95. 3:35>> The game has totally changed. The new
  96. 3:38architecture unlocks big possibilities.
  97. 3:41Hermes keeps getting better. Nitro
  98. 3:42modules are crazy fast. Lists are no
  99. 3:45longer a bottleneck. As we just saw,
  100. 3:47redraw makes incredible graphics easy
  101. 3:49and fast.
  102. 3:51Keyboard controller makes keyboard
  103. 3:52management super smooth. Agent device
  104. 3:55and Argent have cut my debugging time
  105. 3:57down to just so much. It's incredible.
  106. 4:00But still,
  107. 4:01React Native is seen as a compromise.
  108. 4:04And that's just not actually true.
  109. 4:06I've seen and worked on React Native
  110. 4:07apps that are fully best in class,
  111. 4:10sometimes better than native apps. I
  112. 4:11know it's possible.
  113. 4:14But this year, I've also looked at a lot
  114. 4:16of code bases for consulting work and
  115. 4:18helping companies with legacy issues.
  116. 4:20And I saw the same problems spread all
  117. 4:22over the place.
  118. 4:24So, I want us to stop fixing these same
  119. 4:26symptoms over and over.
  120. 4:28And let's try to fix that root cause.
  121. 4:30Because React Native is not slow, the
  122. 4:32way we use it is.
  123. 4:35If you've seen one of my talks, you may
  124. 4:37know my catchphrase, render less less
  125. 4:39often.
  126. 4:40But today, I want to make it spicier.
  127. 4:43Render once.
  128. 4:45But first,
  129. 4:46why is rendering too much a problem?
  130. 4:49Everyone talks about reducing renders,
  131. 4:51but what's the actual impact here?
  132. 4:53So, I did a little benchmark in my music
  133. 4:55app to compare, what if I re-render from
  134. 4:58the top app all the way down versus in a
  135. 5:01medium-sized component in the middle
  136. 5:03down to the bottom?
  137. 5:04Or I just re-render a tiny text element
  138. 5:07leaf node at the bottom.
  139. 5:09When that render passes all the way down
  140. 5:10from the top,
  141. 5:12it has to do a lot more work along the
  142. 5:13way,
  143. 5:14rather than just updating one text
  144. 5:16element. But it's got to be a small
  145. 5:17difference, right? No, it's huge. Even I
  146. 5:22was surprised by this one.
  147. 5:24Moving the update target from the
  148. 5:25top-level app down to the tiniest leaf
  149. 5:27node made a huge difference. It reduced
  150. 5:30the CPU usage by 10 times.
  151. 5:33So, rendering less has a really deep
  152. 5:35impact.
  153. 5:36But React state model is designed around
  154. 5:38re-rendering. Render coordinates
  155. 5:41everything.
  156. 5:42Render passes local state down the tree.
  157. 5:45It updates context consumers. It
  158. 5:46triggers effects. It updates query
  159. 5:48properties. It updates external
  160. 5:50properties. It updates subscriptions.
  161. 5:53And it also updates UI.
  162. 5:55That's a lot of responsibility for what
  163. 5:57we call render.
  164. 5:59And that's where so many normal react
  165. 6:00patterns become a big performance
  166. 6:02problem.
  167. 6:03So let's say we're making a chat app.
  168. 6:06We have a reply feature that changes the
  169. 6:08color of a message. That's cool. We
  170. 6:11render the message to update the color.
  171. 6:14And then you want to also show in the
  172. 6:16composer that you're replying. So now we
  173. 6:19need to access the same state in sibling
  174. 6:21components. So what do you do?
  175. 6:23Say it with me.
  176. 6:25You lift state up.
  177. 6:27All right, nobody did it. Uh
  178. 6:30well, you do what the react docs tell
  179. 6:31you to do. You lift state up.
  180. 6:34As as the docs say, it's one of the most
  181. 6:36common things you'll do writing react
  182. 6:37code.
  183. 6:39So you move the state up to the top of
  184. 6:40the tree and you pass it all the way
  185. 6:42down.
  186. 6:43And it renders every component all the
  187. 6:45way down. It renders the chat screen. It
  188. 6:48renders the composer with all of its
  189. 6:50dialogues and buttons and hooks.
  190. 6:52It renders everything down to the
  191. 6:54message list. And then it renders every
  192. 6:56single chat message. All that one
  193. 6:58message can change a background color.
  194. 7:01And this is just killing performance.
  195. 7:03Now react compiler helps a lot and you
  196. 7:06should absolutely use it.
  197. 7:08But it can't save you from actual
  198. 7:09changes.
  199. 7:11When prop is changed, it has to pass the
  200. 7:13state all the way down. Compiler can't
  201. 7:15help this. So to update a style in one
  202. 7:18message, we have to cascade state's
  203. 7:20changes through the whole screen.
  204. 7:22And let's talk about effects.
  205. 7:24Here's an example from the react docs
  206. 7:27controlling a modal dialogue.
  207. 7:29To open a modal on button press, we
  208. 7:32could just open the modal imperatively.
  209. 7:34But the react pattern is to set state
  210. 7:37which triggers a render, then use an
  211. 7:39effect to open the modal.
  212. 7:40It It actually change what renders, but
  213. 7:42it re-renders anyway.
  214. 7:45Or maybe I want to pause query polling
  215. 7:46temporarily. I have to set a state so
  216. 7:49that I can call the use query hook again
  217. 7:51with different parameters.
  218. 7:53Setting is paused doesn't actually
  219. 7:54change what renders, but we have to
  220. 7:56re-render anyway to update the query.
  221. 7:59Or I want to mark a chat as read, but
  222. 8:01only when the window is focused.
  223. 8:03The use this focused hook re-renders
  224. 8:05when focus state changes. So, we have to
  225. 8:07run it in an effect.
  226. 8:09That doesn't change what renders, but
  227. 8:11now this screen re-renders every time
  228. 8:12focus changes.
  229. 8:15This is all because render is needed for
  230. 8:17coordinating things that aren't even
  231. 8:18rendering.
  232. 8:19We're wasting all of this computing to
  233. 8:21just run side effects and move state
  234. 8:23around.
  235. 8:25Now, let's talk about callbacks.
  236. 8:27Shout out if you see the problem here.
  237. 8:30All right, nobody did it.
  238. 8:33Well, the depths array
  239. 8:34needs to have a value in it, or this
  240. 8:36callback will become stale when value
  241. 8:38changes, and then we'll log the value.
  242. 8:40The We'll log the old value.
  243. 8:43So, you add value to the depths array,
  244. 8:45and it's fixed.
  245. 8:46But now, on press changes whenever value
  246. 8:48changes, and that means this big
  247. 8:50component also re-renders whenever value
  248. 8:53changes.
  249. 8:54You can't easily see this by looking at
  250. 8:56it.
  251. 8:57It's a hidden performance problem.
  252. 8:59I've seen tons of mistakes like this
  253. 9:01causing noticeable freezes when some
  254. 9:04spaghetti path of a state change
  255. 9:05accidentally re-renders the whole app.
  256. 9:08This kind of silly mistake can actually
  257. 9:10have a really deep impact.
  258. 9:12And finally, let's talk about state.
  259. 9:15React state is extremely blunt and
  260. 9:17over-subscribed.
  261. 9:19Use state doesn't just create state. It
  262. 9:22also subscribes the current component to
  263. 9:24that state.
  264. 9:25That sounds normal cuz we're all used to
  265. 9:27it by now, but it's actually a huge
  266. 9:29limitation.
  267. 9:30The owner of the state has to re-render
  268. 9:32when it changes, and then it's
  269. 9:34responsible for passing it down to
  270. 9:36whatever uses it.
  271. 9:37Ownership and subscription are tied
  272. 9:39together.
  273. 9:41Context can be even worse.
  274. 9:43Use context doesn't only subscribe to
  275. 9:45the field you need, it subscribes to the
  276. 9:47whole context value.
  277. 9:49Whenever anything in the context value
  278. 9:51changes, all subscribers re-render.
  279. 9:54Say you want to get font scale in your
  280. 9:56custom text element. This will re-render
  281. 9:59every text element whenever font scale
  282. 10:00changes. That's not great, but it
  283. 10:03doesn't happen too often.
  284. 10:05But that's a trick. You actually
  285. 10:07subscribe to the window size, too.
  286. 10:09So, when a tablet or desktop user
  287. 10:10resizes the window, every single text
  288. 10:12element across your whole app re-renders
  289. 10:15and your app freezes.
  290. 10:16It doesn't actually need the width here,
  291. 10:19but use context subscribe to it anyway.
  292. 10:21So, now you have a huge performance
  293. 10:23problem for no reason.
  294. 10:26So, we know that rendering too much, too
  295. 10:28often, is a major cause of performance
  296. 10:30problems.
  297. 10:32>> [snorts]
  298. 10:32>> But render is the orchestrator of
  299. 10:33everything, and React encourages
  300. 10:36re-rendering often and spreading those
  301. 10:38renders deep and wide.
  302. 10:40So, that's the model that I want to
  303. 10:42break. Instead of re-rendering
  304. 10:44everything everywhere all at once,
  305. 10:47we render just once.
  306. 10:49We don't even need to change the
  307. 10:50framework to do this. We just have to
  308. 10:52think about state differently and
  309. 10:54coordinate state separately from render.
  310. 10:57Currently,
  311. 10:58render coordinates everything and state
  312. 11:01owners push the state down.
  313. 11:03Instead,
  314. 11:04let's let consumers update themselves as
  315. 11:06needed.
  316. 11:08And all we need for that is stable state
  317. 11:10objects that you can subscribe to.
  318. 11:13Some people call these signals, some
  319. 11:15call them observables,
  320. 11:16Reanimated calls them shared values.
  321. 11:19The key thing here is that use
  322. 11:21observable does not subscribe to the
  323. 11:22state, it just creates it.
  324. 11:25Any other component can use value it to
  325. 11:27subscribe to it.
  326. 11:29This separates the ownership from the
  327. 11:30subscription. We lift the state
  328. 11:32ownership up when we need to, but we
  329. 11:34push state subscription all the way
  330. 11:36down.
  331. 11:37So, in this example, the chat screen
  332. 11:39passes these stable state objects that
  333. 11:41never change, so it never has to
  334. 11:43re-render.
  335. 11:44Then this tiny little reply row
  336. 11:46subscribes to the state that it needs,
  337. 11:48and it re-renders itself whenever it
  338. 11:50needs to.
  339. 11:51It does almost nothing, so the cost of
  340. 11:53re-rendering that is tiny compared to
  341. 11:55re-rendering the whole chat screen.
  342. 11:58So, whereas normally the whole app would
  343. 12:00re-render because the state is owned and
  344. 12:02subscribed at the top,
  345. 12:04with this setup, only the affected
  346. 12:05components re-render.
  347. 12:07Nothing else is visually changing, so
  348. 12:09they don't need to re-render, so we can
  349. 12:11just skip all of it.
  350. 12:13If a callback needs a state value, it
  351. 12:15can just get the value. It doesn't need
  352. 12:17to
  353. 12:18pass through a render. It doesn't need
  354. 12:20to be constantly re-created. It can just
  355. 12:22be a stable function that never changes.
  356. 12:26An observing effect can just re-run
  357. 12:28itself when the state it cares about
  358. 12:29changes.
  359. 12:30It doesn't need a render to update it.
  360. 12:33It automatically subscribes to any state
  361. 12:34it accesses.
  362. 12:36So, we can open a modal without any
  363. 12:37render coordination and still have the
  364. 12:39state to track it.
  365. 12:42Use context is still very useful,
  366. 12:45but to provide stable state objects.
  367. 12:47That way the provider never re-renders,
  368. 12:50and the consumers can select which
  369. 12:51specific thing to listen to to re-render
  370. 12:54as little as possible.
  371. 12:56We could also subscribe to state to
  372. 12:58derived values. So, rather than
  373. 13:00subscribing to reply ID, which would
  374. 13:02re-render every single message,
  375. 13:04it can
  376. 13:06um
  377. 13:06subscribe to a derived value so that
  378. 13:08only one reply message actually
  379. 13:10re-renders.
  380. 13:13So, when I say render once, I don't mean
  381. 13:14never update. I mean render the app and
  382. 13:17large coordinating screens once.
  383. 13:20Let leaf nodes re-render themselves. Let
  384. 13:22effects re-run themselves. Don't
  385. 13:24orchestrate through render.
  386. 13:26This way your apps will just do a lot
  387. 13:28less work.
  388. 13:30And this is not just a wild theory I
  389. 13:31have. I've actually been building all of
  390. 13:33my apps and libraries like this for 10
  391. 13:35years.
  392. 13:36If you use my state library, Legend
  393. 13:37State, you probably realized a while ago
  394. 13:40I've just been describing how it works.
  395. 13:42Uh and this is basically how other
  396. 13:44frameworks like Solid, Svelte, and
  397. 13:45Preact work.
  398. 13:47But it's actually already in React
  399. 13:48Native. This is how Reanimated works.
  400. 13:51A shared value is a stable state object.
  401. 13:54When you get a shared value within an
  402. 13:56observing hook, it subscribes and
  403. 13:58updates itself automatically. You can
  404. 14:00set it anywhere in your code and it'll
  405. 14:02update the UI without a render.
  406. 14:04So we're actually already doing this to
  407. 14:06get the best performance with
  408. 14:08animations.
  409. 14:09And if you use Legend List, you also
  410. 14:12have this pattern in your app already.
  411. 14:14This is the main reason Legend List is
  412. 14:15the fastest list library on mobile and
  413. 14:17web.
  414. 14:18It just does less work. It uses less
  415. 14:20CPU.
  416. 14:22Legend List mounts a pool of absolutely
  417. 14:24positioned containers up front and then
  418. 14:26it never re-renders that array ever
  419. 14:28again.
  420. 14:29It signals individual containers to
  421. 14:31re-render themselves when needed.
  422. 14:34So when you scroll down,
  423. 14:35it signals one container to re-render at
  424. 14:38a new position with a new item.
  425. 14:40This keeps the size of renders as small
  426. 14:42as possible
  427. 14:43for best scrolling performance.
  428. 14:46When an item size changes, which happens
  429. 14:48quite often, a tiny wrapper component
  430. 14:50re-renders itself with just a style
  431. 14:52change and nothing else.
  432. 14:54When the list size changes,
  433. 14:56it skips rendering entirely and it
  434. 14:58updates an animated style.
  435. 15:00It's not actually animating, but it's
  436. 15:02more performant than doing a render.
  437. 15:05These size changes happen very often
  438. 15:07while you're scrolling as new items come
  439. 15:09in
  440. 15:10and you have an estimated size and an
  441. 15:11actual size. They lay out, you measure.
  442. 15:14Uh so this happens a lot. It would kill
  443. 15:16performance if it had to update and
  444. 15:18render the outer list component with a
  445. 15:20new size every single time.
  446. 15:23Legend list is fast because it's
  447. 15:24extremely careful to do less work.
  448. 15:27Rendering has a real and significant
  449. 15:29cost.
  450. 15:31So, for the fastest possible apps,
  451. 15:33render less less often.
  452. 15:35Or push further, render once.
  453. 15:38Use React to create the structure, then
  454. 15:40update the smallest leaf nodes directly.
  455. 15:44But, this isn't just a list hack. This
  456. 15:45is the model I want you to take back to
  457. 15:47your apps.
  458. 15:48So, try this today.
  459. 15:50Well, maybe not today since we're at a
  460. 15:52conference. So, try this on Monday.
  461. 15:55Uh
  462. 15:55the first step is to find what's
  463. 15:57actually slow.
  464. 15:58Look at your slowest screens and
  465. 16:00interactions. Just throw logs everywhere
  466. 16:02and just see what's rendering so much.
  467. 16:05Or use the highlight updates feature in
  468. 16:07the dev tools to just watch renders as
  469. 16:08they happen, figure out what's going on.
  470. 16:11Then just try optimizing that screen to
  471. 16:13see what you can do.
  472. 16:15This problem can actually be fully
  473. 16:16solved with a state library. It doesn't
  474. 16:18need any framework changes.
  475. 16:20Obviously, I recommend Legend state.
  476. 16:23I'm not aware of any other state
  477. 16:24libraries that do all of this, but
  478. 16:25there's some other signal style
  479. 16:27libraries that you can use if you
  480. 16:28prefer.
  481. 16:29Or just make your own.
  482. 16:31The key thing is you want to decouple
  483. 16:33the state creation and subscription and
  484. 16:35push the renders down as far as you can
  485. 16:37to the leaf nodes.
  486. 16:40I know this is controversial. Everyone
  487. 16:42has very strong opinions about state.
  488. 16:44I've gotten a ton of pushback that teams
  489. 16:47don't want to change their state
  490. 16:48libraries or they prefer to just use the
  491. 16:50built-in state and use context because
  492. 16:52that's what React recommends, right?
  493. 16:55But, you already use reanimated instead
  494. 16:56of the built-in animated because it's
  495. 16:58better.
  496. 16:59You dropped style sheet for Unistyles or
  497. 17:01NativeWind or UniWind. If you still have
  498. 17:04flat lists in your app somehow, talk to
  499. 17:06me after this.
  500. 17:07Uh
  501. 17:08I hope you're still not using
  502. 17:10TouchableOpacity.
  503. 17:12So, why are we still clinging on to the
  504. 17:14built-in state?
  505. 17:16Some teams just refuse to use a state
  506. 17:18library or your library developer and
  507. 17:20you don't want another dependency. I
  508. 17:22understand that.
  509. 17:23So, there's also some lower level things
  510. 17:25you can do to cut out the renders.
  511. 17:27So, instead of this very familiar
  512. 17:29pattern, try to use the imperative APIs
  513. 17:32rather than hooks to avoid the
  514. 17:33re-renders.
  515. 17:34So, instead of re-rendering every time
  516. 17:36window size changes,
  517. 17:38you can just get the window size when
  518. 17:39you need it.
  519. 17:41And then you can subscribe to it. Um Oh,
  520. 17:45this one.
  521. 17:46Uh
  522. 17:47so, you can subscribe to it changing and
  523. 17:49then do whatever you want with it. If
  524. 17:50you want to pass that through state,
  525. 17:51cool. If you want to send it to post hog
  526. 17:53or whatever, it's fine.
  527. 17:55Um
  528. 17:57And if you're a library author, please
  529. 17:59add an imperative API as well as a hook
  530. 18:01like dimensions has.
  531. 18:03So, then you can get the value when you
  532. 18:05need it.
  533. 18:06You can use an event listener to hook
  534. 18:07into it if you want to. You don't need
  535. 18:09to do a re-render for it.
  536. 18:12Another pattern I've used is to make
  537. 18:13hooks take a callback function and
  538. 18:15return a ref.
  539. 18:17So, then the users can return the use
  540. 18:19the ref when they need to get the value.
  541. 18:20They can pass the ref around. It's a
  542. 18:22stable object. Or they can just listen
  543. 18:25to changes with a callback and do
  544. 18:26whatever they want with it.
  545. 18:29You can change your callbacks to
  546. 18:30something like use latest callback or
  547. 18:32use event callback which updates them
  548. 18:34without dependency arrays and that makes
  549. 18:36the callback stable
  550. 18:38so they don't cause render cascades down
  551. 18:39the tree.
  552. 18:41If you really want to stick with context
  553. 18:43for some reason but does not have the
  554. 18:45terrible performance problems that come
  555. 18:47with it,
  556. 18:48you could use something like use context
  557. 18:49selector.
  558. 18:50It still re-renders on every change but
  559. 18:52at least it lets you select only the
  560. 18:54small piece you care about.
  561. 18:56But these are mostly small fixes to the
  562. 18:58symptoms.
  563. 18:59The deepest impact we can get is from
  564. 19:01rethinking state at a higher level.
  565. 19:04High-level orchestrating components
  566. 19:06should never re-render. They should own
  567. 19:08the state but not subscribe to it.
  568. 19:10Re-renders should be pushed down to the
  569. 19:12leaf nodes.
  570. 19:13I know this is a departure from normal
  571. 19:15React patterns,
  572. 19:17but in my experience, it really does
  573. 19:19make apps a lot faster, and I think it's
  574. 19:21worth a try.
  575. 19:23I really believe state architecture is
  576. 19:25by far the biggest hidden bottleneck in
  577. 19:27most apps,
  578. 19:29so you should really care about it and
  579. 19:30optimize the bananas out of it.
  580. 19:33And I care so much about this, I built a
  581. 19:35whole state and sync library because it
  582. 19:37was the only way to get the best
  583. 19:39performance.
  584. 19:41This architecture, in my opinion, is how
  585. 19:43you get from fast for React Native to
  586. 19:45really fast.
  587. 19:47Render once.
  588. 19:49Thank you.

About this transcript

This page contains the full transcript of Jay Meistrich – How to Build the Fastest Apps: Break the Rules | App.js Conf 2026 by Software Mansion, generated from the public captions YouTube serves with the video. The transcript has 3,329 words across 588 segments, with the original timestamps preserved so you can click any line to jump to that moment in the embedded player.

What you can do with it

Use the transcript to take notes, quote the speaker, build a study guide, generate a summary with ChatGPT or Claude via the YouTube Summary tool, or export it as a timed subtitle file with YouTube to SRT. You can also re-open it in the transcriber to translate the transcript into 100+ languages.

Free YouTube transcript tool

YouTube2Text is a free YouTube transcript generator — no signup, no daily limit. Paste any YouTube link and get the full transcript instantly, with timestamps, click-to-jump, translation to 100+ languages, AI prompts for ChatGPT, Claude, and Gemini, and exports to TXT, SRT, VTT, or Markdown.