<?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: Anisha Malde</title>
    <description>The latest articles on DEV Community by Anisha Malde (@anishamalde).</description>
    <link>https://dev.to/anishamalde</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F974875%2F856d5422-dfc5-425c-8235-e8773ccd8754.png</url>
      <title>DEV Community: Anisha Malde</title>
      <link>https://dev.to/anishamalde</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/anishamalde"/>
    <language>en</language>
    <item>
      <title>🎵 On the 12 Days of Christmas, Amazon Developer gave to me... 🎵</title>
      <dc:creator>Anisha Malde</dc:creator>
      <pubDate>Thu, 15 Jan 2026 18:11:51 +0000</pubDate>
      <link>https://dev.to/amazonappdev/on-the-12-days-of-christmas-amazon-developer-gave-to-me-i3o</link>
      <guid>https://dev.to/amazonappdev/on-the-12-days-of-christmas-amazon-developer-gave-to-me-i3o</guid>
      <description>&lt;p&gt;Made a New Year's resolution to learn something new? We've got you covered!&lt;/p&gt;

&lt;p&gt;Back in December, our team turned the holidays into a developer advent calendar, unwrapping a different Amazon tool each day leading up to Christmas. We covered 12 different Amazon tools / services in 12 LinkedIn posts with real code snippets and working demos. Whether you're curious about AI voice generation or custom Kiro agent consider it your New Year's resolution starter pack for building with Amazon's developer. &lt;/p&gt;

&lt;p&gt;So grab your coffeee, and let's see what Amazon Developer gave to theee 🎵&lt;/p&gt;

&lt;h2&gt;
  
  
  🎵 On the 1st day of Christmas 🎄, Amazon Developer gave to me… voice generation with Polly 🎵
&lt;/h2&gt;

&lt;p&gt;by &lt;a class="mentioned-user" href="https://dev.to/anishamalde"&gt;@anishamalde&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Okay I’ll admit it, I also yell at Alexa, but I’ll also admit her voice is oddly comforting. So when I needed a voice for my AI assistant app, I turned to &lt;a href="https://aws.amazon.com/polly/" rel="noopener noreferrer"&gt;Amazon Polly&lt;/a&gt;. Polly is AWS’s text-to-speech service that turns text into audio with neural voices across 30+ languages, the same underlying tech that powers Alexa’s voice. &lt;/p&gt;

&lt;p&gt;The setup was surprisingly simple. Polly handles all the heavy lifting, so with just a few lines of code&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const result = await pollyClient.send(
  new SynthesizeSpeechCommand({
    OutputFormat: "mp3",
    Text: "Welcome!",
    VoiceId: "Matthew",
    Engine: "neural",
  })
);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;I had my app 'talking' in different accents. The British version even wanted to banter with me 😂&lt;/p&gt;

&lt;p&gt;Check out the demo here ⬇️&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://www.linkedin.com/posts/anishamalde_on-the-1st-day-of-christmas-amazon-activity-7405213870300282882-WDxd?utm_source=share&amp;amp;amp%3Butm_medium=member_desktop&amp;amp;amp%3Brcm=ACoAABJ7qyEBKdMAQVNhclGeXwCrJ-uZ8rlJwsc" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdms.licdn.com%2Fplaylist%2Fvid%2Fv2%2FD4D05AQFV8wtuq33MOw%2Fthumbnail-with-play-button-overlay-high%2FB4DZsSawaqH4DM-%2F0%2F1765540564637%3Fe%3D2147483647%26v%3Dbeta%26t%3DhjlEW1y1DnMTabeeEFiqYB1IRJiUdby-iZWpKYM3Q5g" height="auto" class="m-0"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://www.linkedin.com/posts/anishamalde_on-the-1st-day-of-christmas-amazon-activity-7405213870300282882-WDxd?utm_source=share&amp;amp;amp%3Butm_medium=member_desktop&amp;amp;amp%3Brcm=ACoAABJ7qyEBKdMAQVNhclGeXwCrJ-uZ8rlJwsc" rel="noopener noreferrer" class="c-link"&gt;
            Amazon Polly Voice Generation for AI Assistants | Anisha Malde posted on the topic | LinkedIn
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            🎵 On the 1st day of Christmas 🎄, Amazon Developer gave to me… voice generation with Polly 🎵

Okay I’ll admit it, I also yell at Alexa, but I’ll also admit her voice is oddly comforting. So when I needed a voice for my AI assistant app, I turned to Amazon Polly (➡️ https://lnkd.in/d7kNn4UR). Polly is AWS’s text-to-speech service that turns text into audio with neural voices across 30+ languages, the same underlying tech that powers Alexa’s voice. 

The setup was surprisingly simple. Polly handles all the heavy lifting, so with just a few lines of code (➡️ https://lnkd.in/dJjKDT4H), I had my app 'talking' in different accents. The British version even wanted to banter with me 😂

➕ Follow along as today is just Day 1 of our 𝟭𝟮 𝗗𝗮𝘆𝘀 𝗼𝗳 𝗔𝗺𝗮𝘇𝗼𝗻 𝗗𝗲𝘃𝗲𝗹𝗼𝗽𝗲𝗿 🎄

What would you build with Polly? Drop your ideas below 👇
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fstatic.licdn.com%2Faero-v1%2Fsc%2Fh%2Fal2o9zrvru7aqj8e1x2rzsrca"&gt;
          linkedin.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;





&lt;h2&gt;
  
  
  🎵 On the 2nd day of Christmas 🎄, Amazon Developer gave to me… Kiro power🎵
&lt;/h2&gt;

&lt;p&gt;by &lt;a class="mentioned-user" href="https://dev.to/giolaq"&gt;@giolaq&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;In the hashtag AI Agents world Context overload is a problem! I love how Kiro approached this issue by using &lt;a href="https://kiro.dev/docs/powers/" rel="noopener noreferrer"&gt;Kiro Powers&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now you might be asking, what is a Kiro Power? Think of it as Santa's list for your AI agent: it gives instant access to specialized knowledge, tools, and best practices for one technology (like multi-platform TV 📺 builds), loading it only when you need it for maximum efficiency and speed.&lt;/p&gt;

&lt;p&gt;I put this power to the test, creating one and using it to successfully extend my VegaOS TV app (built in ReactNative) to other TV platforms. It automatically managed the complex, chilly build systems, leaving us with a warm, clean React Native code.&lt;/p&gt;

&lt;p&gt;Check it out the demo &lt;a href="https://github.com/giolaq/Multi-TV-dev-power/blob/main/multi-tv-builder/POWER.md" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://www.linkedin.com/posts/glaquidara_ai-kiro-vegaos-activity-7405499201746513920-zM38?utm_source=social_share_send&amp;amp;amp%3Butm_medium=member_desktop_web&amp;amp;amp%3Brcm=ACoAABJ7qyEBKdMAQVNhclGeXwCrJ-uZ8rlJwsc" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia.licdn.com%2Fdms%2Fimage%2Fv2%2FD4E22AQFL_oGynennhw%2Ffeedshare-shrink_800%2FB4EZsO5NIWGYAg-%2F0%2F1765481438406%3Fe%3D2147483647%26v%3Dbeta%26t%3Dq01m0o9pymxxA-_NkBOhUVumOKpikrDU533J4d1EiTU" height="auto" class="m-0"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://www.linkedin.com/posts/glaquidara_ai-kiro-vegaos-activity-7405499201746513920-zM38?utm_source=social_share_send&amp;amp;amp%3Butm_medium=member_desktop_web&amp;amp;amp%3Brcm=ACoAABJ7qyEBKdMAQVNhclGeXwCrJ-uZ8rlJwsc" rel="noopener noreferrer" class="c-link"&gt;
            #ai #kiro #vegaos #reactnative | Giovanni Laquidara
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            🎵 On the 2nd day of Christmas 🎄, Amazon Developer gave to me… Kiro power🎵 

In the #AI Agents world Context overload is a problem!

I love how #Kiro approached this issue by using Kiro Powers https://lnkd.in/e99fDAfR

What is a Kiro Power? Think of it as Santa's list for your AI agent: it gives instant access to specialized knowledge, tools, and best practices for one technology (like multi-platform TV 📺 builds), loading it only when you need it for maximum efficiency and speed.

I put this power to the test, creating one and using it to successfully extend my #VegaOS TV app (built in #ReactNative) to other TV platforms. It automatically managed the complex, chilly build systems, leaving us with a warm, clean React Native code.

Check it out here : 👉 https://lnkd.in/eAHA3gha
Day 2 of 12 Days of Amazon Developer 🎄
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fstatic.licdn.com%2Faero-v1%2Fsc%2Fh%2Fal2o9zrvru7aqj8e1x2rzsrca"&gt;
          linkedin.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;




&lt;h2&gt;
  
  
  🎵 On the 3rd day of Christmas, Amazon Developer gave to me… 3 CLI Custom Agents 🎵
&lt;/h2&gt;

&lt;p&gt;by &lt;a class="mentioned-user" href="https://dev.to/trag"&gt;@trag&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Every time I switch tasks, I used to re-explain my whole world to an agentic sidekick: My team structure. The acronyms. My writing style. Over and over. Blaaargggh!&lt;/p&gt;

&lt;p&gt;AWS Developers' custom agents for &lt;a href="https://kiro.dev/docs/cli/custom-agents/" rel="noopener noreferrer"&gt;Kiro CLI&lt;/a&gt; fixed that&lt;/p&gt;

&lt;p&gt;A custom agent is a JSON config that defines:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which tools the agent can access&lt;/li&gt;
&lt;li&gt;What files/docs auto-load as context&lt;/li&gt;
&lt;li&gt;A custom system prompt for the persona you need&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I've set up a few for different modes:&lt;br&gt;
trag – auto-loads my teammates, work glossary, and style guide&lt;br&gt;
social-media-lead – writes channel-specific posts for LinkedIn, etc&lt;br&gt;
pair-progammer – gets me the feedback I need while coding&lt;/p&gt;

&lt;p&gt;Setup:&lt;br&gt;
&lt;code&gt;/agent generate&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Swap anytime:&lt;br&gt;
&lt;code&gt;/agent swap&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Now when I start a session, the agent already knows who I am and what I'm working on. No preamble. Just work.&lt;/p&gt;

&lt;p&gt;Check out the demo here ⬇️&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://www.linkedin.com/posts/ctraganos_on-the-3rd-day-of-christmas-amazon-developer-activity-7406100306327056384-wtpR/?utm_source=share&amp;amp;amp%3Butm_medium=member_desktop&amp;amp;amp%3Brcm=ACoAABJ7qyEBKdMAQVNhclGeXwCrJ-uZ8rlJwsc" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdms.licdn.com%2Fplaylist%2Fvid%2Fv2%2FD4D05AQEstfv1Y7HTCw%2Fthumbnail-with-play-button-overlay-high%2FB4DZsfA8gFL0DM-%2F0%2F1765751902817%3Fe%3D2147483647%26v%3Dbeta%26t%3DA1OsSCsloZ_9focHfUDKsUyoXYteB9P0sf05KfEolAc" height="auto" class="m-0"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://www.linkedin.com/posts/ctraganos_on-the-3rd-day-of-christmas-amazon-developer-activity-7406100306327056384-wtpR/?utm_source=share&amp;amp;amp%3Butm_medium=member_desktop&amp;amp;amp%3Brcm=ACoAABJ7qyEBKdMAQVNhclGeXwCrJ-uZ8rlJwsc" rel="noopener noreferrer" class="c-link"&gt;
            Amazon Developer CLI Custom Agents Simplify Workflow | Chris Traganos posted on the topic | LinkedIn
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            🎵 On the 3rd day of Christmas, Amazon Developer gave to me… 3  CLI Custom Agents 🎵

Every time I switch tasks, I used to re-explain my whole world to an agentic sidekick: My team structure. The acronyms. My writing style. Over and over. Blaaargggh!

AWS Developers' custom agents for Kiro CLI fixed that (➡️ https://lnkd.in/d5zhHmbj)

A custom agent is a JSON config that defines:
• Which tools the agent can access
• What files/docs auto-load as context
• A custom system prompt for the persona you need

I've set up a few for different modes:
trag – auto-loads my teammates, work glossary, and style guide
social-media-lead – writes channel-specific posts for LinkedIn, etc
pair-progammer – gets me the feedback I need while coding

Setup:
`/agent generate`

Swap anytime:
`/agent swap`

Now when I start a session, the agent already knows who I am and what I'm working on. No preamble. Just work.

Follow along for more Amazon developer as today is just Day 3 of our 12 days of Amazon Developer 🎄
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fstatic.licdn.com%2Faero-v1%2Fsc%2Fh%2Fal2o9zrvru7aqj8e1x2rzsrca"&gt;
          linkedin.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;




&lt;h2&gt;
  
  
  🎵 On the 4th day of Christmas, Amazon Developer gave to me…  Kiro CLI: &lt;a href="https://kiro.dev/cli/" rel="noopener noreferrer"&gt;https://kiro.dev/cli/&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;by &lt;a class="mentioned-user" href="https://dev.to/mosesroth"&gt;@mosesroth&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Everyone reading this has probably used an AI chatbot, but have you used one on the CLI? It’s a whole different ballgame.&lt;/p&gt;

&lt;p&gt;Using an LLM on the CLI is a lot like using Chat GPT or Claude in your browser, but instead you chat with it directly from the terminal.&lt;/p&gt;

&lt;p&gt;What’s so great about it is how convenient it is for vibe coding an app or testing one.&lt;/p&gt;

&lt;p&gt;When I was &lt;a href="https://developer.amazon.com/apps-and-games/blogs/2025/06/fireos-on-react-native-directory" rel="noopener noreferrer"&gt;testing React Native libraries on Fire OS&lt;/a&gt;, it made the process so much easier and faster. I would just give it the URL of the library and tell it to create an app and test it on a Fire device. That’s it, just one step. No need to manually create a new app, no need to download the repo myself or integrate it or copy-paste code from a browser-based LLM, and no need to set up adb or manually run the app. It took care of everything.&lt;/p&gt;

&lt;p&gt;Whether you’re a veteran vibe-coder or thinking about dipping your toes into the water for the first time, check out &lt;a href="https://kiro.dev/cli/" rel="noopener noreferrer"&gt;Kiro CLI&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://www.linkedin.com/posts/mosesroth_on-the-4th-day-of-christmas-amazon-developer-activity-7406347339054899200-E344?utm_source=share&amp;amp;amp%3Butm_medium=member_desktop&amp;amp;amp%3Brcm=ACoAABJ7qyEBKdMAQVNhclGeXwCrJ-uZ8rlJwsc" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia.licdn.com%2Fdms%2Fimage%2Fv2%2FD5622AQH0u6DPqoke7w%2Ffeedshare-shrink_1280%2FB56ZsPPowpJEAs-%2F0%2F1765487316427%3Fe%3D2147483647%26v%3Dbeta%26t%3DsS3LuVdIZ8H8bmFpUKUn4kJP_tv4qWj-par9K9wdoPs" height="auto" class="m-0"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://www.linkedin.com/posts/mosesroth_on-the-4th-day-of-christmas-amazon-developer-activity-7406347339054899200-E344?utm_source=share&amp;amp;amp%3Butm_medium=member_desktop&amp;amp;amp%3Brcm=ACoAABJ7qyEBKdMAQVNhclGeXwCrJ-uZ8rlJwsc" rel="noopener noreferrer" class="c-link"&gt;
            🎵 On the 4th day of Christmas, Amazon Developer gave to me…  Kiro CLI: https://kiro.dev/cli/

Everyone reading this has probably used an AI chatbot, but have you used one on the CLI (command-line… | Moses Roth
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            🎵 On the 4th day of Christmas, Amazon Developer gave to me…  Kiro CLI: https://kiro.dev/cli/

Everyone reading this has probably used an AI chatbot, but have you used one on the CLI (command-line interface)? It’s a whole different ballgame.

Using an LLM on the CLI is a lot like using Chat GPT or Claude in your browser, but instead you chat with it directly from the terminal.

What’s so great about it is how convenient it is for vibe coding an app or testing one.

When I was testing React Native libraries on Fire OS ( https://lnkd.in/ghvNFv-K ), it made the process so much easier and faster. I would just give it the URL of the library and tell it to create an app and test it on a Fire device. That’s it, just one step. No need to manually create a new app, no need to download the repo myself or integrate it or copy-paste code from a browser-based LLM, and no need to set up adb or manually run the app. It took care of everything.

Whether you’re a veteran vibe-coder or thinking about dipping your toes into the water for the first time, check out Kiro CLI: https://kiro.dev/cli/
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fstatic.licdn.com%2Faero-v1%2Fsc%2Fh%2Fal2o9zrvru7aqj8e1x2rzsrca"&gt;
          linkedin.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;




&lt;h2&gt;
  
  
  🎵 On the 5th day of Christmas, Amazon Developer gave to me… Amazon Bedrock 🎵
&lt;/h2&gt;

&lt;p&gt;by &lt;a class="mentioned-user" href="https://dev.to/knmeiss"&gt;@knmeiss&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ever wondered what powers the AI behind Prime Video &amp;amp; Amazon MGM Studios's personalized recaps, Ring's smart video search or Alexa+'s conversational intelligence? Meet &lt;a href="https://aws.amazon.com/bedrock/" rel="noopener noreferrer"&gt;Amazon Bedrock&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bedrock is a fully managed service that makes leading foundation models from Amazon, Anthropic, AI21 Labs, and more accessible through a single API. This allows you to build and scale generative AI applications without managing infrastructure&lt;/p&gt;

&lt;p&gt;🎬 Prime Video &amp;amp; Amazon MGM Studios uses &lt;a href="https://aws.amazon.com/blogs/media/5-ways-prime-video-improves-the-viewing-experience-with-generative-ai-on-aws/" rel="noopener noreferrer"&gt;Bedrock&lt;/a&gt; to power conversational and personalized interactions across tens of thousands of services and devices with agentic capabilities. X-Ray Recaps also uses Bedrock to understand storylines, emotions and character relationships. &lt;br&gt;
🔔 &lt;a href="%E2%9E%A1%EF%B8%8F%20https://lnkd.in/gErQRQxS"&gt;Ring uses Bedrock&lt;/a&gt; for video understanding and search, making it easier to find specific moments and identify patterns in your footage.&lt;br&gt;
🏀 &lt;a href="https://www.aboutamazon.com/news/aws/nba-aws-cloud-ai-partnership-basketball-innovation" rel="noopener noreferrer"&gt;Live Sports uses Bedrock&lt;/a&gt; to detect and capture slam dunks, three-pointers, and key plays in real-time, then generates instant highlight clips.&lt;br&gt;
🗣️ &lt;a href="https://aws.amazon.com/blogs/publicsector/strengthen-foundation-model-queries-through-amazon-bedrock-amazon-alexa-integration/" rel="noopener noreferrer"&gt;Alexa+ uses Bedrock&lt;/a&gt; to route requests to specialized models for more natural conversations.&lt;br&gt;
🛍️ &lt;a href="https://aws.amazon.com/blogs/machine-learning/how-rufus-scales-conversational-shopping-experiences-to-millions-of-amazon-customers-with-amazon-bedrock/" rel="noopener noreferrer"&gt;Rufus uses Bedrock&lt;/a&gt; to combine multiple foundation models with Amazon's product knowledge, reviews, and Q&amp;amp;A data to deliver sub-second responses to millions of shoppers. &lt;/p&gt;

&lt;p&gt;Ready to transform your AI journey? Start sleigh-ing your AI goals today with this rock-solid solution! 🪨🛷&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://www.linkedin.com/posts/kourtney-meiss_amazon-bedrock-build-genai-applications-activity-7406717460181086209-Q6X7?utm_source=share&amp;amp;amp%3Butm_medium=member_desktop&amp;amp;amp%3Brcm=ACoAABJ7qyEBKdMAQVNhclGeXwCrJ-uZ8rlJwsc" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia.licdn.com%2Fdms%2Fimage%2Fsync%2Fv2%2FD4D27AQGXDPVAtfpEPw%2Farticleshare-shrink_1280_800%2FB4DZsUXfISIsAU-%2F0%2F1765573260671%3Fe%3D2147483647%26v%3Dbeta%26t%3DaUZKdz5BFvyGqh7V67m8CC_9tUSh4Qpkr1GzWn8R8FU" height="auto" class="m-0"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://www.linkedin.com/posts/kourtney-meiss_amazon-bedrock-build-genai-applications-activity-7406717460181086209-Q6X7?utm_source=share&amp;amp;amp%3Butm_medium=member_desktop&amp;amp;amp%3Brcm=ACoAABJ7qyEBKdMAQVNhclGeXwCrJ-uZ8rlJwsc" rel="noopener noreferrer" class="c-link"&gt;
            Amazon Bedrock – Build genAI applications and agents at production scale – AWS | Kourtney M.
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            🎵 On the 5th day of Christmas, Amazon Developer gave to me… Amazon Bedrock 🎵

Ever wondered what powers the AI behind Prime Video &amp;amp; Amazon MGM Studios's personalized recaps, Ring's smart video search or Alexa+'s conversational intelligence? Meet Amazon Bedrock (➡️ https://lnkd.in/grzc8ptt)!

Bedrock is a fully managed service that makes leading foundation models from Amazon, Anthropic, AI21 Labs, and more accessible through a single API. This allows you to build and scale generative AI applications without managing infrastructure

🎬 Prime Video &amp;amp; Amazon MGM Studios uses Bedrock (➡️https://lnkd.in/gEE_a99R) to power conversational and personalized interactions across tens of thousands of services and devices with agentic capabilities. X-Ray Recaps also uses Bedrock to understand storylines, emotions and character relationships. 
🔔 Ring uses Bedrock (➡️ https://lnkd.in/gErQRQxS) for video understanding and search, making it easier to find specific moments and identify patterns in your footage.
🏀 Live Sports uses Bedrock (➡️ https://lnkd.in/gCDDC8CW) to detect and capture slam dunks, three-pointers, and key plays in real-time, then generates instant highlight clips.
🗣️ Alexa+ uses Bedrock (➡️ https://lnkd.in/gV494Sia) to route requests to specialized models for more natural conversations.
🛍️ Rufus uses Bedrock (➡️  https://lnkd.in/gQe-eqeN) to combine multiple foundation models with Amazon's product knowledge, reviews, and Q&amp;amp;A data to deliver sub-second responses to millions of shoppers. 

Ready to transform your AI journey? Start sleigh-ing your AI goals today with this rock-solid solution! 🪨🛷

➕ Follow along as today is Day 5 of our 𝟭𝟮 𝗗𝗮𝘆𝘀 𝗼𝗳 Amazon Developer 🎄
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fstatic.licdn.com%2Faero-v1%2Fsc%2Fh%2Fal2o9zrvru7aqj8e1x2rzsrca"&gt;
          linkedin.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;




&lt;h2&gt;
  
  
  🎵 On the 6th day of Christmas 🎄, Amazon Developer gave to me… browser automation with Amazon Nova Act 🎵
&lt;/h2&gt;

&lt;p&gt;by &lt;a class="mentioned-user" href="https://dev.to/emersonsklar"&gt;@emersonsklar&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;One of the most exciting things this year has been the shift from AI that just talks to AI that acts. &lt;a href="https://nova.amazon.com/act?tab=home" rel="noopener noreferrer"&gt;Amazon Nova Act&lt;/a&gt; certainly knocks it out of the park; it's the AI agent service turning browsers into autonomous coworkers. If you’ve ever dreamed of “set it and forget it” automation for complex UI workflows, this is your new best friend. 👇&lt;/p&gt;

&lt;p&gt;Nova Act lets developers build, deploy, and manage fleets of reliable AI agents for automating browser-based tasks at enterprise scale. And it’s trained specifically to act – not just chat – driving browsers, filling forms, and clicking buttons with &amp;gt;90% task reliability in production. Think of it as a “digital intern” for automating business processes that never gets distracted.&lt;/p&gt;

&lt;p&gt;🔧 Why this matters:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reliability at Scale: While most agentic tools struggle at ~50% accuracy, Nova Act achieves &amp;gt;90% success rates on tricky UI elements (date pickers, popups, dropdowns) thanks to reinforcement learning on 1000s of simulated web environments. &lt;/li&gt;
&lt;li&gt;Speed to Value: Go from natural-language prototype → production in hours (not months). The new Nova Act Playground lets you refine workflows visually in minutes, while the Python SDK supports advanced deployments. &lt;/li&gt;
&lt;li&gt;Native AWS Integration: Seamlessly ties into Amazon Bedrock, CloudWatch, and IAM. No “glue code” needed – just secure, scalable automation. &lt;/li&gt;
&lt;li&gt;Multi-Agent Orchestration: Pair with Strands Agents framework to coordinate complex, cross-domain workflows (e.g., QA → data extraction → API calls).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🧪 See it in action: Here’s a &lt;a href="https://gist.github.com/emersonsklar/243ee1f0044bf8505ac9367d603ce967" rel="noopener noreferrer"&gt;simple script&lt;/a&gt; where Nova Act navigates to the Amazon.com website, looks for a board game, about everyone’s favorite Blue Heeler, ensures it can get here in time, and adds it to my cart!&lt;/p&gt;

&lt;p&gt;🌍 How customers are winning:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://aws.amazon.com/blogs/machine-learning/amazon-nova-act-sdk-preview-path-to-production-for-browser-automation-agents/" rel="noopener noreferrer"&gt;QA Testing&lt;/a&gt;: Tyler Technologies cut test-suite creation time from weeks to minutes by converting manual test plans into automated scenarios with natural language prompts&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://labs.amazon.science/blog/amazon-nova-act-service" rel="noopener noreferrer"&gt;Internal Tools&lt;/a&gt;: Amazon Leo uses Nova Act to validate 1000s of test cases across web/mobile for its upcoming satellite internet launch. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://www.linkedin.com/posts/emersonsklar_amazon-nova-explore-amazons-latest-ai-activity-7407126349531971584-Grie?utm_source=share&amp;amp;amp%3Butm_medium=member_desktop&amp;amp;amp%3Brcm=ACoAABJ7qyEBKdMAQVNhclGeXwCrJ-uZ8rlJwsc)" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia.licdn.com%2Fdms%2Fimage%2Fsync%2Fv2%2FD5627AQGQUfxu82KW_w%2Farticleshare-shrink_1280_800%2FB56Zeuek_kG0AU-%2F0%2F1774490614791%3Fe%3D2147483647%26v%3Dbeta%26t%3Dc6XAxkLSJLzbkFH_wVxPWWkGeeXSjCDWALsvX2nnIok" height="auto" class="m-0"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://www.linkedin.com/posts/emersonsklar_amazon-nova-explore-amazons-latest-ai-activity-7407126349531971584-Grie?utm_source=share&amp;amp;amp%3Butm_medium=member_desktop&amp;amp;amp%3Brcm=ACoAABJ7qyEBKdMAQVNhclGeXwCrJ-uZ8rlJwsc)" rel="noopener noreferrer" class="c-link"&gt;
            Amazon Nova Act Automates Browser Tasks with 90% Reliability | Emerson Sklar posted on the topic | LinkedIn
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            🎵 On the 6th day of Christmas 🎄, Amazon Developer gave to me… browser automation with Amazon Nova Act 🎵

One of the most exciting things this year hasn’t been another AI demo – it’s the shift from AI that just talks to AI that acts. Amazon Nova Act certainly knocks it out of the park; it's the AI agent service turning browsers into autonomous coworkers. If you’ve ever dreamed of “set it and forget it” automation for complex UI workflows, this is your new best friend. 👇

Nova Act lets developers build, deploy, and manage fleets of reliable AI agents for automating browser-based tasks at enterprise scale. And it’s trained specifically to act – not just chat – driving browsers, filling forms, and clicking buttons with &amp;gt;90% task reliability in production. Think of it as a “digital intern” for automating business processes that never gets distracted.

🔧 Why this matters:
·      Reliability at Scale: While most agentic tools struggle at ~50% accuracy, Nova Act achieves &amp;gt;90% success rates on tricky UI elements (date pickers, popups, dropdowns) thanks to reinforcement learning on 1000s of simulated web environments. 
·      Speed to Value: Go from natural-language prototype → production in hours (not months). The new Nova Act Playground lets you refine workflows visually in minutes, while the Python SDK supports advanced deployments. 
·      Native AWS Integration: Seamlessly ties into Amazon Bedrock, CloudWatch, and IAM. No “glue code” needed – just secure, scalable automation. 
·      Multi-Agent Orchestration: Pair with Strands Agents framework to coordinate complex, cross-domain workflows (e.g., QA → data extraction → API calls).

🧪 See it in action:
Christmas is coming up, and everybody needs a little help getting the last of the presents on Santa’s lists. Here’s a simple script (https://lnkd.in/g97HBuyq) where Nova Act navigates to the Amazon.com website, looks for a board game about everyone’s favorite Blue Heeler, ensures it can get here in time, and adds it to my cart

🌍 How customers are winning:
·      QA Testing: Tyler Technologies cut test-suite creation time from weeks to minutes by converting manual test plans into automated scenarios with natural language prompts. https://lnkd.in/g2gKxP-t
·      Internal Tools: Amazon Leo uses Nova Act to validate 1000s of test cases across web/mobile for its upcoming satellite internet launch.  https://lnkd.in/gidrHN92


💬 Let’s Talk Automation!
What repetitive browser tasks are you tired of doing manually? 🤔
👇 Comment below with your biggest automation headache – let’s brainstorm how Nova Act could solve it!

🔗 Dive deeper: Nova Act Home https://lnkd.in/gVzN59xk

➕ Follow along as today is Day 6 of our 𝟭𝟮 𝗗𝗮𝘆𝘀 𝗼𝗳 Amazon Developer 🎄
#AWS #AI #Developers #Automation #GenAI #AmazonNova #NovaAct
 

          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fstatic.licdn.com%2Faero-v1%2Fsc%2Fh%2Fal2o9zrvru7aqj8e1x2rzsrca"&gt;
          linkedin.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;




&lt;h2&gt;
  
  
  🎵 On the 8th day of Christmas 🎄, Amazon Developer gave to me ... one prompt UI magic with Kiro ✏️ 📺 🎵
&lt;/h2&gt;

&lt;p&gt;by giolaq &lt;/p&gt;

&lt;p&gt;From idea → wireframe → UI → working app… it usually takes too many steps.&lt;/p&gt;

&lt;p&gt;I love how Kiro changes this with a single simple prompt.&lt;/p&gt;

&lt;p&gt;This time, I pushed it further:&lt;br&gt;
 👉 I gave Kiro one prompt and a simple pencil sketch…&lt;br&gt;
 👉 and asked it to turn that into a full 10-foot TV UI web app.&lt;/p&gt;

&lt;p&gt;Kiro understood the TV navigation patterns (D-pad, focus states) and the 10-foot UI guidelines with a great TV layout 📺&lt;br&gt;
And the code is available &lt;a href="https://github.com/giolaq/KiroTVOneShot" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://www.linkedin.com/posts/glaquidara_kiro-kiro-kiro-activity-7407687386437951488-Td1y?utm_source=share&amp;amp;amp%3Butm_medium=member_desktop&amp;amp;amp%3Brcm=ACoAABJ7qyEBKdMAQVNhclGeXwCrJ-uZ8rlJwsc" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdms.licdn.com%2Fplaylist%2Fvid%2Fv2%2FD4E05AQF7xCa8j_VzPQ%2Fthumbnail-with-play-button-overlay-high%2FB4EZsyMMptIIDU-%2F0%2F1766073621658%3Fe%3D2147483647%26v%3Dbeta%26t%3DHDJiKK27sSxsKRmA4vE2V0nqnllHwoBoeGkMhtQgT2o" height="auto" class="m-0"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://www.linkedin.com/posts/glaquidara_kiro-kiro-kiro-activity-7407687386437951488-Td1y?utm_source=share&amp;amp;amp%3Butm_medium=member_desktop&amp;amp;amp%3Brcm=ACoAABJ7qyEBKdMAQVNhclGeXwCrJ-uZ8rlJwsc" rel="noopener noreferrer" class="c-link"&gt;
            #kiro #kiro #kiro #aiagents #tvdevelopment #ux #uidesign #10footui #amazondeveloper #buildinpublic | Giovanni Laquidara
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            🎵 𝐎𝐧 𝐭𝐡𝐞 8𝐭𝐡 𝐝𝐚𝐲 𝐨𝐟 𝐂𝐡𝐫𝐢𝐬𝐭𝐦𝐚𝐬 🎄, Amazon Developer 𝐠𝐚𝐯𝐞 𝐭𝐨 𝐦𝐞… 𝐨𝐧𝐞 𝐩𝐫𝐨𝐦𝐩𝐭 𝐔𝐈 𝐦𝐚𝐠𝐢𝐜 𝐰𝐢𝐭𝐡 #𝐊𝐢𝐫𝐨 ✏️📺 🎵

From idea → wireframe → UI → working app… it usually takes too many steps.
I love how #Kiro changes this with a single simple prompt.
This time, I pushed it further:
 👉 I gave Kiro one prompt and a simple pencil sketch…
 👉 and asked it to turn that into a full 10-foot TV UI web app.
Kiro understood the TV navigation patterns (D-pad, focus states) and the 10-foot UI guidelines with a great TV layout 📺
And the code is available here 👉 https://lnkd.in/eUFb9p5p

Follow along for more Amazon Developer as today is just Day 8 of our 12 days of Amazon Developer 🎄
#Kiro #AIAgents #TVDevelopment #UX #UIDesign #10FootUI #AmazonDeveloper #BuildInPublic
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fstatic.licdn.com%2Faero-v1%2Fsc%2Fh%2Fal2o9zrvru7aqj8e1x2rzsrca"&gt;
          linkedin.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;




&lt;h2&gt;
  
  
  🎵 On the 9th day of Christmas, Amazon Developer gave to me… AWS Lightsail! 🎵
&lt;/h2&gt;

&lt;p&gt;by trag &lt;/p&gt;

&lt;p&gt;I need a secure cloud box to run Kiro CLI, Codex, Claude Code, and batch scripts without exposing my home network. Lightsail from Amazon Web Services (AWS) was able to get me up and running in minutes for under $5/month&lt;/p&gt;

&lt;p&gt;Here's my workflow:&lt;/p&gt;

&lt;p&gt;📱 &lt;a href="https://ish.app/" rel="noopener noreferrer"&gt;iSH&lt;/a&gt; – SSH terminal for iOS&lt;br&gt;
📂 &lt;a href="https://www.textasticapp.com/" rel="noopener noreferrer"&gt;Textastic&lt;/a&gt; – secure file transfer and SSH&lt;br&gt;
☁️ Lightsail – my Ubuntu instance with an SSH alias as &lt;code&gt;tragbox&lt;/code&gt; for quick access&lt;/p&gt;

&lt;p&gt;I SSH in, run either kiro-cli / claude / codex depending on the project, and my custom agents are live from my phone. Plus, I have a few MCPs running including GitHub and Context7 for extended capabilities.&lt;/p&gt;

&lt;p&gt;My top use cases:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pull conference speaker data and build tables of mutual connections&lt;/li&gt;
&lt;li&gt;Run batch image cleanup and CSV processing when I'm away from my laptop&lt;/li&gt;
&lt;li&gt;Execute long-running scripts without tying up my local machine&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Why Lightsail? &lt;br&gt;
I considered EC2, Fargate, and other options but all too much setup for my use case. Lightsail gave me an Ubuntu box with a straightforward console, flat monthly pricing (no surprise bills), and I can bump RAM or storage when I need it. It's firewalled away from my home network, so I'm not worried about exposing internal endpoints.&lt;/p&gt;

&lt;p&gt;It really just works - I spin up agents on demand, run what I need, and move on.&lt;/p&gt;

&lt;p&gt;Check out the demo here ⬇️&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://www.linkedin.com/posts/ctraganos_on-the-9th-day-of-christmas-amazon-developer-activity-7408342004838899713-KttX?utm_source=share&amp;amp;amp%3Butm_medium=member_desktop&amp;amp;amp%3Brcm=ACoAABJ7qyEBKdMAQVNhclGeXwCrJ-uZ8rlJwsc" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdms.licdn.com%2Fplaylist%2Fvid%2Fv2%2FD5605AQH44S6-gAgxww%2Fthumbnail-with-play-button-overlay-high%2FB56Zs.3wuzKEDM-%2F0%2F1766286371456%3Fe%3D2147483647%26v%3Dbeta%26t%3DvOHKcBmK2UbRShlpH0KFAMI5FwdZp_MlyK_HICWf5U8" height="auto" class="m-0"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://www.linkedin.com/posts/ctraganos_on-the-9th-day-of-christmas-amazon-developer-activity-7408342004838899713-KttX?utm_source=share&amp;amp;amp%3Butm_medium=member_desktop&amp;amp;amp%3Brcm=ACoAABJ7qyEBKdMAQVNhclGeXwCrJ-uZ8rlJwsc" rel="noopener noreferrer" class="c-link"&gt;
            🎵 On the 9th day of Christmas, Amazon Developer gave to me… AWS Lightsail! 🎵

I need a secure cloud box to run Kiro CLI, Codex, Claude Code, and batch scripts without exposing my home network… | Chris Traganos
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            🎵 On the 9th day of Christmas, Amazon Developer gave to me… AWS Lightsail! 🎵

I need a secure cloud box to run Kiro CLI, Codex, Claude Code, and batch scripts without exposing my home network. Lightsail from Amazon Web Services (AWS) was able to get me up and running in minutes for under $5/month

Here's my workflow:

📱 iSH (https://ish.app/) – SSH terminal for iOS
📂 Textastic (https://lnkd.in/gKee8EC5) – secure file transfer and SSH
☁️ Lightsail – my Ubuntu instance with an SSH alias as `tragbox` for quick access

I SSH in, run either kiro-cli / claude / codex depending on the project, and my custom agents are live from my phone. Plus, I have a few MCPs running including GitHub and Context7 for extended capabilities.

My top use cases:
- Pull conference speaker data and build tables of mutual connections
- Run batch image cleanup and CSV processing when I'm away from my laptop
- Execute long-running scripts without tying up my local machine

Why Lightsail? 
I considered EC2, Fargate, and other options but all too much setup for my use case. Lightsail gave me an Ubuntu box with a straightforward console, flat monthly pricing (no surprise bills), and I can bump RAM or storage when I need it. It's firewalled away from my home network, so I'm not worried about exposing internal endpoints.

It really just works - I spin up agents on demand, run what I need, and move on.

Check it out: https://lnkd.in/gqQyZ35t 

Follow along for more Amazon developer as today is just Day 9 of our 12 days of Amazon Developer 🎄
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fstatic.licdn.com%2Faero-v1%2Fsc%2Fh%2Fal2o9zrvru7aqj8e1x2rzsrca"&gt;
          linkedin.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;




&lt;h2&gt;
  
  
  🎵 On the 10th day of Christmas, Amazon Developer gave to me… Kiro specs!
&lt;/h2&gt;

&lt;p&gt;by mosesroth &lt;/p&gt;

&lt;p&gt;To paraphrase Forrest Gump, vibe coding is a like a box of chocolates, you never know what you're gonna get.&lt;/p&gt;

&lt;p&gt;Unfortunately, that’s not such a good thing. So what are you supposed to do?&lt;/p&gt;

&lt;p&gt;Meet spec-driven development with &lt;a href="https://kiro.dev/" rel="noopener noreferrer"&gt;Kiro&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With specs, when you give Kiro a prompt, instead of building the app right away, it gives you three docs: 1. requirements, 2. design, and 3. tasks. These documents list exactly what Kiro intends to do when building your app. You can then review them, confirm if the specs follow your vision, and either edit them or give Kiro a new prompt.&lt;/p&gt;

&lt;p&gt;That way your vibe coded app actually conforms to your vision.&lt;/p&gt;

&lt;p&gt;For more info, check out (Eric Fahsl’s talk)[&lt;a href="https://www.youtube.com/watch?v=ilFdh17hKic" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=ilFdh17hKic&lt;/a&gt;]&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://www.linkedin.com/posts/mosesroth_spec-driven-development-with-kirodev-by-activity-7408566549223071744-30fB?utm_source=share&amp;amp;amp%3Butm_medium=member_desktop&amp;amp;amp%3Brcm=ACoAABJ7qyEBKdMAQVNhclGeXwCrJ-uZ8rlJwsc" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia.licdn.com%2Fdms%2Fimage%2Fsync%2Fv2%2FD5627AQH8hbjgw-Embw%2Farticleshare-shrink_800%2FB56ZsyNF69J8AM-%2F0%2F1766073853555%3Fe%3D2147483647%26v%3Dbeta%26t%3DITCuBLgYVDsYs4lMd6Hsm6eD-ziphSZfmI7dskKIVwc" height="auto" class="m-0"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://www.linkedin.com/posts/mosesroth_spec-driven-development-with-kirodev-by-activity-7408566549223071744-30fB?utm_source=share&amp;amp;amp%3Butm_medium=member_desktop&amp;amp;amp%3Brcm=ACoAABJ7qyEBKdMAQVNhclGeXwCrJ-uZ8rlJwsc" rel="noopener noreferrer" class="c-link"&gt;
            Spec-Driven-Development With Kiro.dev by Eric Fahsl | AI Meetup in Wrocław, September 2025 | Moses Roth
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            🎵 On the 10th day of Christmas, Amazon Developer gave to me… Kiro specs!

To paraphrase Forrest Gump, vibe coding is a like a box of chocolates, you never know what you're gonna get.

Unfortunately, that’s not such a good thing. So what are you supposed to do?

Meet spec-driven development with Kiro: https://kiro.dev/

With specs, when you give Kiro a prompt, instead of building the app right away, it gives you three docs: 1. requirements, 2. design, and 3. tasks. These documents list exactly what Kiro intends to do when building your app. You can then review them, confirm if the specs follow your vision, and either edit them or give Kiro a new prompt.

That way your vibe coded app actually conforms to your vision.

For more info, check out Eric Fahsl’s talk: https://lnkd.in/gRhYubiV
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fstatic.licdn.com%2Faero-v1%2Fsc%2Fh%2Fal2o9zrvru7aqj8e1x2rzsrca"&gt;
          linkedin.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;




&lt;h2&gt;
  
  
  🎵 On the 11th day of Christmas, Amazon Developer gave to me…Checkpointing in Kiro 🎵
&lt;/h2&gt;

&lt;p&gt;by knmeiss &lt;/p&gt;

&lt;p&gt;Have you ever let an AI agent refactor your code, only to realize you want to try a different approach? &lt;a href="https://kiro.dev/blog/introducing-checkpointing/" rel="noopener noreferrer"&gt;Kiro's checkpointing feature&lt;/a&gt; lets you rewind to any point in your session with one click. &lt;/p&gt;

&lt;p&gt;✨ Automatic checkpoint markers are added to your session as Kiro modifies code.&lt;br&gt;
🔄 Easily test different approaches. If one doesn't pan out, you're one click from reverting to any point in your session to try another.&lt;br&gt;
💬 Retain your conversation context while reverting changes.&lt;br&gt;
✔️Available in both the Kiro IDE and CLI&lt;/p&gt;

&lt;p&gt;While it doesn’t replace version control, it does provide an experimentation playground while Git handles the permanent record.&lt;/p&gt;

&lt;p&gt;The real gift? The confidence to experiment without fear 🎄🎁&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://www.linkedin.com/posts/kourtney-meiss_on-the-11th-day-of-christmas-amazon-developer-activity-7409246424057499648-aOpi?utm_source=share&amp;amp;amp%3Butm_medium=member_desktop&amp;amp;amp%3Brcm=ACoAABJ7qyEBKdMAQVNhclGeXwCrJ-uZ8rlJwsc" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdms.licdn.com%2Fplaylist%2Fvid%2Fv2%2FD5605AQGcvlBjs3THiA%2Fthumbnail-with-play-button-overlay-high%2FB56ZsTHZV0JoDM-%2F0%2F1765552265798%3Fe%3D2147483647%26v%3Dbeta%26t%3DU7R_g-xK602AV06lNpiZ1en02pI08OzfsVQtF3dycUM" height="auto" class="m-0"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://www.linkedin.com/posts/kourtney-meiss_on-the-11th-day-of-christmas-amazon-developer-activity-7409246424057499648-aOpi?utm_source=share&amp;amp;amp%3Butm_medium=member_desktop&amp;amp;amp%3Brcm=ACoAABJ7qyEBKdMAQVNhclGeXwCrJ-uZ8rlJwsc" rel="noopener noreferrer" class="c-link"&gt;
            🎵 On the 11th day of Christmas, Amazon Developer gave to me…Checkpointing in Kiro 🎵

Have you ever let an AI agent refactor your code, only to realize you want to try a different approach? Kiro's… | Kourtney M.
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            🎵 On the 11th day of Christmas, Amazon Developer gave to me…Checkpointing in Kiro 🎵

Have you ever let an AI agent refactor your code, only to realize you want to try a different approach? Kiro's checkpointing feature(➡️ https://lnkd.in/gRKCxyvZ) lets you rewind to any point in your session with one click. 

✨ Automatic checkpoint markers are added to your session as Kiro modifies code.
🔄 Easily test different approaches. If one doesn't pan out, you're one click from reverting to any point in your session to try another.
💬 Retain your conversation context while reverting changes.
✔️Available in both the Kiro IDE and CLI

While it doesn’t replace version control, it does provide an experimentation playground while Git handles the permanent record.

The real gift? The confidence to experiment without fear 🎄🎁

➕ Follow along as today is Day 11 of our 𝟭𝟮 𝗗𝗮𝘆𝘀 𝗼𝗳 𝗔𝗺𝗮𝘇𝗼𝗻 𝗗𝗲𝘃𝗲𝗹𝗼𝗽𝗲𝗿 🎄
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fstatic.licdn.com%2Faero-v1%2Fsc%2Fh%2Fal2o9zrvru7aqj8e1x2rzsrca"&gt;
          linkedin.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;




&lt;h2&gt;
  
  
  🎵 On the 12th day of Christmas, Amazon Developer gave to me . . . Alexa+ 🎵
&lt;/h2&gt;

&lt;p&gt;by emersonsklar&lt;/p&gt;

&lt;p&gt;If the past year has proven anything, it’s that conversational AI and voice assistants are very much back in the spotlight. Our friends in the industry have absolutely reinvigorated excitement in this space, and, candidly, their very visible rough edges have made one thing clear: this is still hard to get right. Which is exactly why I’m so excited about Alexa+.&lt;/p&gt;

&lt;p&gt;🚀 What’s different this time?&lt;br&gt;
Alexa+ represents a step-change from the original Alexa experience:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;More natural, contextual conversations&lt;/li&gt;
&lt;li&gt;Better reasoning and follow-through, not just command → response&lt;/li&gt;
&lt;li&gt;Deeper integration across devices and services&lt;/li&gt;
&lt;li&gt;Designed to feel less like a skill invocation and more like an assistant that actually gets what you’re trying to do&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🤖 Why now?&lt;br&gt;
Let’s be honest. Many of us have had recent moments with other assistants where we thought: “Wow… this should be better than this by now.” The good news? That bar (currently lying on the floor 😅) makes it even easier to be genuinely excited about what Alexa+ brings to the table.&lt;/p&gt;

&lt;p&gt;🌟 Why developers should care&lt;br&gt;
 This isn’t just a UI refresh—it’s a rethinking of how voice, AI, and agents come together. Alexa+ opens up new possibilities for building experiences that feel more human, more useful, and more embedded in everyday life. Our developer tools aren't publicly available yet, but stay tuned - we have some extraordinary new solutions currently in private beta that make it easier than ever before to make incredibly engaging, useful, and functional experiences.&lt;/p&gt;

&lt;p&gt;I’m thrilled to see where this goes, and even more excited about what builders will create on top of it.&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://www.linkedin.com/posts/emersonsklar_alexa-amazondeveloper-alexaplus-activity-7409753237156712448-pXvs?utm_source=share&amp;amp;amp%3Butm_medium=member_desktop&amp;amp;amp%3Brcm=ACoAABJ7qyEBKdMAQVNhclGeXwCrJ-uZ8rlJwsc" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fstatic.licdn.com%2Faero-v1%2Fsc%2Fh%2Fc45fy346jw096z9pbphyyhdz7" height="auto" class="m-0"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://www.linkedin.com/posts/emersonsklar_alexa-amazondeveloper-alexaplus-activity-7409753237156712448-pXvs?utm_source=share&amp;amp;amp%3Butm_medium=member_desktop&amp;amp;amp%3Brcm=ACoAABJ7qyEBKdMAQVNhclGeXwCrJ-uZ8rlJwsc" rel="noopener noreferrer" class="c-link"&gt;
            Alexa+ Revolutionizes Conversational AI with Natural Conversations and Deeper Integration | Emerson Sklar posted on the topic | LinkedIn
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            🎄 On the 12th day of Christmas, Amazon Developer gave to me…
 ✨ #Alexa+ ✨
If the past year has proven anything, it’s that conversational AI and voice assistants are very much back in the spotlight. Our friends in the industry have absolutely reinvigorated excitement in this space, and, candidly, their very visible rough edges have made one thing clear: this is still hard to get right.
Which is exactly why I’m so excited about Alexa+.
🚀 What’s different this time?
Alexa+ represents a step-change from the original Alexa experience:
- More natural, contextual conversations
- Better reasoning and follow-through, not just command → response
- Deeper integration across devices and services
- Designed to feel less like a skill invocation and more like an assistant that actually gets what you’re trying to do
🤖 Why now?
 Let’s be honest. Many of us have had recent moments with other assistants where we thought: “Wow… this should be better than this by now.” The good news? That bar (currently lying on the floor 😅) makes it even easier to be genuinely excited about what Alexa+ brings to the table.
🌟 Why developers should care
 This isn’t just a UI refresh—it’s a rethinking of how voice, AI, and agents come together. Alexa+ opens up new possibilities for building experiences that feel more human, more useful, and more embedded in everyday life. Our developer tools aren't publicly available yet, but stay tuned - we have some extraordinary new solutions currently in private beta that make it easier than ever before to make incredibly engaging, useful, and functional experiences.
I’m thrilled to see where this goes, and even more excited about what builders will create on top of it.
🎁 Onward to Christmas (and with a cheeky little tune, generated with Alexa and Suno - https://lnkd.in/gnDvzW_m)  
#AmazonDeveloper #AlexaPlus #ConversationalAI #VoiceAI #GenerativeAI #AWSreInvent #BuiltOnAWS
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fstatic.licdn.com%2Faero-v1%2Fsc%2Fh%2Fal2o9zrvru7aqj8e1x2rzsrca"&gt;
          linkedin.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;




&lt;p&gt;And with that we would like to leave you with a cheeky tune created by &lt;a href="https://drive.google.com/file/d/13QC5nbbZdygzfNcbqOEs5Bp3hjqyojNH/view" rel="noopener noreferrer"&gt;Alexa and Suno!&lt;/a&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>aws</category>
      <category>ai</category>
      <category>javascript</category>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>Anisha Malde</dc:creator>
      <pubDate>Mon, 11 Aug 2025 12:19:19 +0000</pubDate>
      <link>https://dev.to/anishamalde/-3bj0</link>
      <guid>https://dev.to/anishamalde/-3bj0</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/dannyhw/react-native-web-with-vite-1jg5" class="crayons-story__hidden-navigation-link"&gt;React Native Web with Vite&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/dannyhw" class="crayons-avatar  crayons-avatar--l  "&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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F88947%2F66d196f0-e1a9-4f18-8336-2c78408c28dd.jpg" alt="dannyhw profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/dannyhw" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Danny
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Danny
                
              
              &lt;div id="story-author-preview-content-2747987" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/dannyhw" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F88947%2F66d196f0-e1a9-4f18-8336-2c78408c28dd.jpg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Danny&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/dannyhw/react-native-web-with-vite-1jg5" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Aug 11 '25&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/dannyhw/react-native-web-with-vite-1jg5" id="article-link-2747987"&gt;
          React Native Web with Vite
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/vite"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;vite&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/reactnative"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;reactnative&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/react"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;react&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/storybook"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;storybook&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/dannyhw/react-native-web-with-vite-1jg5" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/exploding-head-daceb38d627e6ae9b730f36a1e390fca556a4289d5a41abb2c35068ad3e2c4b5.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;11&lt;span class="hidden s:inline"&gt; reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/dannyhw/react-native-web-with-vite-1jg5#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              &lt;span class="hidden s:inline"&gt;Add Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            8 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>vite</category>
      <category>reactnative</category>
      <category>react</category>
      <category>storybook</category>
    </item>
    <item>
      <title>The hidden costs in your package.json</title>
      <dc:creator>Anisha Malde</dc:creator>
      <pubDate>Fri, 11 Jul 2025 12:44:40 +0000</pubDate>
      <link>https://dev.to/amazonappdev/the-hidden-costs-in-your-pacakgejson-52jo</link>
      <guid>https://dev.to/amazonappdev/the-hidden-costs-in-your-pacakgejson-52jo</guid>
      <description>&lt;h2&gt;
  
  
  How do you choose what goes in your package.json?
&lt;/h2&gt;

&lt;p&gt;Is it based on what the team’s used before? What has the most GitHub stars? Or because some article on dev.to told you to use it? 😶&lt;/p&gt;

&lt;p&gt;As a React (Native) Developer, this was something I never really thought about until TV development forced me to. Think about the performance gap between an iPhone and a Fire Stick - devices with 1GB of RAM don’t give you room for extra library 'costs'. &lt;/p&gt;

&lt;p&gt;Why? Your library choices directly affect how fast your app feels to users because your JavaScript bundle size impacts Time to Interactive (TTI - how long it takes for the app to become fully interactive after the initial load), memory usage, and CPU usage during run time.&lt;/p&gt;

&lt;p&gt;So while an extra 100KB might feel negligible on mobile, we’re rarely &lt;em&gt;just&lt;/em&gt; building for mobile. Every library decision, gets amplified and can carry hidden ‘costs’ across the hardware spectrum our apps now have to support.  &lt;/p&gt;

&lt;h2&gt;
  
  
  Let's take an example, a commonly suggested swap - &lt;a href="https://momentjs.com/" rel="noopener noreferrer"&gt;moment.js&lt;/a&gt; for &lt;a href="https://date-fns.org/" rel="noopener noreferrer"&gt;date-fns&lt;/a&gt;:
&lt;/h2&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.amazonaws.com%2Fuploads%2Farticles%2F0qjudxp1gb9jac38m04o.png" 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.amazonaws.com%2Fuploads%2Farticles%2F0qjudxp1gb9jac38m04o.png" alt="headlines from dev.to" width="800" height="441"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We can use &lt;a href="http://bundlephobia.com/" rel="noopener noreferrer"&gt;bundlephobia.com&lt;/a&gt; to quickly check the ‘cost’ of adding a npm library to your bundle. Upon checking, it tells us &lt;code&gt;moment.js&lt;/code&gt; clocks in at around 300KB, while &lt;code&gt;date-fns&lt;/code&gt; is a much leaner 77KB:&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.amazonaws.com%2Fuploads%2Farticles%2F1lngtbnad4hfmrzoliuu.png" 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.amazonaws.com%2Fuploads%2Farticles%2F1lngtbnad4hfmrzoliuu.png" alt="Bundlephobia results" width="800" height="417"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Okay so we should definitely use &lt;code&gt;date-fns&lt;/code&gt;  right? 🧐
&lt;/h2&gt;

&lt;p&gt;Well since I no longer trust anything on the internet 👀, I did some more digging. I added each package to a clean app and then analysed the actual JS bundle using &lt;a href="https://expo.dev/blog/introducing-expo-atlas" rel="noopener noreferrer"&gt;Expo Atlas&lt;/a&gt;(you could also use react-native-bundle-analyzer) and something surprising happened. &lt;code&gt;date-fns&lt;/code&gt; showed up as the larger library:&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.amazonaws.com%2Fuploads%2Farticles%2Fubmli3zqu3hm7jkpfojj.png" 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.amazonaws.com%2Fuploads%2Farticles%2Fubmli3zqu3hm7jkpfojj.png" alt="Expo atlast results" width="800" height="417"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Wait — waat?
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;date-fns&lt;/code&gt; is architected as 300+ small utility files, each doing one thing. Now that’s great &lt;em&gt;if&lt;/em&gt; your bundler is properly configured for &lt;a href="https://developer.mozilla.org/en-US/docs/Glossary/Tree_shaking" rel="noopener noreferrer"&gt;tree shaking&lt;/a&gt; — it can strip out unused code, and only include what you call. But for React Native developers, like me, &lt;a href="https://metrobundler.dev/" rel="noopener noreferrer"&gt;the metro bundler&lt;/a&gt; isn’t configured for tree shaking by default. Now while it is currently experimental with Expo, if you aren’t tree shaking, or your import patterns are off — &lt;/p&gt;

&lt;p&gt;&lt;code&gt;import * from 'library'&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;— you end up bundling all 300 files, whether you use them or not. &lt;/p&gt;

&lt;p&gt;At this point your probably still like:&lt;/p&gt;

&lt;h2&gt;
  
  
  Okay, So?
&lt;/h2&gt;

&lt;p&gt;Its just a few extra KBs, how bad can it be? Well I decided to measure what those extra KB’s did to my app’s perceived speed. I created a simple Android app using React Native &amp;amp; Expo and rendered the date using each library. I then used our &lt;a href="https://github.com/AmazonAppDev/fireos-perf-testing" rel="noopener noreferrer"&gt;Fire-OS perf testing tool&lt;/a&gt; to see how each library would perform on my Amazon Fire Stick. The results were 😲 &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Those 200KB increased our time to interaction (latency) from cold start by 3%:&lt;/strong&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.amazonaws.com%2Fuploads%2Farticles%2Fkcbca8rd47aujrz7gddh.png" 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.amazonaws.com%2Fuploads%2Farticles%2Fkcbca8rd47aujrz7gddh.png" alt="FOS performance testing results" width="800" height="404"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now this is just an example but this could be any library. &lt;/p&gt;

&lt;p&gt;So here’s the thing, a library might look super helpful but it always comes at a cost. And with a broad spectrum of devices, those costs hit harder. So how can we weigh up the costs? Heres a my -&lt;/p&gt;

&lt;h2&gt;
  
  
  Checklist for adding a  library
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;First, as we saw, check the actual bundle size on your target platforms&lt;/li&gt;
&lt;li&gt;Then measure the performance cost &lt;/li&gt;
&lt;li&gt;And finally consider platform quirks e.g. FlashList might work on mobile but on TV platforms it might not have the functionality to handle the the dynamic, focusable content we have to deal with.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;So don’t wait for the hidden costs to sneak up on your app performance. &lt;/p&gt;

&lt;p&gt;Be deliberate. Be Critical. Every library in your &lt;code&gt;package.json&lt;/code&gt; should earn its place 🏅&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>react</category>
      <category>reactnative</category>
      <category>npm</category>
    </item>
    <item>
      <title>An Android Developer's Guide to React Native</title>
      <dc:creator>Anisha Malde</dc:creator>
      <pubDate>Wed, 12 Mar 2025 14:43:10 +0000</pubDate>
      <link>https://dev.to/amazonappdev/an-android-developers-guide-to-react-native-j66</link>
      <guid>https://dev.to/amazonappdev/an-android-developers-guide-to-react-native-j66</guid>
      <description>&lt;p&gt;Thinking of transitioning from Android to React Native? Hopefully this guide will help with the mental shift of learning React Native development from an Android background. But don’t worry, I won't tell anyone you're experimenting with "the other side", your secret's safe with me! 😉&lt;/p&gt;

&lt;p&gt;Your learning experience going from Android to React Native will largely depend on your existing Android development background. Coming from &lt;a href="https://developer.android.com/develop/ui/views/layout/declaring-layout" rel="noopener noreferrer"&gt;'traditional' View/XMLbased&lt;/a&gt; Android development, you will have a different learning curve compared to those with &lt;a href="https://developer.android.com/develop/ui/compose/documentation" rel="noopener noreferrer"&gt;Jetpack Compose&lt;/a&gt; experience. If you're already familiar with Compose's declarative UI model, you are in luck ☺️, you'll find parallel concepts in React Native's component based approach. However, if you've been working with XML layouts and imperative View manipulations, the mental shift will likely be more substantial.&lt;/p&gt;

&lt;p&gt;Regardless of your starting point, we will look at the main concepts that are different. Before we start, let's clarify some 'pre-requisites' to your React Native learning journey:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Learning JavaScript&lt;/strong&gt; - While I won't go into the details of JavaScript vs Java/Kotlin, understanding JavaScript is essential since React Native targets TypeScript by default. Please, please learn JavaScript first to build a solid foundation.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Understanding React Fundamentals&lt;/strong&gt; - React Native is built on React so you will need to understand React fundamentals as React Native components as the core concepts are the same. Due to this, everything in this article that refers to React will apply to React Native. &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Thinking in React vs Android
&lt;/h2&gt;

&lt;p&gt;When building a user interface with React, you follow a different mental model than Android development. In React, you will first break the UI into pieces called components. Then, you will describe the different visual states for each of your components. Finally, you will connect your components together so that the data flows through them. &lt;/p&gt;

&lt;p&gt;In Android, your architectural approach will depend on your chosen UI framework. Here's a simplified comparison:&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.amazonaws.com%2Fuploads%2Farticles%2Ffzpc91u5azmlxx9ftfq0.png" 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.amazonaws.com%2Fuploads%2Farticles%2Ffzpc91u5azmlxx9ftfq0.png" alt="Differences in architectural approach" width="800" height="683"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The most fundamental shift in thinking is that React doesn't have the same component segregation as Android. Android applications are structured around four main components and intents:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Activities&lt;/strong&gt;: Entry points for user interaction, representing a single screen with UI&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Services&lt;/strong&gt;: Components that run in the background to perform long running operations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Broadcast Receivers&lt;/strong&gt;: Components that respond to system wide broadcast announcements&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Content Providers&lt;/strong&gt;: Components that manage shared app data&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Intent&lt;/strong&gt;: An asynchronous message called that activates activities, services, and broadcast receivers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In a React App, most functionality centers around UI components and their state management, with background operations handled through different mechanisms.&lt;/p&gt;

&lt;p&gt;If we were to loosely bridge our Mental Model:&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.amazonaws.com%2Fuploads%2Farticles%2Fhqjzj03g6g4dss6r0kc6.png" 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.amazonaws.com%2Fuploads%2Farticles%2Fhqjzj03g6g4dss6r0kc6.png" alt="Mental model of React Native vs Android components" width="800" height="683"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let's examine the composition of a typical React application and see how the architecture translates to the common building blocks of an 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.amazonaws.com%2Fuploads%2Farticles%2F3dlvz9evvrhvxt2ky493.png" 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.amazonaws.com%2Fuploads%2Farticles%2F3dlvz9evvrhvxt2ky493.png" alt="Common building blocks of a RN App" width="800" height="292"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In React Native's you structure your application around components and their interactions which means it doesn't have a prescribed structure. Instead, it leaves it up you, to determine the best way to structure the app's components and data flow. It also means you'll need to make intentional decisions about how to organize your code. &lt;/p&gt;

&lt;p&gt;A typical React Native project structure could look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;my-app/&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;├──&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;android/&lt;/span&gt;&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Native&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Android&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;project&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;files&lt;/span&gt;&lt;span class="w"&gt; 
&lt;/span&gt;&lt;span class="err"&gt;├──&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;ios/&lt;/span&gt;&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Native&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;iOS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;project&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;files&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;├──&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;node_modules/&lt;/span&gt;&lt;span class="w"&gt;           &lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;NPM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;dependencies&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;(equivalent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Gradle&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;dependencies)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;├──&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;src/&lt;/span&gt;&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Your&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;JavaScript/TypeScript&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;code&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;(like&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;app/src/main&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Android)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;│&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="err"&gt;├──&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;components/&lt;/span&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Reusable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;UI&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;components&lt;/span&gt;&lt;span class="w"&gt; 
&lt;/span&gt;&lt;span class="err"&gt;│&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="err"&gt;├──&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;screens/&lt;/span&gt;&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Screen&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;components&lt;/span&gt;&lt;span class="w"&gt; 
&lt;/span&gt;&lt;span class="err"&gt;│&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="err"&gt;├──&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;navigation/&lt;/span&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Navigation&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;configuration&lt;/span&gt;&lt;span class="w"&gt; 
&lt;/span&gt;&lt;span class="err"&gt;│&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="err"&gt;├──&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;services/&lt;/span&gt;&lt;span class="w"&gt;           &lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;API&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;calls,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;business&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;logic&lt;/span&gt;&lt;span class="w"&gt; 
&lt;/span&gt;&lt;span class="err"&gt;│&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="err"&gt;├──&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;hooks/&lt;/span&gt;&lt;span class="w"&gt;              &lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Custom&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;hooks&lt;/span&gt;&lt;span class="w"&gt; 
&lt;/span&gt;&lt;span class="err"&gt;│&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="err"&gt;├──&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;context/&lt;/span&gt;&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;React&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Context&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;definitions&lt;/span&gt;&lt;span class="w"&gt; 
&lt;/span&gt;&lt;span class="err"&gt;│&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="err"&gt;├──&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;utils/&lt;/span&gt;&lt;span class="w"&gt;              &lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Helper&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;functions&lt;/span&gt;&lt;span class="w"&gt; 
&lt;/span&gt;&lt;span class="err"&gt;│&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="err"&gt;└──&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;assets/&lt;/span&gt;&lt;span class="w"&gt;             &lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Images,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;fonts,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;etc.&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;(like&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;res/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;directory)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;├──&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;App.js&lt;/span&gt;&lt;span class="w"&gt;                  &lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Root&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;component&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;(comparable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Application&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;class)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;├──&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;index.js&lt;/span&gt;&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Entry&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;point&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;(like&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;MainActivity)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;├──&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;package.json&lt;/span&gt;&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;NPM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;configuration&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;(equivalent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;build.gradle)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;├──&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;metro.config.js&lt;/span&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Metro&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;bundler&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;config&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;(like&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;gradle&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;config)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;├──&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;babel.config.js&lt;/span&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Babel&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;transpiler&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;config&lt;/span&gt;&lt;span class="w"&gt; 
&lt;/span&gt;&lt;span class="err"&gt;└──&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;tsconfig.json&lt;/span&gt;&lt;span class="w"&gt;           &lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;TypeScript&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;configuration&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now that we've mapped the fundamental architectural concepts between Android and React Native and examined a typical project structure lets mentally map the core building blocks of a React Native application.&lt;/p&gt;

&lt;h2&gt;
  
  
  UI: Components, Layout and Styling
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Component Mental Model
&lt;/h3&gt;

&lt;p&gt;In Android, your UI building blocks are or Views/ViewGroups for traditional development and Composable functions for Jetpack Compose. In React Native, everything is a Component. &lt;/p&gt;

&lt;p&gt;Traditional Android development is imperative, you manually manipulate the UI. React Native is declarative, you describe what the UI should look like.&lt;/p&gt;

&lt;h3&gt;
  
  
  Layouts
&lt;/h3&gt;

&lt;p&gt;React Native uses &lt;a href="https://reactnative.dev/docs/flexbox" rel="noopener noreferrer"&gt;Flexbox&lt;/a&gt; for layout, which differs from Android's traditional XML layout systems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Layout Containers&lt;/strong&gt;: Instead of &lt;code&gt;LinearLayout&lt;/code&gt;, &lt;code&gt;RelativeLayout&lt;/code&gt;, or &lt;code&gt;ConstraintLayout&lt;/code&gt;, you'll use View components with flex properties&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Units&lt;/strong&gt;: No dp or sp, React Native uses platform independent units that automatically scale based on device settings&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Positioning&lt;/strong&gt;: Uses properties like &lt;code&gt;justifyContent&lt;/code&gt; and &lt;code&gt;alignItems&lt;/code&gt; rather than Android's gravity attributes&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Styling
&lt;/h3&gt;

&lt;p&gt;React Native provides a &lt;a href="https://reactnative.dev/docs/style" rel="noopener noreferrer"&gt;CSS-like&lt;/a&gt; styling system that will feel both familiar and different to Android developers as it combines concepts from web CSS and native mobile development:&lt;/p&gt;

&lt;p&gt;Instead of XML style resources or Compose's modifier system, React Native uses JavaScript objects for styling. You then apply these styles to components either directly to components inline or using the StyleSheet API.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&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;Text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;StyleSheet&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="s2"&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="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;StyleExample&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="c1"&gt;// StyleSheet example&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;View&lt;/span&gt; &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;styles&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;container&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      // Inline example
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt;
        &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;fontSize&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;blue&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="si"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        Inline Style Example
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;View&lt;/span&gt;&lt;span class="p"&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="c1"&gt;// StyleSheet definition&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;styles&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;StyleSheet&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;container&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;16&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;ul&gt;
&lt;li&gt;
&lt;strong&gt;No Resource Qualifiers&lt;/strong&gt;: No built-in system for different screen sizes/orientations like Android's resource qualifiers&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Responsive Design&lt;/strong&gt;: Relies on percentage values, flex properties, and Dimensions API rather than different layout files&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Style Resets&lt;/strong&gt;: No global style inheritance by default; each component needs explicit styling
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// In React Native, this won't work as expected:&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;View&lt;/span&gt; &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;red&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;This text will NOT be red&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;View&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="c1"&gt;// Each component needs explicit styling:&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;View&lt;/span&gt; &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;backgroundColor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;blue&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt; &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;red&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;This text will be red&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;View&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Density Adaptation&lt;/strong&gt;: While Android uses specific density buckets (mdpi, hdpi, etc.), React Native abstracts this away. All dimensions in React Native are unitless, and represent density independent pixels.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No XML Resources&lt;/strong&gt;: No separate styling files or resource qualifiers like in Android&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No Built in Theme / Design System&lt;/strong&gt;: No direct equivalent to Android's theme system; theme typically managed with Context&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  State
&lt;/h2&gt;

&lt;p&gt;Similar to the architectural differences, your approach to state management will vary based on whether you come from ‘traditional’ Android or Jetpack Compose.&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.amazonaws.com%2Fuploads%2Farticles%2Fwnukbnj9zl0kjhjuojuh.png" 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.amazonaws.com%2Fuploads%2Farticles%2Fwnukbnj9zl0kjhjuojuh.png" alt="State architectural differences" width="800" height="585"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Core State Components - Props,  Hooks and Context
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Props&lt;/strong&gt;: Props (short for "properties") is immutable data passed from parent to child components. Since they are immtable they help make your components reusable. &lt;/p&gt;

&lt;p&gt;In the Android world, props are similar to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Arguments passed to a Fragment&lt;/li&gt;
&lt;li&gt;Intent extras passed to an Activity&lt;/li&gt;
&lt;li&gt;Parameters passed to a constructor&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Hooks&lt;/strong&gt;: Functions provided by React that lets a developer hook into React features from the component.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Context&lt;/strong&gt;: Context provides a way to pass data through the component tree without having to pass props down manually at every level.&lt;/p&gt;

&lt;h3&gt;
  
  
  Core State Concepts
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;State as the Single Source of Truth&lt;/strong&gt;&lt;br&gt;
Instead of thinking about how to update the UI, think about what the UI should look like for a given state. The UI is a reflection of your state, not the other way around.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Components as Pure Functions&lt;/strong&gt;&lt;br&gt;
Given the same props/state, a component should always render the same way. Side effects are handled separately through useEffect.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Immutable Updates&lt;/strong&gt;&lt;br&gt;
Instead of modifying views in place, create new state that describes the updated.&lt;/p&gt;
&lt;h3&gt;
  
  
  Component Lifecycle
&lt;/h3&gt;

&lt;p&gt;In traditional Android, you work with a set of lifecycle callbacks to manage an activities state throughout its existence, while React Native uses a simpler mount/unmount lifecycle model ‘accessed’ by the useEffect hook on a component level. Here's how they compare:&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.amazonaws.com%2Fuploads%2Farticles%2Fp2vozo9w6tsh15airmaf.png" 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.amazonaws.com%2Fuploads%2Farticles%2Fp2vozo9w6tsh15airmaf.png" alt="Component lifecycle comparison" width="800" height="312"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Navigation
&lt;/h2&gt;

&lt;p&gt;In ‘traditional’ Android, navigation is primarily managed through the Intent system &amp;amp; Activity stack and with Jetpack Compose the &lt;a href="https://developer.android.com/guide/navigation" rel="noopener noreferrer"&gt;Navigation Component&lt;/a&gt;. React Native navigation differs from Android in several ways:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No Built-in System&lt;/strong&gt;: Unlike Android's core &lt;a href="https://developer.android.com/reference/android/content/Intent" rel="noopener noreferrer"&gt;Intent and Activity&lt;/a&gt; systems, React Native doesn't have a built-in navigation framework. Instead you need to chose a 3P library, &lt;a href="https://reactnavigation.org/" rel="noopener noreferrer"&gt;React Navigation&lt;/a&gt; being the most &lt;a href="https://results.2024.stateofreactnative.com/en-US/navigation/" rel="noopener noreferrer"&gt;widely adopted &lt;/a&gt;solution.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Component-Based&lt;/strong&gt;: Navigation is implemented through components rather than system level intents&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stack-Based Model&lt;/strong&gt;: Similar to Android's back stack but implemented in JavaScript. Navigation routes and transitions are defined in JavaScript rather than XML or system calls.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;While the fundamental concepts of navigation remain similar between Android and React Native, the implementation differs and can be mentally bridged as follows:&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.amazonaws.com%2Fuploads%2Farticles%2F0odnpa9nzwhxz5lev1k7.png" 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.amazonaws.com%2Fuploads%2Farticles%2F0odnpa9nzwhxz5lev1k7.png" alt="Navigation comparison" width="800" height="641"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Android Intent equivalent&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;HomeScreen&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;navigation&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="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Button&lt;/span&gt;
      &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Go to Details"&lt;/span&gt;
      &lt;span class="na"&gt;onPress&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&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="c1"&gt;// Instead of startActivity() with an Intent&lt;/span&gt;
        &lt;span class="nx"&gt;navigation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;navigate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Details&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;itemId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;86&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Product Details&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="si"&gt;}&lt;/span&gt;
    &lt;span class="p"&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="c1"&gt;// Accessing route params (similar to Intent extras)&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;DetailsScreen&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;route&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;itemId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;title&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;route&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;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;View&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Details for &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Item ID: &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;itemId&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;View&lt;/span&gt;&lt;span class="p"&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;h2&gt;
  
  
  Business Logic
&lt;/h2&gt;

&lt;p&gt;There is a significant mental shift when moving from Android to React Native in the relationship between UI and business logic.&lt;/p&gt;

&lt;p&gt;In Android Development&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;UI and business logic code typically exist as coequal concerns&lt;/li&gt;
&lt;li&gt;Architecture patterns like MVVM, MVP, or MVC clearly separate presentation from business logic&lt;/li&gt;
&lt;li&gt;Backend code (repositories, services, managers) often feels as substantial as UI code&lt;/li&gt;
&lt;li&gt;UI is frequently thought of as "just the view" that renders the data&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In React Native Development&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;UI components and business logic are more tightly integrated&lt;/li&gt;
&lt;li&gt;Components execute both presentation and logic behavior&lt;/li&gt;
&lt;li&gt;The architecture is more "UI forward" with logic serving the UI&lt;/li&gt;
&lt;li&gt;Hooks blend UI and logic concerns within the same component&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In React Native, you'll likely find yourself starting with the UI and then adding the logic it needs, rather than designing backend services first. This "UI driven" approach stems from React's component based architecture, where components are the primary building blocks. As projects grow in complexity, you might still extract pure business logic into custom hooks, contexts, or services as seen in the example project structure above. As you continue your React Native journey, you'll likely develop your own style for balancing these concerns&lt;/p&gt;

&lt;p&gt;While React Native changes how you structure your UI and business logic relationship, the backend services (API clients, data parsing, and state synchronization) remain conceptually similar to Android and your backend services can power both Android and React Native apps. In React Native, the libraries you'll typically use:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://reactnative.dev/docs/network" rel="noopener noreferrer"&gt;Fetch&lt;/a&gt; or &lt;a href="https://github.com/axios/axios" rel="noopener noreferrer"&gt;axios&lt;/a&gt; for API calls&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/react-native-async-storage/async-storage" rel="noopener noreferrer"&gt;AsyncStorage&lt;/a&gt; for data persistence&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://reactnative.dev/docs/turbo-native-modules-introduction" rel="noopener noreferrer"&gt;Native Modules&lt;/a&gt;  for Platform API / Capabilities&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The key difference isn't in what backend services you need but in how they integrate with your component structure. You'll often create custom hooks that encapsulate data fetching and state management, then consume these hooks directly in your components. &lt;/p&gt;

&lt;h2&gt;
  
  
  Further Learning
&lt;/h2&gt;

&lt;p&gt;Hopefully this guide helps you mentally map React Native to some familiar Android development concepts, but remember that this mental mapping is just the beginning. While these comparisons provide a start for understanding how React differs from Android, they aren't a substitute for deeper learning and practice. To continue your React Native learning journey, here are some valuable resources:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://reactnative.dev/docs/getting-started" rel="noopener noreferrer"&gt;React Native Official Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.udemy.com/course/react-native-the-practical-guide/" rel="noopener noreferrer"&gt;React Native: The Practical Guide on Udemy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.expo.dev/" rel="noopener noreferrer"&gt;Expo&lt;/a&gt; - React Native framework&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Hopefully I’ll see you on "the other side" 😉&lt;/p&gt;

</description>
      <category>android</category>
      <category>react</category>
      <category>reactnative</category>
      <category>beginners</category>
    </item>
    <item>
      <title>How does React Native's New Architecture affect performance?</title>
      <dc:creator>Anisha Malde</dc:creator>
      <pubDate>Thu, 06 Feb 2025 17:37:19 +0000</pubDate>
      <link>https://dev.to/amazonappdev/how-does-react-natives-new-architecture-affect-performance-1dkf</link>
      <guid>https://dev.to/amazonappdev/how-does-react-natives-new-architecture-affect-performance-1dkf</guid>
      <description>&lt;h2&gt;
  
  
  What is the New architecture?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://reactnative.dev/architecture/landing-page" rel="noopener noreferrer"&gt;React Native's new architecture&lt;/a&gt; was introduced in version &lt;a href="https://reactnative.dev/blog/2022/03/30/version-068" rel="noopener noreferrer"&gt;0.68&lt;/a&gt; and was made default in &lt;a href="https://reactnative.dev/blog/2024/10/23/release-0.76-new-architecture" rel="noopener noreferrer"&gt;0.76&lt;/a&gt;. It was built to unlock capabilities and improvements that were not possible in the legacy architecture. Switching to the new architecture unlocks these new capabilities which in turn &lt;em&gt;can&lt;/em&gt; help improve the performance of your apps. I say &lt;em&gt;can&lt;/em&gt; because performance improvements will vary depending on how your app is designed, implemented and built.&lt;/p&gt;

&lt;p&gt;The new architecture comprises of &lt;a href="https://reactnative.dev/architecture/fabric-renderer" rel="noopener noreferrer"&gt;Fabric&lt;/a&gt;, &lt;a href="https://reactnative.dev/docs/turbo-native-modules-introduction" rel="noopener noreferrer"&gt;Turbo Native Modules&lt;/a&gt;, &lt;a href="https://reactnative.dev/docs/the-new-architecture/what-is-codegen" rel="noopener noreferrer"&gt;Codegen&lt;/a&gt;, and the &lt;a href="https://reactnative.dev/architecture/glossary#javascript-interfaces-jsi" rel="noopener noreferrer"&gt;JavaScript Interface&lt;/a&gt; (JSI).&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.amazonaws.com%2Fuploads%2Farticles%2F2w486w2y6yzl0x2zux8b.png" 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.amazonaws.com%2Fuploads%2Farticles%2F2w486w2y6yzl0x2zux8b.png" alt="React Natives New Architecture" width="800" height="300"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How can each pillar affect performance?
&lt;/h2&gt;

&lt;p&gt;Fabric, the new rendering system, enables more efficient UI updates by minimising the time it takes to update the UI, including smoother scrolling, more responsive focus changes, and fluid animations.&lt;/p&gt;

&lt;p&gt;Turbo Native Modules are the next iteration of Native Modules that address the asynchronous and loading problems by lazy loading modules. Turbo Native Modules can improve performance as by bypassing the JavaScript bridge and directly communicating with native code, they reduce the overhead of communication between JavaScript and native code. This can mean faster app startup and quicker response times from the Native layer, addressing a common pain point in the app user experience where users expect instant responsiveness.&lt;/p&gt;

&lt;p&gt;JSI (JavaScript Interface) eliminates the overhead of the bridge by providing an abstraction layer to the JavaScript Runtime. This synchronous communication significantly reduces latency, creating more fluid interfaces. &lt;/p&gt;

&lt;p&gt;Codegen enhances type safety and reduces runtime overhead. Additionally, Codegen facilitates the creation of JSI bindings, and utilizing these bindings allows your app to achieve faster and more optimized communication between the native and JavaScript layers, leading to more stable and efficient apps.&lt;/p&gt;

&lt;p&gt;Finally the New Architecture adds full support for modern React features, including &lt;a href="https://react.dev/blog/2022/03/29/react-v18#new-feature-automatic-batching" rel="noopener noreferrer"&gt;automatic batching&lt;/a&gt; which is when React groups multiple state updates into a single re-render for better performance and now this will happen automatically.&lt;/p&gt;

&lt;h2&gt;
  
  
  Testing Performance
&lt;/h2&gt;

&lt;p&gt;As mentioned the performance improvements will vary depending on your specific app structure. However in order to do some basic tests Meta created an &lt;a href="https://github.com/react-native-community/RNNewArchitectureApp/tree/new-architecture-benchmarks" rel="noopener noreferrer"&gt;App&lt;/a&gt; that benchmarks the old vs new architectures. &lt;/p&gt;

&lt;p&gt;They measured an average of five measurements on physical mobile devices running React Native 0.72.0-RC.1 and the results can be found &lt;a href="https://github.com/react-native-community/RNNewArchitectureApp/tree/new-architecture-benchmarks" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I modified the app to run &lt;a href="https://www.npmjs.com/package/react-native-tvos/v/0.73.6-0" rel="noopener noreferrer"&gt;react-native-tvos@0.73.6-0&lt;/a&gt; to add TV support. You can find my repository &lt;a href="https://github.com/anishamalde/RNNewArchitectureApp/tree/add-tv-support/App" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Additionally, I created a typical MovieCard component consisted of a View, Image and 2 Text elements and took an average of 5 measurements when rendering the component 1500 times using both the old and new architecture.&lt;/p&gt;

&lt;h3&gt;
  
  
  Results
&lt;/h3&gt;

&lt;p&gt;Performance is particularly important for Apps that run on TV devices as these devices typically have resource constraints. Due to this, I decided to test on the Android TV emulator and 2 of our Amazon Fire Devices - a Tablet and a TV Stick.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;On a 1080p TV emulator running Android 14 there was an average of &lt;strong&gt;~500ms&lt;/strong&gt; improvement when using the New Architecture.&lt;/li&gt;
&lt;/ul&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.amazonaws.com%2Fuploads%2Farticles%2F5be4t0xt6z3p08ceaaa6.gif" 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.amazonaws.com%2Fuploads%2Farticles%2F5be4t0xt6z3p08ceaaa6.gif" alt="TV emulator" width="760" height="462"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;On a Fire HD Plus tablet (10th Generation) running Fire OS 7.3 there was an average of &lt;strong&gt;~900ms&lt;/strong&gt; improvement when using the New Architecture.&lt;/li&gt;
&lt;/ul&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.amazonaws.com%2Fuploads%2Farticles%2Fuv9zzns142oe232cs3px.gif" 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.amazonaws.com%2Fuploads%2Farticles%2Fuv9zzns142oe232cs3px.gif" alt="Fire Tablet" width="226" height="402"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;On a Fire TV Stick HD running Fire OS 7.6 there was an average of &lt;strong&gt;~1000ms&lt;/strong&gt; improvement when using the New Architecture.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Old Architecture&lt;/strong&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.amazonaws.com%2Fuploads%2Farticles%2Fd4vdo57xf8dsh2h5gsw2.gif" 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.amazonaws.com%2Fuploads%2Farticles%2Fd4vdo57xf8dsh2h5gsw2.gif" alt="Old Architecture Fire TV" width="720" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;New Architecture&lt;/strong&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.amazonaws.com%2Fuploads%2Farticles%2Frx79bh48deypj13dy4cn.gif" 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.amazonaws.com%2Fuploads%2Farticles%2Frx79bh48deypj13dy4cn.gif" alt="New Architecture Fire TV" width="720" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Note: On the Fire TV, I had to use a mouse as the performance was measured using a &lt;a href="https://github.com/react-native-community/RNNewArchitectureApp/tree/new-architecture-benchmarks?tab=readme-ov-file#how-we-measured-time-to-render-for-the-benchmarks" rel="noopener noreferrer"&gt;TimeStamp&lt;/a&gt;  value that was only generated when the onPress of the button was triggered by 'touch'. I will try to add this value to the onPress event object to be included even when the onPress is triggered by the D-Pad enter key.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Average Results
&lt;/h3&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.amazonaws.com%2Fuploads%2Farticles%2Fu3v4p2hbew55fqamlthw.png" 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.amazonaws.com%2Fuploads%2Farticles%2Fu3v4p2hbew55fqamlthw.png" alt="Table of Results" width="800" height="248"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Community Testing
&lt;/h2&gt;

&lt;p&gt;There are other developers that have seen improvements in performance by switching to the new architecture. &lt;a href="https://blog.kraken.com/product/engineering/how-kraken-fixed-performance-issues-via-incremental-adoption-of-the-react-native-new-architecture" rel="noopener noreferrer"&gt;Kraken&lt;/a&gt; saw render times got significantly faster, but with large variability between different screens and the biggest improvement on the slowest devices.&lt;/p&gt;

&lt;p&gt;You can also see some UI benchmarks from &lt;a href="https://blog.kraken.com/product/engineering/how-kraken-fixed-performance-issues-via-incremental-adoption-of-the-react-native-new-architecture" rel="noopener noreferrer"&gt;Alexandre&lt;/a&gt; who is a maintainer of the React Native performance measuring tool, &lt;a href="https://blog.kraken.com/product/engineering/how-kraken-fixed-performance-issues-via-incremental-adoption-of-the-react-native-new-architecture" rel="noopener noreferrer"&gt;Flashlight&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Moving to the New architecture
&lt;/h2&gt;

&lt;p&gt;While the performance benefits of migrating to the new architecture depend on the app, the UI improvements are clear. Although the transition requires effort, the long-term benefits of Fabric, Turbo Native Modules, JSI, and support for the latest React features like Suspense and Concurrent Mode, make it a worthwhile investment.&lt;/p&gt;

&lt;p&gt;You can find the full instructions in the &lt;a href="https://github.com/reactwg/react-native-new-architecture/blob/main/docs/enable-apps.md" rel="noopener noreferrer"&gt;dedicated working group&lt;/a&gt; on how to migrate to the new architecture. You can also test out the &lt;a href="https://github.com/react-native-community/RNNewArchitectureApp/tree/new-architecture-benchmarks" rel="noopener noreferrer"&gt;benchmark app&lt;/a&gt; with your own scenarios or my TV supported fork of the benchmark app &lt;a href="https://github.com/anishamalde/RNNewArchitectureApp/tree/add-tv-support" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>reactnative</category>
      <category>performance</category>
      <category>react</category>
    </item>
    <item>
      <title>How does React Native’s New Architecture affect performance?</title>
      <dc:creator>Anisha Malde</dc:creator>
      <pubDate>Thu, 06 Feb 2025 16:44:43 +0000</pubDate>
      <link>https://dev.to/anishamalde/how-does-react-natives-new-architecture-affect-performance-1ioe</link>
      <guid>https://dev.to/anishamalde/how-does-react-natives-new-architecture-affect-performance-1ioe</guid>
      <description>&lt;h3&gt;
  
  
  What is the New architecture?
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://reactnative.dev/architecture/landing-page" rel="noopener noreferrer"&gt;React Native's new architecture&lt;/a&gt; was introduced in version &lt;a href="https://reactnative.dev/blog/2022/03/30/version-068" rel="noopener noreferrer"&gt;0.68&lt;/a&gt; and was made default in &lt;a href="https://reactnative.dev/blog/2024/10/23/release-0.76-new-architecture" rel="noopener noreferrer"&gt;0.76&lt;/a&gt;. It was built to unlock capabilities and improvements that were not possible in the legacy architecture. Switching to the new architecture unlocks these new capabilities which in turn &lt;em&gt;can&lt;/em&gt; help improve the performance of your apps. I say &lt;em&gt;can&lt;/em&gt; because performance improvements will vary depending on how your app is designed, implemented and built.&lt;/p&gt;

&lt;p&gt;The new architecture comprises of &lt;a href="https://reactnative.dev/architecture/fabric-renderer" rel="noopener noreferrer"&gt;Fabric&lt;/a&gt;, &lt;a href="https://reactnative.dev/docs/turbo-native-modules-introduction" rel="noopener noreferrer"&gt;Turbo Native Modules&lt;/a&gt;, &lt;a href="https://reactnative.dev/docs/the-new-architecture/what-is-codegen" rel="noopener noreferrer"&gt;Codegen&lt;/a&gt;, and the &lt;a href="https://reactnative.dev/architecture/glossary#javascript-interfaces-jsi" rel="noopener noreferrer"&gt;JavaScript Interface&lt;/a&gt; (JSI).&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.amazonaws.com%2Fuploads%2Farticles%2F2w486w2y6yzl0x2zux8b.png" 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.amazonaws.com%2Fuploads%2Farticles%2F2w486w2y6yzl0x2zux8b.png" alt="React Natives New Architecture" width="800" height="300"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  How can each pillar affect performance?
&lt;/h3&gt;

&lt;p&gt;Fabric, the new rendering system, enables more efficient UI updates by minimising the time it takes to update the UI, including smoother scrolling, more responsive focus changes, and fluid animations.&lt;/p&gt;

&lt;p&gt;Turbo Native Modules are the next iteration of Native Modules that address the asynchronous and loading problems by lazy loading modules. Turbo Native Modules can improve performance as by bypassing the JavaScript bridge and directly communicating with native code, they reduce the overhead of communication between JavaScript and native code. This can mean faster app startup and quicker response times from the Native layer, addressing a common pain point in the app user experience where users expect instant responsiveness.&lt;/p&gt;

&lt;p&gt;JSI (JavaScript Interface) eliminates the overhead of the bridge by providing an abstraction layer to the JavaScript Runtime. This synchronous communication significantly reduces latency, creating more fluid interfaces. &lt;/p&gt;

&lt;p&gt;Codegen enhances type safety and reduces runtime overhead. Additionally, Codegen facilitates the creation of JSI bindings, and utilizing these bindings allows your app to achieve faster and more optimized communication between the native and JavaScript layers, leading to more stable and efficient apps.&lt;/p&gt;

&lt;p&gt;Finally the New Architecture adds full support for modern React features, including &lt;a href="https://react.dev/blog/2022/03/29/react-v18#new-feature-automatic-batching" rel="noopener noreferrer"&gt;automatic batching&lt;/a&gt; which is when React groups multiple state updates into a single re-render for better performance and now this will happen automatically.&lt;/p&gt;

&lt;h3&gt;
  
  
  Testing Performance
&lt;/h3&gt;

&lt;p&gt;As mentioned the performance improvements will vary depending on your specific app structure. However in order to do some basic tests Meta created an &lt;a href="https://github.com/react-native-community/RNNewArchitectureApp/tree/new-architecture-benchmarks" rel="noopener noreferrer"&gt;App&lt;/a&gt; that benchmarks the old vs new architectures. &lt;/p&gt;

&lt;p&gt;They measured an average of five measurements on physical mobile devices running React Native 0.72.0-RC.1 and the results can be found &lt;a href="https://github.com/react-native-community/RNNewArchitectureApp/tree/new-architecture-benchmarks" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I modified the app to run &lt;a href="https://www.npmjs.com/package/react-native-tvos/v/0.73.6-0" rel="noopener noreferrer"&gt;react-native-tvos@0.73.6-0&lt;/a&gt; to add TV support. You can find my repository &lt;a href="https://github.com/anishamalde/RNNewArchitectureApp/tree/add-tv-support/App" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Additionally, I created a typical MovieCard component consisted of a View, Image and 2 Text elements and took an average of 5 measurements when rendering the component 1500 times using both the old and new architecture.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Results&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Performance is particularly important for Apps that run on TV devices as these devices typically have resource constraints. Due to this, I decided to test on the Android TV emulator and 2 of our Amazon Fire Devices - a Tablet and a TV Stick.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;On a 1080p TV emulator running Android 14 there was an average of &lt;strong&gt;~500ms&lt;/strong&gt; improvement when using the New Architecture.&lt;/li&gt;
&lt;/ul&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.amazonaws.com%2Fuploads%2Farticles%2Fglw4ir2tcon653kj64sc.gif" 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.amazonaws.com%2Fuploads%2Farticles%2Fglw4ir2tcon653kj64sc.gif" alt="TV Emulator" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;On a Fire HD Plus tablet (10th Generation) running Fire OS 7.3 there was an average of &lt;strong&gt;~900ms&lt;/strong&gt; improvement when using the New Architecture.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://asset.cloudinary.com/dd6mweway/1e8b4d0ff24f1858387d0c65338b6a63" rel="noopener noreferrer"&gt;https://asset.cloudinary.com/dd6mweway/1e8b4d0ff24f1858387d0c65338b6a63&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;On a Fire TV Stick HD running Fire OS 7.6 there was an average of &lt;strong&gt;~1000ms&lt;/strong&gt; improvement when using the New Architecture.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Old Architecture&lt;/strong&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.amazonaws.com%2Fuploads%2Farticles%2Fnf8e8iq4bv33cr1327dl.gif" 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.amazonaws.com%2Fuploads%2Farticles%2Fnf8e8iq4bv33cr1327dl.gif" alt="Old Architecture Fire TV" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;New Architecture&lt;/strong&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.amazonaws.com%2Fuploads%2Farticles%2Fa7hd0ssye7h4k7segkyq.gif" 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.amazonaws.com%2Fuploads%2Farticles%2Fa7hd0ssye7h4k7segkyq.gif" alt="New Architecture Fire TV" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Note: On the Fire TV, I had to use a mouse as the performance was measured using a &lt;a href="https://github.com/react-native-community/RNNewArchitectureApp/tree/new-architecture-benchmarks?tab=readme-ov-file#how-we-measured-time-to-render-for-the-benchmarks" rel="noopener noreferrer"&gt;TimeStamp&lt;/a&gt;  value that was only generated when the onPress of the button was triggered by 'touch'. I will try to add this value to the onPress event object to be included even when the onPress is triggered by the D-Pad enter key.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Community Testing
&lt;/h3&gt;

&lt;p&gt;There are other developers that have seen improvements in performance by switching to the new architecture. &lt;a href="https://blog.kraken.com/product/engineering/how-kraken-fixed-performance-issues-via-incremental-adoption-of-the-react-native-new-architecture" rel="noopener noreferrer"&gt;Kraken&lt;/a&gt; saw render times got significantly faster, but with large variability between different screens and the biggest improvement on the slowest devices.&lt;/p&gt;

&lt;p&gt;You can also see some UI benchmarks from &lt;a href="https://blog.kraken.com/product/engineering/how-kraken-fixed-performance-issues-via-incremental-adoption-of-the-react-native-new-architecture" rel="noopener noreferrer"&gt;Alexandre&lt;/a&gt; who is a maintainer of the React Native performance measuring tool, &lt;a href="https://blog.kraken.com/product/engineering/how-kraken-fixed-performance-issues-via-incremental-adoption-of-the-react-native-new-architecture" rel="noopener noreferrer"&gt;Flashlight&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Moving to the New architecture
&lt;/h3&gt;

&lt;p&gt;While the performance benefits of migrating to the new architecture depend on the app, the UI improvements are clear. Although the transition requires effort, the long-term benefits of Fabric, Turbo Native Modules, JSI, and support for the latest React features like Suspense and Concurrent Mode, make it a worthwhile investment.&lt;/p&gt;

&lt;p&gt;You can find the full instructions in the &lt;a href="https://github.com/reactwg/react-native-new-architecture/blob/main/docs/enable-apps.md" rel="noopener noreferrer"&gt;dedicated working group&lt;/a&gt; on how to migrate to the new architecture. You can also test out the &lt;a href="https://github.com/react-native-community/RNNewArchitectureApp/tree/new-architecture-benchmarks" rel="noopener noreferrer"&gt;benchmark app&lt;/a&gt; with your own scenarios or my TV supported fork of the benchmark app &lt;a href="https://github.com/anishamalde/RNNewArchitectureApp/tree/add-tv-support" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>reactnative</category>
      <category>performance</category>
      <category>react</category>
    </item>
    <item>
      <title>My React(Native) New Years Resolutions</title>
      <dc:creator>Anisha Malde</dc:creator>
      <pubDate>Mon, 30 Dec 2024 17:02:57 +0000</pubDate>
      <link>https://dev.to/anishamalde/my-reactnative-new-years-resolutions-mgm</link>
      <guid>https://dev.to/anishamalde/my-reactnative-new-years-resolutions-mgm</guid>
      <description>&lt;p&gt;As we approach 2025, here are seven promises (not the async kind) that I'm making to myself to help improve my TS/React/React Native development habits:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. I will stop using &lt;code&gt;console.log('wtaf 🫠')&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
I confess that using &lt;code&gt;console.log('test1')&lt;/code&gt;, &lt;code&gt;console.log('test2')&lt;/code&gt;, &lt;code&gt;console.log('aaaarghhhhhhduhsufh')&lt;/code&gt; may no longer be the best debugging strategy and I really should start using &lt;a href="https://reactnative.dev/blog/2024/10/23/release-0.76-new-architecture#react-native-devtools" rel="noopener noreferrer"&gt;React Native DevTools&lt;/a&gt;! &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. I will not ignore my TypeScript errors by using &lt;code&gt;:any&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
I admit that adding &lt;code&gt;:any&lt;/code&gt; to silence my TypeScript errors is the development equivalent to 'New phone, who dis?' 😶‍🌫️&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Like my wardrobe, I will do a better job at cleaning up my useEffects&lt;/strong&gt;&lt;br&gt;
and stop using [ ] as a dependency, which is basically like shoving everything into my wardrobe before guests arrive. It's all dandy &lt;em&gt;until&lt;/em&gt; you open the door and everything falls out #MemoryLeak🚰.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. I will not use the &lt;a href="https://react.dev/learn/react-compiler" rel="noopener noreferrer"&gt;React Compiler&lt;/a&gt; as an excuse to stop improving my understanding of how to use the useMemo &amp;amp; useCallback hooks.&lt;/strong&gt;&lt;br&gt;
Let’s be honest: using useMemo to optimize performance is like almond milk — trendy but expensive. Unless you’re “lactose intolerant” (or, to be technically correct, actually dealing with expensive computations), it often introduces unnecessary overhead without delivering meaningful performance improvements.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. I will test on real devices!&lt;/strong&gt;&lt;br&gt;
So this means for &lt;a href="https://developer.amazon.com/docs/fire-tv/automotive-ux-guidelines.html" rel="noopener noreferrer"&gt;Amazon Auto&lt;/a&gt;, I need a car right? 🏎️&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. I will stop using the &lt;a href="https://reactnative.dev/docs/safeareaview" rel="noopener noreferrer"&gt;SafeAreaView&lt;/a&gt; as a bandaid 🩹&lt;/strong&gt; &lt;br&gt;
Okay so wrapping every single component in SafeAreaView isn't going to fix my layout issues. Or is it? 😏&lt;/p&gt;

&lt;p&gt;(For all my React Native TV developers)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;7. I will stop treating my focus bugs 🐛 as features&lt;/strong&gt;&lt;br&gt;
Because I don't think I can convince my designer "pressing the back button three times to reach the menu" will become a really cool new UX pattern. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;P.S.&lt;/strong&gt; We all know I'll break at least three of these. But hey, like my going to the gym resolution, it still counts if I wear the my workout clothes while coding, right? &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Disclaimer:&lt;/strong&gt; I should clarify that I've &lt;em&gt;obviously never&lt;/em&gt; made any of these mistakes. Any resemblance to actual coding practices is purely coincidental, and my manager should definitely not check my git history. 👀 &lt;/p&gt;

&lt;p&gt;What are your Re(act)solutions?&lt;/p&gt;

</description>
      <category>react</category>
      <category>reactnative</category>
      <category>javascript</category>
      <category>typescript</category>
    </item>
    <item>
      <title>How to develop a React Native TV App</title>
      <dc:creator>Anisha Malde</dc:creator>
      <pubDate>Tue, 10 Dec 2024 18:49:18 +0000</pubDate>
      <link>https://dev.to/amazonappdev/how-to-develop-a-react-native-app-for-tv-4njp</link>
      <guid>https://dev.to/amazonappdev/how-to-develop-a-react-native-app-for-tv-4njp</guid>
      <description>&lt;h3&gt;
  
  
  By Anisha Malde &amp;amp; &lt;a href="https://www.linkedin.com/in/karol-latusek-2a8a86123/?originalSubdomain=pl" rel="noopener noreferrer"&gt;Karol Latusek&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;If you are reading this article, you are likely familiar with the complexities and fragmentation of TV app development, and like us, you've turned to React Native as a solution. It's an exciting use case of React Native, with the community making significant progress in this space—most notably, Expo introducing TV support in Expo SDK 50 earlier this year.&lt;/p&gt;

&lt;p&gt;Inspired by our own experiences (&amp;amp; struggles 😅), we decided to create a &lt;a href="https://www.callstack.com/ebook/mastering-the-big-screen-react-native-for-tv-guidebook" rel="noopener noreferrer"&gt;comprehensive guide&lt;/a&gt; to using React Native for TV.&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.amazonaws.com%2Fuploads%2Farticles%2Fy4b6pyp3974r4sfg0t1o.png" 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.amazonaws.com%2Fuploads%2Farticles%2Fy4b6pyp3974r4sfg0t1o.png" alt="Guidebook" width="800" height="304"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Since using the React Native framework, Expo, is now the &lt;a href="https://reactnative.dev/blog/2024/06/25/use-a-framework-to-build-react-native-apps" rel="noopener noreferrer"&gt;recommended approach to creating new apps&lt;/a&gt;, our guide focused on this. However, during our post-launch discussions, we realized there were still developers who wanted to know how to set up a bare React Native (RN) project for TV. That’s why this article will explore how to set up your bare RN project and expand on how to set up your project to build for multiple platforms.&lt;/p&gt;

&lt;h2&gt;
  
  
  Expo or Bare React Native?
&lt;/h2&gt;

&lt;p&gt;There are two different ways to get started with TV development: Expo and Bare React Native. Your choice between these approaches will depend on several factors such as project complexity, performance needs, and the specific TV platforms you are targeting.&lt;/p&gt;

&lt;h3&gt;
  
  
  Building a TV App With Expo
&lt;/h3&gt;

&lt;p&gt;Expo presents a quicker route to TV app development by reducing the complexity of setting up your development environment. It offers out-of-the-box support for multiple platforms (web, TV, and mobile) and pre-configured build processes. Expo is ideal for getting started quickly! 🚀&lt;/p&gt;

&lt;h4&gt;
  
  
  How to get started
&lt;/h4&gt;

&lt;p&gt;You can find more information in this &lt;a href="https://docs.expo.dev/guides/building-for-tv/" rel="noopener noreferrer"&gt;Expo documentation&lt;/a&gt; or the ‘Getting Started’ chapter in our &lt;a href="https://www.callstack.com/ebook/mastering-the-big-screen-react-native-for-tv-guidebook" rel="noopener noreferrer"&gt;guidebook&lt;/a&gt;. &lt;/p&gt;

&lt;h3&gt;
  
  
  Building a TV App With Bare React Native
&lt;/h3&gt;

&lt;p&gt;On the other hand, Bare React Native can offer developers more control. It is ideal for projects that require specific build processes or have unique performance requirements.&lt;/p&gt;

&lt;h4&gt;
  
  
  How to get started
&lt;/h4&gt;

&lt;p&gt;If you are starting a Bare React Native project, the easiest way to ensure your project is configured for TV is to use the &lt;a href="https://github.com/react-native-tvos/react-native-tvos?tab=readme-ov-file#project-creation-using-the-react-native-community-cli" rel="noopener noreferrer"&gt;React Native community CLI template&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npx @react-native-community/cli@latest init TVTest --template @react-native-tvos/template-tv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This creates a project with &lt;a href="https://github.com/react-native-tvos/react-native-tvo" rel="noopener noreferrer"&gt;react-native-tvos&lt;/a&gt; and all the required configurations for Android and TvOS.&lt;/p&gt;

&lt;h2&gt;
  
  
  Adding TV Support to an Existing Project
&lt;/h2&gt;

&lt;p&gt;If you have an existing React Native project and want to add TV support, you need to handle these configurations to extend it to build TV apps. Note that the above template takes care of this for you.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Update &lt;code&gt;package.json&lt;/code&gt; dependencies&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"react-native"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npm:react-native-tvos@latest"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This enables your project to use a fork of React Native, react-native-tvos, with the changes needed to support Apple TV and Android TV. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 You cannot use this package and the core react-native package simultaneously in a project however using the fork doesn’t prevent you from creating your ‘regular’ mobile builds.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;2. Update Android Manifest&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;For Android TV applications you need to ensure that your app is declaring a &lt;a href="https://www.google.com/url?q=https://developer.android.com/training/tv/get-started/create?hl%3Den&amp;amp;sa=D&amp;amp;source=docs&amp;amp;ust=1733834064541721&amp;amp;usg=AOvVaw1mlcZPY4GoYhc_kALfytKW" rel="noopener noreferrer"&gt;launcher activity &lt;/a&gt;by adding the leanback launcher to your Android manifest file:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;intent-filter&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;category&lt;/span&gt; &lt;span class="na"&gt;android:name=&lt;/span&gt;&lt;span class="s"&gt;"android.intent.category.LEANBACK_LAUNCHER"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/intent-filter&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Without this, your application will not be discoverable on Google Play, and it will not be recognized as a TV app that appears on the system's home screen after installation (the app will only be visible in Settings &amp;gt; Apps &amp;gt; All Apps.)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Declare that the &lt;code&gt;android.hardware.touchscreen&lt;/code&gt; feature is not required and that your app is built for Android TV:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;uses-feature&lt;/span&gt; &lt;span class="na"&gt;android:name=&lt;/span&gt;&lt;span class="s"&gt;"android.hardware.touchscreen"&lt;/span&gt; &lt;span class="na"&gt;android:required=&lt;/span&gt;&lt;span class="s"&gt;"false"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;uses-feature&lt;/span&gt; &lt;span class="na"&gt;android:name=&lt;/span&gt;&lt;span class="s"&gt;"android.hardware.faketouch"&lt;/span&gt; &lt;span class="na"&gt;android:required=&lt;/span&gt;&lt;span class="s"&gt;"false"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Declare that your app is built for Android TV:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;uses-feature&lt;/span&gt; &lt;span class="na"&gt;android:name=&lt;/span&gt;&lt;span class="s"&gt;"android.software.leanback"&lt;/span&gt; &lt;span class="na"&gt;android:required=&lt;/span&gt;&lt;span class="s"&gt;"false"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For more information on these changes, read the &lt;a href="https://developer.android.com/training/tv/get-started/create?_gl=1*zvhsjl*_up*MQ..*_ga*MzAwODM4Ni4xNzMyODgyNTE2*_ga_6HH9YJMN9M*MTczMjg4MjUxNS4xLjAuMTczMjg4MjUxNS4wLjAuMjA0NjMzNzU3OA..&amp;amp;hl=en" rel="noopener noreferrer"&gt;Android documentation&lt;/a&gt; on adding TV support.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 We recommend adding these changes to the TV apps' Android manifest only. If your app is targeting different build platforms in addition to TV, you still want to make sure that the platform domain features, e.g., touchScreen is required on the mobile build. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;We explain how you can structure your app to have separate manifests below.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Update &lt;code&gt;Project.pbxproj&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Update the iOS project file to define support of TVOS according to &lt;a href="https://gist.github.com/Zahoq/03a399b1efa3912af77feef49fb93e65" rel="noopener noreferrer"&gt;this&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Update Podfile&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;platform&lt;/span&gt; &lt;span class="ss"&gt;:ios&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;min_ios_version_supported&lt;/span&gt;
&lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;platform&lt;/span&gt; &lt;span class="ss"&gt;:tvos&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;min_ios_version_supported&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This ensures your project is being configured for tvOS.&lt;/p&gt;

&lt;h2&gt;
  
  
  Structuring Your App to Handle the Additional TV Platform
&lt;/h2&gt;

&lt;p&gt;One of the biggest advantages of React Native is the possibility to use one codebase for multiple platforms. This is also the case when you create builds for TV. However, mobile and TV projects may need separate package.json, podfiles, and Android manifests.&lt;/p&gt;

&lt;p&gt;How can you structure your app to handle this? One option is to structure your project as a monorepo:&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.amazonaws.com%2Fuploads%2Farticles%2Fchl1e4s8irmidhliobdw.png" 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.amazonaws.com%2Fuploads%2Farticles%2Fchl1e4s8irmidhliobdw.png" alt="Monorepo" width="800" height="243"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Check Oskar’s article for details on a &lt;a href="https://www.callstack.com/blog/setting-up-react-native-monorepo-with-yarn-workspaces" rel="noopener noreferrer"&gt;monorepo setup with Yarn workspaces&lt;/a&gt;. This allows flexibility as we can separate TV related code from the mobile and can also expand it to other TV platforms e.g. WebOS, Tizen.&lt;/p&gt;

&lt;p&gt;Another approach for smaller projects use a structure similar to the &lt;a href="https://github.com/react-native-tvos/template-tv" rel="noopener noreferrer"&gt;template&lt;/a&gt; and differentiate Android TV and Android Mobile specific feature sets on the build flavour level and then by &lt;a href="https://developer.android.com/build/manage-manifests?hl=en" rel="noopener noreferrer"&gt;merging manifests&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.amazonaws.com%2Fuploads%2Farticles%2Fzhss18fdct7h1o6xovz2.png" 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.amazonaws.com%2Fuploads%2Farticles%2Fzhss18fdct7h1o6xovz2.png" alt="Merging Manifests" width="800" height="243"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Whether you choose the Expo route or the Bare React Native approach, adding TV support to your app requires just a few steps. We hope this helps you get started on your TV development journey. Check out the guidebook for more tips and tricks on building for TV using React Native. If you have any questions or requests for content you'd like to see in the book, please leave a comment below ⬇️&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.callstack.com/ebook/mastering-the-big-screen-react-native-for-tv-guidebook" rel="noopener noreferrer"&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.amazonaws.com%2Fuploads%2Farticles%2Fh72zvw05lxguuk63e809.png" alt="Guidebook" width="800" height="211"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>reactnative</category>
      <category>react</category>
      <category>javascript</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Journeying from React to React Native: Differences &amp; Similarities</title>
      <dc:creator>Anisha Malde</dc:creator>
      <pubDate>Thu, 03 Oct 2024 10:15:12 +0000</pubDate>
      <link>https://dev.to/amazonappdev/journeying-from-react-to-react-native-21ep</link>
      <guid>https://dev.to/amazonappdev/journeying-from-react-to-react-native-21ep</guid>
      <description>&lt;p&gt;As a React / JS developer, you’ve probably had the thought: &lt;strong&gt;"Should I learn React Native?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It’s a fair question and one I asked myself a few years ago. Turns out, learning React Native was definitely the right decision. It's what landed me my role as a Sr. Developer Advocate @ Amazon, where I now use React Native to build apps across Android, &lt;a href="https://developer.amazon.com/docs/fire-tv/getting-started-developing-apps-and-games.html" rel="noopener noreferrer"&gt;Fire TV&lt;/a&gt; &amp;amp; &lt;a href="https://developer.amazon.com/docs/fire-tablets/ft-get-started.html" rel="noopener noreferrer"&gt;Fire Tablet&lt;/a&gt; devices.&lt;/p&gt;

&lt;p&gt;If you’re debating whether to make the jump beyond web apps, here are some thoughts on:&lt;/p&gt;

&lt;h2&gt;
  
  
  Why learn React Native?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The &lt;a href="https://reactnative.dev/" rel="noopener noreferrer"&gt;learn once, write anywhere&lt;/a&gt; philosophy&lt;/strong&gt; extends beyond just iOS and Android – it now includes platforms like tvOS, VisionOS, and even desktop environments like &lt;a href="https://github.com/microsoft/react-native-macos" rel="noopener noreferrer"&gt;react-native-macos&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Industry relevance&lt;/strong&gt;: Major companies like Amazon, Meta, and Microsoft are all &lt;a href="https://conf.react.dev/talks/13" rel="noopener noreferrer"&gt;adopting React Native&lt;/a&gt;. &lt;strong&gt;Why&lt;/strong&gt;? Code reusability, cost effective and it allows you to build cross platform.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Strong community support&lt;/strong&gt;: React Native has over 100k stars and 24k forks on &lt;a href="https://github.com/facebook/react-native" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;, with regular updates and active development.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;High developer satisfaction&lt;/strong&gt;: According to the &lt;a href="https://survey.stateofreactnative.com/" rel="noopener noreferrer"&gt;State of React Native Survey&lt;/a&gt;, 90% of developers would use React Native again!&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Unified ecosystem&lt;/strong&gt;: The React Native community rallies around &lt;a href="https://expo.dev/" rel="noopener noreferrer"&gt;Expo&lt;/a&gt;, leading to faster improvements, well-integrated third-party libraries, and abundant shared resources.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&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.amazonaws.com%2Fuploads%2Farticles%2Fiozr0eh7snijs5t49c4s.png" 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.amazonaws.com%2Fuploads%2Farticles%2Fiozr0eh7snijs5t49c4s.png" alt="Tweet" width="800" height="173"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Familiar developer experience&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  React vs React Native: Similarities &amp;amp; Differences
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Architecture and Compiling
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Similarities:
&lt;/h4&gt;

&lt;p&gt;Both use a reconciliation process often referred to as the &lt;a href="https://legacy.reactjs.org/docs/faq-internals.html" rel="noopener noreferrer"&gt;"virtual DOM."&lt;/a&gt; This process diffs one tree against another to determine which parts of the UI need updating. Due to this, they both support &lt;a href="https://reactnative.dev/docs/fast-refresh" rel="noopener noreferrer"&gt;fast refresh&lt;/a&gt;, enabling you to see UI changes in real-time. &lt;/p&gt;

&lt;h4&gt;
  
  
  Differences:
&lt;/h4&gt;

&lt;p&gt;React compiles to render in web browsers, leveraging the DOM and web APIs. Even when accessed via mobile browsers, it's still constrained by the browser's capabilities and limited access to native device features.&lt;/p&gt;

&lt;p&gt;React Native, on the other hand compiles to native code, allowing direct access to platform-specific APIs and features. This means React Native apps can utilize device capabilities like camera access, push notifications, providing a native user experience. Due to this, it takes a different approach to its architecture, with whats called the &lt;a href="https://reactnative.dev/blog/2024/04/22/release-0.74" rel="noopener noreferrer"&gt;"bridgeless" architecture&lt;/a&gt;, and instead of the DOM it has native components. It uses Turbo Native Module’s and leverages a JavaScript Interface (JSI) allowing for direct communication between JavaScript and native code. This architecture is new and you may hear the term ‘new architecture’ being thrown around. If you are interested in learning more I covered this in a &lt;a href="https://dev.to/amazonappdev/a-guide-to-turbo-modules-in-react-native-5aa3"&gt;previous article&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.amazonaws.com%2Fuploads%2Farticles%2F0bo8c358bah7hg5jr9yq.png" 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.amazonaws.com%2Fuploads%2Farticles%2F0bo8c358bah7hg5jr9yq.png" alt="React &amp;amp; React Native architecture" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  JSX and  Hooks
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Similarities
&lt;/h4&gt;

&lt;p&gt;Both use &lt;a href="https://react.dev/learn/writing-markup-with-jsx" rel="noopener noreferrer"&gt;JSX&lt;/a&gt; for describing the UI and support React hooks (useState, useEffect, etc.). This allows you to maintain a consistent coding style and state management approach across both libraries.&lt;/p&gt;

&lt;h3&gt;
  
  
  Components
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Similarities
&lt;/h4&gt;

&lt;p&gt;Both React and React Native follow a component-based architecture and components follow the same &lt;a href="https://legacy.reactjs.org/docs/react-component.html#the-component-lifecycle" rel="noopener noreferrer"&gt;lifecycle methods&lt;/a&gt; under the hood. &lt;/p&gt;

&lt;h4&gt;
  
  
  Differences:
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Component Imports&lt;/strong&gt;: In React Native you import UI components from &lt;code&gt;react-native&lt;/code&gt;, unlike React where HTML elements are globally available. This difference is actually one of my favourite things about React Native as you have access to a set of pre-built components out of the box e.g. &lt;code&gt;View, Text, Image, TextInput, ScrollView&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Platform-Specific Components&lt;/strong&gt;: React Native also offers &lt;a href="https://reactnative.dev/docs/native-components-android" rel="noopener noreferrer"&gt;components and API's&lt;/a&gt; tailored for iOS and Android out of the box.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Text Handling&lt;/strong&gt;: In React Native, all text must be wrapped in a &lt;code&gt;&amp;lt;Text&amp;gt;&lt;/code&gt; component, unlike in React where text can be placed directly in many elements. This ensures proper styling and behaviour of text across different platforms, improving consistency and accessibility.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Event Handling&lt;/strong&gt;: React uses &lt;code&gt;onClick&lt;/code&gt; for click events, while React Native uses &lt;code&gt;onPress&lt;/code&gt; for touch interactions, reflecting the different nature of interactions.&lt;/li&gt;
&lt;/ol&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.amazonaws.com%2Fuploads%2Farticles%2Fyp30jgu0s6qgkjnh55i5.png" 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.amazonaws.com%2Fuploads%2Farticles%2Fyp30jgu0s6qgkjnh55i5.png" alt="Code showing difference in components" width="800" height="299"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Styling
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Similarities
&lt;/h4&gt;

&lt;p&gt;Both React and React Native offer flexible approaches to styling components. They both support inline styling, allowing you to apply styles directly to components. Additionally, both enable the creation of reusable style objects.&lt;/p&gt;

&lt;h4&gt;
  
  
  Differences
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Styling Language&lt;/strong&gt;: React typically uses CSS or CSS-in-JS libraries for styling whereas React Native uses a JavaScript object-based styling system with some differences:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Property Names&lt;/strong&gt;: React Native uses camelCase for property names (e.g., fontSize instead of font-size).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Value Units&lt;/strong&gt;: In React Native you don’t need units for properties like width, height, or fontSize, it automatically assumes dimensions are in density-independent pixels.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;StyleSheet API&lt;/strong&gt;: React Native provides a &lt;a href="https://reactnative.dev/docs/stylesheet" rel="noopener noreferrer"&gt;&lt;code&gt;StyleSheet.create()&lt;/code&gt;&lt;/a&gt; method for creating style objects. This API improve’s performance by reducing the need to recreate style objects on each render.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Style Application&lt;/strong&gt;: Unlike in React where class names can be used to apply styles, React Native applies styles directly to components using the style prop. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Limited CSS Subset&lt;/strong&gt;: React Native only supports a &lt;a href="https://reactnative.dev/docs/view-style-props" rel="noopener noreferrer"&gt;subset of CSS&lt;/a&gt; properties, focusing on those that make sense for different layouts. This means some web-specific properties (like float) are not available, while others (like flex) might behave differently.&lt;/li&gt;
&lt;/ol&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.amazonaws.com%2Fuploads%2Farticles%2F3rk8pcd7z7vfbcu80y9f.png" 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.amazonaws.com%2Fuploads%2Farticles%2F3rk8pcd7z7vfbcu80y9f.png" alt="Styling differences" width="800" height="319"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Libraries &amp;amp; Tooling
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Similarities
&lt;/h4&gt;

&lt;p&gt;React and React Native share many core libraries. You can use the same state management libraries like &lt;a href="https://redux.js.org/" rel="noopener noreferrer"&gt;Redux&lt;/a&gt;, &lt;a href="https://redux.js.org/" rel="noopener noreferrer"&gt;MobX&lt;/a&gt;, and data fetching libraries like &lt;a href="https://github.com/axios/axios" rel="noopener noreferrer"&gt;Axios&lt;/a&gt; or the &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API" rel="noopener noreferrer"&gt;Fetch API&lt;/a&gt;. &lt;/p&gt;

&lt;h4&gt;
  
  
  Differences
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Navigation:&lt;/strong&gt; While in React you might typically using &lt;a href="https://reactrouter.com/en/main" rel="noopener noreferrer"&gt;React Router&lt;/a&gt; for web navigation, React Native has its own &lt;a href="https://reactnavigation.org/" rel="noopener noreferrer"&gt;React Navigation library&lt;/a&gt;. This is because React (Web) typically uses URL-based navigation, where different components are rendered based on the current URL path. Whereas React Native uses stack-based navigation, mimicking the native mobile app experience. Screens are ‘stacked’ on top of each other, with transitions pushing new screens onto the stack or ‘popping’ them off. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 Note: Remember to name your folder ‘Screens’ instead of ‘Pages’ when structuring your app.&lt;/p&gt;
&lt;/blockquote&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.amazonaws.com%2Fuploads%2Farticles%2Fledp97o49oj35sc64964.png" 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.amazonaws.com%2Fuploads%2Farticles%2Fledp97o49oj35sc64964.png" alt="Navigation differences" width="800" height="173"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Testing:&lt;/strong&gt; concepts remain similar across both libraries, focusing on component rendering and event simulation, but the specific testing libraries differ. React uses the &lt;a href="https://testing-library.com/docs/react-testing-library/intro/" rel="noopener noreferrer"&gt;React Testing Library&lt;/a&gt;, while React Native you would use &lt;a href="https://callstack.github.io/react-native-testing-library/" rel="noopener noreferrer"&gt;React Native Testing Library (RNTL)&lt;/a&gt;, but don’t be put off as RNTL just provides light utility functions on top of &lt;a href="https://www.npmjs.com/package/react-test-renderer" rel="noopener noreferrer"&gt;React Test Renderer&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 Some React libraries may not be compatible with all React Native platforms due to DOM dependencies, however you can check the platform compatibility of all the libraries at: &lt;a href="https://reactnative.directory" rel="noopener noreferrer"&gt;(https://reactnative.directory)&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&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.amazonaws.com%2Fuploads%2Farticles%2F3gxnjhnw5ycq7tmhvfux.png" 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.amazonaws.com%2Fuploads%2Farticles%2F3gxnjhnw5ycq7tmhvfux.png" alt="Table showing library compatibility" width="800" height="543"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Bridging the Gap with Universal React Apps
&lt;/h2&gt;

&lt;p&gt;If you're still on the fence, the rise of Universal React Apps is a really exciting space that is further closing the gap between React and React Native. &lt;a href="https://github.com/axeldelafosse/awesome-universal-react" rel="noopener noreferrer"&gt;Universal React libraries and tooling&lt;/a&gt;, usually powered by &lt;a href="https://necolas.github.io/react-native-web/" rel="noopener noreferrer"&gt;react-native-web&lt;/a&gt; enable you to create cross-platform applications that run on iOS, Android, and the Web all from a shared React Native codebase. This lets you share navigation, styling, state management, and business logic saving you time and effort while respecting the unique conventions of each device type.&lt;/p&gt;

&lt;p&gt;So as the lines between DOM and Device continue to blur, embracing React Native opens doors to the exciting world of multi-platform app development! &lt;/p&gt;

&lt;p&gt;If you are ready to get started check the comments for my favourite resources or comment with yours below ⬇️&lt;/p&gt;

</description>
      <category>react</category>
      <category>reactnative</category>
      <category>javascript</category>
      <category>frontend</category>
    </item>
    <item>
      <title>5 Ways Of Managing Focus In React Native</title>
      <dc:creator>Anisha Malde</dc:creator>
      <pubDate>Wed, 11 Sep 2024 11:28:47 +0000</pubDate>
      <link>https://dev.to/amazonappdev/5-ways-of-managing-focus-in-react-native-3kfd</link>
      <guid>https://dev.to/amazonappdev/5-ways-of-managing-focus-in-react-native-3kfd</guid>
      <description>&lt;p&gt;When it comes to handling Focus Management in React Native for TV apps, developers may find themselves going through five familiar stages (of grief): 🫣  😡  🙏  😭  👍  &lt;/p&gt;

&lt;p&gt;Focus management is a unique challenge in TV application development, due to the fragmentation across TV platforms that has led to a variety of focus management techniques. Developers have been forced to create and adopt multiple strategies for managing focus, often juggling platform-specific solutions alongside cross-platform abstractions. The challenge of focus is not only ensuring that focus is handled correctly but handling the platform differences. Android TV and Apple's tvOS have distinct native focus engines which you can read more about in &lt;a href="https://dev.to/amazonappdev/tv-navigation-in-react-native-a-guide-to-using-tvfocusguideview-302i"&gt;this article&lt;/a&gt; written by my colleague &lt;a class="mentioned-user" href="https://dev.to/hellonehha"&gt;@hellonehha&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.amazonaws.com%2Fuploads%2Farticles%2F4sshftysw5r4cab53e1x.png" 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.amazonaws.com%2Fuploads%2Farticles%2F4sshftysw5r4cab53e1x.png" alt="Punching TV" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Originally, TV-specific docs and APIs were part of the main React Native documentation. Now, most TV-specific content has moved to the &lt;a href="https://github.com/react-native-tvos/react-native-tvos" rel="noopener noreferrer"&gt;react-native-tvos&lt;/a&gt; project.&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.amazonaws.com%2Fuploads%2Farticles%2Feu34a33i7dhmicmm4okw.png" 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.amazonaws.com%2Fuploads%2Farticles%2Feu34a33i7dhmicmm4okw.png" alt="React Native docs" width="800" height="48"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://github.com/react-native-tvos/react-native-tvos" rel="noopener noreferrer"&gt;react-native-tvos&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;"react-native": "npm:react-native-tvos@latest"&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;react-native-tvos&lt;/code&gt; project is an open source package that provides additions and extensions to the core React Native framework, with a specific focus on supporting Apple TV and Android TV platforms. Most of the changes in this project are centered around handling focus-based navigation on a SmartTV using the D-Pad on the remote control. The project is maintained by (the incredible!) &lt;a href="https://github.com/douglowder" rel="noopener noreferrer"&gt;Doug Lowder&lt;/a&gt; and is commonly recommended as the primary way to handle focus management in React Native TV applications. &lt;/p&gt;

&lt;p&gt;However, like many community-maintained projects, the &lt;code&gt;react-native-tvos&lt;/code&gt; project has evolved based on the needs of developers, and there are now an multiple ways to handle focus. Lets explore the additional components and enhancements to existing components that &lt;code&gt;react-native-tvos&lt;/code&gt; provides:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. &lt;a href="https://github.com/react-native-tvos/react-native-tvos?tab=readme-ov-file#code-changes" rel="noopener noreferrer"&gt;TVFocusGuideView&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;TVFocusGuideView provides support for Apple's UIFocusGuide API and is implemented in the same way for Android TV, to help ensure that focusable controls can be navigated to, even if they are not directly in line with other controls&lt;/em&gt; - As per react-native-tvos.  &lt;/p&gt;

&lt;p&gt;For example, here’s a grid of 10 &lt;code&gt;Pressable&lt;/code&gt; components rendered inside a &lt;code&gt;TVFocusGuideView&lt;/code&gt; component:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&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;TVFocusGuideView&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;TVFocusGuideViewExample&lt;/span&gt; &lt;span class="o"&gt;=&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="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;focusedItem&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setFocusedItem&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&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;renderGridItem&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;number&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;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Pressable&lt;/span&gt;
      &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;styles&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;gridItem&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;focusedItem&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;number&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;styles&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;focusedItem&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
      &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;number&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
      &lt;span class="na"&gt;onFocus&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setFocusedItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;number&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
      &lt;span class="na"&gt;onBlur&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setFocusedItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt; &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;styles&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;gridItemText&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;number&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Pressable&lt;/span&gt;&lt;span class="p"&gt;&amp;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="p"&gt;&amp;lt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Header&lt;/span&gt; &lt;span class="na"&gt;headerText&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Movies"&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;TVFocusGuideView&lt;/span&gt; &lt;span class="na"&gt;trapFocusLeft&lt;/span&gt; &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;styles&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;grid&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="si"&gt;{&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="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;num&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;renderGridItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;num&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;TVFocusGuideView&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&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;&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.amazonaws.com%2Fuploads%2Farticles%2Fzkwgoqbg3wyaazwlmn21.gif" 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.amazonaws.com%2Fuploads%2Farticles%2Fzkwgoqbg3wyaazwlmn21.gif" alt="TVFocusGuideView demo" width="600" height="227"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;TVFocusGuideView&lt;/code&gt; accepts a few props that help you handle focus:&lt;/p&gt;

&lt;h4&gt;
  
  
  destinations prop
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;TVFocusGuideView&lt;/span&gt; &lt;span class="na"&gt;destinations&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With &lt;code&gt;TVFocusGuideView&lt;/code&gt; you can set an array of components to register as ‘destinations’ of the &lt;code&gt;TVFocusGuideView&lt;/code&gt;.  Lets look at our example: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Setting the &lt;code&gt;destinations&lt;/code&gt; prop to be a Ref to item 8 &lt;code&gt;(destinations={[item8Ref.current]})&lt;/code&gt; causes the focus to move to item 8 when we initially navigate to the &lt;code&gt;TVFocusGuideView&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&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.amazonaws.com%2Fuploads%2Farticles%2F0tc900oo114rz9cierg9.gif" 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.amazonaws.com%2Fuploads%2Farticles%2F0tc900oo114rz9cierg9.gif" alt="destinations prop demo" width="800" height="451"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  trapFocus prop
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;TVFocusGuideView&lt;/span&gt; &lt;span class="na"&gt;trapFocusUp&lt;/span&gt;&lt;span class="err"&gt;|&lt;/span&gt;&lt;span class="na"&gt;trapFocusDown&lt;/span&gt;&lt;span class="err"&gt;|&lt;/span&gt;&lt;span class="na"&gt;trapFocusLeft&lt;/span&gt;&lt;span class="err"&gt;|&lt;/span&gt;&lt;span class="na"&gt;trapFocusRight&lt;/span&gt;  &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This prop ensures focus does not escape from the parent component for the given directions. This prop ensures focus does not escape from the parent component for the given directions. Lets look at our example: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;With the &lt;code&gt;trapFocusLeft&lt;/code&gt; prop you can no longer navigate Left out of the container &lt;/li&gt;
&lt;/ul&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.amazonaws.com%2Fuploads%2Farticles%2Ftbbzmjvo1x36us84n8kk.gif" 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.amazonaws.com%2Fuploads%2Farticles%2Ftbbzmjvo1x36us84n8kk.gif" alt="Trap focus demo" width="800" height="310"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  autofocus prop
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;TVFocusGuideView&lt;/span&gt; &lt;span class="na"&gt;autoFocus&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When autofocus is set to true, the &lt;code&gt;TVFocusGuideView&lt;/code&gt; will manage focus for you by redirecting the focus to the first focusable child. It also remembers the last focused child and redirects the focus to it on the subsequent visits. If this prop is used with the  &lt;code&gt;destinations&lt;/code&gt; prop, the component set by the destinations prop will take precedence. Lets look at our example: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Without this prop when we moved from the Header component to the &lt;code&gt;TVFocusGuideView&lt;/code&gt; focus went to the nearest component - item 3 (as per Androids proximity based built-in focus engine)&lt;/li&gt;
&lt;li&gt;With the &lt;code&gt;autofocus&lt;/code&gt; prop it goes to item 1&lt;/li&gt;
&lt;/ul&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.amazonaws.com%2Fuploads%2Farticles%2F54srvhvepazwhfs67xav.gif" 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.amazonaws.com%2Fuploads%2Farticles%2F54srvhvepazwhfs67xav.gif" alt="Autofocus demo" width="800" height="456"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2. &lt;a href="https://github.com/react-native-tvos/react-native-tvos?tab=readme-ov-file#code-changes" rel="noopener noreferrer"&gt;Touchable&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;With the &lt;code&gt;react-native-tvos&lt;/code&gt;, the &lt;code&gt;Touchable&lt;/code&gt; component's ( &lt;code&gt;TouchableWithoutFeedback&lt;/code&gt;, &lt;code&gt;TouchableHighlight&lt;/code&gt; and &lt;code&gt;TouchableOpacity&lt;/code&gt;)  include additional code to detect focus changes and properly style the components when focused. It also ensures that the appropriate actions are triggered when the user interacts with the &lt;code&gt;Touchable&lt;/code&gt; views using the TV remote control.&lt;/p&gt;

&lt;p&gt;Specifically, the &lt;code&gt;onFocus&lt;/code&gt; event is fired when the &lt;code&gt;Touchable&lt;/code&gt; view gains focus, and the &lt;code&gt;onBlur&lt;/code&gt; event is fired when the view loses focus. This enables you to apply unique styling or logic when the component is in the focused state that doesn’t come out of the box with core React Native.&lt;/p&gt;

&lt;p&gt;Additionally the &lt;code&gt;onPress&lt;/code&gt; method has been modified to be triggered when the user selects the &lt;code&gt;Touchable&lt;/code&gt; by pressing the "select" button on the TV remote (the center button on the Apple TV remote or the center button on the Android TV D-Pad) and the &lt;code&gt;onLongPress&lt;/code&gt; event is executed twice when the "select" button is held down for a certain duration.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. &lt;a href="https://github.com/react-native-tvos/react-native-tvos?tab=readme-ov-file#code-changes" rel="noopener noreferrer"&gt;Pressable&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Like &lt;code&gt;Touchable&lt;/code&gt;, the &lt;code&gt;Pressable&lt;/code&gt; component been enhanced to allow it to accept the &lt;code&gt;onFocus&lt;/code&gt; and &lt;code&gt;onBlur&lt;/code&gt; props.&lt;br&gt;
Similar to the ‘&lt;code&gt;pressed&lt;/code&gt;’ state that is triggered when a user presses the component on a touchscreen, the &lt;code&gt;react-native-tvos&lt;/code&gt; &lt;code&gt;Pressable&lt;/code&gt; component introduces a focused state that becomes true when the component is focused on the TV screen. &lt;/p&gt;

&lt;p&gt;Here’s an example when using the &lt;code&gt;Pressable&lt;/code&gt; and &lt;code&gt;Touchable&lt;/code&gt; components from React Native core and they do not accept / execute the &lt;code&gt;onFocus&lt;/code&gt; and &lt;code&gt;onBlur&lt;/code&gt; props:&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.amazonaws.com%2Fuploads%2Farticles%2Fmuduyfcotb2o8fzq0joj.gif" 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.amazonaws.com%2Fuploads%2Farticles%2Fmuduyfcotb2o8fzq0joj.gif" alt="Pressable and Touchable components from React Native core" width="734" height="234"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Using the same &lt;code&gt;Pressable&lt;/code&gt; and &lt;code&gt;Touchable&lt;/code&gt; components from &lt;code&gt;react-native-tvos&lt;/code&gt; they accept and execute the &lt;code&gt;onFocus&lt;/code&gt; and &lt;code&gt;onBlur&lt;/code&gt; props:&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.amazonaws.com%2Fuploads%2Farticles%2F7yti7zw2kmrs97mzidf3.gif" 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.amazonaws.com%2Fuploads%2Farticles%2F7yti7zw2kmrs97mzidf3.gif" alt="Pressable and Touchable components from react-native-tvos" width="693" height="221"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  4. &lt;code&gt;hasTVPreferredFocus&lt;/code&gt; prop
&lt;/h3&gt;

&lt;p&gt;Some React Native components have the &lt;code&gt;hasTVPreferredFocus&lt;/code&gt; prop, which helps you prioritise focus. If set to true, &lt;code&gt;hasTVPreferredFocus&lt;/code&gt; will force the focus to that element. According to the React Native docs these are the current components that accept the prop:&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.amazonaws.com%2Fuploads%2Farticles%2Fkcpglv6quh2vj7wpjuat.png" 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.amazonaws.com%2Fuploads%2Farticles%2Fkcpglv6quh2vj7wpjuat.png" alt="React Native docs" width="478" height="463"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;However, if you are using react-native-tvOS, there are a lot more components that accept this prop:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;View&lt;/span&gt; &lt;span class="na"&gt;hasTVPreferredFocus&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Pressable&lt;/span&gt; &lt;span class="na"&gt;hasTVPreferredFocus&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;TouchableHighlight&lt;/span&gt; &lt;span class="na"&gt;hasTVPreferredFocus&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;TouchableOpacity&lt;/span&gt; &lt;span class="na"&gt;hasTVPreferredFocus&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;TextInput&lt;/span&gt; &lt;span class="na"&gt;hasTVPreferredFocus&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Button&lt;/span&gt; &lt;span class="na"&gt;hasTVPreferredFocus&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;TVFocusGuideView&lt;/span&gt; &lt;span class="na"&gt;hasTVPreferredFocus&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;TouchableNativeFeedback&lt;/span&gt; &lt;span class="na"&gt;hasTVPreferredFocus&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;TVTextScrollView&lt;/span&gt; &lt;span class="na"&gt;hasTVPreferredFocus&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;TouchableWithoutFeedback&lt;/span&gt; &lt;span class="na"&gt;hasTVPreferredFocus&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lets look at an example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Setting the &lt;code&gt;hasTVPreferredFocus&lt;/code&gt; prop to true for &lt;code&gt;Pressable&lt;/code&gt; 2 causes focus be on &lt;code&gt;Pressable&lt;/code&gt; 2&lt;/li&gt;
&lt;li&gt;Changing it to be true when we are on &lt;code&gt;Pressable&lt;/code&gt; 3 causes focus to move to &lt;code&gt;Pressable&lt;/code&gt; 3 &lt;/li&gt;
&lt;/ul&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.amazonaws.com%2Fuploads%2Farticles%2Fjjnhjue5awj8ei8n1wfy.gif" 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.amazonaws.com%2Fuploads%2Farticles%2Fjjnhjue5awj8ei8n1wfy.gif" alt="hasTVPreferredFocus demo" width="760" height="240"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  5. &lt;code&gt;nextFocusDirection&lt;/code&gt; prop
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;nextFocusDirection&lt;/code&gt; prop designates the next Component to receive focus when the user navigates in the specified direction helping you handle focus navigation. When using &lt;code&gt;react-native-tvos&lt;/code&gt;, this prop is accepted by the same components that accept the &lt;code&gt;hasTVPreferredFocus&lt;/code&gt; prop (&lt;code&gt;View, TouchableHighlight, Pressable, TouchableOpacity, TextInput, TVFocusGuideView, TouchableNativeFeedback, Button&lt;/code&gt;). Lets look at an example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;nextFocusDown={pressableRef3.current}
nextFocusRight={pressableRef5.current}&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Setting the &lt;code&gt;nextFocusDown&lt;/code&gt; prop to &lt;code&gt;Pressable&lt;/code&gt; 3 causes focus to move to &lt;code&gt;Pressable&lt;/code&gt; 3 when the focus moves down&lt;/li&gt;
&lt;li&gt;Setting the &lt;code&gt;nextFocusRight&lt;/code&gt; prop to Pressable 5 causes focus to move to &lt;code&gt;Pressable&lt;/code&gt; 5 when the focus moves right&lt;/li&gt;
&lt;/ul&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.amazonaws.com%2Fuploads%2Farticles%2Fthpinp3knamg6zodlx0i.gif" 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.amazonaws.com%2Fuploads%2Farticles%2Fthpinp3knamg6zodlx0i.gif" alt="nextFocusDown demo" width="600" height="236"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;When it comes to handling focus management, there is no one-size-fits-all solution for React Native TV apps. The approach ultimately depends on the specific needs and requirements of your project. While the &lt;code&gt;react-native-tvos&lt;/code&gt; provides a useful cross-device abstractions, you may have to adopt platform-specific solutions to handle common fragmentation issues across SmartTV platforms. &lt;/p&gt;

&lt;p&gt;Take the time to explore these various focus management solutions so that you can deliver an intuitive focus handling experience for your users, regardless of the SmartTV platform they are using.&lt;/p&gt;

&lt;h2&gt;
  
  
  Related resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/amazonappdev/tv-navigation-in-react-native-a-guide-to-using-tvfocusguideview-302i"&gt;https://dev.to/amazonappdev/tv-navigation-in-react-native-a-guide-to-using-tvfocusguideview-302i&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/xite-engineering/revolutionizing-focus-management-in-tv-applications-with-react-native-10ba69bd90" rel="noopener noreferrer"&gt;https://medium.com/xite-engineering/revolutionizing-focus-management-in-tv-applications-with-react-native-10ba69bd90&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://reactnative.dev/docs/0.72/building-for-tv" rel="noopener noreferrer"&gt;https://reactnative.dev/docs/0.72/building-for-tv&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>react</category>
      <category>reactnative</category>
      <category>tv</category>
      <category>javascript</category>
    </item>
    <item>
      <title>How to become an Amazon Developer</title>
      <dc:creator>Anisha Malde</dc:creator>
      <pubDate>Mon, 29 Jul 2024 14:59:27 +0000</pubDate>
      <link>https://dev.to/anishamalde/how-to-become-an-amazon-developer-j4f</link>
      <guid>https://dev.to/anishamalde/how-to-become-an-amazon-developer-j4f</guid>
      <description>&lt;p&gt;When I tell people I work at Amazon I usually get asked 2 questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Can I have a free Prime membership?&lt;/li&gt;
&lt;li&gt;or, How can I become an Amazon Developer?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Unfortunately, there is no magical guide to the question they are really asking, which is: 'How can I get a job at Amazon?'. However, learning about the whole world of Amazon development (that doesn't actually require you to work at Amazon) definitely can't hurt your chances!&lt;/p&gt;

&lt;p&gt;As a React Native Developer Advocate for Amazon Appstore, I've learned that being an "Amazon developer" can mean anything from creating apps for Amazon devices, to integrating cloud computing solutions. Amazon's ecosystem provides numerous paths for developers to explore, so, this article is a guide of the different opportunities and where to get started: &lt;/p&gt;

&lt;h2&gt;
  
  
  Amazon's Developer Ecosystem
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Amazon Appstore
&lt;/h3&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.amazonaws.com%2Fuploads%2Farticles%2Fwck0neyc3iita01ec93w.png" 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.amazonaws.com%2Fuploads%2Farticles%2Fwck0neyc3iita01ec93w.png" width="185" height="45"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Amazon Appstore is Amazon's equivalent of Google Play / Apple's App Store. It is used for distributing apps, primarily for the Amazon Fire devices e.g. Fire Tablet. To build Apps for Amazon Appstore you can use Java / Kotlin for native Android development or React Native / Flutter / other cross-platform frameworks.&lt;/p&gt;

&lt;p&gt;To learn more how to become an Amazon Appstore developer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Checkout out the &lt;a href="https://developer.amazon.com./apps-and-games" rel="noopener noreferrer"&gt;developer portal&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Experiment with samples on &lt;a href="https://github.com/AmazonAppDev" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Join the &lt;a href="https://community.amazondeveloper.com/" rel="noopener noreferrer"&gt;developer community &lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Watch tutorials on &lt;a href="https://www.youtube.com/channel/UCT9ApARFgQJOeqD-ygmxnJQ" rel="noopener noreferrer"&gt;YouTube&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Read our &lt;a href="https://dev.to/amazonappdev"&gt;blog&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.anisha.dev/" rel="noopener noreferrer"&gt;Follow me&lt;/a&gt; and my Team (&lt;a href="https://giolaq.dev/" rel="noopener noreferrer"&gt;Gio&lt;/a&gt;, &lt;a href="https://trag.dev/" rel="noopener noreferrer"&gt;Chris&lt;/a&gt;, &lt;a href="https://x.com/hellonehha?lang=en" rel="noopener noreferrer"&gt;Neha&lt;/a&gt;, &lt;a href="https://www.linkedin.com/in/yoolivia/" rel="noopener noreferrer"&gt;Olivia&lt;/a&gt; &amp;amp; &lt;a href="https://www.linkedin.com/in/mosesroth/" rel="noopener noreferrer"&gt;Moses&lt;/a&gt;) &lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Amazon Web Services (AWS)
&lt;/h3&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.amazonaws.com%2Fuploads%2Farticles%2Ftv7kg701f6mn8qn4wlyk.png" 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.amazonaws.com%2Fuploads%2Farticles%2Ftv7kg701f6mn8qn4wlyk.png" width="93" height="49"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;AWS is Amazon's cloud computing platform, offering over 200 fully featured services. You can use AWS for multiple things ranging from building scalable web apps to managing and orchestrating containerised applications!&lt;/p&gt;

&lt;p&gt;To learn more on how to become an AWS developer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Check out the &lt;a href="https://aws.amazon.com/" rel="noopener noreferrer"&gt;developer portal&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Get AWS certified (e.g.,&lt;a href="https://www.credly.com/org/amazon-web-services/badge/aws-certified-developer-associate" rel="noopener noreferrer"&gt; AWS Certified Developer - Associate&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Join the &lt;a href="https://aws.amazon.com/developer/community/?cards.sort-by=item.additionalFields.publishedDate&amp;amp;cards.sort-order=desc" rel="noopener noreferrer"&gt;developer community&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  AWS Amplify
&lt;/h4&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.amazonaws.com%2Fuploads%2Farticles%2Fnrvskta9hibowrbtfyhx.png" 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.amazonaws.com%2Fuploads%2Farticles%2Fnrvskta9hibowrbtfyhx.png" width="108" height="48"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;AWS includes, AWS Amplify which is a set of tools and services for building full-stack applications in iOS, Android, Flutter, Web, and React Native. Amplify allows you to rapidly develop and deploying full-stack web applications as well as build cross-platform mobile apps with integrated backend service. This means you can use AWS Amplify to build apps for Amazon Appstore! &lt;/p&gt;

&lt;p&gt;To learn more on how to build Apps with AWS Amplify:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Watch how we (Appstore x Amplify) built, monetised, submitted, and scaled an app all in an hour &lt;a href="https://www.youtube.com/watch?v=LSAKZ5KpkVM" rel="noopener noreferrer"&gt;here&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Check out the &lt;a href="https://docs.amplify.aws/react/start/quickstart/" rel="noopener noreferrer"&gt;developer portal&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Join the &lt;a href="https://discord.com/invite/amplify" rel="noopener noreferrer"&gt;developer community&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Take a &lt;a href="https://amplify.aws/learn/" rel="noopener noreferrer"&gt;course&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  3. Alexa Skills Kit
&lt;/h2&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.amazonaws.com%2Fuploads%2Farticles%2Fojnc128ms6uk0rq3ykd0.png" 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.amazonaws.com%2Fuploads%2Farticles%2Fojnc128ms6uk0rq3ykd0.png" width="84" height="46"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Alexa Skills Kit (ASK) allows developers to create voice apps for Alexa-enabled devices. &lt;/p&gt;

&lt;p&gt;To learn more on how to to become an Alexa developer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Check out the &lt;a href="https://developer.amazon.com./en-US/alexa" rel="noopener noreferrer"&gt;developer portal&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Hopefully this helps! &lt;/p&gt;

&lt;p&gt;If you feel catfished by the article title and are interested in working directly for Amazon, you can check out our open roles &lt;a href="https://www.amazon.jobs" rel="noopener noreferrer"&gt;here&lt;/a&gt;. Otherwise, do let me know which journey you are excited to take or are currently on ⬇️ &lt;/p&gt;

</description>
      <category>beginners</category>
      <category>amazon</category>
      <category>aws</category>
      <category>javascript</category>
    </item>
    <item>
      <title>From JS to Fire OS: React Native for Amazon Devices</title>
      <dc:creator>Anisha Malde</dc:creator>
      <pubDate>Wed, 17 Jul 2024 10:12:49 +0000</pubDate>
      <link>https://dev.to/amazonappdev/get-started-with-react-native-for-amazon-fire-os-51j8</link>
      <guid>https://dev.to/amazonappdev/get-started-with-react-native-for-amazon-fire-os-51j8</guid>
      <description>&lt;p&gt;React Native enables developers to build native apps for Amazon Fire OS devices using their existing JavaScript and React skills. Since Fire OS is based on the Android Open Source Project (AOSP), if you are already working with React Native you can easily target our devices without learning a new tech stack or maintaining separate codebases.&lt;/p&gt;

&lt;p&gt;We recommend using the Expo framework to build React Native apps as it enables an easier and faster development experience. Follow along to see how to get up and running with React Native for both Fire Tablets and Fire TVs.&lt;/p&gt;

&lt;h2&gt;
  
  
  ✅ Pre-requisites for this guide
&lt;/h2&gt;

&lt;p&gt;Install the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://nodejs.org/en/download/package-manager" rel="noopener noreferrer"&gt;Node.js&lt;/a&gt;: The JavaScript runtime environment&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.npmjs.com/downloading-and-installing-node-js-and-npm" rel="noopener noreferrer"&gt;npm&lt;/a&gt; or &lt;a href="https://classic.yarnpkg.com/lang/en/docs/install/" rel="noopener noreferrer"&gt;Yarn&lt;/a&gt;: Package managers for JavaScript&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.expo.dev/get-started/set-up-your-environment/?platform=android&amp;amp;device=physical&amp;amp;mode=development-build&amp;amp;buildEnv=local#set-up-android-studio" rel="noopener noreferrer"&gt;Android Studio&lt;/a&gt;: the IDE used to compile and run your Fire OS apps locally&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Configure Android Studio and its command-line tools:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Follow &lt;a href="https://developer.android.com/tools/variables" rel="noopener noreferrer"&gt;this guide&lt;/a&gt; to set your &lt;code&gt;ANDROID_HOME&lt;/code&gt; environment variable &lt;/li&gt;
&lt;li&gt;Install the following emulators from &lt;a href="https://developer.android.com/studio/run/managing-avds" rel="noopener noreferrer"&gt;Android Studio’s virtual device manager&lt;/a&gt;:&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;For Tablet:&lt;/th&gt;
&lt;th&gt;For TV:&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&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.amazonaws.com%2Fuploads%2Farticles%2Fa72b5691v6hnp6vg6w4t.png" alt="tablet avd" width="800" height="511"&gt;&lt;/td&gt;
&lt;td&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.amazonaws.com%2Fuploads%2Farticles%2Fnrpf0wbk6wu40ew47dzu.png" alt="tv avd" width="800" height="509"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  📱 Building for Fire Tablets
&lt;/h2&gt;

&lt;p&gt;In the terminal, create a new React Native project with the expo package installed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx create-expo-app FireTabletDemo &lt;span class="nt"&gt;--template&lt;/span&gt; blank
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Running on Fire Tablet Emulator
&lt;/h3&gt;

&lt;p&gt;List the available &lt;a href="https://developer.android.com/studio/run/managing-avds" rel="noopener noreferrer"&gt;avds&lt;/a&gt; then launch the Android Tablet:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;emulator &lt;span class="nt"&gt;-list-avds&lt;/span&gt;
emulator &lt;span class="nt"&gt;-avd&lt;/span&gt; name-of-your-tablet-emulator
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Navigate to the project directory (e.g. FireTabletDemo) and run the app using npx:&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="nb"&gt;cd &lt;/span&gt;FireTabletDemo
npx expo start &lt;span class="nt"&gt;-a&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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.amazonaws.com%2Fuploads%2Farticles%2Fp8zkx2l2fb4x13au86tq.png" 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.amazonaws.com%2Fuploads%2Farticles%2Fp8zkx2l2fb4x13au86tq.png" alt="Tablet emulator demo" width="646" height="924"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Your app is now running on the emulator using a local development server and Expo Go, without having to create the Android build.&lt;/p&gt;

&lt;h3&gt;
  
  
  Running on a physical tablet device:
&lt;/h3&gt;

&lt;p&gt;Follow the instructions &lt;a href="https://developer.amazon.com/docs/fire-tablets/connecting-adb-to-device.html" rel="noopener noreferrer"&gt;here&lt;/a&gt; to connect your tablet via adb. Afterwards, confirm it is available as a device:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;adb devices &lt;span class="nt"&gt;-l&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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.amazonaws.com%2Fuploads%2Farticles%2F7nw7tnph1tcpdokbqkec.png" 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.amazonaws.com%2Fuploads%2Farticles%2F7nw7tnph1tcpdokbqkec.png" alt="adb devices result" width="762" height="73"&gt;&lt;/a&gt;&lt;br&gt;
Navigate to the project directory then run a development build on your target device (e.g.  KFTRWI)&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="nb"&gt;cd &lt;/span&gt;FireTabletDemo
npx expo run:android &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;deviceName]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The development build will now install within the android directory: &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.amazonaws.com%2Fuploads%2Farticles%2F6mlxxj6vq52qowzufzv4.png" 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.amazonaws.com%2Fuploads%2Farticles%2F6mlxxj6vq52qowzufzv4.png" alt="Tablet android build" width="455" height="326"&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.amazonaws.com%2Fuploads%2Farticles%2Fmcblxp9rnr7xd4g71d5o.gif" 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.amazonaws.com%2Fuploads%2Farticles%2Fmcblxp9rnr7xd4g71d5o.gif" alt="Tablet development build" width="600" height="316"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  📺 Building for Fire TVs
&lt;/h2&gt;

&lt;p&gt;To build apps for Fire TVs with React Native you can follow a similar journey.&lt;/p&gt;

&lt;p&gt;In a new directory, create a new React Native project with the expo, this time using the with-tv example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx create-expo-app FireTVDemo &lt;span class="nt"&gt;-e&lt;/span&gt; with-tv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Running on Android TV Emulator
&lt;/h3&gt;

&lt;p&gt;Launch the Android TV emulator:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;emulator &lt;span class="nt"&gt;-avd&lt;/span&gt; name-of-your-tv-emulator
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Navigate to the project directory and run your app:&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="nb"&gt;cd &lt;/span&gt;FireTVDemo
npx expo start &lt;span class="nt"&gt;-a&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Similar to the Fire tablets, your app will run on the avd emulator without having to create the Android build:&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.amazonaws.com%2Fuploads%2Farticles%2F8rum0b84lvd5myqhe5jj.png" 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.amazonaws.com%2Fuploads%2Farticles%2F8rum0b84lvd5myqhe5jj.png" alt="TV emulator build" width="800" height="461"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Target the build for TVs:
&lt;/h3&gt;

&lt;p&gt;In order to build for TVs, set the isTV prop to true in your app.json:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"expo"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"plugins"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"@react-native-tvos/config-tv"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"isTV"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"FireTVDemo"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"slug"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"FireTVDemo"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Running your project on a Fire TV device
&lt;/h3&gt;

&lt;p&gt;To connect your Fire TV, follow the instructions &lt;a href="https://developer.amazon.com/docs/fire-tablets/connecting-adb-to-device.html" rel="noopener noreferrer"&gt;here&lt;/a&gt; then check that your device is connected using adb:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;adb devices &lt;span class="nt"&gt;-l&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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.amazonaws.com%2Fuploads%2Farticles%2F6xm9d4phufm77lhxt92q.png" 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.amazonaws.com%2Fuploads%2Farticles%2F6xm9d4phufm77lhxt92q.png" alt="adb devices result" width="800" height="69"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Navigate to the project directory then run a development build on your target device (e.g. -d AFTSS)&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="nb"&gt;cd &lt;/span&gt;FireTVDemo
npx expo run:android &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;deviceName]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You now have the development build installed on your device:&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.amazonaws.com%2Fuploads%2Farticles%2F8knzsfmqu3swt1t90r5v.gif" 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.amazonaws.com%2Fuploads%2Farticles%2F8knzsfmqu3swt1t90r5v.gif" alt="TV device build" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;💡 You can verify your android builds are optimized for TV by checking that your app is using the &lt;a href="https://developer.android.com/training/tv/get-started/create#leanback-req" rel="noopener noreferrer"&gt;Android leanback features&lt;/a&gt; in the Android manifest file.&lt;/p&gt;

&lt;h2&gt;
  
  
  Next steps
&lt;/h2&gt;

&lt;p&gt;Congratulations on building your first React Native app for Amazon Fire Devices! To continue your learning journey you can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sign up for an &lt;a href="https://developer.amazon.com/" rel="noopener noreferrer"&gt;Amazon Developer account&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Join the &lt;a href="https://community.amazondeveloper.com/" rel="noopener noreferrer"&gt;Amazon Developer community&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Integrate &lt;a href="https://dev.to/amazonappdev/react-native-iap-one-package-to-rule-them-all-4f0n"&gt;Amazon APIs&lt;/a&gt; in your app&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>reactnative</category>
      <category>beginners</category>
      <category>react</category>
      <category>learning</category>
    </item>
  </channel>
</rss>
