<?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: Amazon Developer</title>
    <description>The latest articles on DEV Community by Amazon Developer (@amazonappdev).</description>
    <link>https://dev.to/amazonappdev</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F6299%2F2db197c7-bac0-4e6f-9fa0-bd658e9c1adb.png</url>
      <title>DEV Community: Amazon Developer</title>
      <link>https://dev.to/amazonappdev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/amazonappdev"/>
    <language>en</language>
    <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="800" 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 &lt;code&gt;react-native-video&lt;/code&gt; (which now has &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;p&gt;

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

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

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

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

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





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

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

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

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

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

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

&lt;p&gt;

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

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

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

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

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

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




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

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

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

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

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

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

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

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

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

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

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

&lt;p&gt;

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

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

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

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

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

Setup:
`/agent generate`

Swap anytime:
`/agent swap`

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

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




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

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

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

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

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

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

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

&lt;p&gt;

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

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

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

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

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

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

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




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

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

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

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

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

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

&lt;p&gt;

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

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

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

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

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

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




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

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

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

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

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

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

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

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

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

&lt;p&gt;

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

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

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

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

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

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


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

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

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

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




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

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

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

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

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

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

&lt;p&gt;

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

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

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




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

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

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

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

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

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

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

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

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

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

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

&lt;p&gt;

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

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

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

Here's my workflow:

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

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

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

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

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

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

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




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

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

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

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

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

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

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

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

&lt;p&gt;

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

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

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

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

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

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

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




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

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

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

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

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

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

&lt;p&gt;

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

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

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

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

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

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

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




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

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

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

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

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

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

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

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

&lt;p&gt;

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




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

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

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

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

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

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

&lt;h2&gt;
  
  
  Let's take an example, a commonly suggested swap - &lt;a href="https://momentjs.com/" rel="noopener noreferrer"&gt;moment.js&lt;/a&gt; for &lt;a href="https://date-fns.org/" rel="noopener noreferrer"&gt;date-fns&lt;/a&gt;:
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0qjudxp1gb9jac38m04o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0qjudxp1gb9jac38m04o.png" alt="headlines from dev.to" width="800" height="441"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We can use &lt;a href="http://bundlephobia.com/" rel="noopener noreferrer"&gt;bundlephobia.com&lt;/a&gt; to quickly check the ‘cost’ of adding a npm library to your bundle. Upon checking, it tells us &lt;code&gt;moment.js&lt;/code&gt; clocks in at around 300KB, while &lt;code&gt;date-fns&lt;/code&gt; is a much leaner 77KB:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1lngtbnad4hfmrzoliuu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1lngtbnad4hfmrzoliuu.png" alt="Bundlephobia results" width="800" height="417"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Well since I no longer trust anything on the internet 👀, I did some more digging. I added each package to a clean app and then analysed the actual JS bundle using &lt;a href="https://expo.dev/blog/introducing-expo-atlas" rel="noopener noreferrer"&gt;Expo Atlas&lt;/a&gt;(you could also use react-native-bundle-analyzer) and something surprising happened. &lt;code&gt;date-fns&lt;/code&gt; showed up as the larger library:&lt;/p&gt;

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

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

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

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

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

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

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

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

&lt;p&gt;&lt;strong&gt;Those 200KB increased our time to interaction (latency) from cold start by 3%:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkcbca8rd47aujrz7gddh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkcbca8rd47aujrz7gddh.png" alt="FOS performance testing results" width="800" height="404"&gt;&lt;/a&gt;&lt;/p&gt;

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

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

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

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

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

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

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

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

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

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

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

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

&lt;p&gt;In Android, your architectural approach will depend on your chosen UI framework. Here's a simplified comparison:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffzpc91u5azmlxx9ftfq0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffzpc91u5azmlxx9ftfq0.png" alt="Differences in architectural approach" width="800" height="683"&gt;&lt;/a&gt;&lt;/p&gt;

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

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

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

&lt;p&gt;If we were to loosely bridge our Mental Model:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhqjzj03g6g4dss6r0kc6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhqjzj03g6g4dss6r0kc6.png" alt="Mental model of React Native vs Android components" width="800" height="683"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let's examine the composition of a typical React application and see how the architecture translates to the common building blocks of an App:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3dlvz9evvrhvxt2ky493.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3dlvz9evvrhvxt2ky493.png" alt="Common building blocks of a RN App" width="800" height="292"&gt;&lt;/a&gt;&lt;/p&gt;

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

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

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

&lt;/div&gt;



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

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

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

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

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

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

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

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

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

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

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;View&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;StyleSheet&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react-native&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;StyleExample&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="c1"&gt;// StyleSheet example&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;View&lt;/span&gt; &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;styles&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;container&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      // Inline example
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt;
        &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;fontSize&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;blue&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        Inline Style Example
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;View&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// StyleSheet definition&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;styles&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;StyleSheet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;container&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No Resource Qualifiers&lt;/strong&gt;: No built-in system for different screen sizes/orientations like Android's resource qualifiers&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Responsive Design&lt;/strong&gt;: Relies on percentage values, flex properties, and Dimensions API rather than different layout files&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Style Resets&lt;/strong&gt;: No global style inheritance by default; each component needs explicit styling
&lt;/li&gt;
&lt;/ul&gt;

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

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

&lt;/div&gt;



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

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

&lt;p&gt;Similar to the architectural differences, your approach to state management will vary based on whether you come from ‘traditional’ Android or Jetpack Compose.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwnukbnj9zl0kjhjuojuh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwnukbnj9zl0kjhjuojuh.png" alt="State architectural differences" width="800" height="585"&gt;&lt;/a&gt;&lt;/p&gt;

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

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

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

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

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

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

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

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

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

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

&lt;p&gt;In traditional Android, you work with a set of lifecycle callbacks to manage an activities state throughout its existence, while React Native uses a simpler mount/unmount lifecycle model ‘accessed’ by the useEffect hook on a component level. Here's how they compare:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp2vozo9w6tsh15airmaf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp2vozo9w6tsh15airmaf.png" alt="Component lifecycle comparison" width="800" height="312"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Navigation
&lt;/h2&gt;

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

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

&lt;p&gt;While the fundamental concepts of navigation remain similar between Android and React Native, the implementation differs and can be mentally bridged as follows:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0odnpa9nzwhxz5lev1k7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0odnpa9nzwhxz5lev1k7.png" alt="Navigation comparison" width="800" height="641"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Android Intent equivalent&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;HomeScreen&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;navigation&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Button&lt;/span&gt;
      &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Go to Details"&lt;/span&gt;
      &lt;span class="na"&gt;onPress&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Instead of startActivity() with an Intent&lt;/span&gt;
        &lt;span class="nx"&gt;navigation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;navigate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Details&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;itemId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;86&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Product Details&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;});&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Accessing route params (similar to Intent extras)&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;DetailsScreen&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;route&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;itemId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;title&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;route&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;View&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Details for &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Item ID: &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;itemId&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;View&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Business Logic
&lt;/h2&gt;

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

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

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

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

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

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

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

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

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

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

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

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

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

</description>
      <category>android</category>
      <category>react</category>
      <category>reactnative</category>
      <category>beginners</category>
    </item>
    <item>
      <title>📰 February 2025 @AmazonAppDev Newsletter</title>
      <dc:creator>Chris Trag</dc:creator>
      <pubDate>Thu, 27 Feb 2025 06:00:00 +0000</pubDate>
      <link>https://dev.to/amazonappdev/february-2025-amazonappdev-newsletter-1im0</link>
      <guid>https://dev.to/amazonappdev/february-2025-amazonappdev-newsletter-1im0</guid>
      <description>&lt;h2&gt;
  
  
  From app submission to certification
&lt;/h2&gt;

&lt;p&gt;Ensure your app is in top shape for a smooth submission process.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Streamline app management with App Submission API&lt;/strong&gt;&lt;br&gt;
Use the RESTful App Submission API to manage updates to your app with programmatic calls and automation.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developer.amazon.com/apps-and-games/blogs/2025/02/using-the-amazon-app-submission-api" rel="noopener noreferrer"&gt;Read the guide ›&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.amazon.com/docs/app-submission-api/overview.html" rel="noopener noreferrer"&gt;Read the docs ›&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Your personal app submission checklist&lt;/strong&gt;&lt;br&gt;
Check to see if your app meets all of the requirements before submitting. &lt;a href="https://developer.amazon.com/docs/app-submission/presubmission-checklist.html" rel="noopener noreferrer"&gt;Read more ›&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Avoid common pitfalls for app rejections&lt;/strong&gt;&lt;br&gt;
Meet Amazon's test criteria and quality standards before submission. Navigate policies around appropriate content, user privacy, and in-app purchases. &lt;a href="https://developer.amazon.com/apps-and-games/blogs/2025/02/navigating-app-submission-and-compliance" rel="noopener noreferrer"&gt;Read more ›&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Stay ahead of the trend
&lt;/h2&gt;

&lt;p&gt;📊 &lt;strong&gt;New App Statistics Reports&lt;/strong&gt;&lt;br&gt;
Performant apps lead to better stats. Check how your app is doing with the new Acquisition and Engagement dashboards.&lt;br&gt;
&lt;a href="https://developer.amazon.com/apps-and-games/blogs/2025/01/app-analytics-dashboard" rel="noopener noreferrer"&gt;Read more ›&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;📺 &lt;strong&gt;Hello World for Fire TV with Jetpack Compose&lt;/strong&gt;&lt;br&gt;
Compose for TV introduces new components with clear focus indicators and remote-friendly input behavior.&lt;br&gt;
&lt;a href="https://dev.to/amazonappdev/hello-world-for-fire-tv-with-kotlin-jetpack-compose-4b7i"&gt;Read more ›&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Recent updates
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://developer.amazon.com/apps-and-games/blogs/2025/02/upcoming-changes-to-amazon-appstore-for-android-devices-and-coins-program" rel="noopener noreferrer"&gt;⚠️ [Discontinuation Notice] Amazon Appstore for Android devices &lt;/a&gt;&lt;/strong&gt;&lt;br&gt;
As of August 20, 2025 Amazon Appstore for Android mobile devices will be discontinued. Starting on February 20, 2025, the option to submit new apps targeting Android devices will not be available. Updates to existing live apps on Amazon Appstore for Android mobile devices can be submitted until August 20, 2025.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://developer.amazon.com/apps-and-games/blogs/2025/02/upcoming-changes-to-amazon-appstore-for-android-devices-and-coins-program" rel="noopener noreferrer"&gt;⚠️ [Discontinuation Notice] Amazon Coins program&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;
As of August 20, 2025 Amazon Coins Program will be discontinued in all marketplaces. Note that as of February 2025, customers will no longer be able to buy Amazon Coins. However, customers will be able to use their previously purchased Amazon Coins until August 20, 2025.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://developer.amazon.com/docs/in-app-purchasing/appstore-billing-compatibility.html#add-sdk" rel="noopener noreferrer"&gt;Appstore Billing Compatibility SDK is now on Maven Central&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;
Easily port your Android app with Google Play Billing to the Amazon Appstore, with minimal changes.&lt;/p&gt;




&lt;h2&gt;
  
  
  Developer highlights
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Revamping your tech stack for the new year?&lt;/strong&gt;&lt;br&gt;
Solution Architect &lt;a href="https://mlangendijk.medium.com/" rel="noopener noreferrer"&gt;Matthijs Langendijk&lt;/a&gt; explores framework options for OTT apps, including React Native development for Fire TV, to help you choose the right tech stack for your streaming app.&lt;br&gt;
&lt;a href="https://mlangendijk.medium.com/tech-to-use-for-your-front-end-ott-apps-in-2025-d3e840719484" rel="noopener noreferrer"&gt;Read more › &lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Amazon GameLift scales to 100 million concurrent users (CCU) for a single game&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://aws.amazon.com/gamelift/" rel="noopener noreferrer"&gt;Amazon GameLift&lt;/a&gt; provides scalability for game developers, supporting up to 100 million CCU while maintaining fast session allocation and seamless player experiences.&lt;br&gt;
&lt;a href="https://aws.amazon.com/blogs/gametech/amazon-gamelift-achieves-100-million-concurrently-connected-users-per-game/" rel="noopener noreferrer"&gt;Read more › &lt;/a&gt;&lt;/p&gt;




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

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developer.amazon.com/apps-and-games/blogs" rel="noopener noreferrer"&gt;@AmazonAppDev blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.amazon.com/docs/apps-and-games/documentation.html" rel="noopener noreferrer"&gt;Read our tech docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://community.amazondeveloper.com/c/amazon-appstore/17" rel="noopener noreferrer"&gt;Amazon Developer Community&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;em&gt;Visit the &lt;a href="https://developer.amazon.com/apps-and-games" rel="noopener noreferrer"&gt;Amazon Developer Portal&lt;/a&gt; for all the updates, documentation, and resources.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

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

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

&lt;p&gt;The new architecture comprises of &lt;a href="https://reactnative.dev/architecture/fabric-renderer" rel="noopener noreferrer"&gt;Fabric&lt;/a&gt;, &lt;a href="https://reactnative.dev/docs/turbo-native-modules-introduction" rel="noopener noreferrer"&gt;Turbo Native Modules&lt;/a&gt;, &lt;a href="https://reactnative.dev/docs/the-new-architecture/what-is-codegen" rel="noopener noreferrer"&gt;Codegen&lt;/a&gt;, and the &lt;a href="https://reactnative.dev/architecture/glossary#javascript-interfaces-jsi" rel="noopener noreferrer"&gt;JavaScript Interface&lt;/a&gt; (JSI).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2w486w2y6yzl0x2zux8b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2w486w2y6yzl0x2zux8b.png" alt="React Natives New Architecture" width="800" height="300"&gt;&lt;/a&gt;&lt;/p&gt;

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

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

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

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

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

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

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

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

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

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

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

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

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

&lt;ul&gt;
&lt;li&gt;On a 1080p TV emulator running Android 14 there was an average of &lt;strong&gt;~500ms&lt;/strong&gt; improvement when using the New Architecture.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5be4t0xt6z3p08ceaaa6.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5be4t0xt6z3p08ceaaa6.gif" alt="TV emulator" width="760" height="462"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuv9zzns142oe232cs3px.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuv9zzns142oe232cs3px.gif" alt="Fire Tablet" width="226" height="402"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Old Architecture&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd4vdo57xf8dsh2h5gsw2.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd4vdo57xf8dsh2h5gsw2.gif" alt="Old Architecture Fire TV" width="720" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;New Architecture&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frx79bh48deypj13dy4cn.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frx79bh48deypj13dy4cn.gif" alt="New Architecture Fire TV" width="720" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

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

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

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu3v4p2hbew55fqamlthw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu3v4p2hbew55fqamlthw.png" alt="Table of Results" width="800" height="248"&gt;&lt;/a&gt;&lt;/p&gt;

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

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

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

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

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

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

</description>
      <category>reactnative</category>
      <category>performance</category>
      <category>react</category>
    </item>
    <item>
      <title>📰 January 2025 @AmazonAppDev Newsletter</title>
      <dc:creator>Chris Trag</dc:creator>
      <pubDate>Mon, 27 Jan 2025 06:00:00 +0000</pubDate>
      <link>https://dev.to/amazonappdev/january-2025-amazonappdev-newsletter-2e8n</link>
      <guid>https://dev.to/amazonappdev/january-2025-amazonappdev-newsletter-2e8n</guid>
      <description>&lt;h2&gt;
  
  
  App performance
&lt;/h2&gt;

&lt;p&gt;New guides and tools for upleveling your app, testing across devices, and monitoring performance&lt;/p&gt;

&lt;p&gt;⏱️ &lt;strong&gt;Optimize your Fire TV app performance&lt;/strong&gt;&lt;br&gt;
Get answers to common issues to ensure your app provides a smooth, responsive streaming experience. &lt;a href="https://developer.amazon.com/apps-and-games/blogs/2024/12/optimize-fire-tv-app-performance" rel="noopener noreferrer"&gt;Read more ›&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Testing made easier with Appstore Quality Central&lt;/strong&gt;&lt;br&gt;
Explore the new suite of tools for testing your app across virtual devices. Test results can help you improve quality, increase stability, and optimize user experience for a streamlined certification process. &lt;a href="https://developer.amazon.com/docs/app-testing/understanding-appstore-quality-central.html" rel="noopener noreferrer"&gt;Read more ›&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Inspect performance with the App Health Insights dashboard
&lt;/h2&gt;

&lt;p&gt;Monitor key performance metrics for your Fire TV, Fire tablet, and Android apps with the App Health Insights dashboard.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://developer.amazon.com/apps-and-games/blogs/2025/01/app-health-insights-dashboard" rel="noopener noreferrer"&gt;Read more ›&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Beyond "Hello World!"
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;eBook 📖 Mastering the Big Screen&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We partnered with &lt;a href="https://www.callstack.com/community" rel="noopener noreferrer"&gt;Callstack&lt;/a&gt; to address the unique challenges and solutions for creating high-quality streaming apps using React Native.&lt;br&gt;
&lt;a href="https://www.callstack.com/ebook/mastering-the-big-screen-react-native-for-tv-guidebook" rel="noopener noreferrer"&gt;Download your copy › &lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bare React Native projects for TV&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Bare React Native can be ideal for projects that require specific build processes or have unique performance requirements.&lt;br&gt;
&lt;a href="https://dev.to/amazonappdev/how-to-develop-a-react-native-app-for-tv-4njp"&gt;Read more ›&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Developer highlights
&lt;/h3&gt;

&lt;p&gt;🗓️ &lt;strong&gt;2025 look ahead&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://x.com/chris_trag" rel="noopener noreferrer"&gt;@chris_trag&lt;/a&gt; shares upcoming events and developer courses he’s excited about for the new year.&lt;br&gt;
&lt;a href="https://dev.to/amazonappdev/2025-look-ahead-top-dev-events-courses-for-android-react-native-and-genai-4bd3"&gt;Read more ›&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;📈 &lt;strong&gt;2024 Year in Review&lt;/strong&gt;&lt;br&gt;
ICYMI - We round up some of our favorite highlights from last year, including event tech talks, product and feature releases, and popular best practice guides.&lt;br&gt;
&lt;a href="https://developer.amazon.com/apps-and-games/blogs/2024/12/2024-year-in-review" rel="noopener noreferrer"&gt;Read more or watch the video ›&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Related resources
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developer.amazon.com/apps-and-games/blogs" rel="noopener noreferrer"&gt;@AmazonAppDev blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.amazon.com/docs/apps-and-games/documentation.html" rel="noopener noreferrer"&gt;Read our tech docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://community.amazondeveloper.com/c/amazon-appstore/17" rel="noopener noreferrer"&gt;Amazon Developer Community&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;em&gt;Visit the &lt;a href="https://developer.amazon.com/apps-and-games" rel="noopener noreferrer"&gt;Amazon Developer Portal&lt;/a&gt; for all the updates, documentation, and resources.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>news</category>
      <category>newsletter</category>
    </item>
    <item>
      <title>Hello World for Fire TV with Kotlin &amp; Jetpack Compose</title>
      <dc:creator>Olivia Sung</dc:creator>
      <pubDate>Fri, 17 Jan 2025 17:42:19 +0000</pubDate>
      <link>https://dev.to/amazonappdev/hello-world-for-fire-tv-with-kotlin-jetpack-compose-4b7i</link>
      <guid>https://dev.to/amazonappdev/hello-world-for-fire-tv-with-kotlin-jetpack-compose-4b7i</guid>
      <description>&lt;p&gt;With the release of &lt;a href="https://developer.android.com/training/tv/playback/compose" rel="noopener noreferrer"&gt;Jetpack Compose for TV&lt;/a&gt; that came out during summer of 2024, Compose for TV introduces TV material components that are designed for the living room, with clear focus indicators and remote-friendly input behavior. Now there is a specific dependency for TV &lt;code&gt;androidx.tv:tv-material&lt;/code&gt; instead of using the mobile one such as &lt;code&gt;androidx.compose.material3:material3&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;In this tutorial, I will be following closely on a ‘&lt;a href="https://github.com/AmazonAppDev/hello-world-fire-tv" rel="noopener noreferrer"&gt;📺 🔥 Hello World Fire TV App&lt;/a&gt;’ sample recently published on GitHub. I will be highlight some cool features that are used in this sample so that you don’t have to read through the code base! Once again for this tutorial, we will be using &lt;a href="https://developer.android.com/develop/ui/compose/layouts/adaptive" rel="noopener noreferrer"&gt;Google Jetpack Compose&lt;/a&gt; to design and implement tv navigation drawer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisite
&lt;/h2&gt;

&lt;p&gt;You can use an existing Fire TV or an Android TV virtual device.&lt;/p&gt;

&lt;h2&gt;
  
  
  Light/Dark Mode
&lt;/h2&gt;

&lt;p&gt;Switching from light and dark mode depending on the device’s system theme is an industry standard nowadays.&lt;br&gt;
We can use the &lt;code&gt;isSystemInDarkTheme&lt;/code&gt; to check if the device system is in light or dark mode to help build responsive UIs that follow the system setting. &lt;/p&gt;

&lt;p&gt;In &lt;code&gt;Theme.kt&lt;/code&gt;, you can find below code snippet:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Composable&lt;/span&gt;
&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;HelloWorldTVTheme&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;isInDarkTheme&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Boolean&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;isSystemInDarkTheme&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nd"&gt;@Composable&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;Unit&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="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;colorScheme&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;isInDarkTheme&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;darkColorScheme&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;primary&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Purple80&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;secondary&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;PurpleGrey80&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;tertiary&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Pink80&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;lightColorScheme&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;primary&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Purple40&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;secondary&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;PurpleGrey40&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;tertiary&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Pink40&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="nc"&gt;MaterialTheme&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;colorScheme&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;colorScheme&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;typography&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Typography&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;content&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;content&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;
  
  
  Navigation Drawer
&lt;/h2&gt;

&lt;p&gt;Navigation drawers are essential components in any TV app as they allow users to access different destinations and features. In our sample, we are using &lt;code&gt;[ModalNavigationDrawer](https://developer.android.com/reference/kotlin/androidx/tv/material3/package-summary#ModalNavigationDrawer(kotlin.Function2,androidx.compose.ui.Modifier,androidx.tv.material3.DrawerState,androidx.compose.ui.graphics.Brush,kotlin.Function0))&lt;/code&gt;  as they are good for infrequent, but more focused, switching to different destinations. In &lt;code&gt;HomeDrawer.kt&lt;/code&gt;, we are defining navigation drawer although we have not set any specific destinations.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="nc"&gt;ModalNavigationDrawer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;drawerState&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;drawerState&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;drawerContent&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;drawer&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt;
            &lt;span class="nc"&gt;Column&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="nc"&gt;Modifier&lt;/span&gt;
                    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;background&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;MaterialTheme&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;colorScheme&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;surface&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fillMaxHeight&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
                    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dp&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;selectableGroup&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
                &lt;span class="n"&gt;horizontalAlignment&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Alignment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Start&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;verticalArrangement&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Arrangement&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;spacedBy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                    &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;alignment&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Alignment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;CenterVertically&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="nc"&gt;Spacer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;modifier&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Modifier&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;height&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dp&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

                &lt;span class="n"&gt;menuItems&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEachIndexed&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt;
                    &lt;span class="nc"&gt;NavigationRow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                        &lt;span class="n"&gt;isSelected&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;selectedId&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="n"&gt;menuItems&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;indexOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                        &lt;span class="n"&gt;onMenuSelected&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                            &lt;span class="n"&gt;drawerState&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;DrawerValue&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Closed&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                            &lt;span class="n"&gt;onMenuSelected&lt;/span&gt;&lt;span class="o"&gt;?.&lt;/span&gt;&lt;span class="nf"&gt;invoke&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&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="nc"&gt;Spacer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;modifier&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Modifier&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;weight&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1f&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="n"&gt;scrimBrush&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Brush&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;horizontalGradient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="nf"&gt;listOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="nc"&gt;MaterialTheme&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;colorScheme&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;surface&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Color&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Transparent&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;h2&gt;
  
  
  Scrollable grid of cards
&lt;/h2&gt;

&lt;p&gt;As this sample on GitHub is showcasing a catalog, we need a grid of cards where each card can represent a media of some sort. If it’s a media streaming app, you can imagine what these cards will be filled with, TV shows, movies, etc you name it! We are using &lt;code&gt;[LazyVerticalGrid](https://developer.android.com/develop/ui/compose/lists#lazy-grids)&lt;/code&gt; which will provide support for displaying items in a grid. As we want something scrollable with a remote, vertical grid will  display items in vertically scrollable container so users can scroll up and down! &lt;br&gt;
For this sample, we want 5 columns so we will declare &lt;code&gt;GridCells.Fixed(5)&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="nc"&gt;LazyVerticalGrid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="n"&gt;columns&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;GridCells&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Fixed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                &lt;span class="n"&gt;contentPadding&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;PaddingValues&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                    &lt;span class="n"&gt;start&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="n"&gt;top&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="n"&gt;end&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="n"&gt;bottom&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;48&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dp&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;In the end, when you run the sample app, you will have a scrollable TV app with grid of cards!&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%2Fyuud4tm7uxe43rgi5hn9.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%2Fyuud4tm7uxe43rgi5hn9.gif" alt=" " width="600" height="338"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Today we went over some quick pointers on the Hello World Fire TV sample on GitHub which includes features such as different light/dark mode, navigation drawer and scrollable vertical grid to look similar to an streaming app on TV.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stay connected
&lt;/h2&gt;

&lt;p&gt;Stay up to date with Amazon Appstore developer updates on the following platforms:&lt;br&gt;
📣 Follow @&lt;a href="https://twitter.com/AmazonAppDev" rel="noopener noreferrer"&gt;AmazonAppDev&lt;/a&gt; on Twitter&lt;br&gt;
📺 Subscribe to our &lt;a href="https://www.youtube.com/amazonappstoredevelopers" rel="noopener noreferrer"&gt;Youtube channel&lt;/a&gt;&lt;br&gt;
📧 Sign up for the &lt;a href="https://m.amazonappservices.com/devto-newsletter-subscribe" rel="noopener noreferrer"&gt;Developer Newsletter&lt;/a&gt;&lt;/p&gt;

</description>
      <category>amazon</category>
      <category>kotlin</category>
      <category>android</category>
      <category>amazonappstore</category>
    </item>
    <item>
      <title>5 cool things from CES for Amazon Developers (plus 4 more!)</title>
      <dc:creator>Moses Roth</dc:creator>
      <pubDate>Wed, 15 Jan 2025 19:23:36 +0000</pubDate>
      <link>https://dev.to/amazonappdev/5-cool-things-from-ces-for-amazon-developers-plus-4-more-cool-things-33ae</link>
      <guid>https://dev.to/amazonappdev/5-cool-things-from-ces-for-amazon-developers-plus-4-more-cool-things-33ae</guid>
      <description>&lt;p&gt;&lt;a href="https://www.ces.tech/" rel="noopener noreferrer"&gt;CES&lt;/a&gt; is one of the biggest electronics shows in the world, and this year I got to go for the first time. The 2025 show just wrapped up and if you were there and stopped by Amazon’s showcase, you might have seen me or even chatted with me about Fire 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%2Fugjvbd2oi28re6zkku6h.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fugjvbd2oi28re6zkku6h.jpg" alt="AmazonCES" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The show is &lt;em&gt;huge&lt;/em&gt;. If you spent all week just checking out as many booths as you could, you still wouldn’t see everything.&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%2F7vmw5o424p01n706lrlt.jpeg" 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%2F7vmw5o424p01n706lrlt.jpeg" alt="CES2025" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So whether you were able to attend or not, here are 5 highlights for Amazon Developers (and a few other cool things too):&lt;/p&gt;

&lt;h2&gt;
  
  
  AI-enhanced voice search on Fire TV with Alexa
&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%2Fnmw0xexhygt2n3t14hbn.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnmw0xexhygt2n3t14hbn.jpg" alt="fireremote" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Amazon was demoing the new &lt;a href="https://www.aboutamazon.com/news/devices/how-to-use-ai-search-on-fire-tv" rel="noopener noreferrer"&gt;AI-enhanced search on Fire TV&lt;/a&gt; with Alexa, which will help you find a show or movie, even if you don't remember the title or don't know exactly what you want to watch.&lt;/p&gt;

&lt;p&gt;You can try it now on your Fire TV at home, it’s already live! Here are some examples you might try:&lt;/p&gt;

&lt;p&gt;“TV show about dragons”&lt;/p&gt;

&lt;p&gt;“Tom Cruise sci-fi action movie”&lt;/p&gt;

&lt;p&gt;“Movie where they say ‘life is like a box of chocolates’”&lt;/p&gt;

&lt;p&gt;Try it out and see if you get the results you expect. I bet you’ll be impressed.&lt;/p&gt;

&lt;p&gt;This is great news for developers, because it means customers can now find your content a lot more easily. As long as your show or movie is &lt;a href="https://developer.amazon.com/docs/catalog/getting-started-catalog-ingestion.html" rel="noopener noreferrer"&gt;integrated in the Amazon catalog&lt;/a&gt;, it will appear in the search results.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cars with Alexa and Fire TV integrated
&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%2Fbmx0olad90j8nps0aqf9.jpeg" 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%2Fbmx0olad90j8nps0aqf9.jpeg" alt="cars" width="800" height="578"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Amazon is working on integrating Fire TV, AWS, and Alexa into cars and we had the Acura ZDX and the BMW X3 M50 on display. I got the chance to try it out by sitting in the car and giving Alexa commands.&lt;/p&gt;

&lt;p&gt;Be sure to target &lt;a href="https://developer.amazon.com/docs/fire-tv/device-specifications-automotive.html" rel="noopener noreferrer"&gt;Automotive devices&lt;/a&gt;, so that cars with Fire TV will be able to run your app.&lt;/p&gt;

&lt;h2&gt;
  
  
  Echo Show 15 and 21
&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%2Fne8iahzg7ev26y5sdetl.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fne8iahzg7ev26y5sdetl.jpg" alt="echoshow" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;One cool thing about the new, bigger Echo Shows is that they are like mini-Fire TVs. They come with a Fire TV remote and customers can play Fire TV apps and channels on them.&lt;/p&gt;

&lt;p&gt;Don’t forget to &lt;a href="https://developer.amazon.com/docs/fire-tv/device-specifications-echo-show.html" rel="noopener noreferrer"&gt;target these devices&lt;/a&gt;, so you can reach a whole new audience with your app!&lt;/p&gt;

&lt;h1&gt;
  
  
  Fire TV 85" Omni Mini-LED and Soundbar Plus with surround sound
&lt;/h1&gt;

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

&lt;p&gt;One of the most fun demos we did was Amazon’s &lt;a href="https://www.amazon.com/amazon-fire-tv-85-inch-omni-mini-led-series-smart-tv/dp/B0C7S8Z4C1" rel="noopener noreferrer"&gt;85“ Fire TV&lt;/a&gt; and &lt;a href="https://www.amazon.com/Introducing-Amazon-Soundbar-channel-design/dp/B0CXZHM5Q8" rel="noopener noreferrer"&gt;Soundbar Plus with subwoofer and surround sound speakers&lt;/a&gt;. We took people into a soundproof room and played &lt;a href="https://www.amazon.com/gp/video/detail/amzn1.dv.gti.ef9328f7-3d33-42bb-b51a-16ffe18059c7?autoplay=0&amp;amp;ref_=atv_cf_strg_wb" rel="noopener noreferrer"&gt;The Lord of the Rings: The Rings of Power&lt;/a&gt; for them so they could feel the Dolby Atmos. Make sure your content is set up to take advantage of it, because it sounds awesome, and it will bring a whole new level of performance to your app.&lt;/p&gt;

&lt;h1&gt;
  
  
  AI-generated images on Fire TV
&lt;/h1&gt;

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

&lt;p&gt;We were also showing off Fire TV’s new ability to create AI-generated images. You can try it right now on your own device. Just use your remote to say, “Alexa, generate an image of dogs jumping on the moon” or I’m sure you’ll come up with some ideas more creative than me!&lt;/p&gt;

&lt;h1&gt;
  
  
  4 other things...
&lt;/h1&gt;

&lt;p&gt;Obviously, it wasn’t just Amazon at the show, so here are 4 other cool things I saw at CES that impressed me.&lt;/p&gt;

&lt;h2&gt;
  
  
  Delorean
&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%2Fz7q2jzwed3jaz538e7nh.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz7q2jzwed3jaz538e7nh.jpg" alt="delorean" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Clarios somehow managed to get a Delorean from Back to the Future to the show. Pretty cool.&lt;/p&gt;

&lt;h2&gt;
  
  
  Boring Company/Tesla loop
&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%2F3sp40k9a79qwyfap33rr.jpeg" 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%2F3sp40k9a79qwyfap33rr.jpeg" alt="boringtesla" width="800" height="554"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;CES is &lt;em&gt;huge&lt;/em&gt;. To get around the 3 parts of the Las Vegas Convention Center, they offered free rides in Teslas through Boring Company tunnels. Very cool.&lt;/p&gt;

&lt;h2&gt;
  
  
  Holograms
&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%2Flw4ln5tck4ah758rluho.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flw4ln5tck4ah758rluho.jpg" alt="hologram" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hypervsn was showing off this crazy 20 foot tall hologram. The photo doesn’t quite do it justice, but it was impressive.&lt;/p&gt;

&lt;h2&gt;
  
  
  Zoox robotaxis
&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%2Fhrfv3sfyugg19q4zj41t.jpeg" 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%2Fhrfv3sfyugg19q4zj41t.jpeg" alt="zoox" width="800" height="467"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Okay, this one is technically part of Amazon, but I had to mention it too. Zoox is currently testing its automated taxis in Las Vegas, and they were offering demo rides for those lucky enough to get one.&lt;/p&gt;

&lt;p&gt;That was my CES experience and I’m super glad I got the chance to go. Let me know if there was anything you loved at CES that I missed, and hopefully I’ll see you there next year!&lt;/p&gt;

</description>
      <category>ces</category>
      <category>firetv</category>
      <category>ai</category>
      <category>developer</category>
    </item>
    <item>
      <title>2025 look ahead: Top dev events &amp; courses for Android, React Native, and GenAI</title>
      <dc:creator>Chris Trag</dc:creator>
      <pubDate>Fri, 20 Dec 2024 05:45:21 +0000</pubDate>
      <link>https://dev.to/amazonappdev/2025-look-ahead-top-dev-events-courses-for-android-react-native-and-genai-4bd3</link>
      <guid>https://dev.to/amazonappdev/2025-look-ahead-top-dev-events-courses-for-android-react-native-and-genai-4bd3</guid>
      <description>&lt;p&gt;To prepare for an action-packed 2025, here are several upcoming events and developer courses I’m excited about. For the New Year, I’m focusing on 3 areas to dedicate my time and energy:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Android:&lt;/strong&gt; Up-level Android &amp;amp; Unity development skills to build faster apps and games&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;React Native:&lt;/strong&gt; Sharpen the toolkit to launch new tablet &amp;amp; Smart TV apps&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GenAI:&lt;/strong&gt; Attend workshops and meetups to learn what’s next with building LLM-powered products&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This guide is by no means definitive; If you have any events, courses, or meetups you want to share, let me know in the comments below 👇 💬&lt;/p&gt;

&lt;h1&gt;
  
  
  Android &amp;amp; Gaming
&lt;/h1&gt;

&lt;h3&gt;
  
  
  CES 2025 - Las Vegas (Jan 7th - 10th)
&lt;/h3&gt;

&lt;p&gt;The &lt;a href="https://www.ces.tech/" rel="noopener noreferrer"&gt;Consumer Electronics Show&lt;/a&gt; is the world’s largest technology event and where we discover the first major announcements of the year from over 4,000 tech brands exhibiting their products and services. The &lt;a href="https://www.ces.tech/attend/keynotes/" rel="noopener noreferrer"&gt;Keynote lineup&lt;/a&gt; offers up mix of industry leaders from across the Automotive, Travel, AI, and Tech, and Entertainment. Personally, I am excited to walk through the CES 2025 &lt;a href="https://www.ces.tech/innovation-awards/?sort=desc" rel="noopener noreferrer"&gt;Innovation Awards® showcase&lt;/a&gt; in the Venetian Expo, Hall A, especially the &lt;a href="https://www.ces.tech/innovation-awards/?type=Best+of+Innovation&amp;amp;sort=desc" rel="noopener noreferrer"&gt;Best of Innovation category winners&lt;/a&gt; to see these up close.&lt;/p&gt;

&lt;p&gt;If you’re attending CES for the first time, I suggest some comfortable walking shows since there’s over 2.5 million square feet for the showroom exhibits. If you’re interested in the suite of Amazon devices and products, my colleagues and I will be over in the &lt;a href="https://developer.amazon.com/ces" rel="noopener noreferrer"&gt;Amazon at CES 2025&lt;/a&gt; experience (Venetian Ballroom G-H) — Feel free to send me a note on &lt;a href="https://bsky.app/profile/trag.dev" rel="noopener noreferrer"&gt;Bluesky&lt;/a&gt; or &lt;a href="https://www.linkedin.com/in/ctraganos/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; if you plan to stop by! &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%2Fgggtesfrhweagj525wal.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgggtesfrhweagj525wal.jpg" alt="Las Vegas" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  2025 Droidcon events (multiple dates)
&lt;/h3&gt;

&lt;p&gt;The Android community does a great job with talks and sessions at all the local &lt;a href="https://www.droidcon.com/" rel="noopener noreferrer"&gt;Droidcons&lt;/a&gt;. Each city has a unique take that I find refreshing compared to many conferences I spend time at. This year I want to dive deep into &lt;a href="https://kotlinlang.org/docs/multiplatform-intro.html" rel="noopener noreferrer"&gt;Kotlin Multiplatform&lt;/a&gt;, better understand the &lt;a href="https://developer.android.com/jetpack/getting-started" rel="noopener noreferrer"&gt;latest features in Jetpack&lt;/a&gt;, and find out about the &lt;a href="https://developer.android.com/latest-updates" rel="noopener noreferrer"&gt;recent updates for Android&lt;/a&gt; worth incorporating. &lt;/p&gt;

&lt;p&gt;The organizers also launched &lt;a href="https://academy.droidcon.com/" rel="noopener noreferrer"&gt;Droidcon Academy&lt;/a&gt; for mastering in-depth topics through codelabs, new learning paths, and talk recordings. &lt;/p&gt;

&lt;p&gt;As I shared in &lt;a href="https://dev.to/amazonappdev/top-android-react-native-events-to-attend-in-2024-477e"&gt;last year’s post&lt;/a&gt;, I am partial to the &lt;a href="https://london.droidcon.com/" rel="noopener noreferrer"&gt;London Droidcon&lt;/a&gt; since it’s been great for several years in a row. If you have a favorite of the Droidcon locations, I would love to know in the comments below!&lt;/p&gt;

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




&lt;h2&gt;
  
  
  Android Training Courses &amp;amp; Certificates
&lt;/h2&gt;

&lt;p&gt;The Android team has a mix of beginning and advanced Android, Kotlin, and Compose online course on their developer site. &lt;/p&gt;

&lt;p&gt;Here are my favorite courses and codelabs offered:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://developer.android.com/courses/android-basics-compose/course" rel="noopener noreferrer"&gt;Android Basics with Compose&lt;/a&gt; to get moving quickly&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://developer.android.com/courses/jetpack-compose/course" rel="noopener noreferrer"&gt;Jetpack Compose for Android developers&lt;/a&gt; walks through the toolkit for building better Android UIs&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://developer.android.com/courses/pathways/android-architecture" rel="noopener noreferrer"&gt;Android app architecture&lt;/a&gt;for improving the quality and structure of your apps&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%2Fgwygfb9jvleei51nulbw.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%2Fgwygfb9jvleei51nulbw.png" alt="Android courses" width="800" height="320"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Tokyo Game Show 2025 - Tokyo, Japan (September 27th - 29th)
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://expo.nikkeibp.co.jp/tgs/2024/en/" rel="noopener noreferrer"&gt;東京ゲームショウ (TGS)&lt;/a&gt; is a blast to attend and is a great way to know what’s launching for upcoming video games and new hardware, especially from Japan based publishers. The &lt;a href="https://expo.nikkeibp.co.jp/tgs/2024/en/display/exhibit/exhibit-list/online.html" rel="noopener noreferrer"&gt;general exhibition area&lt;/a&gt; is for digital gaming demos from the top titles along with upstart game studios. &lt;/p&gt;

&lt;p&gt;Watch the sessions from this year’s show here: &lt;a href="https://expo.nikkeibp.co.jp/tgs/2024/en/program/official/" rel="noopener noreferrer"&gt;expo.nikkeibp.co.jp/tgs/2024/en/program/official&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%2Ftpfg4xb88hrkann0j4fz.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftpfg4xb88hrkann0j4fz.jpg" alt="TGS" width="800" height="453"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  React Native
&lt;/h1&gt;

&lt;h3&gt;
  
  
  The React Summit(s) - Amsterdam &amp;amp; NYC
&lt;/h3&gt;

&lt;p&gt;The &lt;a href="https://gitnation.org/" rel="noopener noreferrer"&gt;GitNation team&lt;/a&gt; puts on two major events each year:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://reactsummit.com/" rel="noopener noreferrer"&gt;React Summit&lt;/a&gt; in Amsterdam from June 13th to 17th, 2025&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://reactsummit.us/" rel="noopener noreferrer"&gt;React Summit NYC&lt;/a&gt; in November 2025 (Exact dates TBD)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These two are a hybrid of workshops, sessions, and on-demand content to follow-up on afterwards. Attend the events if you want to connect with both React and React Native app builders working on similar challenges using these frameworks. I’ve really enjoyed the networking and mix of attendees, especially the React open source awards portion of the days. Keep in mind the virtual ticket provides all the sessions for on-demand access via the &lt;a href="https://gitnation.com/" rel="noopener noreferrer"&gt;GitNation site&lt;/a&gt; — however you choose to attend it’s worth checking out.&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%2F86gfnb3llvy84k3xa77d.jpeg" 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%2F86gfnb3llvy84k3xa77d.jpeg" alt="React Summit" width="800" height="348"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  New Course: React Native Mastery
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://www.notjust.dev/react-native-mastery" rel="noopener noreferrer"&gt;React Native Mastery&lt;/a&gt; is the latest course from Vadim &amp;amp; the &lt;a href="https://www.notjust.dev/" rel="noopener noreferrer"&gt;notJust.dev team&lt;/a&gt; and is the top referred course these past few weeks. They aim to provide “the only course you need to Master mobile development with React Native &amp;amp; Expo.” What’s different than most online courses is how it focuses on learning through full-featured sample apps. To start, the course offers up Quiz, Camera, Forms, and Business card samples as the first four modules.  &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%2Ff8eoljktt1uuygeng0c6.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%2Ff8eoljktt1uuygeng0c6.png" alt="React Native Mastery" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  React Conf 2025  (Date TBD)
&lt;/h3&gt;

&lt;p&gt;Attending &lt;a href="https://conf.react.dev/" rel="noopener noreferrer"&gt;React Conf 2024&lt;/a&gt; was a highlight for my year — the networking, the sessions, and the announcements in particular were stellar. Co-hosted by Meta and Callstack, these teams did a great job partnering up to bring the event to life. Over the two days of sessions, there were 600+ in-person attendees and over 250k+ online viewers — check out the 2024 talk recordings at &lt;a href="https://conf.react.dev/talks" rel="noopener noreferrer"&gt;conf.react.dev/talks&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The date for 2025 is still to be determined so I’d suggest keeping an eye on &lt;a href="https://conf.react.dev/" rel="noopener noreferrer"&gt;conf.react.dev&lt;/a&gt;  &lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/p6auCiVoa3c?start=4"&gt;
&lt;/iframe&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%2F83fi3ar51mxasusmshv0.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F83fi3ar51mxasusmshv0.jpg" alt="React Conf" width="800" height="297"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;a href="https://dev.to/anishamalde"&gt;Anisha Malde&lt;/a&gt; and I presenting at React Conf 2024. You can &lt;a href="https://www.youtube.com/watch?v=X2eJtxoLlb4&amp;amp;list=PL93Q4ZD_4z4oVJGi2OTocV39nwqu_Qmfz&amp;amp;index=6" rel="noopener noreferrer"&gt;watch our session on YouTube&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  AppJS 2025 - Kraków, Poland (May 28th-30th)
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://appjs.co/#about-app.js" rel="noopener noreferrer"&gt;AppJS&lt;/a&gt; is one of my favorite annual developer conferences for how in-depth and thorough the talks and &lt;a href="https://appjs.co/#workshops" rel="noopener noreferrer"&gt;workshops&lt;/a&gt; are. The &lt;a href="https://swmansion.com/" rel="noopener noreferrer"&gt;Software Mansion&lt;/a&gt; team leans heavily into the specifics of React Native for Mobile, Brownfield apps, and optimization tooling. If you’re building with Expo and React Native, this is the conference you cannot miss in 2025. &lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/WafaEfSTsk0"&gt;
&lt;/iframe&gt;
 &lt;/p&gt;

&lt;p&gt;&lt;em&gt;My colleagues &lt;a href="https://dev.to/giolaq"&gt;Gio&lt;/a&gt; and &lt;a href="https://github.com/efahsl" rel="noopener noreferrer"&gt;Eric&lt;/a&gt; at AppJS teaching how to &lt;a href="https://www.youtube.com/watch?v=WafaEfSTsk0&amp;amp;list=PL93Q4ZD_4z4oVJGi2OTocV39nwqu_Qmfz&amp;amp;index=7" rel="noopener noreferrer"&gt;extend React Native apps for the Big Screen&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  Chain React Conf - Portland, Oregon (Date TBD)
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://infinite.red/" rel="noopener noreferrer"&gt;Infinite Red&lt;/a&gt; puts on a highly technical set of developer talks dedicated to React Native. Attendees get to connect with many of the core contributors and lead maintainers across the React Ecosystem. Personally, I would recommend arriving a day earlier to attend the workshops. &lt;/p&gt;

&lt;p&gt;Watch the 2024 sessions at &lt;a href="https://chainreactconf.com/events/2024" rel="noopener noreferrer"&gt;chainreactconf.com/events/2024&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%2Fw6zwy9kpuzrysi6desds.jpeg" 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%2Fw6zwy9kpuzrysi6desds.jpeg" alt="Chain React" width="800" height="456"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  React Universe 2025 - Wroclaw, Poland (September 2nd - 4th)
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://www.reactuniverseconf.com/" rel="noopener noreferrer"&gt;React Universe&lt;/a&gt; (&lt;em&gt;formerly React Native EU&lt;/em&gt;) is great for teams building with React and React Native across devices and app stores. The team at &lt;a href="https://www.callstack.com/about-us" rel="noopener noreferrer"&gt;Callstack&lt;/a&gt; pulls together quality sessions that span everything from VR development to core maintainer announcements. While the conference is in latter part 2025, I’d recommend checking out their engineering podcast &lt;a href="https://www.callstack.com/podcast" rel="noopener noreferrer"&gt;callstack.com/podcast&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/j2b_bG-32JI"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Here is our panel discussion on &lt;a href="https://www.youtube.com/watch?v=j2b_bG-32JI&amp;amp;list=PL93Q4ZD_4z4oVJGi2OTocV39nwqu_Qmfz&amp;amp;index=1" rel="noopener noreferrer"&gt;building apps for Mobile, Web, and Smart TVs&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  Gen AI &amp;amp; LLMs
&lt;/h1&gt;

&lt;h3&gt;
  
  
  AWS Advanced AI and Tool Use Meetup - San Francisco (January 16th, 2025)
&lt;/h3&gt;

&lt;p&gt;The &lt;a href="https://aws.amazon.com/startups/lp/aws-gen-ai-lofts" rel="noopener noreferrer"&gt;AWS GenAI Loft&lt;/a&gt; in San Francisco is hosting several developer meetups and workshops including the &lt;a href="https://aws.amazon.com/startups/events/advanced-ai-and-tool-use-meetup" rel="noopener noreferrer"&gt;Advanced AI and Tool Use Meetup&lt;/a&gt; with &lt;a href="https://toolhouse.ai/" rel="noopener noreferrer"&gt;Toolhouse.ai&lt;/a&gt; in January. This free hands-on session will help you learn how to build efficient AI assistants and network with fellow developers and AI experts.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Event details: &lt;a href="https://aws.amazon.com/startups/events/advanced-ai-and-tool-use-meetup" rel="noopener noreferrer"&gt;aws.amazon.com/startups/events/advanced-ai-and-tool-use-meetup&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;RSVP link: &lt;a href="https://lu.ma/0r7kp1lm" rel="noopener noreferrer"&gt;lu.ma/0r7kp1lm&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fusthxcqokju9lr4tnwsi.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%2Fusthxcqokju9lr4tnwsi.png" alt="AWS GenAI Loft SF" width="800" height="334"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  DeepLearning.AI - Generative AI for Everyone
&lt;/h3&gt;

&lt;p&gt;This &lt;a href="https://www.deeplearning.ai//" rel="noopener noreferrer"&gt;free set of courses&lt;/a&gt; is designed to help you master the fundamentals of Generative AI, learn real-world examples of tools in use, and better understand the impact on society and business. I really enjoy this curriculum because it starts at the very beginning in order to build a foundation to learn practical ways to incorporate this tech into your products and apps. &lt;/p&gt;

&lt;p&gt;In addition to these 101 lessons, the AWS team contributed two courses on &lt;a href="https://www.deeplearning.ai/short-courses/serverless-agentic-workflows-with-amazon-bedrock/" rel="noopener noreferrer"&gt;Agentic Workflows&lt;/a&gt; and deploying &lt;a href="https://www.deeplearning.ai/short-courses/serverless-llm-apps-amazon-bedrock/" rel="noopener noreferrer"&gt;Serverless LLM Apps&lt;/a&gt; with Amazon Bedrock.&lt;/p&gt;

&lt;p&gt;More information at &lt;a href="https://www.deeplearning.ai/courses/generative-ai-for-everyone/" rel="noopener noreferrer"&gt;deeplearning.ai/courses/generative-ai-for-everyone&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%2F4srkjfw2d23oh5h8jjmp.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%2F4srkjfw2d23oh5h8jjmp.png" alt="DeepLearning.ai" width="800" height="421"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Where to find more developer events and courses?
&lt;/h3&gt;

&lt;p&gt;There’s a lot happening across these developer communities so I’d suggest subscribing to these channels:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Google’s &lt;a href="https://developer.android.com/newsletter" rel="noopener noreferrer"&gt;&lt;strong&gt;Android Developer Updates&lt;/strong&gt;&lt;/a&gt; are sent directly from the Android team with a mix of video, articles, and upcoming events. For something a bit more community-led, I’d recommend subscribing to &lt;a href="https://androidweekly.net/" rel="noopener noreferrer"&gt;Android Weekly&lt;/a&gt;. For product updates related to Fire OS, make sure to subscribe to our &lt;a href="https://m.amazonappservices.com/devto-newsletter-subscribe" rel="noopener noreferrer"&gt;monthly newsletter&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://thisweekinreact.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;This Week In React&lt;/strong&gt;&lt;/a&gt; is currently the top newsletter on what's happening across React &amp;amp; React Native so definitely subscribe if you're interested. &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://unity.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;Unity&lt;/strong&gt;&lt;/a&gt; has their &lt;a href="https://create.unity.com/newsletter-signup" rel="noopener noreferrer"&gt;own newsletter&lt;/a&gt; for product announcements and tips. In addition, the Unity dev community shares the latest on &lt;a href="https://gamedevdigest.com/" rel="noopener noreferrer"&gt;Game Dev Digest&lt;/a&gt;, &lt;a href="https://x.com/unitydevcom" rel="noopener noreferrer"&gt;X&lt;/a&gt;, and &lt;a href="https://discord.com/invite/bu3bbby" rel="noopener noreferrer"&gt;Discord&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;There’s more than &lt;a href="https://www.aboutamazon.com/news/aws/7-free-and-low-cost-aws-courses-that-can-help-you-use-generative-ai" rel="noopener noreferrer"&gt;&lt;strong&gt;100 AWS trainings on AI and Machine learning&lt;/strong&gt;&lt;/a&gt; available to everyone. In addition, try out &lt;a href="https://partyrock.aws/" rel="noopener noreferrer"&gt;partyrock.aws&lt;/a&gt; and go through the &lt;a href="https://partyrock.aws/guide/getStarted" rel="noopener noreferrer"&gt;getting started guide&lt;/a&gt; — let me know what you think!&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Summary
&lt;/h3&gt;

&lt;p&gt;I hope these developer events and course recommendations help spark some inspiration for you and your team throughout 2025. Let me know in the comments below what are your favorites worth checking out! 👇 💬&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stay connected&lt;/strong&gt;&lt;br&gt;
Stay up to date with Amazon Appstore developer updates on the following platforms:&lt;/p&gt;

&lt;p&gt;📣 Follow &lt;a href="https://twitter.com/AmazonAppDev" rel="noopener noreferrer"&gt;@AmazonAppDev&lt;/a&gt; on Twitter&lt;br&gt;
📺 Subscribe to our &lt;a href="https://www.youtube.com/amazonappstoredevelopers" rel="noopener noreferrer"&gt;Youtube channel&lt;/a&gt; &lt;br&gt;
📧 Sign up for the &lt;a href="https://m.amazonappservices.com/devto-newsletter-subscribe" rel="noopener noreferrer"&gt;Developer Newsletter&lt;/a&gt;&lt;/p&gt;




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

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

&lt;p&gt;Inspired by our own experiences (&amp;amp; struggles 😅), we decided to create a &lt;a href="https://www.callstack.com/ebook/mastering-the-big-screen-react-native-for-tv-guidebook" rel="noopener noreferrer"&gt;comprehensive guide&lt;/a&gt; to using React Native for TV.&lt;/p&gt;

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

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

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

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

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

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

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

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

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

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

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

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

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

&lt;/div&gt;



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

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

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

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

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

&lt;/div&gt;



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

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

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

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

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

&lt;/div&gt;



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

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

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

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

&lt;/div&gt;



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

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

&lt;/div&gt;



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

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

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

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

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

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

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

&lt;/div&gt;



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

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

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

&lt;p&gt;How can you structure your app to handle this? One option is to structure your project as a monorepo:&lt;/p&gt;

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

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

&lt;p&gt;Another approach for smaller projects use a structure similar to the &lt;a href="https://github.com/react-native-tvos/template-tv" rel="noopener noreferrer"&gt;template&lt;/a&gt; and differentiate Android TV and Android Mobile specific feature sets on the build flavour level and then by &lt;a href="https://developer.android.com/build/manage-manifests?hl=en" rel="noopener noreferrer"&gt;merging manifests&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzhss18fdct7h1o6xovz2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzhss18fdct7h1o6xovz2.png" alt="Merging Manifests" width="800" height="243"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://www.callstack.com/ebook/mastering-the-big-screen-react-native-for-tv-guidebook" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh72zvw05lxguuk63e809.png" alt="Guidebook" width="800" height="211"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>reactnative</category>
      <category>react</category>
      <category>javascript</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Testing the startup time for your Fire OS app</title>
      <dc:creator>Moses Roth</dc:creator>
      <pubDate>Thu, 31 Oct 2024 17:53:47 +0000</pubDate>
      <link>https://dev.to/amazonappdev/testing-the-startup-time-for-your-fire-os-app-41me</link>
      <guid>https://dev.to/amazonappdev/testing-the-startup-time-for-your-fire-os-app-41me</guid>
      <description>&lt;p&gt;The first time you start up an app is like the first time you meet someone. Is it love at first sight? Or do they have a stain on their shirt and bad body odor? It’s the same with an app, does it start up quickly and smoothly? Or does it have long loading times and crash? Your customers will expect your app to be fast and responsive, and the best way to demonstrate that is with a quick startup, so that your app always makes a good first impression.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://github.com/AmazonAppDev/fireos-perf-testing" rel="noopener noreferrer"&gt;FireOS Performance Test&lt;/a&gt; will help you measure First Frame (Time to Initial Display) to test how fast your app will get up and running.&lt;/p&gt;

&lt;h3&gt;
  
  
  Set up
&lt;/h3&gt;

&lt;p&gt;To get started you’ll need to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.java.com/en/" rel="noopener noreferrer"&gt;Install Java 8 or above&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.oracle.com/java/technologies/downloads/" rel="noopener noreferrer"&gt;Install Java Development Kit 17 or higher&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://developer.android.com/studio" rel="noopener noreferrer"&gt;Install Android Studio&lt;/a&gt; (with Android SDK (API Level 34))&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://maven.apache.org/" rel="noopener noreferrer"&gt;Install Maven&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;Hint: The instructions on Maven’s website can be a bit confounding, so:

&lt;ul&gt;
&lt;li&gt;If you’re on a Mac, use &lt;a href="https://brew.sh/" rel="noopener noreferrer"&gt;Homebrew&lt;/a&gt; to install it by running &lt;code&gt;brew install maven&lt;/code&gt; in the terminal&lt;/li&gt;
&lt;li&gt;If you’re on Windows, &lt;a href="https://medium.com/@gauravshah97/how-to-install-maven-on-windows-39ff317e40cf" rel="noopener noreferrer"&gt;check out this blog post&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;li&gt;

&lt;a href="https://developer.amazon.com/docs/fire-tablets/connecting-adb-to-device.html" rel="noopener noreferrer"&gt;Set up ADB&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;Hint: If you’re on a Mac, &lt;a href="https://medium.com/@navjotsingh.official/android-developer-a0f2c4872570" rel="noopener noreferrer"&gt;this blog&lt;/a&gt; can help with the &lt;code&gt;command not found: adb&lt;/code&gt; error&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

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

&lt;h3&gt;
  
  
  Install
&lt;/h3&gt;

&lt;p&gt;Once you’ve done that, you can install the performance tester with these steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Clone the performance tester repository by running this command in the terminal:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git clone https://github.com/amazonappdev/fireos-perf-testing.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Navigate to the project directory:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd fireos-perf-testing
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Build the project and create the JAR:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mvn clean install
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Run the test
&lt;/h3&gt;

&lt;p&gt;You can then run the test with the following steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Locate the ZIP file FOSTTIDPerfTesting-distribution.zip file in the 'jar' folder&lt;/li&gt;
&lt;li&gt;Unzip it&lt;/li&gt;
&lt;li&gt;Navigate to FOSTTIDPerfTesting-distribution &amp;gt; Input &amp;gt; APK folder&lt;/li&gt;
&lt;li&gt;Copy the APK file you want to test into the APK folder&lt;/li&gt;
&lt;li&gt;Rename the APK file Input.apk&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In the terminal, navigate to the new FOSTTIDPerfTesting-distribution folder&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;`cd FOSTTIDPerfTesting-distribution`
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Decide which kind of test you want to do:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;cool&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;warm&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;latency&lt;/code&gt; (which does both cool and warm tests)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Plug your device in to your computer (if you haven’t already) and select "Allow USB Debugging" (if you haven’t already)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Be sure that &lt;a href="https://developer.amazon.com/docs/fire-tablets/connecting-adb-to-device.html" rel="noopener noreferrer"&gt;ADB has been set up correctly&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Get your device serial number (if you don’t already have it on hand) by running&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;`adb devices`
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Run the test with this command:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;java -jar PerformanceKpi-jar.jar &amp;lt;Test Type&amp;gt; &amp;lt;Device Serial Number)&amp;gt;
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;If you decide to go with the full latency command, it should look something like this:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;java -jar PerformanceKpi-jar.jar latency GCC2DM000000000S
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The full latency test can take about an hour to run, so be patient!&lt;br&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%2Fu5w9o5y9k4jqljkod8nv.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%2Fu5w9o5y9k4jqljkod8nv.png" alt=" " width="800" height="472"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You’ll find the test results in a folder called test-output in the FOSTTIDPerfTesting-distribution folder.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That’s all there is to it!&lt;/p&gt;

&lt;p&gt;For more details, check out the github repo for the &lt;a href="https://github.com/AmazonAppDev/fireos-perf-testing" rel="noopener noreferrer"&gt;FireOS Performance Test&lt;/a&gt;. And if you want to dig even deeper into tests you can do on your app, check out the &lt;a href="https://developer.amazon.com/docs/reports-promo/app-health-insights-dashboard.html" rel="noopener noreferrer"&gt;App Health Insights Dashboard&lt;/a&gt;, where you can test app latency, memory use, fluidity, and stability.&lt;/p&gt;

&lt;p&gt;If you have any questions or feedback, join us in the the &lt;a href="https://community.amazondeveloper.com/c/amazon-appstore/17" rel="noopener noreferrer"&gt;Amazon Appstore Community Space&lt;/a&gt; and &lt;a href="https://community.amazondeveloper.com/c/amazon-appstore/appstore-questions/20" rel="noopener noreferrer"&gt;let us know&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>testing</category>
      <category>firetv</category>
      <category>performance</category>
      <category>github</category>
    </item>
  </channel>
</rss>
