<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>IOS on Producthunt daily</title>
        <link>https://producthunt.programnotes.cn/en/tags/ios/</link>
        <description>Recent content in IOS on Producthunt daily</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>en</language>
        <lastBuildDate>Fri, 28 Nov 2025 07:29:17 +0000</lastBuildDate><atom:link href="https://producthunt.programnotes.cn/en/tags/ios/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>Product Hunt Daily | 2025-11-28</title>
        <link>https://producthunt.programnotes.cn/en/p/product-hunt-daily-2025-11-28/</link>
        <pubDate>Fri, 28 Nov 2025 07:29:17 +0000</pubDate>
        
        <guid>https://producthunt.programnotes.cn/en/p/product-hunt-daily-2025-11-28/</guid>
        <description>&lt;img src="https://ph-files.imgix.net/4a89b99a-20c4-4bf1-aef8-aecf3b6c2489.jpeg?auto=format" alt="Featured image of post Product Hunt Daily | 2025-11-28" /&gt;&lt;h2 id=&#34;1-links-20&#34;&gt;1. Links 2.0
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Tagline&lt;/strong&gt;: Save, organize and find your links faster than ever&lt;br&gt;
&lt;strong&gt;Description&lt;/strong&gt;: Links 2.0 is a complete redesign of the app that helps you save, organize and find your links across all your devices. Built for iOS 26, it introduces a new navigation bar, a refreshed Home with Recent Links, improved filters, custom accent colors, a new settings screen and a brand-new app icon. Private by default and powered by iCloud sync, with no accounts or tracking.&lt;br&gt;
&lt;strong&gt;Website&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/r/BBDFUZO3CA3AUI?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;open&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Product Hunt&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/products/links-save-all-your-links?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;View on Product Hunt&lt;/a&gt;&lt;br&gt;
&lt;img src=&#34;https://ph-files.imgix.net/4a89b99a-20c4-4bf1-aef8-aecf3b6c2489.jpeg?auto=format&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Links 2.0&#34;
	
	
&gt;&lt;br&gt;
&lt;strong&gt;Keyword&lt;/strong&gt;: link management, link organizer, bookmark manager, iOS, iCloud sync, privacy, links, organize, save, find, productivity&lt;br&gt;
&lt;strong&gt;VotesCount&lt;/strong&gt;: 🔺373&lt;br&gt;
&lt;strong&gt;Featured&lt;/strong&gt;: Yes&lt;br&gt;
&lt;strong&gt;CreatedAt&lt;/strong&gt;: 2025-11-27 08:01 AM (UTC)&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;2-craft-thanksgiving-release&#34;&gt;2. Craft Thanksgiving Release
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Tagline&lt;/strong&gt;: Revamped Assistant with MCP, Al, an API and Android Beta&lt;br&gt;
&lt;strong&gt;Description&lt;/strong&gt;: 🚀 Craft’s Thanksgiving release is here! Your ideas, tools, and AI now come together in a connected workspace that feels effortless. With a smarter context-aware Assistant, new API &amp;amp; MCP connections, and a smoother flow across Tabs, Whiteboards, and the Code Editor, Craft turns thoughts into action. Plus: our Android beta is here!&lt;br&gt;
&lt;strong&gt;Website&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/r/5A6UCRPZWRQR3H?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;open&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Product Hunt&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/products/craft-do?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;View on Product Hunt&lt;/a&gt;&lt;br&gt;
&lt;img src=&#34;https://ph-files.imgix.net/bf63eff6-68ba-40d1-a68d-dbc93f74484c.png?auto=format&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Craft Thanksgiving Release&#34;
	
	
&gt;&lt;br&gt;
&lt;strong&gt;Keyword&lt;/strong&gt;: Craft, Thanksgiving, Release, Assistant, AI, API, Android Beta, Workspace, Context-aware, Tabs, Whiteboards, Code Editor&lt;br&gt;
&lt;strong&gt;VotesCount&lt;/strong&gt;: 🔺304&lt;br&gt;
&lt;strong&gt;Featured&lt;/strong&gt;: Yes&lt;br&gt;
&lt;strong&gt;CreatedAt&lt;/strong&gt;: 2025-11-27 08:01 AM (UTC)&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;3-noshoapp&#34;&gt;3. NoSho.app
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Tagline&lt;/strong&gt;: Grow your waitlist and fill availability fast with deposits&lt;br&gt;
&lt;strong&gt;Description&lt;/strong&gt;: One simple link for businesses to grow their waitlist and fill last-minute availability with deposits fast. Make the availability you want booked fast visible to customers with one click, stop promoting slots you have hidden in a booking system maze. No more chasing messages or posting Stories that vanish in 24 hours. Just share your NoSho profile, automatically notify customers when new slots are added and get booked securely.&lt;br&gt;
&lt;strong&gt;Website&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/r/YPKAVMDHVI5PMG?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;open&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Product Hunt&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/products/nosho-app?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;View on Product Hunt&lt;/a&gt;&lt;br&gt;
&lt;img src=&#34;https://ph-files.imgix.net/4dd86bac-92ec-4980-8bc0-bd7f33a7f657.jpeg?auto=format&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;NoSho.app&#34;
	
	
&gt;&lt;br&gt;
&lt;strong&gt;Keyword&lt;/strong&gt;: waitlist, availability, deposits, booking, appointments, scheduling, businesses, fast booking, automated notifications&lt;br&gt;
&lt;strong&gt;VotesCount&lt;/strong&gt;: 🔺211&lt;br&gt;
&lt;strong&gt;Featured&lt;/strong&gt;: Yes&lt;br&gt;
&lt;strong&gt;CreatedAt&lt;/strong&gt;: 2025-11-27 08:01 AM (UTC)&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;4-insighttube&#34;&gt;4. InsightTube
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Tagline&lt;/strong&gt;: AI insights from YouTube — fast, clear, effortless.&lt;br&gt;
&lt;strong&gt;Description&lt;/strong&gt;: InsightTube feels like YouTube — but built for learning. Search any topic, open any channel you follow, and AI instantly highlights what matters. It summarizes ideas, breaks videos into chapters, generates multilingual subtitles, and lets you chat with the content.&lt;br&gt;
&lt;strong&gt;Website&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/r/6Z65MUH4AGQWOX?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;open&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Product Hunt&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/products/insighttube?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;View on Product Hunt&lt;/a&gt;&lt;br&gt;
&lt;img src=&#34;https://ph-files.imgix.net/3c7591fe-66bc-4b98-83cf-ee5e3ec2242a.webp?auto=format&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;InsightTube&#34;
	
	
&gt;&lt;br&gt;
&lt;strong&gt;Keyword&lt;/strong&gt;: YouTube AI, Video Summarization, AI Learning, YouTube Insights, Video Chapters, Multilingual Subtitles, AI Chat, Educational Videos, Content Analysis, Learning Platform&lt;br&gt;
&lt;strong&gt;VotesCount&lt;/strong&gt;: 🔺177&lt;br&gt;
&lt;strong&gt;Featured&lt;/strong&gt;: Yes&lt;br&gt;
&lt;strong&gt;CreatedAt&lt;/strong&gt;: 2025-11-27 08:01 AM (UTC)&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;5-interachat&#34;&gt;5. Interachat
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Tagline&lt;/strong&gt;: The future of messaging  - Powered by AI&lt;br&gt;
&lt;strong&gt;Description&lt;/strong&gt;: Interachat is a modern messaging app for chatting with friends, groups, and teams — with AI built in to help when you need it. Talk normally, and use @InterachatAI for summaries, answers, opinions, or quick search across your chats. It’s messaging first, AI-assisted, and fully private so your data stays yours.&lt;br&gt;
&lt;strong&gt;Website&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/r/JSHSB5G3GUKUFP?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;open&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Product Hunt&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/products/interachat?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;View on Product Hunt&lt;/a&gt;&lt;br&gt;
&lt;img src=&#34;https://ph-files.imgix.net/59c965cb-3277-485a-90cf-f0624a8702b8.png?auto=format&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Interachat&#34;
	
	
&gt;&lt;br&gt;
&lt;strong&gt;Keyword&lt;/strong&gt;: messaging app, AI, chatbot, privacy, chat, AI-powered, communication, summaries, answers, search, Interachat&lt;br&gt;
&lt;strong&gt;VotesCount&lt;/strong&gt;: 🔺122&lt;br&gt;
&lt;strong&gt;Featured&lt;/strong&gt;: Yes&lt;br&gt;
&lt;strong&gt;CreatedAt&lt;/strong&gt;: 2025-11-27 08:01 AM (UTC)&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;6-live-resume&#34;&gt;6. Live Resume
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Tagline&lt;/strong&gt;: The Resume That Never Gets Old&lt;br&gt;
&lt;strong&gt;Description&lt;/strong&gt;: Live Resume makes PDFs and resume links that never go outdated. Every PDF contains a hidden meta data &amp;amp; pixel that pulls your newest data whenever it&amp;rsquo;s scanned, and your public resume URL always stays in sync. One update → all past PDFs and shared links instantly refresh. No other resume tool offers real-time, self-updating resumes.&lt;br&gt;
&lt;strong&gt;Website&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/r/TTKN3EAM7GJ3GN?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;open&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Product Hunt&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/products/live-resume?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;View on Product Hunt&lt;/a&gt;&lt;br&gt;
&lt;img src=&#34;https://ph-files.imgix.net/d7e5af39-6b06-4313-a708-b9539215c622.png?auto=format&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Live Resume&#34;
	
	
&gt;&lt;br&gt;
&lt;strong&gt;Keyword&lt;/strong&gt;: resume, live resume, self-updating, dynamic resume, PDF, URL, real-time, meta data, outdated resume, resume link&lt;br&gt;
&lt;strong&gt;VotesCount&lt;/strong&gt;: 🔺116&lt;br&gt;
&lt;strong&gt;Featured&lt;/strong&gt;: Yes&lt;br&gt;
&lt;strong&gt;CreatedAt&lt;/strong&gt;: 2025-11-27 08:01 AM (UTC)&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;7-astroalert&#34;&gt;7. AstroAlert
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Tagline&lt;/strong&gt;: Know exactly when satellites pass above you.&lt;br&gt;
&lt;strong&gt;Description&lt;/strong&gt;: AstroAlert is your personal sky-watch assistant. It tells you exactly which satellites, planets, comets, and deep-sky objects will pass right above your location in the next 24 hours — including spectacular zenith events above 70°. Powered by NASA/JPL data, it combines real-time calculations with educational content, a full astronomy glossary, and detailed object sheets. The sky above you, revealed with precision.&lt;br&gt;
&lt;strong&gt;Website&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/r/6WYCOHBYPFBLN5?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;open&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Product Hunt&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/products/astroalert-sky-events-in-your-pocket?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;View on Product Hunt&lt;/a&gt;&lt;br&gt;
&lt;img src=&#34;https://ph-files.imgix.net/dd66ee5c-c67e-4236-b504-7d7b47e9de23.png?auto=format&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;AstroAlert&#34;
	
	
&gt;&lt;br&gt;
&lt;strong&gt;Keyword&lt;/strong&gt;: satellite tracking, astronomy, sky watching, NASA, planets, comets, deep-sky objects, zenith events, location based, educational, glossary&lt;br&gt;
&lt;strong&gt;VotesCount&lt;/strong&gt;: 🔺114&lt;br&gt;
&lt;strong&gt;Featured&lt;/strong&gt;: Yes&lt;br&gt;
&lt;strong&gt;CreatedAt&lt;/strong&gt;: 2025-11-27 08:01 AM (UTC)&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;8-get-trippy-home&#34;&gt;8. Get Trippy Home
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Tagline&lt;/strong&gt;: Save a turkey this Thanksgiving!&lt;br&gt;
&lt;strong&gt;Description&lt;/strong&gt;: Trippy the Turkey has spent too much time playing outside and needs to get back home for Thanksgiving dinner. Trippy’s neighbor Fergus the Farmer can give Trippy a lift by catapulting Trippy air-born. For the rest of the way Trippy can glide or run his way back home. Can Trippy make it back home in time?&lt;br&gt;
&lt;strong&gt;Website&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/r/73TBE67VY3RECS?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;open&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Product Hunt&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/products/get-trippy-home?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;View on Product Hunt&lt;/a&gt;&lt;br&gt;
&lt;img src=&#34;https://ph-files.imgix.net/20314774-5df6-4e79-a02e-8525cf46fdc1.png?auto=format&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Get Trippy Home&#34;
	
	
&gt;&lt;br&gt;
&lt;strong&gt;Keyword&lt;/strong&gt;: Turkey game, Thanksgiving game, save the turkey, catapult game, gliding game, running game, family game, casual game, mobile game, Get Trippy Home&lt;br&gt;
&lt;strong&gt;VotesCount&lt;/strong&gt;: 🔺105&lt;br&gt;
&lt;strong&gt;Featured&lt;/strong&gt;: Yes&lt;br&gt;
&lt;strong&gt;CreatedAt&lt;/strong&gt;: 2025-11-27 08:01 AM (UTC)&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;9-shop-with-copilot&#34;&gt;9. Shop with Copilot
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Tagline&lt;/strong&gt;: Your AI shopping assistant in Edge&lt;br&gt;
&lt;strong&gt;Description&lt;/strong&gt;: Copilot in Microsoft Edge now includes dedicated shopping tools. Get instant price comparisons, price history, and cashback offers directly in your browser sidebar. With Copilot Mode, receive proactive alerts for better deals and coupons while you browse.&lt;br&gt;
&lt;strong&gt;Website&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/r/4HZRHBG34AS26E?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;open&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Product Hunt&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/products/the-new-microsoft-copilot?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;View on Product Hunt&lt;/a&gt;&lt;br&gt;
&lt;img src=&#34;https://ph-files.imgix.net/1c2e1500-6177-46ad-807f-13d48811cf5f.png?auto=format&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Shop with Copilot&#34;
	
	
&gt;&lt;br&gt;
&lt;strong&gt;Keyword&lt;/strong&gt;: AI Shopping Assistant, Edge, Price Comparison, Price History, Cashback, Coupons, Deals, Copilot, Browser Extension&lt;br&gt;
&lt;strong&gt;VotesCount&lt;/strong&gt;: 🔺100&lt;br&gt;
&lt;strong&gt;Featured&lt;/strong&gt;: Yes&lt;br&gt;
&lt;strong&gt;CreatedAt&lt;/strong&gt;: 2025-11-27 08:01 AM (UTC)&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;10-ablemouse&#34;&gt;10. AbleMouse
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Tagline&lt;/strong&gt;: Now works everywhere + MouseCommander: a gesture-driven tool&lt;br&gt;
&lt;strong&gt;Description&lt;/strong&gt;: AbleMouse expands support to Unix, iOS, &amp;amp; iPadOS, making it compatible with all major OSes. A new 3D-printable case for the board is available. The project also introduces MouseCommander (win), a new open-source component. It solves a key problem: how to use keyboard shortcuts and system tools without a physical keyboard or standart mouse. It opens a customizable menu via a gesture, enabling features like instant cursor &amp;ldquo;teleportation&amp;rdquo; via a screen preview, an on-screen keyboard and more.&lt;br&gt;
&lt;strong&gt;Website&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/r/6E756TO5RYGBZN?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;open&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Product Hunt&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/products/ablemouse-control-with-tongue-or-touch?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;View on Product Hunt&lt;/a&gt;&lt;br&gt;
&lt;img src=&#34;https://ph-files.imgix.net/23490523-da89-4155-b0a5-3c9b3b0c7971.jpeg?auto=format&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;AbleMouse&#34;
	
	
&gt;&lt;br&gt;
&lt;strong&gt;Keyword&lt;/strong&gt;: AbleMouse, Unix, iOS, iPadOS, MouseCommander, gesture control, open-source, 3D printable, cursor teleportation, on-screen keyboard, keyboard shortcuts, accessibility&lt;br&gt;
&lt;strong&gt;VotesCount&lt;/strong&gt;: 🔺98&lt;br&gt;
&lt;strong&gt;Featured&lt;/strong&gt;: Yes&lt;br&gt;
&lt;strong&gt;CreatedAt&lt;/strong&gt;: 2025-11-27 08:01 AM (UTC)&lt;/p&gt;
&lt;hr&gt;
</description>
        </item>
        <item>
        <title>Product Hunt Daily | 2025-10-28</title>
        <link>https://producthunt.programnotes.cn/en/p/product-hunt-daily-2025-10-28/</link>
        <pubDate>Tue, 28 Oct 2025 07:27:44 +0000</pubDate>
        
        <guid>https://producthunt.programnotes.cn/en/p/product-hunt-daily-2025-10-28/</guid>
        <description>&lt;img src="https://ph-files.imgix.net/e63bfabf-b6a5-4cac-b6bf-0b0cbe73a381.png?auto=format" alt="Featured image of post Product Hunt Daily | 2025-10-28" /&gt;&lt;h2 id=&#34;1-v0-for-ios&#34;&gt;1. v0 for iOS
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Tagline&lt;/strong&gt;: Build anything with AI&lt;br&gt;
&lt;strong&gt;Description&lt;/strong&gt;: v0 by Vercel is your collaborative AI assistant to design, iterate, and scale full-stack applications for the web.&lt;br&gt;
&lt;strong&gt;Website&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/r/27EXWPFEGSCLLU?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;open&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Product Hunt&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/products/v0?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;View on Product Hunt&lt;/a&gt;&lt;br&gt;
&lt;img src=&#34;https://ph-files.imgix.net/e63bfabf-b6a5-4cac-b6bf-0b0cbe73a381.png?auto=format&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;v0 for iOS&#34;
	
	
&gt;&lt;br&gt;
&lt;strong&gt;Keyword&lt;/strong&gt;: AI, iOS, web apps, design, collaboration, full-stack, Vercel, assistant, iterate, scale&lt;br&gt;
&lt;strong&gt;VotesCount&lt;/strong&gt;: 🔺501&lt;br&gt;
&lt;strong&gt;Featured&lt;/strong&gt;: Yes&lt;br&gt;
&lt;strong&gt;CreatedAt&lt;/strong&gt;: 2025-10-27 07:01 AM (UTC)&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;2-alai&#34;&gt;2. Alai
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Tagline&lt;/strong&gt;: Create high quality presentations using AI&lt;br&gt;
&lt;strong&gt;Description&lt;/strong&gt;: Alai gives 4 options for each slide so that you can discover something that feels right. With Alai’s system of elements, making edits is easy without wasting time tweaking pixels.&lt;br&gt;
&lt;strong&gt;Website&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/r/EA7MCGU6V4CAIN?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;open&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Product Hunt&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/products/alai?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;View on Product Hunt&lt;/a&gt;&lt;br&gt;
&lt;img src=&#34;https://ph-files.imgix.net/f73f120f-b99d-4f39-96fc-0b884cbba29f.gif?auto=format&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Alai&#34;
	
	
&gt;&lt;br&gt;
&lt;strong&gt;Keyword&lt;/strong&gt;: AI presentations, presentation software, AI-powered, slide design, easy editing, high quality, Alai&lt;br&gt;
&lt;strong&gt;VotesCount&lt;/strong&gt;: 🔺367&lt;br&gt;
&lt;strong&gt;Featured&lt;/strong&gt;: Yes&lt;br&gt;
&lt;strong&gt;CreatedAt&lt;/strong&gt;: 2025-10-27 07:01 AM (UTC)&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;3-ai-cmo-by-lindy&#34;&gt;3. AI CMO by Lindy
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Tagline&lt;/strong&gt;: Launch 1000s of marketing experiments in minutes&lt;br&gt;
&lt;strong&gt;Description&lt;/strong&gt;: Lindy is the easiest platform to build no code agents. We shipped marketing actions including Sora 2, Veo 3.1, GPT Imagen, and Nano Banana. Combined them into 3 CMO agents that run campaigns end-to-end.&lt;br&gt;
&lt;strong&gt;Website&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/r/EBKVFO6COFQXNR?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;open&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Product Hunt&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/products/lindy?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;View on Product Hunt&lt;/a&gt;&lt;br&gt;
&lt;img src=&#34;https://ph-files.imgix.net/a1eec65d-a468-413e-90b9-3159c6e86af5.png?auto=format&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;AI CMO by Lindy&#34;
	
	
&gt;&lt;br&gt;
&lt;strong&gt;Keyword&lt;/strong&gt;: AI CMO, Lindy, marketing experiments, no-code agents, Sora 2, Veo 3.1, GPT Imagen, Nano Banana, CMO agents, marketing campaigns&lt;br&gt;
&lt;strong&gt;VotesCount&lt;/strong&gt;: 🔺308&lt;br&gt;
&lt;strong&gt;Featured&lt;/strong&gt;: Yes&lt;br&gt;
&lt;strong&gt;CreatedAt&lt;/strong&gt;: 2025-10-27 07:01 AM (UTC)&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;4-starbase&#34;&gt;4. Starbase
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Tagline&lt;/strong&gt;: Browser-based MCP server testing with AI chat integration&lt;br&gt;
&lt;strong&gt;Description&lt;/strong&gt;: Browser-based playground for MCP servers. Test any remote MCP server, debug tools, and chat with Claude/ChatGPT using your custom integrations. Fully MCP compatible, with built-in LLM chat.&lt;br&gt;
&lt;strong&gt;Website&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/r/MGNF5C44IHTYWS?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;open&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Product Hunt&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/products/metorial?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;View on Product Hunt&lt;/a&gt;&lt;br&gt;
&lt;img src=&#34;https://ph-files.imgix.net/284b9954-8252-4136-a510-1147dec21ac1.jpeg?auto=format&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Starbase&#34;
	
	
&gt;&lt;br&gt;
&lt;strong&gt;Keyword&lt;/strong&gt;: MCP server testing, AI chat integration, browser-based, MCP compatible, debugging, LLM chat, Claude, ChatGPT, remote server testing&lt;br&gt;
&lt;strong&gt;VotesCount&lt;/strong&gt;: 🔺265&lt;br&gt;
&lt;strong&gt;Featured&lt;/strong&gt;: Yes&lt;br&gt;
&lt;strong&gt;CreatedAt&lt;/strong&gt;: 2025-10-27 07:01 AM (UTC)&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;5-presentation-20-by-cubeone&#34;&gt;5. Presentation 2.0 by CubeOne
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Tagline&lt;/strong&gt;: Never make slides again&lt;br&gt;
&lt;strong&gt;Description&lt;/strong&gt;: We make you ready, not just slides. Most AI give you slides to study. CubeOne gives you the story, script, and visuals so you can present right away. Go from nothing to stage-ready in 5 min. Stop making slides, start telling the story.&lt;br&gt;
&lt;strong&gt;Website&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/r/5MWQACZO3PEAE4?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;open&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Product Hunt&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/products/cubeone?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;View on Product Hunt&lt;/a&gt;&lt;br&gt;
&lt;img src=&#34;https://ph-files.imgix.net/72a68f92-60d9-4aad-bd97-468d5ab2719c.png?auto=format&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Presentation 2.0 by CubeOne&#34;
	
	
&gt;&lt;br&gt;
&lt;strong&gt;Keyword&lt;/strong&gt;: Presentation AI, AI Presentation, Presentation Software, No Slides, Storytelling, Stage Ready, Presentation Script, Presentation Visuals, CubeOne&lt;br&gt;
&lt;strong&gt;VotesCount&lt;/strong&gt;: 🔺219&lt;br&gt;
&lt;strong&gt;Featured&lt;/strong&gt;: Yes&lt;br&gt;
&lt;strong&gt;CreatedAt&lt;/strong&gt;: 2025-10-27 07:01 AM (UTC)&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;6-mico&#34;&gt;6. Mico
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Tagline&lt;/strong&gt;: A vibrant new way to talk with Copilot&lt;br&gt;
&lt;strong&gt;Description&lt;/strong&gt;: Mico is a new animated persona for Microsoft Copilot&amp;rsquo;s voice mode. It adds visual expressions like smiles and nods to make conversations feel more natural and adaptive. Powered by Copilot, Mico reacts in real-time and can be personalized with different colors.&lt;br&gt;
&lt;strong&gt;Website&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/r/JHH2TNBCV47OO4?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;open&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Product Hunt&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/products/the-new-microsoft-copilot?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;View on Product Hunt&lt;/a&gt;&lt;br&gt;
&lt;img src=&#34;https://ph-files.imgix.net/afcb9356-c3c9-422b-9cde-7bc864655b5a.jpeg?auto=format&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Mico&#34;
	
	
&gt;&lt;br&gt;
&lt;strong&gt;Keyword&lt;/strong&gt;: Mico, Copilot, animated persona, voice mode, visual expressions, natural conversations, real-time, personalization, Microsoft&lt;br&gt;
&lt;strong&gt;VotesCount&lt;/strong&gt;: 🔺204&lt;br&gt;
&lt;strong&gt;Featured&lt;/strong&gt;: Yes&lt;br&gt;
&lt;strong&gt;CreatedAt&lt;/strong&gt;: 2025-10-27 07:01 AM (UTC)&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;7-velona-ai&#34;&gt;7. Velona AI
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Tagline&lt;/strong&gt;: AI that finds hidden fleet costs before they hit your P&amp;amp;L&lt;br&gt;
&lt;strong&gt;Description&lt;/strong&gt;: Autonomous AI agents that find hidden fleet costs, predict failures, and identify risks in real-time. Works with any telematics provider or OEM. Built on Databricks. Your data stays yours. Get answers in seconds, not weeks.&lt;br&gt;
&lt;strong&gt;Website&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/r/HXYCWCQGKKILQD?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;open&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Product Hunt&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/products/velona-ai?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;View on Product Hunt&lt;/a&gt;&lt;br&gt;
&lt;img src=&#34;https://ph-files.imgix.net/32b126aa-3b78-42dc-99b7-13b5748d2b23.png?auto=format&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Velona AI&#34;
	
	
&gt;&lt;br&gt;
&lt;strong&gt;Keyword&lt;/strong&gt;: AI, fleet management, cost optimization, predictive maintenance, risk identification, telematics, Databricks, real-time insights, autonomous AI, fleet costs&lt;br&gt;
&lt;strong&gt;VotesCount&lt;/strong&gt;: 🔺149&lt;br&gt;
&lt;strong&gt;Featured&lt;/strong&gt;: Yes&lt;br&gt;
&lt;strong&gt;CreatedAt&lt;/strong&gt;: 2025-10-27 07:01 AM (UTC)&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;8-phare-incident-ai&#34;&gt;8. Phare Incident AI
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Tagline&lt;/strong&gt;: Smart incident summaries powered by Magistral small&lt;br&gt;
&lt;strong&gt;Description&lt;/strong&gt;: Phare&amp;rsquo;s Incident AI digests all the fine details and churns out readable summaries and post-mortem of incidents, saving you from squinting at endless logs like a caffeinated mole.&lt;br&gt;
&lt;strong&gt;Website&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/r/2COYS6RMLVJMLV?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;open&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Product Hunt&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/products/phare?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;View on Product Hunt&lt;/a&gt;&lt;br&gt;
&lt;img src=&#34;https://ph-files.imgix.net/29e065d2-257c-4185-9f03-6bdd6eb1b4f9.jpeg?auto=format&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Phare Incident AI&#34;
	
	
&gt;&lt;br&gt;
&lt;strong&gt;Keyword&lt;/strong&gt;: Incident summaries, AI, post-mortem, logs, automation, efficiency, debugging, incident management, Phare, small models&lt;br&gt;
&lt;strong&gt;VotesCount&lt;/strong&gt;: 🔺122&lt;br&gt;
&lt;strong&gt;Featured&lt;/strong&gt;: Yes&lt;br&gt;
&lt;strong&gt;CreatedAt&lt;/strong&gt;: 2025-10-27 07:01 AM (UTC)&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;9-72-hour-clients&#34;&gt;9. 72 Hour Clients
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Tagline&lt;/strong&gt;: Get new leads and clients in 72 hours.&lt;br&gt;
&lt;strong&gt;Description&lt;/strong&gt;: 72 Hour Clients is a AI-powered, guided challenge to get new leads and clients in 72 hours. Proven by 300+ freelancer, agencies and service firms since 2017 and backed by a 100% win your money back guarantee.&lt;br&gt;
&lt;strong&gt;Website&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/r/ZXUHTJEUVGIZFM?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;open&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Product Hunt&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/products/72-hour-clients?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;View on Product Hunt&lt;/a&gt;&lt;br&gt;
&lt;img src=&#34;https://ph-files.imgix.net/5305ee61-85ed-4f40-9bfd-c7c0eb3bd95b.jpeg?auto=format&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;72 Hour Clients&#34;
	
	
&gt;&lt;br&gt;
&lt;strong&gt;Keyword&lt;/strong&gt;: Lead generation, client acquisition, 72 hours, AI, freelancers, agencies, service firms, guarantee, new leads, new clients, fast results&lt;br&gt;
&lt;strong&gt;VotesCount&lt;/strong&gt;: 🔺58&lt;br&gt;
&lt;strong&gt;Featured&lt;/strong&gt;: No&lt;br&gt;
&lt;strong&gt;CreatedAt&lt;/strong&gt;: 2025-10-27 07:01 AM (UTC)&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;10-lookio&#34;&gt;10. Lookio
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Tagline&lt;/strong&gt;: If NotebookLM had an API - Reliable RAG agents made easy&lt;br&gt;
&lt;strong&gt;Description&lt;/strong&gt;: Lookio lets you build AI assistants that answer questions using your company&amp;rsquo;s documents. Perfect for automating customer support, scaling content creation, and powering workflows. API-first design with flexible query modes. Start free with 250 credits.&lt;br&gt;
&lt;strong&gt;Website&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/r/X7OF436QOJRFDB?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;open&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Product Hunt&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/products/lookio?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;View on Product Hunt&lt;/a&gt;&lt;br&gt;
&lt;img src=&#34;https://ph-files.imgix.net/8a52d1e1-08b1-471a-b017-ec87553143f4.png?auto=format&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Lookio&#34;
	
	
&gt;&lt;br&gt;
&lt;strong&gt;Keyword&lt;/strong&gt;: RAG, AI assistant, API, customer support, content creation, workflow automation, documents, Lookio, free trial&lt;br&gt;
&lt;strong&gt;VotesCount&lt;/strong&gt;: 🔺39&lt;br&gt;
&lt;strong&gt;Featured&lt;/strong&gt;: No&lt;br&gt;
&lt;strong&gt;CreatedAt&lt;/strong&gt;: 2025-10-27 07:01 AM (UTC)&lt;/p&gt;
&lt;hr&gt;
</description>
        </item>
        <item>
        <title>Product Hunt Daily | 2025-10-13</title>
        <link>https://producthunt.programnotes.cn/en/p/product-hunt-daily-2025-10-13/</link>
        <pubDate>Mon, 13 Oct 2025 13:09:03 +0000</pubDate>
        
        <guid>https://producthunt.programnotes.cn/en/p/product-hunt-daily-2025-10-13/</guid>
        <description>&lt;h2 id=&#34;1-meku&#34;&gt;1. Meku
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Tagline&lt;/strong&gt;: AI Web App and Site Builder&lt;br&gt;
&lt;strong&gt;Description&lt;/strong&gt;: Meku.dev is an AI-powered web app and site builder engineered for developers. Generate, customize and deploy full-stack web apps and sites from simple AI prompts. Comes with essential integrations and deployment tools and hosting to launch your MVP fast.&lt;br&gt;
&lt;strong&gt;Website&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/r/UEDDQDR2ASWYKW?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;open&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Product Hunt&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/products/meku?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;View on Product Hunt&lt;/a&gt;&lt;br&gt;
&lt;img src=&#34;https://producthunt.programnotes.cn/&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Meku&#34;
	
	
&gt;&lt;br&gt;
&lt;strong&gt;Keyword&lt;/strong&gt;: AI Web App Builder, Site Builder, AI, Web App, Full-Stack, Developer Tools, Deployment, Hosting, MVP, Meku.dev, AI Prompts&lt;br&gt;
&lt;strong&gt;VotesCount&lt;/strong&gt;: 🔺384&lt;br&gt;
&lt;strong&gt;Featured&lt;/strong&gt;: Yes&lt;br&gt;
&lt;strong&gt;CreatedAt&lt;/strong&gt;: 2025-10-12 07:01 AM (UTC)&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;2-open-saas-20&#34;&gt;2. Open SaaS 2.0
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Tagline&lt;/strong&gt;: Free, open-source SaaS starter kit with superpowers&lt;br&gt;
&lt;strong&gt;Description&lt;/strong&gt;: Build and launch your SaaS application faster with this starter kit—free, open-source, full-stack React + Node.js. Features include auth, payments, AI example app, and admin dashboard.&lt;br&gt;
&lt;strong&gt;Website&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/r/5QTWF4SISAQQ3M?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;open&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Product Hunt&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/products/open-saas?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;View on Product Hunt&lt;/a&gt;&lt;br&gt;
&lt;img src=&#34;https://producthunt.programnotes.cn/&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Open SaaS 2.0&#34;
	
	
&gt;&lt;br&gt;
&lt;strong&gt;Keyword&lt;/strong&gt;: SaaS, open-source, React, Node.js, starter kit, free, auth, payments, AI, admin dashboard&lt;br&gt;
&lt;strong&gt;VotesCount&lt;/strong&gt;: 🔺335&lt;br&gt;
&lt;strong&gt;Featured&lt;/strong&gt;: Yes&lt;br&gt;
&lt;strong&gt;CreatedAt&lt;/strong&gt;: 2025-10-12 07:01 AM (UTC)&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;3-undoomed&#34;&gt;3. UNDOOMED
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Tagline&lt;/strong&gt;: Stop doomscrolling. A mute button for Reels, Shorts &amp;amp; feeds.&lt;br&gt;
&lt;strong&gt;Description&lt;/strong&gt;: Tired of “5 min” turning into 2 hours? Undoomed hides Reels/Shorts/TikTok feeds but leaves what matters—messages and posts. Per-app settings, quick switch, light “clarity” stats. iOS now, Android on the way.&lt;br&gt;
&lt;strong&gt;Website&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/r/SQP6L5JD7CBUI4?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;open&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Product Hunt&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/products/undoomed?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;View on Product Hunt&lt;/a&gt;&lt;br&gt;
&lt;img src=&#34;https://producthunt.programnotes.cn/&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;UNDOOMED&#34;
	
	
&gt;&lt;br&gt;
&lt;strong&gt;Keyword&lt;/strong&gt;: doomscrolling, mute button, Reels, Shorts, feeds, iOS, Android, productivity, time management, social media, focus&lt;br&gt;
&lt;strong&gt;VotesCount&lt;/strong&gt;: 🔺258&lt;br&gt;
&lt;strong&gt;Featured&lt;/strong&gt;: Yes&lt;br&gt;
&lt;strong&gt;CreatedAt&lt;/strong&gt;: 2025-10-12 07:01 AM (UTC)&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;4-getillustrations-figma-plugin&#34;&gt;4. Getillustrations Figma Plugin
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Tagline&lt;/strong&gt;: Bring stunning vector illustrations straight into Figma&lt;br&gt;
&lt;strong&gt;Description&lt;/strong&gt;: The power of Getillustrations directly in Figma! Our plugin is packed with thousands of ready-to-use illustrations for UI, apps and websites. Fast, editable, and designed to keep your workflow smooth, just download and link to your All access account.&lt;br&gt;
&lt;strong&gt;Website&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/r/A2AB3CIFDMVRWL?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;open&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Product Hunt&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/products/get-illustrations-premium-illustrations-for-website-and-app-ui-design?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;View on Product Hunt&lt;/a&gt;&lt;br&gt;
&lt;img src=&#34;https://producthunt.programnotes.cn/&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Getillustrations Figma Plugin&#34;
	
	
&gt;&lt;br&gt;
&lt;strong&gt;Keyword&lt;/strong&gt;: Figma plugin, vector illustrations, UI illustrations, app illustrations, website illustrations, editable illustrations, ready-to-use illustrations, Getillustrations&lt;br&gt;
&lt;strong&gt;VotesCount&lt;/strong&gt;: 🔺193&lt;br&gt;
&lt;strong&gt;Featured&lt;/strong&gt;: Yes&lt;br&gt;
&lt;strong&gt;CreatedAt&lt;/strong&gt;: 2025-10-12 07:01 AM (UTC)&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;5-ai-ultra-editing-by-thumblify&#34;&gt;5. AI Ultra Editing by Thumblify
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Tagline&lt;/strong&gt;: Edit Like a Pro&lt;br&gt;
&lt;strong&gt;Description&lt;/strong&gt;: ThumblifyAI Ultra Editing gives you full creative power. Lets you replace backgrounds, add elements, and fix every small detail in seconds. No limits, no complex tools. Just pure creativity made faster with AI.&lt;br&gt;
&lt;strong&gt;Website&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/r/IJRSDEKOGLLYG2?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;open&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Product Hunt&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/products/thumblifyai?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;View on Product Hunt&lt;/a&gt;&lt;br&gt;
&lt;img src=&#34;https://producthunt.programnotes.cn/&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;AI Ultra Editing by Thumblify&#34;
	
	
&gt;&lt;br&gt;
&lt;strong&gt;Keyword&lt;/strong&gt;: AI Editing, Image Editing, Background Removal, AI, Creative Editing, Thumblify, Ultra Editing, Easy Editing, Fast Editing, AI Tools&lt;br&gt;
&lt;strong&gt;VotesCount&lt;/strong&gt;: 🔺173&lt;br&gt;
&lt;strong&gt;Featured&lt;/strong&gt;: Yes&lt;br&gt;
&lt;strong&gt;CreatedAt&lt;/strong&gt;: 2025-10-12 07:01 AM (UTC)&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;6-monitoro&#34;&gt;6. Monitoro
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Tagline&lt;/strong&gt;: Track AI &amp;amp; SEO Traffic o_O&lt;br&gt;
&lt;strong&gt;Description&lt;/strong&gt;: Track traffic from AI, Google, and Bing in one place. Finally!&lt;br&gt;
&lt;strong&gt;Website&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/r/ZEJ3WCSUZCJKJF?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;open&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Product Hunt&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/products/seo-monitoro?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;View on Product Hunt&lt;/a&gt;&lt;br&gt;
&lt;img src=&#34;https://producthunt.programnotes.cn/&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Monitoro&#34;
	
	
&gt;&lt;br&gt;
&lt;strong&gt;Keyword&lt;/strong&gt;: AI traffic, SEO traffic, Google traffic, Bing traffic, traffic tracking, monitor&lt;br&gt;
&lt;strong&gt;VotesCount&lt;/strong&gt;: 🔺62&lt;br&gt;
&lt;strong&gt;Featured&lt;/strong&gt;: No&lt;br&gt;
&lt;strong&gt;CreatedAt&lt;/strong&gt;: 2025-10-12 07:01 AM (UTC)&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;7-flow-tabs-pro&#34;&gt;7. Flow Tabs Pro
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Tagline&lt;/strong&gt;: Cut Chrome&amp;rsquo;s memory usage in half with smart tab suspension&lt;br&gt;
&lt;strong&gt;Description&lt;/strong&gt;: Stop Chrome from eating your RAM. Flow Tabs Pro suspends inactive tabs, cutting memory usage up to 50%. Super Focus Mode, session switching, and seamless tab management—all without disrupting your workflow. 7-day free trial.&lt;br&gt;
&lt;strong&gt;Website&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/r/AXTFSKCTB6PBKM?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;open&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Product Hunt&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/products/flow-tabs-pro?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;View on Product Hunt&lt;/a&gt;&lt;br&gt;
&lt;img src=&#34;https://producthunt.programnotes.cn/&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Flow Tabs Pro&#34;
	
	
&gt;&lt;br&gt;
&lt;strong&gt;Keyword&lt;/strong&gt;: Chrome, tab management, memory saver, tab suspension, RAM optimization, Flow Tabs Pro, productivity, free trial, Super Focus Mode, session switching&lt;br&gt;
&lt;strong&gt;VotesCount&lt;/strong&gt;: 🔺40&lt;br&gt;
&lt;strong&gt;Featured&lt;/strong&gt;: No&lt;br&gt;
&lt;strong&gt;CreatedAt&lt;/strong&gt;: 2025-10-12 07:01 AM (UTC)&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;8-minarah---prayer-reminder-app&#34;&gt;8. Minarah - Prayer Reminder App
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Tagline&lt;/strong&gt;: Never miss a prayer on your mac&lt;br&gt;
&lt;strong&gt;Description&lt;/strong&gt;: Minarah is a full-screen prayer reminder for macOS with elegant alerts, Smart Countdown, and Focus Mode — helping you stay on time for every Salah without breaking focus.&lt;br&gt;
&lt;strong&gt;Website&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/r/BWHARV4VSHGECD?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;open&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Product Hunt&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/products/minarah-prayer-reminder-app?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;View on Product Hunt&lt;/a&gt;&lt;br&gt;
&lt;img src=&#34;https://producthunt.programnotes.cn/&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Minarah - Prayer Reminder App&#34;
	
	
&gt;&lt;br&gt;
&lt;strong&gt;Keyword&lt;/strong&gt;: Prayer reminder, macOS, Salah, alerts, countdown, focus mode, Islamic app, prayer times&lt;br&gt;
&lt;strong&gt;VotesCount&lt;/strong&gt;: 🔺25&lt;br&gt;
&lt;strong&gt;Featured&lt;/strong&gt;: No&lt;br&gt;
&lt;strong&gt;CreatedAt&lt;/strong&gt;: 2025-10-12 07:01 AM (UTC)&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;9-ai-financial-report-10k-q-etc&#34;&gt;9. AI Financial Report (10K, Q, etc)
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Tagline&lt;/strong&gt;: Fast, clear annual report with smart financial metrics&lt;br&gt;
&lt;strong&gt;Description&lt;/strong&gt;: Delivers instant, comprehensive financial report summaries with one click. Upload statements and get a clear breakdown of key metrics business, finance statement, growth all displayed in a modern UI. Save hours, work smarter, and make informed decisions.&lt;br&gt;
&lt;strong&gt;Website&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/r/JYNEFFTGZAQURO?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;open&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Product Hunt&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/products/ai-financial-report-10k-q-etc?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;View on Product Hunt&lt;/a&gt;&lt;br&gt;
&lt;img src=&#34;https://producthunt.programnotes.cn/&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;AI Financial Report (10K, Q, etc) &#34;
	
	
&gt;&lt;br&gt;
&lt;strong&gt;Keyword&lt;/strong&gt;: AI Financial Report, financial summaries, annual reports, 10K, Q reports, financial metrics, business analysis, fast reporting, modern UI, informed decisions, data analysis&lt;br&gt;
&lt;strong&gt;VotesCount&lt;/strong&gt;: 🔺19&lt;br&gt;
&lt;strong&gt;Featured&lt;/strong&gt;: No&lt;br&gt;
&lt;strong&gt;CreatedAt&lt;/strong&gt;: 2025-10-12 07:01 AM (UTC)&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;10-strayl&#34;&gt;10. Strayl
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Tagline&lt;/strong&gt;: Build everywhere&lt;br&gt;
&lt;strong&gt;Description&lt;/strong&gt;: Strayl is a mobile AI coding agent - like Claude Code, but built for iOS. Edit, refactor, and preview your projects with AI. It connects to GitHub, indexes your codebase, connects to MCP servers to use their tools, and can spin up instant preview deployments.&lt;br&gt;
&lt;strong&gt;Website&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/r/SVUDZA2LA6C362?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;open&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Product Hunt&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/products/strayl?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;View on Product Hunt&lt;/a&gt;&lt;br&gt;
&lt;img src=&#34;https://producthunt.programnotes.cn/&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Strayl&#34;
	
	
&gt;&lt;br&gt;
&lt;strong&gt;Keyword&lt;/strong&gt;: AI coding agent, iOS, Code editing, Refactoring, AI-powered, GitHub integration, Instant preview, Deployment, Mobile coding, Strayl&lt;br&gt;
&lt;strong&gt;VotesCount&lt;/strong&gt;: 🔺19&lt;br&gt;
&lt;strong&gt;Featured&lt;/strong&gt;: No&lt;br&gt;
&lt;strong&gt;CreatedAt&lt;/strong&gt;: 2025-10-12 07:01 AM (UTC)&lt;/p&gt;
&lt;hr&gt;
</description>
        </item>
        <item>
        <title>expo</title>
        <link>https://producthunt.programnotes.cn/en/p/expo/</link>
        <pubDate>Sat, 13 Sep 2025 15:24:21 +0800</pubDate>
        
        <guid>https://producthunt.programnotes.cn/en/p/expo/</guid>
        <description>&lt;img src="https://images.unsplash.com/photo-1729433272880-a697791721e7?ixid=M3w0NjAwMjJ8MHwxfHJhbmRvbXx8fHx8fHx8fDE3NTc3NDgxOTF8&amp;ixlib=rb-4.1.0" alt="Featured image of post expo" /&gt;&lt;h1 id=&#34;expoexpo&#34;&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/expo/expo&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;expo/expo&lt;/a&gt;
&lt;/h1&gt;&lt;!-- Banner Image --&gt;
&lt;p align=&#34;center&#34;&gt;
  &lt;a href=&#34;https://expo.dev/&#34;&gt;
    &lt;img alt=&#34;expo sdk&#34; height=&#34;128&#34; src=&#34;./.github/resources/banner.png&#34;&gt;
    &lt;h1 align=&#34;center&#34;&gt;Expo&lt;/h1&gt;
  &lt;/a&gt;
&lt;/p&gt;
&lt;p align=&#34;center&#34;&gt;
   &lt;a aria-label=&#34;SDK version&#34; href=&#34;https://www.npmjs.com/package/expo&#34; target=&#34;_blank&#34;&gt;
    &lt;img alt=&#34;Expo SDK version&#34; src=&#34;https://img.shields.io/npm/v/expo.svg?style=flat-square&amp;label=SDK&amp;labelColor=000000&amp;color=4630EB&#34; /&gt;
  &lt;/a&gt;
  &lt;a aria-label=&#34;Join our forums&#34; href=&#34;https://forums.expo.dev&#34; target=&#34;_blank&#34;&gt;
    &lt;img alt=&#34;Forums&#34; src=&#34;https://img.shields.io/badge/Ask%20Questions%20-blue.svg?style=flat-square&amp;logo=discourse&amp;logoWidth=15&amp;labelColor=000000&amp;color=4630EB&#34; /&gt;
  &lt;/a&gt;
  &lt;a aria-label=&#34;Join our Discord&#34; href=&#34;https://discord.gg/4gtbPAdpaE&#34; target=&#34;_blank&#34;&gt;
    &lt;img alt=&#34;Discord&#34; src=&#34;https://img.shields.io/discord/695411232856997968.svg?style=flat-square&amp;labelColor=000000&amp;color=4630EB&amp;logo=discord&amp;logoColor=FFFFFF&amp;label=&#34; /&gt;
  &lt;/a&gt;
  &lt;a aria-label=&#34;Expo is free to use&#34; href=&#34;https://github.com/expo/expo/blob/master/LICENSE&#34; target=&#34;_blank&#34;&gt;
    &lt;img alt=&#34;License: MIT&#34; src=&#34;https://img.shields.io/badge/License-MIT-success.svg?style=flat-square&amp;color=33CC12&#34; target=&#34;_blank&#34; /&gt;
  &lt;/a&gt;
  &lt;a aria-label=&#34;expo downloads&#34; href=&#34;http://www.npmtrends.com/expo&#34; target=&#34;_blank&#34;&gt;
    &lt;img alt=&#34;Downloads&#34; src=&#34;https://img.shields.io/npm/dm/expo.svg?style=flat-square&amp;labelColor=gray&amp;color=33CC12&amp;label=Downloads&#34; /&gt;
  &lt;/a&gt;
&lt;/p&gt;
&lt;p align=&#34;center&#34;&gt;
  &lt;a aria-label=&#34;try expo with snack&#34; href=&#34;https://snack.expo.dev&#34;&gt;&lt;b&gt;Try Expo in the Browser&lt;/b&gt;&lt;/a&gt;
 |
  &lt;a aria-label=&#34;expo documentation&#34; href=&#34;https://docs.expo.dev&#34;&gt;Read the Documentation 📚&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
  &lt;a aria-label=&#34;Follow @expo on Twitter&#34; href=&#34;https://twitter.com/intent/follow?screen_name=expo&#34; target=&#34;_blank&#34;&gt;
    &lt;img  alt=&#34;Twitter: expo&#34; src=&#34;https://img.shields.io/twitter/follow/expo.svg?style=flat-square&amp;label=Follow%20%40expo&amp;logo=TWITTER&amp;logoColor=FFFFFF&amp;labelColor=00aced&amp;logoWidth=15&amp;color=lightgray&#34; target=&#34;_blank&#34; /&gt;
  &lt;/a&gt;
  &lt;a aria-label=&#34;Follow Expo on Medium&#34; href=&#34;https://blog.expo.dev&#34;&gt;
    &lt;img align=&#34;right&#34; alt=&#34;Medium: exposition&#34; src=&#34;https://img.shields.io/badge/Learn%20more%20on%20our%20blog-lightgray.svg?style=flat-square&#34; target=&#34;_blank&#34; /&gt;
  &lt;/a&gt;
&lt;/p&gt;
&lt;hr&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#-documentation&#34; &gt;📚 Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#-project-layout&#34; &gt;🗺 Project Layout&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#-badges&#34; &gt;🏅 Badges&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#-contributing&#34; &gt;👏 Contributing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#-faq&#34; &gt;❓ FAQ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#-the-team&#34; &gt;💙 The Team&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#license&#34; &gt;License&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Expo is an open-source platform for making universal native apps that run on Android, iOS, and the web. It includes a universal runtime and libraries that let you build native apps by writing React and JavaScript. This repository is where the Expo client software is developed, and includes the client apps, modules, apps, and more. The &lt;a class=&#34;link&#34; href=&#34;https://github.com/expo/expo-cli&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Expo CLI&lt;/a&gt; repository contains the Expo development tools.&lt;/p&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://expo.dev/guidelines&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Click here to view the Expo Community Guidelines&lt;/a&gt;. Thank you for helping keep the Expo community open and welcoming!&lt;/p&gt;
&lt;h2 id=&#34;-documentation&#34;&gt;📚 Documentation
&lt;/h2&gt;&lt;p&gt;Learn about building and deploying universal apps &lt;a aria-label=&#34;expo documentation&#34; href=&#34;https://docs.expo.dev&#34;&gt;in our official docs!&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://docs.expo.dev/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Getting Started&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://docs.expo.dev/versions/latest/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;API Reference&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://docs.expo.dev/bare/exploring-bare-workflow/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Using Custom Native Modules&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;-project-layout&#34;&gt;🗺 Project Layout
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://producthunt.programnotes.cn/packages&#34; &gt;&lt;code&gt;packages&lt;/code&gt;&lt;/a&gt; All the source code for the Unimodules, if you want to edit a library or just see how it works this is where you&amp;rsquo;ll find it.&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://producthunt.programnotes.cn/apps&#34; &gt;&lt;code&gt;apps&lt;/code&gt;&lt;/a&gt; This is where you can find Expo projects which are linked to the development Unimodules. You&amp;rsquo;ll do most of your testing in here.&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://producthunt.programnotes.cn/docs&#34; &gt;&lt;code&gt;docs&lt;/code&gt;&lt;/a&gt; The source code for &lt;strong&gt;&lt;a class=&#34;link&#34; href=&#34;https://docs.expo.dev&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://docs.expo.dev&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://producthunt.programnotes.cn/templates&#34; &gt;&lt;code&gt;templates&lt;/code&gt;&lt;/a&gt; The template projects you get when you run &lt;code&gt;expo start&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://producthunt.programnotes.cn/react-native-lab&#34; &gt;&lt;code&gt;react-native-lab&lt;/code&gt;&lt;/a&gt; This is our fork of &lt;code&gt;react-native&lt;/code&gt;. We keep this very close to the upstream but sometimes need to add quick fixes locally before they can land.&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://producthunt.programnotes.cn/guides&#34; &gt;&lt;code&gt;guides&lt;/code&gt;&lt;/a&gt; In-depth tutorials for advanced topics like contributing to the client.&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://producthunt.programnotes.cn/android&#34; &gt;&lt;code&gt;android&lt;/code&gt;&lt;/a&gt; contains the Android project.&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://producthunt.programnotes.cn/home&#34; &gt;&lt;code&gt;home&lt;/code&gt;&lt;/a&gt; contains the JavaScript source code of the app.&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://producthunt.programnotes.cn/ios&#34; &gt;&lt;code&gt;ios&lt;/code&gt;&lt;/a&gt; contains the iOS project.&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://producthunt.programnotes.cn/ios&#34; &gt;&lt;code&gt;ios/Exponent.xcworkspace&lt;/code&gt;&lt;/a&gt; is the Xcode workspace. Always open this instead of &lt;code&gt;Exponent.xcodeproj&lt;/code&gt; because the workspace also loads the CocoaPods dependencies.&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://producthunt.programnotes.cn/tools&#34; &gt;&lt;code&gt;tools&lt;/code&gt;&lt;/a&gt; contains build and configuration tools.&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://producthunt.programnotes.cn/template-files&#34; &gt;&lt;code&gt;template-files&lt;/code&gt;&lt;/a&gt; contains templates for files that require private keys. They are populated using the keys in &lt;code&gt;template-files/keys.json&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://producthunt.programnotes.cn/template-files/ios/dependencies.json&#34; &gt;&lt;code&gt;template-files/ios/dependencies.json&lt;/code&gt;&lt;/a&gt; specifies the CocoaPods dependencies of the app.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;-badges&#34;&gt;🏅 Badges
&lt;/h2&gt;&lt;p&gt;Let everyone know your app can be run instantly in the &lt;em&gt;Expo Go&lt;/em&gt; app!
&lt;br/&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://expo.dev/client&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;img src=&#34;https://img.shields.io/badge/Runs%20with%20Expo%20Go-000.svg?style=flat-square&amp;amp;logo=EXPO&amp;amp;labelColor=f3f3f3&amp;amp;logoColor=000&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;runs with Expo Go&#34;
	
	
&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://expo.dev/client&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;img src=&#34;https://img.shields.io/badge/Runs%20with%20Expo%20Go-4630EB.svg?style=flat-square&amp;amp;logo=EXPO&amp;amp;labelColor=f3f3f3&amp;amp;logoColor=000&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;runs with Expo Go&#34;
	
	
&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-md&#34; data-lang=&#34;md&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[&lt;span class=&#34;nt&#34;&gt;![runs with Expo Go&lt;/span&gt;](&lt;span class=&#34;na&#34;&gt;https://img.shields.io/badge/Runs%20with%20Expo%20Go-000.svg?style=flat-square&amp;amp;logo=EXPO&amp;amp;labelColor=f3f3f3&amp;amp;logoColor=000&lt;/span&gt;)](https://expo.dev/client)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[&lt;span class=&#34;nt&#34;&gt;![runs with Expo Go&lt;/span&gt;](&lt;span class=&#34;na&#34;&gt;https://img.shields.io/badge/Runs%20with%20Expo%20Go-4630EB.svg?style=flat-square&amp;amp;logo=EXPO&amp;amp;labelColor=f3f3f3&amp;amp;logoColor=000&lt;/span&gt;)](https://expo.dev/client)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;-contributing&#34;&gt;👏 Contributing
&lt;/h2&gt;&lt;p&gt;If you like Expo and want to help make it better then check out our &lt;a class=&#34;link&#34; href=&#34;https://producthunt.programnotes.cn/CONTRIBUTING.md&#34; &gt;contributing guide&lt;/a&gt;! Check out the &lt;a class=&#34;link&#34; href=&#34;http://github.com/expo/expo-cli&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Expo CLI repo&lt;/a&gt; to work on the Expo CLI, and various other universal development tools.&lt;/p&gt;
&lt;h2 id=&#34;-faq&#34;&gt;❓ FAQ
&lt;/h2&gt;&lt;p&gt;If you have questions about Expo and want answers, then check out our &lt;a class=&#34;link&#34; href=&#34;https://docs.expo.dev/versions/latest/introduction/faq/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Frequently Asked Questions&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;If you still have questions you can ask them on our &lt;a class=&#34;link&#34; href=&#34;https://forums.expo.dev&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;forums&lt;/a&gt;, &lt;a class=&#34;link&#34; href=&#34;https://discord.gg/4gtbPAdpaE&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Discord&lt;/a&gt; or on Twitter &lt;a class=&#34;link&#34; href=&#34;https://twitter.com/expo&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;@Expo&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;-the-team&#34;&gt;💙 The Team
&lt;/h2&gt;&lt;p&gt;Curious about who makes Expo? Here are our &lt;a class=&#34;link&#34; href=&#34;https://expo.dev/about&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;team members&lt;/a&gt;!&lt;/p&gt;
&lt;h2 id=&#34;license&#34;&gt;License
&lt;/h2&gt;&lt;p&gt;The Expo source code is made available under the &lt;a class=&#34;link&#34; href=&#34;LICENSE&#34; &gt;MIT license&lt;/a&gt;. Some of the dependencies are licensed differently, with the BSD license, for example.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>clients</title>
        <link>https://producthunt.programnotes.cn/en/p/clients/</link>
        <pubDate>Fri, 22 Aug 2025 15:27:27 +0800</pubDate>
        
        <guid>https://producthunt.programnotes.cn/en/p/clients/</guid>
        <description>&lt;img src="https://images.unsplash.com/photo-1695748216442-5eaad91860f2?ixid=M3w0NjAwMjJ8MHwxfHJhbmRvbXx8fHx8fHx8fDE3NTU4NDc2MTV8&amp;ixlib=rb-4.1.0" alt="Featured image of post clients" /&gt;&lt;h1 id=&#34;bitwardenclients&#34;&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/bitwarden/clients&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;bitwarden/clients&lt;/a&gt;
&lt;/h1&gt;&lt;p align=&#34;center&#34;&gt;
  &lt;img src=&#34;https://raw.githubusercontent.com/bitwarden/brand/main/screenshots/apps-combo-logo.png&#34; alt=&#34;Bitwarden&#34; /&gt;
&lt;/p&gt;
&lt;p align=&#34;center&#34;&gt;
  &lt;a href=&#34;https://github.com/bitwarden/clients/actions/workflows/build-browser.yml?query=branch:main&#34; target=&#34;_blank&#34;&gt;&lt;img src=&#34;https://github.com/bitwarden/clients/actions/workflows/build-browser.yml/badge.svg?branch=main&#34; alt=&#34;GitHub Workflow browser build on main&#34; /&gt;&lt;/a&gt;
  &lt;a href=&#34;https://github.com/bitwarden/clients/actions/workflows/build-cli.yml?query=branch:main&#34; target=&#34;_blank&#34;&gt;&lt;img src=&#34;https://github.com/bitwarden/clients/actions/workflows/build-cli.yml/badge.svg?branch=main&#34; alt=&#34;GitHub Workflow CLI build on main&#34; /&gt;&lt;/a&gt;
  &lt;a href=&#34;https://github.com/bitwarden/clients/actions/workflows/build-desktop.yml?query=branch:main&#34; target=&#34;_blank&#34;&gt;&lt;img src=&#34;https://github.com/bitwarden/clients/actions/workflows/build-desktop.yml/badge.svg?branch=main&#34; alt=&#34;GitHub Workflow desktop build on main&#34; /&gt;&lt;/a&gt;
  &lt;a href=&#34;https://github.com/bitwarden/clients/actions/workflows/build-web.yml?query=branch:main&#34; target=&#34;_blank&#34;&gt;&lt;img src=&#34;https://github.com/bitwarden/clients/actions/workflows/build-web.yml/badge.svg?branch=main&#34; alt=&#34;GitHub Workflow web build on main&#34; /&gt;&lt;/a&gt;
  &lt;a href=&#34;https://gitter.im/bitwarden/Lobby&#34; target=&#34;_blank&#34;&gt;&lt;img src=&#34;https://badges.gitter.im/bitwarden/Lobby.svg&#34; alt=&#34;gitter chat&#34; /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;hr&gt;
&lt;h1 id=&#34;bitwarden-client-applications&#34;&gt;Bitwarden Client Applications
&lt;/h1&gt;&lt;p&gt;This repository houses all Bitwarden client applications except the mobile applications (&lt;a class=&#34;link&#34; href=&#34;https://github.com/bitwarden/ios&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;iOS&lt;/a&gt; | &lt;a class=&#34;link&#34; href=&#34;https://github.com/bitwarden/android&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;android&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Please refer to the &lt;a class=&#34;link&#34; href=&#34;https://contributing.bitwarden.com/getting-started/clients/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Clients section&lt;/a&gt; of the &lt;a class=&#34;link&#34; href=&#34;https://contributing.bitwarden.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Contributing Documentation&lt;/a&gt; for build instructions, recommended tooling, code style tips, and lots of other great information to get you started.&lt;/p&gt;
&lt;h2 id=&#34;related-projects&#34;&gt;Related projects:
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/bitwarden/server&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;bitwarden/server&lt;/a&gt;: The core infrastructure backend (API, database, Docker, etc).&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/bitwarden/ios&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;bitwarden/ios&lt;/a&gt;: Bitwarden iOS Password Manager &amp;amp; Authenticator apps.&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/bitwarden/android&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;bitwarden/android&lt;/a&gt;: Bitwarden Android Password Manager &amp;amp; Authenticator apps.&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/bitwarden/directory-connector&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;bitwarden/directory-connector&lt;/a&gt;: A tool for syncing a directory (AD, LDAP, Azure, G Suite, Okta) to an organization.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;were-hiring&#34;&gt;We&amp;rsquo;re Hiring!
&lt;/h1&gt;&lt;p&gt;Interested in contributing in a big way? Consider joining our team! We&amp;rsquo;re hiring for many positions. Please take a look at our &lt;a class=&#34;link&#34; href=&#34;https://bitwarden.com/careers/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Careers page&lt;/a&gt; to see what opportunities are &lt;a class=&#34;link&#34; href=&#34;https://bitwarden.com/careers/#open-positions&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;currently open&lt;/a&gt; as well as what it&amp;rsquo;s like to work at Bitwarden.&lt;/p&gt;
&lt;h1 id=&#34;contribute&#34;&gt;Contribute
&lt;/h1&gt;&lt;p&gt;Code contributions are welcome! Please commit any pull requests against the &lt;code&gt;main&lt;/code&gt; branch. Learn more about how to contribute by reading the &lt;a class=&#34;link&#34; href=&#34;https://contributing.bitwarden.com/contributing/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Contributing Guidelines&lt;/a&gt;. Check out the &lt;a class=&#34;link&#34; href=&#34;https://contributing.bitwarden.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Contributing Documentation&lt;/a&gt; for how to get started with your first contribution.&lt;/p&gt;
&lt;p&gt;Security audits and feedback are welcome. Please open an issue or email us privately if the report is sensitive in nature. You can read our security policy in the &lt;a class=&#34;link&#34; href=&#34;SECURITY.md&#34; &gt;&lt;code&gt;SECURITY.md&lt;/code&gt;&lt;/a&gt; file.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>maui</title>
        <link>https://producthunt.programnotes.cn/en/p/maui/</link>
        <pubDate>Sat, 16 Aug 2025 15:28:23 +0800</pubDate>
        
        <guid>https://producthunt.programnotes.cn/en/p/maui/</guid>
        <description>&lt;img src="https://images.unsplash.com/photo-1698665483450-6991335db7f3?ixid=M3w0NjAwMjJ8MHwxfHJhbmRvbXx8fHx8fHx8fDE3NTUzMjkyMDF8&amp;ixlib=rb-4.1.0" alt="Featured image of post maui" /&gt;&lt;h1 id=&#34;dotnetmaui&#34;&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/dotnet/maui&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;dotnet/maui&lt;/a&gt;
&lt;/h1&gt;&lt;h1 id=&#34;net-multi-platform-app-ui-net-maui&#34;&gt;.NET Multi-platform App UI (.NET MAUI)
&lt;/h1&gt;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://dev.azure.com/xamarin/public/_build/latest?definitionId=57&amp;amp;repoName=dotnet%2Fmaui&amp;amp;branchName=main&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;img src=&#34;https://dev.azure.com/xamarin/public/_apis/build/status/MAUI-public?repoName=dotnet%2Fmaui&amp;amp;branchName=main&amp;amp;label=Public&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Build Status&#34;
	
	
&gt;&lt;/a&gt; &lt;a class=&#34;link&#34; href=&#34;https://devdiv.visualstudio.com/DevDiv/_build/latest?definitionId=13330&amp;amp;repoName=dotnet%2Fmaui&amp;amp;branchName=main&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;img src=&#34;https://devdiv.visualstudio.com/DevDiv/_apis/build/status/MAUI?repoName=dotnet%2Fmaui&amp;amp;branchName=main&amp;amp;label=Private&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Build Status&#34;
	
	
&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://dotnet.microsoft.com/en-us/apps/maui&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;.NET Multi-platform App UI (.NET MAUI)&lt;/a&gt; is a cross-platform framework for creating mobile and desktop apps with C# and XAML. Using .NET MAUI, you can develop apps that can run on Android, iOS, iPadOS, macOS, and Windows from a single shared codebase.&lt;/p&gt;
&lt;h2 id=&#34;getting-started&#34;&gt;Getting Started
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://dot.net/maui&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Install .NET MAUI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://docs.microsoft.com/dotnet/maui&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;.NET MAUI Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/dotnet/maui-samples&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;.NET MAUI Samples&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;./.github/DEVELOPMENT.md&#34; &gt;Development Guide&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;overview&#34;&gt;Overview
&lt;/h2&gt;&lt;p&gt;.NET Multi-platform App UI (.NET MAUI) is the evolution of Xamarin.Forms that expand capabilities beyond mobile Android and iOS into desktop apps for Windows and macOS. With .NET MAUI, you can build apps that perform great on any device that runs Windows, macOS, Android, &amp;amp; iOS from a single codebase. Coupled with Visual Studio productivity tools and emulators, .NET and Visual Studio significantly speed up the development process for building apps that target the widest possible set of devices. Use a single development stack that supports the best-of-breed solutions for all modern workloads with a unified SDK, base class libraries, and a toolchain. &lt;a class=&#34;link&#34; href=&#34;https://docs.microsoft.com/dotnet/maui/what-is-maui&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Read More&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://producthunt.programnotes.cn/Assets/maui-weather-hero-sm.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;.NET MAUI Weather App on all platforms&#34;
	
	
&gt;&lt;/p&gt;
&lt;h2 id=&#34;current-news&#34;&gt;Current News
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;2025 - &lt;a class=&#34;link&#34; href=&#34;https://learn.microsoft.com/dotnet/maui/whats-new/dotnet-10&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;What&amp;rsquo;s new in .NET MAUI for .NET 10&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;November 13, 2024 - &lt;a class=&#34;link&#34; href=&#34;https://learn.microsoft.com/dotnet/maui/whats-new/dotnet-9&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;What&amp;rsquo;s new in .NET MAUI for .NET 9&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;November 12, 2024 - &lt;a class=&#34;link&#34; href=&#34;https://devblogs.microsoft.com/dotnet/announcing-dotnet-9/#.net-maui-%e2%80%93-enhancing-multi-platform-app-development&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Announcing .NET 9&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;October 22, 2024 - &lt;a class=&#34;link&#34; href=&#34;https://devblogs.microsoft.com/dotnet/dotnet-maui-welcomes-syncfusion-open-source-contributions/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;.NET MAUI Welcomes Syncfusion Open-source Contributions&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Follow the &lt;a class=&#34;link&#34; href=&#34;https://devblogs.microsoft.com/dotnet/category/net-maui/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;.NET MAUI Blog&lt;/a&gt; and visit the &lt;a class=&#34;link&#34; href=&#34;https://github.com/dotnet/maui/wiki/News&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;News&lt;/a&gt; wiki page for more news and updates.&lt;/p&gt;
&lt;h2 id=&#34;faqs&#34;&gt;FAQs
&lt;/h2&gt;&lt;p&gt;Do you have questions? Do not worry; we have prepared a complete &lt;a class=&#34;link&#34; href=&#34;https://github.com/dotnet/maui/wiki/FAQs&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;FAQ&lt;/a&gt; answering the most common questions.&lt;/p&gt;
&lt;h2 id=&#34;how-to-engage-contribute-and-give-feedback&#34;&gt;How to Engage, Contribute, and Give Feedback
&lt;/h2&gt;&lt;p&gt;Some of the best ways to &lt;a class=&#34;link&#34; href=&#34;./.github/CONTRIBUTING.md&#34; &gt;contribute&lt;/a&gt; are to try things out, file issues, join in design conversations,
and make pull-requests. Proposals for changes specific to MAUI can be found &lt;a class=&#34;link&#34; href=&#34;https://github.com/dotnet/maui/issues&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;here for discussion&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;See &lt;a class=&#34;link&#34; href=&#34;./.github/CONTRIBUTING.md&#34; &gt;CONTRIBUTING&lt;/a&gt;, &lt;a class=&#34;link&#34; href=&#34;./.github/CODE_OF_CONDUCT.md&#34; &gt;CODE-OF-CONDUCT&lt;/a&gt; and the &lt;a class=&#34;link&#34; href=&#34;./.github/DEVELOPMENT.md&#34; &gt;Development Guide&lt;/a&gt;.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>dart_simple_live</title>
        <link>https://producthunt.programnotes.cn/en/p/dart_simple_live/</link>
        <pubDate>Wed, 13 Aug 2025 15:32:42 +0800</pubDate>
        
        <guid>https://producthunt.programnotes.cn/en/p/dart_simple_live/</guid>
        <description>&lt;img src="https://images.unsplash.com/photo-1695453461103-504aad1f6b6d?ixid=M3w0NjAwMjJ8MHwxfHJhbmRvbXx8fHx8fHx8fDE3NTUwNzAyNDF8&amp;ixlib=rb-4.1.0" alt="Featured image of post dart_simple_live" /&gt;&lt;h1 id=&#34;xiaoyaoczdart_&#34;&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/xiaoyaocz/dart_simple_live&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;xiaoyaocz/dart_simple_live&lt;/a&gt;
&lt;/h1&gt;&lt;blockquote&gt;
&lt;h3 id=&#34;-本项目不提供release安装包请自行编译后运行测试&#34;&gt;⚠ 本项目不提供Release安装包，请自行编译后运行测试。
&lt;/h3&gt;&lt;/blockquote&gt;
&lt;p align=&#34;center&#34;&gt;
&lt;/p&gt;
&lt;h2 align=&#34;center&#34;&gt;Simple Live&lt;/h2&gt;
&lt;p align=&#34;center&#34;&gt;
简简单单的看直播
&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://producthunt.programnotes.cn/assets/screenshot_light.jpg&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;浅色模式&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://producthunt.programnotes.cn/assets/screenshot_dark.jpg&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;深色模式&#34;
	
	
&gt;&lt;/p&gt;
&lt;h2 id=&#34;支持直播平台&#34;&gt;支持直播平台：
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;虎牙直播&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;斗鱼直播&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;哔哩哔哩直播&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;抖音直播&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;app支持平台&#34;&gt;APP支持平台
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Android&lt;/li&gt;
&lt;li&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; iOS&lt;/li&gt;
&lt;li&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Windows &lt;code&gt;BETA&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; MacOS &lt;code&gt;BETA&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Linux &lt;code&gt;BETA&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Android TV &lt;code&gt;BETA&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;项目结构&#34;&gt;项目结构
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;simple_live_core&lt;/code&gt; 项目核心库，实现获取各个网站的信息及弹幕。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;simple_live_console&lt;/code&gt; 基于simple_live_core的控制台程序。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;simple_live_app&lt;/code&gt; 基于核心库实现的Flutter APP客户端。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;simple_live_tv_app&lt;/code&gt; 基于核心库实现的Flutter Android TV客户端。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;环境&#34;&gt;环境
&lt;/h2&gt;&lt;p&gt;Flutter : &lt;code&gt;3.22&lt;/code&gt;&lt;/p&gt;
&lt;h2 id=&#34;参考及引用&#34;&gt;参考及引用
&lt;/h2&gt;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/xiaoyaocz/AllLive&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;AllLive&lt;/a&gt; &lt;code&gt;本项目的C#版，有兴趣可以看看&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/xiaoyaocz/dart_tars_protocol.git&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;dart_tars_protocol&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/wbt5/real-url&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;wbt5/real-url&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/lovelyyoshino/Bilibili-Live-API/blob/master/API.WebSocket.md&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;lovelyyoshino/Bilibili-Live-API&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/IsoaSFlus/danmaku&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;IsoaSFlus/danmaku&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/BacooTang/huya-danmu&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;BacooTang/huya-danmu&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/TarsCloud/Tars&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;TarsCloud/Tars&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/YunzhiYike/douyin-live&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;YunzhiYike/douyin-live&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/5ime/Tiktok_Signature&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;5ime/Tiktok_Signature&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;声明&#34;&gt;声明
&lt;/h2&gt;&lt;p&gt;本项目的所有功能都是基于互联网上公开的资料开发，无任何破解、逆向工程等行为。&lt;/p&gt;
&lt;p&gt;本项目仅用于学习交流编程技术，严禁将本项目用于商业目的。如有任何商业行为，均与本项目无关。&lt;/p&gt;
&lt;p&gt;如果本项目存在侵犯您的合法权益的情况，请及时与开发者联系，开发者将会及时删除有关内容。&lt;/p&gt;
</description>
        </item>
        <item>
        <title>swift-composable-architecture</title>
        <link>https://producthunt.programnotes.cn/en/p/swift-composable-architecture/</link>
        <pubDate>Wed, 06 Aug 2025 15:36:43 +0800</pubDate>
        
        <guid>https://producthunt.programnotes.cn/en/p/swift-composable-architecture/</guid>
        <description>&lt;img src="https://images.unsplash.com/photo-1606766986744-38a52a689773?ixid=M3w0NjAwMjJ8MHwxfHJhbmRvbXx8fHx8fHx8fDE3NTQ0NjU3NTF8&amp;ixlib=rb-4.1.0" alt="Featured image of post swift-composable-architecture" /&gt;&lt;h1 id=&#34;pointfreecoswift-composable-architecture&#34;&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/pointfreeco/swift-composable-architecture&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;pointfreeco/swift-composable-architecture&lt;/a&gt;
&lt;/h1&gt;&lt;h1 id=&#34;the-composable-architecture&#34;&gt;The Composable Architecture
&lt;/h1&gt;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://swift.org/download/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;img src=&#34;https://img.shields.io/badge/swift-5.2-ED523F.svg?style=flat&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Swift 5.2&#34;
	
	
&gt;&lt;/a&gt;
&lt;a class=&#34;link&#34; href=&#34;https://swift.org/download/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;img src=&#34;https://img.shields.io/badge/swift-5.1-ED523F.svg?style=flat&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Swift 5.1&#34;
	
	
&gt;&lt;/a&gt;
&lt;a class=&#34;link&#34; href=&#34;https://github.com/pointfreeco/swift-composable-architecture/actions?query=workflow%3ACI&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;img src=&#34;https://github.com/pointfreeco/swift-composable-architecture/workflows/CI/badge.svg&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;CI&#34;
	
	
&gt;&lt;/a&gt;
&lt;a class=&#34;link&#34; href=&#34;https://twitter.com/pointfreeco&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;img src=&#34;https://img.shields.io/badge/contact-@pointfreeco-5AA9E7.svg?style=flat&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;@pointfreeco&#34;
	
	
&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The Composable Architecture is a library for building applications in a consistent and understandable way, with composition, testing, and ergonomics in mind. It can be used in SwiftUI, UIKit, and more, and on any Apple platform (iOS, macOS, tvOS, and watchOS).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#what-is-the-composable-architecture&#34; &gt;What is the Composable Architecture?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#learn-more&#34; &gt;Learn more&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#examples&#34; &gt;Examples&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#basic-usage&#34; &gt;Basic usage&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#supplementary-libraries&#34; &gt;Supplemental libraries&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#faq&#34; &gt;FAQ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#requirements&#34; &gt;Requirements&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#installation&#34; &gt;Installation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#help&#34; &gt;Help&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#credits-and-thanks&#34; &gt;Credits and thanks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#other-libraries&#34; &gt;Other libraries&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;what-is-the-composable-architecture&#34;&gt;What is the Composable Architecture?
&lt;/h2&gt;&lt;p&gt;This library provides a few core tools that can be used to build applications of varying purpose and complexity. It provides compelling stories that you can follow to solve many problems you encounter day-to-day when building applications, such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;State management&lt;/strong&gt;
&lt;br&gt; How to manage the state of your application using simple value types, and share state across many screens so that mutations in one screen can be immediately observed in another screen.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Composition&lt;/strong&gt;
&lt;br&gt; How to break down large features into smaller components that can be extracted to their own, isolated modules and be easily glued back together to form the feature.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Side effects&lt;/strong&gt;
&lt;br&gt; How to let certain parts of the application talk to the outside world in the most testable and understandable way possible.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Testing&lt;/strong&gt;
&lt;br&gt; How to not only test a feature built in the architecture, but also write integration tests for features that have been composed of many parts, and write end-to-end tests to understand how side effects influence your application. This allows you to make strong guarantees that your business logic is running in the way you expect.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Ergonomics&lt;/strong&gt;
&lt;br&gt; How to accomplish all of the above in a simple API with as few concepts and moving parts as possible.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;learn-more&#34;&gt;Learn More
&lt;/h2&gt;&lt;p&gt;The Composable Architecture was designed over the course of many episodes on &lt;a class=&#34;link&#34; href=&#34;https://www.pointfree.co&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Point-Free&lt;/a&gt;, a video series exploring functional programming and the Swift language, hosted by &lt;a class=&#34;link&#34; href=&#34;https://twitter.com/mbrandonw&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Brandon Williams&lt;/a&gt; and &lt;a class=&#34;link&#34; href=&#34;https://twitter.com/stephencelis&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Stephen Celis&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;You can watch all of the episodes &lt;a class=&#34;link&#34; href=&#34;https://www.pointfree.co/collections/composable-architecture&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;here&lt;/a&gt;, as well as a dedicated, multipart tour of the architecture from scratch: &lt;a class=&#34;link&#34; href=&#34;https://www.pointfree.co/collections/composable-architecture/a-tour-of-the-composable-architecture/ep100-a-tour-of-the-composable-architecture-part-1&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;part 1&lt;/a&gt;, &lt;a class=&#34;link&#34; href=&#34;https://www.pointfree.co/collections/composable-architecture/a-tour-of-the-composable-architecture/ep101-a-tour-of-the-composable-architecture-part-2&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;part 2&lt;/a&gt;, &lt;a class=&#34;link&#34; href=&#34;https://www.pointfree.co/collections/composable-architecture/a-tour-of-the-composable-architecture/ep102-a-tour-of-the-composable-architecture-part-3&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;part 3&lt;/a&gt; and &lt;a class=&#34;link&#34; href=&#34;https://www.pointfree.co/collections/composable-architecture/a-tour-of-the-composable-architecture/ep103-a-tour-of-the-composable-architecture-part-4&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;part 4&lt;/a&gt;.&lt;/p&gt;
&lt;a href=&#34;https://www.pointfree.co/collections/composable-architecture&#34;&gt;
  &lt;img alt=&#34;video poster image&#34; src=&#34;https://i.vimeocdn.com/video/850265054.jpg&#34; width=&#34;600&#34;&gt;
&lt;/a&gt;
&lt;h2 id=&#34;examples&#34;&gt;Examples
&lt;/h2&gt;&lt;p&gt;[&lt;/p&gt;
&lt;p&gt;This repo comes with &lt;em&gt;lots&lt;/em&gt; of examples to demonstrate how to solve common and complex problems with the Composable Architecture. Check out &lt;a class=&#34;link&#34; href=&#34;./Examples&#34; &gt;this&lt;/a&gt; directory to see them all, including:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;./Examples/CaseStudies&#34; &gt;Case Studies&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;Getting started&lt;/li&gt;
&lt;li&gt;Effects&lt;/li&gt;
&lt;li&gt;Navigation&lt;/li&gt;
&lt;li&gt;Higher-order reducers&lt;/li&gt;
&lt;li&gt;Reusable components&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;./Examples/LocationManager&#34; &gt;Location manager&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;./Examples/MotionManager&#34; &gt;Motion manager&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;./Examples/Search&#34; &gt;Search&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;./Examples/SpeechRecognition&#34; &gt;Speech Recognition&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;./Examples/TicTacToe&#34; &gt;Tic-Tac-Toe&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;./Examples/Todos&#34; &gt;Todos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;./Examples/VoiceMemos&#34; &gt;Voice memos&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;basic-usage&#34;&gt;Basic Usage
&lt;/h2&gt;&lt;p&gt;To build a feature using the Composable Architecture you define some types and values that model your domain:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;State&lt;/strong&gt;: A type that describes the data your feature needs to perform its logic and render its UI.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Action&lt;/strong&gt;: A type that represents all of the actions that can happen in your feature, such as user actions, notifications, event sources and more.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Environment&lt;/strong&gt;: A type that holds any dependencies the feature needs, such as API clients, analytics clients, etc.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reducer&lt;/strong&gt;: A function that describes how to evolve the current state of the app to the next state given an action. The reducer is also responsible for returning any effects that should be run, such as API requests, which can be done by returning an &lt;code&gt;Effect&lt;/code&gt; value.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Store&lt;/strong&gt;: The runtime that actually drives your feature. You send all user actions to the store so that the store can run the reducer and effects, and you can observe state changes in the store so that you can update UI.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The benefits of doing this is that you will instantly unlock testability of your feature, and you will be able to break large, complex features into smaller domains that can be glued together.&lt;/p&gt;
&lt;p&gt;As a basic example, consider a UI that shows a number along with &amp;ldquo;+&amp;rdquo; and &amp;ldquo;−&amp;rdquo; buttons that increment and decrement the number. To make things interesting, suppose there is also a button that when tapped makes an API request to fetch a random fact about that number and then displays the fact in an alert.&lt;/p&gt;
&lt;p&gt;The state of this feature would consist of an integer for the current count, as well as an optional string that represents the title of the alert we want to show (optional because &lt;code&gt;nil&lt;/code&gt; represents not showing an alert):&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-swift&#34; data-lang=&#34;swift&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;struct&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;AppState&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;Equatable&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;count&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;numberFactAlert&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;?&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Next we have the actions in the feature. There are the obvious actions, such as tapping the decrement button, increment button, or fact button. But there are also some slightly non-obvious ones, such as the action of the user dismissing the alert, and the action that occurs when we receive a response from the fact API request:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-swift&#34; data-lang=&#34;swift&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;enum&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;AppAction&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;Equatable&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;case&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;factAlertDismissed&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;case&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;decrementButtonTapped&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;case&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;incrementButtonTapped&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;case&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;numberFactButtonTapped&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;case&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;numberFactResponse&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Result&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ApiError&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;struct&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;ApiError&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Error&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;Equatable&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Next we model the environment of dependencies this feature needs to do its job. In particular, to fetch a number fact we need to construct an &lt;code&gt;Effect&lt;/code&gt; value that encapsulates the network request. So that dependency is a function from &lt;code&gt;Int&lt;/code&gt; to &lt;code&gt;Effect&amp;lt;String, ApiError&amp;gt;&lt;/code&gt;, where &lt;code&gt;String&lt;/code&gt; represents the response from the request. Further, the effect will typically do its work on a background thread (as is the case with &lt;code&gt;URLSession&lt;/code&gt;), and so we need a way to receive the effect&amp;rsquo;s values on the main queue. We do this via a main queue scheduler, which is a dependency that is important to control so that we can write tests. We must use an &lt;code&gt;AnyScheduler&lt;/code&gt; so that we can use a live &lt;code&gt;DispatchQueue&lt;/code&gt; in production and a test scheduler in tests.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-swift&#34; data-lang=&#34;swift&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;struct&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;AppEnvironment&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;mainQueue&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;AnySchedulerOf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;DispatchQueue&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;numberFact&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;Int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Effect&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ApiError&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Next, we implement a reducer that implements the logic for this domain. It describes how to change the current state to the next state, and describes what effects need to be executed. Some actions don&amp;rsquo;t need to execute effects, and they can return &lt;code&gt;.none&lt;/code&gt; to represent that:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;18
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;19
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;20
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;21
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;22
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;23
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;24
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;25
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;26
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;27
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;28
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;29
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-swift&#34; data-lang=&#34;swift&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;appReducer&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Reducer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;AppState&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;AppAction&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;AppEnvironment&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;state&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;action&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;environment&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;in&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;switch&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;action&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;case&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;factAlertDismissed&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;state&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;numberFactAlert&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;kr&#34;&gt;none&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;case&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;decrementButtonTapped&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;state&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;bp&#34;&gt;count&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;kr&#34;&gt;none&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;case&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;incrementButtonTapped&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;state&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;bp&#34;&gt;count&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;kr&#34;&gt;none&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;case&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;numberFactButtonTapped&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;environment&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;numberFact&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;state&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;bp&#34;&gt;count&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;receive&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;on&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;environment&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;mainQueue&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;catchToEffect&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;bp&#34;&gt;map&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;AppAction&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;numberFactResponse&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;case&lt;/span&gt; &lt;span class=&#34;kd&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;numberFactResponse&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;success&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;fact&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;state&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;numberFactAlert&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;fact&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;kr&#34;&gt;none&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;case&lt;/span&gt; &lt;span class=&#34;kd&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;numberFactResponse&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;failure&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;state&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;numberFactAlert&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;Could not load a number fact :(&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;kr&#34;&gt;none&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;And then finally we define the view that displays the feature. It holds onto a &lt;code&gt;Store&amp;lt;AppState, AppAction&amp;gt;&lt;/code&gt; so that it can observe all changes to the state and re-render, and we can send all user actions to the store so that state changes. We must also introduce a struct wrapper around the fact alert to make it &lt;code&gt;Identifiable&lt;/code&gt;, which the &lt;code&gt;.alert&lt;/code&gt; view modifier requires:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;18
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;19
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;20
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;21
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;22
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;23
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;24
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;25
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;26
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;27
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;28
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;29
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-swift&#34; data-lang=&#34;swift&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;struct&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;AppView&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;View&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;kd&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;store&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Store&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;AppState&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;AppAction&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;body&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;some&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;View&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;WithViewStore&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;self&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;store&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;viewStore&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;in&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;n&#34;&gt;VStack&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;HStack&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          &lt;span class=&#34;n&#34;&gt;Button&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;−&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;viewStore&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;send&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;decrementButtonTapped&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          &lt;span class=&#34;n&#34;&gt;Text&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;\(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;viewStore&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;bp&#34;&gt;count&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          &lt;span class=&#34;n&#34;&gt;Button&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;+&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;viewStore&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;send&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;incrementButtonTapped&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;Button&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Number fact&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;viewStore&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;send&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;numberFactButtonTapped&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;alert&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;item&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;viewStore&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;binding&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          &lt;span class=&#34;kr&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;numberFactAlert&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;bp&#34;&gt;map&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;FactAlert&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;init&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;title&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:))&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          &lt;span class=&#34;n&#34;&gt;send&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;factAlertDismissed&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;content&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Alert&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;title&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Text&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;title&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;struct&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;FactAlert&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Identifiable&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;title&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;String&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;String&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;self&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;title&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;It&amp;rsquo;s important to note that we were able to implement this entire feature without having a real, live effect at hand. This is important because it means features can be built in isolation without building their dependencies, which can help compile times.&lt;/p&gt;
&lt;p&gt;It is also straightforward to have a UIKit controller driven off of this store. You subscribe to the store in &lt;code&gt;viewDidLoad&lt;/code&gt; in order to update the UI and show alerts. The code is a bit longer than the SwiftUI version, so we have collapsed it here:&lt;/p&gt;
&lt;details&gt;
  &lt;summary&gt;Click to expand!&lt;/summary&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;18
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;19
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;20
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;21
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;22
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;23
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;24
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;25
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;26
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;27
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;28
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;29
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;30
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;31
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;32
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;33
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;34
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;35
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;36
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;37
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;38
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;39
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;40
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;41
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;42
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;43
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;44
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;45
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;46
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;47
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;48
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;49
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;50
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;51
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;52
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;53
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;54
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;55
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-swift&#34; data-lang=&#34;swift&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;AppViewController&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;UIViewController&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;kd&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;viewStore&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ViewStore&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;AppState&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;AppAction&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;cancellables&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Set&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;AnyCancellable&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;kd&#34;&gt;init&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;store&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Store&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;AppState&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;AppAction&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kc&#34;&gt;self&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;viewStore&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ViewStore&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;store&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kc&#34;&gt;super&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;init&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;nibName&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;nil&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;bundle&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;nil&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;kr&#34;&gt;required&lt;/span&gt; &lt;span class=&#34;kd&#34;&gt;init&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;?(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;coder&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;NSCoder&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;bp&#34;&gt;fatalError&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;init(coder:) has not been implemented&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;kr&#34;&gt;override&lt;/span&gt; &lt;span class=&#34;kd&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;viewDidLoad&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kc&#34;&gt;super&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;viewDidLoad&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kd&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;countLabel&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;UILabel&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kd&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;incrementButton&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;UIButton&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kd&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;decrementButton&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;UIButton&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kd&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;factButton&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;UIButton&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;// Omitted: Add subviews and set up constraints...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kc&#34;&gt;self&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;viewStore&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;publisher&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;bp&#34;&gt;map&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;\(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;bp&#34;&gt;count&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;assign&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;to&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;\&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;text&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;on&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;countLabel&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;store&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;in&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;self&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;cancellables&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kc&#34;&gt;self&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;viewStore&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;publisher&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;numberFactAlert&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sink&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;kr&#34;&gt;weak&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;self&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;numberFactAlert&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;in&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;kd&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;alertController&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;UIAlertController&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          &lt;span class=&#34;n&#34;&gt;title&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;numberFactAlert&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;message&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;nil&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;preferredStyle&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;alert&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;alertController&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;addAction&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          &lt;span class=&#34;n&#34;&gt;UIAlertAction&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;title&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;Ok&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;style&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;default&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;handler&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;_&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;self&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;?.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;viewStore&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;send&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;factAlertDismissed&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          &lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;kc&#34;&gt;self&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;?.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;present&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;alertController&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;animated&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;completion&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;nil&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;store&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;in&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;self&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;cancellables&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;kr&#34;&gt;@objc&lt;/span&gt; &lt;span class=&#34;kd&#34;&gt;private&lt;/span&gt; &lt;span class=&#34;kd&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;incrementButtonTapped&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kc&#34;&gt;self&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;viewStore&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;send&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;incrementButtonTapped&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;kr&#34;&gt;@objc&lt;/span&gt; &lt;span class=&#34;kd&#34;&gt;private&lt;/span&gt; &lt;span class=&#34;kd&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;decrementButtonTapped&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kc&#34;&gt;self&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;viewStore&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;send&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;decrementButtonTapped&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;kr&#34;&gt;@objc&lt;/span&gt; &lt;span class=&#34;kd&#34;&gt;private&lt;/span&gt; &lt;span class=&#34;kd&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;factButtonTapped&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kc&#34;&gt;self&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;viewStore&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;send&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;numberFactButtonTapped&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/details&gt;
&lt;p&gt;Once we are ready to display this view, for example in the scene delegate, we can construct a store. This is the moment where we need to supply the dependencies, and for now we can just use an effect that immediately returns a mocked string:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-swift&#34; data-lang=&#34;swift&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;appView&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;AppView&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;store&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Store&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;initialState&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;AppState&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;reducer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;appReducer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;environment&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;AppEnvironment&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;n&#34;&gt;mainQueue&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;DispatchQueue&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;eraseToAnyScheduler&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;n&#34;&gt;numberFact&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;number&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Effect&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;\(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;number&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;s&#34;&gt; is a good number Brent&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;And that is enough to get something on the screen to play around with. It&amp;rsquo;s definitely a few more steps than if you were to do this in a vanilla SwiftUI way, but there are a few benefits. It gives us a consistent manner to apply state mutations, instead of scattering logic in some observable objects and in various action closures of UI components. It also gives us a concise way of expressing side effects. And we can immediately test this logic, including the effects, without doing much additional work.&lt;/p&gt;
&lt;h3 id=&#34;testing&#34;&gt;Testing
&lt;/h3&gt;&lt;p&gt;To test, you first create a &lt;code&gt;TestStore&lt;/code&gt; with the same information that you would to create a regular &lt;code&gt;Store&lt;/code&gt;, except this time we can supply test-friendly dependencies. In particular, we use a test scheduler instead of the live &lt;code&gt;DispatchQueue.main&lt;/code&gt; scheduler because that allows us to control when work is executed, and we don&amp;rsquo;t have to artificially wait for queues to catch up.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-swift&#34; data-lang=&#34;swift&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;scheduler&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;DispatchQueue&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;testScheduler&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;store&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;TestStore&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;initialState&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;AppState&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;reducer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;appReducer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;environment&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;AppEnvironment&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;mainQueue&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;scheduler&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;eraseToAnyScheduler&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;numberFact&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;number&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Effect&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;\(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;number&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;s&#34;&gt; is a good number Brent&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Once the test store is created we can use it to make an assertion of an entire user flow of steps. Each step of the way we need to prove that state changed how we expect. Further, if a step causes an effect to be executed, which feeds data back into the store, we must assert that those actions were received properly.&lt;/p&gt;
&lt;p&gt;The test below has the user increment and decrement the count, then they ask for a number fact, and the response of that effect triggers an alert to be shown, and then dismissing the alert causes the alert to go away.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;18
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;19
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;20
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;21
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;22
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-swift&#34; data-lang=&#34;swift&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;store&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;bp&#34;&gt;assert&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;c1&#34;&gt;// Test that tapping on the increment/decrement buttons changes the count&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;send&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;incrementButtonTapped&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nv&#34;&gt;$0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;bp&#34;&gt;count&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;send&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;decrementButtonTapped&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nv&#34;&gt;$0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;bp&#34;&gt;count&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;c1&#34;&gt;// Test that tapping the fact button causes us to receive a response from the effect. Note&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;c1&#34;&gt;// that we have to advance the scheduler because we used `.receive(on:)` in the reducer.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;send&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;numberFactButtonTapped&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;do&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;scheduler&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;bp&#34;&gt;advance&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;receive&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;numberFactResponse&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;success&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;0 is a good number Brent&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)))&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nv&#34;&gt;$0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;numberFactAlert&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;0 is a good number Brent&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;c1&#34;&gt;// And finally dismiss the alert&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;send&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;factAlertDismissed&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nv&#34;&gt;$0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;numberFactAlert&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;That is the basics of building and testing a feature in the Composable Architecture. There are &lt;em&gt;a lot&lt;/em&gt; more things to be explored, such as composition, modularity, adaptability, and complex effects. The &lt;a class=&#34;link&#34; href=&#34;./Examples&#34; &gt;Examples&lt;/a&gt; directory has a bunch of projects to explore to see more advanced usages.&lt;/p&gt;
&lt;h3 id=&#34;debugging&#34;&gt;Debugging
&lt;/h3&gt;&lt;p&gt;The Composable Architecture comes with a number of tools to aid in debugging.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;reducer.debug()&lt;/code&gt; enhances a reducer with debug-printing that describes every action the reducer receives and every mutation it makes to state.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;18
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;19
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;20
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;21
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;22
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;23
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;24
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-diff&#34; data-lang=&#34;diff&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;received action:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  AppAction.todoCheckboxTapped(
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    index: 0
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  )
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  AppState(
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    todos: [
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      Todo(
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;gd&#34;&gt;-       isComplete: false,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;gi&#34;&gt;+       isComplete: true,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        description: &amp;#34;Milk&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        id: 5834811A-83B4-4E5E-BCD3-8A38F6BDCA90
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      ),
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      Todo(
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        isComplete: false,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        description: &amp;#34;Eggs&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        id: AB3C7921-8262-4412-AA93-9DC5575C1107
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      ),
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      Todo(
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        isComplete: true,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        description: &amp;#34;Hand Soap&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        id: 06E94D88-D726-42EF-BA8B-7B4478179D19
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      ),
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    ]
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  )
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;reducer.signpost()&lt;/code&gt; instruments a reducer with signposts so that you can gain insight into how long actions take to execute, and when effects are running.&lt;/p&gt;
  &lt;img src=&#34;https://s3.amazonaws.com/pointfreeco-production/point-free-pointers/0044-signposts-cover.jpg&#34; width=&#34;600&#34;&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;supplementary-libraries&#34;&gt;Supplementary libraries
&lt;/h2&gt;&lt;p&gt;One of the most important principles of the Composable Architecture is that side effects are never performed directly, but instead are wrapped in the &lt;code&gt;Effect&lt;/code&gt; type, returned from reducers, and then the &lt;code&gt;Store&lt;/code&gt; later performs the effect. This is crucial for simplifying how data flows through an application, and for gaining testability on the full end-to-end cycle of user action to effect execution.&lt;/p&gt;
&lt;p&gt;However, this also means that many libraries and SDKs you interact with on a daily basis need to be retrofitted to be a little more friendly to the Composable Architecture style. That&amp;rsquo;s why we&amp;rsquo;d like to ease the pain of using some of Apple&amp;rsquo;s most popular frameworks by providing wrapper libraries that expose their functionality in a way that plays nicely with our library. So far we support:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;./Sources/ComposableCoreLocation/&#34; &gt;&lt;code&gt;ComposableCoreLocation&lt;/code&gt;&lt;/a&gt;: A wrapper around &lt;code&gt;CLLocationManager&lt;/code&gt; that makes it easy to use from a reducer, and easy to write tests for how your logic interacts with &lt;code&gt;CLLocationManager&lt;/code&gt;&amp;rsquo;s functionality.&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;./Sources/ComposableCoreMotion/&#34; &gt;&lt;code&gt;ComposableCoreMotion&lt;/code&gt;&lt;/a&gt;: A wrapper around &lt;code&gt;CMMotionManager&lt;/code&gt; that makes it easy to use from a reducer, and easy to write tests for how your logic interacts with &lt;code&gt;CMMotionaMansger&lt;/code&gt;&amp;rsquo;s functionality.&lt;/li&gt;
&lt;li&gt;More to come soon. Keep an eye out 😉&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you are interested in contributing a wrapper library for a framework that we have not yet covered, feel free to open an issue expressing your interest so that we can discuss a path forward.&lt;/p&gt;
&lt;h2 id=&#34;faq&#34;&gt;FAQ
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;How does the Composable Architecture compare to Elm, Redux, and others?&lt;/p&gt;
&lt;details&gt;
  &lt;summary&gt;Expand to see answer&lt;/summary&gt;
  The Composable Architecture (TCA) is built on a foundation of ideas popularized by Elm and Redux, but made to feel at home in the Swift language and on Apple&#39;s platforms.
&lt;p&gt;In some ways TCA is a little more opinionated than the other libraries. For example, Redux is not prescriptive with how one executes side effects, but TCA requires all side effects to be modeled in the &lt;code&gt;Effect&lt;/code&gt; type and returned from the reducer.&lt;/p&gt;
&lt;p&gt;In other ways TCA is a little more lax than the other libraries. For example, Elm controls what kinds of effects can be created via the &lt;code&gt;Cmd&lt;/code&gt; type, but TCA allows an escape hatch to any kind of effect since &lt;code&gt;Effect&lt;/code&gt; conforms to the Combine &lt;code&gt;Publisher&lt;/code&gt; protocol.&lt;/p&gt;
&lt;p&gt;And then there are certain things that TCA prioritizes highly that are not points of focus for Redux, Elm, or most other libraries. For example, composition is very important aspect of TCA, which is the process of breaking down large features into smaller units that can be glued together. This is accomplished with the &lt;code&gt;pullback&lt;/code&gt; and &lt;code&gt;combine&lt;/code&gt; operators on reducers, and it aids in handling complex features as well as modularization for a better-isolated code base and improved compile times.&lt;/p&gt;
&lt;/details&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Why isn&amp;rsquo;t &lt;code&gt;Store&lt;/code&gt; thread-safe? &lt;br&gt; Why isn&amp;rsquo;t &lt;code&gt;send&lt;/code&gt; queued? &lt;br&gt; Why isn&amp;rsquo;t &lt;code&gt;send&lt;/code&gt; run on the main thread?&lt;/p&gt;
&lt;details&gt;
  &lt;summary&gt;Expand to see answer&lt;/summary&gt;
&lt;p&gt;When an action is sent to the &lt;code&gt;Store&lt;/code&gt;, a reducer is run on the current state, and this process cannot be done from multiple threads. A possible work around is to use a queue in &lt;code&gt;send&lt;/code&gt;s implementation, but this introduces a few new complications:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;If done simply with &lt;code&gt;DispatchQueue.main.async&lt;/code&gt; you will incur a thread hop even when you are already on the main thread. This can lead to unexpected behavior in UIKit and SwiftUI, where sometimes you are required to do work synchronously, such as in animation blocks.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It is possible to create a scheduler that performs its work immediately when on the main thread and otherwise uses &lt;code&gt;DispatchQueue.main.async&lt;/code&gt; (&lt;em&gt;e.g.&lt;/em&gt; see ReactiveSwift&amp;rsquo;s &lt;a class=&#34;link&#34; href=&#34;https://github.com/ReactiveCocoa/ReactiveSwift/blob/f97db218c0236b0c6ef74d32adb3d578792969c0/Sources/Scheduler.swift&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;code&gt;UIScheduler&lt;/code&gt;&lt;/a&gt;). This introduces a lot more complexity, and should probably not be adopted without having a very good reason.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;At the end of the day, we require &lt;code&gt;Store&lt;/code&gt; to be used in much the same way that you interact with Apple&amp;rsquo;s APIs. Just as &lt;code&gt;URLSession&lt;/code&gt; delivers its results on a background thread, thus making you responsible for dispatching back to the main thread, the Composable Architecture makes you responsible for making sure to send actions on the main thread. If you are using an effect that may deliver its output on a non-main thread, you must explicitly perform &lt;code&gt;.receive(on:)&lt;/code&gt; in order to force it back on the main thread.&lt;/p&gt;
&lt;p&gt;This approach makes the fewest number of assumptions about how effects are created and transformed, and prevents unnecessary thread hops and re-dispatching. It also provides some testing benefits. If your effects are not responsible for their own scheduling, then in tests all of the effects would run synchronously and immediately. You would not be able to test how multiple in-flight effects interleave with each other and affect the state of your application. However, by leaving scheduling out of the &lt;code&gt;Store&lt;/code&gt; we get to test these aspects of our effects if we so desire, or we can ignore if we prefer. We have that flexibility.&lt;/p&gt;
&lt;p&gt;However, if you are still not a fan of our choice, then never fear! The Composable Architecture is flexible enough to allow you to introduce this functionality yourself if you so desire. It is possible to create a higher-order reducer that can force all effects to deliver their output on the main thread, regardless of where the effect does its work:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-swift&#34; data-lang=&#34;swift&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;extension&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Reducer&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;kd&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;receive&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;S&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Scheduler&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;on&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;scheduler&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;S&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;Self&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kc&#34;&gt;Self&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;state&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;action&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;environment&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;in&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;kc&#34;&gt;self&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&amp;amp;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;state&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;action&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;environment&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;receive&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;on&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;scheduler&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;eraseToEffect&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;You would probably still want something like a &lt;code&gt;UIScheduler&lt;/code&gt; so that you don&amp;rsquo;t needlessly perform thread hops.&lt;/p&gt;
&lt;/details&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;requirements&#34;&gt;Requirements
&lt;/h2&gt;&lt;p&gt;The Composable Architecture depends on the Combine framework, so it requires minimum deployment targets of iOS 13, macOS 10.15, Mac Catalyst 13, tvOS 13, and watchOS 6. If your application must support older OSes, there are forks for &lt;a class=&#34;link&#34; href=&#34;https://github.com/trading-point/reactiveswift-composable-architecture&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;ReactiveSwift&lt;/a&gt; and &lt;a class=&#34;link&#34; href=&#34;https://github.com/dannyhertz/rxswift-composable-architecture&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;RxSwift&lt;/a&gt; that you can adopt!&lt;/p&gt;
&lt;h2 id=&#34;installation&#34;&gt;Installation
&lt;/h2&gt;&lt;p&gt;You can add ComposableArchitecture to an Xcode project by adding it as a package dependency.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;From the &lt;strong&gt;File&lt;/strong&gt; menu, select &lt;strong&gt;Swift Packages › Add Package Dependency…&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Enter &amp;ldquo;&lt;a class=&#34;link&#34; href=&#34;https://github.com/pointfreeco/swift-composable-architecture%22&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/pointfreeco/swift-composable-architecture&#34;&lt;/a&gt; into the package repository URL text field&lt;/li&gt;
&lt;li&gt;Depending on how your project is structured:
&lt;ul&gt;
&lt;li&gt;If you have a single application target that needs access to the library, then add &lt;strong&gt;ComposableArchitecture&lt;/strong&gt; directly to your application.&lt;/li&gt;
&lt;li&gt;If you want to use this library from multiple targets you must create a shared framework that depends on &lt;strong&gt;ComposableArchitecture&lt;/strong&gt; and then depend on that framework in all of your targets. For an example of this, check out the &lt;a class=&#34;link&#34; href=&#34;./Examples/TicTacToe&#34; &gt;Tic-Tac-Toe&lt;/a&gt; demo application, which splits lots of features into modules and consumes the static library in this fashion using the &lt;strong&gt;TicTacToeCommon&lt;/strong&gt; framework.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;help&#34;&gt;Help
&lt;/h2&gt;&lt;p&gt;If you want to discuss the Composable Architecture or have a question about how to use it to solve a particular problem, ask around on &lt;a class=&#34;link&#34; href=&#34;https://forums.swift.org/c/related-projects/swift-composable-architecture&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;its Swift forum&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;credits-and-thanks&#34;&gt;Credits and thanks
&lt;/h2&gt;&lt;p&gt;The following people gave feedback on the library at its early stages and helped make the library what it is today:&lt;/p&gt;
&lt;p&gt;Paul Colton, Kaan Dedeoglu, Matt Diephouse, Josef Doležal, Eimantas, Matthew Johnson, George Kaimakas, Nikita Leonov, Christopher Liscio, Jeffrey Macko, Alejandro Martinez, Shai Mishali, Willis Plummer, Simon-Pierre Roy, Justin Price, Sven A. Schmidt, Kyle Sherman, Petr Šíma, Jasdev Singh, Maxim Smirnov, Ryan Stone, Daniel Hollis Tavares, and all of the &lt;a class=&#34;link&#34; href=&#34;https://www.pointfree.co&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Point-Free&lt;/a&gt; subscribers 😁.&lt;/p&gt;
&lt;p&gt;Special thanks to &lt;a class=&#34;link&#34; href=&#34;https://twitter.com/liscio&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Chris Liscio&lt;/a&gt; who helped us work through many strange SwiftUI quirks and helped refine the final API.&lt;/p&gt;
&lt;p&gt;And thanks to &lt;a class=&#34;link&#34; href=&#34;https://github.com/freak4pc&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Shai Mishali&lt;/a&gt; and the &lt;a class=&#34;link&#34; href=&#34;https://github.com/CombineCommunity/CombineExt/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;CombineCommunity&lt;/a&gt; project, from which we took their implementation of &lt;code&gt;Publishers.Create&lt;/code&gt;, which we use in &lt;code&gt;Effect&lt;/code&gt; to help bridge delegate and callback-based APIs, making it much easier to interface with 3rd party frameworks.&lt;/p&gt;
&lt;h2 id=&#34;other-libraries&#34;&gt;Other libraries
&lt;/h2&gt;&lt;p&gt;The Composable Architecture was built on a foundation of ideas started by other libraries, in particular &lt;a class=&#34;link&#34; href=&#34;https://elm-lang.org&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Elm&lt;/a&gt; and &lt;a class=&#34;link&#34; href=&#34;https://redux.js.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Redux&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;There are also many architecture libraries in the Swift and iOS community. Each one of these has their own set of priorities and trade-offs that differ from the Composable Architecture.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/uber/RIBs&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;RIBs&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/ReactiveCocoa/Loop&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Loop&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/ReSwift/ReSwift&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;ReSwift&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/square/workflow&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Workflow&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/ReactorKit/ReactorKit&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;ReactorKit&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/NoTests/RxFeedback.swift&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;RxFeedback&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/spotify/mobius.swift&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Mobius.swift&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;details&gt;
&lt;summary&gt;And more&lt;/summary&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/RPallas92/PromisedArchitectureKit&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;PromisedArchitectureKit&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;license&#34;&gt;License
&lt;/h2&gt;&lt;p&gt;This library is released under the MIT license. See &lt;a class=&#34;link&#34; href=&#34;LICENSE&#34; &gt;LICENSE&lt;/a&gt; for details.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>NextChat</title>
        <link>https://producthunt.programnotes.cn/en/p/nextchat/</link>
        <pubDate>Wed, 23 Jul 2025 15:34:21 +0800</pubDate>
        
        <guid>https://producthunt.programnotes.cn/en/p/nextchat/</guid>
        <description>&lt;img src="https://images.unsplash.com/photo-1644381348384-da4f9a7b4c5f?ixid=M3w0NjAwMjJ8MHwxfHJhbmRvbXx8fHx8fHx8fDE3NTMyNTYwMTZ8&amp;ixlib=rb-4.1.0" alt="Featured image of post NextChat" /&gt;&lt;h1 id=&#34;chatgptnextwebnextchat&#34;&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/ChatGPTNextWeb/NextChat&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;ChatGPTNextWeb/NextChat&lt;/a&gt;
&lt;/h1&gt;&lt;div align=&#34;center&#34;&gt;
&lt;a href=&#39;https://nextchat.club&#39;&gt;
  &lt;img src=&#34;https://github.com/user-attachments/assets/83bdcc07-ae5e-4954-a53a-ac151ba6ccf3&#34; width=&#34;1000&#34; alt=&#34;icon&#34;/&gt;
&lt;/a&gt;
&lt;h1 align=&#34;center&#34;&gt;NextChat&lt;/h1&gt;
&lt;p&gt;English / &lt;a class=&#34;link&#34; href=&#34;./README_CN.md&#34; &gt;简体中文&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://trendshift.io/repositories/5973&#34; target=&#34;_blank&#34;&gt;&lt;img src=&#34;https://trendshift.io/api/badge/repositories/5973&#34; alt=&#34;ChatGPTNextWeb%2FChatGPT-Next-Web | Trendshift&#34; style=&#34;width: 250px; height: 55px;&#34; width=&#34;250&#34; height=&#34;55&#34;/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;✨ Light and Fast AI Assistant,with Claude, DeepSeek, GPT4 &amp;amp; Gemini Pro support.&lt;/p&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://nextchat.club?utm_source=readme&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;img src=&#34;https://img.shields.io/badge/NextChat-Saas-green?logo=microsoftedge&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Saas&#34;
	
	
&gt;&lt;/a&gt;
&lt;a class=&#34;link&#34; href=&#34;https://app.nextchat.club/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;img src=&#34;https://img.shields.io/badge/Web-PWA-orange?logo=microsoftedge&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Web&#34;
	
	
&gt;&lt;/a&gt;
&lt;a class=&#34;link&#34; href=&#34;https://github.com/Yidadaa/ChatGPT-Next-Web/releases&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;img src=&#34;https://img.shields.io/badge/-Windows-blue?logo=windows&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Windows&#34;
	
	
&gt;&lt;/a&gt;
&lt;a class=&#34;link&#34; href=&#34;https://github.com/Yidadaa/ChatGPT-Next-Web/releases&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;img src=&#34;https://img.shields.io/badge/-MacOS-black?logo=apple&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;MacOS&#34;
	
	
&gt;&lt;/a&gt;
&lt;a class=&#34;link&#34; href=&#34;https://github.com/Yidadaa/ChatGPT-Next-Web/releases&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;img src=&#34;https://img.shields.io/badge/-Linux-333?logo=ubuntu&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Linux&#34;
	
	
&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://nextchat.club?utm_source=readme&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;NextChatAI&lt;/a&gt; / &lt;a class=&#34;link&#34; href=&#34;https://apps.apple.com/us/app/nextchat-ai/id6743085599&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;iOS APP&lt;/a&gt; / &lt;a class=&#34;link&#34; href=&#34;https://app.nextchat.club&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Web App Demo&lt;/a&gt; / &lt;a class=&#34;link&#34; href=&#34;https://github.com/Yidadaa/ChatGPT-Next-Web/releases&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Desktop App&lt;/a&gt; / &lt;a class=&#34;link&#34; href=&#34;#enterprise-edition&#34; &gt;Enterprise Edition&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://zeabur.com/templates/ZBUEFA&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;img src=&#34;https://zeabur.com/button.svg&#34; alt=&#34;Deploy on Zeabur&#34; height=&#34;30&#34;&gt;&lt;/a&gt; &lt;a class=&#34;link&#34; href=&#34;https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2FChatGPTNextWeb%2FChatGPT-Next-Web&amp;amp;env=OPENAI_API_KEY&amp;amp;env=CODE&amp;amp;project-name=nextchat&amp;amp;repository-name=NextChat&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;img src=&#34;https://vercel.com/button&#34; alt=&#34;Deploy on Vercel&#34; height=&#34;30&#34;&gt;&lt;/a&gt; &lt;a class=&#34;link&#34; href=&#34;https://gitpod.io/#https://github.com/ChatGPTNextWeb/NextChat&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;img src=&#34;https://gitpod.io/button/open-in-gitpod.svg&#34; alt=&#34;Open in Gitpod&#34; height=&#34;30&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://monica.im/?utm=nxcrp&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;img src=&#34;https://github.com/user-attachments/assets/903482d4-3e87-4134-9af1-f2588fa90659&#34; height=&#34;50&#34; width=&#34;&#34; &gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;h2 id=&#34;-sponsor-ai-api&#34;&gt;❤️ Sponsor AI API
&lt;/h2&gt;&lt;a href=&#39;https://302.ai/&#39;&gt;
  &lt;img src=&#34;https://github.com/user-attachments/assets/a03edf82-2031-4f23-bdb8-bfc0bfd168a4&#34; width=&#34;100%&#34; alt=&#34;icon&#34;/&gt;
&lt;/a&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://302.ai/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;302.AI&lt;/a&gt; is a pay-as-you-go AI application platform that offers the most comprehensive AI APIs and online applications available.&lt;/p&gt;
&lt;h2 id=&#34;-cheer-for-nextchat-ios-version-online&#34;&gt;🥳 Cheer for NextChat iOS Version Online!
&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://apps.apple.com/us/app/nextchat-ai/id6743085599&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;👉 Click Here to Install Now&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/ChatGPTNextWeb/NextChat-iOS&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;❤️ Source Code Coming Soon&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&#34;https://github.com/user-attachments/assets/e0aa334f-4c13-4dc9-8310-e3b09fa4b9f3&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Github iOS Image&#34;
	
	
&gt;&lt;/p&gt;
&lt;h2 id=&#34;-nextchat-support-mcp-&#34;&gt;🫣 NextChat Support MCP !
&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;Before build, please set env ENABLE_MCP=true&lt;/p&gt;
&lt;/blockquote&gt;
&lt;img src=&#34;https://github.com/user-attachments/assets/d8851f40-4e36-4335-b1a4-ec1e11488c7e&#34;/&gt;
&lt;h2 id=&#34;enterprise-edition&#34;&gt;Enterprise Edition
&lt;/h2&gt;&lt;p&gt;Meeting Your Company&amp;rsquo;s Privatization and Customization Deployment Requirements:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Brand Customization&lt;/strong&gt;: Tailored VI/UI to seamlessly align with your corporate brand image.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Resource Integration&lt;/strong&gt;: Unified configuration and management of dozens of AI resources by company administrators, ready for use by team members.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Permission Control&lt;/strong&gt;: Clearly defined member permissions, resource permissions, and knowledge base permissions, all controlled via a corporate-grade Admin Panel.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Knowledge Integration&lt;/strong&gt;: Combining your internal knowledge base with AI capabilities, making it more relevant to your company&amp;rsquo;s specific business needs compared to general AI.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Security Auditing&lt;/strong&gt;: Automatically intercept sensitive inquiries and trace all historical conversation records, ensuring AI adherence to corporate information security standards.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Private Deployment&lt;/strong&gt;: Enterprise-level private deployment supporting various mainstream private cloud solutions, ensuring data security and privacy protection.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Continuous Updates&lt;/strong&gt;: Ongoing updates and upgrades in cutting-edge capabilities like multimodal AI, ensuring consistent innovation and advancement.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For enterprise inquiries, please contact: &lt;strong&gt;&lt;a class=&#34;link&#34; href=&#34;mailto:business@nextchat.dev&#34; &gt;business@nextchat.dev&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&#34;screenshots&#34;&gt;Screenshots
&lt;/h2&gt;&lt;h2 id=&#34;features&#34;&gt;Features
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Deploy for free with one-click&lt;/strong&gt; on Vercel in under 1 minute&lt;/li&gt;
&lt;li&gt;Compact client (~5MB) on Linux/Windows/MacOS, &lt;a class=&#34;link&#34; href=&#34;https://github.com/Yidadaa/ChatGPT-Next-Web/releases&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;download it now&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Fully compatible with self-deployed LLMs, recommended for use with &lt;a class=&#34;link&#34; href=&#34;https://github.com/josStorer/RWKV-Runner&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;RWKV-Runner&lt;/a&gt; or &lt;a class=&#34;link&#34; href=&#34;https://github.com/go-skynet/LocalAI&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;LocalAI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Privacy first, all data is stored locally in the browser&lt;/li&gt;
&lt;li&gt;Markdown support: LaTex, mermaid, code highlight, etc.&lt;/li&gt;
&lt;li&gt;Responsive design, dark mode and PWA&lt;/li&gt;
&lt;li&gt;Fast first screen loading speed (~100kb), support streaming response&lt;/li&gt;
&lt;li&gt;New in v2: create, share and debug your chat tools with prompt templates (mask)&lt;/li&gt;
&lt;li&gt;Awesome prompts powered by &lt;a class=&#34;link&#34; href=&#34;https://github.com/PlexPt/awesome-chatgpt-prompts-zh&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;awesome-chatgpt-prompts-zh&lt;/a&gt; and &lt;a class=&#34;link&#34; href=&#34;https://github.com/f/awesome-chatgpt-prompts&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;awesome-chatgpt-prompts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Automatically compresses chat history to support long conversations while also saving your tokens&lt;/li&gt;
&lt;li&gt;I18n: English, 简体中文, 繁体中文, 日本語, Français, Español, Italiano, Türkçe, Deutsch, Tiếng Việt, Русский, Čeština, 한국어, Indonesia&lt;/li&gt;
&lt;/ul&gt;
&lt;div align=&#34;center&#34;&gt;
&lt;/div&gt;
&lt;h2 id=&#34;roadmap&#34;&gt;Roadmap
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; System Prompt: pin a user defined prompt as system prompt &lt;a class=&#34;link&#34; href=&#34;https://github.com/Yidadaa/ChatGPT-Next-Web/issues/138&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;#138&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; User Prompt: user can edit and save custom prompts to prompt list&lt;/li&gt;
&lt;li&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Prompt Template: create a new chat with pre-defined in-context prompts &lt;a class=&#34;link&#34; href=&#34;https://github.com/Yidadaa/ChatGPT-Next-Web/issues/993&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;#993&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Share as image, share to ShareGPT &lt;a class=&#34;link&#34; href=&#34;https://github.com/Yidadaa/ChatGPT-Next-Web/pull/1741&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;#1741&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Desktop App with tauri&lt;/li&gt;
&lt;li&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Self-host Model: Fully compatible with &lt;a class=&#34;link&#34; href=&#34;https://github.com/josStorer/RWKV-Runner&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;RWKV-Runner&lt;/a&gt;, as well as server deployment of &lt;a class=&#34;link&#34; href=&#34;https://github.com/go-skynet/LocalAI&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;LocalAI&lt;/a&gt;: llama/gpt4all/rwkv/vicuna/koala/gpt4all-j/cerebras/falcon/dolly etc.&lt;/li&gt;
&lt;li&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Artifacts: Easily preview, copy and share generated content/webpages through a separate window &lt;a class=&#34;link&#34; href=&#34;https://github.com/ChatGPTNextWeb/ChatGPT-Next-Web/pull/5092&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;#5092&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Plugins: support network search, calculator, any other apis etc. &lt;a class=&#34;link&#34; href=&#34;https://github.com/Yidadaa/ChatGPT-Next-Web/issues/165&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;#165&lt;/a&gt; &lt;a class=&#34;link&#34; href=&#34;https://github.com/ChatGPTNextWeb/ChatGPT-Next-Web/issues/5353&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;#5353&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; network search, calculator, any other apis etc. &lt;a class=&#34;link&#34; href=&#34;https://github.com/Yidadaa/ChatGPT-Next-Web/issues/165&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;#165&lt;/a&gt; &lt;a class=&#34;link&#34; href=&#34;https://github.com/ChatGPTNextWeb/ChatGPT-Next-Web/issues/5353&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;#5353&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Supports Realtime Chat &lt;a class=&#34;link&#34; href=&#34;https://github.com/ChatGPTNextWeb/ChatGPT-Next-Web/issues/5672&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;#5672&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; local knowledge base&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;whats-new&#34;&gt;What&amp;rsquo;s New
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;🚀 v2.15.8 Now supports Realtime Chat &lt;a class=&#34;link&#34; href=&#34;https://github.com/ChatGPTNextWeb/ChatGPT-Next-Web/issues/5672&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;#5672&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;🚀 v2.15.4 The Application supports using Tauri fetch LLM API, MORE SECURITY! &lt;a class=&#34;link&#34; href=&#34;https://github.com/ChatGPTNextWeb/ChatGPT-Next-Web/issues/5379&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;#5379&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;🚀 v2.15.0 Now supports Plugins! Read this: &lt;a class=&#34;link&#34; href=&#34;https://github.com/ChatGPTNextWeb/NextChat-Awesome-Plugins&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;NextChat-Awesome-Plugins&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;🚀 v2.14.0 Now supports Artifacts &amp;amp; SD&lt;/li&gt;
&lt;li&gt;🚀 v2.10.1 support Google Gemini Pro model.&lt;/li&gt;
&lt;li&gt;🚀 v2.9.11 you can use azure endpoint now.&lt;/li&gt;
&lt;li&gt;🚀 v2.8 now we have a client that runs across all platforms!&lt;/li&gt;
&lt;li&gt;🚀 v2.7 let&amp;rsquo;s share conversations as image, or share to ShareGPT!&lt;/li&gt;
&lt;li&gt;🚀 v2.0 is released, now you can create prompt templates, turn your ideas into reality! Read this: &lt;a class=&#34;link&#34; href=&#34;https://www.allabtai.com/prompt-engineering-tips-zero-one-and-few-shot-prompting/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;ChatGPT Prompt Engineering Tips: Zero, One and Few Shot Prompting&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;get-started&#34;&gt;Get Started
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;Get &lt;a class=&#34;link&#34; href=&#34;https://platform.openai.com/account/api-keys&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;OpenAI API Key&lt;/a&gt;;&lt;/li&gt;
&lt;li&gt;Click
&lt;a class=&#34;link&#34; href=&#34;https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2FYidadaa%2FChatGPT-Next-Web&amp;amp;env=OPENAI_API_KEY&amp;amp;env=CODE&amp;amp;project-name=chatgpt-next-web&amp;amp;repository-name=ChatGPT-Next-Web&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;img src=&#34;https://vercel.com/button&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Deploy with Vercel&#34;
	
	
&gt;&lt;/a&gt;, remember that &lt;code&gt;CODE&lt;/code&gt; is your page password;&lt;/li&gt;
&lt;li&gt;Enjoy :)&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;faq&#34;&gt;FAQ
&lt;/h2&gt;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;./docs/faq-en.md&#34; &gt;English &amp;gt; FAQ&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;keep-updated&#34;&gt;Keep Updated
&lt;/h2&gt;&lt;p&gt;If you have deployed your own project with just one click following the steps above, you may encounter the issue of &amp;ldquo;Updates Available&amp;rdquo; constantly showing up. This is because Vercel will create a new project for you by default instead of forking this project, resulting in the inability to detect updates correctly.&lt;/p&gt;
&lt;p&gt;We recommend that you follow the steps below to re-deploy:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Delete the original repository;&lt;/li&gt;
&lt;li&gt;Use the fork button in the upper right corner of the page to fork this project;&lt;/li&gt;
&lt;li&gt;Choose and deploy in Vercel again, &lt;a class=&#34;link&#34; href=&#34;./docs/vercel-cn.md&#34; &gt;please see the detailed tutorial&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;enable-automatic-updates&#34;&gt;Enable Automatic Updates
&lt;/h3&gt;&lt;blockquote&gt;
&lt;p&gt;If you encounter a failure of Upstream Sync execution, please &lt;a class=&#34;link&#34; href=&#34;./README.md#manually-updating-code&#34; &gt;manually update code&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;After forking the project, due to the limitations imposed by GitHub, you need to manually enable Workflows and Upstream Sync Action on the Actions page of the forked project. Once enabled, automatic updates will be scheduled every hour:&lt;/p&gt;
&lt;h3 id=&#34;manually-updating-code&#34;&gt;Manually Updating Code
&lt;/h3&gt;&lt;p&gt;If you want to update instantly, you can check out the &lt;a class=&#34;link&#34; href=&#34;https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/working-with-forks/syncing-a-fork&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;GitHub documentation&lt;/a&gt; to learn how to synchronize a forked project with upstream code.&lt;/p&gt;
&lt;p&gt;You can star or watch this project or follow author to get release notifications in time.&lt;/p&gt;
&lt;h2 id=&#34;access-password&#34;&gt;Access Password
&lt;/h2&gt;&lt;p&gt;This project provides limited access control. Please add an environment variable named &lt;code&gt;CODE&lt;/code&gt; on the vercel environment variables page. The value should be passwords separated by comma like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;code1,code2,code3
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;After adding or modifying this environment variable, please redeploy the project for the changes to take effect.&lt;/p&gt;
&lt;h2 id=&#34;environment-variables&#34;&gt;Environment Variables
&lt;/h2&gt;&lt;h3 id=&#34;code-optional&#34;&gt;&lt;code&gt;CODE&lt;/code&gt; (optional)
&lt;/h3&gt;&lt;p&gt;Access password, separated by comma.&lt;/p&gt;
&lt;h3 id=&#34;openai_api_key-required&#34;&gt;&lt;code&gt;OPENAI_API_KEY&lt;/code&gt; (required)
&lt;/h3&gt;&lt;p&gt;Your openai api key, join multiple api keys with comma.&lt;/p&gt;
&lt;h3 id=&#34;base_url-optional&#34;&gt;&lt;code&gt;BASE_URL&lt;/code&gt; (optional)
&lt;/h3&gt;&lt;blockquote&gt;
&lt;p&gt;Default: &lt;code&gt;https://api.openai.com&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Examples: &lt;code&gt;http://your-openai-proxy.com&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Override openai api request base url.&lt;/p&gt;
&lt;h3 id=&#34;openai_org_id-optional&#34;&gt;&lt;code&gt;OPENAI_ORG_ID&lt;/code&gt; (optional)
&lt;/h3&gt;&lt;p&gt;Specify OpenAI organization ID.&lt;/p&gt;
&lt;h3 id=&#34;azure_url-optional&#34;&gt;&lt;code&gt;AZURE_URL&lt;/code&gt; (optional)
&lt;/h3&gt;&lt;blockquote&gt;
&lt;p&gt;Example: https://{azure-resource-url}/openai&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Azure deploy url.&lt;/p&gt;
&lt;h3 id=&#34;azure_api_key-optional&#34;&gt;&lt;code&gt;AZURE_API_KEY&lt;/code&gt; (optional)
&lt;/h3&gt;&lt;p&gt;Azure Api Key.&lt;/p&gt;
&lt;h3 id=&#34;azure_api_version-optional&#34;&gt;&lt;code&gt;AZURE_API_VERSION&lt;/code&gt; (optional)
&lt;/h3&gt;&lt;p&gt;Azure Api Version, find it at &lt;a class=&#34;link&#34; href=&#34;https://learn.microsoft.com/en-us/azure/ai-services/openai/reference#chat-completions&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Azure Documentation&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;google_api_key-optional&#34;&gt;&lt;code&gt;GOOGLE_API_KEY&lt;/code&gt; (optional)
&lt;/h3&gt;&lt;p&gt;Google Gemini Pro Api Key.&lt;/p&gt;
&lt;h3 id=&#34;google_url-optional&#34;&gt;&lt;code&gt;GOOGLE_URL&lt;/code&gt; (optional)
&lt;/h3&gt;&lt;p&gt;Google Gemini Pro Api Url.&lt;/p&gt;
&lt;h3 id=&#34;anthropic_api_key-optional&#34;&gt;&lt;code&gt;ANTHROPIC_API_KEY&lt;/code&gt; (optional)
&lt;/h3&gt;&lt;p&gt;anthropic claude Api Key.&lt;/p&gt;
&lt;h3 id=&#34;anthropic_api_version-optional&#34;&gt;&lt;code&gt;ANTHROPIC_API_VERSION&lt;/code&gt; (optional)
&lt;/h3&gt;&lt;p&gt;anthropic claude Api version.&lt;/p&gt;
&lt;h3 id=&#34;anthropic_url-optional&#34;&gt;&lt;code&gt;ANTHROPIC_URL&lt;/code&gt; (optional)
&lt;/h3&gt;&lt;p&gt;anthropic claude Api Url.&lt;/p&gt;
&lt;h3 id=&#34;baidu_api_key-optional&#34;&gt;&lt;code&gt;BAIDU_API_KEY&lt;/code&gt; (optional)
&lt;/h3&gt;&lt;p&gt;Baidu Api Key.&lt;/p&gt;
&lt;h3 id=&#34;baidu_secret_key-optional&#34;&gt;&lt;code&gt;BAIDU_SECRET_KEY&lt;/code&gt; (optional)
&lt;/h3&gt;&lt;p&gt;Baidu Secret Key.&lt;/p&gt;
&lt;h3 id=&#34;baidu_url-optional&#34;&gt;&lt;code&gt;BAIDU_URL&lt;/code&gt; (optional)
&lt;/h3&gt;&lt;p&gt;Baidu Api Url.&lt;/p&gt;
&lt;h3 id=&#34;bytedance_api_key-optional&#34;&gt;&lt;code&gt;BYTEDANCE_API_KEY&lt;/code&gt; (optional)
&lt;/h3&gt;&lt;p&gt;ByteDance Api Key.&lt;/p&gt;
&lt;h3 id=&#34;bytedance_url-optional&#34;&gt;&lt;code&gt;BYTEDANCE_URL&lt;/code&gt; (optional)
&lt;/h3&gt;&lt;p&gt;ByteDance Api Url.&lt;/p&gt;
&lt;h3 id=&#34;alibaba_api_key-optional&#34;&gt;&lt;code&gt;ALIBABA_API_KEY&lt;/code&gt; (optional)
&lt;/h3&gt;&lt;p&gt;Alibaba Cloud Api Key.&lt;/p&gt;
&lt;h3 id=&#34;alibaba_url-optional&#34;&gt;&lt;code&gt;ALIBABA_URL&lt;/code&gt; (optional)
&lt;/h3&gt;&lt;p&gt;Alibaba Cloud Api Url.&lt;/p&gt;
&lt;h3 id=&#34;iflytek_url-optional&#34;&gt;&lt;code&gt;IFLYTEK_URL&lt;/code&gt; (Optional)
&lt;/h3&gt;&lt;p&gt;iflytek Api Url.&lt;/p&gt;
&lt;h3 id=&#34;iflytek_api_key-optional&#34;&gt;&lt;code&gt;IFLYTEK_API_KEY&lt;/code&gt; (Optional)
&lt;/h3&gt;&lt;p&gt;iflytek Api Key.&lt;/p&gt;
&lt;h3 id=&#34;iflytek_api_secret-optional&#34;&gt;&lt;code&gt;IFLYTEK_API_SECRET&lt;/code&gt; (Optional)
&lt;/h3&gt;&lt;p&gt;iflytek Api Secret.&lt;/p&gt;
&lt;h3 id=&#34;chatglm_api_key-optional&#34;&gt;&lt;code&gt;CHATGLM_API_KEY&lt;/code&gt; (optional)
&lt;/h3&gt;&lt;p&gt;ChatGLM Api Key.&lt;/p&gt;
&lt;h3 id=&#34;chatglm_url-optional&#34;&gt;&lt;code&gt;CHATGLM_URL&lt;/code&gt; (optional)
&lt;/h3&gt;&lt;p&gt;ChatGLM Api Url.&lt;/p&gt;
&lt;h3 id=&#34;deepseek_api_key-optional&#34;&gt;&lt;code&gt;DEEPSEEK_API_KEY&lt;/code&gt; (optional)
&lt;/h3&gt;&lt;p&gt;DeepSeek Api Key.&lt;/p&gt;
&lt;h3 id=&#34;deepseek_url-optional&#34;&gt;&lt;code&gt;DEEPSEEK_URL&lt;/code&gt; (optional)
&lt;/h3&gt;&lt;p&gt;DeepSeek Api Url.&lt;/p&gt;
&lt;h3 id=&#34;hide_user_api_key-optional&#34;&gt;&lt;code&gt;HIDE_USER_API_KEY&lt;/code&gt; (optional)
&lt;/h3&gt;&lt;blockquote&gt;
&lt;p&gt;Default: Empty&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;If you do not want users to input their own API key, set this value to 1.&lt;/p&gt;
&lt;h3 id=&#34;disable_gpt4-optional&#34;&gt;&lt;code&gt;DISABLE_GPT4&lt;/code&gt; (optional)
&lt;/h3&gt;&lt;blockquote&gt;
&lt;p&gt;Default: Empty&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;If you do not want users to use GPT-4, set this value to 1.&lt;/p&gt;
&lt;h3 id=&#34;enable_balance_query-optional&#34;&gt;&lt;code&gt;ENABLE_BALANCE_QUERY&lt;/code&gt; (optional)
&lt;/h3&gt;&lt;blockquote&gt;
&lt;p&gt;Default: Empty&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;If you do want users to query balance, set this value to 1.&lt;/p&gt;
&lt;h3 id=&#34;disable_fast_link-optional&#34;&gt;&lt;code&gt;DISABLE_FAST_LINK&lt;/code&gt; (optional)
&lt;/h3&gt;&lt;blockquote&gt;
&lt;p&gt;Default: Empty&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;If you want to disable parse settings from url, set this to 1.&lt;/p&gt;
&lt;h3 id=&#34;custom_models-optional&#34;&gt;&lt;code&gt;CUSTOM_MODELS&lt;/code&gt; (optional)
&lt;/h3&gt;&lt;blockquote&gt;
&lt;p&gt;Default: Empty
Example: &lt;code&gt;+llama,+claude-2,-gpt-3.5-turbo,gpt-4-1106-preview=gpt-4-turbo&lt;/code&gt; means add &lt;code&gt;llama, claude-2&lt;/code&gt; to model list, and remove &lt;code&gt;gpt-3.5-turbo&lt;/code&gt; from list, and display &lt;code&gt;gpt-4-1106-preview&lt;/code&gt; as &lt;code&gt;gpt-4-turbo&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;To control custom models, use &lt;code&gt;+&lt;/code&gt; to add a custom model, use &lt;code&gt;-&lt;/code&gt; to hide a model, use &lt;code&gt;name=displayName&lt;/code&gt; to customize model name, separated by comma.&lt;/p&gt;
&lt;p&gt;User &lt;code&gt;-all&lt;/code&gt; to disable all default models, &lt;code&gt;+all&lt;/code&gt; to enable all default models.&lt;/p&gt;
&lt;p&gt;For Azure: use &lt;code&gt;modelName@Azure=deploymentName&lt;/code&gt; to customize model name and deployment name.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Example: &lt;code&gt;+gpt-3.5-turbo@Azure=gpt35&lt;/code&gt; will show option &lt;code&gt;gpt35(Azure)&lt;/code&gt; in model list.
If you only can use Azure model, &lt;code&gt;-all,+gpt-3.5-turbo@Azure=gpt35&lt;/code&gt; will &lt;code&gt;gpt35(Azure)&lt;/code&gt; the only option in model list.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;For ByteDance: use &lt;code&gt;modelName@bytedance=deploymentName&lt;/code&gt; to customize model name and deployment name.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Example: &lt;code&gt;+Doubao-lite-4k@bytedance=ep-xxxxx-xxx&lt;/code&gt; will show option &lt;code&gt;Doubao-lite-4k(ByteDance)&lt;/code&gt; in model list.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;default_model-optional&#34;&gt;&lt;code&gt;DEFAULT_MODEL&lt;/code&gt; （optional）
&lt;/h3&gt;&lt;p&gt;Change default model&lt;/p&gt;
&lt;h3 id=&#34;vision_models-optional&#34;&gt;&lt;code&gt;VISION_MODELS&lt;/code&gt; (optional)
&lt;/h3&gt;&lt;blockquote&gt;
&lt;p&gt;Default: Empty
Example: &lt;code&gt;gpt-4-vision,claude-3-opus,my-custom-model&lt;/code&gt; means add vision capabilities to these models in addition to the default pattern matches (which detect models containing keywords like &amp;ldquo;vision&amp;rdquo;, &amp;ldquo;claude-3&amp;rdquo;, &amp;ldquo;gemini-1.5&amp;rdquo;, etc).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Add additional models to have vision capabilities, beyond the default pattern matching. Multiple models should be separated by commas.&lt;/p&gt;
&lt;h3 id=&#34;white_webdav_endpoints-optional&#34;&gt;&lt;code&gt;WHITE_WEBDAV_ENDPOINTS&lt;/code&gt; (optional)
&lt;/h3&gt;&lt;p&gt;You can use this option if you want to increase the number of webdav service addresses you are allowed to access, as required by the format：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Each address must be a complete endpoint
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;https://xxxx/yyy&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;Multiple addresses are connected by &amp;lsquo;, &#39;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;default_input_template-optional&#34;&gt;&lt;code&gt;DEFAULT_INPUT_TEMPLATE&lt;/code&gt; (optional)
&lt;/h3&gt;&lt;p&gt;Customize the default template used to initialize the User Input Preprocessing configuration item in Settings.&lt;/p&gt;
&lt;h3 id=&#34;stability_api_key-optional&#34;&gt;&lt;code&gt;STABILITY_API_KEY&lt;/code&gt; (optional)
&lt;/h3&gt;&lt;p&gt;Stability API key.&lt;/p&gt;
&lt;h3 id=&#34;stability_url-optional&#34;&gt;&lt;code&gt;STABILITY_URL&lt;/code&gt; (optional)
&lt;/h3&gt;&lt;p&gt;Customize Stability API url.&lt;/p&gt;
&lt;h3 id=&#34;enable_mcp-optional&#34;&gt;&lt;code&gt;ENABLE_MCP&lt;/code&gt; (optional)
&lt;/h3&gt;&lt;p&gt;Enable MCP（Model Context Protocol）Feature&lt;/p&gt;
&lt;h3 id=&#34;siliconflow_api_key-optional&#34;&gt;&lt;code&gt;SILICONFLOW_API_KEY&lt;/code&gt; (optional)
&lt;/h3&gt;&lt;p&gt;SiliconFlow API Key.&lt;/p&gt;
&lt;h3 id=&#34;siliconflow_url-optional&#34;&gt;&lt;code&gt;SILICONFLOW_URL&lt;/code&gt; (optional)
&lt;/h3&gt;&lt;p&gt;SiliconFlow API URL.&lt;/p&gt;
&lt;h3 id=&#34;ai302_api_key-optional&#34;&gt;&lt;code&gt;AI302_API_KEY&lt;/code&gt; (optional)
&lt;/h3&gt;&lt;p&gt;302.AI API Key.&lt;/p&gt;
&lt;h3 id=&#34;ai302_url-optional&#34;&gt;&lt;code&gt;AI302_URL&lt;/code&gt; (optional)
&lt;/h3&gt;&lt;p&gt;302.AI API URL.&lt;/p&gt;
&lt;h2 id=&#34;requirements&#34;&gt;Requirements
&lt;/h2&gt;&lt;p&gt;NodeJS &amp;gt;= 18, Docker &amp;gt;= 20&lt;/p&gt;
&lt;h2 id=&#34;development&#34;&gt;Development
&lt;/h2&gt;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://gitpod.io/#https://github.com/Yidadaa/ChatGPT-Next-Web&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;img src=&#34;https://gitpod.io/button/open-in-gitpod.svg&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Open in Gitpod&#34;
	
	
&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Before starting development, you must create a new &lt;code&gt;.env.local&lt;/code&gt; file at project root, and place your api key into it:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;OPENAI_API_KEY=&amp;lt;your api key here&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;# if you are not able to access openai service, use this BASE_URL
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;BASE_URL=https://chatgpt1.nextweb.fun/api/proxy
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;local-development&#34;&gt;Local Development
&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 1. install nodejs and yarn first&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 2. config local env vars in `.env.local`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 3. run&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;yarn install
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;yarn dev
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;deployment&#34;&gt;Deployment
&lt;/h2&gt;&lt;h3 id=&#34;docker-recommended&#34;&gt;Docker (Recommended)
&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker pull yidadaa/chatgpt-next-web
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker run -d -p 3000:3000 &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   -e &lt;span class=&#34;nv&#34;&gt;OPENAI_API_KEY&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;sk-xxxx &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   -e &lt;span class=&#34;nv&#34;&gt;CODE&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;your-password &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   yidadaa/chatgpt-next-web
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;You can start service behind a proxy:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker run -d -p 3000:3000 &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   -e &lt;span class=&#34;nv&#34;&gt;OPENAI_API_KEY&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;sk-xxxx &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   -e &lt;span class=&#34;nv&#34;&gt;CODE&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;your-password &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   -e &lt;span class=&#34;nv&#34;&gt;PROXY_URL&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;http://localhost:7890 &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   yidadaa/chatgpt-next-web
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;If your proxy needs password, use:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;-e &lt;span class=&#34;nv&#34;&gt;PROXY_URL&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;http://127.0.0.1:7890 user pass&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;If enable MCP, use：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker run -d -p 3000:3000 \
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   -e OPENAI_API_KEY=sk-xxxx \
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   -e CODE=your-password \
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   -e ENABLE_MCP=true \
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   yidadaa/chatgpt-next-web
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;shell&#34;&gt;Shell
&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;bash &amp;lt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;curl -s https://raw.githubusercontent.com/Yidadaa/ChatGPT-Next-Web/main/scripts/setup.sh&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;synchronizing-chat-records-upstash&#34;&gt;Synchronizing Chat Records (UpStash)
&lt;/h2&gt;&lt;p&gt;| &lt;a class=&#34;link&#34; href=&#34;./docs/synchronise-chat-logs-cn.md&#34; &gt;简体中文&lt;/a&gt; | &lt;a class=&#34;link&#34; href=&#34;./docs/synchronise-chat-logs-en.md&#34; &gt;English&lt;/a&gt; | &lt;a class=&#34;link&#34; href=&#34;./docs/synchronise-chat-logs-es.md&#34; &gt;Italiano&lt;/a&gt; | &lt;a class=&#34;link&#34; href=&#34;./docs/synchronise-chat-logs-ja.md&#34; &gt;日本語&lt;/a&gt; | &lt;a class=&#34;link&#34; href=&#34;./docs/synchronise-chat-logs-ko.md&#34; &gt;한국어&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;documentation&#34;&gt;Documentation
&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;Please go to the [docs][./docs] directory for more documentation instructions.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;./docs/cloudflare-pages-en.md&#34; &gt;Deploy with cloudflare (Deprecated)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;./docs/faq-en.md&#34; &gt;Frequent Ask Questions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;./docs/translation.md&#34; &gt;How to add a new translation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;./docs/vercel-cn.md&#34; &gt;How to use Vercel (No English)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;./docs/user-manual-cn.md&#34; &gt;User Manual (Only Chinese, WIP)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;translation&#34;&gt;Translation
&lt;/h2&gt;&lt;p&gt;If you want to add a new translation, read this &lt;a class=&#34;link&#34; href=&#34;./docs/translation.md&#34; &gt;document&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;donation&#34;&gt;Donation
&lt;/h2&gt;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.buymeacoffee.com/yidadaa&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Buy Me a Coffee&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;special-thanks&#34;&gt;Special Thanks
&lt;/h2&gt;&lt;h3 id=&#34;contributors&#34;&gt;Contributors
&lt;/h3&gt;&lt;a href=&#34;https://github.com/ChatGPTNextWeb/ChatGPT-Next-Web/graphs/contributors&#34;&gt;
  &lt;img src=&#34;https://contrib.rocks/image?repo=ChatGPTNextWeb/ChatGPT-Next-Web&#34; /&gt;
&lt;/a&gt;
&lt;h2 id=&#34;license&#34;&gt;LICENSE
&lt;/h2&gt;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://opensource.org/license/mit/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;MIT&lt;/a&gt;&lt;/p&gt;
</description>
        </item>
        <item>
        <title>ntfy</title>
        <link>https://producthunt.programnotes.cn/en/p/ntfy/</link>
        <pubDate>Thu, 03 Jul 2025 15:29:53 +0800</pubDate>
        
        <guid>https://producthunt.programnotes.cn/en/p/ntfy/</guid>
        <description>&lt;img src="https://images.unsplash.com/photo-1546663481-614a764c0404?ixid=M3w0NjAwMjJ8MHwxfHJhbmRvbXx8fHx8fHx8fDE3NTE1Mjc3NDd8&amp;ixlib=rb-4.1.0" alt="Featured image of post ntfy" /&gt;&lt;h1 id=&#34;binwiederhierntfy&#34;&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/binwiederhier/ntfy&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;binwiederhier/ntfy&lt;/a&gt;
&lt;/h1&gt;&lt;p&gt;&lt;img src=&#34;https://producthunt.programnotes.cn/web/public/static/images/ntfy.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;ntfy&#34;
	
	
&gt;&lt;/p&gt;
&lt;h1 id=&#34;ntfysh--send-push-notifications-to-your-phone-or-desktop-via-putpost&#34;&gt;ntfy.sh | Send push notifications to your phone or desktop via PUT/POST
&lt;/h1&gt;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/binwiederhier/ntfy/releases/latest&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;img src=&#34;https://img.shields.io/github/release/binwiederhier/ntfy.svg?color=success&amp;amp;style=flat-square&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Release&#34;
	
	
&gt;&lt;/a&gt;
&lt;a class=&#34;link&#34; href=&#34;https://pkg.go.dev/heckel.io/ntfy/v2&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;img src=&#34;https://pkg.go.dev/badge/heckel.io/ntfy.svg&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Go Reference&#34;
	
	
&gt;&lt;/a&gt;
&lt;a class=&#34;link&#34; href=&#34;https://github.com/binwiederhier/ntfy/actions&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;img src=&#34;https://github.com/binwiederhier/ntfy/workflows/test/badge.svg&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Tests&#34;
	
	
&gt;&lt;/a&gt;
&lt;a class=&#34;link&#34; href=&#34;https://goreportcard.com/report/github.com/binwiederhier/ntfy&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;img src=&#34;https://goreportcard.com/badge/github.com/binwiederhier/ntfy&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Go Report Card&#34;
	
	
&gt;&lt;/a&gt;
&lt;a class=&#34;link&#34; href=&#34;https://codecov.io/gh/binwiederhier/ntfy&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;img src=&#34;https://codecov.io/gh/binwiederhier/ntfy/branch/main/graph/badge.svg?token=A597KQ463G&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;codecov&#34;
	
	
&gt;&lt;/a&gt;
&lt;a class=&#34;link&#34; href=&#34;https://discord.gg/cT7ECsZj9w&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;img src=&#34;https://img.shields.io/discord/874398661709295626?label=Discord&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Discord&#34;
	
	
&gt;&lt;/a&gt;
&lt;a class=&#34;link&#34; href=&#34;https://matrix.to/#/#ntfy:matrix.org&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;img src=&#34;https://img.shields.io/matrix/ntfy:matrix.org?label=Matrix&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Matrix&#34;
	
	
&gt;&lt;/a&gt;
&lt;a class=&#34;link&#34; href=&#34;https://matrix.to/#/#ntfy-space:matrix.org&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;img src=&#34;https://img.shields.io/matrix/ntfy-space:matrix.org?label=Matrix&amp;#43;space&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Matrix space&#34;
	
	
&gt;&lt;/a&gt;
&lt;a class=&#34;link&#34; href=&#34;https://ntfy.statuspage.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;img src=&#34;https://healthchecks.io/badge/68b65976-b3b0-4102-aec9-980921/kcoEgrLY.svg&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Healthcheck&#34;
	
	
&gt;&lt;/a&gt;
&lt;a class=&#34;link&#34; href=&#34;https://gitpod.io/#https://github.com/binwiederhier/ntfy&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;img src=&#34;https://img.shields.io/badge/Contribute%20with-Gitpod-908a85?logo=gitpod&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Gitpod&#34;
	
	
&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ntfy&lt;/strong&gt; (pronounced &amp;ldquo;&lt;em&gt;notify&lt;/em&gt;&amp;rdquo;) is a simple HTTP-based &lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/Publish%E2%80%93subscribe_pattern&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;pub-sub&lt;/a&gt;
notification service. With ntfy, you can &lt;strong&gt;send notifications to your phone or desktop via scripts&lt;/strong&gt; from any computer,
&lt;strong&gt;without having to sign up or pay any fees&lt;/strong&gt;. If you&amp;rsquo;d like to run your own instance of the service, you can easily do
so since ntfy is open source.&lt;/p&gt;
&lt;p&gt;You can access the free version of ntfy at &lt;strong&gt;&lt;a class=&#34;link&#34; href=&#34;https://ntfy.sh&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;ntfy.sh&lt;/a&gt;&lt;/strong&gt;. There is also an &lt;a class=&#34;link&#34; href=&#34;https://github.com/binwiederhier/ntfy-android&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;open-source Android app&lt;/a&gt;
available on &lt;a class=&#34;link&#34; href=&#34;https://play.google.com/store/apps/details?id=io.heckel.ntfy&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Google Play&lt;/a&gt; or &lt;a class=&#34;link&#34; href=&#34;https://f-droid.org/en/packages/io.heckel.ntfy/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;F-Droid&lt;/a&gt;,
as well as an &lt;a class=&#34;link&#34; href=&#34;https://github.com/binwiederhier/ntfy-ios&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;open source iOS app&lt;/a&gt; available on the &lt;a class=&#34;link&#34; href=&#34;https://apps.apple.com/us/app/ntfy/id1625396347&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;App Store&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;
  &lt;img src=&#34;.github/images/screenshot-curl.png&#34; height=&#34;180&#34;&gt;
  &lt;img src=&#34;.github/images/screenshot-web-detail.png&#34; height=&#34;180&#34;&gt;
  &lt;img src=&#34;.github/images/screenshot-phone-main.jpg&#34; height=&#34;180&#34;&gt;
  &lt;img src=&#34;.github/images/screenshot-phone-detail.jpg&#34; height=&#34;180&#34;&gt;
  &lt;img src=&#34;.github/images/screenshot-phone-notification.jpg&#34; height=&#34;180&#34;&gt;
&lt;/p&gt;
&lt;h2 id=&#34;ntfy-pro--&#34;&gt;&lt;a class=&#34;link&#34; href=&#34;https://ntfy.sh/app&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;ntfy Pro&lt;/a&gt; 💸 🎉
&lt;/h2&gt;&lt;p&gt;I now offer paid plans for &lt;a class=&#34;link&#34; href=&#34;https://ntfy.sh/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;ntfy.sh&lt;/a&gt; if you don&amp;rsquo;t want to self-host, or you want to support the development of
ntfy (→ &lt;a class=&#34;link&#34; href=&#34;https://ntfy.sh/app&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Purchase via web app&lt;/a&gt;). You can &lt;strong&gt;buy a plan for as low as $5/month&lt;/strong&gt;.
You can also donate via &lt;a class=&#34;link&#34; href=&#34;https://github.com/sponsors/binwiederhier&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;GitHub Sponsors&lt;/a&gt;, and &lt;a class=&#34;link&#34; href=&#34;https://liberapay.com/ntfy&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Liberapay&lt;/a&gt;.
I would be very humbled by your sponsorship. ❤️&lt;/p&gt;
&lt;h2 id=&#34;documentation&#34;&gt;&lt;strong&gt;&lt;a class=&#34;link&#34; href=&#34;https://ntfy.sh/docs/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Documentation&lt;/a&gt;&lt;/strong&gt;
&lt;/h2&gt;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://ntfy.sh/docs/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Getting started&lt;/a&gt; |
&lt;a class=&#34;link&#34; href=&#34;https://ntfy.sh/docs/subscribe/phone/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Android/iOS&lt;/a&gt; |
&lt;a class=&#34;link&#34; href=&#34;https://ntfy.sh/docs/publish/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;API&lt;/a&gt; |
&lt;a class=&#34;link&#34; href=&#34;https://ntfy.sh/docs/install/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Install / Self-hosting&lt;/a&gt; |
&lt;a class=&#34;link&#34; href=&#34;https://ntfy.sh/docs/develop/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Building&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;chatforum&#34;&gt;Chat/forum
&lt;/h2&gt;&lt;p&gt;There are a few ways to get in touch with me and/or the rest of the community. Feel free to use any of these methods. Whatever
works best for you:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://discord.gg/cT7ECsZj9w&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Discord server&lt;/a&gt; - direct chat with the community&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://matrix.to/#/#ntfy:matrix.org&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Matrix room #ntfy&lt;/a&gt; (+ &lt;a class=&#34;link&#34; href=&#34;https://matrix.to/#/#ntfy-space:matrix.org&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Matrix space&lt;/a&gt;) - same chat, bridged from Discord&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/binwiederhier/ntfy/issues&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;GitHub issues&lt;/a&gt; - questions, features, bugs&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;announcementsbeta-testers&#34;&gt;Announcements/beta testers
&lt;/h2&gt;&lt;p&gt;For announcements of new releases and cutting-edge beta versions, please subscribe to the &lt;a class=&#34;link&#34; href=&#34;https://ntfy.sh/announcements&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;ntfy.sh/announcements&lt;/a&gt;
topic. If you&amp;rsquo;d like to test the iOS app, join &lt;a class=&#34;link&#34; href=&#34;https://testflight.apple.com/join/P1fFnAm9&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;TestFlight&lt;/a&gt;. For Android betas,
join Discord/Matrix (I&amp;rsquo;ll eventually make a testing channel in Google Play).&lt;/p&gt;
&lt;h2 id=&#34;sponsors&#34;&gt;Sponsors
&lt;/h2&gt;&lt;p&gt;If you&amp;rsquo;d like to support the ntfy maintainers, please consider donating to &lt;a class=&#34;link&#34; href=&#34;https://github.com/sponsors/binwiederhier&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;GitHub Sponsors&lt;/a&gt; or
and &lt;a class=&#34;link&#34; href=&#34;https://liberapay.com/ntfy&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Liberapay&lt;/a&gt;. We would be humbled if you helped carry the server and developer
account costs. Even small donations are very much appreciated.&lt;/p&gt;
&lt;p&gt;Thank you to our commercial sponsors, who help keep the service running and the development going:&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://m.do.co/c/442b929528db&#34;&gt;&lt;img src=&#34;https://opensource.nyc3.cdn.digitaloceanspaces.com/attribution/assets/SVG/DO_Logo_horizontal_blue.svg&#34; width=&#34;201px&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.magicbell.com/?utm_source=ntfy&#34;&gt;&lt;img src=&#34;assets/sponsors/magicbell.png&#34; width=&#34;180px&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;And a big fat &lt;strong&gt;Thank You&lt;/strong&gt; to the individuals who have sponsored ntfy in the past, or are still sponsoring ntfy:&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/neutralinsomniac&#34;&gt;&lt;img src=&#34;https://github.com/neutralinsomniac.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/aspyct&#34;&gt;&lt;img src=&#34;https://github.com/aspyct.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/nickexyz&#34;&gt;&lt;img src=&#34;https://github.com/nickexyz.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/qcasey&#34;&gt;&lt;img src=&#34;https://github.com/qcasey.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/mckay115&#34;&gt;&lt;img src=&#34;https://github.com/mckay115.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/Salamafet&#34;&gt;&lt;img src=&#34;https://github.com/Salamafet.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/codinghipster&#34;&gt;&lt;img src=&#34;https://github.com/codinghipster.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/HinFort&#34;&gt;&lt;img src=&#34;https://github.com/HinFort.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/Lexevolution&#34;&gt;&lt;img src=&#34;https://github.com/Lexevolution.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/johnnyip&#34;&gt;&lt;img src=&#34;https://github.com/johnnyip.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/JonDerThan&#34;&gt;&lt;img src=&#34;https://github.com/JonDerThan.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/12nick12&#34;&gt;&lt;img src=&#34;https://github.com/12nick12.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/eanplatter&#34;&gt;&lt;img src=&#34;https://github.com/eanplatter.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/fnoelscher&#34;&gt;&lt;img src=&#34;https://github.com/fnoelscher.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/bnorick&#34;&gt;&lt;img src=&#34;https://github.com/bnorick.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/snh&#34;&gt;&lt;img src=&#34;https://github.com/snh.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/hen-x&#34;&gt;&lt;img src=&#34;https://github.com/hen-x.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/JamieGoodson&#34;&gt;&lt;img src=&#34;https://github.com/JamieGoodson.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/cremesk&#34;&gt;&lt;img src=&#34;https://github.com/cremesk.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/dangowans&#34;&gt;&lt;img src=&#34;https://github.com/dangowans.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/mnault&#34;&gt;&lt;img src=&#34;https://github.com/mnault.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/nwithan8&#34;&gt;&lt;img src=&#34;https://github.com/nwithan8.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/peterleiser&#34;&gt;&lt;img src=&#34;https://github.com/peterleiser.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/portothree&#34;&gt;&lt;img src=&#34;https://github.com/portothree.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/finngreig&#34;&gt;&lt;img src=&#34;https://github.com/finngreig.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/skrollme&#34;&gt;&lt;img src=&#34;https://github.com/skrollme.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/gergepalfi&#34;&gt;&lt;img src=&#34;https://github.com/gergepalfi.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/tonyakwei&#34;&gt;&lt;img src=&#34;https://github.com/tonyakwei.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/crosbyh&#34;&gt;&lt;img src=&#34;https://github.com/crosbyh.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/mdlnr&#34;&gt;&lt;img src=&#34;https://github.com/mdlnr.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/p-samuel&#34;&gt;&lt;img src=&#34;https://github.com/p-samuel.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/zugaldia&#34;&gt;&lt;img src=&#34;https://github.com/zugaldia.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/NathanSweet&#34;&gt;&lt;img src=&#34;https://github.com/NathanSweet.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/msdeibel&#34;&gt;&lt;img src=&#34;https://github.com/msdeibel.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/ksurl&#34;&gt;&lt;img src=&#34;https://github.com/ksurl.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/CodingTimeDEV&#34;&gt;&lt;img src=&#34;https://github.com/CodingTimeDEV.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/Terrormixer3000&#34;&gt;&lt;img src=&#34;https://github.com/Terrormixer3000.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/voroskoi&#34;&gt;&lt;img src=&#34;https://github.com/voroskoi.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/Nickwasused&#34;&gt;&lt;img src=&#34;https://github.com/Nickwasused.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/bahur142&#34;&gt;&lt;img src=&#34;https://github.com/bahur142.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/vinhdizzo&#34;&gt;&lt;img src=&#34;https://github.com/vinhdizzo.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/Ge0rg3&#34;&gt;&lt;img src=&#34;https://github.com/Ge0rg3.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/biopsin&#34;&gt;&lt;img src=&#34;https://github.com/biopsin.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/thebino&#34;&gt;&lt;img src=&#34;https://github.com/thebino.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/sky4055&#34;&gt;&lt;img src=&#34;https://github.com/sky4055.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/julianlam&#34;&gt;&lt;img src=&#34;https://github.com/julianlam.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/andreapx&#34;&gt;&lt;img src=&#34;https://github.com/andreapx.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/billycao&#34;&gt;&lt;img src=&#34;https://github.com/billycao.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/zoic21&#34;&gt;&lt;img src=&#34;https://github.com/zoic21.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/IanKulin&#34;&gt;&lt;img src=&#34;https://github.com/IanKulin.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/Joachim256&#34;&gt;&lt;img src=&#34;https://github.com/Joachim256.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/overtone1000&#34;&gt;&lt;img src=&#34;https://github.com/overtone1000.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/oakd&#34;&gt;&lt;img src=&#34;https://github.com/oakd.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/KucharczykL&#34;&gt;&lt;img src=&#34;https://github.com/KucharczykL.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/hansbickhofe&#34;&gt;&lt;img src=&#34;https://github.com/hansbickhofe.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/caseodilla&#34;&gt;&lt;img src=&#34;https://github.com/caseodilla.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/0xAF&#34;&gt;&lt;img src=&#34;https://github.com/0xAF.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/soonoo&#34;&gt;&lt;img src=&#34;https://github.com/soonoo.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/nichu42&#34;&gt;&lt;img src=&#34;https://github.com/nichu42.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/samliebow&#34;&gt;&lt;img src=&#34;https://github.com/samliebow.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/johman10&#34;&gt;&lt;img src=&#34;https://github.com/johman10.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/R-Gld&#34;&gt;&lt;img src=&#34;https://github.com/R-Gld.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/FingerlessGlov3s&#34;&gt;&lt;img src=&#34;https://github.com/FingerlessGlov3s.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/Twisterado&#34;&gt;&lt;img src=&#34;https://github.com/Twisterado.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/ScrumpyJack&#34;&gt;&lt;img src=&#34;https://github.com/ScrumpyJack.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/andrejarrell&#34;&gt;&lt;img src=&#34;https://github.com/andrejarrell.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/oaustegard&#34;&gt;&lt;img src=&#34;https://github.com/oaustegard.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/CreativeWarlock&#34;&gt;&lt;img src=&#34;https://github.com/CreativeWarlock.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/darkdragon-001&#34;&gt;&lt;img src=&#34;https://github.com/darkdragon-001.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/jonathan-kosgei&#34;&gt;&lt;img src=&#34;https://github.com/jonathan-kosgei.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/KevinWang15&#34;&gt;&lt;img src=&#34;https://github.com/KevinWang15.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/darkmattercoder&#34;&gt;&lt;img src=&#34;https://github.com/darkmattercoder.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/bmcgonag&#34;&gt;&lt;img src=&#34;https://github.com/bmcgonag.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/skorokithakis&#34;&gt;&lt;img src=&#34;https://github.com/skorokithakis.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/eenturk&#34;&gt;&lt;img src=&#34;https://github.com/eenturk.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/spirossi&#34;&gt;&lt;img src=&#34;https://github.com/spirossi.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/teomarcdhio&#34;&gt;&lt;img src=&#34;https://github.com/teomarcdhio.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/MarcMichalsky&#34;&gt;&lt;img src=&#34;https://github.com/MarcMichalsky.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/LuckVintage&#34;&gt;&lt;img src=&#34;https://github.com/LuckVintage.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/spartan&#34;&gt;&lt;img src=&#34;https://github.com/spartan.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/alexandzors&#34;&gt;&lt;img src=&#34;https://github.com/alexandzors.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/dkramer95&#34;&gt;&lt;img src=&#34;https://github.com/dkramer95.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/YezGotIt&#34;&gt;&lt;img src=&#34;https://github.com/YezGotIt.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/thomasskou&#34;&gt;&lt;img src=&#34;https://github.com/thomasskou.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/surfernv&#34;&gt;&lt;img src=&#34;https://github.com/surfernv.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/richardleach&#34;&gt;&lt;img src=&#34;https://github.com/richardleach.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/bear&#34;&gt;&lt;img src=&#34;https://github.com/bear.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/cminter&#34;&gt;&lt;img src=&#34;https://github.com/cminter.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/bahur142&#34;&gt;&lt;img src=&#34;https://github.com/bahur142.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/pgwiebes&#34;&gt;&lt;img src=&#34;https://github.com/pgwiebes.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/ralhei&#34;&gt;&lt;img src=&#34;https://github.com/ralhei.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/TechMDW&#34;&gt;&lt;img src=&#34;https://github.com/TechMDW.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/ubipo&#34;&gt;&lt;img src=&#34;https://github.com/ubipo.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/tka85&#34;&gt;&lt;img src=&#34;https://github.com/tka85.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/beekeeb&#34;&gt;&lt;img src=&#34;https://github.com/beekeeb.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/Emiliaaah&#34;&gt;&lt;img src=&#34;https://github.com/Emiliaaah.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/zark0s&#34;&gt;&lt;img src=&#34;https://github.com/zark0s.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/tomershvueli&#34;&gt;&lt;img src=&#34;https://github.com/tomershvueli.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/CataIana&#34;&gt;&lt;img src=&#34;https://github.com/CataIana.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/ajay-actuary&#34;&gt;&lt;img src=&#34;https://github.com/ajay-actuary.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/mursec&#34;&gt;&lt;img src=&#34;https://github.com/mursec.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/FrameXX&#34;&gt;&lt;img src=&#34;https://github.com/FrameXX.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/vovayartsev&#34;&gt;&lt;img src=&#34;https://github.com/vovayartsev.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/dwain-lab&#34;&gt;&lt;img src=&#34;https://github.com/dwain-lab.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/brookmg&#34;&gt;&lt;img src=&#34;https://github.com/brookmg.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/siebej&#34;&gt;&lt;img src=&#34;https://github.com/siebej.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/rxsantos&#34;&gt;&lt;img src=&#34;https://github.com/rxsantos.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/hermannx5&#34;&gt;&lt;img src=&#34;https://github.com/hermannx5.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/rwxd&#34;&gt;&lt;img src=&#34;https://github.com/rwxd.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/Integral-Tech&#34;&gt;&lt;img src=&#34;https://github.com/Integral-Tech.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/TheTomik1&#34;&gt;&lt;img src=&#34;https://github.com/TheTomik1.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/dav23r&#34;&gt;&lt;img src=&#34;https://github.com/dav23r.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/stannynuytkens&#34;&gt;&lt;img src=&#34;https://github.com/stannynuytkens.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/danbartram&#34;&gt;&lt;img src=&#34;https://github.com/danbartram.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/arthurgleckler&#34;&gt;&lt;img src=&#34;https://github.com/arthurgleckler.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/tomroth04&#34;&gt;&lt;img src=&#34;https://github.com/tomroth04.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/Circenn5130&#34;&gt;&lt;img src=&#34;https://github.com/Circenn5130.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/jceloria&#34;&gt;&lt;img src=&#34;https://github.com/jceloria.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/afunworm&#34;&gt;&lt;img src=&#34;https://github.com/afunworm.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/PTR-inc&#34;&gt;&lt;img src=&#34;https://github.com/PTR-inc.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/spudooli&#34;&gt;&lt;img src=&#34;https://github.com/spudooli.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/IMarkoMC&#34;&gt;&lt;img src=&#34;https://github.com/IMarkoMC.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/rubund&#34;&gt;&lt;img src=&#34;https://github.com/rubund.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/Riolku&#34;&gt;&lt;img src=&#34;https://github.com/Riolku.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/arnbrhm&#34;&gt;&lt;img src=&#34;https://github.com/arnbrhm.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/herzkerl&#34;&gt;&lt;img src=&#34;https://github.com/herzkerl.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/0x45796164&#34;&gt;&lt;img src=&#34;https://github.com/0x45796164.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/madchr1st&#34;&gt;&lt;img src=&#34;https://github.com/madchr1st.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/avalentic&#34;&gt;&lt;img src=&#34;https://github.com/avalentic.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/TheCraiggers&#34;&gt;&lt;img src=&#34;https://github.com/TheCraiggers.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/sheetd&#34;&gt;&lt;img src=&#34;https://github.com/sheetd.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/dlt-green&#34;&gt;&lt;img src=&#34;https://github.com/dlt-green.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/suhlig&#34;&gt;&lt;img src=&#34;https://github.com/suhlig.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/Proximus888&#34;&gt;&lt;img src=&#34;https://github.com/Proximus888.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/wielandp&#34;&gt;&lt;img src=&#34;https://github.com/wielandp.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/chxseh&#34;&gt;&lt;img src=&#34;https://github.com/chxseh.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/user8446&#34;&gt;&lt;img src=&#34;https://github.com/user8446.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;
&lt;a href=&#34;https://github.com/cdf-eagles&#34;&gt;&lt;img src=&#34;https://github.com/cdf-eagles.png&#34; width=&#34;40px&#34; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;contributing&#34;&gt;Contributing
&lt;/h2&gt;&lt;p&gt;I welcome any contributions. Just create a PR or an issue. For larger features/ideas, please reach out
on Discord/Matrix first to see if I&amp;rsquo;d accept them. To contribute code, check out the &lt;a class=&#34;link&#34; href=&#34;https://ntfy.sh/docs/develop/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;build instructions&lt;/a&gt;
for the server and the Android app. Or, if you&amp;rsquo;d like to help translate 🇩🇪 🇺🇸 🇧🇬, you can start immediately in
&lt;a class=&#34;link&#34; href=&#34;https://hosted.weblate.org/projects/ntfy/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Hosted Weblate&lt;/a&gt;.&lt;/p&gt;
&lt;a href=&#34;https://hosted.weblate.org/engage/ntfy/&#34;&gt;
&lt;img src=&#34;https://hosted.weblate.org/widgets/ntfy/-/multi-blue.svg&#34; alt=&#34;Translation status&#34; /&gt;
&lt;/a&gt;
&lt;h2 id=&#34;code-of-conduct&#34;&gt;Code of Conduct
&lt;/h2&gt;&lt;p&gt;We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for
everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity
and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, caste,
color, religion, or sexual identity and orientation.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Please be sure to read the complete &lt;a class=&#34;link&#34; href=&#34;CODE_OF_CONDUCT.md&#34; &gt;Code of Conduct&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&#34;license&#34;&gt;License
&lt;/h2&gt;&lt;p&gt;Made with ❤️ by &lt;a class=&#34;link&#34; href=&#34;https://heckel.io&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Philipp C. Heckel&lt;/a&gt;.&lt;br&gt;
The project is dual licensed under the &lt;a class=&#34;link&#34; href=&#34;LICENSE&#34; &gt;Apache License 2.0&lt;/a&gt; and the &lt;a class=&#34;link&#34; href=&#34;LICENSE.GPLv2&#34; &gt;GPLv2 License&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Third-party libraries and resources:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/urfave/cli&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;github.com/urfave/cli&lt;/a&gt; (MIT) is used to drive the CLI&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://mixkit.co/free-sound-effects/notification/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Mixkit sounds&lt;/a&gt; (Mixkit Free License) are used as notification sounds&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://notificationsounds.com&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Sounds from notificationsounds.com&lt;/a&gt; (Creative Commons Attribution) are used as notification sounds&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://fonts.google.com/specimen/Roboto&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Roboto Font&lt;/a&gt; (Apache 2.0) is used as a font in everything web&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://reactjs.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;React&lt;/a&gt; (MIT) is used for the web app&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://mui.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Material UI components&lt;/a&gt; (MIT) are used in the web app&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/mui/material-ui/tree/master/docs/data/material/getting-started/templates/dashboard&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;MUI dashboard template&lt;/a&gt; (MIT) was used as a basis for the web app&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/dexie/Dexie.js&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Dexie.js&lt;/a&gt; (Apache 2.0) is used for web app persistence in IndexedDB&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://goreleaser.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;GoReleaser&lt;/a&gt; (MIT) is used to create releases&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/emersion/go-smtp&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;go-smtp&lt;/a&gt; (MIT) is used to receive e-mails&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/stretchr/testify&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;stretchr/testify&lt;/a&gt; (MIT) is used for unit and integration tests&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/mattn/go-sqlite3&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;github.com/mattn/go-sqlite3&lt;/a&gt; (MIT) is used to provide the persistent message cache&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/firebase/firebase-admin-go&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Firebase Admin SDK&lt;/a&gt; (Apache 2.0) is used to send FCM messages&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/github/gemoji&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;github/gemoji&lt;/a&gt; (MIT) is used for emoji support (specifically the &lt;a class=&#34;link&#34; href=&#34;https://raw.githubusercontent.com/github/gemoji/master/db/emoji.json&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;emoji.json&lt;/a&gt; file)&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://yossiabramov.com/blog/vanilla-js-lightbox&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Lightbox with vanilla JS&lt;/a&gt; as a lightbox on the landing page&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://gist.github.com/CJEnright/bc2d8b8dc0c1389a9feeddb110f822d7&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;HTTP middleware for gzip compression&lt;/a&gt; (MIT) is used for serving static files&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/bryanwoods/autolink-js&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Regex for auto-linking&lt;/a&gt; (MIT) is used to highlight links (the library is not used)&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.arp242.net/static-go.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Statically linking go-sqlite3&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://facelessuser.github.io/pymdown-extensions/extensions/tabbed/#linked-tabs&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Linked tabs in mkdocs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/SherClockHolmes/webpush-go&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;webpush-go&lt;/a&gt; (MIT) is used to send web push notifications&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>fluentui-system-icons</title>
        <link>https://producthunt.programnotes.cn/en/p/fluentui-system-icons/</link>
        <pubDate>Fri, 20 Jun 2025 15:29:18 +0800</pubDate>
        
        <guid>https://producthunt.programnotes.cn/en/p/fluentui-system-icons/</guid>
        <description>&lt;img src="https://images.unsplash.com/photo-1667582704408-aca85f4aea5a?ixid=M3w0NjAwMjJ8MHwxfHJhbmRvbXx8fHx8fHx8fDE3NTA0MDQ1MTR8&amp;ixlib=rb-4.1.0" alt="Featured image of post fluentui-system-icons" /&gt;&lt;h1 id=&#34;microsoftfluentui-system-icons&#34;&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/microsoft/fluentui-system-icons&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;microsoft/fluentui-system-icons&lt;/a&gt;
&lt;/h1&gt;&lt;h1 id=&#34;fluent-ui-system-icons&#34;&gt;Fluent UI System Icons
&lt;/h1&gt;&lt;p&gt;&lt;img src=&#34;https://github.com/microsoft/fluentui-system-icons/workflows/CI/badge.svg&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;CI&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;Fluent UI System Icons are a collection of familiar, friendly and modern icons from Microsoft.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://producthunt.programnotes.cn/art/readme-banner.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;fluent system icons&#34;
	
	
&gt;&lt;/p&gt;
&lt;h2 id=&#34;icon-list&#34;&gt;Icon List
&lt;/h2&gt;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;icons_regular.md&#34; &gt;View the full list of regular icons&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;icons_filled.md&#34; &gt;View the full list of filled icons&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;installation&#34;&gt;Installation
&lt;/h2&gt;&lt;h3 id=&#34;android&#34;&gt;Android
&lt;/h3&gt;&lt;p&gt;The library is published via Maven Central, please ensure that the &lt;code&gt;mavenCentral()&lt;/code&gt; repository has been added to the root &lt;code&gt;build.gradle&lt;/code&gt; file:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-groovy&#34; data-lang=&#34;groovy&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;repositories&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;mavenCentral&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Include the following dependency in your project&amp;rsquo;s &lt;code&gt;build.gradle&lt;/code&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-groovy&#34; data-lang=&#34;groovy&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;implementation&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;com.microsoft.design:fluent-system-icons:1.1.179@aar&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;For library docs, see &lt;a class=&#34;link&#34; href=&#34;android/README.md&#34; &gt;android/README.md&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;ios-and-macos&#34;&gt;iOS and macOS
&lt;/h3&gt;&lt;h4 id=&#34;cocoapods&#34;&gt;CocoaPods
&lt;/h4&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;use_frameworks!&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;pod&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;FluentIcons&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;1.1.179&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id=&#34;carthage&#34;&gt;Carthage
&lt;/h4&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git &lt;span class=&#34;s2&#34;&gt;&amp;#34;git@github.com:microsoft/fluentui-system-icons.git&amp;#34;&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;1.1.179&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;For library docs, see &lt;a class=&#34;link&#34; href=&#34;ios/README.md&#34; &gt;ios/README.md&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;flutter&#34;&gt;Flutter
&lt;/h3&gt;&lt;p&gt;In the &lt;code&gt;pubspec.yaml&lt;/code&gt; of your flutter project, add the following dependency:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;dependencies&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;...&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;fluentui_system_icons&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;^1.1.179&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;For library docs, see &lt;a class=&#34;link&#34; href=&#34;flutter/README.md&#34; &gt;flutter/README.md&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;plain-svg&#34;&gt;Plain svg
&lt;/h3&gt;&lt;p&gt;Inline svg directly. See &lt;a class=&#34;link&#34; href=&#34;packages/svg-icons/README.md&#34; &gt;packages/svg-icons/README.md&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;contributing&#34;&gt;Contributing
&lt;/h2&gt;&lt;h3 id=&#34;importer&#34;&gt;Importer
&lt;/h3&gt;&lt;p&gt;The importer generates the Android and iOS libraries from the icons in the &lt;code&gt;assets&lt;/code&gt; directory.&lt;/p&gt;
&lt;p&gt;Jump into the directory&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cd importer
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Install npm dependencies&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;npm install
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;npm run clean
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;List all the available commands&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;npm run
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;build-pipeline&#34;&gt;Build Pipeline
&lt;/h3&gt;&lt;p&gt;Our &lt;a class=&#34;link&#34; href=&#34;https://github.com/microsoft/fluentui-system-icons/actions&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;build pipeline&lt;/a&gt; runs &lt;code&gt;deploy:android&lt;/code&gt; and &lt;code&gt;deploy:ios&lt;/code&gt; to create the libraries. The build definitions are located in &lt;code&gt;.github/workflows/&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&#34;demo-apps&#34;&gt;Demo apps
&lt;/h2&gt;&lt;p&gt;You can build and run the demo apps following the steps below.&lt;/p&gt;
&lt;h3 id=&#34;android-1&#34;&gt;Android
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;Follow the &lt;strong&gt;Importer&lt;/strong&gt; section above and run the command &lt;code&gt;npm run deploy:android&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Open the &lt;a class=&#34;link&#34; href=&#34;android&#34; &gt;android&lt;/a&gt; directory in Android Studio&lt;/li&gt;
&lt;li&gt;Select the &lt;code&gt;sample-showcase&lt;/code&gt; in the build configuration dropdown&lt;/li&gt;
&lt;li&gt;Click run&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;flutter-1&#34;&gt;Flutter
&lt;/h3&gt;&lt;p&gt;Prerequisite: Make sure you have flutter configured in Android Studio&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Open the &lt;a class=&#34;link&#34; href=&#34;flutter&#34; &gt;flutter&lt;/a&gt; directory in Android Studio&lt;/li&gt;
&lt;li&gt;Select the &amp;rsquo;example&amp;rsquo; in the directory and open it in Android Studio&lt;/li&gt;
&lt;li&gt;Click run&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;contact&#34;&gt;Contact
&lt;/h2&gt;&lt;p&gt;Please feel free to &lt;a class=&#34;link&#34; href=&#34;https://github.com/microsoft/fluentui-system-icons/issues/new&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;open a GitHub issue&lt;/a&gt; and assign to the following points of contact with questions or requests.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Jason Custer(&lt;a class=&#34;link&#34; href=&#34;https://github.com/jasoncuster&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;@jasoncuster&lt;/a&gt;) / Spencer Nelson(&lt;a class=&#34;link&#34; href=&#34;https://github.com/spencer-nelson&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;@spencer-nelson&lt;/a&gt;) / Joe Woodward(&lt;a class=&#34;link&#34; href=&#34;https://github.com/thewoodpecker&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;@thewoodpecker&lt;/a&gt;) - Design&lt;/li&gt;
&lt;li&gt;Nick Romano(&lt;a class=&#34;link&#34; href=&#34;https://github.com/nickromano&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;@rickromano&lt;/a&gt;) - iOS&lt;/li&gt;
&lt;li&gt;Will Hou(&lt;a class=&#34;link&#34; href=&#34;https://github.com/willhou&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;@willhou&lt;/a&gt;) - Android&lt;/li&gt;
&lt;li&gt;Akashdeep Singh(&lt;a class=&#34;link&#34; href=&#34;https://github.com/aakash1313&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;@aakash1313&lt;/a&gt;) - Flutter&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;code-of-conduct&#34;&gt;Code of Conduct
&lt;/h2&gt;&lt;p&gt;This project has adopted the &lt;a class=&#34;link&#34; href=&#34;https://opensource.microsoft.com/codeofconduct&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Microsoft Open Source Code of Conduct&lt;/a&gt;. For more information see the &lt;a class=&#34;link&#34; href=&#34;https://opensource.microsoft.com/codeofconduct&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Code of Conduct FAQ&lt;/a&gt; or contact &lt;a class=&#34;link&#34; href=&#34;mailto:opencode@microsoft.com&#34; &gt;opencode@microsoft.com&lt;/a&gt; with any additional questions or comments.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Product Hunt Daily | 2025-06-17</title>
        <link>https://producthunt.programnotes.cn/en/p/product-hunt-daily-2025-06-17/</link>
        <pubDate>Tue, 17 Jun 2025 07:29:01 +0000</pubDate>
        
        <guid>https://producthunt.programnotes.cn/en/p/product-hunt-daily-2025-06-17/</guid>
        <description>&lt;img src="https://ph-files.imgix.net/f1e0f652-b6f7-485d-91cc-11f9cf881210.png?auto=format&amp;fit=crop&amp;frame=1&amp;h=512&amp;w=1024" alt="Featured image of post Product Hunt Daily | 2025-06-17" /&gt;&lt;h2 id=&#34;1-spotted-in-prod&#34;&gt;1. Spotted in Prod
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Tagline&lt;/strong&gt;: The very best of iOS&lt;br&gt;
&lt;strong&gt;Description&lt;/strong&gt;: Spotted in Prod is a curated video library of the best apps and interactions on iOS. Search by name, category, pattern, and more. Scrub clips frame-by-frame. Discover the people behind the craft. And most importantly: download great apps.&lt;br&gt;
&lt;strong&gt;Website&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/r/JBKNRPPRS2KTKK?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;open&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Product Hunt&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/posts/spotted-in-prod?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;View on Product Hunt&lt;/a&gt;&lt;br&gt;
&lt;img src=&#34;https://ph-files.imgix.net/f1e0f652-b6f7-485d-91cc-11f9cf881210.png?auto=format&amp;amp;fit=crop&amp;amp;frame=1&amp;amp;h=512&amp;amp;w=1024&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Spotted in Prod&#34;
	
	
&gt;&lt;br&gt;
&lt;strong&gt;Keyword&lt;/strong&gt;: iOS, apps, app design, UI, UX, interaction design, mobile design, video library, app inspiration, curated content, app discovery&lt;br&gt;
&lt;strong&gt;VotesCount&lt;/strong&gt;: 🔺691&lt;br&gt;
&lt;strong&gt;Featured&lt;/strong&gt;: Yes&lt;br&gt;
&lt;strong&gt;CreatedAt&lt;/strong&gt;: 2025-06-16 07:01 AM (UTC)&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;2-agentx-20&#34;&gt;2. AgentX 2.0
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Tagline&lt;/strong&gt;: Build your own cross-vendor multi-agent AI team&lt;br&gt;
&lt;strong&gt;Description&lt;/strong&gt;: AgentX is a multi-agent build platform. You can build different AI Agents and watch them collaborate to solve complex tasks. We support all major LLMs and provide 1000+ tools and MCPs. That means different LLMs can work together - finally.&lt;br&gt;
&lt;strong&gt;Website&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/r/OLUEB2WIAQANCE?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;open&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Product Hunt&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/posts/agentx-2-0?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;View on Product Hunt&lt;/a&gt;&lt;br&gt;
&lt;img src=&#34;https://ph-files.imgix.net/7e49ab85-4e42-4194-98b5-b58c3467f857.png?auto=format&amp;amp;fit=crop&amp;amp;frame=1&amp;amp;h=512&amp;amp;w=1024&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;AgentX 2.0&#34;
	
	
&gt;&lt;br&gt;
&lt;strong&gt;Keyword&lt;/strong&gt;: Multi-agent AI, AI Agents, LLM platform, AI collaboration, cross-vendor AI, AgentX, build AI agents, multi-agent system, AI tools,  LLM integration&lt;br&gt;
&lt;strong&gt;VotesCount&lt;/strong&gt;: 🔺646&lt;br&gt;
&lt;strong&gt;Featured&lt;/strong&gt;: Yes&lt;br&gt;
&lt;strong&gt;CreatedAt&lt;/strong&gt;: 2025-06-16 07:01 AM (UTC)&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;3-wonderish&#34;&gt;3. Wonderish
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Tagline&lt;/strong&gt;: Canva of Vibe Coding&lt;br&gt;
&lt;strong&gt;Description&lt;/strong&gt;: With Buildbox, we helped 1,000,000+ people create no-code games. Now we’re bringing that simplicity to vibe coding. Build stunning pages, apps, and experiences with zero learning curve. No code. No confusion. Wonderish is vibe prompting for everyone.&lt;br&gt;
&lt;strong&gt;Website&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/r/RX3SQ6R3D63XTQ?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;open&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Product Hunt&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/posts/wonderish?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;View on Product Hunt&lt;/a&gt;&lt;br&gt;
&lt;img src=&#34;https://ph-files.imgix.net/39e363c3-3dd4-4fbd-93bc-2ab9831243cb.png?auto=format&amp;amp;fit=crop&amp;amp;frame=1&amp;amp;h=512&amp;amp;w=1024&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Wonderish&#34;
	
	
&gt;&lt;br&gt;
&lt;strong&gt;Keyword&lt;/strong&gt;: vibe coding, no-code, app builder, page builder, experience builder, visual coding, no code platform, easy website builder, simple app development, Wonderish&lt;br&gt;
&lt;strong&gt;VotesCount&lt;/strong&gt;: 🔺420&lt;br&gt;
&lt;strong&gt;Featured&lt;/strong&gt;: Yes&lt;br&gt;
&lt;strong&gt;CreatedAt&lt;/strong&gt;: 2025-06-16 07:01 AM (UTC)&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;4-fluidworks&#34;&gt;4. Fluidworks
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Tagline&lt;/strong&gt;: SaaS onboarding agent that talks , clicks, and guides users&lt;br&gt;
&lt;strong&gt;Description&lt;/strong&gt;: Fluidworks embeds a human-like AI agent inside your SaaS. It talks, clicks through the UI, and guides each user in session, personalizing every journey while boosting activation and cutting support tickets, all with zero code.&lt;br&gt;
&lt;strong&gt;Website&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/r/4KRNPMKIK3XX77?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;open&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Product Hunt&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/posts/fluidworks-2?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;View on Product Hunt&lt;/a&gt;&lt;br&gt;
&lt;img src=&#34;https://ph-files.imgix.net/a32f3be9-b242-4140-ade7-c56e995bc398.png?auto=format&amp;amp;fit=crop&amp;amp;frame=1&amp;amp;h=512&amp;amp;w=1024&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Fluidworks&#34;
	
	
&gt;&lt;br&gt;
&lt;strong&gt;Keyword&lt;/strong&gt;: SaaS onboarding, AI agent, onboarding automation, user guidance, SaaS activation, support ticket reduction, no-code, AI-powered onboarding, conversational onboarding&lt;br&gt;
&lt;strong&gt;VotesCount&lt;/strong&gt;: 🔺326&lt;br&gt;
&lt;strong&gt;Featured&lt;/strong&gt;: Yes&lt;br&gt;
&lt;strong&gt;CreatedAt&lt;/strong&gt;: 2025-06-16 07:01 AM (UTC)&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;5-granola-for-windows&#34;&gt;5. Granola for Windows
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Tagline&lt;/strong&gt;: The whole team can use Granola together, wherever they work&lt;br&gt;
&lt;strong&gt;Description&lt;/strong&gt;: Granola takes your raw meeting notes and makes them awesome. No awkward meeting bots - just beautiful notes for you and your team, every single time.&lt;br&gt;
&lt;strong&gt;Website&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/r/Q72A3JBFTUS33B?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;open&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Product Hunt&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/posts/granola-for-windows?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;View on Product Hunt&lt;/a&gt;&lt;br&gt;
&lt;img src=&#34;https://ph-files.imgix.net/4bd559b7-c74c-4cab-8786-f93bb5c3e602.png?auto=format&amp;amp;fit=crop&amp;amp;frame=1&amp;amp;h=512&amp;amp;w=1024&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Granola for Windows&#34;
	
	
&gt;&lt;br&gt;
&lt;strong&gt;Keyword&lt;/strong&gt;: Meeting Notes,Team Collaboration,Note-Taking Software,Meeting Software,Granola,Project Management,Productivity Software,Teamwork,Meeting Minutes&lt;br&gt;
&lt;strong&gt;VotesCount&lt;/strong&gt;: 🔺249&lt;br&gt;
&lt;strong&gt;Featured&lt;/strong&gt;: Yes&lt;br&gt;
&lt;strong&gt;CreatedAt&lt;/strong&gt;: 2025-06-16 07:01 AM (UTC)&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;6-rewrait&#34;&gt;6. Rewrait
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Tagline&lt;/strong&gt;: Select, improve, replace&lt;br&gt;
&lt;strong&gt;Description&lt;/strong&gt;: Rewrait is a Mac app that lets you instantly rewrite any selected text using AI. Highlight text, press your shortcut, and get a better version. Make it clearer, shorter, friendlier, or use your own style. No tabs, no friction, just flow.&lt;br&gt;
&lt;strong&gt;Website&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/r/ZRAKMQKSTAFQTY?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;open&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Product Hunt&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/posts/rewrait?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;View on Product Hunt&lt;/a&gt;&lt;br&gt;
&lt;img src=&#34;https://ph-files.imgix.net/1b46a12a-0aea-4d22-8eec-6f7a881a5ec9.png?auto=format&amp;amp;fit=crop&amp;amp;frame=1&amp;amp;h=512&amp;amp;w=1024&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Rewrait&#34;
	
	
&gt;&lt;br&gt;
&lt;strong&gt;Keyword&lt;/strong&gt;: Rewrait, AI writing, text rewriting, Mac app, writing tool, AI assistant, writing software, text improvement, paraphrasing tool, shortcut, workflow&lt;br&gt;
&lt;strong&gt;VotesCount&lt;/strong&gt;: 🔺172&lt;br&gt;
&lt;strong&gt;Featured&lt;/strong&gt;: Yes&lt;br&gt;
&lt;strong&gt;CreatedAt&lt;/strong&gt;: 2025-06-16 07:01 AM (UTC)&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;7-sendstock-ai&#34;&gt;7. SendStock AI
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Tagline&lt;/strong&gt;: Instantly Generate Perfect Metadata for stock&lt;br&gt;
&lt;strong&gt;Description&lt;/strong&gt;: Unlock AI-powered metadata generation for image contributors on Adobe Stock, Shutterstock, Freepik &amp;amp; more. Ensure compliance and streamline uploads. Automate bulk creation, tailor prompts to your needs, manage edits locally &amp;amp; online.&lt;br&gt;
&lt;strong&gt;Website&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/r/Y2SACEPI3DGB5A?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;open&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Product Hunt&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/posts/sendstock-ai?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;View on Product Hunt&lt;/a&gt;&lt;br&gt;
&lt;img src=&#34;https://ph-files.imgix.net/324ce125-4831-4a45-b91c-a1a3669d5938.jpeg?auto=format&amp;amp;fit=crop&amp;amp;frame=1&amp;amp;h=512&amp;amp;w=1024&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;SendStock AI&#34;
	
	
&gt;&lt;br&gt;
&lt;strong&gt;Keyword&lt;/strong&gt;: AI metadata, stock metadata, image metadata, metadata generator, bulk metadata, Adobe Stock, Shutterstock, Freepik, AI-powered metadata, automated metadata, metadata compliance, streamline uploads&lt;br&gt;
&lt;strong&gt;VotesCount&lt;/strong&gt;: 🔺154&lt;br&gt;
&lt;strong&gt;Featured&lt;/strong&gt;: Yes&lt;br&gt;
&lt;strong&gt;CreatedAt&lt;/strong&gt;: 2025-06-16 07:01 AM (UTC)&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;8-tiptap-docx-import--export&#34;&gt;8. Tiptap DOCX Import &amp;amp; Export
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Tagline&lt;/strong&gt;: Enhanced DOCX conversion for your Tiptap editor&lt;br&gt;
&lt;strong&gt;Description&lt;/strong&gt;: Tiptap’s improved DOCX Import &amp;amp; Export supports advanced formatting, more node types, and custom node mapping. Run it on frontend, backend, or via our REST API! Flexible, lean, and efficient document conversion for your app.&lt;br&gt;
&lt;strong&gt;Website&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/r/LIDIADD75CO45I?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;open&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Product Hunt&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/posts/tiptap-docx-import-export?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;View on Product Hunt&lt;/a&gt;&lt;br&gt;
&lt;img src=&#34;https://ph-files.imgix.net/bdc4b109-764e-47c8-8ae5-84c36435d855.jpeg?auto=format&amp;amp;fit=crop&amp;amp;frame=1&amp;amp;h=512&amp;amp;w=1024&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Tiptap DOCX Import &amp; Export&#34;
	
	
&gt;&lt;br&gt;
&lt;strong&gt;Keyword&lt;/strong&gt;: Tiptap, DOCX, Import, Export, Document Conversion, Word Processing, Rich Text, Node Mapping, Frontend, Backend, REST API, Tiptap Plugin&lt;br&gt;
&lt;strong&gt;VotesCount&lt;/strong&gt;: 🔺147&lt;br&gt;
&lt;strong&gt;Featured&lt;/strong&gt;: Yes&lt;br&gt;
&lt;strong&gt;CreatedAt&lt;/strong&gt;: 2025-06-16 07:01 AM (UTC)&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;9-canine&#34;&gt;9. Canine
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Tagline&lt;/strong&gt;: Host with the power of Kubernetes, simplicity of Heroku&lt;br&gt;
&lt;strong&gt;Description&lt;/strong&gt;: Canine empowers developers to manage and deploy applications on Kubernetes with the simplicity of Heroku. Streamline your workflow with automated deployments, GitOps integration, and real-time resource monitoring – no Kubernetes expertise required.&lt;br&gt;
&lt;strong&gt;Website&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/r/L33B2FRWGCZGPY?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;open&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Product Hunt&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/posts/canine?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;View on Product Hunt&lt;/a&gt;&lt;br&gt;
&lt;img src=&#34;https://ph-files.imgix.net/e9bc5a24-ec4b-44af-9408-3b1324a51a01.png?auto=format&amp;amp;fit=crop&amp;amp;frame=1&amp;amp;h=512&amp;amp;w=1024&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Canine&#34;
	
	
&gt;&lt;br&gt;
&lt;strong&gt;Keyword&lt;/strong&gt;: Canine, Kubernetes, Heroku, DevOps, GitOps, Deployment, Application Deployment, Cloud Native, Container Orchestration, Automated Deployments, Resource Monitoring, Simple Kubernetes&lt;br&gt;
&lt;strong&gt;VotesCount&lt;/strong&gt;: 🔺146&lt;br&gt;
&lt;strong&gt;Featured&lt;/strong&gt;: Yes&lt;br&gt;
&lt;strong&gt;CreatedAt&lt;/strong&gt;: 2025-06-16 07:01 AM (UTC)&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;10-audio-overview&#34;&gt;10. Audio Overview
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Tagline&lt;/strong&gt;: Listen to your Google Search results&lt;br&gt;
&lt;strong&gt;Description&lt;/strong&gt;: Audio Overview is a new Google Search experiment that generates quick, conversational AI audio summaries for your search queries. Listen to a preview of top results with links to explore more.&lt;br&gt;
&lt;strong&gt;Website&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/r/WG23ZEAFNRDISZ?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;open&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Product Hunt&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/posts/audio-overview?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;View on Product Hunt&lt;/a&gt;&lt;br&gt;
&lt;img src=&#34;https://ph-files.imgix.net/3efd4318-ed2d-4011-a13b-64e5a4b9d355.png?auto=format&amp;amp;fit=crop&amp;amp;frame=1&amp;amp;h=512&amp;amp;w=1024&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Audio Overview&#34;
	
	
&gt;&lt;br&gt;
&lt;strong&gt;Keyword&lt;/strong&gt;: Google Search, audio summary, AI summary, voice search, search audio, audio results, conversational AI, Google experiment&lt;br&gt;
&lt;strong&gt;VotesCount&lt;/strong&gt;: 🔺143&lt;br&gt;
&lt;strong&gt;Featured&lt;/strong&gt;: Yes&lt;br&gt;
&lt;strong&gt;CreatedAt&lt;/strong&gt;: 2025-06-16 07:01 AM (UTC)&lt;/p&gt;
&lt;hr&gt;
</description>
        </item>
        <item>
        <title>Product Hunt Daily | 2025-06-04</title>
        <link>https://producthunt.programnotes.cn/en/p/product-hunt-daily-2025-06-04/</link>
        <pubDate>Wed, 04 Jun 2025 07:29:15 +0000</pubDate>
        
        <guid>https://producthunt.programnotes.cn/en/p/product-hunt-daily-2025-06-04/</guid>
        <description>&lt;img src="https://ph-files.imgix.net/58823563-6206-44bf-9fc3-8c8675c903aa.png?auto=format&amp;fit=crop&amp;frame=1&amp;h=512&amp;w=1024" alt="Featured image of post Product Hunt Daily | 2025-06-04" /&gt;&lt;h2 id=&#34;1-socialprofiler&#34;&gt;1. Socialprofiler
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Tagline&lt;/strong&gt;: Find out what people are into based on their social media&lt;br&gt;
&lt;strong&gt;Description&lt;/strong&gt;: Socialprofiler helps you quickly and clearly understand who you&amp;rsquo;re really dealing with online and offline. Whether you&amp;rsquo;re dating someone new, hiring help at home, concerned about your kid&amp;rsquo;s safety, or just curious—Socialprofiler gives instant insights.&lt;br&gt;
&lt;strong&gt;Website&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/r/CR6IOIELHYGIET?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;open&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Product Hunt&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/posts/socialprofiler?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;View on Product Hunt&lt;/a&gt;&lt;br&gt;
&lt;img src=&#34;https://ph-files.imgix.net/58823563-6206-44bf-9fc3-8c8675c903aa.png?auto=format&amp;amp;fit=crop&amp;amp;frame=1&amp;amp;h=512&amp;amp;w=1024&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Socialprofiler&#34;
	
	
&gt;&lt;br&gt;
&lt;strong&gt;Keyword&lt;/strong&gt;: Socialprofiler, social media analysis, social media insights, background check, online safety, dating safety, hiring safety, parental control, people search, social media profiling, identity verification&lt;br&gt;
&lt;strong&gt;VotesCount&lt;/strong&gt;: 🔺526&lt;br&gt;
&lt;strong&gt;Featured&lt;/strong&gt;: Yes&lt;br&gt;
&lt;strong&gt;CreatedAt&lt;/strong&gt;: 2025-06-03 07:01 AM (UTC)&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;2-wispr-flow-for-ios&#34;&gt;2. Wispr Flow for iOS
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Tagline&lt;/strong&gt;: Voice-first writing—now on iPhone&lt;br&gt;
&lt;strong&gt;Description&lt;/strong&gt;: Flow for iPhone is fast, natural voice dictation that works wherever you type—from iMessage to Gmail, Slack to Substack. Whether you’re on the go, juggling tasks, or just tired of typing with your thumbs, Flow helps you get stuff done 5x faster.&lt;br&gt;
&lt;strong&gt;Website&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/r/J6MB4XPAEIXBCS?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;open&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Product Hunt&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/posts/wispr-flow-for-ios?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;View on Product Hunt&lt;/a&gt;&lt;br&gt;
&lt;img src=&#34;https://ph-files.imgix.net/9ada05a7-5eac-4eb6-a063-8fbe2cef6fe8.png?auto=format&amp;amp;fit=crop&amp;amp;frame=1&amp;amp;h=512&amp;amp;w=1024&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Wispr Flow for iOS&#34;
	
	
&gt;&lt;br&gt;
&lt;strong&gt;Keyword&lt;/strong&gt;: Voice typing, voice dictation, voice to text, iPhone, iOS, Wispr Flow, fast typing, mobile writing, writing app&lt;br&gt;
&lt;strong&gt;VotesCount&lt;/strong&gt;: 🔺465&lt;br&gt;
&lt;strong&gt;Featured&lt;/strong&gt;: Yes&lt;br&gt;
&lt;strong&gt;CreatedAt&lt;/strong&gt;: 2025-06-03 07:01 AM (UTC)&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;3-convo-mode-from-wondercraft&#34;&gt;3. Convo Mode from Wondercraft
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Tagline&lt;/strong&gt;: NotebookLM podcasts that you can edit&lt;br&gt;
&lt;strong&gt;Description&lt;/strong&gt;: Built on the same model as NotebookLM Audios, Convo Mode gives you precise length control, live content editing, and a choice of 1000+ unique voices, including your own—perfect for podcasting and training content.&lt;br&gt;
&lt;strong&gt;Website&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/r/4FSCM4DFYXO5XN?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;open&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Product Hunt&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/posts/convo-mode-from-wondercraft?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;View on Product Hunt&lt;/a&gt;&lt;br&gt;
&lt;img src=&#34;https://ph-files.imgix.net/bcfa0af7-f5c7-4d63-944d-27e5e63f6bbe.png?auto=format&amp;amp;fit=crop&amp;amp;frame=1&amp;amp;h=512&amp;amp;w=1024&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Convo Mode from Wondercraft&#34;
	
	
&gt;&lt;br&gt;
&lt;strong&gt;Keyword&lt;/strong&gt;: Convo Mode, NotebookLM, podcast editing, AI voice, voice cloning, podcast creation, audio editing, training content,  AI podcasting,  text to speech&lt;br&gt;
&lt;strong&gt;VotesCount&lt;/strong&gt;: 🔺450&lt;br&gt;
&lt;strong&gt;Featured&lt;/strong&gt;: Yes&lt;br&gt;
&lt;strong&gt;CreatedAt&lt;/strong&gt;: 2025-06-03 07:01 AM (UTC)&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;4-altar-20-personal-multi-agent-workspace&#34;&gt;4. ALTAR 2.0 Personal Multi-Agent Workspace
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Tagline&lt;/strong&gt;: Autocomplete for your mind.&lt;br&gt;
&lt;strong&gt;Description&lt;/strong&gt;: ALTAR 2.0 brings new features across the board - from freshly designed interfaces and massively upgraded image generation, to deep web-search and a new class of multi-agent workflows. Get ready to transform the way you capture, organize, and create with AI.&lt;br&gt;
&lt;strong&gt;Website&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/r/IIFCOXTIY7H7OX?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;open&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Product Hunt&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/posts/altar-2-0-personal-multi-agent-workspace?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;View on Product Hunt&lt;/a&gt;&lt;br&gt;
&lt;img src=&#34;https://ph-files.imgix.net/6cd56c8d-10d9-4ae2-848c-d0f3daef2778.png?auto=format&amp;amp;fit=crop&amp;amp;frame=1&amp;amp;h=512&amp;amp;w=1024&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;ALTAR 2.0 Personal Multi-Agent Workspace&#34;
	
	
&gt;&lt;br&gt;
&lt;strong&gt;Keyword&lt;/strong&gt;: AI, Autocomplete, Multi-agent, Workspace, Personal Assistant, Image Generation, Web Search, AI Workflow, Productivity, Note-taking, Knowledge Management&lt;br&gt;
&lt;strong&gt;VotesCount&lt;/strong&gt;: 🔺409&lt;br&gt;
&lt;strong&gt;Featured&lt;/strong&gt;: Yes&lt;br&gt;
&lt;strong&gt;CreatedAt&lt;/strong&gt;: 2025-06-03 07:01 AM (UTC)&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;5-café-events&#34;&gt;5. Café Events
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Tagline&lt;/strong&gt;: Your internal events, on autopilot&lt;br&gt;
&lt;strong&gt;Description&lt;/strong&gt;: Café helps you save 10 hours per week running internal events: automate RSVPs, reminders, waitlists, and surveys — and stop wasting your time juggling emails, calendars, chats, and surveys tools!&lt;br&gt;
&lt;strong&gt;Website&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/r/QL3TSDLSE2K5KX?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;open&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Product Hunt&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/posts/cafe-events?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;View on Product Hunt&lt;/a&gt;&lt;br&gt;
&lt;img src=&#34;https://ph-files.imgix.net/2531215c-779f-415f-ac0b-b5c366a53343.png?auto=format&amp;amp;fit=crop&amp;amp;frame=1&amp;amp;h=512&amp;amp;w=1024&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Café Events&#34;
	
	
&gt;&lt;br&gt;
&lt;strong&gt;Keyword&lt;/strong&gt;: Internal Events, Event Automation, RSVP Automation, Event Management, Employee Events,  Waitlist Management, Event Surveys, Time Saving, Productivity, Internal Communications&lt;br&gt;
&lt;strong&gt;VotesCount&lt;/strong&gt;: 🔺321&lt;br&gt;
&lt;strong&gt;Featured&lt;/strong&gt;: Yes&lt;br&gt;
&lt;strong&gt;CreatedAt&lt;/strong&gt;: 2025-06-03 07:01 AM (UTC)&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;6-tilda-ai-website-builder&#34;&gt;6. Tilda AI Website Builder
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Tagline&lt;/strong&gt;: Generate Fully-Fledged Websites with Artificial Intelligence&lt;br&gt;
&lt;strong&gt;Description&lt;/strong&gt;: Tilda&amp;rsquo;s AI website builder uses artificial intelligence to generate fully designed, ready-to-publish websites in minutes. Just enter a prompt, and it will create a page structure, select blocks, write text, and find images.&lt;br&gt;
&lt;strong&gt;Website&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/r/LDI42NUF7DY7ZB?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;open&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Product Hunt&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/posts/tilda-ai-website-builder?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;View on Product Hunt&lt;/a&gt;&lt;br&gt;
&lt;img src=&#34;https://ph-files.imgix.net/526e7ce6-d427-42e4-9701-819fdffc209f.png?auto=format&amp;amp;fit=crop&amp;amp;frame=1&amp;amp;h=512&amp;amp;w=1024&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Tilda AI Website Builder&#34;
	
	
&gt;&lt;br&gt;
&lt;strong&gt;Keyword&lt;/strong&gt;: AI Website Builder, AI Website Generator, Website Builder, Website Generator, Tilda AI, AI Website, Automated Website, Website Creation, Quick Website, Easy Website&lt;br&gt;
&lt;strong&gt;VotesCount&lt;/strong&gt;: 🔺216&lt;br&gt;
&lt;strong&gt;Featured&lt;/strong&gt;: Yes&lt;br&gt;
&lt;strong&gt;CreatedAt&lt;/strong&gt;: 2025-06-03 07:01 AM (UTC)&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;7-spellar&#34;&gt;7. Spellar
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Tagline&lt;/strong&gt;: Your assistant with smart modes to capture and export notes&lt;br&gt;
&lt;strong&gt;Description&lt;/strong&gt;: Spellar is a native, bot-free meeting assistant for macOS &amp;amp; iOS, supporting any language with exports of your notes to Notion, Docs, Miro &amp;amp; more. Boost your productivity with smart AI copilot modes - no one else offers anything like it. Try it for free today.&lt;br&gt;
&lt;strong&gt;Website&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/r/SMMEBJQE6AUZHE?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;open&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Product Hunt&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/posts/spellar?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;View on Product Hunt&lt;/a&gt;&lt;br&gt;
&lt;img src=&#34;https://ph-files.imgix.net/3b80176f-ccee-41c1-82f9-555907c041a3.png?auto=format&amp;amp;fit=crop&amp;amp;frame=1&amp;amp;h=512&amp;amp;w=1024&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Spellar&#34;
	
	
&gt;&lt;br&gt;
&lt;strong&gt;Keyword&lt;/strong&gt;: Spellar, meeting assistant, note taking, macOS, iOS, Notion, Google Docs, Miro, AI copilot, productivity, smart modes, note export&lt;br&gt;
&lt;strong&gt;VotesCount&lt;/strong&gt;: 🔺201&lt;br&gt;
&lt;strong&gt;Featured&lt;/strong&gt;: Yes&lt;br&gt;
&lt;strong&gt;CreatedAt&lt;/strong&gt;: 2025-06-03 07:01 AM (UTC)&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;8-promptmonitor&#34;&gt;8. Promptmonitor
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Tagline&lt;/strong&gt;: Get your brand mentioned by ChatGPT, Gemini + other AI/LLMs&lt;br&gt;
&lt;strong&gt;Description&lt;/strong&gt;: Marketers use Promptmonitor to track and optimize brand&amp;rsquo;s visibility across ChatGPT, Claude, Gemini, Grok, DeepSeek and other AI / LLMs to drive more traffic, leads, and sales.&lt;br&gt;
&lt;strong&gt;Website&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/r/LC4PQRBUZYLIDL?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;open&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Product Hunt&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/posts/promptmonitor?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;View on Product Hunt&lt;/a&gt;&lt;br&gt;
&lt;img src=&#34;https://ph-files.imgix.net/32d1bf21-6f46-4bc3-9425-2188d4350b7f.png?auto=format&amp;amp;fit=crop&amp;amp;frame=1&amp;amp;h=512&amp;amp;w=1024&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Promptmonitor&#34;
	
	
&gt;&lt;br&gt;
&lt;strong&gt;Keyword&lt;/strong&gt;: ChatGPT, Gemini, AI, LLM, Brand Monitoring, Prompt Monitoring,  AI Marketing,  LLM Marketing,  Brand Visibility,  Traffic Generation, Lead Generation, Sales Optimization&lt;br&gt;
&lt;strong&gt;VotesCount&lt;/strong&gt;: 🔺193&lt;br&gt;
&lt;strong&gt;Featured&lt;/strong&gt;: Yes&lt;br&gt;
&lt;strong&gt;CreatedAt&lt;/strong&gt;: 2025-06-03 07:01 AM (UTC)&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;9-search-by-firecrawl&#34;&gt;9. /search by Firecrawl
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Tagline&lt;/strong&gt;: Search the web AND scrape results with one API call&lt;br&gt;
&lt;strong&gt;Description&lt;/strong&gt;: Firecrawl&amp;rsquo;s /search endpoint reinvents page discovery for agents and devs. Search the web and get LLM-Ready page content for each result. Built for deep research, lead generation, SEO optimization, and more. Our most requested endpoint is finally here!&lt;br&gt;
&lt;strong&gt;Website&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/r/4DQ2G5JLM5IGKT?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;open&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Product Hunt&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/posts/search-by-firecrawl?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;View on Product Hunt&lt;/a&gt;&lt;br&gt;
&lt;img src=&#34;https://ph-files.imgix.net/158ef53f-b2d4-40fb-b5d4-d54de27ee33b.jpeg?auto=format&amp;amp;fit=crop&amp;amp;frame=1&amp;amp;h=512&amp;amp;w=1024&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;/search by Firecrawl&#34;
	
	
&gt;&lt;br&gt;
&lt;strong&gt;Keyword&lt;/strong&gt;: web scraping, API, search API, data extraction, LLM, large language model, web search, SEO, lead generation, research, Firecrawl, /search&lt;br&gt;
&lt;strong&gt;VotesCount&lt;/strong&gt;: 🔺183&lt;br&gt;
&lt;strong&gt;Featured&lt;/strong&gt;: Yes&lt;br&gt;
&lt;strong&gt;CreatedAt&lt;/strong&gt;: 2025-06-03 07:01 AM (UTC)&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;10-bauhaus-clock&#34;&gt;10. Bauhaus Clock
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Tagline&lt;/strong&gt;: Elegant timepiece screensaver for macOS&lt;br&gt;
&lt;strong&gt;Description&lt;/strong&gt;: Transform your Mac&amp;rsquo;s idle time with Bauhaus Clock, a minimalist analog screensaver inspired by Bauhaus design. Features precision movement, customizable colors, and multilingual support. Elegance when your Mac rests.&lt;br&gt;
&lt;strong&gt;Website&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/r/CDDB7DPTNZEIQL?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;open&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Product Hunt&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.producthunt.com/posts/bauhaus-clock?utm_campaign=producthunt-api&amp;amp;utm_medium=api-v2&amp;amp;utm_source=Application%3A&amp;#43;weekly&amp;#43;%28ID%3A&amp;#43;148189%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;View on Product Hunt&lt;/a&gt;&lt;br&gt;
&lt;img src=&#34;https://ph-files.imgix.net/310db40c-e5ff-4196-be1b-34a90daef81f.jpeg?auto=format&amp;amp;fit=crop&amp;amp;frame=1&amp;amp;h=512&amp;amp;w=1024&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Bauhaus Clock&#34;
	
	
&gt;&lt;br&gt;
&lt;strong&gt;Keyword&lt;/strong&gt;: Bauhaus Clock, macOS Screensaver, Analog Clock Screensaver, Minimalist Screensaver, Bauhaus Design, Mac Screensaver, Elegant Screensaver, Customizable Screensaver,  Timepiece Screensaver&lt;br&gt;
&lt;strong&gt;VotesCount&lt;/strong&gt;: 🔺176&lt;br&gt;
&lt;strong&gt;Featured&lt;/strong&gt;: Yes&lt;br&gt;
&lt;strong&gt;CreatedAt&lt;/strong&gt;: 2025-06-03 07:01 AM (UTC)&lt;/p&gt;
&lt;hr&gt;
</description>
        </item>
        <item>
        <title>react-native</title>
        <link>https://producthunt.programnotes.cn/en/p/react-native/</link>
        <pubDate>Fri, 30 May 2025 15:30:06 +0800</pubDate>
        
        <guid>https://producthunt.programnotes.cn/en/p/react-native/</guid>
        <description>&lt;img src="https://images.unsplash.com/photo-1624291732728-651136d8a3d4?ixid=M3w0NjAwMjJ8MHwxfHJhbmRvbXx8fHx8fHx8fDE3NDg1OTAxMDZ8&amp;ixlib=rb-4.1.0" alt="Featured image of post react-native" /&gt;&lt;h1 id=&#34;facebookreact-native&#34;&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/facebook/react-native&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;facebook/react-native&lt;/a&gt;
&lt;/h1&gt;&lt;h1 align=&#34;center&#34;&gt;
  &lt;a href=&#34;https://reactnative.dev/&#34;&gt;
    React Native
  &lt;/a&gt;
&lt;/h1&gt;
&lt;p align=&#34;center&#34;&gt;
  &lt;strong&gt;Learn once, write anywhere:&lt;/strong&gt;&lt;br&gt;
  Build mobile apps with React.
&lt;/p&gt;
&lt;p align=&#34;center&#34;&gt;
  &lt;a href=&#34;https://github.com/facebook/react-native/blob/HEAD/LICENSE&#34;&gt;
    &lt;img src=&#34;https://img.shields.io/badge/license-MIT-blue.svg&#34; alt=&#34;React Native is released under the MIT license.&#34; /&gt;
  &lt;/a&gt;
  &lt;a href=&#34;https://www.npmjs.org/package/react-native&#34;&gt;
    &lt;img src=&#34;https://img.shields.io/npm/v/react-native?color=brightgreen&amp;label=npm%20package&#34; alt=&#34;Current npm package version.&#34; /&gt;
  &lt;/a&gt;
  &lt;a href=&#34;https://reactnative.dev/docs/contributing&#34;&gt;
    &lt;img src=&#34;https://img.shields.io/badge/PRs-welcome-brightgreen.svg&#34; alt=&#34;PRs welcome!&#34; /&gt;
  &lt;/a&gt;
  &lt;a href=&#34;https://twitter.com/intent/follow?screen_name=reactnative&#34;&gt;
    &lt;img src=&#34;https://img.shields.io/twitter/follow/reactnative.svg?label=Follow%20@reactnative&#34; alt=&#34;Follow @reactnative&#34; /&gt;
  &lt;/a&gt;
&lt;/p&gt;
&lt;h3 align=&#34;center&#34;&gt;
  &lt;a href=&#34;https://reactnative.dev/docs/getting-started&#34;&gt;Getting Started&lt;/a&gt;
  &lt;span&gt; · &lt;/span&gt;
  &lt;a href=&#34;https://reactnative.dev/docs/tutorial&#34;&gt;Learn the Basics&lt;/a&gt;
  &lt;span&gt; · &lt;/span&gt;
  &lt;a href=&#34;https://reactnative.dev/showcase&#34;&gt;Showcase&lt;/a&gt;
  &lt;span&gt; · &lt;/span&gt;
  &lt;a href=&#34;https://reactnative.dev/docs/contributing&#34;&gt;Contribute&lt;/a&gt;
  &lt;span&gt; · &lt;/span&gt;
  &lt;a href=&#34;https://reactnative.dev/help&#34;&gt;Community&lt;/a&gt;
  &lt;span&gt; · &lt;/span&gt;
  &lt;a href=&#34;https://github.com/facebook/react-native/blob/HEAD/.github/SUPPORT.md&#34;&gt;Support&lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;React Native brings &lt;a class=&#34;link&#34; href=&#34;https://react.dev/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;strong&gt;React&lt;/strong&gt;&amp;rsquo;s&lt;/a&gt; declarative UI framework to iOS and Android. With React Native, you use native UI controls and have full access to the native platform.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Declarative.&lt;/strong&gt; React makes it painless to create interactive UIs. Declarative views make your code more predictable and easier to debug.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Component-Based.&lt;/strong&gt; Build encapsulated components that manage their state, then compose them to make complex UIs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Developer Velocity.&lt;/strong&gt; See local changes in seconds. Changes to JavaScript code can be live reloaded without rebuilding the native app.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Portability.&lt;/strong&gt; Reuse code across iOS, Android, and &lt;a class=&#34;link&#34; href=&#34;https://reactnative.dev/docs/out-of-tree-platforms&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;other platforms&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;React Native is developed and supported by many companies and individual core contributors. Find out more in our &lt;a class=&#34;link&#34; href=&#34;https://github.com/facebook/react-native/blob/HEAD/ECOSYSTEM.md&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;ecosystem overview&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;contents&#34;&gt;Contents
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#-requirements&#34; &gt;Requirements&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#-building-your-first-react-native-app&#34; &gt;Building your first React Native app&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#-documentation&#34; &gt;Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#-upgrading&#34; &gt;Upgrading&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#-how-to-contribute&#34; &gt;How to Contribute&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#code-of-conduct&#34; &gt;Code of Conduct&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#-license&#34; &gt;License&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;-requirements&#34;&gt;📋 Requirements
&lt;/h2&gt;&lt;p&gt;React Native apps may target iOS 15.1 and Android 7.0 (API 24) or newer. You may use Windows, macOS, or Linux as your development operating system, though building and running iOS apps is limited to macOS. Tools like &lt;a class=&#34;link&#34; href=&#34;https://expo.dev&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Expo&lt;/a&gt; can be used to work around this.&lt;/p&gt;
&lt;h2 id=&#34;-building-your-first-react-native-app&#34;&gt;🎉 Building your first React Native app
&lt;/h2&gt;&lt;p&gt;Follow the &lt;a class=&#34;link&#34; href=&#34;https://reactnative.dev/docs/getting-started&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Getting Started guide&lt;/a&gt;. The recommended way to install React Native depends on your project. Here you can find short guides for the most common scenarios:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://snack.expo.dev/@samples/hello-world&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Trying out React Native&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://reactnative.dev/docs/getting-started&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Creating a New Application&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://reactnative.dev/docs/integration-with-existing-apps&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Adding React Native to an Existing Application&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;-documentation&#34;&gt;📖 Documentation
&lt;/h2&gt;&lt;p&gt;The full documentation for React Native can be found on our &lt;a class=&#34;link&#34; href=&#34;https://reactnative.dev/docs/getting-started&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;website&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The React Native documentation discusses components, APIs, and topics that are specific to React Native. For further documentation on the React API that is shared between React Native and React DOM, refer to the &lt;a class=&#34;link&#34; href=&#34;https://react.dev/learn&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;React documentation&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The source for the React Native documentation and website is hosted on a separate repository, &lt;a class=&#34;link&#34; href=&#34;https://github.com/facebook/react-native-website&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;strong&gt;@facebook/react-native-website&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;-upgrading&#34;&gt;🚀 Upgrading
&lt;/h2&gt;&lt;p&gt;Upgrading to new versions of React Native may give you access to more APIs, views, developer tools, and other goodies. See the &lt;a class=&#34;link&#34; href=&#34;https://reactnative.dev/docs/upgrading&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Upgrading Guide&lt;/a&gt; for instructions.&lt;/p&gt;
&lt;p&gt;React Native releases are discussed &lt;a class=&#34;link&#34; href=&#34;https://github.com/reactwg/react-native-releases/discussions&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;in this discussion repo&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;-how-to-contribute&#34;&gt;👏 How to Contribute
&lt;/h2&gt;&lt;p&gt;The main purpose of this repository is to continue evolving React Native core. We want to make contributing to this project as easy and transparent as possible, and we are grateful to the community for contributing bug fixes and improvements. Read below to learn how you can take part in improving React Native.&lt;/p&gt;
&lt;h3 id=&#34;code-of-conduct&#34;&gt;&lt;a class=&#34;link&#34; href=&#34;https://code.fb.com/codeofconduct/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Code of Conduct&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;Facebook has adopted a Code of Conduct that we expect project participants to adhere to.
Please read the &lt;a class=&#34;link&#34; href=&#34;https://code.fb.com/codeofconduct/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;full text&lt;/a&gt; so that you can understand what actions will and will not be tolerated.&lt;/p&gt;
&lt;h3 id=&#34;contributing-guide&#34;&gt;&lt;a class=&#34;link&#34; href=&#34;https://reactnative.dev/docs/contributing&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Contributing Guide&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;Read our &lt;a class=&#34;link&#34; href=&#34;https://reactnative.dev/docs/contributing&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;strong&gt;Contributing Guide&lt;/strong&gt;&lt;/a&gt; to learn about our development process, how to propose bugfixes and improvements, and how to build and test your changes to React Native.&lt;/p&gt;
&lt;h3 id=&#34;open-source-roadmap&#34;&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/facebook/react-native/wiki/Roadmap&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Open Source Roadmap&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;You can learn more about our vision for React Native in the &lt;a class=&#34;link&#34; href=&#34;https://github.com/facebook/react-native/wiki/Roadmap&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;strong&gt;Roadmap&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;good-first-issues&#34;&gt;Good First Issues
&lt;/h3&gt;&lt;p&gt;We have a list of &lt;a class=&#34;link&#34; href=&#34;https://github.com/facebook/react-native/labels/good%20first%20issue&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;good first issues&lt;/a&gt; that contain bugs which have a relatively limited scope. This is a great place to get started, gain experience, and get familiar with our contribution process.&lt;/p&gt;
&lt;h3 id=&#34;discussions&#34;&gt;Discussions
&lt;/h3&gt;&lt;p&gt;Larger discussions and proposals are discussed in &lt;a class=&#34;link&#34; href=&#34;https://github.com/react-native-community/discussions-and-proposals&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;strong&gt;@react-native-community/discussions-and-proposals&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;-license&#34;&gt;📄 License
&lt;/h2&gt;&lt;p&gt;React Native is MIT licensed, as found in the &lt;a class=&#34;link&#34; href=&#34;https://github.com/facebook/react-native/blob/main/LICENSE&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;LICENSE&lt;/a&gt; file.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Duix.mobile</title>
        <link>https://producthunt.programnotes.cn/en/p/duix.mobile/</link>
        <pubDate>Thu, 29 May 2025 15:28:37 +0800</pubDate>
        
        <guid>https://producthunt.programnotes.cn/en/p/duix.mobile/</guid>
        <description>&lt;img src="https://images.unsplash.com/photo-1576473318185-e5e4304f55cb?ixid=M3w0NjAwMjJ8MHwxfHJhbmRvbXx8fHx8fHx8fDE3NDg1MDM3MDJ8&amp;ixlib=rb-4.1.0" alt="Featured image of post Duix.mobile" /&gt;&lt;h1 id=&#34;duixcomduixmobile&#34;&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/duixcom/Duix.mobile&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;duixcom/Duix.mobile&lt;/a&gt;
&lt;/h1&gt;&lt;div style=&#34;width: 100%; text-align: center;&#34;&gt;
  &lt;img src=&#34;res/logo_en.png&#34; style=&#34;width: 100%; height: auto;&#34;/&gt;
&lt;/div&gt;
&lt;div align=&#34;center&#34;&gt;
  &lt;a href=&#34;https://duix.com/&#34; style=&#34;padding: 0 20px&#34;&gt;&lt;img src=&#34;res/duix_home.png&#34; alt=&#34;图片1&#34; style=&#34;height: 28px;&#34;&gt;&lt;/a&gt;
  &lt;a href=&#34;https://docs.duix.com/api-reference/api/Introduction&#34; style=&#34;padding: 0 20px&#34;&gt;&lt;img src=&#34;res/duix_doc.png&#34; alt=&#34;图片2&#34; style=&#34;height: 28px;&#34;&gt;&lt;/a&gt;
  &lt;a href=&#34;https://duix.com/platform/create&#34; style=&#34;padding: 0 20px&#34;&gt;&lt;img src=&#34;res/duix_conversation.png&#34; alt=&#34;图片3&#34; style=&#34;height: 28px;&#34;&gt;&lt;/a&gt;
  &lt;a href=&#34;https://duix.com/platform/replicas&#34; style=&#34;padding: 0 20px&#34;&gt;&lt;img src=&#34;res/duix_more.png&#34; alt=&#34;图片4&#34; style=&#34;height: 28px;&#34;&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;h2 id=&#34;duix-mobile-on-device-ai-powered-digital-human-sdk-for-real-time-interaction-androidios&#34;&gt;DUIX-Mobile: On-Device AI-Powered Digital Human SDK for Real-Time Interaction (Android/iOS)  
&lt;/h2&gt;&lt;h2 id=&#34;table-of-contents&#34;&gt;Table of Contents：
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#introduction&#34; &gt;Introduction&lt;/a&gt;&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#features&#34; &gt;Features&lt;/a&gt;&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#documentation&#34; &gt;Documentation&lt;/a&gt;&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#model-downloads&#34; &gt;Model Downloads&lt;/a&gt;&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#use-case&#34; &gt;Use Case&lt;/a&gt;&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#faq&#34; &gt;FAQ&lt;/a&gt;&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#contact-us&#34; &gt;Contact Us&lt;/a&gt;&lt;br&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;1-introduction&#34;&gt;&lt;a id=&#34;introduction&#34;&gt;&lt;/a&gt;1. Introduction
&lt;/h2&gt;&lt;p&gt;DUIX=Dialogue User Interface System&lt;/p&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://duix.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;DUIX.com&lt;/a&gt; is a leading global platform for digital human capabilities, offering cloud/edge real-time interaction, digital human video generation, and cloning/customization through an all-in-one solution. We create intelligent human-computer interactions that &amp;ldquo;hear, see, speak, and understand you&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;This open-source release, DUIX-Mobile, delivers a mobile-centric solution for real-time digital human interaction. Developers can seamlessly integrate proprietary or third-party LLMs, speech recognition (ASR), and text-to-speech (TTS) technologies to build dynamic digital human interfaces.&lt;/p&gt;
&lt;p&gt;Featuring cross-platform one-click deployment (Android/iOS) and minimal technical barriers, DUIX-Mobile empowers developers to create personalized digital agents adaptable to diverse industry scenarios like smart customer service, virtual lawyers/doctors, and AI-powered mobile assistants. Start building today and redefine digital human interaction!&lt;/p&gt;
&lt;h2 id=&#34;2-features&#34;&gt;&lt;a id=&#34;features&#34;&gt;&lt;/a&gt;2. Features
&lt;/h2&gt;&lt;p&gt;(1) Human-Like AI: Mimic human facial expressions, tone, and empathy.&lt;/p&gt;
&lt;p&gt;(2) Ultra-Fast Response: Real-time interaction under 1.5 seconds for fluid conversations.&lt;/p&gt;
&lt;p&gt;(3) Cost-Efficient Deployment: Low-resource, rapid setup on mobile devices, smart screens, and more.&lt;/p&gt;
&lt;p&gt;(4) Network-Light Design: On-device processing minimizes connectivity needs, perfect for finance, government, and legal services.&lt;/p&gt;
&lt;p&gt;(5) Universal Adaptability: Customize digital humans and scenarios for any industry with modular, scalable architecture.&lt;/p&gt;
&lt;h2 id=&#34;3-documentation&#34;&gt;&lt;a id=&#34;documentation&#34;&gt;&lt;/a&gt;3. Documentation
&lt;/h2&gt;&lt;p&gt;Android Developer： &lt;a class=&#34;link&#34; href=&#34;https://github.com/GuijiAI/duix.ai/blob/main/duix-android/dh_aigc_android/README_en.md&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;DUIX-Mobile SDK: [Android]&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;IOS Developer：&lt;a class=&#34;link&#34; href=&#34;https://github.com/GuijiAI/duix.ai/blob/main/duix-ios/GJLocalDigitalDemo/GJLocalDigitalSDK_en.md&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;DUIX-Mobile SDK: [iOS]&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;4-model-downloads&#34;&gt;&lt;a id=&#34;model-downloads&#34;&gt;&lt;/a&gt;4. Model Downloads
&lt;/h2&gt;&lt;p&gt;We provide public test models for easy download and integration. Feel free to download and try them out!&lt;/p&gt;
&lt;h4 id=&#34;female&#34;&gt;female
&lt;/h4&gt;&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th style=&#34;text-align: center&#34;&gt;&lt;img src=&#34;https://github.com/GuijiAI/duix.ai/blob/main/res/Hazel.jpg&#34; width=&#34;200&#34;&gt;&lt;/th&gt;
          &lt;th style=&#34;text-align: center&#34;&gt;&lt;img src=&#34;https://github.com/GuijiAI/duix.ai/blob/main/res/Luna.jpg&#34; width=&#34;200&#34;&gt;&lt;/th&gt;
          &lt;th style=&#34;text-align: center&#34;&gt;&lt;img src=&#34;https://github.com/GuijiAI/duix.ai/blob/main/res/Ivy.jpg&#34; width=&#34;200&#34;&gt;&lt;/th&gt;
          &lt;th style=&#34;text-align: center&#34;&gt;&lt;img src=&#34;https://github.com/GuijiAI/duix.ai/blob/main/res/Aurora.jpg&#34; width=&#34;200&#34;&gt;&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;strong&gt;Hazel&lt;/strong&gt;&lt;br&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/GuijiAI/duix.ai/releases/download/v1.0.0/674402003804229_f6e86fb375c4f1f1b82b24f7ee4e7cb4_optim_m80.zip&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Download&lt;/a&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;strong&gt;Luna&lt;/strong&gt;&lt;br&gt; &lt;a class=&#34;link&#34; href=&#34;https://github.com/GuijiAI/duix.ai/releases/download/v1.0.0/674393494597701_f49fcf68f5afdb241d516db8a7d88a7b_optim_m80.zip&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Download&lt;/a&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;strong&gt;Ivy&lt;/strong&gt;&lt;br&gt; &lt;a class=&#34;link&#34; href=&#34;https://github.com/GuijiAI/duix.ai/releases/download/v1.0.0/674397294927941_6e297e18a4bdbe35c07a6ae48a1f021f_optim_m80.zip&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Download&lt;/a&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;strong&gt;Aurora&lt;/strong&gt;&lt;br&gt; &lt;a class=&#34;link&#34; href=&#34;https://github.com/GuijiAI/duix.ai/releases/download/v1.0.0/674400178376773_3925e756433c5a9caa9b9d54147ae4ab_optim_m80.zip&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Download&lt;/a&gt;&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id=&#34;male&#34;&gt;male
&lt;/h4&gt;&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th style=&#34;text-align: center&#34;&gt;&lt;img src=&#34;https://github.com/GuijiAI/duix.ai/blob/main/res/William.jpg&#34; width=&#34;200&#34;&gt;&lt;/th&gt;
          &lt;th style=&#34;text-align: center&#34;&gt;&lt;img src=&#34;https://github.com/GuijiAI/duix.ai/blob/main/res/andrew.jpg&#34; width=&#34;200&#34;&gt;&lt;/th&gt;
          &lt;th style=&#34;text-align: center&#34;&gt;&lt;img src=&#34;https://github.com/GuijiAI/duix.ai/blob/main/res/Michael.jpg&#34; width=&#34;200&#34;&gt;&lt;/th&gt;
          &lt;th style=&#34;text-align: center&#34;&gt;&lt;img src=&#34;https://github.com/GuijiAI/duix.ai/blob/main/res/Eric.jpg&#34; width=&#34;200&#34;&gt;&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;strong&gt;William&lt;/strong&gt;&lt;br&gt; &lt;a class=&#34;link&#34; href=&#34;https://github.com/GuijiAI/duix.ai/releases/download/v1.0.0/627306542239813_1871244b5e6912efc636ba31ea4c5c6d_optim_m80.zip&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Download&lt;/a&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;strong&gt;andrew&lt;/strong&gt;&lt;br&gt; &lt;a class=&#34;link&#34; href=&#34;https://github.com/GuijiAI/duix.ai/releases/download/v1.0.0/651705983152197_ccf3256b2449c76e77f94276dffcb293_optim_m80.zip&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Download&lt;/a&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;strong&gt;Michael&lt;/strong&gt;&lt;br&gt; &lt;a class=&#34;link&#34; href=&#34;https://github.com/GuijiAI/duix.ai/releases/download/v1.0.0/675429759852613_7f8d9388a4213080b1820b83dd057cfb_optim_m80.zip&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Download&lt;/a&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;strong&gt;Eric&lt;/strong&gt;&lt;br&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/GuijiAI/duix.ai/releases/download/v1.0.0/airuike_20240409.zip&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Download&lt;/a&gt;&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Please download the model files according to your needs. We recommend that you carefully read the accompanying documentation after downloading to ensure the correct installation and use of the models.&lt;br&gt;&lt;br&gt;&lt;/p&gt;
&lt;h2 id=&#34;5-use-case&#34;&gt;&lt;a id=&#34;use-case&#34;&gt;&lt;/a&gt;5. Use Case
&lt;/h2&gt;&lt;p&gt;Our models support diverse applications across web, mobile, Android smart displays, and other platforms. Below are implementation examples for different scenarios and devices. We welcome your feedback!&lt;/p&gt;
&lt;h3 id=&#34;business-case-presentation&#34;&gt;Business case presentation
&lt;/h3&gt;&lt;h3 id=&#34;mobile-phone-and-general-terminal-screen-cases&#34;&gt;Mobile Phone and General Terminal Screen Cases
&lt;/h3&gt;&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th style=&#34;text-align: center&#34;&gt;&lt;img src=&#34;https://github.com/GuijiAI/duix.ai/blob/main/res/540p/lvshi/lvshi-bg.jpg&#34; width=&#34;200&#34;&gt;&lt;/th&gt;
          &lt;th style=&#34;text-align: center&#34;&gt;&lt;img src=&#34;https://github.com/GuijiAI/duix.ai/blob/main/res/540p/yisheng/yisheng-bg.jpg&#34; width=&#34;200&#34;&gt;&lt;/th&gt;
          &lt;th style=&#34;text-align: center&#34;&gt;&lt;img src=&#34;https://github.com/GuijiAI/duix.ai/blob/main/res/540p/peiban/peiban-bg.jpg&#34; width=&#34;200&#34;&gt;&lt;/th&gt;
          &lt;th style=&#34;text-align: center&#34;&gt;&lt;img src=&#34;https://github.com/GuijiAI/duix.ai/blob/main/res/540p/laoshi/laoshi-bg.jpg&#34; width=&#34;200&#34;&gt;&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;strong&gt;Digital Lawyer &lt;br&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/GuijiAI/duix.ai/blob/main/res/540p/lvshi/lvshi.mp4&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Download&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;strong&gt;Digital Doctor&lt;br&gt; &lt;a class=&#34;link&#34; href=&#34;https://github.com/GuijiAI/duix.ai/blob/main/res/540p/yisheng/yisheng.mp4&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Download&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;strong&gt;Virtual Companion&lt;br&gt; &lt;a class=&#34;link&#34; href=&#34;https://github.com/GuijiAI/duix.ai/blob/main/res/540p/peiban/peiban.mp4&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Download&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;** Speaking Tutor&lt;br&gt; &lt;a class=&#34;link&#34; href=&#34;https://github.com/GuijiAI/duix.ai/blob/main/res/540p/laoshi/laoshi.mp4&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Download&lt;/a&gt;**&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;low-end-terminal-screen-cases&#34;&gt;Low-end Terminal Screen Cases
&lt;/h3&gt;&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th style=&#34;text-align: center&#34;&gt;&lt;img src=&#34;https://github.com/GuijiAI/duix.ai/blob/main/res/270p/caishen/caishen-bg.jpg&#34; width=&#34;200&#34;&gt;&lt;/th&gt;
          &lt;th style=&#34;text-align: center&#34;&gt;&lt;img src=&#34;https://github.com/GuijiAI/duix.ai/blob/main/res/270p/guanyin/guanyin-bg.jpg&#34; width=&#34;200&#34;&gt;&lt;/th&gt;
          &lt;th style=&#34;text-align: center&#34;&gt;&lt;img src=&#34;https://github.com/GuijiAI/duix.ai/blob/main/res/270p/sushi/sushi-bg.jpg&#34; width=&#34;200&#34;&gt;&lt;/th&gt;
          &lt;th style=&#34;text-align: center&#34;&gt;&lt;img src=&#34;https://github.com/GuijiAI/duix.ai/blob/main/res/270p/nvyou/nvyou-bg.jpg&#34; width=&#34;200&#34;&gt;&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;strong&gt;God of Wealth &lt;br&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/GuijiAI/duix.ai/blob/main/res/270p/caishen/caishen.mp4&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Download&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;strong&gt;Guanyin Bodhisattva&lt;br&gt; &lt;a class=&#34;link&#34; href=&#34;https://github.com/GuijiAI/duix.ai/blob/main/res/270p/guanyin/guanyin.mp4&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Download&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;strong&gt;Su Shi&lt;br&gt; &lt;a class=&#34;link&#34; href=&#34;https://github.com/GuijiAI/duix.ai/blob/main/res/270p/sushi/sushi.mp4&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Download&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;strong&gt;Virtual Girlfriend &lt;br&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/GuijiAI/duix.ai/blob/main/res/270p/nvyou/nvyou.mp4&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Download&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;6-faq&#34;&gt;&lt;a id=&#34;faq&#34;&gt;&lt;/a&gt;6. FAQ
&lt;/h2&gt;&lt;p&gt;(1) How do I create a custom digital avatar?&lt;/p&gt;
&lt;p&gt;Record a 2-5 minute video of a person speaking naturally to the camera. Adjust posture/content for your use case (e.g., wear formal attire and discuss legal topics for consultation scenarios).&lt;/p&gt;
&lt;p&gt;(2) What’s included in digital avatar pricing?&lt;/p&gt;
&lt;p&gt;Our base package covers avatar appearance and voice cloning, fully compatible with our SDK. For advanced needs, contact us.&lt;/p&gt;
&lt;p&gt;(3) Can I update my custom avatar?&lt;/p&gt;
&lt;p&gt;The open-source version uses public models only. Custom updates require a service request.&lt;/p&gt;
&lt;p&gt;(4) Is there an API for avatar cloning?&lt;/p&gt;
&lt;p&gt;Training services currently require deployment on our managed servers.&lt;/p&gt;
&lt;p&gt;(5) Are broadcast start/end callbacks available?&lt;/p&gt;
&lt;p&gt;Yes, implemented via SDK methods (see documentation).&lt;/p&gt;
&lt;p&gt;(6) Can I control avatar gestures via API?&lt;/p&gt;
&lt;p&gt;Action control APIs are currently unavailable.&lt;/p&gt;
&lt;p&gt;(7) How do I replace downloaded files?&lt;/p&gt;
&lt;p&gt;File replacement workflows are code-level managed (see implementation guides).&lt;/p&gt;
&lt;p&gt;(8) Want advanced solutions?&lt;/p&gt;
&lt;p&gt;Explore enterprise features at &lt;a class=&#34;link&#34; href=&#34;https://duix.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;duix.com&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;7-contact-us&#34;&gt;&lt;a id=&#34;contact-us&#34;&gt;&lt;/a&gt;7. Contact Us
&lt;/h2&gt;&lt;p&gt;If you have any questions, please raise an issue or contact us at &lt;a class=&#34;link&#34; href=&#34;mailto:james@duix.com&#34; &gt;james@duix.com&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;star-history&#34;&gt;Star History
&lt;/h2&gt;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://star-history.com/#GuijiAI/Duix.mobile&amp;amp;Date&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;img src=&#34;https://api.star-history.com/svg?repos=GuijiAI/Duix.mobile&amp;amp;type=Date&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Star History Chart&#34;
	
	
&gt;&lt;/a&gt;&lt;/p&gt;
</description>
        </item>
        <item>
        <title>compose-multiplatform</title>
        <link>https://producthunt.programnotes.cn/en/p/compose-multiplatform/</link>
        <pubDate>Thu, 08 May 2025 15:29:57 +0800</pubDate>
        
        <guid>https://producthunt.programnotes.cn/en/p/compose-multiplatform/</guid>
        <description>&lt;img src="https://images.unsplash.com/photo-1738005787906-11fe4d0bcdad?ixid=M3w0NjAwMjJ8MHwxfHJhbmRvbXx8fHx8fHx8fDE3NDY2ODkzMTF8&amp;ixlib=rb-4.1.0" alt="Featured image of post compose-multiplatform" /&gt;&lt;h1 id=&#34;jetbrainscompose-multiplatform&#34;&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/JetBrains/compose-multiplatform&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;JetBrains/compose-multiplatform&lt;/a&gt;
&lt;/h1&gt;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://confluence.jetbrains.com/display/ALL/JetBrains&amp;#43;on&amp;#43;GitHub&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;img src=&#34;http://jb.gg/badges/official.svg&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;official project&#34;
	
	
&gt;&lt;/a&gt;
&lt;a class=&#34;link&#34; href=&#34;https://github.com/JetBrains/compose-multiplatform/releases/latest&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;img src=&#34;https://img.shields.io/github/v/release/JetBrains/compose-multiplatform?sort=semver&amp;amp;display_name=release&amp;amp;label=stable&amp;amp;color=brightgreen&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;stable&#34;
	
	
&gt;&lt;/a&gt;
&lt;a class=&#34;link&#34; href=&#34;https://github.com/JetBrains/compose-multiplatform/releases&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;img src=&#34;https://img.shields.io/github/v/release/JetBrains/compose-multiplatform?include_prereleases&amp;amp;filter=*-*&amp;amp;display_name=release&amp;amp;label=prerelease&amp;amp;color=blue&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;prerelease&#34;
	
	
&gt;&lt;/a&gt;
&lt;a class=&#34;link&#34; href=&#34;https://github.com/JetBrains/compose-multiplatform/tags&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;img src=&#34;https://img.shields.io/github/v/tag/JetBrains/compose-multiplatform?include_prereleases&amp;amp;sort=semver&amp;amp;filter=v*%2Bdev*&amp;amp;label=dev&amp;amp;color=orange&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;dev&#34;
	
	
&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&#34;compose-multiplatform&#34;&gt;Compose Multiplatform
&lt;/h1&gt;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://jb.gg/cmp&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;strong&gt;Compose Multiplatform&lt;/strong&gt;&lt;/a&gt; is a declarative framework for sharing UIs across multiple platforms with Kotlin.
It is based on &lt;a class=&#34;link&#34; href=&#34;https://developer.android.com/jetpack/compose&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Jetpack Compose&lt;/a&gt; and developed by &lt;a class=&#34;link&#34; href=&#34;https://www.jetbrains.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;JetBrains&lt;/a&gt; and open-source contributors.&lt;/p&gt;
&lt;p&gt;You can choose the platforms across which to share your UIs using Compose Multiplatform:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://jb.gg/start-cmp&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;iOS&lt;/a&gt; (Beta)&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://jb.gg/start-cmp&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Android&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://jb.gg/start-cmp&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Desktop&lt;/a&gt; (Windows, MacOS, Linux)&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://jb.gg/start-cmp&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Web&lt;/a&gt; (Alpha)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For example, you can share UIs between iOS and Android or Windows and MacOS.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://producthunt.programnotes.cn/artwork/readme/apps.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Shared UIs of the iOS, Android, desktop, and web apps&#34;
	
	
&gt;&lt;/p&gt;
&lt;h2 id=&#34;ios&#34;&gt;iOS
&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;iOS support is in Beta. It is feature complete, and migration issues should be minimal. You may still encounter bugs, performance and developer experience issues, but not as much as in the Alpha stage.
We would appreciate your feedback on it in the public Slack channel &lt;a class=&#34;link&#34; href=&#34;https://kotlinlang.slack.com/archives/C0346LWVBJ4/p1678888063176359&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;#compose-ios&lt;/a&gt;.
If you face any issues, please report them on &lt;a class=&#34;link&#34; href=&#34;https://youtrack.jetbrains.com/newIssue?project=CMP&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;YouTrack&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Compose Multiplatform shares most of its API with Jetpack Compose, the Android UI framework developed by Google.
You can use the same APIs to build user interfaces for both Android and iOS.&lt;/p&gt;
&lt;p&gt;Since Compose is built on top of &lt;a class=&#34;link&#34; href=&#34;https://jb.gg/kmp&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Kotlin Multiplatform&lt;/a&gt;,
you can easily access native APIs, such as the &lt;a class=&#34;link&#34; href=&#34;https://developer.apple.com/documentation/avfoundation/capture_setup/avcam_building_a_camera_app&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Camera API&lt;/a&gt;,
and embed complex native UI views, such as &lt;a class=&#34;link&#34; href=&#34;https://developer.apple.com/documentation/mapkit/mkmapview&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;MKMapView&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a class=&#34;link&#34; href=&#34;https://jb.gg/start-cmp&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Get started with Compose Multiplatform&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&#34;android&#34;&gt;Android
&lt;/h2&gt;&lt;p&gt;When Android is one of your targets, you can get the same experience for Android as if you were developing an Android app
using &lt;a class=&#34;link&#34; href=&#34;https://developer.android.com/jetpack/compose&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Jetpack Compose&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a class=&#34;link&#34; href=&#34;https://jb.gg/start-cmp&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Get started with Compose Multiplatform&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&#34;desktop&#34;&gt;Desktop
&lt;/h2&gt;&lt;p&gt;Compose Multiplatform targets the JVM and supports high-performance hardware-accelerated UI rendering on all major desktop
platforms – macOS, Windows, and Linux.&lt;/p&gt;
&lt;p&gt;It has desktop extensions for menus, keyboard shortcuts, window manipulation, and notification management.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a class=&#34;link&#34; href=&#34;https://jb.gg/start-cmp&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Get started with Compose Multiplatform&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;We would appreciate your feedback on Compose Multiplatform in the public Slack channel &lt;a class=&#34;link&#34; href=&#34;https://kotlinlang.slack.com/archives/CJLTWPH7S/p1678882768039969&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;#compose&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;web&#34;&gt;Web
&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;Web support is in Alpha. It may change incompatibly and require manual migration in the future.
We would appreciate your feedback on it in the public Slack channel &lt;a class=&#34;link&#34; href=&#34;https://kotlinlang.slack.com/archives/C01F2HV7868/p1678887590205449&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;#compose-web&lt;/a&gt;.
If you face any issues, please report them on &lt;a class=&#34;link&#34; href=&#34;https://youtrack.jetbrains.com/newIssue?project=CMP&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;YouTrack&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;You can experiment with sharing your mobile or desktop UIs with the web. Compose for Web is based on &lt;a class=&#34;link&#34; href=&#34;https://kotl.in/wasm&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Kotlin/Wasm&lt;/a&gt;,
the newest target for Kotlin Multiplatform projects. It allows Kotlin developers to run their code in the browser with
all the benefits that WebAssembly has to offer, such as good and predictable performance for your applications.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a class=&#34;link&#34; href=&#34;https://jb.gg/start-cmp&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Get started with Compose for Web&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&#34;libraries&#34;&gt;Libraries
&lt;/h2&gt;&lt;h3 id=&#34;compose-html&#34;&gt;Compose HTML
&lt;/h3&gt;&lt;p&gt;Compose HTML is a library targeting &lt;a class=&#34;link&#34; href=&#34;https://kotlinlang.org/docs/js-overview.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Kotlin/JS&lt;/a&gt; that provides Composable building blocks
for creating web user interfaces with HTML and CSS.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Note that Compose HTML is not a multiplatform library. It can be used only with Kotlin/JS.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;learn-more&#34;&gt;Learn more
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://jb.gg/cmp-faq&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;FAQ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://jb.gg/cmp-samples&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Samples&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;tutorials/README.md&#34; &gt;Tutorials&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://jb.gg/cmp-versioning&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Compatibility and versioning&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;CHANGELOG.md&#34; &gt;Changelog&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>ffmpeg-kit</title>
        <link>https://producthunt.programnotes.cn/en/p/ffmpeg-kit/</link>
        <pubDate>Fri, 04 Apr 2025 15:27:35 +0800</pubDate>
        
        <guid>https://producthunt.programnotes.cn/en/p/ffmpeg-kit/</guid>
        <description>&lt;img src="https://images.unsplash.com/photo-1513039235271-5937eefe2959?ixid=M3w0NjAwMjJ8MHwxfHJhbmRvbXx8fHx8fHx8fDE3NDM3NTE2MDB8&amp;ixlib=rb-4.0.3" alt="Featured image of post ffmpeg-kit" /&gt;&lt;h1 id=&#34;arthenicaffmpeg-kit&#34;&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/arthenica/ffmpeg-kit&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;arthenica/ffmpeg-kit&lt;/a&gt;
&lt;/h1&gt;&lt;h1 id=&#34;ffmpegkit-github-release-maven-central-cocoapods-pub-npm&#34;&gt;FFmpegKit &lt;img src=&#34;https://img.shields.io/badge/release-v6.0-blue.svg&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;GitHub release&#34;
	
	
&gt; &lt;img src=&#34;https://img.shields.io/maven-central/v/com.arthenica/ffmpeg-kit-min&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Maven Central&#34;
	
	
&gt; &lt;img src=&#34;https://img.shields.io/cocoapods/v/ffmpeg-kit-ios-min&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;CocoaPods&#34;
	
	
&gt; &lt;img src=&#34;https://img.shields.io/pub/v/ffmpeg_kit_flutter.svg&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;pub&#34;
	
	
&gt; &lt;img src=&#34;https://img.shields.io/npm/v/ffmpeg-kit-react-native.svg&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;npm&#34;
	
	
&gt;
&lt;/h1&gt;&lt;h2 id=&#34;notice&#34;&gt;Notice
&lt;/h2&gt;&lt;p&gt;FFmpegKit has been officially retired. There will be no further &lt;code&gt;ffmpeg-kit&lt;/code&gt; releases.&lt;/p&gt;
&lt;p&gt;See &lt;a class=&#34;link&#34; href=&#34;https://medium.com/@tanersener/saying-goodbye-to-ffmpegkit-33ae939767e1&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Saying Goodbye to FFmpegKit @ medium&lt;/a&gt; to learn why we made this decision.&lt;/p&gt;
&lt;p&gt;All previously released &lt;code&gt;ffmpeg-kit&lt;/code&gt; binaries will be removed according to the following schedule.&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th style=&#34;text-align: center&#34;&gt;FFmpegKit Version&lt;/th&gt;
          &lt;th style=&#34;text-align: center&#34;&gt;Available Until&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;Less than 6.0&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;February 1st, 2025&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;6.0&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;April 1st, 2025&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Thank you for your support and interest in this project.&lt;/p&gt;
&lt;img src=&#34;https://github.com/arthenica/ffmpeg-kit/blob/main/docs/assets/ffmpeg-kit-icon-v9.png&#34; width=&#34;240&#34;&gt;
&lt;p&gt;&lt;code&gt;FFmpegKit&lt;/code&gt; is a collection of tools to use &lt;code&gt;FFmpeg&lt;/code&gt;&lt;sup&gt;1&lt;/sup&gt; in &lt;code&gt;Android&lt;/code&gt;, &lt;code&gt;iOS&lt;/code&gt;, &lt;code&gt;Linux&lt;/code&gt;, &lt;code&gt;macOS&lt;/code&gt;, &lt;code&gt;tvOS&lt;/code&gt;, &lt;code&gt;Flutter&lt;/code&gt; and &lt;code&gt;React Native&lt;/code&gt; applications.&lt;/p&gt;
&lt;p&gt;It includes scripts to build &lt;code&gt;FFmpeg&lt;/code&gt; native libraries, a wrapper library to run &lt;code&gt;FFmpeg&lt;/code&gt;/&lt;code&gt;FFprobe&lt;/code&gt; commands in
applications and 8 prebuilt binary packages available at &lt;a class=&#34;link&#34; href=&#34;https://github.com/arthenica/ffmpeg-kit/releases&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Github&lt;/a&gt;,
&lt;a class=&#34;link&#34; href=&#34;https://search.maven.org&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Maven Central&lt;/a&gt;, &lt;a class=&#34;link&#34; href=&#34;https://cocoapods.org&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;CocoaPods&lt;/a&gt;, &lt;a class=&#34;link&#34; href=&#34;https://pub.dev&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;pub&lt;/a&gt; and &lt;a class=&#34;link&#34; href=&#34;https://www.npmjs.com&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;npm&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;1-features&#34;&gt;1. Features
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Scripts to build FFmpeg native libraries&lt;/li&gt;
&lt;li&gt;&lt;code&gt;FFmpegKit&lt;/code&gt; wrapper library to run &lt;code&gt;FFmpeg&lt;/code&gt;/&lt;code&gt;FFprobe&lt;/code&gt; commands in applications&lt;/li&gt;
&lt;li&gt;Supports native platforms: Android, iOS, Linux, macOS and tvOS&lt;/li&gt;
&lt;li&gt;Supports hybrid platforms: Flutter, React Native&lt;/li&gt;
&lt;li&gt;Based on FFmpeg &lt;code&gt;v4.5-dev&lt;/code&gt; or later with optional system and external libraries&lt;/li&gt;
&lt;li&gt;8 prebuilt binary packages available at &lt;a class=&#34;link&#34; href=&#34;https://github.com/arthenica/ffmpeg-kit/releases&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Github&lt;/a&gt;, &lt;a class=&#34;link&#34; href=&#34;https://search.maven.org&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Maven Central&lt;/a&gt;, &lt;a class=&#34;link&#34; href=&#34;https://cocoapods.org&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;CocoaPods&lt;/a&gt;, &lt;a class=&#34;link&#34; href=&#34;https://pub.dev&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;pub&lt;/a&gt; and &lt;a class=&#34;link&#34; href=&#34;https://www.npmjs.com&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;npm&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Licensed under &lt;code&gt;LGPL 3.0&lt;/code&gt; by default, &lt;code&gt;GPL v3.0&lt;/code&gt; if GPL licensed libraries are enabled&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;2-android&#34;&gt;2. Android
&lt;/h3&gt;&lt;p&gt;See &lt;a class=&#34;link&#34; href=&#34;android&#34; &gt;Android&lt;/a&gt; to learn more about &lt;code&gt;FFmpegKit&lt;/code&gt; for &lt;code&gt;Android&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&#34;3-ios-macos-tvos&#34;&gt;3. iOS, macOS, tvOS
&lt;/h3&gt;&lt;p&gt;See &lt;a class=&#34;link&#34; href=&#34;apple&#34; &gt;Apple&lt;/a&gt; to use &lt;code&gt;FFmpegKit&lt;/code&gt; on &lt;code&gt;Apple&lt;/code&gt; platforms (&lt;code&gt;iOS&lt;/code&gt;, &lt;code&gt;macOS&lt;/code&gt;, &lt;code&gt;tvOS&lt;/code&gt;).&lt;/p&gt;
&lt;h3 id=&#34;4-flutter&#34;&gt;4. Flutter
&lt;/h3&gt;&lt;p&gt;See &lt;a class=&#34;link&#34; href=&#34;flutter/flutter&#34; &gt;Flutter&lt;/a&gt; to learn more about &lt;code&gt;FFmpegKit&lt;/code&gt; for &lt;code&gt;Flutter&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&#34;5-linux&#34;&gt;5. Linux
&lt;/h3&gt;&lt;p&gt;See &lt;a class=&#34;link&#34; href=&#34;linux&#34; &gt;Linux&lt;/a&gt; to learn more about &lt;code&gt;FFmpegKit&lt;/code&gt; for &lt;code&gt;Linux&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&#34;6-react-native&#34;&gt;6. React Native
&lt;/h3&gt;&lt;p&gt;See &lt;a class=&#34;link&#34; href=&#34;react-native&#34; &gt;React Native&lt;/a&gt; to learn more about &lt;code&gt;FFmpegKit&lt;/code&gt; for &lt;code&gt;React Native&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&#34;7-build-scripts&#34;&gt;7. Build Scripts
&lt;/h3&gt;&lt;p&gt;Use &lt;code&gt;android.sh&lt;/code&gt;, &lt;code&gt;ios.sh&lt;/code&gt;, &lt;code&gt;linux.sh&lt;/code&gt;, &lt;code&gt;macos.sh&lt;/code&gt; and &lt;code&gt;tvos.sh&lt;/code&gt; to build &lt;code&gt;FFmpegKit&lt;/code&gt; for each native platform.&lt;/p&gt;
&lt;p&gt;All scripts support additional options to enable optional libraries and disable platform architectures. See
&lt;a class=&#34;link&#34; href=&#34;https://github.com/arthenica/ffmpeg-kit/wiki/Building&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Building&lt;/a&gt; wiki page for the details.&lt;/p&gt;
&lt;h3 id=&#34;8-ffmpegkit-library&#34;&gt;8. FFmpegKit Library
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;FFmpegKit&lt;/code&gt; is a wrapper library that allows you to easily run &lt;code&gt;FFmpeg&lt;/code&gt;/&lt;code&gt;FFprobe&lt;/code&gt; commands in applications. It
provides additional features on top of &lt;code&gt;FFmpeg&lt;/code&gt; to enable platform specific resources, control how commands are
executed and how the results are handled.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Android&lt;/code&gt; library of &lt;code&gt;FFmpegKit&lt;/code&gt; has a &lt;code&gt;Java&lt;/code&gt; API, &lt;code&gt;Apple&lt;/code&gt; libraries (&lt;code&gt;iOS&lt;/code&gt;, &lt;code&gt;macOS&lt;/code&gt;, &lt;code&gt;tvOS&lt;/code&gt;) have an &lt;code&gt;Objective-C&lt;/code&gt;
API, &lt;code&gt;Flutter&lt;/code&gt; library comes with a &lt;code&gt;Dart&lt;/code&gt; API, &lt;code&gt;Linux&lt;/code&gt; library has a &lt;code&gt;C++&lt;/code&gt; API and &lt;code&gt;React Native&lt;/code&gt; library provides
a &lt;code&gt;JavaScript&lt;/code&gt; API with &lt;code&gt;Typescript&lt;/code&gt; definitions, which are identical in terms of features and capabilities.&lt;/p&gt;
&lt;h3 id=&#34;9-packages&#34;&gt;9. Packages
&lt;/h3&gt;&lt;p&gt;There are eight different &lt;code&gt;ffmpeg-kit&lt;/code&gt; packages distributed on
&lt;a class=&#34;link&#34; href=&#34;https://github.com/arthenica/ffmpeg-kit/releases&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Github&lt;/a&gt;,
&lt;a class=&#34;link&#34; href=&#34;https://search.maven.org&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Maven Central&lt;/a&gt;, &lt;a class=&#34;link&#34; href=&#34;https://cocoapods.org&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;CocoaPods&lt;/a&gt;, &lt;a class=&#34;link&#34; href=&#34;https://pub.dev&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;pub&lt;/a&gt; and
&lt;a class=&#34;link&#34; href=&#34;https://www.npmjs.com&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;npm&lt;/a&gt;.
Below you can see which system libraries and external libraries are enabled in each one of them.&lt;/p&gt;
&lt;p&gt;Please remember that some parts of &lt;code&gt;FFmpeg&lt;/code&gt; are licensed under the &lt;code&gt;GPL&lt;/code&gt; and only &lt;code&gt;GPL&lt;/code&gt; licensed &lt;code&gt;ffmpeg-kit&lt;/code&gt; packages
include them.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th align=&#34;center&#34;&gt;&lt;/th&gt;
&lt;th align=&#34;center&#34;&gt;&lt;sup&gt;min&lt;/sup&gt;&lt;/th&gt;
&lt;th align=&#34;center&#34;&gt;&lt;sup&gt;min-gpl&lt;/sup&gt;&lt;/th&gt;
&lt;th align=&#34;center&#34;&gt;&lt;sup&gt;https&lt;/sup&gt;&lt;/th&gt;
&lt;th align=&#34;center&#34;&gt;&lt;sup&gt;https-gpl&lt;/sup&gt;&lt;/th&gt;
&lt;th align=&#34;center&#34;&gt;&lt;sup&gt;audio&lt;/sup&gt;&lt;/th&gt;
&lt;th align=&#34;center&#34;&gt;&lt;sup&gt;video&lt;/sup&gt;&lt;/th&gt;
&lt;th align=&#34;center&#34;&gt;&lt;sup&gt;full&lt;/sup&gt;&lt;/th&gt;
&lt;th align=&#34;center&#34;&gt;&lt;sup&gt;full-gpl&lt;/sup&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td align=&#34;center&#34;&gt;&lt;sup&gt;external libraries&lt;/sup&gt;&lt;/td&gt;
&lt;td align=&#34;center&#34;&gt;-&lt;/td&gt;
&lt;td align=&#34;center&#34;&gt;&lt;sup&gt;vid.stab&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;x264&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;x265&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;xvidcore&lt;/sup&gt;&lt;/td&gt;
&lt;td align=&#34;center&#34;&gt;&lt;sup&gt;gmp&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;gnutls&lt;/sup&gt;&lt;/td&gt;
&lt;td align=&#34;center&#34;&gt;&lt;sup&gt;gmp&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;gnutls&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;vid.stab&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;x264&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;x265&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;xvidcore&lt;/sup&gt;&lt;/td&gt;
&lt;td align=&#34;center&#34;&gt;&lt;sup&gt;lame&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;libilbc&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;libvorbis&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;opencore-amr&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;opus&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;shine&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;soxr&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;speex&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;twolame&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;vo-amrwbenc&lt;/sup&gt;&lt;/td&gt;
&lt;td align=&#34;center&#34;&gt;&lt;sup&gt;dav1d&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;fontconfig&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;freetype&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;fribidi&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;kvazaar&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;libass&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;libiconv&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;libtheora&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;libvpx&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;libwebp&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;snappy&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;zimg&lt;/sup&gt;&lt;/td&gt;
&lt;td align=&#34;center&#34;&gt;&lt;sup&gt;dav1d&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;fontconfig&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;freetype&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;fribidi&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;gmp&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;gnutls&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;kvazaar&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;lame&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;libass&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;libiconv&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;libilbc&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;libtheora&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;libvorbis&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;libvpx&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;libwebp&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;libxml2&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;opencore-amr&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;opus&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;shine&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;snappy&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;soxr&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;speex&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;twolame&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;vo-amrwbenc&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;zimg&lt;/sup&gt;&lt;/td&gt;
&lt;td align=&#34;center&#34;&gt;&lt;sup&gt;dav1d&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;fontconfig&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;freetype&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;fribidi&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;gmp&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;gnutls&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;kvazaar&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;lame&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;libass&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;libiconv&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;libilbc&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;libtheora&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;libvorbis&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;libvpx&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;libwebp&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;libxml2&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;opencore-amr&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;opus&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;shine&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;snappy&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;soxr&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;speex&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;twolame&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;vid.stab&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;vo-amrwbenc&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;x264&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;x265&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;xvidcore&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;zimg&lt;/sup&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&#34;center&#34;&gt;&lt;sup&gt;android system libraries&lt;/sup&gt;&lt;/td&gt;
&lt;td align=&#34;center&#34; colspan=8&gt;&lt;sup&gt;zlib&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;MediaCodec&lt;/sup&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&#34;center&#34;&gt;&lt;sup&gt;ios system libraries&lt;/sup&gt;&lt;/td&gt;
&lt;td align=&#34;center&#34; colspan=8&gt;&lt;sup&gt;bzip2&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;AudioToolbox&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;AVFoundation&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;iconv&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;VideoToolbox&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;zlib&lt;/sup&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;tr&gt;
&lt;td align=&#34;center&#34;&gt;&lt;sup&gt;macos system libraries&lt;/sup&gt;&lt;/td&gt;
&lt;td align=&#34;center&#34; colspan=8&gt;&lt;sup&gt;bzip2&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;AudioToolbox&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;AVFoundation&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;Core Image&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;iconv&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;OpenCL&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;OpenGL&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;VideoToolbox&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;zlib&lt;/sup&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&#34;center&#34;&gt;&lt;sup&gt;tvos system libraries&lt;/sup&gt;&lt;/td&gt;
&lt;td align=&#34;center&#34; colspan=8&gt;&lt;sup&gt;bzip2&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;AudioToolbox&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;iconv&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;VideoToolbox&lt;/sup&gt;&lt;br&gt;&lt;sup&gt;zlib&lt;/sup&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;AVFoundation&lt;/code&gt; is not available on &lt;code&gt;tvOS&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;VideoToolbox&lt;/code&gt; is not available on LTS releases of &lt;code&gt;iOS&lt;/code&gt; and &lt;code&gt;tvOS&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;zimg&lt;/code&gt; is supported since &lt;code&gt;v4.5.1&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;10-versions&#34;&gt;10. Versions
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;FFmpegKit&lt;/code&gt; binaries generated use the same major and minor version numbers as the upstream &lt;code&gt;FFmpeg&lt;/code&gt; project. The
third and last number in the version string, if exists, is specific to &lt;code&gt;FFmpegKit&lt;/code&gt;. It shows different releases from
the same &lt;code&gt;FFmpeg&lt;/code&gt; release branch.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;dev&lt;/code&gt; part in the version string indicates that &lt;code&gt;FFmpeg&lt;/code&gt; source code is cloned from the &lt;code&gt;FFmpeg&lt;/code&gt; &lt;code&gt;master&lt;/code&gt; branch and
the exact version number of &lt;code&gt;FFmpeg&lt;/code&gt; is obtained using the &lt;code&gt;git describe --tags&lt;/code&gt; command.&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th style=&#34;text-align: center&#34;&gt;Platforms&lt;/th&gt;
          &lt;th style=&#34;text-align: center&#34;&gt;FFmpegKit Version&lt;/th&gt;
          &lt;th style=&#34;text-align: center&#34;&gt;FFmpeg Version&lt;/th&gt;
          &lt;th style=&#34;text-align: center&#34;&gt;Release Date&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;Flutter&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/arthenica/ffmpeg-kit/releases/tag/flutter.v6.0.3&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;6.0.3&lt;/a&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;6.0&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;Sep 19, 2023&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;React Native&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/arthenica/ffmpeg-kit/releases/tag/react.native.v6.0.2&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;6.0.2&lt;/a&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;6.0&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;Sep 19, 2023&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;Flutter&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/arthenica/ffmpeg-kit/releases/tag/flutter.v6.0.2&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;6.0.2&lt;/a&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;6.0&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;Sep 03, 2023&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;React Native&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/arthenica/ffmpeg-kit/releases/tag/react.native.v6.0.1&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;6.0.1&lt;/a&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;6.0&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;Sep 03, 2023&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;Flutter&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/arthenica/ffmpeg-kit/releases/tag/flutter.v6.0.1&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;6.0.1&lt;/a&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;6.0&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;Sep 03, 2023&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;React Native&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/arthenica/ffmpeg-kit/releases/tag/react.native.v6.0.0&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;6.0.0&lt;/a&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;6.0&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;Aug 27, 2023&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;Flutter&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/arthenica/ffmpeg-kit/releases/tag/flutter.v6.0.0&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;6.0.0&lt;/a&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;6.0&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;Aug 27, 2023&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;Android&lt;br&gt;Apple&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/arthenica/ffmpeg-kit/releases/tag/v6.0&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;6.0&lt;/a&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;6.0&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;Aug 21, 2023&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;React Native&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/arthenica/ffmpeg-kit/releases/tag/react.native.v5.1.0&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;5.1.0&lt;/a&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;5.1.2&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;Oct 02, 2022&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;Flutter&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/arthenica/ffmpeg-kit/releases/tag/flutter.v5.1.0&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;5.1.0&lt;/a&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;5.1.2&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;Oct 02, 2022&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;Android&lt;br&gt;Apple&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/arthenica/ffmpeg-kit/releases/tag/v5.1&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;5.1&lt;/a&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;5.1.2&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;Sep 29, 2022&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;React Native&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/arthenica/ffmpeg-kit/releases/tag/react.native.v4.5.2&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;4.5.2&lt;/a&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;4.5-dev-3393&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;May 25, 2022&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;Flutter&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/arthenica/ffmpeg-kit/releases/tag/flutter.v4.5.1&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;4.5.1&lt;/a&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;4.5-dev-3393&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;Jan 02, 2022&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;React Native&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/arthenica/ffmpeg-kit/releases/tag/react.native.v4.5.1&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;4.5.1&lt;/a&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;4.5-dev-3393&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;Jan 02, 2022&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;Android&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/arthenica/ffmpeg-kit/releases/tag/v4.5.1&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;4.5.1&lt;/a&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;4.5-dev-3393&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;Jan 01, 2022&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;Apple&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/arthenica/ffmpeg-kit/releases/tag/v4.5.1&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;4.5.1&lt;/a&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;4.5-dev-3393&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;Dec 30, 2021&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;Flutter&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/arthenica/ffmpeg-kit/releases/tag/flutter.v4.5.0&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;4.5.0&lt;/a&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;4.5-dev-2008&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;Oct 05, 2021&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;React Native&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/arthenica/ffmpeg-kit/releases/tag/react.native.v4.5.0&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;4.5.0&lt;/a&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;4.5-dev-2008&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;Oct 01, 2021&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;Android&lt;br&gt;Apple&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/arthenica/ffmpeg-kit/releases/tag/v4.5&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;4.5&lt;/a&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;4.5-dev-2008&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;Sep 18, 2021&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;Android&lt;br&gt;Apple&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/arthenica/ffmpeg-kit/releases/tag/v4.4&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;4.4&lt;/a&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;4.4-dev-3015&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;Mar 03, 2021&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;11-lts-releases&#34;&gt;11. LTS Releases
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;FFmpegKit&lt;/code&gt; binaries are published in two release variants: &lt;code&gt;Main Release&lt;/code&gt; and &lt;code&gt;LTS Release&lt;/code&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Main releases include complete functionality of the library and support the latest SDK/API features.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;LTS releases are customized to support a wider range of devices. They are built using older API/SDK versions, so some features are not available on them.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This table shows the differences between two variants.&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th style=&#34;text-align: center&#34;&gt;&lt;/th&gt;
          &lt;th style=&#34;text-align: center&#34;&gt;Main Release&lt;/th&gt;
          &lt;th style=&#34;text-align: center&#34;&gt;LTS Release&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;Android API Level&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;24&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;16&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;Android Camera Access&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;Yes&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;-&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;Android Architectures&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;arm-v7a-neon&lt;br/&gt;arm64-v8a&lt;br/&gt;x86&lt;br/&gt;x86-64&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;arm-v7a&lt;br/&gt;arm-v7a-neon&lt;br/&gt;arm64-v8a&lt;br/&gt;x86&lt;br/&gt;x86-64&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;iOS Min SDK&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;12.1&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;10&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;iOS VideoToolbox&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;Yes&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;-&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;iOS AVFoundation&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;Yes&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;-&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;iOS Architectures&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;arm64&lt;br/&gt;arm64-simulator&lt;br/&gt;arm64-mac-catalyst&lt;br/&gt;x86-64&lt;br/&gt;x86-64-mac-catalyst&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;armv7&lt;br/&gt;arm64&lt;br/&gt;i386&lt;br/&gt;x86-64&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;iOS Bundle Format&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;XCFrameworks&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;Frameworks&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;Mac Catalyst Min Version&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;14.0&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;-&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;macOS Min SDK&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;10.15&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;10.12&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;macOS AVFoundation&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;Yes&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;-&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;macOS Architectures&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;arm64&lt;br/&gt;x86-64&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;x86-64&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;macOS Bundle Format&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;XCFrameworks&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;Frameworks&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;tvOS Min SDK&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;11.0&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;10.0&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;tvOS VideoToolbox&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;Yes&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;-&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;tvOS Architectures&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;arm64&lt;br/&gt;x86-64&lt;br/&gt;arm64-simulator&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;arm64&lt;br/&gt;x86-64&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;tvOS Bundle Format&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;XCFrameworks&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;Frameworks&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;12-documentation&#34;&gt;12. Documentation
&lt;/h3&gt;&lt;p&gt;A more detailed documentation is available under &lt;a class=&#34;link&#34; href=&#34;https://github.com/arthenica/ffmpeg-kit/wiki&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Wiki&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;13-test-applications&#34;&gt;13. Test Applications
&lt;/h3&gt;&lt;p&gt;You can see how &lt;code&gt;FFmpegKit&lt;/code&gt; is used inside an application by running test applications created under
&lt;a class=&#34;link&#34; href=&#34;https://github.com/arthenica/ffmpeg-kit-test&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;FFmpegKit Test&lt;/a&gt; project.&lt;/p&gt;
&lt;p&gt;All applications are identical and supports command execution, video encoding, accessing https urls, encoding audio,
burning subtitles, video stabilisation, pipe operations and concurrent command execution.&lt;/p&gt;
&lt;h3 id=&#34;14-license&#34;&gt;14. License
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;FFmpegKit&lt;/code&gt; library alone is licensed under the &lt;code&gt;LGPL v3.0&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;FFmpegKit&lt;/code&gt; bundles (&lt;code&gt;.aar&lt;/code&gt; archives, &lt;code&gt;frameworks&lt;/code&gt;, &lt;code&gt;xcframeworks&lt;/code&gt;), which include both  &lt;code&gt;FFmpegKit&lt;/code&gt; and &lt;code&gt;FFmpeg&lt;/code&gt;
libraries, are also licensed under the &lt;code&gt;LGPL v3.0&lt;/code&gt;. However, if the source code is built using the optional
&lt;code&gt;--enable-gpl&lt;/code&gt; flag or prebuilt binaries with &lt;code&gt;-gpl&lt;/code&gt; postfix are used, then &lt;code&gt;FFmpegKit&lt;/code&gt; bundles become subject to the
&lt;code&gt;GPL v3.0&lt;/code&gt;. Because, &lt;code&gt;FFmpeg&lt;/code&gt; is licensed under the &lt;code&gt;GPL v3.0&lt;/code&gt; in those bundles. And that makes the whole bundle
effectively subject to the &lt;code&gt;GPL v3.0&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;FFmpegKit&lt;/code&gt; build scripts always configure &lt;code&gt;FFmpeg&lt;/code&gt; with &lt;code&gt;--enable-version3&lt;/code&gt; option. And never enable non-free
libraries. Thus, &lt;code&gt;FFmpeg&lt;/code&gt; libraries created by &lt;code&gt;FFmpegKit&lt;/code&gt; are licensed under the &lt;code&gt;LGPL v3.0&lt;/code&gt; by default. Only when
&lt;code&gt;--enable-gpl&lt;/code&gt; is provided they become subject to &lt;code&gt;GPL v3.0&lt;/code&gt;. That is how prebuilt binaries with &lt;code&gt;-gpl&lt;/code&gt; postfix are
compiled.&lt;/p&gt;
&lt;p&gt;Refer to &lt;a class=&#34;link&#34; href=&#34;https://github.com/arthenica/ffmpeg-kit/wiki/Licenses&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Licenses&lt;/a&gt; to see the licenses of all libraries.
&lt;a class=&#34;link&#34; href=&#34;https://github.com/arthenica/ffmpeg-kit/wiki/Trademark&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Trademark&lt;/a&gt; lists the trademarks used in the &lt;code&gt;FFmpegKit&lt;/code&gt;
documentation.&lt;/p&gt;
&lt;h3 id=&#34;15-patents&#34;&gt;15. Patents
&lt;/h3&gt;&lt;p&gt;It is not clearly explained in their documentation, but it is believed that &lt;code&gt;FFmpeg&lt;/code&gt;, &lt;code&gt;kvazaar&lt;/code&gt;, &lt;code&gt;x264&lt;/code&gt; and &lt;code&gt;x265&lt;/code&gt;
include algorithms which are subject to software patents. If you live in a country where software algorithms are
patentable then you&amp;rsquo;ll probably need to pay royalty fees to patent holders. We are not lawyers though, so we recommend
that you seek legal advice first. See &lt;a class=&#34;link&#34; href=&#34;https://ffmpeg.org/legal.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;FFmpeg Patent Mini-FAQ&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;openh264&lt;/code&gt; clearly states that it uses patented algorithms. Therefore, if you build &lt;code&gt;ffmpeg-kit&lt;/code&gt; with &lt;code&gt;openh264&lt;/code&gt; and
distribute that library, then you are subject to pay MPEG LA licensing fees. Refer to
&lt;a class=&#34;link&#34; href=&#34;https://www.openh264.org/faq.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;OpenH264 FAQ&lt;/a&gt; page for the details.&lt;/p&gt;
&lt;h3 id=&#34;16-trademarks&#34;&gt;16. Trademarks
&lt;/h3&gt;&lt;p&gt;&lt;sup&gt;1&lt;/sup&gt; &lt;code&gt;FFmpeg&lt;/code&gt; is a trademark of &lt;a class=&#34;link&#34; href=&#34;http://www.bellard.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Fabrice Bellard&lt;/a&gt;. &lt;code&gt;FFmpegKit&lt;/code&gt; is an independent project and not affiliated with the &lt;code&gt;FFmpeg&lt;/code&gt; trademark holder.&lt;/p&gt;
&lt;h3 id=&#34;17-contributing&#34;&gt;17. Contributing
&lt;/h3&gt;&lt;p&gt;See our &lt;a class=&#34;link&#34; href=&#34;CONTRIBUTING.md&#34; &gt;CONTRIBUTING&lt;/a&gt; guide.&lt;/p&gt;
&lt;h3 id=&#34;18-see-also&#34;&gt;18. See Also
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://ffmpeg.org/doxygen/4.0/index.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;FFmpeg API Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://trac.ffmpeg.org/wiki/WikiStart&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;FFmpeg Wiki&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.ffmpeg.org/doxygen/4.0/md_LICENSE.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;FFmpeg External Library Licenses&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        
    </channel>
</rss>
