<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: The React Native Rewind</title>
    <description>The latest articles on DEV Community by The React Native Rewind (@thereactnativerewind).</description>
    <link>https://dev.to/thereactnativerewind</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2918020%2Fd2266605-0a07-4170-a29e-86b7b01fa816.png</url>
      <title>DEV Community: The React Native Rewind</title>
      <link>https://dev.to/thereactnativerewind</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/thereactnativerewind"/>
    <language>en</language>
    <item>
      <title>Desk Racers Built From a Photograph, Purple Gradients Sent Back to the Kitchen, and a Security Backlog That Finally Got Help</title>
      <dc:creator>The React Native Rewind</dc:creator>
      <pubDate>Thu, 22 Oct 2026 09:33:08 +0000</pubDate>
      <link>https://dev.to/thereactnativerewind/desk-racers-built-from-a-photograph-purple-gradients-sent-back-to-the-kitchen-and-a-security-m8j</link>
      <guid>https://dev.to/thereactnativerewind/desk-racers-built-from-a-photograph-purple-gradients-sent-back-to-the-kitchen-and-a-security-m8j</guid>
      <description>&lt;p&gt;You’re reading The Agentic Rewind &lt;a href="https://www.theagenticrewind.com/issues/desk-racers-built-from-a-photograph-purple-gradients-sent-back-to-the-kitchen-and-a-security-backlog-that-finally-got-help" rel="noopener noreferrer"&gt;#2&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Noble Gas With a Long Attention Span
&lt;/h2&gt;

&lt;p&gt;Argon is a noble gas, which means it doesn't react to anything.&lt;/p&gt;

&lt;p&gt;And that, in a way, is rather wonderful.&lt;/p&gt;

&lt;p&gt;On October 13, Google released &lt;a href="https://blog.google/innovation-and-ai/models-and-research/gemini-models/introducing-gemini-4-argon/" rel="noopener noreferrer"&gt;Gemini 4 Argon&lt;/a&gt;, and the idea is beautifully simple: give it a big task and walk away.&lt;/p&gt;

&lt;p&gt;Koray Kavukcuoglu (&lt;a href="https://x.com/koraykv" rel="noopener noreferrer"&gt;@koraykv&lt;/a&gt;) introduced it as a model trained to work longer and remember more than any Gemini before it.&lt;/p&gt;

&lt;p&gt;It plans, writes the code, checks its own work, and keeps going long after we'd have closed the laptop and gone to look at the stars.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;So what actually changed?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Earlier Gemini models could only write 64K tokens before they had to stop.&lt;/p&gt;

&lt;p&gt;Argon shares one 1M-token window across everything it reads, thinks and writes.&lt;/p&gt;

&lt;p&gt;So a single call can return a whole multi-file change, not half a function.&lt;/p&gt;

&lt;p&gt;To go past 64K tokens, you run the request in background mode.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;interaction&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;interactions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;gemini-4-argon&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;input&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Write a complete, rigorous proof &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;of the prime number theorem.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="c1"&gt;// past 64K output tokens needs background mode&lt;/span&gt;
  &lt;span class="na"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;generation_config&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;max_output_tokens&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;262144&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;thinking_level&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;high&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then you check back with &lt;code&gt;client.interactions.get&lt;/code&gt; until it's finished, which is Google's polite way of saying go and make a coffee.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What does a long run look like?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Google's showpiece is Desk Racer.&lt;/p&gt;

&lt;p&gt;Argon took photos of a real desk and, working inside &lt;a href="https://antigravity.google" rel="noopener noreferrer"&gt;Antigravity&lt;/a&gt;, Google's agent-first coding tool, turned them into a playable miniature racing game.&lt;/p&gt;

&lt;p&gt;It built the 3D scene with &lt;a href="https://github.com/ahujasid/blender-mcp" rel="noopener noreferrer"&gt;Blender MCP&lt;/a&gt;, painted it with &lt;a href="https://deepmind.google/models/gemini-image/" rel="noopener noreferrer"&gt;Nano Banana&lt;/a&gt;, and wired up the physics and engine sounds in &lt;a href="https://threejs.org" rel="noopener noreferrer"&gt;Three.js&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The track loops around the keyboard, the mouse and the desk lamp, a tiny universe built from a photograph.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcuv1ev93dnb5jvmtaixo.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcuv1ev93dnb5jvmtaixo.jpg" alt="Desk Racer still" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Every race starts with a countdown on the line, and you can &lt;a href="https://ai.studio/apps/bundled/desk-racer" rel="noopener noreferrer"&gt;try it yourself in AI Studio&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fq7uzjqin55kuozzfkwvk.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fq7uzjqin55kuozzfkwvk.gif" alt="Desk Racer gameplay" width="560" height="315"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does it actually ship better code?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Google says its teams shipped over 35% more agent-written code with Argon, with nearly a third fewer rollbacks.&lt;/p&gt;

&lt;p&gt;It also says Argon rarely cheats now, like skipping a failing test, doing it just 2% of the time.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ai.google.dev/gemini-api/docs/pricing" rel="noopener noreferrer"&gt;Pricing&lt;/a&gt; starts at $2 per million input tokens and $10 for output, doubling on December 1.&lt;/p&gt;

&lt;p&gt;Our desks have never looked more productive.&lt;/p&gt;

&lt;p&gt;Mostly because they never had a racetrack before.&lt;/p&gt;

&lt;p&gt;This just made me want to play a round of &lt;a href="https://mariokart.nintendo.com/" rel="noopener noreferrer"&gt;Mario Kart&lt;/a&gt; (who are we kidding… more than one round, probably until I finish last three times in a row, hit by every evil banana and turtle shell going).&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://blog.google/innovation-and-ai/models-and-research/gemini-models/introducing-gemini-4-argon/" rel="noopener noreferrer"&gt;Gemini 4 Argon&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzqq7ca4ejkryu1ctccth.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzqq7ca4ejkryu1ctccth.jpg" alt="Gollum weekly usage limit meme" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Taste the Rainbow, Fail the Gradient
&lt;/h2&gt;

&lt;p&gt;Right, ask any coding agent for a landing page, and what do you get?&lt;/p&gt;

&lt;p&gt;A purple gradient, a centred headline, three feature cards, and a testimonial from someone who doesn't exist.&lt;/p&gt;

&lt;p&gt;It's bland, it's lazy, and we've all been served it a thousand times.&lt;/p&gt;

&lt;p&gt;Leon Lin (&lt;a href="https://x.com/LexnLin" rel="noopener noreferrer"&gt;@LexnLin&lt;/a&gt;) shipped version 2 of &lt;a href="https://github.com/Leonxlnx/taste-skill" rel="noopener noreferrer"&gt;Taste Skill&lt;/a&gt; on October 13, and its whole job is to send that page back before anyone sees it.&lt;/p&gt;

&lt;p&gt;It's an &lt;a href="https://agentskills.io" rel="noopener noreferrer"&gt;Agent Skill&lt;/a&gt; (&lt;em&gt;a folder of instructions your coding agent loads when it needs them&lt;/em&gt;) for &lt;a href="https://www.claude.com/product/claude-code" rel="noopener noreferrer"&gt;Claude Code&lt;/a&gt;, &lt;a href="https://github.com/openai/codex" rel="noopener noreferrer"&gt;Codex&lt;/a&gt; and &lt;a href="https://cursor.com" rel="noopener noreferrer"&gt;Cursor&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What's new in version two?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It's not the old recipe reheated.&lt;/p&gt;

&lt;p&gt;Instead of vague advice like "make it modern", it gives the agent a real library of designs, built from a study of 247 hand-picked sites.&lt;/p&gt;

&lt;p&gt;The agent is dealt three design directions and has to pick the one that fits this particular client.&lt;/p&gt;

&lt;p&gt;It also pulls real photos and maps from open collections like &lt;a href="https://commons.wikimedia.org" rel="noopener noreferrer"&gt;Wikimedia Commons&lt;/a&gt; and &lt;a href="https://github.com/WordPress/openverse" rel="noopener noreferrer"&gt;Openverse&lt;/a&gt;, with credits on the page.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# install the v2 default skill&lt;/span&gt;
npx skills add https://github.com/Leonxlnx/taste-skill &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--skill&lt;/span&gt; &lt;span class="s2"&gt;"design-taste-frontend"&lt;/span&gt;

&lt;span class="c"&gt;# deal three directions for the brief&lt;/span&gt;
node &amp;lt;skill&amp;gt;/scripts/draw.mjs &lt;span class="nt"&gt;--sector&lt;/span&gt; &amp;lt;sector&amp;gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--brief&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;one line&amp;gt;"&lt;/span&gt; &lt;span class="nt"&gt;--sections&lt;/span&gt; &amp;lt;roles&amp;gt; &lt;span class="nt"&gt;--options&lt;/span&gt; 3

&lt;span class="c"&gt;# the gate the agent has to pass&lt;/span&gt;
node &amp;lt;skill&amp;gt;/scripts/lint.mjs &amp;lt;&lt;span class="nb"&gt;source &lt;/span&gt;files or folder&amp;gt;
node &amp;lt;skill&amp;gt;/scripts/inspect.mjs &amp;lt;url or path/to/index.html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That last line is the head chef, tasting every plate before it goes out.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;inspect.mjs&lt;/code&gt; opens the page in a real browser on desktop, tablet and phone widths, and rejects it for gradients, shadows and other usual suspects.&lt;/p&gt;

&lt;p&gt;The agent looks at its own screenshots, fixes the worst three problems and tries again, up to three times.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does it actually look different?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here's a coffee shop page it made from a single brief, with a drawn storefront at the top.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Folmecepbao8qd1mm2iag.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Folmecepbao8qd1mm2iag.jpg" alt="Taste Skill coffee shop page" width="800" height="464"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And here's a techno night that prints its dates right onto an old photo of an industrial hall.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftwkifyyz5ve4ywx7xqcl.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftwkifyyz5ve4ywx7xqcl.jpg" alt="Taste Skill techno night page" width="800" height="464"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The catch is time: a build takes 30 to 45 minutes and a few hundred thousand tokens.&lt;/p&gt;

&lt;p&gt;It's also meant for public pages, not dashboards or app screens.&lt;/p&gt;

&lt;p&gt;Somewhere, a purple gradient is updating its LinkedIn profile.&lt;/p&gt;

&lt;p&gt;Shut it down.&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://github.com/Leonxlnx/taste-skill" rel="noopener noreferrer"&gt;Taste Skill&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxzeb4ailrzlv9s5hy6vs.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxzeb4ailrzlv9s5hy6vs.jpg" alt="Interstellar monorepo tokens meme" width="800" height="645"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;📦 &lt;strong&gt;&lt;a href="https://blog.google/innovation-and-ai/models-and-research/gemini-models/introducing-gemini-4-argon/" rel="noopener noreferrer"&gt;Gemini 4 Argon&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Google's new frontier model is GA in the API, AI Studio, and Antigravity at an intro $2/$10 per million tokens until Nov 30… and it already untangled a ~6 million line folder of legacy Chrome code, so your monolith is next.&lt;/p&gt;

&lt;p&gt;📦 &lt;strong&gt;&lt;a href="https://github.blog/changelog/2026-10-14-hydrafusion-updates-and-new-max-option/" rel="noopener noreferrer"&gt;HydraFusion Max&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Copilot's multi-model blender now pulls from Claude Opus 5.5, GPT-6 Astra, GPT-6.1 Sol, and GPT-6 Luna, with parallel critics poking the actual workspace… Max cranks the reasoning for when "balanced" isn't the vibe.&lt;/p&gt;

&lt;p&gt;📦 &lt;strong&gt;&lt;a href="https://github.com/openai/codex/releases/tag/rust-v0.163.0" rel="noopener noreferrer"&gt;Codex 0.163 Mid-Turn Steering&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Send a follow-up while Codex is mid-response and it steers right away, plus searchable &lt;code&gt;/config&lt;/code&gt; and read-only tools running in parallel… finally, a way to say "no, not that file" before it's too late.&lt;/p&gt;

&lt;p&gt;📦 &lt;strong&gt;&lt;a href="https://github.com/cline/cline/releases/tag/v4.1.25" rel="noopener noreferrer"&gt;Cline Cloud Sessions&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Run a Cline task in a hosted sandbox on the repo and branch you pick, and it keeps going after you close your editor… rolling out gradually, and unpinned Cline-provider users now default to Gemini 4 Argon.&lt;/p&gt;

&lt;p&gt;📦 &lt;strong&gt;&lt;a href="https://shopify.dev/changelog/posts/add-shopping-and-shop-pay-checkout-to-any-agent-with-shop-mcp" rel="noopener noreferrer"&gt;Shop MCP&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Shopify's hosted MCP server lets any agent search 1B+ products, build a cart, and finish Shop Pay checkout without bouncing the shopper to a website… search doesn't even need an API key, which your credit card may find concerning.&lt;/p&gt;

&lt;p&gt;📦 &lt;strong&gt;&lt;a href="https://about.gitlab.com/blog/mcp-server-ga/" rel="noopener noreferrer"&gt;GitLab MCP Server GA&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Shipped with GitLab 19.5: semantic code search, pipeline debugging, toolsets, and Duo Agent Platform flows you can kick off from Claude Code or Cursor… all under your existing GitLab permissions, on every tier including Free.&lt;/p&gt;

&lt;p&gt;📦 &lt;strong&gt;&lt;a href="https://github.blog/changelog/2026-10-15-agentic-autofix-for-code-scanning-alerts-general-availability/" rel="noopener noreferrer"&gt;Copilot Agentic Autofix&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Now GA: assign a code scanning alert to Copilot and it explores the codebase, re-runs CodeQL to validate the fix, and opens a draft PR… up to 25 alerts at once, so the security backlog finally gets an intern.&lt;/p&gt;

&lt;p&gt;📦 &lt;strong&gt;&lt;a href="https://github.com/github/copilot-cli/blob/main/changelog.md" rel="noopener noreferrer"&gt;Copilot CLI Agent-Scoped Hooks&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;1.0.97 lets custom agents carry their own declarative hooks, and Autopilot now denies a hook's "ask" instead of freezing on a permission dialog nobody is watching… RIP the 3am prompt that patiently waited until 9am.&lt;/p&gt;

&lt;p&gt;📦 &lt;strong&gt;&lt;a href="https://github.com/anthropics/claude-code/releases/tag/v2.1.301" rel="noopener noreferrer"&gt;Claude Code Retry Watchdog Cap&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;v2.1.301 adds &lt;code&gt;CLAUDE_CODE_RETRY_WATCHDOG_MAX_USAGE_LIMIT_WAIT_MS&lt;/code&gt;, so unattended retry mode gives up on a usage limit that resets too far away… instead of sitting there all weekend like a dog at the door.&lt;/p&gt;

&lt;p&gt;📝 &lt;strong&gt;&lt;a href="https://claude.dev/blog/solving-code-review-at-anthropic/" rel="noopener noreferrer"&gt;How the Claude Code Team Does Code Review&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Claude writes about 90% of Claude Code, merged PRs more than doubled from June to September, and reverts fell over 40%… plus the tale of one PR that did 50+ review rounds overnight before anyone stopped it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzv9s671bvmrdpcank8ph.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzv9s671bvmrdpcank8ph.gif" alt="Goodbye GIF" width="480" height="366"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Authored by &lt;a href="https://www.linkedin.com/in/lukebrandonfarrell/" rel="noopener noreferrer"&gt;Luke Farrell&lt;/a&gt; and edited by &lt;a href="http://www.linkedin.com/in/francisco-rios-nino" rel="noopener noreferrer"&gt;Fran Ríos&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you’re enjoying this newsletter, why not help us grow? Share it with your friends, family, and even that one coworker who always “forgets” to update dependencies. Use this link: &lt;a href="https://theagenticrewind.com/" rel="noopener noreferrer"&gt;https://theagenticrewind.com/&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>programming</category>
      <category>webdev</category>
    </item>
    <item>
      <title>A Butler Who Never Reads the Diff, 1,000-Page Contracts in 56 Milliseconds, and a Phone That Knows How Far It's Folded</title>
      <dc:creator>The React Native Rewind</dc:creator>
      <pubDate>Thu, 22 Oct 2026 08:47:51 +0000</pubDate>
      <link>https://dev.to/thereactnativerewind/a-butler-who-never-reads-the-diff-1000-page-contracts-in-56-milliseconds-and-a-phone-that-knows-nol</link>
      <guid>https://dev.to/thereactnativerewind/a-butler-who-never-reads-the-diff-1000-page-contracts-in-56-milliseconds-and-a-phone-that-knows-nol</guid>
      <description>&lt;p&gt;You’re reading The React Native Rewind &lt;a href="https://thereactnativerewind.com/issues/a-butler-who-never-reads-the-diff-1-000-page-contracts-in-56-milliseconds-and-a-phone-that-knows-how-far-its-folded" rel="noopener noreferrer"&gt;#62&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Siri Swears the PR Is Reviewed
&lt;/h2&gt;

&lt;p&gt;Good evening, Master Wayne.&lt;/p&gt;

&lt;p&gt;I've read the changelog, so you needn't.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://expo.dev/changelog/sdk-58" rel="noopener noreferrer"&gt;Expo SDK 58&lt;/a&gt; arrived on October 15, announced by Alan Hughes and &lt;a href="https://x.com/notbrent" rel="noopener noreferrer"&gt;Brent Vatne&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;And for once, sir, the headline is not a fresh way to break your Podfile.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;So what happened to the Simulator?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://developer.apple.com/xcode/" rel="noopener noreferrer"&gt;Xcode 27&lt;/a&gt; has retired &lt;code&gt;Simulator.app&lt;/code&gt;, and the new &lt;code&gt;expo-device-hub&lt;/code&gt; plugin turns your browser into a device dashboard instead.&lt;/p&gt;

&lt;p&gt;It streams your iOS simulators and Android emulators, and you can tap, swipe and type straight into them.&lt;/p&gt;

&lt;p&gt;Next to them sit live CPU, memory and network graphs, a bit like the screens in the Batcave.&lt;/p&gt;

&lt;p&gt;Here it is running an iPhone 17 Pro Max simulator, courtesy of Nathan Schroeder (&lt;a href="https://x.com/nater02" rel="noopener noreferrer"&gt;@nater02&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Forfitor4hydhirvth0sf.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Forfitor4hydhirvth0sf.jpg" alt="Expo device hub" width="800" height="680"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To try it, run &lt;code&gt;npx expo install expo-device-hub&lt;/code&gt;, then &lt;code&gt;npx expo start&lt;/code&gt;, and the link will be waiting in your terminal.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can Siri finally talk to our apps?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The household has a new member of staff, sir.&lt;/p&gt;

&lt;p&gt;The alpha package &lt;a href="https://docs.expo.dev/versions/v58.0.0/sdk/app-intents/" rel="noopener noreferrer"&gt;&lt;code&gt;expo-app-intents&lt;/code&gt;&lt;/a&gt; lets Siri, Shortcuts and Spotlight trigger actions in your app.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://developer.apple.com/documentation/appintents" rel="noopener noreferrer"&gt;App Intents&lt;/a&gt; (&lt;em&gt;Apple's way of describing what your app can do&lt;/em&gt;) still have to be declared in Swift.&lt;/p&gt;

&lt;p&gt;Expo queues every request for your JavaScript, so Siri can take an order even when your app is closed.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;AppIntents&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;expo-app-intents&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;AppIntentHandler&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;AppIntents&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;useAppIntents&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;pendingIntents&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;invocation&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;pendingIntents&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="c1"&gt;// Siri may have queued this while the app was closed&lt;/span&gt;
      &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;invocation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;invocation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;AppIntents&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;removePendingInvocationAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="nx"&gt;invocation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;npx expo-app-intents init&lt;/code&gt; sets up the Swift side for you.&lt;/p&gt;

&lt;p&gt;In Expo's demo, Siri asks which task to mark as complete and flips the toggle in the app.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdx84zf3wrz7cwz5d53lp.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdx84zf3wrz7cwz5d53lp.jpg" alt="Expo App Intents Siri demo" width="800" height="588"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I regret to report that Siri marked "Review pull requests" as done without reading a single line.&lt;/p&gt;

&lt;p&gt;Every bit as thorough as you on a Friday, sir.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is the bundler any faster?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;SDK 58 adds &lt;a href="https://github.com/expo/expo/pull/48443" rel="noopener noreferrer"&gt;Noxcturnal&lt;/a&gt;, an experimental &lt;a href="https://metrobundler.dev" rel="noopener noreferrer"&gt;Metro&lt;/a&gt; transformer written in Rust with &lt;a href="https://oxc.rs" rel="noopener noreferrer"&gt;oxc&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In Expo's test, a 5,500-file app went from 5.26 seconds on &lt;a href="https://babeljs.io" rel="noopener noreferrer"&gt;Babel&lt;/a&gt; to 2.46 seconds, about twice as fast.&lt;/p&gt;

&lt;p&gt;Phil Pluckthun (&lt;a href="https://x.com/_philpl" rel="noopener noreferrer"&gt;@_philpl&lt;/a&gt;) shared the timeline, with the new transformer finished at the top and Babel still working below.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftcy8iized654s1wdssug.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftcy8iized654s1wdssug.jpg" alt="Noxcturnal transformer timeline" width="799" height="291"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You turn it on with &lt;code&gt;experiments.noxcturnalTransformWorker&lt;/code&gt;, and it politely steps aside if you use custom Babel plugins.&lt;/p&gt;

&lt;p&gt;Will that be all, sir?&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://expo.dev/changelog/sdk-58" rel="noopener noreferrer"&gt;Expo SDK 58&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftnkd7bd1xyfllkmcokea.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftnkd7bd1xyfllkmcokea.jpg" alt="React Advanced London 2026" width="800" height="469"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Two Days of React in an Old London Brewery
&lt;/h2&gt;

&lt;p&gt;React Advanced London is back on October 23 and 26, 2026.&lt;/p&gt;

&lt;p&gt;IT'S THIS FU**ING FRIDAY!!!!&lt;/p&gt;

&lt;p&gt;And we are obviously gonna be there, so if you are in London, come say hi and make our day.&lt;/p&gt;

&lt;p&gt;The first day, October 23, is in person at The Brewery, a London venue on the site of an 18th-century brewery, and it's streamed online for everyone who can't make it.&lt;/p&gt;

&lt;p&gt;The second day, October 26, is fully remote, so wherever you are, you still get two days of advanced React engineering.&lt;/p&gt;

&lt;p&gt;You'll be joining 800+ engineers for 40+ talks and workshops, given by the library authors and core contributors who build the stuff you ship.&lt;/p&gt;

&lt;p&gt;The big topics this year are React Server Components, the React Compiler and AI-assisted development.&lt;/p&gt;

&lt;p&gt;And because this is The React Native Rewind, we have to point out there's also a talk on building game UIs in Unreal Engine with React Native.&lt;/p&gt;

&lt;p&gt;Want a last-minute discount? Reach out to Luke or Fran.&lt;/p&gt;

&lt;p&gt;👉 Reserve your spot at &lt;a href="https://reactadvanced.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;reactadvanced.com&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjehdhn0i6r16ccib433m.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjehdhn0i6r16ccib433m.jpg" alt="First time Xcode update meme" width="800" height="651"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  PDF Now Stands for Pretty Damn Fast
&lt;/h2&gt;

&lt;p&gt;Some say every app eventually gets a support ticket that says "just show the PDF".&lt;/p&gt;

&lt;p&gt;And some say that the moment someone opens a 1,000-page scanned contract on a cheap Android phone, the app turns into a hand warmer.&lt;/p&gt;

&lt;p&gt;All we know is, &lt;a href="https://github.com/gmi-software/react-native-better-pdf" rel="noopener noreferrer"&gt;react-native-better-pdf&lt;/a&gt; hit 1.0 on October 12, built by Jakub Kasprzyk (&lt;a href="https://x.com/jkasprzyk17" rel="noopener noreferrer"&gt;@jkasprzyk17&lt;/a&gt;) and the team at &lt;a href="https://gmi.software" rel="noopener noreferrer"&gt;GMI Software&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What's wrong with the old one?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For years, the default has been &lt;a href="https://github.com/wonday/react-native-pdf" rel="noopener noreferrer"&gt;react-native-pdf&lt;/a&gt;, which on Android ships its own PDF engine, &lt;a href="https://pdfium.googlesource.com/pdfium/" rel="noopener noreferrer"&gt;PDFium&lt;/a&gt;, inside your app.&lt;/p&gt;

&lt;p&gt;That's like towing a caravan to a drag race.&lt;/p&gt;

&lt;p&gt;better-pdf ditches the caravan and uses the engines the phone already has: &lt;a href="https://developer.apple.com/documentation/pdfkit" rel="noopener noreferrer"&gt;PDFKit&lt;/a&gt; on iOS and &lt;a href="https://developer.android.com/reference/android/graphics/pdf/PdfRenderer" rel="noopener noreferrer"&gt;&lt;code&gt;PdfRenderer&lt;/code&gt;&lt;/a&gt; on Android.&lt;/p&gt;

&lt;p&gt;It's built on &lt;a href="https://nitro.margelo.com/docs/view-components" rel="noopener noreferrer"&gt;Nitro Views&lt;/a&gt; from &lt;a href="https://margelo.com" rel="noopener noreferrer"&gt;Margelo&lt;/a&gt;, so there's no WebView and no JavaScript slowing down scrolling or zooming.&lt;/p&gt;

&lt;p&gt;Only the pages on screen are kept in memory, no matter how long the lawyers chose to write.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;PdfView&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-native-better-pdf&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Reader&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;PdfView&lt;/span&gt;
      &lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="na"&gt;flex&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;}}&lt;/span&gt;
      &lt;span class="nx"&gt;source&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="na"&gt;uri&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://example.com/report.pdf&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}}&lt;/span&gt;
      &lt;span class="nx"&gt;onLoad&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{({&lt;/span&gt; &lt;span class="nx"&gt;pageCount&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;pages&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;pageCount&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's the entire reader.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How fast are we talking?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In the README's latest Android benchmark, the 1,000-page scan opens in 56 ms instead of 622 ms.&lt;/p&gt;

&lt;p&gt;It also peaks at 142 MB of memory instead of 898 MB.&lt;/p&gt;

&lt;p&gt;POWERRRR.&lt;/p&gt;

&lt;p&gt;The race below is a separate run, so its numbers differ a little, but the gap doesn't.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fowslob9g65yhh6pjm864.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fowslob9g65yhh6pjm864.gif" alt="react-native-better-pdf race" width="480" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In fairness, and we hate fairness, on iOS both libraries use PDFKit, so there the gap mostly vanishes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What else is in the box?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Version 1.0 comes with search, fillable forms, offline caching and printing.&lt;/p&gt;

&lt;p&gt;Search and forms answer two react-native-pdf feature requests that have been sitting open since &lt;a href="https://github.com/wonday/react-native-pdf/issues/555" rel="noopener noreferrer"&gt;2021&lt;/a&gt; and &lt;a href="https://github.com/wonday/react-native-pdf/issues/763" rel="noopener noreferrer"&gt;2023&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Here's a form being filled in, straight from the launch video.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F72i3jclnmbw3hh1gs0zy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F72i3jclnmbw3hh1gs0zy.gif" alt="react-native-better-pdf forms" width="480" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The catch is that you need the &lt;a href="https://reactnative.dev/architecture/landing-page" rel="noopener noreferrer"&gt;New Architecture&lt;/a&gt; and &lt;a href="https://github.com/mrousavy/nitro" rel="noopener noreferrer"&gt;&lt;code&gt;react-native-nitro-modules&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;But c’mon, at this point who hasn’t moved to the New Architecture?&lt;/p&gt;

&lt;p&gt;Anybody? Raise your hand. Anybody? Anybody?&lt;/p&gt;

&lt;p&gt;We’ll love you anyway, but unlike our love, updates aren’t unconditional.&lt;/p&gt;

&lt;p&gt;There's even an agent skill, so your coding agent can do the migration while we pretend to read the contract.&lt;/p&gt;

&lt;p&gt;And on that bombshell…&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://github.com/gmi-software/react-native-better-pdf" rel="noopener noreferrer"&gt;react-native-better-pdf&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxni6cx560geiqimd903w.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxni6cx560geiqimd903w.jpg" alt="Michael Scott Gradle upgrade meme" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;📦 &lt;strong&gt;&lt;a href="https://reactnative.dev/blog/2026/10/19/react-native-0.88" rel="noopener noreferrer"&gt;React Native 0.88&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Events now travel the web’s EventTarget path with real capture and bubbling, Text and TextInput get variable fonts through &lt;code&gt;fontVariationSettings&lt;/code&gt;, and iOS picks up SceneDelegate support before Xcode 27 stops launching apps without it... and for the third time this year, no user-facing breaking changes.&lt;/p&gt;

&lt;p&gt;📦 &lt;strong&gt;&lt;a href="https://expo.dev/changelog/sdk-58" rel="noopener noreferrer"&gt;Expo SDK 58&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Built for iOS 27 and React Native 0.88, with iPhone Duo support, a new &lt;code&gt;expo-hinge&lt;/code&gt; package that tells you exactly how open your phone is, and &lt;code&gt;expo-app-intents&lt;/code&gt; in alpha so Siri can finally tick off your onboarding checklist for you.&lt;/p&gt;

&lt;p&gt;📦 &lt;strong&gt;&lt;a href="https://github.com/expo/eas-cli/releases/tag/v25.0.0" rel="noopener noreferrer"&gt;EAS CLI 25&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Cloud simulator sessions now default to signed-in preview links, and 25.2 adds &lt;code&gt;eas simulator:control&lt;/code&gt; for poking a remote iOS simulator and moving files on and off it... the Mac under your desk is now officially someone else’s problem.&lt;/p&gt;

&lt;p&gt;📦 &lt;strong&gt;&lt;a href="https://github.com/software-mansion/react-native-gesture-handler/releases/tag/v3.4.0" rel="noopener noreferrer"&gt;React Native Gesture Handler 3.4&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Swift Package Manager builds on iOS, a new &lt;code&gt;immediatePressOut&lt;/code&gt; prop for Touchable, and Android now fires &lt;code&gt;onPressIn&lt;/code&gt; when the press actually starts... rather than whenever it got round to it.&lt;/p&gt;

&lt;p&gt;📦 &lt;strong&gt;&lt;a href="https://github.com/software-mansion/react-native-screens/releases/tag/4.30.0" rel="noopener noreferrer"&gt;React Native Screens 4.30&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Stack v4 gets ready for iOS 27 and iPhone Duo and lays screens out properly under opaque headers on iOS 26+, though when the header bugs were reported, Apple simply pointed at its guidance against custom bar backgrounds... so maybe just go transparent.&lt;/p&gt;

&lt;p&gt;📦 &lt;strong&gt;&lt;a href="https://github.com/software-mansion-labs/react-native-nano-icons" rel="noopener noreferrer"&gt;React Native Nano Icons 1.0&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The first stable release hot reloads edited SVGs through a Metro plugin, turns them into SF Symbols and VectorDrawables for native tab bars, and lets Reanimated animate their size and color... so nudging an icon no longer costs you a native rebuild.&lt;/p&gt;

&lt;p&gt;📦 &lt;strong&gt;&lt;a href="https://github.com/wcandillon/react-native-skia/releases/tag/v3.7.0" rel="noopener noreferrer"&gt;React Native Skia 3.7&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Eight releases in five days land Skia m157, and Android phones without Vulkan now get pointed back to v2 instead of crashing... the Graphite herd leaves nobody behind on the savanna.&lt;/p&gt;

&lt;p&gt;📦 &lt;strong&gt;&lt;a href="https://github.com/natew/react-native-gpui" rel="noopener noreferrer"&gt;react-native-gpui&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Nate (&lt;a href="https://x.com/natebirdman" rel="noopener noreferrer"&gt;@natebirdman&lt;/a&gt;) renders React Native components with GPUI, the GPU-accelerated Rust framework behind the Zed editor, straight into a Metal window on the Mac... no browser, no Electron, and Apple Silicon only for now.&lt;/p&gt;

&lt;p&gt;📦 &lt;strong&gt;&lt;a href="https://beui.dev/react-native" rel="noopener noreferrer"&gt;beUI for React Native&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Saurabh (&lt;a href="https://x.com/saurra3h" rel="noopener noreferrer"&gt;@saurra3h&lt;/a&gt;) brought 45 free animated components built on Reanimated, Gesture Handler and Uniwind, and &lt;code&gt;npx beui-native add tabs&lt;/code&gt; copies one straight into your app... you own the code, and the bugs.&lt;/p&gt;

&lt;p&gt;📦 &lt;strong&gt;&lt;a href="https://reactnative.directory/package/rn-build-doctor" rel="noopener noreferrer"&gt;rn-build-doctor&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Priyanka (&lt;a href="https://x.com/lassiecoder" rel="noopener noreferrer"&gt;@lassiecoder&lt;/a&gt;) built an offline tool that reads your React Native or Expo build or crash log and tells you the real cause, with evidence and next steps... it reads the whole Gradle stack trace so you don’t have to.&lt;/p&gt;

&lt;p&gt;📦 &lt;strong&gt;&lt;a href="https://expo.dev/blog/teamreach-ota-updates-relaunch" rel="noopener noreferrer"&gt;Relaunching TeamReach&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Gene Cornfield wrote up moving 5,000,000 active users to a rebuilt Expo app overnight, then shipping twelve OTA updates in three days to fix what testing missed... and the whole rescue cost about $4,000.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1u8e2uxcjk3hl12pd48z.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1u8e2uxcjk3hl12pd48z.gif" alt="Goodbye GIF" width="480" height="360"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Authored by &lt;a href="https://www.linkedin.com/in/lukebrandonfarrell/" rel="noopener noreferrer"&gt;Luke Farrell&lt;/a&gt; and edited by &lt;a href="http://www.linkedin.com/in/francisco-rios-nino" rel="noopener noreferrer"&gt;Fran Ríos&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you’re enjoying this newsletter, why not help us grow? Share it with your friends, family, and even that one coworker who always “forgets” to update dependencies. Use this link: &lt;a href="https://thereactnativerewind.com/" rel="noopener noreferrer"&gt;https://thereactnativerewind.com/&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>reactnative</category>
      <category>javascript</category>
      <category>mobile</category>
      <category>expo</category>
    </item>
    <item>
      <title>The Great Graphite Migration, Derek Joins Fat Fighters, and a Leaderboard for Your Dependency Tree</title>
      <dc:creator>The React Native Rewind</dc:creator>
      <pubDate>Wed, 14 Oct 2026 13:00:00 +0000</pubDate>
      <link>https://dev.to/thereactnativerewind/the-great-graphite-migration-derek-joins-fat-fighters-and-a-leaderboard-for-your-dependency-tree-1037</link>
      <guid>https://dev.to/thereactnativerewind/the-great-graphite-migration-derek-joins-fat-fighters-and-a-leaderboard-for-your-dependency-tree-1037</guid>
      <description>&lt;p&gt;You’re reading The React Native Rewind &lt;a href="https://thereactnativerewind.com/issues/the-great-graphite-migration-derek-joins-fat-fighters-and-a-leaderboard-for-your-dependency-tree" rel="noopener noreferrer"&gt;#61&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Great Graphite Migration
&lt;/h2&gt;

&lt;p&gt;Out on the open plains of React Native, a great change is underway...&lt;/p&gt;

&lt;p&gt;William Candillon (&lt;a href="https://x.com/wcandillon" rel="noopener noreferrer"&gt;@wcandillon&lt;/a&gt;) has released React Native Skia 3.0, and he announced it with a stream called Hello Graphite.&lt;/p&gt;

&lt;p&gt;The renderer now runs on WebGPU (&lt;em&gt;WebGL is a browser version of OpenGL, which is how web pages draw 3D graphics&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;OpenGL, the herd leader for decades, has been driven out of the group.&lt;/p&gt;

&lt;p&gt;OpenGL is the old graphics API that phones have relied on to draw every pixel on screen for as long as anyone can remember.&lt;/p&gt;

&lt;p&gt;Skia is the 2D graphics engine used by Chrome, Android and Flutter, and it is the engine of choice for some of the mightiest apps on the planet.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/wcandillon/react-native-skia" rel="noopener noreferrer"&gt;React Native Skia&lt;/a&gt; brings that engine to React Native, so you can draw shapes, text, images and shaders onto a &lt;code&gt;&amp;lt;Canvas&amp;gt;&lt;/code&gt; using ordinary React components.&lt;/p&gt;

&lt;p&gt;Observe, here, a small shader, drawn with Skia’s web build (CanvasKit).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;effect&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;CanvasKit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;RuntimeEffect&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Make&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`
  uniform float2 size;
  uniform float time;
  half4 main(float2 xy) {
    float d = length(xy / size - 0.5);
    float rings = sin(d * 40.0 - time * 4.0) * 0.5 + 0.5;
    half3 orange = half3(0.973, 0.659, 0.137);
    return half4(orange * rings + half3(0.08) * (1.0 - rings), 1.0);
  }`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;paint&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setShader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;effect&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;makeShader&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="nx"&gt;W&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;H&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;]));&lt;/span&gt;
&lt;span class="nx"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;drawRect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;CanvasKit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;XYWHRect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;W&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;H&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nx"&gt;paint&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;drawCircle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;W&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;H&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;PI&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nx"&gt;stroke&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And there they are, rippling rings surrounding a pulsing circle, the wild rings of a wild developer.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fybdd74e4wn9r6ftore8c.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fybdd74e4wn9r6ftore8c.gif" alt="Skia shader rings" width="300" height="300"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;So what changed in 3.0?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Skia’s backend, the part that converts “draw a circle” into GPU instructions, was once Ganesh, which is not the Hindu god, though it was also based on OpenGL.&lt;/p&gt;

&lt;p&gt;Version 3.0 replaces Ganesh with &lt;a href="https://skia.org/docs/user/graphite/" rel="noopener noreferrer"&gt;Graphite&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Graphite runs on Dawn, Google’s WebGPU implementation, and Dawn talks to Metal on Apple devices and to Vulkan on Android.&lt;/p&gt;

&lt;p&gt;As William points out, Graphite fixes the stability and performance problems of the OpenGL design, which had been struggling on the savanna for years.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;But why should a developer care?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Because the first win is multithreading by default. Drawings can be recorded on any thread, and only the finished frame is allowed to reach the UI thread.&lt;/p&gt;

&lt;p&gt;The second win is that Skia and &lt;a href="https://github.com/wcandillon/react-native-webgpu" rel="noopener noreferrer"&gt;React Native WebGPU&lt;/a&gt; now share the same GPU device.&lt;/p&gt;

&lt;p&gt;A texture, an image held in GPU memory, passes between them without being copied, which is nothing short of a miracle in the GPU world.&lt;/p&gt;

&lt;p&gt;The docs include a recipe for drawing a three.js scene inside a Skia canvas.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;device&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;importDevice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Skia&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getNativeDevice&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;target&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;makeOffscreenTarget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;device&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;width&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;height&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;renderer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;THREE&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;WebGPURenderer&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;context&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;device&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;renderer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;init&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nx"&gt;renderer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setAnimationLoop&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;renderer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;scene&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;camera&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;previous&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="c1"&gt;// Same GPU device, so the frame is wrapped, not copied&lt;/span&gt;
  &lt;span class="nx"&gt;image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Skia&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;MakeImageFromGPUTexture&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;texture&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;previous&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nf"&gt;dispose&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The scene arrives as a plain &lt;code&gt;&amp;lt;Image&amp;gt;&lt;/code&gt; inside your &lt;code&gt;&amp;lt;Canvas&amp;gt;&lt;/code&gt;, ready for blurs, shaders and text to be stacked on top.&lt;/p&gt;

&lt;p&gt;Video and camera frames receive the same zero-copy treatment, which is kinder to the battery, and the battery is the most vulnerable creature in the whole ecosystem.&lt;/p&gt;

&lt;p&gt;The community did not wait for permission.&lt;/p&gt;

&lt;p&gt;Paul Nguyen (&lt;a href="https://x.com/paulNguyenJS" rel="noopener noreferrer"&gt;@paulNguyenJS&lt;/a&gt;) combined Skia v3, React Native WebGPU and Reanimated 4 to turn the Dynamic Island into a UFO.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9t9xg79oravs4yac719w.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9t9xg79oravs4yac719w.gif" alt="Dynamic Island UFO" width="480" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where did @shopify go?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Version 3 is published as &lt;code&gt;react-native-skia&lt;/code&gt;, while &lt;code&gt;@shopify/react-native-skia&lt;/code&gt; stops at 2.14, like a pride of lions that has walked off the map.&lt;/p&gt;

&lt;p&gt;The repository now lives on William’s GitHub, and the drawing API is unchanged, so most apps only need to rename imports and bump platform versions.&lt;/p&gt;

&lt;p&gt;OpenGL had a long reign on the savanna...&lt;/p&gt;

&lt;p&gt;But the Graphite herd has moved on, and nobody is going back to the water hole for it.&lt;/p&gt;

&lt;p&gt;Goodbye, OpenGL.&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://github.com/wcandillon/react-native-skia" rel="noopener noreferrer"&gt;React Native Skia&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F44losl5ag3hwd1hnjeti.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F44losl5ag3hwd1hnjeti.jpg" alt="Woman yelling at cat meme" width="800" height="553"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Derek, Welcome to Fat Fighters
&lt;/h2&gt;

&lt;p&gt;You asked React Native for a View...&lt;/p&gt;

&lt;p&gt;And it sent 448 files, 80,000 lines of JavaScript, a Slider, a DatePicker, a Switch, and a Modal your app never used.&lt;/p&gt;

&lt;p&gt;We didn’t break up with my exes to be dragging all that extra luggage around.&lt;/p&gt;

&lt;p&gt;So come on now, that is a lot to carry for a single View.&lt;/p&gt;

&lt;p&gt;Davyd NRB, who goes by &lt;a href="https://x.com/tell_me_mur" rel="noopener noreferrer"&gt;@tell_me_mur&lt;/a&gt; on X, wrote a Babel plugin called &lt;a href="https://github.com/retyui/babel-plugin-react-native-direct-imports" rel="noopener noreferrer"&gt;babel-plugin-react-native-direct-imports&lt;/a&gt;, which rewrites each &lt;code&gt;react-native&lt;/code&gt; import so that importing &lt;code&gt;View&lt;/code&gt; pulls in only the &lt;code&gt;View&lt;/code&gt; file.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Right, so what does that actually mean?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The plugin changes every &lt;code&gt;react-native&lt;/code&gt; import so that it points straight at the file where that component is defined.&lt;/p&gt;

&lt;p&gt;Let’s look at the problem first, shall we?&lt;/p&gt;

&lt;p&gt;When you write &lt;code&gt;import { View } from 'react-native'&lt;/code&gt;, you are importing from &lt;code&gt;react-native/index.js&lt;/code&gt;, which is a barrel (one file that re-exports everything in the package).&lt;/p&gt;

&lt;p&gt;That barrel uses CommonJS, with a lazy &lt;code&gt;require()&lt;/code&gt; getter for each public API, so bundlers cannot tree-shake the barrel, which means they cannot drop the parts of React Native that your app never touches.&lt;/p&gt;

&lt;p&gt;So one &lt;code&gt;View&lt;/code&gt; drags all of React Native into your bundle, &lt;code&gt;PushNotificationIOS&lt;/code&gt; included, and you never once asked for &lt;code&gt;PushNotificationIOS&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Now, what does the plugin actually do about it?&lt;/p&gt;

&lt;p&gt;At build time, the plugin swaps the barrel import for direct requires of the underlying modules.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;View&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;AppRegistry&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Systrace&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-native&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// ↓ becomes&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;View&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-native/Libraries/Components/View/View&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;AppRegistry&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-native/Libraries/ReactNative/AppRegistry&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;AppRegistry&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Systrace&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-native/Libraries/Performance/Systrace&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When we ran version 1.1.0 with a three-name import and the 0.87.1 map, the result was:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2ac51mkyhlki3gp4dztf.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2ac51mkyhlki3gp4dztf.gif" alt="Direct imports demo" width="800" height="330"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now for the numbers, and yes, there are numbers.&lt;/p&gt;

&lt;p&gt;The author built an iOS app that imports only &lt;code&gt;ReactNativeVersion&lt;/code&gt;, then bundled it twice, once without the plugin and once with it.&lt;/p&gt;

&lt;p&gt;Without the plugin, the bundle came to 711.93 KB.&lt;/p&gt;

&lt;p&gt;With the plugin, the bundle shrank to 10.62 KB.&lt;/p&gt;

&lt;p&gt;Here are the two bundle reports side by side.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Felya7lokvm38flkayejj.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Felya7lokvm38flkayejj.jpg" alt="Bundle size before and after" width="800" height="383"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It’s a toy app, so your real savings will be smaller, mostly because you’ll be importing more of React Native on purpose, hopefully.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Right, how do you get on the plan?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Install the plugin as a dev dependency, add it to your &lt;code&gt;babel.config.js&lt;/code&gt; with the exact React Native version you have, and turn off the deep-import warnings in the preset.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;presets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;module:@react-native/babel-preset&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;disableDeepImportWarnings&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;}],&lt;/span&gt;
  &lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;plugins&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;NODE_ENV&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;test&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-native-direct-imports&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;reactNativeVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-native/package.json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;version&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Boolean&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then clear the Metro cache once, with either &lt;code&gt;npx react-native start --reset-cache&lt;/code&gt; or &lt;code&gt;npx expo start --clear&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Any catches?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yes, and the catch is the upgrade.&lt;/p&gt;

&lt;p&gt;The plugin writes React Native’s internal file paths into your build, and those paths change between releases.&lt;/p&gt;

&lt;p&gt;Each version from 0.70.0 has its own map, and the build fails unless your React Native version matches one of those maps exactly.&lt;/p&gt;

&lt;p&gt;So every React Native upgrade now needs two steps. Upgrade React Native, then upgrade &lt;code&gt;babel-plugin-react-native-direct-imports&lt;/code&gt; to the matching version.&lt;/p&gt;

&lt;p&gt;Skip the second step and the build fails with an error that never mentions the plugin, so you’ll spend an afternoon rereading your config.&lt;/p&gt;

&lt;p&gt;Your bundle loses 700 KB, and your upgrade checklist gains a line.&lt;/p&gt;

&lt;p&gt;Now, let’s all say it together…&lt;/p&gt;

&lt;p&gt;Bye bye, fatty bundle!&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://github.com/retyui/babel-plugin-react-native-direct-imports" rel="noopener noreferrer"&gt;babel-plugin-react-native-direct-imports&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdf5kukr7569o6azvfwm0.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdf5kukr7569o6azvfwm0.jpg" alt="Scientist myself meme" width="800" height="640"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;📦 &lt;strong&gt;&lt;a href="https://github.com/react/react-native/releases/tag/v0.88.0-rc.4" rel="noopener noreferrer"&gt;React Native 0.88.0-rc.4&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;TypeScript module augmentation can now extend generated props and style types, and an Android &lt;code&gt;Pressable&lt;/code&gt; that went half-untappable after being disabled and re-enabled finally gets its fingers back... stable 0.88 is scheduled for October 12, so this might be the final dress rehearsal.&lt;/p&gt;

&lt;p&gt;📦 &lt;strong&gt;&lt;a href="https://github.com/tamagui/tamagui/releases/tag/v3.0.0" rel="noopener noreferrer"&gt;Tamagui 3.0&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A new C++ native runtime pushes theme changes straight to native views through Fabric without re-rendering React, plus flat style props, React Strict DOM and Tailwind classes... and the release notes politely suggest you hand the upgrade guide to your coding agent.&lt;/p&gt;

&lt;p&gt;📦 &lt;strong&gt;&lt;a href="https://github.com/wcandillon/react-native-skia/releases/tag/v3.4.0" rel="noopener noreferrer"&gt;React Native Skia 3.4&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;William Candillon (&lt;a href="https://x.com/wcandillon" rel="noopener noreferrer"&gt;@wcandillon&lt;/a&gt;) moved Skia 3 onto Graphite, so Android now draws with Vulkan instead of OpenGL (minSdk is 26), and 3.4 brings Graphite and Dawn to tvOS... so your living room can finally render shaders nobody asked for.&lt;/p&gt;

&lt;p&gt;📦 &lt;strong&gt;&lt;a href="https://github.com/software-mansion/react-native-screens/releases/tag/4.29.0" rel="noopener noreferrer"&gt;React Native Screens 4.29.0&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;iOS Tabs move to Apple's UITab API on iOS 26.1+, picking up a search tab, sidebar placement for iOS 27 and custom tab icons... while Android fragments learn to leave the room without crashing.&lt;/p&gt;

&lt;p&gt;📦 &lt;strong&gt;&lt;a href="https://github.com/callstack/react-native-testing-library/releases/tag/v14.1.0" rel="noopener noreferrer"&gt;React Native Testing Library 14.1&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Maciej Jastrzębski (&lt;a href="https://x.com/mdj_dev" rel="noopener noreferrer"&gt;@mdj_dev&lt;/a&gt;) shipped &lt;code&gt;userEvent.pullToRefresh()&lt;/code&gt;, &lt;code&gt;accessibilityAction()&lt;/code&gt;, &lt;code&gt;fireEvent.layout()&lt;/code&gt; and a warning when your test pokes a disabled element... plus React Native 0.88 and React 19.3 support.&lt;/p&gt;

&lt;p&gt;📦 &lt;strong&gt;&lt;a href="https://github.com/jpudysz/react-native-unistyles/releases/tag/v3.5.0" rel="noopener noreferrer"&gt;Unistyles 3.5&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A stability release where theme changes finally reach the components they were skipping, reload memory leaks get plugged, and unfreezing a screen no longer blocks JS for whole seconds.&lt;/p&gt;

&lt;p&gt;📦 &lt;strong&gt;&lt;a href="https://github.com/expo/eas-cli/releases/tag/v24.12.0" rel="noopener noreferrer"&gt;EAS CLI 24.12&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;eas update:view --json&lt;/code&gt; now hands back signed source map and asset map URLs, and 24.11 added browser device login with resumable commands for chat agents... so even your coding agent has to sign in now.&lt;/p&gt;

&lt;p&gt;📦 &lt;strong&gt;&lt;a href="https://github.com/callstack/react-native-brownfield/releases/tag/brownfield%405.3.0" rel="noopener noreferrer"&gt;React Native Brownfield 5.3&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;npm create @callstack/react-native-brownfield&lt;/code&gt; scaffolds packaging targets into an existing React Native CLI project, and 5.2 added Expo SDK 58 and AGP 9 support for the apps that only let React Native in through the side door.&lt;/p&gt;

&lt;p&gt;📦 &lt;strong&gt;&lt;a href="https://github.com/munimtechnologies/munim-maps" rel="noopener noreferrer"&gt;munim-maps&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Sheehan Munim (&lt;a href="https://x.com/sheehanmunim" rel="noopener noreferrer"&gt;@sheehanmunim&lt;/a&gt;) put animated 3D cars, rockets, satellites and people on their actual floor onto Apple Maps with Nitro Modules... and it also speaks Google Maps, Mapbox, MapLibre and Cesium.&lt;/p&gt;

&lt;p&gt;📦 &lt;strong&gt;&lt;a href="https://github.com/SectionTN/react-native-inkpad" rel="noopener noreferrer"&gt;react-native-inkpad&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Mohamed Rayen Sbai (&lt;a href="https://x.com/WeskerTN" rel="noopener noreferrer"&gt;@WeskerTN&lt;/a&gt;) built a native ink canvas on &lt;a href="http://androidx.ink" rel="noopener noreferrer"&gt;androidx.ink&lt;/a&gt; and PencilKit with pen, marker, highlighter and eraser, and no WebView... coming from react-native-signature-canvas means changing one import.&lt;/p&gt;

&lt;p&gt;📦 &lt;strong&gt;&lt;a href="https://github.com/osuki-dev/skia-diagrams" rel="noopener noreferrer"&gt;skia-diagrams&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://x.com/ryuhzk" rel="noopener noreferrer"&gt;@ryuhzk&lt;/a&gt; renders Mermaid diagrams natively with Skia 3, with themes, animations and pan/zoom across 31 flowchart types... not a WebView in sight.&lt;/p&gt;

&lt;p&gt;📦 &lt;strong&gt;&lt;a href="https://reactnative.directory" rel="noopener noreferrer"&gt;React Native Directory&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://x.com/Simek" rel="noopener noreferrer"&gt;@Simek&lt;/a&gt; added a /stats page, a list of which packages depend on a package, and &lt;a href="http://AGENTS.md" rel="noopener noreferrer"&gt;AGENTS.md&lt;/a&gt; previews... finally a leaderboard for your dependency tree.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqxhniomg3zylzp2zlbk7.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqxhniomg3zylzp2zlbk7.gif" alt="Goodbye GIF" width="498" height="336"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Authored by &lt;a href="https://www.linkedin.com/in/lukebrandonfarrell/" rel="noopener noreferrer"&gt;Luke Farrell&lt;/a&gt; and edited by &lt;a href="http://www.linkedin.com/in/francisco-rios-nino" rel="noopener noreferrer"&gt;Fran Ríos&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you’re enjoying this newsletter, why not help us grow? Share it with your friends, family, and even that one coworker who always “forgets” to update dependencies. Use this link: &lt;a href="https://thereactnativerewind.com/" rel="noopener noreferrer"&gt;https://thereactnativerewind.com/&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>reactnative</category>
      <category>javascript</category>
      <category>mobile</category>
      <category>expo</category>
    </item>
    <item>
      <title>A Cute Beret With Root Access</title>
      <dc:creator>The React Native Rewind</dc:creator>
      <pubDate>Mon, 12 Oct 2026 17:34:16 +0000</pubDate>
      <link>https://dev.to/thereactnativerewind/a-cute-beret-with-root-access-2f1m</link>
      <guid>https://dev.to/thereactnativerewind/a-cute-beret-with-root-access-2f1m</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0ana3j0aznm07az942ku.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0ana3j0aznm07az942ku.jpg" alt="5.this-is-fine-agent-rm-rf-meme.jpg" width="799" height="495"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At OpenAI's DevDay on September 29, there were many announcements.&lt;/p&gt;

&lt;p&gt;But the one that will get the most screen time is a fluffy blob wearing a beret…&lt;/p&gt;

&lt;p&gt;Because Silicon Valley has finally admitted its ideal coworker is a plush toy with root access.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0gmqvktmd03bx1v32e2v.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0gmqvktmd03bx1v32e2v.jpg" alt="6.dots-art-card.jpg" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://openai.com/index/introducing-dots/" rel="noopener noreferrer"&gt;Dots&lt;/a&gt; are always-on agents, driven by GPT-6 Astra, which work for you round the clock.&lt;/p&gt;

&lt;p&gt;You name your dot, link your apps, and then talk to it as you would to a colleague who never logs off, never steals your milk, and never “circles back” after quietly doing nothing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Well, what is a dot then?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Imagine OpenAI just copied &lt;a href="https://x.ai/bot" rel="noopener noreferrer"&gt;Grok Bot&lt;/a&gt;… well…&lt;/p&gt;

&lt;p&gt;Each dot is given its own cloud computer together with its own browser, and is able to access more than 4,000 apps via OpenAI's plugins.&lt;/p&gt;

&lt;p&gt;You can message it through ChatGPT, Slack or Teams, or just call it &lt;del&gt;when you are missing your ex&lt;/del&gt; whenever typing seems like too much of an effort.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fod3dxgq9m9mkbymlae1v.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fod3dxgq9m9mkbymlae1v.jpg" alt="7.dots-how-it-works.jpg" width="800" height="613"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you're not talking to it, it carries out what OpenAI refers to as "proactive research" in the background…&lt;/p&gt;

&lt;p&gt;Which is corporate for “it is already in your Calendar judging your life choices.”&lt;/p&gt;

&lt;p&gt;It does this using read-only tools, so it can browse around your apps without sending any messages or making any changes.&lt;/p&gt;

&lt;p&gt;Technically stalking… but with a compliance stamp.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What does that mean for developers?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;OpenAI's developer example is a dot that monitors customer feedback, identifies minor fixes, develops and tests them, and then brings you completed pull requests with videos attached.&lt;/p&gt;

&lt;p&gt;Your backlog just got a new predator.&lt;/p&gt;

&lt;p&gt;Below, a dot named Iggy notices that an app's iOS beta checklist can no longer be found after the most recent deployment, offers to restore it, and has the fix ready for review before any code is merged.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8b9f5fat4ly1fq3qfepz.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8b9f5fat4ly1fq3qfepz.jpg" alt="8.dots-iggy-ios-beta-checklist-fix.jpg" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Meanwhile, your human teammate is still opening Jira…&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who decides what it's allowed to do?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Before the dot carries out any action which could affect your accounts or involve sharing information, auto-review checks it against your instructions, your Custom Rules and OpenAI's safety requirements.&lt;/p&gt;

&lt;p&gt;You can see everything it does, including the background work, in Activity View, which is either transparency or a highlight reel of how replaceable you are.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can we get one?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Dots are being made available to Pro and Business Premium users.&lt;/p&gt;

&lt;p&gt;And Enterprise admins can turn on a beta… presumably after a 47-slide security review titled:&lt;/p&gt;

&lt;p&gt;“What If The Beret Goes Rogue.”&lt;/p&gt;

&lt;p&gt;OpenAI is also running trials of specialist dots for companies, each of which has its own identity and access, and bringing them to Microsoft Agent 365.&lt;/p&gt;

&lt;p&gt;Because nothing says “future of work” like a fluffy blob inside a Microsoft admin centre.&lt;/p&gt;

&lt;p&gt;If I get one, I'm picking the frog!&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://openai.com/index/introducing-dots/" rel="noopener noreferrer"&gt;Dots&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Want more from The Agentic Rewind #1?&lt;/strong&gt; The full issue also covers Callstack's Apex (the Pixel Canary reveal) and this week's pack of agent links.&lt;/p&gt;

&lt;p&gt;👉 Subscribe free at &lt;a href="https://theagenticrewind.com/" rel="noopener noreferrer"&gt;theagenticrewind.com&lt;/a&gt; and get every issue in your inbox.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;From The Agentic Rewind #1. Read the full issue &lt;a href="https://www.theagenticrewind.com/issues/mystery-canaries-beret-wearing-blobs-and-an-opus-bill-filing-for-emotional-support" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>openai</category>
      <category>programming</category>
    </item>
    <item>
      <title>Scooby-Doo, It’s Just Apex!</title>
      <dc:creator>The React Native Rewind</dc:creator>
      <pubDate>Wed, 07 Oct 2026 17:06:22 +0000</pubDate>
      <link>https://dev.to/thereactnativerewind/scooby-doo-its-just-apex-part1-1kg1</link>
      <guid>https://dev.to/thereactnativerewind/scooby-doo-its-just-apex-part1-1kg1</guid>
      <description>&lt;p&gt;At the end of September…&lt;/p&gt;

&lt;p&gt;A mystery model known as Pixel Canary appeared on Vercel AI Gateway.&lt;/p&gt;

&lt;p&gt;On October 1, it removed the mask in Scooby-Doo fashion and turned out to be &lt;a href="https://www.callstack.com/" rel="noopener noreferrer"&gt;Callstack&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;And we would have gotten away with it too, if it weren’t for you meddling benchmarkers!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs8x6pm1a1p0vrkiy5ezh.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs8x6pm1a1p0vrkiy5ezh.gif" alt="1.apex-run-live.gif" width="798" height="196"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pixel Canary is &lt;a href="https://apex.callstack.com" rel="noopener noreferrer"&gt;Apex&lt;/a&gt;, a coding model designed for everyday agent tasks, and it is now available to the public.&lt;/p&gt;

&lt;p&gt;The model is particularly strong in React Native and Next.js, which is either a coincidence or the most transparent flex since someone named a crypto coin after themselves.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What did it build while it was undercover?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;During the stealth week, Michał Pierzchała (&lt;a href="https://x.com/thymikee" rel="noopener noreferrer"&gt;@thymikee&lt;/a&gt;) asked it to cook “something” overnight in &lt;a href="https://opencode.ai/" rel="noopener noreferrer"&gt;OpenCode&lt;/a&gt; and came back to a SpaceX launch tracker… which is the agentic equivalent of leaving a teenager alone with DoorDash and finding a Michelin reservation.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fatkrccd6fo4nrv4pkctc.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fatkrccd6fo4nrv4pkctc.gif" alt="2.apex-orbit-watch.gif" width="720" height="543"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It's called Orbit Watch, featuring a Skia globe, Reanimated worklets and native tabs on Expo 57, and it used &lt;a href="https://github.com/callstack/agent-device" rel="noopener noreferrer"&gt;agent-device&lt;/a&gt; (&lt;em&gt;an open-source CLI that lets AI agents control and test your app on iOS and Android devices&lt;/em&gt;) to verify its own work.&lt;/p&gt;

&lt;p&gt;Pixel Canary got through over 200 billion tokens in just five days.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;But… is it any good?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;On the React Native evals, it lands within a point of Claude Opus 5.5 and outperforms GPT-6.1 Sol, all at about a quarter of the cost of a full Opus run.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8cmfm2zdrye4w1juft4y.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8cmfm2zdrye4w1juft4y.jpg" alt="3.apex-rn-evals.jpg" width="800" height="613"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On the Next.js evals carried out by Vercel, it completed 28 out of 31 tasks, matching GPT-6 Astra on high effort, and 30 out of 31 with the Next.js docs in &lt;code&gt;AGENTS.md&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Reading the docs still works… who would have guessed!?&lt;/p&gt;

&lt;p&gt;Callstack also tested code review on the Expensify repo using both Apex and Opus 5.5.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fc5ubu79pzqmkxhc1ycvw.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fc5ubu79pzqmkxhc1ycvw.jpg" alt="4.apex-expensify-review.jpg" width="799" height="513"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It's one run only, not a benchmark, but the fact that it's six times faster and 85% cheaper is difficult to ignore…&lt;/p&gt;

&lt;p&gt;Unless your personality is powered exclusively by &lt;a href="https://en.wikipedia.org/wiki/Vendor_lock-in" rel="noopener noreferrer"&gt;vendor lock-in&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What does it cost, and how do we use it?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The rate is 50 cents per million input tokens, 20 cents for cached input and $3.00 per million output tokens, compared to $20 per million output tokens for Opus 5.5.&lt;/p&gt;

&lt;p&gt;It has a 256K context window and an API that is compatible with both OpenAI and Anthropic, enabling tools such as Claude Code, Cursor and Codex to use it without rewriting your entire religion.&lt;/p&gt;

&lt;p&gt;Run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx @callstack/apex init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And it will locate the coding tools on your machine and point them at Apex.&lt;/p&gt;

&lt;p&gt;In the past, canaries were sent down the mines to warn the miners when there was a problem.&lt;/p&gt;

&lt;p&gt;This one goes into your codebase…&lt;/p&gt;

&lt;p&gt;The only warning it gives is about your Opus bill.&lt;/p&gt;

&lt;p&gt;And hopefully you don’t find it dead after a few hours of intense work,&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://apex.callstack.com" rel="noopener noreferrer"&gt;Apex&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Want the rest of The Agentic Rewind #1?&lt;/strong&gt; Part 2 covers OpenAI's beret-wearing Dots, plus this week's pack of agent links (GPT-6.1 Sol, Claude Sonnet 5.5, Pi 1.0 and more).&lt;/p&gt;

&lt;p&gt;👉 Subscribe free at &lt;a href="https://theagenticrewind.com/" rel="noopener noreferrer"&gt;theagenticrewind.com&lt;/a&gt; and get every issue in your inbox.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This is #Part1 of The Agentic Rewind #1. Read the full issue &lt;a href="https://www.theagenticrewind.com/issues/mystery-canaries-beret-wearing-blobs-and-an-opus-bill-filing-for-emotional-support" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>reactnative</category>
      <category>programming</category>
    </item>
    <item>
      <title>Mega Carrots for Monty, Angular Through the Sliding Door, and Lynx on Foldables</title>
      <dc:creator>The React Native Rewind</dc:creator>
      <pubDate>Wed, 07 Oct 2026 13:00:00 +0000</pubDate>
      <link>https://dev.to/thereactnativerewind/mega-carrots-for-monty-angular-through-the-sliding-door-and-lynx-on-foldables-ck7</link>
      <guid>https://dev.to/thereactnativerewind/mega-carrots-for-monty-angular-through-the-sliding-door-and-lynx-on-foldables-ck7</guid>
      <description>&lt;p&gt;You're reading The React Native Rewind &lt;a href="https://thereactnativerewind.com/issues/mega-carrots-for-monty-angular-through-the-sliding-door-and-lynx-on-foldables" rel="noopener noreferrer"&gt;#60&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fj5fnaub9mn5bizu68x6z.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fj5fnaub9mn5bizu68x6z.jpg" alt="0.batman-robin-plus-one-square" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Swipe Right on Codex, Neeee-igh!
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://openai.com/index/introducing-the-codex-app/" rel="noopener noreferrer"&gt;Codex&lt;/a&gt; (&lt;em&gt;OpenAI's coding agent&lt;/em&gt;) has long been quite good at writing mobile code.&lt;/p&gt;

&lt;p&gt;It just never got the opportunity to see the app that it was writing.&lt;/p&gt;

&lt;p&gt;On October 2, Callstack and Margelo launched &lt;a href="https://www.callstack.com/blog/introducing-mobile-dev-full-mobile-dev-tooling-right-in-your-codex-app" rel="noopener noreferrer"&gt;Mobile Dev&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;A plugin which places live iOS and Android devices right beside the Codex desktop chat.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4smaxr9j0394xu463kmi.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4smaxr9j0394xu463kmi.jpg" alt="1.codex-mobile-dev-horsetinder.jpg" width="706" height="780"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That's Monty, aged 9, on the iPhone simulator and Juniper, aged 5, on the Android emulator, both of them on a demo dating app known as HorseTinder.&lt;/p&gt;

&lt;p&gt;We won't inquire as to why horses need a dating app…&lt;/p&gt;

&lt;p&gt;We have seen weirder things at this point.&lt;/p&gt;

&lt;p&gt;Monty is taking a mirror selfie in a hoodie, so really he's doing better than most of us.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;So what can Codex do with a device?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It can boot simulators and emulators, tap, drag and type, and read the accessibility tree using MCP tools (&lt;em&gt;Model Context Protocol, the standard method for agents to call tools; at some point we should asume you already know this… maybe today xd&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;You can also click on any item on the screen and leave a note, which in React Native apps, includes the component together with its source file.&lt;/p&gt;

&lt;p&gt;Here, someone selects the Super Like star and requests a "Mega Carrot" in orange.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fme63yr242vgb99i3m4gy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fme63yr242vgb99i3m4gy.gif" alt="2.codex-mobile-dev-mega-carrot-annotation.gif" width="760" height="520"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Codex makes edits to two files, so the star becomes a carrot…&lt;/p&gt;

&lt;p&gt;And Monty is presumably able to attract a better sort of match.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What happens when it crashes?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Metro's console, iOS unified logs, Android logcat all end up in a single panel, and an error can be sent directly to the chat.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Foclu0mdh74bn44aow7po.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Foclu0mdh74bn44aow7po.jpg" alt="3.codex-mobile-dev-logs-panel.jpg" width="687" height="411"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;And performance?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Ask it to record an interaction and it will capture the CPU and memory, then draw the charts directly in the chat. The image below shows 30 seconds of card swiping on an iPhone 17 Pro simulator, with the CPU reaching a peak of 22.7%.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqshee0lamxklhkn5bns1.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqshee0lamxklhkn5bns1.jpg" alt="4.codex-mobile-dev-cpu-memory-charts.jpg" width="800" height="529"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do you get it?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You need the Codex desktop app on an Apple Silicon Mac, plus Xcode 26 or later (&lt;em&gt;Xcode 27 if you want to use physical iPhones&lt;/em&gt;).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Add Callstack's marketplace, pinned to the release branch&lt;/span&gt;
&lt;span class="nv"&gt;GH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https://github.com/callstackincubator
codex plugin marketplace add &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nv"&gt;$GH&lt;/span&gt;/codex-mobile-dev-plugin.git &lt;span class="nt"&gt;--ref&lt;/span&gt; release/latest
codex plugin add mobile-dev@mobile-dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It is based on MCP Apps and on the plugin extensions that OpenAI announced at DevDay.&lt;/p&gt;

&lt;p&gt;And it will soon be available on the Codex plugin marketplace.&lt;/p&gt;

&lt;p&gt;Monty has still not found love…&lt;/p&gt;

&lt;p&gt;But now anyone who swipes right on him is going to get the Mega Carrot.&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://github.com/callstackincubator/codex-mobile-dev-plugin" rel="noopener noreferrer"&gt;Mobile Dev for Codex&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcok3buwt8no2wsg9agzw.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcok3buwt8no2wsg9agzw.jpg" alt="5.leo-pointing-conference-maintainer-meme.jpg" width="800" height="736"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Ay-oh, Another One Bites the Dust
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyuvazz9v1ttsmdhmqnmt.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyuvazz9v1ttsmdhmqnmt.jpg" alt="6.coinbase-leaving-react-native-linkedin.jpg" width="800" height="262"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Coinbase is pulling out of React Native after 5 years.&lt;/p&gt;

&lt;p&gt;Coinbase is also paying engineers to keep the React Native app in sync until the Swift and Kotlin apps are ready...&lt;/p&gt;

&lt;p&gt;So Coinbase is pulling out very slowly, which any SexEd teacher will tell you doesn't count.&lt;/p&gt;

&lt;p&gt;Adam Wolf, a Senior Engineering Manager there, says AI coding agents have "collapsed the cost of building a feature twice".&lt;/p&gt;

&lt;p&gt;While one tenant packed boxes, another moved in.&lt;/p&gt;

&lt;p&gt;Ashley Hunter (&lt;a href="https://x.com/ashh640" rel="noopener noreferrer"&gt;@ashh640&lt;/a&gt;) launched &lt;a href="https://ng-native.com" rel="noopener noreferrer"&gt;Angular Native&lt;/a&gt; on September 29.&lt;/p&gt;

&lt;p&gt;Angular apps that draw as real &lt;code&gt;UIView&lt;/code&gt; and &lt;code&gt;android.view.View&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;It’s built on Expo and React Native’s New Architecture…&lt;/p&gt;

&lt;p&gt;Wait… What!?&lt;/p&gt;

&lt;p&gt;Angular’s Renderer2 (&lt;em&gt;the layer that draws somewhere other than the browser DOM&lt;/em&gt;) feeds a small engine, &lt;code&gt;@ng-native/fabric&lt;/code&gt;, which talks straight to Fabric (&lt;em&gt;React Native’s C++ view renderer&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://svelte.dev/" rel="noopener noreferrer"&gt;Svelte&lt;/a&gt; (&lt;em&gt;a UI framework that compiles your components into plain JavaScript at build time, so there’s no virtual DOM runtime like React&lt;/em&gt;) shows up in the diagram below too…&lt;/p&gt;

&lt;p&gt;We’ll get to it in a minute.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxc8swtz56th47h2t3b26.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxc8swtz56th47h2t3b26.jpg" alt="7.angular-native-architecture.jpg" width="800" height="653"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You write ordinary Angular templates with &lt;code&gt;&amp;lt;view&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;text&amp;gt;&lt;/code&gt;, and &lt;code&gt;&amp;lt;pressable&amp;gt;&lt;/code&gt;, which output real React Native views, styled with real CSS and Tailwind (&lt;code&gt;ios:&lt;/code&gt; / &lt;code&gt;android:&lt;/code&gt; variants).&lt;/p&gt;

&lt;p&gt;And Angular isn’t the only unexpected guest at Lord Fabric’s table.&lt;/p&gt;

&lt;p&gt;Svelte isn’t “based on React Native” either…&lt;/p&gt;

&lt;p&gt;But &lt;a href="https://x.com/wobsoriano" rel="noopener noreferrer"&gt;@wobsoriano&lt;/a&gt; hooked Svelte 5’s custom renderer into that same &lt;code&gt;@ng-native/fabric&lt;/code&gt; engine.&lt;/p&gt;

&lt;p&gt;So Svelte ALSO gets real native views without writing its own Fabric bridge.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fceq6jvgmdcslkycgv0nk.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fceq6jvgmdcslkycgv0nk.gif" alt="8.svelte-native-ios-android-demo.gif" width="600" height="663"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That means… drum roll…&lt;/p&gt;

&lt;p&gt;Angular and Svelte can use Expo modules.&lt;/p&gt;

&lt;p&gt;Think… camera, notifications, file system, haptics, blur, image picker, audio…&lt;/p&gt;

&lt;p&gt;React Native is quietly becoming the native layer under everyone else’s frontend.&lt;/p&gt;

&lt;p&gt;Now the old king is dead!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=dvgZkm1xWPE" rel="noopener noreferrer"&gt;Long live React Native!&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://ng-native.com" rel="noopener noreferrer"&gt;Angular Native&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxx6vdbok21net0vdcu42.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxx6vdbok21net0vdcu42.jpg" alt="9.monkey-puppet-android-first-try-meme.jpg" width="800" height="575"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;📦&lt;/strong&gt; &lt;a href="https://github.com/react/react-native/releases/tag/v0.88.0-rc.3" rel="noopener noreferrer"&gt;React Native 0.88.0-rc.3&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The third RC bumps Hermes to kill a quadratic slowdown in lazy compilation, and stops SwiftPM autolinking from recreating library packages on every sync... which was quietly breaking Xcode for libraries that ship their own &lt;code&gt;Package.swift&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;📦&lt;/strong&gt; &lt;a href="https://lynxjs.org/next/blog/lynx-4-0" rel="noopener noreferrer"&gt;Lynx 4.0&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ByteDance's framework now adapts to foldables like the iPhone Duo, understands CSS media queries, and open-sources a Liquid Glass blur view plus a WebView... and despite the big version number, nothing breaks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;📦&lt;/strong&gt; &lt;a href="https://github.com/Fausto95/lucent" rel="noopener noreferrer"&gt;Lucent&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Write native modules in TypeScript, compile them to C++ via JSI, and skip Swift or Kotlin entirely... with an experimental mode that turns JSX into SwiftUI and Jetpack Compose, which is either the future or a very elaborate dare.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;📦&lt;/strong&gt; &lt;a href="https://github.com/react-navigation/react-navigation/releases/tag/%40react-navigation%2Fcore%407.23.0" rel="noopener noreferrer"&gt;React Navigation 7.23&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Satyajit Sahoo (&lt;a href="https://x.com/satya164" rel="noopener noreferrer"&gt;@satya164&lt;/a&gt;) added &lt;code&gt;tabBarRepeatedPressBehavior&lt;/code&gt; for when you tap the tab you're already on: scroll to top, pop the nested stack, or both... and the same option landed in the v8 alpha too.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;📦&lt;/strong&gt; &lt;a href="https://github.com/software-mansion/react-native-reanimated/releases/tag/4.7.1" rel="noopener noreferrer"&gt;Reanimated 4.7.1&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Stability fixes for layout animations and shared element transitions, a handful of Android crashes, and sync prop updates that stop snapping back when a sibling's &lt;code&gt;zIndex&lt;/code&gt; shuffles the deck.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;📦&lt;/strong&gt; &lt;a href="https://github.com/microsoft/react-native-macos/releases/tag/react-native-macos%400.83.0" rel="noopener noreferrer"&gt;React Native macOS 0.83&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Microsoft synced react-native-macos with React Native 0.83.10, the first 0.83 for Mac... desktop is only four versions behind, which for desktop counts as keeping up.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;📦&lt;/strong&gt; &lt;a href="https://github.com/expo/expo/releases/tag/expo-modules-cli%400.2.0" rel="noopener noreferrer"&gt;expo-modules-cli 0.2.0&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tomasz Sapeta (&lt;a href="https://x.com/tsapeta" rel="noopener noreferrer"&gt;@tsapeta&lt;/a&gt;) added &lt;code&gt;generate-types&lt;/code&gt;, which writes TypeScript types for your Expo module straight from its Swift... so they come from what native actually exports, not what you remember.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;📦&lt;/strong&gt; &lt;a href="https://github.com/expo/eas-cli/releases/tag/v24.10.0" rel="noopener noreferrer"&gt;EAS CLI 24.10.0&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;eas simulator --network-capture&lt;/code&gt; records HTTP traffic on Expo's cloud simulator (&lt;em&gt;headers and bodies optional&lt;/em&gt;), and since 24.9 &lt;code&gt;eas update --upload-source-maps&lt;/code&gt; means OTA stack traces finally point at real lines.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;📦&lt;/strong&gt; &lt;a href="https://www.callstack.com/blog/apex-agetic-coding-for-mobile-and-web-spcialied-in-react" rel="noopener noreferrer"&gt;Apex&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Callstack's React Native coding model is generally available after a stealth run as Pixel Canary on Vercel AI Gateway... $0.50/M input and $3/M output, so your agent can afford a few more retries before lunch.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;📦&lt;/strong&gt; &lt;a href="https://www.npmjs.com/package/@chrisgocode/expo-meta-wearables-dat" rel="noopener noreferrer"&gt;expo-meta-wearables-dat 2.2.0&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The first React Native wrapper for Meta's Wearables Device Access Toolkit 1.0 for smart glasses... Meta says experimental features can't be published yet, so you can build for the glasses, you just can't ship.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;📝&lt;/strong&gt; &lt;a href="https://expo.dev/blog/live-activities-with-expo-end-to-end-client-and-backend" rel="noopener noreferrer"&gt;Live Activities with Expo, End to End&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Expo walks through a Live Activity that tracks a receipt from TSX widget to APNs pushes... favourite gotcha: send state in the wrong shape and Apple replies 200 OK, then never updates the activity.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fg4756qr4xqi6ybnv7ks2.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fg4756qr4xqi6ybnv7ks2.gif" alt="10.bye60.gif" width="500" height="375"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Authored by &lt;a href="https://www.linkedin.com/in/lukebrandonfarrell/" rel="noopener noreferrer"&gt;Luke Farrell&lt;/a&gt; and edited by &lt;a href="http://www.linkedin.com/in/francisco-rios-nino" rel="noopener noreferrer"&gt;Fran Ríos&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you’re enjoying this newsletter, why not help us grow? Share it with your friends, family, and even that one coworker who always “forgets” to update dependencies. Use this link: &lt;a href="https://thereactnativerewind.com/" rel="noopener noreferrer"&gt;https://thereactnativerewind.com/&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>mobile</category>
      <category>expo</category>
      <category>reactnative</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Crease-Proof Layouts, Brain Rot Without the Black Frames, and Un-Breaking a Non-Breaking Release</title>
      <dc:creator>The React Native Rewind</dc:creator>
      <pubDate>Wed, 30 Sep 2026 13:00:00 +0000</pubDate>
      <link>https://dev.to/thereactnativerewind/crease-proof-layouts-brain-rot-without-the-black-frames-and-un-breaking-a-non-breaking-release-3m7n</link>
      <guid>https://dev.to/thereactnativerewind/crease-proof-layouts-brain-rot-without-the-black-frames-and-un-breaking-a-non-breaking-release-3m7n</guid>
      <description>&lt;p&gt;You’re reading The React Native Rewind &lt;a href="https://thereactnativerewind.com/issues/crease-proof-layouts-brain-rot-without-the-black-frames-and-un-breaking-a-non-breaking-release" rel="noopener noreferrer"&gt;#59&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Hey, I Just Met You? Fold Me Maybe
&lt;/h2&gt;

&lt;p&gt;The world has become a weird place….&lt;/p&gt;

&lt;p&gt;Agents now write your code.&lt;/p&gt;

&lt;p&gt;Thieves robbed the Louvre in broad daylight with a furniture lift, in under eight minutes… &lt;/p&gt;

&lt;p&gt;And the password to the museum's surveillance system was reportedly "LOUVRE".&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fght1xcv35zpb24iod9ll.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fght1xcv35zpb24iod9ll.gif" alt="Brooklyn Nine-Nine heist meme" width="500" height="281"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But none of that is the weirdest news of the year…&lt;/p&gt;

&lt;p&gt;Apple has introduced a foldable phone.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://www.apple.com/newsroom/2026/09/apple-unveils-iphone-duo/" rel="noopener noreferrer"&gt;iPhone Duo&lt;/a&gt; shipped on October 23rd. &lt;/p&gt;

&lt;p&gt;So anytime today, someone can open your app on a 7.6-inch screen with a crease down the middle and fold it halfway like a tiny laptop.&lt;/p&gt;

&lt;p&gt;Android devs have lived with this for years…&lt;/p&gt;

&lt;p&gt;Now it's everyone's problem. &lt;/p&gt;

&lt;p&gt;Like the U2 album Apple put in every iTunes library in 2014.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;So how do you build a layout that knows it's been folded?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Thiago Brezinski (&lt;a href="https://x.com/thiagobrez" rel="noopener noreferrer"&gt;@thiagobrez&lt;/a&gt;) built &lt;a href="https://github.com/thiagobrez/react-native-arrangement-view" rel="noopener noreferrer"&gt;react-native-arrangement-view&lt;/a&gt;, which is a two-pane layout that rearranges itself as the device folds, unfolds and rotates.&lt;/p&gt;

&lt;p&gt;You give it a primary and a secondary pane:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;ArrangementView&lt;/span&gt; &lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="na"&gt;flex&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;}}&lt;/span&gt; &lt;span class="nx"&gt;arrangement&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;split&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;ArrangementView&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Primary&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;PrimaryPane&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/ArrangementView.Primary&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;ArrangementView&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Secondary&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;SecondaryPane&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/ArrangementView.Secondary&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/ArrangementView&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So what does that actually look like?&lt;/p&gt;

&lt;p&gt;Let's examine the two panes on the iPhone Duo, folding them one at a time.&lt;/p&gt;

&lt;p&gt;When the Duo is &lt;strong&gt;Closed&lt;/strong&gt;, it is folded shut and in this case you use the cover screen (&lt;em&gt;that is, the small screen on the outside which you use when the phone is shut&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;If you keep it vertical, the height will accommodate two panes, meaning that the main pane will be on top and the other pane will be below.&lt;/p&gt;

&lt;p&gt;If you turn it sideways, only one will fit, so you end up with the primary pane.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjfqptt22scxfyab5mxoi.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjfqptt22scxfyab5mxoi.jpg" alt="ArrangementView closed cover screen" width="800" height="565"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It's &lt;strong&gt;Half-open like a book&lt;/strong&gt;, and you're holding the Duo as if it were a paperback, so the fold goes from top to bottom.&lt;/p&gt;

&lt;p&gt;ArrangementView places the main pane in the left half and the secondary pane in the right half, and includes a small gap on either side of the divider so that nothing ends up in the fold.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2jsiw5ruwlchvo3pqd3t.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2jsiw5ruwlchvo3pqd3t.jpg" alt="ArrangementView half-open book layout" width="800" height="598"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You have turned the Duo sideways, &lt;strong&gt;Half-open like a laptop&lt;/strong&gt;, and placed it on a table with one half lying flat and the other elevated, making the crease run side to side.&lt;/p&gt;

&lt;p&gt;The panes once more split along the crease, the main pane ending up on the upper half and the secondary pane on the lower half, thus causing neither of them to bend around the fold.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fo39wwtsqbikg4dinm5tl.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fo39wwtsqbikg4dinm5tl.jpg" alt="ArrangementView half-open laptop layout" width="800" height="735"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When the Duo is &lt;strong&gt;Opened flat and held upright&lt;/strong&gt;, it forms a single large screen which is wider than it is tall, just like a small tablet.&lt;/p&gt;

&lt;p&gt;The crease is now flat, after which ArrangementView ceases to worry about it and places the primary and secondary panes next to one another.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fifjd6j36t76z85yc6vxf.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fifjd6j36t76z85yc6vxf.jpg" alt="ArrangementView opened flat upright layout" width="800" height="598"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The nice part is that it doesn't invent its own rules. &lt;/p&gt;

&lt;p&gt;On iOS it hands the job to SwiftUI's new &lt;code&gt;ArrangementView&lt;/code&gt; (&lt;em&gt;iOS 27.1 and up&lt;/em&gt;). Android has no equivalent, so it applies Material's adaptive layout rules on top of Jetpack WindowManager.&lt;/p&gt;

&lt;p&gt;There's also a &lt;code&gt;useHingeChange&lt;/code&gt; hook, which tells you how far open the phone is.&lt;/p&gt;

&lt;p&gt;The hinge angle is the angle between the two halves of the screen, so it's 0° when the phone is folded shut and 180° when it's opened flat.&lt;/p&gt;

&lt;p&gt;Along with the angle you get a &lt;code&gt;status&lt;/code&gt; of &lt;code&gt;closed&lt;/code&gt;, &lt;code&gt;partiallyOpen&lt;/code&gt; or &lt;code&gt;fullyOpen&lt;/code&gt;, and the operating system decides where one ends and the next begins.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fi8okgubkvrhyyaaot4go.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fi8okgubkvrhyyaaot4go.jpg" alt="ArrangementView hinge angle diagram" width="800" height="440"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You don't need it for layout, because &lt;code&gt;ArrangementView&lt;/code&gt; already handles that.&lt;/p&gt;

&lt;p&gt;It's for apps that want to behave differently when folded, like a video player that fills the screen when the phone is flat but puts the video on top and the controls underneath when you stand it up like a laptop.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Player&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useHingeChange&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="c1"&gt;// Stood up like a tiny laptop?&lt;/span&gt;
  &lt;span class="c1"&gt;// Video on top, controls underneath.&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;partiallyOpen&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;TabletopPlayer&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;FullscreenPlayer&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So, unlike the U2 album… &lt;/p&gt;

&lt;p&gt;react-native-arrangement-view is something you'll actually want in your library.&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://github.com/thiagobrez/react-native-arrangement-view" rel="noopener noreferrer"&gt;react-native-arrangement-view&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgbi2b4uz8co5hgvwygh9.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgbi2b4uz8co5hgvwygh9.jpg" alt="React Advanced London conference" width="800" height="469"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Two Days of React in an Old London Brewery
&lt;/h2&gt;

&lt;p&gt;React Advanced London is back on October 23 &amp;amp; 26, 2026.&lt;/p&gt;

&lt;p&gt;The first day is in person at The Brewery, a London venue on the site of an 18th-century brewery, and it's streamed online for everyone who can't make it.&lt;/p&gt;

&lt;p&gt;The second day is fully remote, so wherever you are, you still get two days of advanced React engineering.&lt;/p&gt;

&lt;p&gt;You'll be joining 700+ engineers for 40+ talks and workshops, given by the library authors and core contributors who build the stuff you ship.&lt;/p&gt;

&lt;p&gt;The big topics this year are React Server Components, the React Compiler and AI-assisted development.&lt;/p&gt;

&lt;p&gt;And because this is The React Native Rewind, we have to point out there's also a talk on building game UIs in Unreal Engine with React Native.&lt;/p&gt;

&lt;p&gt;If the talks don't win you over, the karaoke at the React party might.&lt;/p&gt;

&lt;p&gt;👉 Reserve your spot at &lt;a href="https://reactadvanced.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;reactadvanced.com&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F710o9ryw0nvzcql6o42n.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F710o9ryw0nvzcql6o42n.jpg" alt="Left Exit 12 patch package meme" width="800" height="763"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Never Gonna Show You a Black Frame
&lt;/h2&gt;

&lt;p&gt;In 2024 Oxford selected 'brain rot' as its &lt;a href="https://corp.oup.com/news/brain-rot-named-oxford-word-of-the-year-2024/" rel="noopener noreferrer"&gt;Word of the Year&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;That seems about right for a species which now measures its evenings by vertical videos.&lt;/p&gt;

&lt;p&gt;And if you've ever tried to build one of those feeds in React Native…&lt;/p&gt;

&lt;p&gt;You'll know the rot works both ways.&lt;/p&gt;

&lt;p&gt;If you swipe too quickly then you end up on a black screen.&lt;/p&gt;

&lt;p&gt;If you swipe more quickly then two videos will start to talk over each other.&lt;/p&gt;

&lt;p&gt;Meanwhile… the phone is still quietly downloading videos that you had already scrolled past.&lt;/p&gt;

&lt;p&gt;Rizky Bayu Oktavian (&lt;a href="https://x.com/rbayuokt" rel="noopener noreferrer"&gt;@rbayuokt&lt;/a&gt;) set up &lt;a href="https://github.com/rbayuokt/expo-infinite-media" rel="noopener noreferrer"&gt;expo-infinite-media&lt;/a&gt; in order to deal with that.&lt;/p&gt;

&lt;p&gt;It is a feed in the style of TikTok which is designed for Expo and React Native CLI applications, allowing you to go through the posts one by one by swiping through the videos and photos.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Felxewyyixcy7w5bs4gnm.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Felxewyyixcy7w5bs4gnm.gif" alt="Expo Infinite Media benchmark demo" width="480" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You may ask…&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why not just put a video player in every row of a FlatList?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A FlatList has a number of rows mounted both above and below the screen, and each of the mounted rows has its own video player.&lt;/p&gt;

&lt;p&gt;The various video players have no knowledge of one another.&lt;/p&gt;

&lt;p&gt;That means that when you're watching one video there will be 10 video players all downloading, buffering and decoding (&lt;em&gt;that is, converting the downloaded file into frames that the screen can display&lt;/em&gt;) at the same time, all competing for the same amount of bandwidth and memory.&lt;/p&gt;

&lt;p&gt;The start of playback also involves JavaScript.&lt;/p&gt;

&lt;p&gt;The FlatList tells the system which row is currently on screen, after which a React effect is carried out, and it is only at that point that the video player begins... so if the JavaScript thread is busy, the video will start late or display a black frame.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/rbayuokt/expo-infinite-media" rel="noopener noreferrer"&gt;expo-infinite-media&lt;/a&gt; makes those decisions part of the native code (&lt;em&gt;AVFoundation on iOS, Media3 on Android&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;As you scroll the same small number of video players is reused, a preload policy (which specifies which videos should be downloaded in advance*) retrieves the next few videos, and the native code begins playing the video on screen without having to wait for the JavaScript thread.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6g6t2w5osrjox52c5f8n.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6g6t2w5osrjox52c5f8n.jpg" alt="Expo Infinite Media preload window" width="800" height="482"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The video you're currently viewing is loaded fully into the buffer, the next one has its player ready with the first frame already decoded, and the one after that has only about its first 1.5 MB saved to disk.&lt;/p&gt;

&lt;p&gt;If you go any further than that, it costs nothing, and the download will be cancelled if you pass a post while it is downloading.&lt;/p&gt;

&lt;p&gt;Every post is a plain object with an &lt;code&gt;id&lt;/code&gt;, a &lt;code&gt;type&lt;/code&gt; and a &lt;code&gt;uri&lt;/code&gt;, plus a poster (&lt;em&gt;the still image shown while a video loads&lt;/em&gt;) for videos.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;items&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;v1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;video&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;uri&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://cdn.example.com/v1.mp4&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;poster&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://cdn.example.com/v1.jpg&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;p1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;image&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;uri&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://cdn.example.com/p1.jpg&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, using it looks a lot like a FlatList:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;InfiniteMediaFeed&lt;/span&gt;
  &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;posts&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nx"&gt;onEndReached&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;loadMore&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nx"&gt;renderOverlay&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{({&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;isActive&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Caption&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nx"&gt;active&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;isActive&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="p"&gt;)}&lt;/span&gt;
&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;expo-infinite-media needs a development build and the New Architecture... &lt;/p&gt;

&lt;p&gt;And version 0.1.0 landed on September 23, so the only thing less stable than the API is your users' attention span.&lt;/p&gt;

&lt;p&gt;Nobody waits for a black screen to load...&lt;/p&gt;

&lt;p&gt;They swipe to the next video, and now the next video is already playing.&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://github.com/rbayuokt/expo-infinite-media" rel="noopener noreferrer"&gt;expo-infinite-media&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frff1srfhf9dvlsdqi0af.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frff1srfhf9dvlsdqi0af.jpg" alt="Charlie conspiracy Android build meme" width="800" height="694"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;📦 &lt;strong&gt;&lt;a href="https://github.com/react/react-native/releases/tag/v0.88.0-rc.2" rel="noopener noreferrer"&gt;React Native 0.88.0-rc.2&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;React Native 0.88 is intended to be a non-breaking release, so rc.2 is largely reversing certain changes, for example, the one that prevented some of the TurboModules from compiling in 0.87.&lt;/p&gt;

&lt;p&gt;📦 &lt;strong&gt;&lt;a href="https://github.com/react-navigation/react-navigation/releases/tag/%40react-navigation/core%408.0.0-alpha.38" rel="noopener noreferrer"&gt;React Navigation 8.0.0-alpha.38&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Actions like &lt;code&gt;goBack()&lt;/code&gt; now run from the screen that called them, not the focused one... so background screens can stop sending your users to mystery places.&lt;/p&gt;

&lt;p&gt;📦 &lt;strong&gt;&lt;a href="https://github.com/software-mansion/react-native-reanimated/releases/tag/worklets-0.13.0" rel="noopener noreferrer"&gt;Worklets 0.13.0&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Worklets runtimes can now use fetch in Bundle Mode, and Worklets is the fourth library to add Swift Package Manager since we started counting.&lt;/p&gt;

&lt;p&gt;📦 &lt;strong&gt;&lt;a href="https://github.com/Shopify/react-native-skia/releases/tag/v2.13.0" rel="noopener noreferrer"&gt;React Native Skia 2.13.0&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;William Candillon (&lt;a href="https://x.com/wcandillon" rel="noopener noreferrer"&gt;@wcandillon&lt;/a&gt;) drops the old architecture in Skia 2.13, so old-architecture apps have officially run out of Skia upgrades.&lt;/p&gt;

&lt;p&gt;📦 &lt;strong&gt;&lt;a href="https://github.com/callstack/repack/releases/tag/%40callstack/repack%405.4.0" rel="noopener noreferrer"&gt;Re.Pack 5.4.0&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Re.Pack now only compiles a platform when its bundle is first requested, so launching iOS no longer means waiting for Android.&lt;/p&gt;

&lt;p&gt;📦 &lt;strong&gt;&lt;a href="https://github.com/expo/eas-cli/releases/tag/v24.8.0" rel="noopener noreferrer"&gt;EAS CLI 24.8.0&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;New apps now get an &lt;a href="http://agents.md/" rel="noopener noreferrer"&gt;AGENTS.md&lt;/a&gt; instead of a &lt;a href="http://claude.md/" rel="noopener noreferrer"&gt;CLAUDE.md&lt;/a&gt;... sorry, Claude.&lt;/p&gt;

&lt;p&gt;📦 &lt;strong&gt;&lt;a href="https://github.com/callstack/agent-device/releases/tag/v0.21.15" rel="noopener noreferrer"&gt;agent-device 0.21.15&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Michał Pierzchała (&lt;a href="https://x.com/thymikee" rel="noopener noreferrer"&gt;@thymikee&lt;/a&gt;) shipped seven versions in four days, including an animated iPhone Duo hinge and support for grandma-sized fonts.&lt;/p&gt;

&lt;p&gt;📦 &lt;strong&gt;&lt;a href="https://github.com/software-mansion/argent/releases/tag/v0.26.0" rel="noopener noreferrer"&gt;Argent 0.26.0&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Software Mansion's Argent (lets coding agents tap and swipe in the iOS simulator) now supports foldables too... so robots are folding more iPhone Duos than humans.&lt;/p&gt;

&lt;p&gt;📦 &lt;strong&gt;&lt;a href="https://github.com/LegendApp/legend-list/releases/tag/v3.4.0" rel="noopener noreferrer"&gt;Legend List 3.4.0&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Jay Meistrich (&lt;a href="https://x.com/jmeistrich" rel="noopener noreferrer"&gt;@jmeistrich&lt;/a&gt;), now renders rows ahead in whichever direction you scroll, and chat lists stay pinned to the bottom when the layout changes.&lt;/p&gt;

&lt;p&gt;📝 &lt;strong&gt;&lt;a href="https://github.com/react-native-community/discussions-and-proposals/pull/1023" rel="noopener noreferrer"&gt;RFC: Secondary JavaScript runtimes in React Native&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Tomasz Żelawski (&lt;a href="https://x.com/tjzeldev" rel="noopener noreferrer"&gt;@tjzel&lt;/a&gt;)  wants React Native to ship an official API for extra Hermes runtimes, instead of every library building its own.&lt;/p&gt;

&lt;p&gt;📝 &lt;strong&gt;&lt;a href="https://expo.dev/blog/agent-fixes-bugs-on-eas-simulator" rel="noopener noreferrer"&gt;What if your app could fix itself?&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Rami Maalouf (&lt;a href="https://x.com/rami__maalouf" rel="noopener noreferrer"&gt;@rami__maalouf&lt;/a&gt;) built an agent that reproduces a bug on the EAS Simulator, fixes it and opens a PR…&lt;/p&gt;

&lt;p&gt;However, you still have to press merge yourself… for now.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fi9ci3kye5mc4myct83rl.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fi9ci3kye5mc4myct83rl.gif" alt="Goodbye GIF" width="500" height="269"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Authored by &lt;a href="https://www.linkedin.com/in/lukebrandonfarrell/" rel="noopener noreferrer"&gt;Luke Farrell&lt;/a&gt; and edited by &lt;a href="http://www.linkedin.com/in/francisco-rios-nino" rel="noopener noreferrer"&gt;Fran Ríos&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you’re enjoying this newsletter, why not help us grow? Share it with your friends, family, and even that one coworker who always “forgets” to update dependencies. Use this link: &lt;a href="https://thereactnativerewind.com/" rel="noopener noreferrer"&gt;https://thereactnativerewind.com/&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>expo</category>
      <category>reactnative</category>
      <category>mobile</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
