<?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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F974875%2F04464b7b-ed04-45c5-ac01-0f98ee7e2ffe.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>Building High Quality Streaming Apps: The Blueprint</title>
      <dc:creator>Anisha Malde</dc:creator>
      <pubDate>Fri, 24 Jul 2026 08:35:00 +0000</pubDate>
      <link>https://dev.to/amazonappdev/high-quality-streaming-apps-on-amazon-fire-tv-introducing-the-blueprint-3k0f</link>
      <guid>https://dev.to/amazonappdev/high-quality-streaming-apps-on-amazon-fire-tv-introducing-the-blueprint-3k0f</guid>
      <description>&lt;p&gt;When viewers open a streaming app on Amazon Fire TV, they expect it to start quickly, be easy to navigate with a remote, and begin playback reliably. In a living-room environment, quality issues are visible immediately. If the app is slow, confusing, or unreliable, viewers may lose patience and leave, even when the content itself is strong.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why teams need the same quality view
&lt;/h2&gt;

&lt;p&gt;This post introduces the Fire TV Streaming App Quality Blueprint, a six-part series of posts for partner and app teams responsible for streaming experiences on Fire TV. Each post will cover what teams should have in place, why it matters for viewers and for the teams responsible for the app, and the questions teams and leaders should ask during quality reviews. It is written for the person accountable for the overall quality of a streaming app on Fire TV; whether that is an engineering leader, product leader, TPM, or engineer. For the rest of this series, we call this person / team  the quality owners.&lt;/p&gt;

&lt;p&gt;Each post is meant to help teams look at the same app experience together. Where is it working? Where does risk remain? What needs attention before the next release? The goal is to move those conversations earlier in the full lifecycle of the streaming app experience, so quality is considered during planning, design, development, testing, release, and operations. If quality is treated mainly as a final test or launch-readiness check, teams may find important issues too late, when fixes are harder, release options are limited, and viewers are more likely to experience problems in production.&lt;/p&gt;

&lt;p&gt;Streaming app quality is not only about the app code, and it rarely sits with one team. On Fire TV, the app experience depends on many parts working together: the app, catalog, sign-in, subscriptions, playback, ads, third-party integrations, monitoring, release readiness, and support. When an issue occurs, viewers do not see the ownership map behind it. They see missing content, a slow app, buffering, repeated ads, or paid content that stays locked. Internally, the cause may sit with a different system, team, or even organization. One team may be looking at crash reports, another at playback errors, another at support contacts or partner-side metrics. If those signals are reviewed separately, the team can spend too much time debating the symptom and too little time deciding what needs to change before the next release.&lt;/p&gt;

&lt;p&gt;The Blueprint gives teams a practical way to review the areas that most affect the Fire TV streaming app experience. It also pushes the review beyond individual defects, toward ownership, signals, and release practices.&lt;/p&gt;

&lt;h2&gt;
  
  
  How this relates to implementation guidance
&lt;/h2&gt;

&lt;p&gt;This series is not a how-to coding guide, SDK (Software Development Kit) manual, or replacement for implementation documentation. For implementation guidance, teams should continue to use Fire TV and Appstore documentation, SDK guides, sample code, and Fire OS or React Native guidance where applicable. This series is about the quality question behind the implementation work: does the app experience meet the expectations viewers have on Fire TV? &lt;em&gt;Is it easy to use, reliable during playback, stable in production, supported by useful signals, and safe to release?&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The six pillars
&lt;/h2&gt;

&lt;p&gt;The Blueprint is organized around six pillars. Each pillar focuses on a part of the viewer experience or the operating model behind it. Although the posts are written to stand alone, the pillars are ordered by dependency. You need visibility into what's happening before you can improve performance, you need stability before the experience feels polished, and you need operational maturity before you can ship with confidence:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Insight and Telemetry&lt;/strong&gt;: Can the team see how the app is performing for viewers, where problems are happening, and which issues changed after a release? This includes app health, playback quality, errors, key viewer journeys, and release impact.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Performance and Efficiency&lt;/strong&gt;: Startup time, remote responsiveness, how smooth browsing feels, screen loading, and device resource usage. What feels fine during development may feel sluggish on older Fire TV hardware in a real living room. This pillar focuses on whether the app feels fast enough for viewers, not whether it passes internal performance gates.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Stability and Resilience&lt;/strong&gt;: Viewers don't think in terms of root cause. The app stopped working, and that's the whole story. This pillar covers crashes, ANRs (Application Not Responding), frozen screens, bad error handling, service outages, and network interruptions. If the team has known crash scenarios or unrecoverable states that haven't been prioritized, this is where that shows up. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Living-Room Experience and Accessibility&lt;/strong&gt;: This is the difference between an app designed for a TV and one ported from mobile that technically runs. Remote navigation, focus behavior, Back button predictability, TV-appropriate layouts, voice support, accessibility. Most of these issues get caught late because teams test on desktop or emulators first and only pick up a real remote closer to launch.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Streaming Experience&lt;/strong&gt;: Does video start, keep playing, and recover when something goes wrong? Covers on-demand and live content, ad insertion where applicable, mid-stream errors, and resume. Many of the "app is broken" reports from viewers are actually playback-path failures that cross multiple service boundaries.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Release and Operations Excellence&lt;/strong&gt;: Can the team ship with confidence, catch regressions in production quickly, roll back without a fire drill, and learn from incidents before the next release? This pillar is less about code and more about the release practices and operational readiness around it.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What’s next
&lt;/h2&gt;

&lt;p&gt;In our work with partner app teams on Fire TV, one of the hardest questions to answer cleanly is: which issue is hurting the most viewers right now? The next post is about building that answer. We start with Insight and Telemetry because teams need to see how the app is performing for viewers before they can improve it. It looks at app health and playback quality in production, how to identify the issues affecting viewers, and how to decide what to fix first.&lt;/p&gt;

</description>
      <category>tv</category>
      <category>development</category>
      <category>architecture</category>
      <category>learning</category>
    </item>
    <item>
      <title>Building a Dev Content Strategy that survives Monday</title>
      <dc:creator>Anisha Malde</dc:creator>
      <pubDate>Wed, 22 Jul 2026 15:18:10 +0000</pubDate>
      <link>https://dev.to/anishamalde/building-a-dev-content-strategy-that-survives-monday-18o5</link>
      <guid>https://dev.to/anishamalde/building-a-dev-content-strategy-that-survives-monday-18o5</guid>
      <description>&lt;p&gt;With AI making it easier than ever to publish anything we're all drowning in content and a lot of the time it's noise. Additionally, developers, more than most audiences, can smell 'slop' a mile away, and once you've lost their trust, you don't win it back with a louder headline. So our job in DevRel isn't to add to the pile. It's to earn enough trust that when we do publish, developers actually stop and read. Which leaves the question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;How do we build a content strategy that earns developers' trust?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's exactly what I had to ask myself when I took over the developer content strategy for my Developer Advocacy team at Amazon. And as the saying goes, nothing good in life is easy 😂. It wasn't &lt;em&gt;just&lt;/em&gt; about writing quality content. The issue was that our developer audience is enormous: multiple Appstores (&lt;a href="https://developer.amazon.com/apps-and-games" rel="noopener noreferrer"&gt;Amazon Appstore&lt;/a&gt;, &lt;a href="https://developer.ring.com/" rel="noopener noreferrer"&gt;Ring Appstore&lt;/a&gt;, &lt;a href="https://developer.amazon.com/en-US/alexa" rel="noopener noreferrer"&gt;Alexa Appstore&lt;/a&gt;), two Operating Systems (&lt;a href="https://developer.amazon.com/docs/fire-tv/fire-os-overview.html" rel="noopener noreferrer"&gt;Fire OS&lt;/a&gt; and &lt;a href="https://developer.amazon.com/docs/vega/vega.html" rel="noopener noreferrer"&gt;Vega&lt;/a&gt;), and a growing set of form factors (Fire TV, Fire Tablet, Echo Show, Ring, Bee). Now combine that with the fact that each one of those surfaces comes with its own SDK releases, platform quirks, and tsunami of inbound content ideas: product teams wanting help with launches, developers dropping feedback, marketing needs for newsletters. Not to forget keeping on top of the latest trending AI tooling we need to weave in.&lt;/p&gt;

&lt;p&gt;Overwhelmed was an understatement!&lt;/p&gt;

&lt;p&gt;Honestly, my first thought was: is it too late to become a farmer? 😅 Jokes aside, I needed a way to sort out the mess, so I started with a few questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Where do the ideas come from?&lt;/li&gt;
&lt;li&gt;What kinds of content can we make?&lt;/li&gt;
&lt;li&gt;Who is each piece for?&lt;/li&gt;
&lt;li&gt;And finally, how do we decide what to prioritise?&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 1: Get all the ideas on the table
&lt;/h2&gt;

&lt;p&gt;Before deciding what to make, we needed to know what content themes we had. And by theme I mean an idea or topic, not a finished piece of content yet, something like &lt;em&gt;Improve performance on Vega&lt;/em&gt; or &lt;em&gt;getting started with our MCP server&lt;/em&gt;. So I started by collating where those themes come from. Every theme in our backlog has to trace back to at least one of these sources:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Voice of the Developer.&lt;/strong&gt; What are developers actually telling us? Forum posts, GitHub issues, event conversations, survey data, DMs. Not what we &lt;em&gt;assume&lt;/em&gt; they want.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Goals.&lt;/strong&gt; What are we trying to achieve as a team and as an org? If a piece of content doesn't ladder up to something we've committed to, it's worth de-prioritising.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Go To Market.&lt;/strong&gt; What's launching? New devices, SDK releases, Appstore APIs. If product is shipping something, developers will need help using it and we need to plan for it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Walk the product.&lt;/strong&gt; What did we find when we built with it ourselves? Friction we hit before it becomes a developer pain point is important to mitigate.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Our own experience.&lt;/strong&gt; What do we think developers need, based on years of doing this? This one's the most subjective and the easiest to over-index on, so we treat it as one voice among five, and never the loudest one in the room.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkf4bv8upjyypdw15g52c.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkf4bv8upjyypdw15g52c.png" alt="Where DevRel content comes from" width="799" height="363"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With the sources named, I can look at any sprint's backlog and quickly check we're covering the ground. If any of those sources are quiet, that's worth a conversation before we create anything else.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Pick the right format for each idea
&lt;/h2&gt;

&lt;p&gt;Once we had a list of themes, the next call was to figure out what shape each one should take. This is where teams usually reach for their favourite format by default (we're a video team, we like blogs, someone loves workshops), and I wanted to stop doing that.&lt;/p&gt;

&lt;p&gt;So the first thing I did was write down every format we can make, roughly how long each takes, where it gets published, and who it's really for.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjh3dyz1knb0eixu0o3vv.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjh3dyz1knb0eixu0o3vv.png" alt="Types of Developer Content" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With every format on the table, picking one for a given theme becomes a judgement call, but not a random one. Here's the rough rule of thumb I use:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;If it's visual, show it → Video.&lt;/strong&gt; Anything with a UI, a device interaction, or a screen / IDE flow defaults to a &lt;strong&gt;video tutorial&lt;/strong&gt; or a &lt;strong&gt;livestream / office hours&lt;/strong&gt;. A tutorial telling someone to "press left, then OK, then wait for the next generic screen" is fighting the medium.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;If it's a series of decisions, write it → Written.&lt;/strong&gt; Architecture choices, trade-offs, and "why this and not that" pieces belong in a &lt;strong&gt;technical article&lt;/strong&gt; or a &lt;strong&gt;thought leadership article&lt;/strong&gt;. Readers can scan, jump around, and make informed decisions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;If they need to build it, make it hands-on → Hands-On.&lt;/strong&gt; When the payoff is "developer has a running thing on their machine", this becomes a &lt;strong&gt;code lab&lt;/strong&gt;, a &lt;strong&gt;sample app&lt;/strong&gt;, or a &lt;strong&gt;boilerplate / template&lt;/strong&gt;. Written explanation on its own doesn't cut it. In-person versions of this become &lt;strong&gt;workshops&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;If AI is doing the work, make it AI-shaped → AI.&lt;/strong&gt; If the developer is going to be pair-programming with Claude or Kiro to solve this, the content has to fit &lt;em&gt;inside&lt;/em&gt; that workflow. This is where &lt;strong&gt;agent skills&lt;/strong&gt;, &lt;strong&gt;prompt libraries&lt;/strong&gt;, &lt;strong&gt;MCP server configurations&lt;/strong&gt;, and &lt;strong&gt;AI-embedded 'tutorials'&lt;/strong&gt; earn their spot.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;If it's a moment, make it a moment → Written + Social.&lt;/strong&gt; Launches, milestones, community wins, big learnings. &lt;strong&gt;Blog posts&lt;/strong&gt; on developer.amazon.com, &lt;strong&gt;case studies / spotlights&lt;/strong&gt;, and &lt;strong&gt;social content&lt;/strong&gt; on LinkedIn and dev.to. Optimised for reach and timing, not depth.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of these are hard rules. Plenty of themes get more than one format (a launch might get a blog, a video, and a sample app), but the rule of thumb makes the &lt;em&gt;first&lt;/em&gt; format choice feel less arbitrary, and it forces us to justify when we depart from it.&lt;/p&gt;

&lt;p&gt;Now we know what the theme is, and what shape it'll take. The last question was where in the developer's journey it belongs, because this is how we decide where to target activation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Map each idea to a stage of the developer journey
&lt;/h2&gt;

&lt;p&gt;Every developer moves through roughly the same stages when they land on a new platform. They discover it, evaluate whether it fits, actually build something with it, and (hopefully) ship, grow, and monetise. If all our content lives at the "discover" end, developers get excited and then bounce because there's nothing to help them build. If it all lives at the "build" end, no one finds us in the first place.&lt;/p&gt;

&lt;p&gt;So we tag every theme with the stage it activates. It's not a strict rule, more of a sanity check. When we're staring at a quarter's worth of ideas, we ask: is this balanced across the journey? Or are we accidentally shipping five discover-stage pieces and nothing that helps someone actually ship?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffrhqjnpgnh6wvv7ek8ud.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffrhqjnpgnh6wvv7ek8ud.png" alt="Mapping DevRel content to the Developer journey" width="799" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How we decide what to create
&lt;/h2&gt;

&lt;p&gt;Once every theme has a source, a format, and an activation stage, deciding what to prioritise stops being a vibes exercise. What we're left with is a well-curated backlog with a good spread across sources, formats, and journey stages, a lot less overwhelming than the pile I started with. And when a new idea lands, it goes through the same three passes. Anything that clears all three joins the backlog and gets assigned out during sprints. But ultimately it gives me an answer I can back for every stakeholder in the room - product, marketing, my team, and the developers themselves 💛.&lt;/p&gt;

&lt;p&gt;And on the note of Voice of the Developer, if there's anything you've been hoping we'd cover on Amazon devices, drop it in the comments and I'll add it to the backlog 😉.&lt;/p&gt;

</description>
      <category>devrel</category>
      <category>career</category>
      <category>writing</category>
      <category>ai</category>
    </item>
    <item>
      <title>Agents &amp; Agent Orchestration, MCP, Skills, Context, Prompt &amp; Harness Engineering 🤯: What, When, Where, How?</title>
      <dc:creator>Anisha Malde</dc:creator>
      <pubDate>Mon, 29 Jun 2026 11:41:36 +0000</pubDate>
      <link>https://dev.to/anishamalde/agents-agent-orchestration-mcp-skills-context-prompt-harness-engineering-what-when-504b</link>
      <guid>https://dev.to/anishamalde/agents-agent-orchestration-mcp-skills-context-prompt-harness-engineering-what-when-504b</guid>
      <description>&lt;p&gt;If you are like me, you are overwhelmed 🤯.&lt;/p&gt;

&lt;p&gt;The way we build software has always shifted, and as engineers we have always had to keep up with new trends and ways of building. But historically it was one framework or tool at a time. I remember when React moved from class components to functional components and hooks back in 2019, I had time to learn it, blog about it, and read twitter fights over it.&lt;/p&gt;

&lt;p&gt;Now it feels like we are on an exponential learning curve. New ways of building show up faster than I can finish reading the announcement post for the last one. So if you have not been living under a rock 😉 and you are still employed 😅 in tech, you have probably lived through the same 'vocabulary' creep as I have.&lt;/p&gt;

&lt;p&gt;This is my attempt to lay out my learning journey in one place: &lt;strong&gt;what&lt;/strong&gt; each of these terms mean, &lt;strong&gt;when&lt;/strong&gt; they came about, &lt;strong&gt;how&lt;/strong&gt; they all fit together, and &lt;strong&gt;where&lt;/strong&gt; to find them in the tools you already use.&lt;/p&gt;

&lt;h2&gt;
  
  
  The What &amp;amp; When
&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fq2kcoyjnao154a6qisyv.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fq2kcoyjnao154a6qisyv.png" alt="Timeline showing the evolution of practices from prompt engineering to context engineering to harness engineering" width="800" height="479"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Prompt engineering: refining intent
&lt;/h3&gt;

&lt;p&gt;Most of our early interactions with LLMs started with "Hi, could you maybe review this for me, preeettty please?". But soon we realised we could get a better output by tweaking the words we prompted in, e.g. "You are a senior engineer reviewing this code, think critically and write tests", and so the practice of &lt;strong&gt;prompt engineering&lt;/strong&gt; came about.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://aws.amazon.com/what-is/prompt-engineering/" rel="noopener noreferrer"&gt;AWS calls it&lt;/a&gt; "the process where you guide generative AI solutions to generate desired outputs. In prompt engineering, you choose the most appropriate formats, phrases, words, and symbols that guide the AI to interact with your users more meaningfully." It includes techniques like prompt chaining and chain-of-thought tricks ("let's think step by step"). And it worked fine because models were small and tasks were short.&lt;/p&gt;

&lt;h3&gt;
  
  
  Context engineering: managing information
&lt;/h3&gt;

&lt;p&gt;Eventually we realised the prompt alone wasn't cutting it, the model also needed 'context' to answer well. So the question stopped being "what is the perfect prompt?" and became "what is the perfect set of things in the context window right now?", and the practice of &lt;strong&gt;context engineering&lt;/strong&gt; came about. The prompt is still in there but now you're managing what the model knows at the moment of the call, not just what you prompt it. But with limited tokens in a context window, it was also about making sure you don't overload it (avoiding &lt;strong&gt;context bloat&lt;/strong&gt;). So really, context engineering is about managing a few categories of inputs and each one gave us a new bit of vocabulary:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Prompt&lt;/strong&gt;: which we already know - the instructions, the role, the rules of how the model should behave, and the actual question being asked.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Knowledge (RAG, Retrieval-Augmented Generation)&lt;/strong&gt;: pulling relevant context from external sources (documents, databases, APIs, search indexes) into the window so the model can ground its answer in real data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Memory&lt;/strong&gt;: state that persists across conversations or sessions, both short-term (this conversation) and long-term (across sessions), plus context compression so older messages get summarised when things start to get long.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tools&lt;/strong&gt;: how the model talks to the outside world. &lt;strong&gt;MCP (Model Context Protocol)&lt;/strong&gt; is the open standard for connecting models to external data, tools, and workflows.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agent Skills&lt;/strong&gt;: As context engineering matured, people realised they were re-loading the same combinations of the above (instructions, knowledge, and tools) over and over. &lt;a href="https://agentskills.io/" rel="noopener noreferrer"&gt;Agent Skills&lt;/a&gt; appeared as an open standard to bundle them, originally developed by Anthropic, now adopted across Claude, Codex, Cursor, Gemini CLI, GitHub Copilot and many more. A Skill is a folder of instructions, knowledge, and tool wiring that the agent loads &lt;em&gt;only when relevant&lt;/em&gt;, so the context window doesn't get bloated.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now, agents as a concept aren't new, AI agents have existed for decades, chess engines, rule-based systems, reinforcement learning models. But what changed recently is that LLMs gave agents a reasoning engine, and context engineering gave them the domain knowledge and tools to actually do specific things well, and that's when agents became 'mainstream'.&lt;/p&gt;

&lt;h3&gt;
  
  
  Agents &amp;amp; Agent Orchestration
&lt;/h3&gt;

&lt;p&gt;You can think of an agent as having an identity (its role and instructions), domain knowledge (the context, skills, memory it carries), tools (what it can call), and a &lt;strong&gt;loop&lt;/strong&gt; that ties it all together. The loop is the cycle the agent runs through on every step: read the current context, reason about what to do next, call a tool, observe the result, and decide whether to keep going or stop. Without that loop, you've got a model that answers a question. With it, you've got something that can take multiple steps to get a job done. Now you might have already taken it a step further and have one agent that plans, another that implements, a third reviews. This is &lt;strong&gt;agent orchestration&lt;/strong&gt;: the choreography between agents. But orchestration also answers who runs first, who runs in parallel, how the planner hands off, whether sub-agents share context, what happens when one fails. Common patterns include: fan-out to specialists, judge-and-vote, pipeline stages, planner-worker.&lt;/p&gt;

&lt;p&gt;You could orchestrate agents before harness engineering had a name, but orchestration on its own is just word-based instructions, you tell the agents what to do and let them go. Agents would route dynamically, hand off silently, and hallucinate. So even though orchestration 'works', there's a deeper discipline that determines whether your agents actually succeed with the intended output, and that's where the term harness engineering came about.&lt;/p&gt;

&lt;h3&gt;
  
  
  Harness engineering: controlling execution
&lt;/h3&gt;

&lt;p&gt;Harness engineering is the scaffolding around your agents, how context gets delivered, how outputs get verified, how plans get captured, and where &amp;amp; when humans can intervene. Orchestration decides what the agents do, the harness decides whether they can actually do it. As &lt;a href="https://openai.com/index/harness-engineering/" rel="noopener noreferrer"&gt;OpenAI puts it&lt;/a&gt;, the harness is the systems, scaffolding, and leverage that turn a model into something that can do real work.&lt;/p&gt;

&lt;p&gt;Think of agents on their own like an engineering team told to "just build a checkout page". You've got a frontend dev, a backend dev, QA, a UX designer, all capable, all specialised. But without the scaffolding around them, here's what actually happens: nobody agrees on what "done" looks like (no task lifecycle), so the frontend builds against last week's API spec while the backend ships a new one (no shared context delivery). QA tests the happy path but never sees the designer's edge cases (no feedback loop). The backend dev pushes straight to prod on a Friday because nobody set up a staging gate (no guardrails). When it breaks, there's no rollback and no logs to tell you why (no state persistence, no observability). It's the same capable people doing the work, just with a completely different outcome.&lt;/p&gt;

&lt;p&gt;Swap the engineering team for AI agents and you get the same failure modes, plus one more: the model itself is non-deterministic, the same prompt can take five different paths on five different runs. The harness is what holds it all together, the difference between an agent that might do the right thing and a system that reliably does. Concretely, it looks like:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwtuqf17v8u59ytiglrtv.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwtuqf17v8u59ytiglrtv.png" alt="Diagram showing how harness engineering wraps around and supports agent orchestration, with components like context delivery, feedback loops, guardrails, and observability" width="799" height="532"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Context delivery&lt;/strong&gt;: assembling and delivering the prompt, knowledge, memory, tools, skills on every loop&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agent Orchestration&lt;/strong&gt;: routing between specialised agents (each with its own role, tools, and skills), hand-offs, fan-out, judge-and-vote, planner-worker patterns, plus spawning sub-agents with their own isolation, lifecycle, and context&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Feedback loops&lt;/strong&gt;: act → observe → react → repeat. Plus the type checkers, linters, tests, and tool outputs that tell the agent when it has gone wrong, so it can self-correct&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Task lifecycle&lt;/strong&gt;: the macro-loop a run goes through, e.g. Triage → Clarify → Plan → Execute (TDD) → Evaluate → Done. The harness decides when each step starts and ends, and when to ask a human&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tool execution&lt;/strong&gt;: retries, timeouts, fallbacks when something hangs or fails&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Guardrails and sandboxing&lt;/strong&gt;: read-only credentials, approval gates for destructive actions, content/output filters, filesystem isolation, the rules that keep the agent inside the lines&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;State persistence and recovery&lt;/strong&gt;: memory, plans, transcripts, git checkpoints so the agent can be paused, resumed, or rolled back&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Observability&lt;/strong&gt;: traces, costs, evals, replay, the audit trail that makes the system legible to a human&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How: it all fits together
&lt;/h2&gt;

&lt;p&gt;So we understand harness engineering conceptually, but what does a real run look like end-to-end? The harness drives the agent through a specific task lifecycle, and it owns the arrows between every step. Here's one example:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Farr0ve8cfzpvgyaf7z19.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Farr0ve8cfzpvgyaf7z19.png" alt="Example task lifecycle showing how a harness drives a run through specialised agents: Router, Planner, Generator, Evaluator, Verifier, with a Human able to intervene at any step" width="800" height="892"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Each step is owned by a different &lt;strong&gt;specialised agent&lt;/strong&gt;, and the harness is what hands work from one to the next:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Router&lt;/strong&gt; triages the incoming request, what kind of task is this, which lifecycle should it run, does it even have enough information to start?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Planner&lt;/strong&gt; breaks the task into steps, surfaces assumptions, and writes a plan the next agent can execute against.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Generator&lt;/strong&gt; does the actual work, ideally test-first, so the feedback loop has something to push back on.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Evaluator&lt;/strong&gt; grades the output against the plan, the tests, and any acceptance criteria, and sends it back if it doesn't pass.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verifier&lt;/strong&gt; does the final end-to-end check, often by actually exercising the running app (Playwright, a real API call, a real build).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Human&lt;/strong&gt; can intervene at any step, approving risky actions, correcting course, or kicking the run back to an earlier phase.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The harness owns the &lt;em&gt;connective tissue&lt;/em&gt; between agents, what context gets passed along, when to retry, when to escalate, and when to call it done. It also owns the trace, a recording of every prompt and tool call that ran, which matters more than it sounds. With normal software you can read the code and predict what it does, but with an agent you can't, the same loop will take different paths on different runs, and the only way to understand what actually happened (and improve next time) is to read back the trace. That's the bit most people skip, and it's the reason "human in the loop" ends up being less of a checkbox and more of an ongoing job: you're watching runs in real time, stepping in when something goes off, approving the risky calls, auditing weird traces afterwards, and feeding the worst ones back as evals.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tactics for making it work
&lt;/h3&gt;

&lt;p&gt;The next question is how you actually make it work in practice, and here the field is converging on a handful of patterns:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Keep the harness thin, push the smarts into skills.&lt;/strong&gt; A good harness is mostly plumbing, roughly 200 lines that run the loop, manage files, handle context, and keep things safe. The actual knowledge lives in skills. That way you can swap the model out without rewriting your skills, and you avoid the trap of building a brittle wrapper that has to know everything itself. (&lt;a href="https://github.com/garrytan/gbrain/blob/master/docs/ethos/THIN_HARNESS_FAT_SKILLS.md" rel="noopener noreferrer"&gt;Garry Tan, "Thin Harness, Fat Skills"&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Separate the agent doing the work from the agent grading it.&lt;/strong&gt; Agents are reliably bad at marking their own homework, they will write code, declare it correct, and move on without ever questioning the result. A standalone evaluator with a sceptical streak is far easier to tune than a generator trying to critique itself, which is why this pattern shows up in nearly every harness writeup, often under the name &lt;em&gt;evaluator-optimizer&lt;/em&gt;. (&lt;a href="https://www.anthropic.com/engineering/building-effective-agents" rel="noopener noreferrer"&gt;Anthropic, "Building Effective Agents"&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One task per session, and check the baseline first.&lt;/strong&gt; Each run should start with fresh context and a quick verification that the build, tests, and setup are still green before the agent touches anything. Without that baseline check, the agent will spend an hour debugging a problem that was already there when it sat down, and those compounding bugs across sessions are one of the easiest ways for a run to go sideways. (&lt;a href="https://simonwillison.net/2025/Sep/30/designing-agentic-loops/" rel="noopener noreferrer"&gt;Simon Willison, "Designing Agentic Loops"&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stop prompting, start designing the loop.&lt;/strong&gt; Once the lifecycle is set up, you stop typing one-off prompts and start shaping the loop that prompts on your behalf, with each agent getting its prompt assembled from the goal, the current context, and whatever the previous agent left behind. As Boris Cherny, head of Claude Code at Anthropic, put it: &lt;em&gt;"I don't prompt Claude anymore. I have loops running that prompt Claude."&lt;/em&gt; (&lt;a href="https://addyosmani.com/blog/loop-engineering/" rel="noopener noreferrer"&gt;Addy Osmani, &lt;em&gt;Loop Engineering&lt;/em&gt;&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wire in fast feedback.&lt;/strong&gt; Type checkers, linters, tests, and tools like Puppeteer or Playwright for anything UI-driven are what stop an agent from marking features done without ever running the thing. As Simon Willison puts it, automated tests &lt;em&gt;"hugely amplify what these agents can do"&lt;/em&gt;, because they give the loop something objective to check against. The feedback loop has to turn fast as well, because slow checks just mean fewer iterations before the context window runs out. (&lt;a href="https://simonwillison.net/2025/Sep/30/designing-agentic-loops/" rel="noopener noreferrer"&gt;Simon Willison, "Designing Agentic Loops"&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Strip the harness as the models get better.&lt;/strong&gt; Every component in your harness is encoding an assumption about what the model can't do on its own, and those assumptions go stale faster than you'd think. With each model upgrade, pull one piece out and see whether anything actually breaks, because the best harness is the smallest one that still gets you to a reliable result. (&lt;a href="https://openai.com/index/harness-engineering/" rel="noopener noreferrer"&gt;OpenAI on harness engineering&lt;/a&gt;)&lt;/p&gt;

&lt;h2&gt;
  
  
  Where: tools for building your harness
&lt;/h2&gt;

&lt;p&gt;So we've got the concepts, where do you actually start? It depends on how much you want to build yourself, and there are roughly three layers to choose from:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Use a ready-made harness.&lt;/strong&gt; Someone else has already wired up the loop, the tools, the lifecycle, and the guardrails. You bring your model and configure it for your use case.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Build your own with an SDK.&lt;/strong&gt; The SDK gives you the loop, tools, memory, and orchestration. You build the lifecycle, feedback loops, and guardrails on top.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Host it somewhere.&lt;/strong&gt; Once it works locally, you need a runtime with memory, auth, observability, and scaling.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Most people start at layer 1 to see what good looks like, then drop to layer 2 when their use case stops fitting.&lt;/p&gt;

&lt;h3&gt;
  
  
  Layer 1: ready-made harnesses (mostly for coding tasks)
&lt;/h3&gt;

&lt;p&gt;The most mature ready-made harnesses today are all &lt;strong&gt;coding agents&lt;/strong&gt;. The use case is well-understood (read code, edit code, run tests, commit), and several of them are open enough that you can study how they're put together:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://code.claude.com/" rel="noopener noreferrer"&gt;Claude Code&lt;/a&gt;&lt;/strong&gt; — the closed-source benchmark. Automatic context engineering and compaction. Built on top of the Claude Agent SDK, which Anthropic publishes separately if you want to build your own version of it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://cline.bot/" rel="noopener noreferrer"&gt;Cline&lt;/a&gt;&lt;/strong&gt; — open-source agent runtime that runs as a CLI, IDE extension, or via SDK. Its harness is exposed as user-facing toggles: explicit &lt;em&gt;Plan&lt;/em&gt; and &lt;em&gt;Act&lt;/em&gt; modes for the lifecycle, step-level approval as the guardrail, &lt;code&gt;.clinerules&lt;/code&gt; files for skills, MCP for tools, and checkpoints with one-click undo for state.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://pi.dev/" rel="noopener noreferrer"&gt;Pi&lt;/a&gt;&lt;/strong&gt; — deliberately minimal. Six tools by default, everything else as configurable extensions. The cleanest one to read end-to-end.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://goose-docs.ai/" rel="noopener noreferrer"&gt;Goose&lt;/a&gt;&lt;/strong&gt; — the most general-purpose of the bunch, useful beyond coding. YAML &lt;em&gt;recipes&lt;/em&gt; as portable lifecycles, MCP for tools, subagents for orchestration, and an &lt;em&gt;adversary reviewer&lt;/em&gt; as a guardrail.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If your use case is also coding, you may not need to leave this layer at all, fork one, drop your skills and rules in, and you're done.&lt;/p&gt;

&lt;h3&gt;
  
  
  Layer 2: build your own with an SDK
&lt;/h3&gt;

&lt;p&gt;Once you step outside coding (customer support, document processing, a TV-app generator, anything domain-specific), the ready-made harnesses stop fitting. That's when you drop down to an SDK.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;An SDK is basically a half-built harness.&lt;/strong&gt; It ships you the engine, the agent loop, tool execution via MCP, memory, orchestration primitives, observability hooks, and you finish the rest, the lifecycle phases, the skills, the verify rules, the domain logic. Claude Code is what Anthropic built on top of the Claude Agent SDK. You'd be doing the same thing, just for your problem.&lt;/p&gt;

&lt;p&gt;A real example: &lt;a href="https://github.com/giolaq/tv-build-harness" rel="noopener noreferrer"&gt;tv-build-harness&lt;/a&gt;, by &lt;a class="mentioned-user" href="https://dev.to/giolaq"&gt;@giolaq&lt;/a&gt;, generates multi-platform TV apps from a JSON manifest. Under the hood it runs the Claude CLI (or Strands SDK) as the engine, and on top the author built a deterministic pipeline of phases (plan → scaffold → branding → content → screens → ... → visual_qa_loop), each loading targeted skills, each verified before moving on, each git-committed so the run can be paused or resumed. "Thin harness, fat skills" in practice. That's what Layer 2 looks like, the SDK gives you the loop, you give it the structure your problem needs.&lt;/p&gt;

&lt;p&gt;The SDKs themselves split two ways:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Model-aligned&lt;/strong&gt; (tighter integration, locked to one model family): &lt;a href="https://docs.claude.com/en/api/agent-sdk/overview" rel="noopener noreferrer"&gt;Claude Agent SDK&lt;/a&gt;, &lt;a href="https://openai.github.io/openai-agents-python/" rel="noopener noreferrer"&gt;OpenAI Agents SDK&lt;/a&gt; (the production successor to Swarm), &lt;a href="https://adk.dev/" rel="noopener noreferrer"&gt;Google ADK&lt;/a&gt; (multi-language, model-agnostic via LiteLLM), and &lt;a href="https://learn.microsoft.com/en-us/agent-framework/overview/" rel="noopener noreferrer"&gt;Microsoft Agent Framework&lt;/a&gt; (the direct successor to AutoGen and Semantic Kernel).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Provider-agnostic&lt;/strong&gt; (swap models freely, more setup): &lt;a href="https://www.langchain.com/langgraph" rel="noopener noreferrer"&gt;LangGraph&lt;/a&gt; for graph-based workflows, &lt;a href="https://strandsagents.com/" rel="noopener noreferrer"&gt;Strands Agents&lt;/a&gt; (AWS, open source) for a model-driven thin loop, &lt;a href="https://ai-sdk.dev" rel="noopener noreferrer"&gt;Vercel AI SDK&lt;/a&gt; as the TypeScript default (&lt;a href="https://www.thetoolnerd.com/p/10-agent-harnesses-every-ai-builder" rel="noopener noreferrer"&gt;v7 even ships a &lt;code&gt;HarnessAgent&lt;/code&gt; primitive&lt;/a&gt;), &lt;a href="https://github.com/vercel/eve" rel="noopener noreferrer"&gt;Eve&lt;/a&gt; (also Vercel, in beta) as a filesystem-first framework where you author the agent by dropping files into &lt;code&gt;tools/&lt;/code&gt;, &lt;code&gt;skills/&lt;/code&gt;, and &lt;code&gt;channels/&lt;/code&gt; folders, &lt;a href="https://mastra.ai" rel="noopener noreferrer"&gt;Mastra&lt;/a&gt; for TypeScript with workflows, memory, evals, and RAG built in, and &lt;a href="https://www.crewai.com" rel="noopener noreferrer"&gt;CrewAI&lt;/a&gt; for role-based agent 'crews'.&lt;/p&gt;

&lt;p&gt;Whichever SDK you pick, what your harness ends up looking like depends largely on the task. A coding agent leans on sandboxed execution, git, and a test runner. A customer support agent leans on memory, RAG, and approval gates. A TV-app generator (like the one above) leans on visual QA loops and platform-specific verify rules. Same building blocks, very different assemblies, because the failure modes you're guarding against are different.&lt;/p&gt;

&lt;h3&gt;
  
  
  Layer 3: host it somewhere
&lt;/h3&gt;

&lt;p&gt;Once your harness works locally, you need somewhere to run it with memory, auth, observability, and scaling.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://aws.amazon.com/bedrock/agentcore/" rel="noopener noreferrer"&gt;Amazon Bedrock AgentCore&lt;/a&gt;: managed runtime, memory, identity, gateway, observability. Framework-agnostic, supports Strands, LangChain, OpenAI Agents SDK, and the Claude Agent SDK.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.langchain.com/langgraph-platform" rel="noopener noreferrer"&gt;LangSmith Deployment&lt;/a&gt; (renamed from LangGraph Platform): the default if you're on LangGraph.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://openai.com/index/introducing-agentkit" rel="noopener noreferrer"&gt;OpenAI AgentKit&lt;/a&gt;: Agent Builder, ChatKit, and hosted tools via the Responses API.&lt;/li&gt;
&lt;li&gt;Self-hosted on Fargate (long loops), Modal (sandboxed compute), or Lambda (short loops only).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The cross-cutting bits
&lt;/h3&gt;

&lt;p&gt;Whichever layers you pick, you'll also need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tools&lt;/strong&gt;: &lt;a href="https://github.com/modelcontextprotocol/servers" rel="noopener noreferrer"&gt;MCP servers&lt;/a&gt; and the new &lt;a href="https://registry.modelcontextprotocol.io" rel="noopener noreferrer"&gt;official registry&lt;/a&gt;. MCP was donated to the Linux Foundation in December 2025, so it's the safest bet for portable tool integration.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;State and rollback&lt;/strong&gt;: Git. Every coding harness uses it for a reason.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Feedback loops&lt;/strong&gt;: your test suite, type checker, and linter. Without these, the agent has nothing objective to push back against.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Observability&lt;/strong&gt;: &lt;a href="https://langfuse.com" rel="noopener noreferrer"&gt;Langfuse&lt;/a&gt;, &lt;a href="https://smith.langchain.com" rel="noopener noreferrer"&gt;LangSmith&lt;/a&gt;, &lt;a href="https://phoenix.arize.com" rel="noopener noreferrer"&gt;Arize Phoenix&lt;/a&gt;, or &lt;a href="https://braintrust.dev" rel="noopener noreferrer"&gt;Braintrust&lt;/a&gt; for traces and evals. The OpenTelemetry GenAI conventions are still in development, so don't assume your tracing is portable yet.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Hopefully you're feeling slightly less overwhelmed. At the end of the day, this is all just tactics for getting the model to do what we actually want: reliably, repeatedly, and without burning down the building. The prompt was the first lever, and everything since (context, skills, agents, orchestration, the whole harness) is the same instinct, shape what the model does so the outcome is something you can ship.&lt;/p&gt;

&lt;p&gt;So while the vocabulary will keep changing, the underlying problem we are trying to solve won't. It just depends on how you want to get there, start with what the model gives you out of the box, and add layers only when you hit their limits.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>learning</category>
      <category>agents</category>
    </item>
    <item>
      <title>To Share or Not to Share: Building for multi-platform</title>
      <dc:creator>Anisha Malde</dc:creator>
      <pubDate>Tue, 14 Apr 2026 13:06:56 +0000</pubDate>
      <link>https://dev.to/amazonappdev/to-share-or-not-to-share-taking-your-vega-app-multi-platform-mb5</link>
      <guid>https://dev.to/amazonappdev/to-share-or-not-to-share-taking-your-vega-app-multi-platform-mb5</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"To share, or not to share, that is the question." - Shakespeare, if he'd been a React Native developer"&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you build apps with React Native, you've definitely asked yourself this ☝️. You've got navigation, state management, business logic, UI components, most of it is the same, and is probably using the same libraries, regardless of whether you're targeting Android TV, Apple TV, or Fire TV. So why maintain separate codebases?&lt;/p&gt;

&lt;p&gt;With &lt;a href="https://developer.amazon.com/docs/vega/0.22/vega-get-started.html" rel="noopener noreferrer"&gt;Vega OS&lt;/a&gt;, we had a chance to get this right from the start. Rather than shipping another platform that locks you into a single target, we wanted to make it easy to build for multiple TV platforms at the same time. Depending on your app's architecture, you can realistically share 70-85% of your codebase across TV operating systems. I want to walk you through how it works, and help you figure out what &lt;em&gt;'to share or not to share'&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;To help, we've published a few projects on Github. You can pick the one that fits your workflow and start your journey, or read on and I'll walk through the workspace setup, some of the tooling that makes it all work and what code you can share today (and what you shouldn't).&lt;/p&gt;

&lt;p&gt;👋 &lt;a href="https://github.com/AmazonAppDev/react-native-multi-tv-helloworld" rel="noopener noreferrer"&gt;Multi-TV Hello World&lt;/a&gt; - starter template&lt;br&gt;
📺 &lt;a href="https://github.com/AmazonAppDev/react-native-multi-tv-app-sample" rel="noopener noreferrer"&gt;React Native Multi-TV App Sample&lt;/a&gt; - production-ready reference app&lt;br&gt;
🤖 &lt;a href="https://github.com/AmazonAppDev/devices-agent-skills/blob/main/vega-multi-tv-migration/SKILL.md" rel="noopener noreferrer"&gt;Vega Multi-TV Migration agent skill&lt;/a&gt; - AI assisted migration&lt;/p&gt;
&lt;h2&gt;
  
  
  The shared workspace approach
&lt;/h2&gt;

&lt;p&gt;So what does sharing code across TV platforms actually look like in practice? You want a setup where the shared code lives in one place and the OS specific features (video playback, native integrations, platform quirks) stay isolated. &lt;/p&gt;

&lt;p&gt;To set this up, we refactor the Vega project into a monorepo using &lt;a href="https://yarnpkg.com/features/workspaces" rel="noopener noreferrer"&gt;Yarn v4 workspaces&lt;/a&gt;. On the Vega side, you keep using the Vega SDK as normal. For the other platforms, we use &lt;a href="https://docs.expo.dev/guides/overview/#expo-for-tv" rel="noopener noreferrer"&gt;Expo TV&lt;/a&gt;, which gives you Android TV, Apple TV, and Web support out of the box with a single Expo project. You split things into three workspaces:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;packages/shared/&lt;/code&gt; - OS-agnostic code (the majority of your app)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;packages/vega/&lt;/code&gt; - Vega-specific code for Fire TV&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;packages/expotv/&lt;/code&gt; - Expo TV for Android TV, Apple TV, and Web&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A root &lt;code&gt;package.json&lt;/code&gt; coordinates builds across these sub projects. Each workspace has its own dependencies and build configuration, but they share common code through workspace imports.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;my-app/
├── package.json                  # Root workspace config (Yarn 4.x)
├── packages/
│   ├── shared/                   # @myapp/shared - OS agnostic code
│   │   ├── package.json
│   │   ├── index.ts
│   │   └── src/
│   │       ├── components/       # Shared UI (Banner.tsx, Banner.kepler.tsx, Banner.android.tsx)
│   │       ├── hooks/
│   │       ├── services/
│   │       └── utils/
│   ├── vega/                     # @myapp/vega - Fire TV
│   │   ├── src/App.tsx
│   │   ├── manifest.toml
│   │   └── metro.config.js
│   └── expotv/                   # @myapp/expotv - Android TV / Apple TV / Web
│       ├── src/App.tsx
│       ├── app.json
│       └── metro.config.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The key rule to remember is OS packages import from &lt;code&gt;shared&lt;/code&gt;, but &lt;code&gt;shared&lt;/code&gt; never imports from OS packages.&lt;/p&gt;

&lt;p&gt;Note: By default, the Vega SDK works with &lt;code&gt;npm&lt;/code&gt;, but this monorepo approach uses Yarn v4 workspaces.&lt;/p&gt;

&lt;h3&gt;
  
  
  The tooling that makes sharing work
&lt;/h3&gt;

&lt;p&gt;The workspace structure gets you most of the way there, but two pieces of tooling tie it all together.&lt;/p&gt;

&lt;p&gt;The first is &lt;a href="https://developer.amazon.com/docs/vega-api/0.22/vega-module-resolver-preset.html" rel="noopener noreferrer"&gt;VMRP (Vega Module Resolver Preset)&lt;/a&gt;. Your shared code uses standard React Native imports like &lt;code&gt;react-native-gesture-handler&lt;/code&gt; or &lt;code&gt;react-native-reanimated&lt;/code&gt;, but Vega has its own ported versions of these libraries. VMRP is a Babel preset that automatically swaps those imports for their Vega equivalents at build time, so your shared code stays clean and portable.&lt;/p&gt;

&lt;p&gt;You configure it in your Vega package's &lt;code&gt;babel.config.js&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// packages/vega/babel.config.js&lt;/span&gt;
&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;presets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;module:metro-react-native-babel-preset&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;module:@amazon-devices/kepler-module-resolver-preset&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With this in place, &lt;code&gt;from 'react-native-gesture-handler'&lt;/code&gt; in your shared code automatically resolves to &lt;code&gt;@amazon-devices/react-native-gesture-handler&lt;/code&gt; when building for Vega. No conditional imports, no platform checks.&lt;/p&gt;

&lt;p&gt;The second is &lt;a href="https://developer.amazon.com/docs/vega/0.22/monorepo-support.html" rel="noopener noreferrer"&gt;Vega Studio's monorepo support&lt;/a&gt;. It automatically detects your workspace layout and imports Vega sub packages when you open the project. Enable it in Settings &amp;gt; Vega &amp;gt; Features: Monorepo, and it handles package discovery, workspace synchronisation, and build task coordination for you.&lt;/p&gt;

&lt;p&gt;Now lets discuss: &lt;/p&gt;

&lt;h2&gt;
  
  
  What makes sense to share
&lt;/h2&gt;

&lt;p&gt;Not all code belongs in &lt;code&gt;packages/shared/&lt;/code&gt;. Some things work identically across platforms, some need OS-specific implementations, and some sit in between. Here's how to think about what goes where.&lt;/p&gt;

&lt;h3&gt;
  
  
  Business logic and state management (share it)
&lt;/h3&gt;

&lt;p&gt;This is the easiest win and where you get the most reuse. Your API calls, &lt;a href="https://redux.js.org/" rel="noopener noreferrer"&gt;Redux&lt;/a&gt;/&lt;a href="https://zustand.docs.pmnd.rs/" rel="noopener noreferrer"&gt;Zustand&lt;/a&gt; stores, data transformations, validation logic, formatting utilities usually don't have any OS specific dependencies. As a rule of thumb, if it doesn't touch a native API or render anything to screen, it belongs in &lt;code&gt;packages/shared/&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://github.com/AmazonAppDev/react-native-multi-tv-app-sample" rel="noopener noreferrer"&gt;Multi-TV App Sample&lt;/a&gt; demonstrates this with its dynamic content loading. The catalog API client, data transforms, and type definitions all live in the shared package and every platform consumes the same data layer.&lt;/p&gt;

&lt;h3&gt;
  
  
  UI components (share most of it)
&lt;/h3&gt;

&lt;p&gt;Most of your UI components are shareable too. Buttons, cards, lists, layouts, modals, grid views are usually standard React Native that works across platforms without changes.&lt;/p&gt;

&lt;p&gt;Where it gets interesting is platform specific styling. React Native's file extension resolution handles this cleanly. Write your base component as &lt;code&gt;Banner.tsx&lt;/code&gt;, then add platform specific extentions &lt;code&gt;Banner.kepler.tsx&lt;/code&gt;. Metro picks the right file at build time (this relies on your &lt;a href="https://developer.amazon.com/docs/vega/0.22/monorepo-support.html" rel="noopener noreferrer"&gt;Metro config being set up for monorepo resolution&lt;/a&gt;, both the Hello World and Multi-TV App Sample repos include this configuration).&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://github.com/AmazonAppDev/react-native-multi-tv-helloworld" rel="noopener noreferrer"&gt;Hello World repo&lt;/a&gt; shows this pattern with its &lt;code&gt;HeaderLogo&lt;/code&gt; component, which loads different platform logos using &lt;code&gt;.kepler.tsx&lt;/code&gt;, &lt;code&gt;.android.tsx&lt;/code&gt;, &lt;code&gt;.ios.tsx&lt;/code&gt;, and &lt;code&gt;.web.tsx&lt;/code&gt; variants.&lt;/p&gt;

&lt;p&gt;You can also use &lt;code&gt;Platform.select()&lt;/code&gt; for smaller differences that don't warrant separate files.&lt;/p&gt;

&lt;h3&gt;
  
  
  Navigation and screen flows (share with care)
&lt;/h3&gt;

&lt;p&gt;There are two types of navigation patterns in TV apps, and they share differently.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Screen-to-screen&lt;/strong&gt; routing (moving between pages, tabs, drawers) is usually fully shareable. If you're using &lt;a href="https://reactnavigation.org/" rel="noopener noreferrer"&gt;React Navigation&lt;/a&gt; (which Vega supports via its &lt;a href="https://developer.amazon.com/docs/vega-api/0.22/react-navigation-7-0-0.html" rel="noopener noreferrer"&gt;&lt;code&gt;react-navigation&lt;/code&gt; package&lt;/a&gt;), your screen definitions, route configs, and navigation structure work the same across platforms. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Spatial / Focus navigation&lt;/strong&gt; (moving focus between elements on screen with a remote control d-pad) is where it gets platform-specific. The Multi-TV App Sample uses &lt;a href="https://github.com/bamlab/react-tv-space-navigation" rel="noopener noreferrer"&gt;React TV Space Navigation&lt;/a&gt; to handle focus movement across all platforms, but the layer underneath that captures remote control key events differs per OS. The &lt;a href="https://github.com/AmazonAppDev/react-native-multi-tv-app-sample/tree/main/packages/shared-ui/src/navigation" rel="noopener noreferrer"&gt;&lt;code&gt;RemoteControlManager&lt;/code&gt;&lt;/a&gt; has separate &lt;code&gt;.android.ts&lt;/code&gt;, &lt;code&gt;.ios.ts&lt;/code&gt;, and &lt;code&gt;.kepler.ts&lt;/code&gt; files because each platform fires different key events. The focus logic is shared, the input handling is forked.&lt;/p&gt;

&lt;h3&gt;
  
  
  Layout and theming (share the system, tweak per platform)
&lt;/h3&gt;

&lt;p&gt;TV apps need to look right across different screen sizes and display densities. The pattern here is the same as with the UI: share the design system (tokens, spacing, typography scales), and use platform-specific files or &lt;code&gt;Platform.select()&lt;/code&gt; where individual platforms need adjustments. For production apps, consider building out a proper theme layer with responsive layouts rather than relying on simple scaling alone. &lt;/p&gt;

&lt;p&gt;The &lt;a href="https://github.com/AmazonAppDev/react-native-multi-tv-helloworld" rel="noopener noreferrer"&gt;Hello World repo&lt;/a&gt; includes scaling utilities that normalise dimensions across TV displays based on a 1920x1080 baseline. The scaling logic itself is shared, but you might need platform-specific tweaks for things like safe areas or overscan.&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%2Ftgu7wc08jb2xq4n1x926.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%2Ftgu7wc08jb2xq4n1x926.png" alt="Sharing" width="799" height="448"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What you should keep separate
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Media Player
&lt;/h3&gt;

&lt;p&gt;Production streaming apps tend to use OS-specific media players for optimal performance. You can either follow that path, using native implementations per OS, or use an abstraction to work across like&amp;nbsp;&lt;code&gt;react-native-video&lt;/code&gt;&amp;nbsp;(which now has&amp;nbsp;&lt;a href="https://docs.thewidlarzgroup.com/react-native-video/" rel="noopener noreferrer"&gt;Vega support&lt;/a&gt;). Unless you use these abstractions, your media implementations should live in your OS-specific packages.&lt;/p&gt;

&lt;h3&gt;
  
  
  Amazon specific features
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://developer.amazon.com/docs/vega/0.22/content-launcher-overview.html" rel="noopener noreferrer"&gt;Content Launcher&lt;/a&gt;, In-App Purchase, Amazon Device Messaging, and similar features currently need separate implementations for Vega and Fire OS because their underlying APIs are OS-specific. We're working to migrate these behind single RN libraries, but for now, structure these implementations so they're easy to consolidate later. Keep them in your platform packages with clean interfaces that shared code can call through.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://developer.amazon.com/docs/vega-api/0.22/get-started.html" rel="noopener noreferrer"&gt;Vega UI Components&lt;/a&gt; (VUIC)
&lt;/h3&gt;

&lt;p&gt;Worth flagging early, simple VUIC components like &lt;code&gt;Button&lt;/code&gt; and &lt;code&gt;Text&lt;/code&gt; migrate easily to standard React Native equivalents. But &lt;code&gt;Carousel&lt;/code&gt; and &lt;code&gt;SeekBar&lt;/code&gt; need more work to replace. Identify these dependencies during your analysis phase so you're not surprised mid-migration.&lt;/p&gt;

&lt;h3&gt;
  
  
  Native modules and DRM
&lt;/h3&gt;

&lt;p&gt;Anything that touches native code directly (custom TurboModules, DRM implementations, hardware-specific features) stays platform-specific. No way around it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it yourself: the Hello World starter
&lt;/h2&gt;

&lt;p&gt;The fastest way to see this in action is the &lt;a href="https://github.com/AmazonAppDev/react-native-multi-tv-helloworld" rel="noopener noreferrer"&gt;Multi-TV Hello World&lt;/a&gt; repo. It's a hello-world project with a shared &lt;code&gt;Header&lt;/code&gt; component that renders across Vega, Android TV, Apple TV, and Web from the same codebase.&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%2Fj0el9vapx6p92hfukkzj.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%2Fj0el9vapx6p92hfukkzj.png" alt="Hello world" width="800" height="473"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  See it in production: the Multi-TV App Sample
&lt;/h2&gt;

&lt;p&gt;For something thats closer to a production app, check out the &lt;a href="https://github.com/AmazonAppDev/react-native-multi-tv-app-sample" rel="noopener noreferrer"&gt;React Native Multi-TV App Sample&lt;/a&gt;. This is a TV app template with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Video playback via &lt;a href="https://github.com/TheWidlarzGroup/react-native-video" rel="noopener noreferrer"&gt;react-native-video&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Spatial navigation with &lt;a href="https://github.com/bamlab/react-tv-space-navigation" rel="noopener noreferrer"&gt;React TV Space Navigation&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Drawer navigation, grid layouts, and a dynamic hero banner&lt;/li&gt;
&lt;li&gt;Remote control support across all platforms&lt;/li&gt;
&lt;li&gt;A shared UI library (&lt;code&gt;@multi-tv/shared-ui&lt;/code&gt;) with platform-specific file resolution&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It supports Android TV, Apple TV, Fire TV (Fire OS), Fire TV (Vega OS), and Web from a single monorepo. Good reference for how the shared workspace pattern holds up at scale.&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%2Fns53rrnvwg345hvjmp24.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%2Fns53rrnvwg345hvjmp24.gif" alt="multiTV" width="560" height="296"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Migrating your own app: the AI-assisted approach
&lt;/h2&gt;

&lt;p&gt;We've also packaged our migration process into a three-phase agent skill that works with &lt;a href="https://kiro.dev" rel="noopener noreferrer"&gt;Kiro&lt;/a&gt;, &lt;a href="https://claude.ai" rel="noopener noreferrer"&gt;Claude&lt;/a&gt;, or other AI coding assistants. It's available on GitHub: &lt;a href="https://github.com/AmazonAppDev/devices-agent-skills/tree/main/vega-multi-tv-migration" rel="noopener noreferrer"&gt;vega-multi-tv-migration&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;To use it with Kiro, copy the &lt;code&gt;vega-multi-tv-migration&lt;/code&gt; directory into &lt;code&gt;~/.kiro/skills/&lt;/code&gt; and start a conversation about migrating your app. It activates automatically based on your conversation context.&lt;/p&gt;

&lt;h3&gt;
  
  
  Phase 1: Analyse your codebase
&lt;/h3&gt;

&lt;p&gt;The skill runs static code analysis and gives you an executive summary with estimated code reuse percentage, a dependency classification (what goes to shared, what stays OS-specific, what VMRP handles), and a screen-by-screen migration plan.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Analyse my Vega app for multi-platform migration."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Phase 2: Build the shared workspace structure
&lt;/h3&gt;

&lt;p&gt;This creates the monorepo scaffold, moves code into shared and vega packages, configures Metro for monorepo resolution, and sets up VMRP. After this step, your Vega app should build and run exactly as before, but with shared code properly separated.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Convert my Vega project to a yarn workspaces monorepo using the analysis from Phase 1."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Phase 3: Add OS-specific implementations
&lt;/h3&gt;

&lt;p&gt;This sets up the &lt;a href="https://docs.expo.dev/guides/overview/#expo-for-tv" rel="noopener noreferrer"&gt;Expo TV&lt;/a&gt; package and implements replacements for Vega-specific dependencies:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;@amazon-devices/kepler-player-client&lt;/code&gt; becomes &lt;a href="https://github.com/TheWidlarzGroup/react-native-video" rel="noopener noreferrer"&gt;react-native-video&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;@amazon-devices/kepler-ui-components&lt;/code&gt; becomes custom components or community libraries&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;@amazon-devices/kepler-file-system&lt;/code&gt; becomes &lt;a href="https://docs.expo.dev/versions/latest/sdk/filesystem/" rel="noopener noreferrer"&gt;expo-file-system&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;"Add Android TV and Apple TV support using Expo TV. Replace my Vega-specific dependencies with stock React Native equivalents."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Best practices
&lt;/h2&gt;

&lt;p&gt;A few things we've learned the hard way:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Clean up before migration&lt;/strong&gt;: AI tools migrate code as is, including unused files and existing bugs - Do some optimisation first.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Manage React Native version deltas&lt;/strong&gt;: Platforms don't need identical RN versions, but keep the delta to 4-6 versions max for third-party library compatibility.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test on real devices&lt;/strong&gt;: Emulators are great for development, but validate on real hardware before shipping. TV apps behave differently on actual TVs - shocking, I know 😱.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prebuild targets separately first&lt;/strong&gt;: Get each target running independently before building together to save you some debugging headache.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Get started building today:
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Try the &lt;a href="https://github.com/AmazonAppDev/react-native-multi-tv-helloworld" rel="noopener noreferrer"&gt;Multi-TV Hello World&lt;/a&gt; to see Fast Refresh across Vega, Android TV, Apple TV, and Web.&lt;/li&gt;
&lt;li&gt;Explore the &lt;a href="https://github.com/AmazonAppDev/react-native-multi-tv-app-sample" rel="noopener noreferrer"&gt;Multi-TV App Sample&lt;/a&gt; for a production-ready reference.&lt;/li&gt;
&lt;li&gt;Run the &lt;a href="https://github.com/AmazonAppDev/devices-agent-skills/tree/main/vega-multi-tv-migration" rel="noopener noreferrer"&gt;migration agent skill&lt;/a&gt; on your own app.&lt;/li&gt;
&lt;li&gt;Tell us what works, what doesn't, and what you'd like to see next- you can open a discussion on &lt;a href="https://github.com/AmazonAppDev" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; or in our &lt;a href="https://community.amazondeveloper.com/c/vega/6" rel="noopener noreferrer"&gt;Forums.&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>reactnative</category>
      <category>react</category>
      <category>tv</category>
      <category>agentskills</category>
    </item>
    <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;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="1544" class="m-0" width="720"&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 𝟭𝟮 𝗗𝗮𝘆𝘀 𝗼𝗳 𝗔𝗺𝗮𝘇𝗼𝗻 𝗗𝗲𝘃𝗲𝗹𝗼𝗽𝗲𝗿&amp;nbsp;🎄

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" width="64" height="64"&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;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="794" class="m-0" width="800"&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" width="64" height="64"&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;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="1280" class="m-0" width="720"&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 Workflows | 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'&amp;nbsp;custom agents for Kiro CLI fixed that (➡️&amp;nbsp;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&amp;nbsp;– auto-loads my teammates, work glossary, and style guide
social-media-lead&amp;nbsp;– writes channel-specific posts for LinkedIn, etc
pair-progammer&amp;nbsp;– 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&amp;nbsp;Day 3 of our 12 days of Amazon Developer&amp;nbsp;🎄
          &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" width="64" height="64"&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;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="342" class="m-0" width="572"&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…&amp;nbsp;&amp;nbsp;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…&amp;nbsp;&amp;nbsp;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&amp;nbsp;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&amp;nbsp;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" width="64" height="64"&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;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="800" class="m-0" width="1066"&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&amp;nbsp;🎄
          &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" width="64" height="64"&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;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%2FB56Z6O5hy_HcAc-%2F0%2F1780513906716%3Fe%3D2147483647%26v%3Dbeta%26t%3DCwh1un8UqxKgrMSaAOklJfPmT9OD2Pmit4lF-VjhKhk" height="630" class="m-0" width="1200"&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&amp;nbsp;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&amp;nbsp;fleets of reliable AI agents&amp;nbsp;for automating browser-based tasks at enterprise scale. And it’s trained specifically to&amp;nbsp;act&amp;nbsp;– not just chat – driving browsers, filling forms, and clicking buttons with&amp;nbsp;&amp;gt;90% task reliability&amp;nbsp;in production. Think of it as a “digital intern” for automating business processes that never gets distracted.

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

🧪&amp;nbsp;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

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


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

🔗&amp;nbsp;Dive deeper:&amp;nbsp;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
&amp;nbsp;

          &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" width="64" height="64"&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;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="1280" class="m-0" width="720"&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" width="64" height="64"&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;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="1280" class="m-0" width="720"&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" width="64" height="64"&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;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="450" class="m-0" width="800"&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:&amp;nbsp;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:&amp;nbsp;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" width="64" height="64"&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;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="720" class="m-0" width="1156"&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 𝟭𝟮 𝗗𝗮𝘆𝘀 𝗼𝗳 𝗔𝗺𝗮𝘇𝗼𝗻 𝗗𝗲𝘃𝗲𝗹𝗼𝗽𝗲𝗿&amp;nbsp;🎄
          &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" width="64" height="64"&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;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="800" class="m-0" width="1400"&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" width="64" height="64"&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;15&lt;span class="hidden s:inline"&gt;&amp;nbsp;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;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;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 crayons-icon c-btn__icon"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success crayons-icon c-btn__icon"&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="442"&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="799" 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="418"&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="405"&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="684"&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="684"&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="293"&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="586"&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="799" 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="463"&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="249"&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="600" height="1066"&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="760" height="428"&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="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;
  
  
  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="305"&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="244"&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="244"&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="799" height="211"&gt;&lt;/a&gt;&lt;/p&gt;

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