<?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: Max/Wang</title>
    <description>The latest articles on DEV Community by Max/Wang (@maxslashwang).</description>
    <link>https://dev.to/maxslashwang</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2255922%2F189297d7-ceac-49f8-a0e7-e21dd7eef328.jpg</url>
      <title>DEV Community: Max/Wang</title>
      <link>https://dev.to/maxslashwang</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/maxslashwang"/>
    <language>en</language>
    <item>
      <title>Browser-based DOCX to PDF converter using Pandoc and Typst (WASM)</title>
      <dc:creator>Max/Wang</dc:creator>
      <pubDate>Thu, 12 Feb 2026 16:02:26 +0000</pubDate>
      <link>https://dev.to/maxslashwang/browser-based-docx-to-pdf-converter-using-pandoc-and-typst-wasm-1o7g</link>
      <guid>https://dev.to/maxslashwang/browser-based-docx-to-pdf-converter-using-pandoc-and-typst-wasm-1o7g</guid>
      <description>&lt;p&gt;Hi Fr,&lt;/p&gt;

&lt;p&gt;I built a Word-to-PDF converter that runs 100% in your browser. No files ever touch a server.&lt;/p&gt;

&lt;p&gt;Link: &lt;a href="https://toolkuai.com/word-to-pdf" rel="noopener noreferrer"&gt;https://toolkuai.com/word-to-pdf&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Stack
&lt;/h2&gt;

&lt;p&gt;The challenge was handling the complex layout of .docx files without a heavy backend. I settled on a "double-engine" approach using WebAssembly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Pandoc (WASM): Used to parse the DOCX structure and convert it into Typst code. I’m utilizing a WASI shim to run Pandoc's Haskell-compiled WASM in the browser.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Typst (WASM): Instead of using a heavy TeX engine, I used Typst's modern rendering engine to turn the intermediate code into a polished PDF.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Technical Highlights
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Media Extraction: The tool extracts images from the DOCX file via Pandoc’s --extract-media, maps them into a virtual file system (WASI), and then passes them to Typst for final rendering.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Custom Fonts: To support multi-language characters (especially CJK), I’m side-loading custom fonts (GenYoGothic) into the Typst compiler within the worker.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Svelte 5: The UI is built with Svelte 5, leveraging its new runes ($state, $derived) for a very snappy, reactive file queue management.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Web Workers: All the heavy lifting (WASM instantiation and conversion) happens in a dedicated worker to keep the UI at a buttery 60fps.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why Pandoc + Typst?
&lt;/h2&gt;

&lt;p&gt;Pandoc is the swiss army knife of document conversion, but its direct PDF output usually requires a LaTeX distribution. By routing it through Typst, I can get high-quality PDF output with a much smaller WASM footprint and faster rendering times.&lt;/p&gt;

&lt;p&gt;I’d love to hear your thoughts on the performance or any edge cases you find with complex DOCX layouts!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>javascript</category>
    </item>
    <item>
      <title>I Spent 3 Years in the App Store. Now I'm Building My First SaaS in Public.</title>
      <dc:creator>Max/Wang</dc:creator>
      <pubDate>Mon, 06 Oct 2025 14:55:53 +0000</pubDate>
      <link>https://dev.to/maxslashwang/i-spent-3-years-in-the-app-store-now-im-building-my-first-saas-in-public-2ch9</link>
      <guid>https://dev.to/maxslashwang/i-spent-3-years-in-the-app-store-now-im-building-my-first-saas-in-public-2ch9</guid>
      <description>&lt;p&gt;Hey devs!&lt;/p&gt;

&lt;p&gt;For the last three years, my world has been Xcode, Swift, and the App Store's monetization maze. It's been an incredible learning experience, but I've always been curious about the web and the SaaS world—a completely different beast with its own rules.&lt;/p&gt;

&lt;p&gt;Today, I'm finally diving in and sharing the start of a new public experiment: mktgrowkit.com.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;So, What Did I Build?&lt;/strong&gt;&lt;br&gt;
At its core, &lt;a href="https://mktgrowkit.com" rel="noopener noreferrer"&gt;https://mktgrowkit.com&lt;/a&gt; is a simple, free suite of marketing calculators (ROAS, CPM, etc.). I built it to scratch my own itch: I needed quick, no-fluff tools to make data-driven decisions for my apps without hitting a paywall or signing up for a complex platform.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Tech Stack&lt;/strong&gt;&lt;br&gt;
As a mobile dev, jumping into the modern web ecosystem was fun. Here’s the stack I chose for the MVP:&lt;/p&gt;

&lt;p&gt;Framework: Nuxt.js. I chose this specifically for the out-of-the-box Server-Side Rendering (SSR), which is crucial for my SEO-centric strategy.&lt;/p&gt;

&lt;p&gt;Styling: Tailwind CSS. It allowed me to build the UI incredibly fast without writing a lot of custom CSS.&lt;/p&gt;

&lt;p&gt;Deployment: Vercel. The seamless Git integration and global CDN made launching and iterating a breeze.&lt;/p&gt;

&lt;p&gt;Backend: Currently static, but I'm using Supabase for some server-side logic and plan to integrate it more for future features.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Real Challenge: From ASO to SEO&lt;/strong&gt;&lt;br&gt;
Building the tool was familiar territory. The real experiment is the challenge I've set for myself: Can I grow this from zero purely through Search Engine Optimization?&lt;/p&gt;

&lt;p&gt;No paid ads, no big launch campaign. Just the long, slow grind of content creation, technical SEO (sitemaps, canonicals, Core Web Vitals), and authority building. It's a whole new world compared to the ASO (App Store Optimization) I'm used to. It feels daunting, but as an engineer, I'm excited by the technical challenge of it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why Build in Public?&lt;/strong&gt;&lt;br&gt;
I'm a huge believer in learning from others, so I'm committing to tracking this entire journey in public—the good, the bad, and the ugly. I'll be sharing traffic stats, keyword rankings, technical hurdles, and any lessons learned along the way.&lt;/p&gt;

&lt;p&gt;I'd love to hear from other devs who have made a similar jump from mobile to web.&lt;/p&gt;

&lt;p&gt;What was your biggest "aha!" moment or surprise?&lt;/p&gt;

&lt;p&gt;Any advice on surviving the SEO grind?&lt;/p&gt;

&lt;p&gt;If you want to follow the data and see how this experiment plays out, I'm posting all my updates on X (Twitter). I've created this pinned tweet to track the journey: [Link đến Pinned Tweet của bạn]&lt;/p&gt;

&lt;p&gt;Thanks for reading!&lt;/p&gt;

</description>
      <category>buildinpublic</category>
      <category>saas</category>
      <category>seo</category>
      <category>javascript</category>
    </item>
    <item>
      <title>I just launched TL;Dev, a curated collection of notes for developers and indie builders.</title>
      <dc:creator>Max/Wang</dc:creator>
      <pubDate>Wed, 27 Aug 2025 14:38:14 +0000</pubDate>
      <link>https://dev.to/maxslashwang/i-just-launched-tldev-a-curated-collection-of-notes-for-developers-and-indie-builders-4ghc</link>
      <guid>https://dev.to/maxslashwang/i-just-launched-tldev-a-curated-collection-of-notes-for-developers-and-indie-builders-4ghc</guid>
      <description>&lt;p&gt;Hey everyone,&lt;/p&gt;

&lt;p&gt;Like many of you, I spend a lot of time on Reddit, X, and YouTube looking for interesting case studies and strategies. The problem is, there's too much content and not enough time. I'd save dozens of links intending to read them later, but that "later" never came.&lt;/p&gt;

&lt;p&gt;So, I built a solution for myself called TL;Dev.&lt;/p&gt;

&lt;p&gt;It's a simple, no-BS website where I personally curate and summarize the most valuable content into short, easy-to-read notes. The goal is to help developers and indie builders grasp the core ideas in minutes, not hours.&lt;/p&gt;

&lt;p&gt;My site is covering everything from successful launches to costly failures.&lt;/p&gt;

&lt;p&gt;It's 100% free, no paywall, no annoying pop-ups. Just content.&lt;/p&gt;

&lt;p&gt;For those interested, it’s built with Astro and deployed on Cloudflare. It's ridiculously fast.&lt;/p&gt;

&lt;p&gt;I'm posting here because I think it could be genuinely useful for this community, and I'd love to get your feedback on the site, the content, or any ideas you might have.&lt;/p&gt;

&lt;p&gt;You can check it out here: &lt;a href="https://tldev.co" rel="noopener noreferrer"&gt;https://tldev.co&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thanks for reading!!&lt;/p&gt;

</description>
      <category>softwareengineering</category>
      <category>startup</category>
      <category>developer</category>
    </item>
    <item>
      <title>How to Find Profitable App Ideas (Even If You Think Everything Already Exists)</title>
      <dc:creator>Max/Wang</dc:creator>
      <pubDate>Fri, 28 Feb 2025 08:29:31 +0000</pubDate>
      <link>https://dev.to/maxslashwang/how-to-find-profitable-app-ideas-even-if-you-think-everything-already-exists-1c7</link>
      <guid>https://dev.to/maxslashwang/how-to-find-profitable-app-ideas-even-if-you-think-everything-already-exists-1c7</guid>
      <description>&lt;p&gt;Finding a great app idea can feel impossible—especially when it seems like every idea has already been done. But the truth is, you don’t need a 100% original idea to succeed. You just need to build something that solves a real problem in a better way.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why You Don’t Need a Completely Original App Idea
&lt;/h2&gt;

&lt;p&gt;Many aspiring indie developers believe that success comes from launching a completely new, never-before-seen product. But in reality, most successful apps weren’t the first of their kind—they were just better, simpler, or more focused than existing solutions.&lt;/p&gt;

&lt;p&gt;Think about physical products: there are dozens of energy drink brands, water bottles, and vanilla ice creams, yet all of them make millions. Apps work the same way.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Find a Profitable App Idea That Actually Works
&lt;/h2&gt;

&lt;p&gt;Instead of chasing originality, focus on solving real problems for a well-defined audience. Here’s a proven framework to discover high-potential app ideas:&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Start with a Niche You Understand Deeply
&lt;/h2&gt;

&lt;p&gt;The best ideas come from inside knowledge of a specific market. If you personally experience a problem, chances are thousands of others do too.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What are the biggest challenges in industries you’re familiar with?&lt;/li&gt;
&lt;li&gt;What daily annoyances do you or your colleagues face?&lt;/li&gt;
&lt;li&gt;Have you ever said, “I wish there was an app for this”?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Start by identifying problems in an area where you already have expertise.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Study Communities to Discover Hidden Needs
&lt;/h2&gt;

&lt;p&gt;Instead of forcing an idea, immerse yourself where your target audience hangs out:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reddit, Discord, Slack, Twitter (X), and Facebook groups&lt;/li&gt;
&lt;li&gt;Product review sites like G2, Capterra, and App Store reviews&lt;/li&gt;
&lt;li&gt;Quora and niche forums where people ask for advice&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Look for repeated frustrations or complaints about existing solutions. When you see the same pain point mentioned repeatedly, you’ve found a validated demand.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Improve on an Existing App Instead of Reinventing the Wheel
&lt;/h2&gt;

&lt;p&gt;Rather than struggling to come up with a unique idea, find a popular app and make a better version:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Make it simpler, cheaper, or faster&lt;/li&gt;
&lt;li&gt;Solve a missing pain point&lt;/li&gt;
&lt;li&gt;Focus on a specific audience (e.g., a budgeting app tailored for freelancers)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Many successful startups started this way—Slack improved on workplace chat, Notion refined note-taking, and Duolingo made language learning more engaging.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Test Demand Before Writing a Single Line of Code
&lt;/h2&gt;

&lt;p&gt;Before building, validate your idea:&lt;/p&gt;

&lt;p&gt;✅ Post about it on social media and gauge interest&lt;br&gt;
✅ Run a small paid ad campaign to see if people click&lt;br&gt;
✅ Create a simple landing page and collect email signups&lt;br&gt;
✅ Ask potential users directly in communities&lt;/p&gt;

&lt;p&gt;If no one is excited, pivot or refine the idea before coding.&lt;/p&gt;

&lt;h2&gt;
  
  
  Four Must-Have Ingredients for a Successful App Idea
&lt;/h2&gt;

&lt;p&gt;To maximize your chances of success, your app idea should check these boxes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Easy to Build – Aim to launch an MVP within 30 days.&lt;/li&gt;
&lt;li&gt;Solves a Clear Pain Point – The problem should be urgent and painful.&lt;/li&gt;
&lt;li&gt;Has an Audience You Can Reach – If you don’t know where your users hang out, it’ll be hard to market.&lt;/li&gt;
&lt;li&gt;Excites You Enough to Stay Committed – If you’re not passionate about it, you’ll quit too early.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Proven Formula for Finding Profitable App Ideas
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Identify a niche you know well&lt;/li&gt;
&lt;li&gt;Find a real problem people complain about&lt;/li&gt;
&lt;li&gt;Improve an existing solution or fill a gap&lt;/li&gt;
&lt;li&gt;Test interest before coding&lt;/li&gt;
&lt;li&gt;Launch, get feedback, and iterate&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🚀 You don’t need the next "big idea"—just a product that solves a real problem for real users.&lt;/p&gt;

&lt;p&gt;Ready to find your next app idea? &lt;/p&gt;

&lt;p&gt;Start by diving into online communities and observing what people truly need!&lt;/p&gt;

</description>
      <category>programming</category>
      <category>saas</category>
      <category>startup</category>
      <category>ios</category>
    </item>
    <item>
      <title>Why Developers Struggle to Make Money with Apps (And How to Fix It)</title>
      <dc:creator>Max/Wang</dc:creator>
      <pubDate>Thu, 27 Feb 2025 07:30:00 +0000</pubDate>
      <link>https://dev.to/maxslashwang/why-developers-struggle-to-make-money-with-apps-and-how-to-fix-it-13k4</link>
      <guid>https://dev.to/maxslashwang/why-developers-struggle-to-make-money-with-apps-and-how-to-fix-it-13k4</guid>
      <description>&lt;p&gt;Developers love building things. We get excited about new ideas, start coding right away, and create something we think is amazing. But then… nothing happens.&lt;/p&gt;

&lt;p&gt;📉 &lt;strong&gt;No downloads. No revenue. Just silence.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Why? Because we often forget to ask the most important question—Does anyone actually need this app?&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Market Research Matters More Than Your Code
&lt;/h2&gt;

&lt;p&gt;❌ Most developers build first and validate later. That’s a mistake.&lt;/p&gt;

&lt;p&gt;Here’s how to avoid wasting months on an app no one wants:&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Analyze the market.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Look at similar apps. If an app in your niche is making money, that’s a strong sign of demand.&lt;br&gt;
If there are zero competitors, be careful—maybe there’s no market.&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Read user reviews on the App Store.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;1-2 star reviews = complaints &amp;amp; frustrations.&lt;br&gt;
4-star reviews = users love the app but want improvements.&lt;br&gt;
Find gaps and build a better alternative.&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Check ASO keywords.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Use Sensor Tower or AppTweak to see if people are searching for solutions like yours.&lt;br&gt;
If search volume is low, validate on Reddit, Google Trends, or Facebook groups before building.&lt;/p&gt;
&lt;h2&gt;
  
  
  The Mistake I Made (And What I Learned)
&lt;/h2&gt;

&lt;p&gt;I once spent a whole month building an app that I thought was genius.&lt;br&gt;
Launched it… and nothing happened.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🚀 Not because the app was bad—but because nobody needed it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;💡 Don’t make the same mistake. Before writing a single line of code, validate your idea.&lt;/p&gt;

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

</description>
      <category>ios</category>
      <category>mobile</category>
      <category>swift</category>
      <category>marketing</category>
    </item>
    <item>
      <title>How I Built an iOS App That Made $1,400 in 90 Days (Lessons Learned)</title>
      <dc:creator>Max/Wang</dc:creator>
      <pubDate>Wed, 26 Feb 2025 16:18:58 +0000</pubDate>
      <link>https://dev.to/maxslashwang/how-i-built-an-ios-app-that-made-1400-in-90-days-lessons-learned-2nbn</link>
      <guid>https://dev.to/maxslashwang/how-i-built-an-ios-app-that-made-1400-in-90-days-lessons-learned-2nbn</guid>
      <description>&lt;p&gt;I started with zero downloads, no marketing, and no clue if my iOS app would make money.&lt;/p&gt;

&lt;p&gt;📊 Fast forward 90 days:&lt;br&gt;
💰 $1,400 revenue&lt;br&gt;
📆 $347 in the last 30 days&lt;br&gt;
📈 $2,850 total since launch&lt;/p&gt;

&lt;p&gt;Not life-changing, but proof that even a small app can generate real income.&lt;/p&gt;

&lt;p&gt;The process wasn’t smooth. I made mistakes, wasted time, and almost gave up. But after testing and refining, I found what actually works when it comes to making money with iOS apps.&lt;/p&gt;

&lt;p&gt;🚀 6 Key Lessons I Learned&lt;br&gt;
💡 1. Build What You Love, But Validate Demand&lt;br&gt;
Most devs start with an idea they love, but that’s not enough. There has to be demand.&lt;br&gt;
✅ Check Google Trends, Reddit, Twitter.&lt;br&gt;
✅ Look at App Store reviews to see common complaints.&lt;br&gt;
✅ If nobody is looking for it, don’t build it.&lt;/p&gt;

&lt;p&gt;💡 2. Marketing is More Important Than Coding&lt;br&gt;
Most devs think "build it and they will come." Nope. Without marketing, your app is invisible.&lt;br&gt;
✅ ASO (App Store Optimization) matters.&lt;br&gt;
✅ Running Apple Search Ads, even with a small budget, can make a huge difference.&lt;br&gt;
✅ Leverage social media (Twitter, Reddit) to drive early traction.&lt;/p&gt;

&lt;p&gt;💡 3. Monetization Matters From Day One&lt;br&gt;
✅ Don’t just launch a free app and hope for ad revenue.&lt;br&gt;
✅ Subscriptions are better for long-term revenue.&lt;br&gt;
✅ In-App Purchases (IAPs) work well if you offer real value.&lt;/p&gt;

&lt;p&gt;🎯 I go into full detail in this breakdown video:&lt;/p&gt;

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

&lt;p&gt;💡 Thinking about launching an iOS app? Watch this before you start!&lt;/p&gt;

</description>
      <category>indiedev</category>
      <category>ios</category>
      <category>makemoney</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>Unlocking the Power of App Intents: Prepare Your App for the AI Revolution</title>
      <dc:creator>Max/Wang</dc:creator>
      <pubDate>Thu, 24 Oct 2024 08:53:17 +0000</pubDate>
      <link>https://dev.to/maxslashwang/unlocking-the-power-of-app-intents-prepare-your-app-for-the-ai-revolution-3ipl</link>
      <guid>https://dev.to/maxslashwang/unlocking-the-power-of-app-intents-prepare-your-app-for-the-ai-revolution-3ipl</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fahz2rkih3if8yyku5d6z.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%2Fahz2rkih3if8yyku5d6z.png" width="720" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The whispers in the tech world are getting louder: AI is poised to become a central player in the iOS ecosystem. As developers, we're always looking for ways to stay ahead of the curve, and App Intents might just be the key to unlocking the potential of this AI revolution. While often overlooked, App Intents offer a powerful way to expose our app's functionality to the broader operating system, including Siri, Spotlight, and Widgets.&lt;/p&gt;

&lt;p&gt;Imagine a future where users can seamlessly interact with your app through natural language commands, effortlessly completing tasks without even opening the app. This is the promise of App Intents, and with the rise of AI, their importance is only set to grow.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why App Intents Matter in an AI-Driven World
&lt;/h2&gt;

&lt;p&gt;App Intents act as a bridge between your app and the system's intelligence, allowing Siri to understand and execute actions on behalf of the user. By defining clear intents and parameters, you empower Siri to perform tasks such as adding items to a shopping list, starting a workout, or sending a message, all through voice commands or automated shortcuts.&lt;/p&gt;

&lt;p&gt;With Apple's increasing focus on AI, it's likely that Siri will become even more integrated into our daily lives. This means that apps that leverage App Intents will have a significant advantage, offering users a frictionless and intuitive experience.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Practical Example: Building a Feature Wishlist with App Intents
&lt;/h2&gt;

&lt;p&gt;Let's dive into a real-world example to see how App Intents work in practice. We'll create a simple app called "Features," which allows users to maintain a wishlist of features for Apple platforms. Using SwiftData and SwiftUI, we'll implement an App Intent that enables users to add new features to their wishlist using Siri.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Defining the Data Models
&lt;/h3&gt;

&lt;p&gt;First, we define our data models: &lt;code&gt;Feature&lt;/code&gt; and &lt;code&gt;Platform&lt;/code&gt;. A &lt;code&gt;Feature&lt;/code&gt; has a title, description, and a corresponding &lt;code&gt;Platform&lt;/code&gt;. The &lt;code&gt;Platform&lt;/code&gt; is an enum representing various Apple platforms.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="kd"&gt;import&lt;/span&gt; &lt;span class="kt"&gt;SwiftUI&lt;/span&gt;
&lt;span class="kd"&gt;import&lt;/span&gt; &lt;span class="kt"&gt;SwiftData&lt;/span&gt;

&lt;span class="c1"&gt;// MARK: - Feature&lt;/span&gt;

&lt;span class="kd"&gt;@Model&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="kt"&gt;Feature&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;UUID&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;UUID&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;""&lt;/span&gt;
    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;featureDescription&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;""&lt;/span&gt;
    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;platform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Platform&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;iphone&lt;/span&gt;

    &lt;span class="nf"&gt;init&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="nv"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nv"&gt;featureDescription&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nv"&gt;platform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Platform&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;UUID&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;title&lt;/span&gt;
        &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;featureDescription&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;featureDescription&lt;/span&gt;
        &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;platform&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;platform&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;To enable Siri to understand our &lt;code&gt;Platform&lt;/code&gt; model, we make it conform to the &lt;code&gt;AppEnum&lt;/code&gt; protocol. This involves providing display representations for both the type and its cases.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="kd"&gt;import&lt;/span&gt; &lt;span class="kt"&gt;SwiftUI&lt;/span&gt;
&lt;span class="kd"&gt;import&lt;/span&gt; &lt;span class="kt"&gt;AppIntents&lt;/span&gt;

&lt;span class="c1"&gt;// MARK: - Platform&lt;/span&gt;

&lt;span class="kd"&gt;enum&lt;/span&gt; &lt;span class="kt"&gt;Platform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;CaseIterable&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;Identifiable&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;Codable&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;AppEnum&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;allPlatforms&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"All Platforms"&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;iphone&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"iPhone"&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;ipad&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"iPad"&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;applewatch&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Apple Watch"&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;visionPro&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Vision Pro"&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;mac&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Mac"&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;appletv&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Apple TV"&lt;/span&gt;

    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;Self&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;self&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// ... (icon code omitted for brevity)&lt;/span&gt;

    &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;typeDisplayRepresentation&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;TypeDisplayRepresentation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;stringLiteral&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"Platform"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;caseDisplayRepresentations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;Platform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;DisplayRepresentation&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;allPlatforms&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"All Platforms"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;iphone&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"iPhone"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;ipad&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"iPad"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;applewatch&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"Apple Watch"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;visionPro&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"Vision Pro"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;mac&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"Mac"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;appletv&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"Apple TV"&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;h3&gt;
  
  
  Step 2: Managing Features with FeatureManager
&lt;/h3&gt;

&lt;p&gt;Next, we create a &lt;code&gt;FeatureManager&lt;/code&gt; class to handle the creation, retrieval, updating, and deletion of &lt;code&gt;Feature&lt;/code&gt; objects.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="kd"&gt;import&lt;/span&gt; &lt;span class="kt"&gt;SwiftUI&lt;/span&gt;
&lt;span class="kd"&gt;import&lt;/span&gt; &lt;span class="kt"&gt;SwiftData&lt;/span&gt;

&lt;span class="c1"&gt;// MARK: - Feature Manager&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="kt"&gt;FeatureManager&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;ObservableObject&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// ... (Properties and Init code omitted for brevity)&lt;/span&gt;

    &lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;addFeature&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;platform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Platform&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;withAnimation&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;feature&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;Feature&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="nv"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="nv"&gt;featureDescription&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="nv"&gt;platform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;platform&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;modelContext&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;insert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;feature&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="c1"&gt;// ... (deleteFeature code omitted for brevity)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 3: Creating the App Intent
&lt;/h3&gt;

&lt;p&gt;Now, we define the &lt;code&gt;CreateFeature&lt;/code&gt; App Intent, which allows users to add new features to their wishlist through Siri. We specify the intent's title, parameters, a summary of its action, and the code to perform when invoked.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="kd"&gt;import&lt;/span&gt; &lt;span class="kt"&gt;SwiftUI&lt;/span&gt;
&lt;span class="kd"&gt;import&lt;/span&gt; &lt;span class="kt"&gt;AppIntents&lt;/span&gt;

&lt;span class="c1"&gt;// MARK: - Create Feature App Intent&lt;/span&gt;

&lt;span class="kd"&gt;struct&lt;/span&gt; &lt;span class="kt"&gt;CreateFeature&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;AppIntent&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// ... (Properties code omitted for brevity)&lt;/span&gt;

    &lt;span class="kd"&gt;@Parameter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"Platform"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;requestValueDialog&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"Where would you like to see this feature?"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;platform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Platform&lt;/span&gt;

    &lt;span class="kd"&gt;@Parameter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"Title"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;requestValueDialog&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"What's the title of the feature?"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt;

    &lt;span class="kd"&gt;@Parameter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"Description"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;requestValueDialog&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"What's the description of the feature?"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt;

    &lt;span class="c1"&gt;// ... (Summary code omitted for brevity)&lt;/span&gt;

    &lt;span class="kd"&gt;@MainActor&lt;/span&gt;
    &lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;perform&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;throws&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kd"&gt;some&lt;/span&gt; &lt;span class="kt"&gt;IntentResult&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="kt"&gt;ReturnsValue&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;FeatureManager&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;shared&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addFeature&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="nv"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="nv"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="nv"&gt;platform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;platform&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;result&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"New Feature for &lt;/span&gt;&lt;span class="se"&gt;\(&lt;/span&gt;&lt;span class="n"&gt;platform&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rawValue&lt;/span&gt;&lt;span class="se"&gt;)\n\n\(&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="se"&gt;)&lt;/span&gt;&lt;span class="s"&gt;:&lt;/span&gt;&lt;span class="se"&gt;\n\(&lt;/span&gt;&lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="se"&gt;)&lt;/span&gt;&lt;span class="s"&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;h3&gt;
  
  
  Step 4: Exposing the App Intent to Siri
&lt;/h3&gt;

&lt;p&gt;Finally, we expose our &lt;code&gt;CreateFeature&lt;/code&gt; App Intent to Siri through an &lt;code&gt;AppShortcutsProvider&lt;/code&gt;. This involves defining an App Shortcut that links to our intent and providing phrases that users can say to trigger it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="kd"&gt;import&lt;/span&gt; &lt;span class="kt"&gt;Foundation&lt;/span&gt;
&lt;span class="kd"&gt;import&lt;/span&gt; &lt;span class="kt"&gt;AppIntents&lt;/span&gt;

&lt;span class="c1"&gt;// MARK: - App Shortcuts&lt;/span&gt;

&lt;span class="kd"&gt;struct&lt;/span&gt; &lt;span class="kt"&gt;AppShortcuts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;AppShortcutsProvider&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;@AppShortcutsBuilder&lt;/span&gt;
    &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;appShortcuts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;AppShortcut&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;AppShortcut&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="nv"&gt;intent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;CreateFeature&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="nv"&gt;phrases&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"Make a New &lt;/span&gt;&lt;span class="se"&gt;\(&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;applicationName&lt;/span&gt;&lt;span class="se"&gt;)&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="nv"&gt;shortTitle&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;LocalizedStringResource&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;stringLiteral&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"New Feature"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="nv"&gt;systemImageName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"apple.logo"&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;
  
  
  Key Takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;App Intents are crucial for integrating your app with system functionalities like Siri, Spotlight, and Widgets.&lt;/li&gt;
&lt;li&gt;As AI becomes more prevalent in iOS, App Intents will play an even greater role in enhancing user experience.&lt;/li&gt;
&lt;li&gt;By defining clear intents and parameters, you enable Siri to understand and execute actions within your app.&lt;/li&gt;
&lt;li&gt;Investing time in learning and implementing App Intents can significantly improve your app's discoverability and user engagement.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>swift</category>
      <category>swiftui</category>
      <category>ios</category>
      <category>developer</category>
    </item>
  </channel>
</rss>
