<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Kirill Lukyanov</title>
    <description>The latest articles on DEV Community by Kirill Lukyanov (@klukyanov).</description>
    <link>https://dev.to/klukyanov</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4092798%2F719db81c-244e-4965-a433-0662ed094a53.png</url>
      <title>DEV Community: Kirill Lukyanov</title>
      <link>https://dev.to/klukyanov</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/klukyanov"/>
    <language>en</language>
    <item>
      <title>Making Money on the Web with AI in 2026: What's Growing, What's Dying</title>
      <dc:creator>Kirill Lukyanov</dc:creator>
      <pubDate>Mon, 26 Oct 2026 15:09:19 +0000</pubDate>
      <link>https://dev.to/klukyanov/making-money-on-the-web-with-ai-in-2026-whats-growing-whats-dying-49ip</link>
      <guid>https://dev.to/klukyanov/making-money-on-the-web-with-ai-in-2026-whats-growing-whats-dying-49ip</guid>
      <description>&lt;p&gt;If your page ranks first on Google and an AI answer appears above it, you get 58% fewer clicks. That's from &lt;a href="https://ahrefs.com/blog/ai-overviews-reduce-clicks-update/" rel="noopener noreferrer"&gt;Ahrefs&lt;/a&gt;. Meanwhile Cursor, a code editor, went from $2B to over $4B in annualized revenue in about four months, according to press reports. Those two numbers sum up what AI did to making money on the web: services that do the work grow, sites that sell answers shrink.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Short version:&lt;/strong&gt; I wouldn't start an ad-funded content site in 2026, and I wouldn't build a Cursor competitor either. For a solo developer or a small team, the realistic options are a narrow paid tool for one profession, or doing AI implementation work for companies.&lt;/p&gt;

&lt;p&gt;This is part 2 of a short series on how people make money with AI right now. &lt;a href="https://dev.to/klukyanov/where-the-money-is-in-ai-apps-in-2026-a-niche-map-343m"&gt;Part 1&lt;/a&gt; covered mobile apps; this one covers websites and web services.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's growing: tools that do the work
&lt;/h2&gt;

&lt;p&gt;The fastest money on the web this year is in tools that write code. Press reports put &lt;strong&gt;Cursor&lt;/strong&gt; above $1B in annualized revenue by late 2025, $2B by February 2026 and over $4B by June. These are leaks, not filings, since the company is private. Even with a wide margin of error, it's one of the fastest ramps in software history.&lt;/p&gt;

&lt;p&gt;Next come the builders, where you describe an app or site in plain language. &lt;strong&gt;Lovable&lt;/strong&gt; reached $400M ARR by February 2026, per TechCrunch, and later reports put it near $600M by September. &lt;strong&gt;Replit&lt;/strong&gt;'s CEO cited $240M in 2025 revenue, with a stated goal of a $1B run rate by the end of 2026.&lt;/p&gt;

&lt;p&gt;What they have in common: you pay for a result you can use, working code or a working site, not an answer to read. It's the same pattern as photo and video apps in part 1. People pay for things they can take away and use at work.&lt;/p&gt;

&lt;p&gt;The second growing group is narrow B2B tools in the browser: decks, meeting transcription, product photos, documents. Productivity takes 15 of 50 spots in a16z's top consumer AI products by spend, and many of those live on the web rather than in the App Store. Companies pay for them, so prices are higher and churn is lower.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's shrinking: sites that answered questions
&lt;/h2&gt;

&lt;p&gt;On the other side are sites that lived on search traffic. The &lt;a href="https://reutersinstitute.politics.ox.ac.uk/journalism-media-and-technology-trends-and-predictions-2026" rel="noopener noreferrer"&gt;Reuters Institute&lt;/a&gt;, using Chartbeat data, found organic Google traffic to 2,500+ publisher sites fell 33% worldwide and 38% in the US between November 2024 and November 2025. Reference content was hit hardest: weather, horoscopes, TV listings, simple how-tos. Chartbeat data reported by &lt;a href="https://www.axios.com/2026/03/17/chartbeat-search-traffic-ai-chatbots" rel="noopener noreferrer"&gt;Axios&lt;/a&gt; shows small publishers lost 60% of search referrals over two years, versus 22% for large ones.&lt;/p&gt;

&lt;p&gt;The main driver is the AI answer above the results. Your page keeps the top spot but loses the visitors.&lt;/p&gt;

&lt;p&gt;Two examples of what this looks like in money:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Chegg&lt;/strong&gt;, a homework-help service, got most of its subscribers from Google searches for study questions. Q4 2024 revenue fell 24%, it hired Goldman Sachs to explore a sale, and in February 2025 it &lt;a href="https://searchengineland.com/google-sued-by-chegg-over-ai-overviews-hurting-traffic-and-revenue-452518" rel="noopener noreferrer"&gt;sued Google&lt;/a&gt; over AI Overviews.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stack Overflow&lt;/strong&gt;'s monthly question volume fell back to 2009 levels, when the site had just launched. The decline started before ChatGPT, but sped up sharply after it shipped in late 2022.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Business models: what grows, what shrinks
&lt;/h2&gt;

&lt;p&gt;My estimate of the entry bar is for one developer or a small team. Figures come from different sources and are measured differently, so don't compare them directly.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Examples&lt;/th&gt;
&lt;th&gt;Trend and numbers&lt;/th&gt;
&lt;th&gt;Entry bar&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Growing&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dev tools and builders&lt;/td&gt;
&lt;td&gt;Cursor, Lovable, Replit, Bolt&lt;/td&gt;
&lt;td&gt;Cursor: $4B+ annualized by June 2026 (press)&lt;/td&gt;
&lt;td&gt;Closed: needs model budgets and investors&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Narrow B2B tool in the browser&lt;/td&gt;
&lt;td&gt;Gamma, Photoroom, Otter, Fireflies&lt;/td&gt;
&lt;td&gt;Productivity: 15 of 50 in a16z top-50&lt;/td&gt;
&lt;td&gt;Medium: best shot for a solo dev&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI implementation for clients&lt;/td&gt;
&lt;td&gt;Automation, chatbots, integrations&lt;/td&gt;
&lt;td&gt;Demand growing with company interest in AI (my estimate)&lt;/td&gt;
&lt;td&gt;Low: needs experience, not capital&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Flat&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Thin wrapper over someone else's model&lt;/td&gt;
&lt;td&gt;"One prompt plus a checkout"&lt;/td&gt;
&lt;td&gt;Repeating the fate of mobile wrappers (my estimate)&lt;/td&gt;
&lt;td&gt;Low, but ChatGPT and Gemini absorb the feature&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Storefront for your own product or services&lt;/td&gt;
&lt;td&gt;Landing pages, portfolios, app pages&lt;/td&gt;
&lt;td&gt;Less from search, more from social, channels, newsletters (my estimate)&lt;/td&gt;
&lt;td&gt;Low: you bring the traffic yourself&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Shrinking&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ad-funded content site&lt;/td&gt;
&lt;td&gt;Reference, how-tos, disposable news&lt;/td&gt;
&lt;td&gt;−33% Google traffic worldwide, −60% for small publishers (Reuters Institute, Chartbeat)&lt;/td&gt;
&lt;td&gt;Low, but the visitors are leaving&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Affiliate reviews&lt;/td&gt;
&lt;td&gt;"Top 10 vacuums", comparison pages&lt;/td&gt;
&lt;td&gt;−58% clicks on position one with an AI answer (Ahrefs)&lt;/td&gt;
&lt;td&gt;Low, but the AI answer takes the click&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Q&amp;amp;A sites&lt;/td&gt;
&lt;td&gt;Chegg, Stack Overflow&lt;/td&gt;
&lt;td&gt;Chegg: −24% revenue in Q4 2024, lawsuit against Google&lt;/td&gt;
&lt;td&gt;Closed&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Why some grow and others shrink
&lt;/h2&gt;

&lt;p&gt;The line comes down to one question: &lt;strong&gt;can AI deliver the result right inside the search box or chat window?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If a site's product is an answer, a text or a list, AI hands it out on its own and nobody clicks through. That's what happened to horoscopes, recipes, reference pages, reviews and homework answers. The site wrote a good answer, the search engine summarized it, and the ads on the site stopped getting impressions.&lt;/p&gt;

&lt;p&gt;If the product is an action, chat AI doesn't replace it. It makes it cheaper and faster. Code has to run, a deck has to be shown to a client, a meeting has to be recorded and summarized, a business process has to be wired into a CRM. That happens in a separate service, and people pay for it.&lt;/p&gt;

&lt;p&gt;The second takeaway: a website stops being a traffic source and becomes a storefront. People arrive from a channel, a newsletter, social media or a referral, not from a random search. You have to bring them yourself.&lt;/p&gt;

&lt;h2&gt;
  
  
  What could break this
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Model costs.&lt;/strong&gt; Builders like Lovable and Bolt pay for every model call. Users complain about credits burning fast, and margins are thin. If the provider raises prices or ships the same product, a business built on someone else's model takes the hit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The platform ships it.&lt;/strong&gt; ChatGPT already makes decks, spreadsheets and simple sites. What protects a narrow tool is depth: the customer's data, integrations, a workflow tuned to one profession.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Search will keep changing.&lt;/strong&gt; The traffic numbers cover 2024–2025. AI answers keep expanding, and a model that looks "flat" today may be shrinking a year from now.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'd pick
&lt;/h2&gt;

&lt;p&gt;I wouldn't start an ad-funded content site now. Even a great page at position one gets fewer and fewer clicks, and better SEO won't fix that. I wouldn't build a Cursor competitor either: that race is between companies with billions in funding.&lt;/p&gt;

&lt;p&gt;A solo developer has two realistic paths. One is a narrow paid tool for a specific profession where AI removes the routine: marketplace sellers, accountants, lawyers, real-estate agents. It's the same logic as Cal AI in part 1, just in the browser and for businesses. The other is AI implementation for companies. That's what I do myself: automation and AI-powered services for businesses. Right now there's more demand for that than for "just a website".&lt;/p&gt;

&lt;p&gt;You still need a site. Treat it as a storefront you bring people to, not as a machine that collects traffic from Google.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://klukyanov.ru/notes/ai-web-money-models/" rel="noopener noreferrer"&gt;klukyanov.ru&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Shorter weekly write-ups (in Russian) — on &lt;a href="https://t.me/+KSAy8mfFOsgwYWMy" rel="noopener noreferrer"&gt;Telegram&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>saas</category>
      <category>seo</category>
      <category>startup</category>
    </item>
    <item>
      <title>Where the Money Is in AI Apps in 2026: A Niche Map</title>
      <dc:creator>Kirill Lukyanov</dc:creator>
      <pubDate>Wed, 21 Oct 2026 11:23:25 +0000</pubDate>
      <link>https://dev.to/klukyanov/where-the-money-is-in-ai-apps-in-2026-a-niche-map-343m</link>
      <guid>https://dev.to/klukyanov/where-the-money-is-in-ai-apps-in-2026-a-niche-map-343m</guid>
      <description>&lt;p&gt;In 2025, people spent more money in regular apps than in games for the first time. Generative AI is the main reason. But if you're thinking of building "an AI app", the money is not where it looks like it is. Chat assistants are taken. Photo, video, voice, and AI tucked inside a daily habit are where people still pay. I build iOS apps, so I pulled together the numbers by niche and wrote down where a small team can still get in.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Short version:&lt;/strong&gt; don't build another assistant. Build something that produces a file people keep, or remove the boring step from a task people already do every day. The second one is the realistic bet for a solo developer.&lt;/p&gt;

&lt;p&gt;This is part 1 of a short series on how people make money with AI right now. This one is about mobile apps; part 2 covers websites and web services.&lt;/p&gt;

&lt;h2&gt;
  
  
  The market: there is money
&lt;/h2&gt;

&lt;p&gt;According to &lt;a href="https://sensortower.com/blog/state-of-mobile-2026" rel="noopener noreferrer"&gt;Sensor Tower's State of Mobile 2026&lt;/a&gt;, consumers spent $167B in apps in 2025, up 10.6%. Non-game app spending grew 21% and passed games, which grew 1.3%. Generative AI apps were downloaded 3.8B times (double the year before), and their in-app revenue nearly tripled to over $5B.&lt;/p&gt;

&lt;p&gt;Growth hasn't stopped. &lt;a href="https://sensortower.com/press/sensor-tower-state-of-ai-2026-report-global-time-spent-on-generative-ai-apps-projected-to-more-than-double-year-over-year" rel="noopener noreferrer"&gt;Sensor Tower projects&lt;/a&gt; AI apps will pass $4B in H1 2026, 36% more than H2 2025. Time spent doubled year over year, from 17.2B to 36B hours. More than 200,000 apps now mention AI in their descriptions.&lt;/p&gt;

&lt;p&gt;That last number matters most. With 200,000 apps saying "AI", the label on its own sells nothing. What sells is the job it does.&lt;/p&gt;

&lt;h2&gt;
  
  
  Chat assistants: the field is taken
&lt;/h2&gt;

&lt;p&gt;In Q1 2026, ChatGPT, DeepSeek and Google Gemini held almost 90% of time spent in AI assistant apps (Sensor Tower). &lt;a href="https://appfigures.com/resources/insights/20251121/amp?f=3" rel="noopener noreferrer"&gt;Appfigures estimates&lt;/a&gt; ChatGPT made $187M net on mobile in October 2025, with Grok at $8.7M, Claude at $5M and Perplexity at $3.1M. Even companies with their own frontier models are 20–40x behind.&lt;/p&gt;

&lt;p&gt;It wasn't always like this. In 2023–2024, thin wrappers did well: &lt;a href="https://appfigures.com/resources/insights/20250131/3-we-ranked-every-ai-app-and-here-are-the-highest-earners" rel="noopener noreferrer"&gt;Appfigures&lt;/a&gt; puts ChatOn at $135M and Chat &amp;amp; Ask AI at $109M over two years. That was before OpenAI and Google shipped good apps of their own, when people searched the App Store for "ChatGPT" and installed whatever came up first. Today the free original beats any wrapper. That's my read, not a finding from the reports.&lt;/p&gt;

&lt;h2&gt;
  
  
  The niche map
&lt;/h2&gt;

&lt;p&gt;Figures come from different sources and aren't directly comparable: some are net of store fees, some gross, some are company claims.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Niche&lt;/th&gt;
&lt;th&gt;Who earns&lt;/th&gt;
&lt;th&gt;Numbers&lt;/th&gt;
&lt;th&gt;Barrier for a small team&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;General-purpose assistants&lt;/td&gt;
&lt;td&gt;ChatGPT, Claude, Grok, Perplexity&lt;/td&gt;
&lt;td&gt;ChatGPT: $187M net in Oct 2025 (Appfigures)&lt;/td&gt;
&lt;td&gt;Closed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Video generation &amp;amp; avatars&lt;/td&gt;
&lt;td&gt;Higgsfield, HeyGen, Runway, Kling, Synthesia&lt;/td&gt;
&lt;td&gt;Higgsfield claims $1B annualized revenue (company claim)&lt;/td&gt;
&lt;td&gt;High: generation is expensive, margins thin&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Photo: editing, retouching, product shots&lt;/td&gt;
&lt;td&gt;Photoroom, Evoto, FaceApp, Reface, Topaz&lt;/td&gt;
&lt;td&gt;About ten photo tools in a16z's top 50 by spend&lt;/td&gt;
&lt;td&gt;Medium: a narrow job works&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Audio: music, voice, read-aloud&lt;/td&gt;
&lt;td&gt;Suno, ElevenLabs, Speechify, Moises&lt;/td&gt;
&lt;td&gt;Suno is #7 in a16z's top 50&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Productivity: meetings, notes, slides&lt;/td&gt;
&lt;td&gt;Otter, Plaud, Fireflies, Gamma, Notion&lt;/td&gt;
&lt;td&gt;15 of 50 spots in a16z's top 50&lt;/td&gt;
&lt;td&gt;Medium: higher prices, companies pay&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Companions &amp;amp; roleplay&lt;/td&gt;
&lt;td&gt;Zeta, Tipsy Chat, Character.AI&lt;/td&gt;
&lt;td&gt;$165M general + $163M romance in H1 2026, gross (Appfigures via Decrypt)&lt;/td&gt;
&lt;td&gt;Low technically, high on moderation and reputation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Homework &amp;amp; study&lt;/td&gt;
&lt;td&gt;Gauth (ByteDance), Question.AI&lt;/td&gt;
&lt;td&gt;~$2.5M net combined in 2024 on 15M installs (Appfigures)&lt;/td&gt;
&lt;td&gt;High: big players plus free ChatGPT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI inside a daily habit: food, health, fitness&lt;/td&gt;
&lt;td&gt;Cal AI and narrow trackers&lt;/td&gt;
&lt;td&gt;Cal AI: $40M+ trailing-12-month sales, acquired by MyFitnessPal in March 2026&lt;/td&gt;
&lt;td&gt;Low–medium: best shot for a solo dev&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The a16z ranking is the &lt;a href="https://officechai.com/ai/top-consumer-apps-by-revenue/" rel="noopener noreferrer"&gt;top 50 consumer AI products&lt;/a&gt; by US consumer spend (October 2026, YipitData), web and mobile combined. More than half of the list is photo, video and audio.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why people pay for photo, video and voice
&lt;/h2&gt;

&lt;p&gt;My interpretation, but it fits the numbers.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The result is a file.&lt;/strong&gt; You read a chatbot answer and close it. A video, an edited photo or a voiceover gets saved, posted, sent to a client. It's easier to pay for something you can take away.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Free ChatGPT is worse at it.&lt;/strong&gt; A general assistant can draw a picture. It won't batch-remove backgrounds from forty product shots at marketplace size.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Professionals pay.&lt;/strong&gt; Marketplace sellers, photographers, creators and marketers treat these as work tools that pay for themselves.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The flip side is cost. Every video generation costs money, and an all-you-can-eat plan will put you in the red. Credits instead of unlimited, and expensive models only on the paid tier.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where a solo developer fits: AI inside a habit
&lt;/h2&gt;

&lt;p&gt;The most telling story of the year is &lt;strong&gt;Cal AI&lt;/strong&gt;. Two high schoolers built a calorie counter by photo: snap your plate, get calories and protein. In under two years it passed 15M downloads, did over $40M in sales in the trailing 12 months, and MyFitnessPal bought it in March 2026 (terms undisclosed).&lt;/p&gt;

&lt;p&gt;The model inside isn't theirs, and food recognition isn't unique. What worked: AI removed the most tedious step of a task people already wanted to do. Counting calories was always the goal; typing in every spoonful was the problem.&lt;/p&gt;

&lt;p&gt;The recipe:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Pick a task people do regularly, daily or weekly.&lt;/li&gt;
&lt;li&gt;Find the most tedious step: data entry, transcription, counting.&lt;/li&gt;
&lt;li&gt;Let AI remove that step, and keep the rest a good ordinary app.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I do this in my own fasting app: calories from a photo are part of the daily log, and recognition runs on the phone through Apple Foundation Models, offline and with no API bill. When a request costs nothing, a free tier and a long trial don't turn into losses.&lt;/p&gt;

&lt;p&gt;A habit also fights the other AI-app problem, churn. People leave AI apps faster than regular ones, and what keeps them is the recurring task, not the model. I covered that in &lt;a href="https://dev.to/klukyanov/ai-apps-earn-more-but-lose-subscribers-faster-3d6l"&gt;an earlier breakdown of RevenueCat's data&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What can break it
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The platform eats your feature.&lt;/strong&gt; If your product is one button, it'll show up in ChatGPT, Google Photos or iOS itself. Data, history and a good workflow are what protect you.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Store rules.&lt;/strong&gt; In April 2026 Apple briefly pulled Cal AI: it took payments via Stripe outside in-app purchase and showed the weekly price more prominently than the actual charge. It came back after fixes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost.&lt;/strong&gt; A cloud model is a variable cost per user. Do the math before launch, not after the first invoice.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Companions are their own thing.&lt;/strong&gt; Hundreds of millions in revenue, but the top 10% of apps take 89% of it (Appfigures, 2025), and moderation and reputational risk are the highest anywhere.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What I'd pick
&lt;/h2&gt;

&lt;p&gt;Not an assistant, and not a video generator: the first is taken, the second needs model budgets a solo developer doesn't have. I'd take a boring recurring task in a niche where people already pay for apps (food, fitness, health, bookkeeping, photos for sellers), have AI remove the most tedious step, on-device where possible, and sell an annual plan with a long trial.&lt;/p&gt;

&lt;p&gt;Less exciting than "my own ChatGPT". But it's what the one real success story of the year looks like.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://klukyanov.ru/notes/ai-apps-money-map/" rel="noopener noreferrer"&gt;klukyanov.ru&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Shorter weekly write-ups (in Russian) — on &lt;a href="https://t.me/+KSAy8mfFOsgwYWMy" rel="noopener noreferrer"&gt;Telegram&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>mobile</category>
      <category>startup</category>
      <category>ios</category>
    </item>
    <item>
      <title>AI apps earn more but lose subscribers faster</title>
      <dc:creator>Kirill Lukyanov</dc:creator>
      <pubDate>Mon, 19 Oct 2026 14:45:33 +0000</pubDate>
      <link>https://dev.to/klukyanov/ai-apps-earn-more-but-lose-subscribers-faster-3d6l</link>
      <guid>https://dev.to/klukyanov/ai-apps-earn-more-but-lose-subscribers-faster-3d6l</guid>
      <description>&lt;p&gt;AI features make people pay faster. They also make people leave faster. RevenueCat's latest data shows AI subscription apps earn 41% more per paying user in year one, but only about one in five annual subscribers renews. For other apps it's closer to one in three. I build iOS apps with subscriptions, so I went through the numbers and wrote down what I'd actually change.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Short version:&lt;/strong&gt; subscriptions are paid for by habit, not by the model inside the app. Judge an AI app by its second year, not its first month.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the numbers come from
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.revenuecat.com/state-of-subscription-apps" rel="noopener noreferrer"&gt;State of Subscription Apps 2026&lt;/a&gt; by RevenueCat, the company whose SDK handles roughly 20% of global subscription app revenue. The data covers 2025: 115,000+ apps, $16B+ in revenue, 1B+ transactions. An "AI app" here means one where AI is part of the core experience, which is 27% of the sample.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI vs non-AI apps
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;AI apps&lt;/th&gt;
&lt;th&gt;Non-AI apps&lt;/th&gt;
&lt;th&gt;Difference&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Revenue per payer, first month&lt;/td&gt;
&lt;td&gt;$18.92&lt;/td&gt;
&lt;td&gt;$13.59&lt;/td&gt;
&lt;td&gt;+39%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Revenue per payer, first year&lt;/td&gt;
&lt;td&gt;$30.16&lt;/td&gt;
&lt;td&gt;$21.37&lt;/td&gt;
&lt;td&gt;+41%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Trial start rate (of downloads)&lt;/td&gt;
&lt;td&gt;8.5%&lt;/td&gt;
&lt;td&gt;5.6%&lt;/td&gt;
&lt;td&gt;+52%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Paid by day 35 (of downloads)&lt;/td&gt;
&lt;td&gt;2.4%&lt;/td&gt;
&lt;td&gt;2.0%&lt;/td&gt;
&lt;td&gt;+20%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Annual plan renewal&lt;/td&gt;
&lt;td&gt;21.1%&lt;/td&gt;
&lt;td&gt;30.7%&lt;/td&gt;
&lt;td&gt;−9.6 pts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Monthly plan kept for 12 months&lt;/td&gt;
&lt;td&gt;6.1%&lt;/td&gt;
&lt;td&gt;9.5%&lt;/td&gt;
&lt;td&gt;−3.4 pts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Weekly plan kept for a year&lt;/td&gt;
&lt;td&gt;1.2%&lt;/td&gt;
&lt;td&gt;1.7%&lt;/td&gt;
&lt;td&gt;−0.5 pts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Refund rate (median)&lt;/td&gt;
&lt;td&gt;4.2%&lt;/td&gt;
&lt;td&gt;3.5%&lt;/td&gt;
&lt;td&gt;+0.7 pts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Share of monthly plans&lt;/td&gt;
&lt;td&gt;59.8%&lt;/td&gt;
&lt;td&gt;26.2%&lt;/td&gt;
&lt;td&gt;×2.3&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The top half of the table is about how well AI sells. People start trials more often, convert more often and pay more. The bottom half is about how well AI retains people, and it's worse on every line. Out of 100 annual subscribers, 21 come back for year two in an AI app and 31 in a regular one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why they leave
&lt;/h2&gt;

&lt;p&gt;The report gives the numbers, not the reasons. What follows is my own reading of them.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;People buy an effect, not a habit.&lt;/strong&gt; Generating an avatar or reading calories off a food photo is impressive the first time. If the job is one-off, there's no reason to come back. Across categories, 26–40% of voluntary cancellations cite "not using it enough".&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monthly plans.&lt;/strong&gt; 60% of AI subscriptions are monthly, compared with 26% for other apps. A monthly plan asks "still worth it?" every 30 days.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Expectations run ahead of results.&lt;/strong&gt; Refunds are higher, and the ceiling is higher too: 16% vs 12.5%. The ad promises magic, the model sometimes gets it wrong, and the user notices while a refund is still easy.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Price.&lt;/strong&gt; Model costs push AI apps to higher prices, and "too expensive" is the top cancellation reason, at 25–45% depending on category.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Five things I'd do with an AI app
&lt;/h2&gt;

&lt;p&gt;Examples from my own apps are illustrations, not measurements.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Sell annual, not monthly.&lt;/strong&gt; Annual plans renew less often than you'd like, but you collect twelve months up front. If the user cools off in month three, a monthly plan just ends. The median annual price in the report is $34.80, up from $31.60.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Use long trials instead of 3-day ones.&lt;/strong&gt; Trials of 17+ days convert at 42.5% vs 25.5% for trials of four days or less. 55% of 3-day trial cancellations happen on day zero, so a short trial tests the wow moment, not the habit. In Clay Sniper, a shooting journal, I moved the Pro trial from three days to two weeks so a shooter gets at least a couple of range sessions in.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Put AI inside a recurring job.&lt;/strong&gt; AI keeps users when it removes friction from something they do every week anyway, not when it's a standalone party trick. In Lunar Fasting, calories from a photo are one line in a daily log next to water, fasting and weight, not a separate "scan your food" screen.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Push marginal cost toward zero.&lt;/strong&gt; Every cloud request costs money, which is why AI apps tighten freemium, shorten trials and add expensive AI tiers. That fights tactic 2. In Lunar Fasting, photos can be analyzed on-device with Apple Foundation Models, offline and free. The cloud is only used with the user's own API key. If a request costs nothing, a long trial doesn't lose money.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Don't give away a free tier you don't need.&lt;/strong&gt; Hard paywalls convert 10.7% of downloads by day 35, freemium converts 2.1%, and annual retention is nearly identical (27% vs 28%). The paywall model decides how many people pay, not how many stay.&lt;/p&gt;

&lt;h2&gt;
  
  
  Modeling the economics
&lt;/h2&gt;

&lt;p&gt;An AI app takes about 63% of its first-year revenue per payer in month one, roughly the same share as a non-AI app. The difference shows up only at renewal, outside a first-year window. If your ad bidding optimizes for short-horizon value, it's easy to overpay for AI users. Plan for a lower lifetime value than market averages suggest.&lt;/p&gt;

&lt;p&gt;One more detail from the report: on Google Play, 32% of cancellations are failed payments rather than a user decision. On the App Store it's 15%. Part of your "churn" may be fixed by a card-update reminder, not by the product.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bottom line
&lt;/h2&gt;

&lt;p&gt;I wouldn't build the product around the model. Models get cheaper and more alike, and in a year your competitor will have the same one. I'd build around a job people come back to every week and let AI take the tedium out of it. Sell an annual plan with a long trial, run inference on the device where possible, and look at year-two revenue.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://klukyanov.ru/notes/ai-apps-churn/" rel="noopener noreferrer"&gt;klukyanov.ru&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Shorter weekly write-ups (in Russian) — on &lt;a href="https://t.me/+KSAy8mfFOsgwYWMy" rel="noopener noreferrer"&gt;Telegram&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ios</category>
      <category>ai</category>
      <category>mobile</category>
      <category>business</category>
    </item>
    <item>
      <title>OpenAI dots: the agent that works while you sleep</title>
      <dc:creator>Kirill Lukyanov</dc:creator>
      <pubDate>Sat, 17 Oct 2026 10:01:26 +0000</pubDate>
      <link>https://dev.to/klukyanov/openai-dots-the-agent-that-works-while-you-sleep-6p2</link>
      <guid>https://dev.to/klukyanov/openai-dots-the-agent-that-works-while-you-sleep-6p2</guid>
      <description>&lt;p&gt;A regular ChatGPT conversation lives as long as the tab is open. Close it, and everything waits for your next message. On September 29 at DevDay, OpenAI showed the opposite: an agent that keeps doing the job after you've gone to bed. OpenAI calls it a &lt;strong&gt;dot&lt;/strong&gt;. Each dot gets its own cloud computer with a browser, access to your apps, and its own memory, and it's on around the clock.&lt;/p&gt;

&lt;p&gt;I went through what dots can do at launch, how their permissions work, what they cost and where the limits are. I haven't run a dot myself yet. OpenAI's announcement page returned 403 while I was collecting material, so the facts below come from detailed write-ups that cite OpenAI's announcement and help center. The key numbers match across three or four sources; where there's only one source, I say so.&lt;/p&gt;

&lt;p&gt;This is a snapshot as of &lt;strong&gt;October 17, 2026&lt;/strong&gt;. Dots are rolling out gradually, and details will change.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a dot is
&lt;/h2&gt;

&lt;p&gt;A dot is a persistent AI agent inside ChatGPT, running on GPT-6 Astra (released September 3). Four things set it apart from a normal chat:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Its own computer.&lt;/strong&gt; A cloud machine with a browser that keeps running when you're not chatting. You can open it and watch what the agent is doing right now.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Access to your apps.&lt;/strong&gt; Mail, calendar, Slack, spreadsheets: 4,000+ services via plugins.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Its own memory.&lt;/strong&gt; A dot keeps notes separate from ChatGPT memory and learns from your corrections.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unprompted work.&lt;/strong&gt; When you don't give it anything, it looks for ways to help. OpenAI calls this proactive research.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every dot has a name, a look and a handle like &lt;code&gt;@yourname-dot&lt;/code&gt;. You can talk to it in ChatGPT on desktop and mobile, in Slack and Microsoft Teams, or call it by voice. Context carries across channels.&lt;/p&gt;

&lt;p&gt;The example everyone repeats from the launch: an early tester's dot found an invoice he had forgotten to send, assembled it from an email thread and sent it as a PDF — after he approved it. The last part is the important one.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it works: computer, plugins and Codex
&lt;/h2&gt;

&lt;p&gt;A dot is a coordinator rather than a worker. It doesn't write code itself; it hands coding to Codex and heavy office work to ChatGPT Work. Those tasks show up as their own threads you can steer directly.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cloud computer.&lt;/strong&gt; Visible under Computers. You can hit &lt;em&gt;Take over&lt;/em&gt;, drive the browser yourself and hand control back. Sign-in forms send credentials to the remote browser without the model seeing them; reusing a saved password requires your confirmation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Your computer.&lt;/strong&gt; Some sites block cloud browsers, so you can let a dot use your laptop via the ChatGPT desktop app (&lt;em&gt;Allow access&lt;/em&gt; / &lt;em&gt;Revoke access&lt;/em&gt;). One personal computer at a time, and it must be online with the app open.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plugins.&lt;/strong&gt; The same as ChatGPT, Work and Codex, with permissions per action: read email yes, send email no.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Limits.&lt;/strong&gt; Talking to a dot doesn't count toward ChatGPT usage limits. Codex and Work tasks it starts do.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Memory: it learns, but you can't see the notes
&lt;/h2&gt;

&lt;p&gt;A dot draws on the conversation, relevant ChatGPT memory and its own notes. The notes are the most controversial part of the system: you &lt;strong&gt;can't view, correct or delete individual entries&lt;/strong&gt;. The only full reset is deleting the dot. Disconnecting a plugin stops new access but keeps what was already learned; turning off ChatGPT memory stops sharing but doesn't delete what the dot already received. Credentials, images and screenshots don't go into dot context.&lt;/p&gt;

&lt;p&gt;For an agent that reads your mail for months, the lack of a "forget this" button is a real gap.&lt;/p&gt;

&lt;h2&gt;
  
  
  Four rules, and what a dot will never do on its own
&lt;/h2&gt;

&lt;p&gt;The core of dots isn't the model, it's the permission system. Under Custom rules, every action gets one of four modes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Take action without asking&lt;/strong&gt; — routine where mistakes cost nothing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Take action when you say so&lt;/strong&gt; — pre-approved, executed on your command.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ask before taking action&lt;/strong&gt; — the dot prepares a draft and waits for your yes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hand off to you&lt;/strong&gt; — the dot gets the task to the point where a human is needed.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;On top of your rules sit limits you can't remove:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Password changes and money transfers&lt;/strong&gt; always go back to you.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Purchases&lt;/strong&gt; need approval, and advance approval only works for a specific purchase.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Permanent deletion and software installs&lt;/strong&gt; may need approval every time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auto-review&lt;/strong&gt; checks actions that touch accounts or share information, such as sending email, and can block, ask or stop. The dot can't turn it off.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Proactive research is read-only&lt;/strong&gt;: it can't send messages, change app content or control a browser.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pause stops the main task but not necessarily delegated or scheduled work, and nothing is rolled back: a sent email stays sent.&lt;/p&gt;

&lt;h2&gt;
  
  
  The safety numbers
&lt;/h2&gt;

&lt;p&gt;From the GPT-6 Astra system card appendix, as reported in Flavio Copes's deep dive (the only source with the full set):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Prompt injection:&lt;/strong&gt; 100 runs of 500 simulated emails, 16,600 attacks — none succeeded.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Adaptive attacker:&lt;/strong&gt; 2,638 attempts, no success.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scope violations in chained tasks:&lt;/strong&gt; 8.6% with five tasks in between, 19.7% with ten. No severe breaches.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Permission changes mid-task:&lt;/strong&gt; adapted in all 17 explicit cases; passed 45 of 49 episodes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data exfiltration&lt;/strong&gt; by human red-teamers: all attempts failed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The third line is the one I care about. In a chain of ten tasks, almost one time in five the agent steps outside its brief. That's not a hack, it's an agent forgetting what it was asked — and long chains of tasks over weeks are exactly how a dot is meant to work. OpenAI says it plainly: "Dots can still make mistakes, so always review consequential work."&lt;/p&gt;

&lt;h2&gt;
  
  
  Who gets it and what it costs
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Plan&lt;/th&gt;
&lt;th&gt;Dots&lt;/th&gt;
&lt;th&gt;Price&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Free, Go, Plus&lt;/td&gt;
&lt;td&gt;No, no date&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pro&lt;/td&gt;
&lt;td&gt;One dot; not in the EEA, UK or Switzerland&lt;/td&gt;
&lt;td&gt;from $100/month&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Business Premium&lt;/td&gt;
&lt;td&gt;One dot, all supported regions&lt;/td&gt;
&lt;td&gt;$100/user/month annually, $125 monthly&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Enterprise, Edu, Healthcare&lt;/td&gt;
&lt;td&gt;Beta, off until an admin enables it&lt;/td&gt;
&lt;td&gt;via sales&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The first dot is included, with extended limits for the first month after launch. Post-launch limits, extra dots and extra capacity have no published prices yet. Setup is desktop-only, and users under 18 can't use dots.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dots vs. the competition
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Product&lt;/th&gt;
&lt;th&gt;What it is&lt;/th&gt;
&lt;th&gt;Difference from dots&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;OpenAI dots&lt;/td&gt;
&lt;td&gt;One always-on coordinator with its own cloud computer, 4,000+ apps&lt;/td&gt;
&lt;td&gt;Delegates to Codex and Work, strict rules, no API&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Grok Bot&lt;/td&gt;
&lt;td&gt;Closest match: persistent cloud computer, scheduled work, asks before sensitive actions&lt;/td&gt;
&lt;td&gt;Several named Bots instead of one agent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cursor Projects&lt;/td&gt;
&lt;td&gt;Coordinator for long-running coding work&lt;/td&gt;
&lt;td&gt;Coding only, returns pull requests&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Meta Muse&lt;/td&gt;
&lt;td&gt;Consumer assistant for errands, travel and forms via the Muse app and WhatsApp&lt;/td&gt;
&lt;td&gt;Free for most uses; a small-business version launched on DevDay&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This comparison is based on product descriptions, not measurements.&lt;/p&gt;

&lt;h2&gt;
  
  
  What dots can't do yet
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;No email address of their own.&lt;/li&gt;
&lt;li&gt;Can't call you; texting is a narrow beta for some US Pro users.&lt;/li&gt;
&lt;li&gt;One primary dot per person; teams of dots are planned.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No API.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;No way to inspect or clean memory entry by entry.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  A developer's view: no API is a signal
&lt;/h2&gt;

&lt;p&gt;I build apps and agents, so the first thing I looked for was a way to talk to a dot from code. There isn't one: OpenAI hasn't announced an API for dots. It's a ChatGPT product, not a developer platform.&lt;/p&gt;

&lt;p&gt;The Codex link is telling, though. A dot can start a task in a Codex cloud environment while your computer is off, send work to your connected machine, or continue an existing Codex thread. OpenAI is building a hierarchy: on top, an agent that knows you and your work; below, specialized executors. If you build agents yourself, selling "an assistant that does everything" just got harder, while a niche executor with a clear interface is still in demand.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'd hand to a dot
&lt;/h2&gt;

&lt;p&gt;A good dot task is recurring, spans several apps and ends in a draft:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Every Friday at 4 pm, match delivered projects to invoices, draft missing invoices, send nothing, message me a list.&lt;/li&gt;
&lt;li&gt;Watch the Leads label, draft replies, ask before sending, flag anyone silent for 48 hours in Slack.&lt;/li&gt;
&lt;li&gt;Weekly, compare stock with reorder levels and draft purchase orders for approval. Never place orders.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A bad task is one where mistakes can't be undone: money, passwords, unchecked emails to important people. Not because the dot is dumb, but because 19.7% out-of-scope on long chains is a lot for irreversible actions. Treat it like a new assistant: drafts first, then widen permissions one at a time.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://klukyanov.ru/notes/openai-dots/" rel="noopener noreferrer"&gt;klukyanov.ru&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Shorter weekly write-ups (in Russian) — on &lt;a href="https://t.me/+KSAy8mfFOsgwYWMy" rel="noopener noreferrer"&gt;Telegram&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>openai</category>
      <category>agents</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Swift on Android, part 1: what the official SDK does and how it differs from KMP</title>
      <dc:creator>Kirill Lukyanov</dc:creator>
      <pubDate>Tue, 13 Oct 2026 13:13:12 +0000</pubDate>
      <link>https://dev.to/klukyanov/swift-on-android-part-1-what-the-official-sdk-does-and-how-it-differs-from-kmp-574b</link>
      <guid>https://dev.to/klukyanov/swift-on-android-part-1-what-the-official-sdk-does-and-how-it-differs-from-kmp-574b</guid>
      <description>&lt;p&gt;I ship an app on Kotlin Multiplatform, and when I counted the lines, the shared Kotlin code turned out to be just 14% of the codebase. So here's the question I keep asking myself as an iOS developer: what if the shared code had been Swift running on Android, instead of Kotlin running on iPhone? Since Swift 6.3 that's an officially supported option.&lt;/p&gt;

&lt;p&gt;This is part 1 of a three-part series. Here I cover what actually shipped, how it works, what's in the Swift SDK for Android and what isn't, and how it compares to KMP feature by feature. Part 2 is hands-on, and part 3 is an honest side-by-side on a real app.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I care
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://klukyanov.ru/projects/carcode/?theme=dark" rel="noopener noreferrer"&gt;MyCarCode&lt;/a&gt;, my car maintenance log, is built with Kotlin Multiplatform: shared logic in Kotlin, native UI on both sides (SwiftUI and Jetpack Compose, each with its own Flux stores). At build 8 I counted:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;shared Kotlin code (&lt;code&gt;commonMain&lt;/code&gt;): &lt;strong&gt;1,574 lines&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;iOS UI and stores: &lt;strong&gt;~9.8k lines of Swift&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Android UI and stores: &lt;strong&gt;~9.6k lines of Kotlin&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's roughly 14% shared code. For that 14% I paid with a second language on the iOS side, Gradle running inside the Xcode build, and a long fight with Firebase linking. If I mentally write the logic in Swift anyway, maybe Swift should be the one traveling.&lt;/p&gt;

&lt;h2&gt;
  
  
  What shipped and when
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;June 2025.&lt;/strong&gt; The Swift project announced the Android Workgroup.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;October 24, 2025.&lt;/strong&gt; First nightly previews of the Swift SDK for Android on swift.org.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;March 24, 2026.&lt;/strong&gt; Swift 6.3: the "first official release of the Swift SDK for Android."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;September 15, 2026.&lt;/strong&gt; Swift 6.4, a day after Xcode 27. The getting-started guide currently targets SDK 6.4.1.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Important: this isn't Apple shipping Swift for Android. It's the open-source Swift project and its workgroup. SwiftUI, UIKit and Apple frameworks don't come along.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;

&lt;p&gt;The SDK is a cross-compilation kit. You write a regular Swift package on macOS or Linux, and &lt;code&gt;swift build&lt;/code&gt; targets Android instead of macOS. It relies on the Android NDK (the guide asks for LTS r30). The examples use &lt;code&gt;aarch64&lt;/code&gt; (devices) and &lt;code&gt;x86_64&lt;/code&gt; (emulator) with API level 23.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Swift toolchain matching the SDK version&lt;/span&gt;
swiftly &lt;span class="nb"&gt;install &lt;/span&gt;latest

&lt;span class="c"&gt;# 2. The Android SDK itself&lt;/span&gt;
swift sdk &lt;span class="nb"&gt;install&lt;/span&gt; &amp;lt;archive-url&amp;gt; &lt;span class="nt"&gt;--checksum&lt;/span&gt; &amp;lt;sha256&amp;gt;
swift sdk list   &lt;span class="c"&gt;# swift-6.4.1-RELEASE_android&lt;/span&gt;

&lt;span class="c"&gt;# 3. Android NDK r30&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ANDROID_NDK_HOME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$PWD&lt;/span&gt;/android-ndk-r30
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The output is a native &lt;code&gt;.so&lt;/code&gt; per architecture. It isn't an app on its own: the app stays a regular Kotlin/Java Android project, the library ships inside the APK, and Kotlin calls into Swift through &lt;strong&gt;swift-java&lt;/strong&gt;, the official bridge and code generator that produces Java wrappers over JNI.&lt;/p&gt;

&lt;p&gt;It's a mirror image of KMP. In KMP, Android is home and Kotlin travels to iPhone as a native framework talking to Swift through Objective-C headers. With the Swift SDK, iOS is home and Swift travels to Android, talking to Kotlin through JNI.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's in the box
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The whole language.&lt;/strong&gt; Same Swift 6.4 compiler, strict concurrency, &lt;code&gt;async/await&lt;/code&gt;, actors, macros. No "lite dialect."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Standard library and Foundation.&lt;/strong&gt; Dates, strings, &lt;code&gt;Codable&lt;/code&gt;, JSON. Networking (&lt;code&gt;URLSession&lt;/code&gt;) lives in &lt;code&gt;FoundationNetworking&lt;/code&gt; off Apple platforms and is imported explicitly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Swift packages.&lt;/strong&gt; Anything that already builds on Linux and doesn't pull in Apple frameworks has a good chance of building for Android.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A two-way bridge.&lt;/strong&gt; swift-java can call Swift from Kotlin and Java classes from Swift. Async Swift functions surface in Java as &lt;code&gt;CompletableFuture&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real-world proof.&lt;/strong&gt; Skip Fuse builds whole SwiftUI apps for Android on top of this same official SDK.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What's missing
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;UI.&lt;/strong&gt; No SwiftUI or UIKit on Android. Screens are Jetpack Compose; Swift stays under the hood (unless you adopt Skip and its rules).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Apple frameworks.&lt;/strong&gt; SwiftData, Core Data, StoreKit, HealthKit, Combine stay on iPhone.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Service SDKs in Swift.&lt;/strong&gt; Firebase, Google Sign-In, payments have Kotlin libraries for Android and Swift libraries for iOS, but no Swift build for Android. From shared Swift code you reach them through the Java bridge or Skip's wrappers. For MyCarCode, whose whole data layer sits on Firestore, this is the big one.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Comfortable debugging.&lt;/strong&gt; It's a stated workgroup goal, but "set a breakpoint in Android Studio and step into Swift" isn't there yet. From the Android side the debugger sees generated Java wrappers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A mature bridge.&lt;/strong&gt; Early adopters report that every Swift error reaches Kotlin as a plain &lt;code&gt;java.lang.Exception&lt;/code&gt;, and swift-java has open issues around async functions with generic results.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Swift SDK vs. KMP, feature by feature
&lt;/h2&gt;

&lt;p&gt;This is based on documentation and other people's experience, not my measurements. My numbers come in part 3.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Swift SDK for Android&lt;/th&gt;
&lt;th&gt;Kotlin Multiplatform&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Shared language&lt;/td&gt;
&lt;td&gt;Swift&lt;/td&gt;
&lt;td&gt;Kotlin&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Status&lt;/td&gt;
&lt;td&gt;Official since Swift 6.3 (March 2026)&lt;/td&gt;
&lt;td&gt;Stable since November 2023&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Home platform&lt;/td&gt;
&lt;td&gt;iOS (Android is the guest)&lt;/td&gt;
&lt;td&gt;Android (iOS is the guest)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Guest artifact&lt;/td&gt;
&lt;td&gt;Native &lt;code&gt;.so&lt;/code&gt; per ABI inside the APK&lt;/td&gt;
&lt;td&gt;Native &lt;code&gt;.framework&lt;/code&gt; via Kotlin/Native&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Language bridge&lt;/td&gt;
&lt;td&gt;swift-java over JNI, generated Java wrappers&lt;/td&gt;
&lt;td&gt;Objective-C headers, SKIE, experimental Swift export&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Async&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;async&lt;/code&gt; → &lt;code&gt;CompletableFuture&lt;/code&gt; in Java&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;suspend&lt;/code&gt; → &lt;code&gt;async/await&lt;/code&gt; in Swift (via SKIE)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Errors&lt;/td&gt;
&lt;td&gt;Arrive in Kotlin as &lt;code&gt;java.lang.Exception&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Without &lt;code&gt;@Throws&lt;/code&gt;, an exception crashes the iOS app&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Shared UI&lt;/td&gt;
&lt;td&gt;None (only via third-party Skip)&lt;/td&gt;
&lt;td&gt;Compose Multiplatform, stable on iOS since 2025&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Libraries&lt;/td&gt;
&lt;td&gt;Swift packages that build off Apple platforms&lt;/td&gt;
&lt;td&gt;Own ecosystem: Ktor, kotlinx, Koin, SQLDelight&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Firebase in shared code&lt;/td&gt;
&lt;td&gt;No native build; bridge or Skip&lt;/td&gt;
&lt;td&gt;Yes: GitLive Firebase SDK (unofficial)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Debugging shared code&lt;/td&gt;
&lt;td&gt;Good from iOS, weak from Android&lt;/td&gt;
&lt;td&gt;Good from Android, weaker from iOS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fits best&lt;/td&gt;
&lt;td&gt;iOS-first teams&lt;/td&gt;
&lt;td&gt;Android-first teams&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;In one sentence: both solve the same problem from opposite shores. Both share logic, not screens (Compose Multiplatform and Skip aside). Both make one platform live with a foreign language and a bridge. The difference is which team feels the bridge, and that KMP has two and a half more years of scars and libraries.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who should try it now
&lt;/h2&gt;

&lt;p&gt;My preliminary take, before installing anything myself:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Yes&lt;/strong&gt;, if you have an iOS app with heavy logic that doesn't depend on services: calculations, parsers, validation, file formats, an offline engine. That code can go to Android nearly as is.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Yes&lt;/strong&gt;, if your team is all-Swift and the Android version just needs to exist. Skip on top of the official SDK is the shortest path.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Not yet&lt;/strong&gt;, if your shared layer is built on Firebase and other service SDKs. You'll be bridging to their Android versions, and the savings end there. KMP with ready-made wrappers is ahead.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Not yet&lt;/strong&gt;, if your team is mostly Android developers who'd have to debug Swift through generated Java wrappers. KMP will feel like home to them.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What's next in the series
&lt;/h2&gt;

&lt;p&gt;Docs tell half the story. They won't tell you how much a Swift library actually weighs inside an APK, how long the first setup takes, or where the bridge breaks on real code rather than "Hello, Android."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In part 2&lt;/strong&gt; I install the SDK on my Mac and try to build real logic from one of my apps for Android: actual models and calculations that live on iPhone today. What compiles on the first try, what needs rewriting, how big the result is, and whether I can call it from Compose at all.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In part 3&lt;/strong&gt;: an honest comparison with KMP on MyCarCode. I kept a full log of what broke when Kotlin moved to iPhone: hand-unpacking Firebase into frameworks, duplicate symbols at link time, a crash caused by one forgotten annotation, and a bug where a screen wouldn't close itself after saving because the Kotlin code resumed on the wrong thread. I'll go through which of those the Swift SDK removes and which it just moves to the other shore.&lt;/p&gt;

&lt;p&gt;A spoiler I'm not sure about yet: some of those rakes will turn out to be mirror images. We'll see.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://klukyanov.ru/notes/swift-android-sdk/" rel="noopener noreferrer"&gt;klukyanov.ru&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Shorter weekly write-ups (in Russian) — on &lt;a href="https://t.me/+KSAy8mfFOsgwYWMy" rel="noopener noreferrer"&gt;Telegram&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>swift</category>
      <category>android</category>
      <category>kotlin</category>
      <category>ios</category>
    </item>
    <item>
      <title>ASO on my own apps: what actually moved App Store impressions in a month</title>
      <dc:creator>Kirill Lukyanov</dc:creator>
      <pubDate>Mon, 12 Oct 2026 12:46:34 +0000</pubDate>
      <link>https://dev.to/klukyanov/aso-on-my-own-apps-what-actually-moved-app-store-impressions-in-a-month-4jpi</link>
      <guid>https://dev.to/klukyanov/aso-on-my-own-apps-what-actually-moved-app-store-impressions-in-a-month-4jpi</guid>
      <description>&lt;p&gt;A month ago, almost nobody in the US or Europe could see my clay shooting app on the App Store: 97% of its impressions came from Russia, Kazakhstan and random countries. Today two thirds of impressions come from the US and Europe, and daily impressions are up 5×. And my Mac app went from #130 to #9 for "eye strain" in the UK store.&lt;/p&gt;

&lt;p&gt;Here is how I approach ASO as a solo developer, what I actually changed, what moved, what didn't, and what's next. Two live examples: &lt;strong&gt;Clay Sniper&lt;/strong&gt; (iPhone + Apple Watch, a log for trap, skeet and sporting clays) and &lt;strong&gt;SafeYourEye&lt;/strong&gt; (Mac, eye breaks and self-check vision tests).&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;About the numbers.&lt;/strong&gt; All volume metrics below (impressions, page views, installs, ratings) are multiplied by the same constant. I don't publish real values, but proportions and dynamics are exact. Search rankings are real: a position says nothing about money. Revenue, subscriptions and ad budget are not shown at all.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What ASO is made of
&lt;/h2&gt;

&lt;p&gt;ASO has two halves, and the order matters:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Being found&lt;/strong&gt; — search ranking.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Being chosen&lt;/strong&gt; — conversion from impression to page view to install.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Improving conversion is pointless while nobody sees the product page.&lt;/p&gt;

&lt;p&gt;Search on the App Store is driven by a few fields:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Name&lt;/strong&gt; — 30 characters, the heaviest weight.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Subtitle&lt;/strong&gt; — 30 characters, second by weight.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keywords&lt;/strong&gt; — 100 characters, comma-separated, invisible to users.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Localizations&lt;/strong&gt; — each language has its own set of these three fields. And each storefront also indexes several &lt;em&gt;other&lt;/em&gt; locales: the US store reads es-MX, ru, zh-Hans, fr-FR and more on top of en-US. That's cross-localization: free extra keyword space.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Conversion is driven by screenshots, the App Preview video, ratings and &lt;strong&gt;Custom Product Pages&lt;/strong&gt; (alternative versions of your page for different queries and ad groups). &lt;strong&gt;Promotional text&lt;/strong&gt; (170 characters above the description) can be changed without review — leaving it empty means wasting a free lever.&lt;/p&gt;

&lt;h2&gt;
  
  
  The process: seven steps
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Step&lt;/th&gt;
&lt;th&gt;What I do&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Baseline&lt;/td&gt;
&lt;td&gt;Impressions, page views, installs by source and country (&lt;code&gt;asc analytics&lt;/code&gt;); rankings for 20–40 queries per target country&lt;/td&gt;
&lt;td&gt;Without a "before", there's no proof. Apple keeps daily analytics for ~9 days, so I collect it weekly&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Pick markets&lt;/td&gt;
&lt;td&gt;Decide where the app should grow and where to leave it as is&lt;/td&gt;
&lt;td&gt;Keywords, locales and screenshots target specific storefronts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Build the semantic core&lt;/td&gt;
&lt;td&gt;App Store search suggestions, iTunes Search API results, competitor metadata, terms from the app's own code&lt;/td&gt;
&lt;td&gt;Without paid tools you can't measure query volume, so I look at competition: how many apps rank and how relevant they are&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Duplicate audit&lt;/td&gt;
&lt;td&gt;Overlap between name, subtitle and keywords&lt;/td&gt;
&lt;td&gt;A word repeated in keywords is wasted characters. In SafeYourEye, duplicates ate a third of the field&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Spread across locales&lt;/td&gt;
&lt;td&gt;Own name, subtitle, keywords per storefront language, plus a second keyword pool via cross-localization&lt;/td&gt;
&lt;td&gt;Without its own locale, a storefront shows the default language — sometimes Russian&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;Ship and amplify&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;asc metadata push&lt;/code&gt; with the release, promotional text right away, Custom Product Pages for key queries&lt;/td&gt;
&lt;td&gt;Metadata lives in the repo, so every change is a diff&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;Measure in 1–2 weeks&lt;/td&gt;
&lt;td&gt;Repeat step 1, compare per country and per query&lt;/td&gt;
&lt;td&gt;Indexing takes days; looking earlier means reading noise&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;All of this is wrapped into a Claude Code skill and a dashboard: one weekly command pulls App Store analytics for all my apps, rankings across target storefronts and a metadata snapshot with change history, through the official App Store Connect API.&lt;/p&gt;

&lt;h2&gt;
  
  
  Starting point: nobody saw the page
&lt;/h2&gt;

&lt;p&gt;Clay sports live mostly in the US and Europe. In mid-September Clay Sniper looked like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;72% of impressions from Russia and Kazakhstan&lt;/strong&gt;, a quarter from random countries, 3% from the US and Europe.&lt;/li&gt;
&lt;li&gt;Three locales: ru, en-US, de-DE. The primary language was Russian, so &lt;strong&gt;France and Italy saw the Russian page&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Not in the US top 100 for "trap shooting", "sporting clays", "skeet".&lt;/li&gt;
&lt;li&gt;Zero Custom Product Pages, empty promotional text, no review prompt in the code.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The diagnosis in one line: &lt;strong&gt;no sales not because the page fails to convince, but because almost nobody sees it.&lt;/strong&gt; The funnel wasn't leaking — it was tiny at the top. So: reach first, conversion second, paid traffic third.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I changed
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Date&lt;/th&gt;
&lt;th&gt;Version&lt;/th&gt;
&lt;th&gt;Change&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Aug 23&lt;/td&gt;
&lt;td&gt;1.1.0&lt;/td&gt;
&lt;td&gt;Keywords rewritten around disciplines: "double, compact, fitasc, 5stand, scorecard" instead of generic "shooting, range, gun, hunting". First promotional text&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sep 21&lt;/td&gt;
&lt;td&gt;1.2.0&lt;/td&gt;
&lt;td&gt;German locale&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sep 26&lt;/td&gt;
&lt;td&gt;1.3.0&lt;/td&gt;
&lt;td&gt;French locale: "ball-trap", "carnet de tir", "compak"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Oct 1&lt;/td&gt;
&lt;td&gt;1.4.1&lt;/td&gt;
&lt;td&gt;en-GB with British terms ("DTL", "clay pigeon", "cartridges"), Italian. en-US keywords cleaned of words already in the subtitle&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Oct 6&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;Apple Ads pilot in the US: competitor and niche queries, exact match&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Oct 7&lt;/td&gt;
&lt;td&gt;1.4.2&lt;/td&gt;
&lt;td&gt;es-ES and es-MX (a second keyword pool for the US). 8 locales total&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Oct 8&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;Apple approved 12 Custom Product Pages (trap, skeet, sporting, Apple Watch, stats…) in under a day&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Oct 11&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;All 12 Custom Product Pages got versions in six more storefront languages, with their own keywords and screenshots&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Both apps also got a system review prompt after a good moment (in Clay Sniper — a finished session). Ratings doubled over the period, average 5.0.&lt;/p&gt;

&lt;p&gt;For SafeYourEye the audit found two problems: a third of the keyword field duplicated the name, and the app's real differentiator — vision self-checks on a Mac (acuity, contrast, astigmatism, Amsler grid) — wasn't searchable at all. For queries like "visual acuity" and "amsler grid", there are only 12–24 apps in results, almost none about Mac vision checks; for "Sehtest" in Germany we're the only one. New name: &lt;strong&gt;"SafeYourEye: Eye Strain Timer"&lt;/strong&gt;, subtitle &lt;strong&gt;"20-20-20 Break &amp;amp; Vision Test"&lt;/strong&gt;, plus en-GB, fr-FR and it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dynamics
&lt;/h2&gt;

&lt;p&gt;Clay Sniper, daily averages by week (volumes scaled):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Week&lt;/th&gt;
&lt;th&gt;Impressions/day&lt;/th&gt;
&lt;th&gt;Page views/day&lt;/th&gt;
&lt;th&gt;Impression → page&lt;/th&gt;
&lt;th&gt;New installs/day&lt;/th&gt;
&lt;th&gt;US + Europe share&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Sep 16–20&lt;/td&gt;
&lt;td&gt;1,020&lt;/td&gt;
&lt;td&gt;80&lt;/td&gt;
&lt;td&gt;7.8%&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;3%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sep 21–27&lt;/td&gt;
&lt;td&gt;1,193&lt;/td&gt;
&lt;td&gt;71&lt;/td&gt;
&lt;td&gt;6.0%&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;25%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sep 28 – Oct 4&lt;/td&gt;
&lt;td&gt;1,246&lt;/td&gt;
&lt;td&gt;286&lt;/td&gt;
&lt;td&gt;22.9%&lt;/td&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;td&gt;30%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Oct 5–7&lt;/td&gt;
&lt;td&gt;992&lt;/td&gt;
&lt;td&gt;83&lt;/td&gt;
&lt;td&gt;8.4%&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;36%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Oct 8–10&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;4,867&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;192&lt;/td&gt;
&lt;td&gt;3.9%&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;68%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Geography flipped.&lt;/strong&gt; The main result: target markets went from 3% to 68% of impressions. Locales started working.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Installs appeared.&lt;/strong&gt; Zero new installs in the week of Sep 16–20, every week since Sep 21.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The late-September spike was a one-off.&lt;/strong&gt; It matched the 1.4.0/1.4.1 releases, but conversion returned to 8% a week later. At these volumes I can't separate the metadata effect from noise, so I don't try.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A jump from October 8.&lt;/strong&gt; Daily impressions grew 5×, almost all of it from the US and the UK. That same day Apple approved the 12 Custom Product Pages and my Apple Ads groups were switched to them. How much is ads vs. organic, the Apple Ads report will tell — next time. Page-view conversion dropped to 3.9%: the new audience sees the app but doesn't open it yet.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Apple backfills data.&lt;/strong&gt; The first pull showed October 8 as almost empty; the next one showed it as the peak of the week. Don't draw conclusions from the last 2–3 days.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;SafeYourEye gets fewer impressions (Mac App Store search is smaller): 105–185 a day, and &lt;strong&gt;zero new installs in a month&lt;/strong&gt;. People find the page and don't open it. That's a conversion problem now, not a search one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rankings, before and after
&lt;/h2&gt;

&lt;p&gt;Positions via iTunes Search API (close to the real App Store, not identical). "—" means not in the top 200. Before: Sep 23–27; after: Oct 9 for SafeYourEye, Oct 12 for Clay Sniper.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;App&lt;/th&gt;
&lt;th&gt;Country&lt;/th&gt;
&lt;th&gt;Query&lt;/th&gt;
&lt;th&gt;Before&lt;/th&gt;
&lt;th&gt;After&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;SafeYourEye&lt;/td&gt;
&lt;td&gt;UK&lt;/td&gt;
&lt;td&gt;eye strain&lt;/td&gt;
&lt;td&gt;130&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;9&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SafeYourEye&lt;/td&gt;
&lt;td&gt;Germany&lt;/td&gt;
&lt;td&gt;eye strain&lt;/td&gt;
&lt;td&gt;83&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;13&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SafeYourEye&lt;/td&gt;
&lt;td&gt;US&lt;/td&gt;
&lt;td&gt;eye strain&lt;/td&gt;
&lt;td&gt;170&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;39&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SafeYourEye&lt;/td&gt;
&lt;td&gt;Germany&lt;/td&gt;
&lt;td&gt;eye health&lt;/td&gt;
&lt;td&gt;126&lt;/td&gt;
&lt;td&gt;54&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SafeYourEye&lt;/td&gt;
&lt;td&gt;France / Italy&lt;/td&gt;
&lt;td&gt;pause yeux / pausa occhi&lt;/td&gt;
&lt;td&gt;no locale&lt;/td&gt;
&lt;td&gt;7 / 5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SafeYourEye&lt;/td&gt;
&lt;td&gt;US&lt;/td&gt;
&lt;td&gt;20-20-20 rule&lt;/td&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SafeYourEye&lt;/td&gt;
&lt;td&gt;US&lt;/td&gt;
&lt;td&gt;eye care timer&lt;/td&gt;
&lt;td&gt;39&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Clay Sniper&lt;/td&gt;
&lt;td&gt;US&lt;/td&gt;
&lt;td&gt;clay shooting&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;29&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Clay Sniper&lt;/td&gt;
&lt;td&gt;Germany&lt;/td&gt;
&lt;td&gt;Tontaubenschießen&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;8&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Clay Sniper&lt;/td&gt;
&lt;td&gt;France&lt;/td&gt;
&lt;td&gt;ball trap&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;106&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Clay Sniper&lt;/td&gt;
&lt;td&gt;UK&lt;/td&gt;
&lt;td&gt;clay pigeon&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;45&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Clay Sniper&lt;/td&gt;
&lt;td&gt;Germany&lt;/td&gt;
&lt;td&gt;Wurfscheiben&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Clay Sniper&lt;/td&gt;
&lt;td&gt;US&lt;/td&gt;
&lt;td&gt;trap shooting / sporting clays&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;125 / 108&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;There are wins and losses here, and that's the honest price of a decision. Swapping "Eye Care Timer" for "Eye Strain Timer" in the name lifted the broad query in three countries and dropped the narrow ones. The broad query brings more impressions, so it's a good trade — but if you only look at winners, ASO looks like pure growth.&lt;/p&gt;

&lt;p&gt;Clay Sniper's head terms in the US, "trap shooting" and "sporting clays", have only just entered the top 200: niche leaders like HotClays sit there, and those words are only in my subtitle. "Clay shooting" holds in the 20s, but it jumps day to day (35th, 18th, 29th within four days), so I trust weekly trends, not single measurements. In the new locales "shooting log" (UK), "Wurftaube" (Germany) and "strozzatore" (Italy) landed in the top 5 right away.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I learned
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Locales beat keyword polishing.&lt;/strong&gt; The biggest shift came not from tuning 100 characters but from the page speaking the storefront's language.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custom Product Pages only accept words from the keywords field.&lt;/strong&gt; Words from the name and subtitle can't be assigned. My two main pages, trap and skeet, ended up with zero US keywords. Plan your field split with future pages in mind.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Impressions and installs are different problems.&lt;/strong&gt; SafeYourEye climbed in search and got zero installs. Search brings people to the page; the page has to do the convincing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Finish metadata before submitting for review.&lt;/strong&gt; While a version is waiting for review, you can't add a new locale. I once had to withdraw a submission to add languages.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No baseline, no proof.&lt;/strong&gt; Apple keeps daily analytics for about nine days. If you don't collect regularly, a month later there's nothing to compare against.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Clay Sniper has a 90-day plan until December 22. The locale goal (7) is already exceeded with 8. The rest:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Keywords for Custom Product Pages&lt;/strong&gt; — reshuffle words between fields so trap and skeet pages get their own queries.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A storefront for Western markets&lt;/strong&gt; — demo data in US/UK screenshots still shows Russian clubs and ammo; reshoot it and add an App Preview to the main page with the next version.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Community&lt;/strong&gt; — emails to federations and clubs in the US, UK, France and Italy with free access via offer codes, each link with its own campaign token.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Apple Ads&lt;/strong&gt; — US pilot first, then the UK; money decisions only on numbers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SafeYourEye&lt;/strong&gt; — fix conversion: first two screenshots, promotional text, video.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The rest of my apps&lt;/strong&gt; — two of them still rank nowhere, even for their own name. They're next.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal by year-end: 3× daily impressions vs. the start and 5× more ratings than today. I'll report back in a month.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://klukyanov.ru/notes/aso-app-store/" rel="noopener noreferrer"&gt;klukyanov.ru&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Shorter weekly write-ups (in Russian) — on &lt;a href="https://t.me/+KSAy8mfFOsgwYWMy" rel="noopener noreferrer"&gt;Telegram&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ios</category>
      <category>appstore</category>
      <category>marketing</category>
      <category>indiedev</category>
    </item>
    <item>
      <title>An AI film crew made our app ad: who did what</title>
      <dc:creator>Kirill Lukyanov</dc:creator>
      <pubDate>Fri, 09 Oct 2026 11:13:17 +0000</pubDate>
      <link>https://dev.to/klukyanov/an-ai-film-crew-made-our-app-ad-who-did-what-1f6e</link>
      <guid>https://dev.to/klukyanov/an-ai-film-crew-made-our-app-ad-who-did-what-1f6e</guid>
      <description>&lt;p&gt;Seventeen seconds: a red-haired champion, a jittery rookie, tea from a tartan thermos and a shot at sunrise. There isn't a single real frame in this ad. AI agents wrote it, cast it, shot it and cut it, each in its own role. My job was to approve things and reject things.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3wqf2pg7e6smaoq7j7di.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3wqf2pg7e6smaoq7j7di.jpg" alt="Four frames from the generated ad: the Legend and the Rookie in armchairs on a trap range, the Legend saying " width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Watch the ad (9:16, 1080×1920, 20.6 s, sound on):&lt;/strong&gt; &lt;a href="https://storage.yandexcloud.net/klukyanov-ru-media/video/clay-sniper-ai-ad.mp4" rel="noopener noreferrer"&gt;clay-sniper-ai-ad.mp4&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The ad is for &lt;a href="https://apps.apple.com/app/clay-sniper/id6774298651" rel="noopener noreferrer"&gt;Clay Sniper&lt;/a&gt;, my iPhone and Apple Watch logbook for clay shooters. It took three days, October 7–9, from the approved plan to the final file: two for the shoot and the first cut, and one more for polishing. Here's who did what, which ideas went into it, and where it nearly fell apart.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why generate an ad at all
&lt;/h2&gt;

&lt;p&gt;Clay Sniper already has an App Preview on the App Store, and it's honest: a screen recording of the real app, the watch, a real gunshot sound. Apple doesn't accept anything else there. But that video only works for people who've already opened the product page. To get them there, you need something for the feed: Reels, Shorts, TikTok. Fifteen seconds, a story, faces, a joke. A solo developer can't shoot that with actors on a real range, so I had it generated.&lt;/p&gt;

&lt;p&gt;This was the second attempt. The first ad, "Hands full", ran on a local video model on my second Mac: no voices, almost no faces. It taught me the main lesson about hooks (more on that below). For "The Legend" I switched to a cloud model that can hold characters, dialogue and sound.&lt;/p&gt;

&lt;h2&gt;
  
  
  The idea: even legends miss
&lt;/h2&gt;

&lt;p&gt;An ad needs one promise, not a feature list. For a shooter's logbook, Claude put it like this: &lt;strong&gt;"Even legends miss. The difference is they know exactly where."&lt;/strong&gt; The end card squeezes it into three words: &lt;strong&gt;KNOW YOUR MISS&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The camera style was mine: someone else's ad I liked. A field at golden hour, two armchairs and a side table in the grass, Wes Anderson symmetry, warm film grain, a cut every 2–3 seconds, snap zooms, whip pans, macro inserts. We cut three short silent clips from it and used them as camera-motion references only. The model was told not to copy the people, the props or the story, just the way the camera moves.&lt;/p&gt;

&lt;p&gt;Two characters carry the story:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Legend&lt;/strong&gt;: a fictional champion with fiery red hair, amber shooting glasses pushed up on her head, an olive vest, a dry half-smile and slow, precise movements.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Rookie&lt;/strong&gt;: a jittery newcomer in a brand-new orange vest with the price tag still on the sleeve. He asks the question the viewer would ask.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;He asks "How do you never miss?" She says "I do. I log them." and slides her phone with the stats toward him. Then she solemnly sips tea from a tartan thermos, walks to the station and smokes the clay. The tweed crowd erupts. The myth of the flawless shooter breaks, and the product shows up as evidence in her hand, not as a slide.&lt;/p&gt;

&lt;h2&gt;
  
  
  The crew: who did what
&lt;/h2&gt;

&lt;p&gt;The most interesting part of the project is how the roles split. Two agents and one video model did the work, and each had its own job, just like on a real set.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Role on set&lt;/th&gt;
&lt;th&gt;Who&lt;/th&gt;
&lt;th&gt;What they did&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Showrunner&lt;/td&gt;
&lt;td&gt;Me&lt;/td&gt;
&lt;td&gt;Brought the style reference, approved the plan and the heroine, accepted the draft, lifted the "no gun on screen" rule, picked a silhouette over a face for the shot, decided to upscale to 1080p in the edit, made the calls at every fork&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Screenwriter&lt;/td&gt;
&lt;td&gt;Claude&lt;/td&gt;
&lt;td&gt;The promise, a four-part beat sheet, a six-shot storyboard, dialogue timing at 2.5 English words per second, a retention pass&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fact-checker&lt;/td&gt;
&lt;td&gt;Claude&lt;/td&gt;
&lt;td&gt;Checked every line and every screen against the app's code and real screenshots. Cut a feature that didn't exist&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Character artist&lt;/td&gt;
&lt;td&gt;Codex&lt;/td&gt;
&lt;td&gt;Character sheets: the heroine full-length, from behind and as a portrait (two versions), the rookie. The model uses them to keep faces consistent shot to shot&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Production designer&lt;/td&gt;
&lt;td&gt;Codex&lt;/td&gt;
&lt;td&gt;The location start frame: armchairs, table, thermos, crowd behind a rope, a phone with a bright green screen to replace later&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Director&lt;/td&gt;
&lt;td&gt;Claude&lt;/td&gt;
&lt;td&gt;A brief for six cuts pinned to timecodes, the 180-degree rule, camera-motion references, a list of restrictions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Camera, cast, sound&lt;/td&gt;
&lt;td&gt;Seedance 2.5&lt;/td&gt;
&lt;td&gt;Shot every cut in one pass, played both leads and the crowd, voiced the lines, the range noise and the shots&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Production coordinator&lt;/td&gt;
&lt;td&gt;Claude&lt;/td&gt;
&lt;td&gt;Launched the generation, watched the queue, saved the IDs of every piece so we could come back to them&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Editor and sound&lt;/td&gt;
&lt;td&gt;Claude&lt;/td&gt;
&lt;td&gt;Edit decision list, cuts, subtitles, the KNOW YOUR MISS card, an App Store end card, the 1080×1920 upscale, frame-by-frame screen fixes, a real gunshot layered over the generated one&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Censor&lt;/td&gt;
&lt;td&gt;Claude&lt;/td&gt;
&lt;td&gt;Caught what ad platforms reject: barrels pointing at the camera, revealing angles&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Notice that Claude has the most roles but none of them involve drawing. It writes, counts, checks, briefs and edits. Codex and Seedance make the pictures; Claude writes their briefs and signs off on the result.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fact-checking: a line that couldn't exist
&lt;/h2&gt;

&lt;p&gt;In the first draft, the Legend answered dryly: "I do. Station four." Nice line. But Claude checked it against the app's code first and found per-station stats only in the competition schedule. You can't show a screen that doesn't exist in an ad, so the line became "I do. I log them.", and the phone got a real screen with a best series of 22/25.&lt;/p&gt;

&lt;p&gt;The next day it turned out per-station stats do exist: a By station screen shipped in a newer version that lives in a different repository. Station 7 is red on it, 50%, which is KNOW YOUR MISS in a single picture. The second version of the ad shows exactly that screen.&lt;/p&gt;

&lt;p&gt;The lesson goes back to the first ad. Its hook was that a gloved finger can't tap a phone screen, while the watch crown still works. I rejected the shots: on the range people wear thin shooting gloves, and those work with touchscreens just fine. The hook was false for the very audience it targeted. The rule since then: &lt;strong&gt;check everyday details against real life and features against the code&lt;/strong&gt;, both before generating, not after.&lt;/p&gt;

&lt;h2&gt;
  
  
  Casting: character sheets
&lt;/h2&gt;

&lt;p&gt;A video model doesn't remember what a character looked like in the previous shot. To make the red-haired Legend in cut one the same person as in cut six, you feed it a character sheet: full-length, from behind, and a portrait. Codex drew those.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsfvxfryd8ad94l9tf628.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsfvxfryd8ad94l9tf628.jpg" alt="Character sheet of the Legend: full-length front view, back view and portrait" width="560" height="996"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I approved the heroine on the second try, and the rule was strict: &lt;strong&gt;the look gets approved before any video runs&lt;/strong&gt;. Redrawing a picture takes a minute; reshooting an ad because the face is wrong takes hours.&lt;/p&gt;

&lt;p&gt;Claude also set boundaries for the character: striking, but not sexualized. No body-focused angles, no cleavage, no bare skin. The charisma comes from light, gaze and that half-smile. The reason is practical: ad platforms reject such creatives, and the video model simply refuses those prompts. Other restrictions: no real people or athlete lookalikes, no logos. Even the thermos is unbranded, just tartan.&lt;/p&gt;

&lt;h2&gt;
  
  
  Storyboard: six shots in fifteen seconds
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Time&lt;/th&gt;
&lt;th&gt;On screen&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0–2.5 s&lt;/td&gt;
&lt;td&gt;An orange clay bursts in slow motion. The crowd turns heads in unison. Caption: "She hasn't missed all day."&lt;/td&gt;
&lt;td&gt;Hook: everyone is looking the wrong way&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;2.5–5 s&lt;/td&gt;
&lt;td&gt;Whip pan to the armchairs, over the rookie's shoulder: "How do you never miss?" Snap zoom on her: "I do."&lt;/td&gt;
&lt;td&gt;Character clash and the viewer's question&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;5–7 s&lt;/td&gt;
&lt;td&gt;Macro: her hand slides the phone, per-station stats on screen. Voice-over: "I log them."&lt;/td&gt;
&lt;td&gt;The product as evidence, not a slide&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;7–10 s&lt;/td&gt;
&lt;td&gt;She pours tea from the thermos and takes a solemn sip. The rookie, out of focus: "...tea?"&lt;/td&gt;
&lt;td&gt;The most shareable beat, a pause before the shot&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;10–12.5 s&lt;/td&gt;
&lt;td&gt;Silence, a silhouette at the station against the sunrise, "Pull!", the shot, the clay turns to dust&lt;/td&gt;
&lt;td&gt;The hook's promise is paid off&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;12.5–15 s&lt;/td&gt;
&lt;td&gt;Perfect symmetry: she raises the thermos cap like a toast, the rookie copies her with an empty hand. KNOW YOUR MISS&lt;/td&gt;
&lt;td&gt;Finale and one line of promise&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A few professional rules Claude followed without being asked:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The 180-degree rule.&lt;/strong&gt; In the dialogue the rookie is always on the left and she's on the right. The camera never crosses the line between them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Varied shot sizes.&lt;/strong&gt; Extreme wide, medium, macro, close-up, wide, wide. Never three of the same in a row.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dialogue windows.&lt;/strong&gt; Every line is timed at 2.5 words per second. "I log them." didn't fit the macro shot, so it became a voice-over on top of the phone.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Works with the sound off.&lt;/strong&gt; Subtitles duplicate every line and sit between 15% and 75% of the frame height, clear of the Reels and TikTok buttons.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The shoot: the whole ad in one pass
&lt;/h2&gt;

&lt;p&gt;Seedance 2.5 shot the first draft in a single pass: all six cuts from one generation. It got six references: three images (both character sheets and the start frame) and three video clips with the camera style. Every camera move in the prompt pointed to its reference: "over the shoulder like Video 1", "whip pan like Video 3".&lt;/p&gt;

&lt;p&gt;The job sat in the queue for almost two hours. The draft came out at 480p, 14 seconds. A pleasant surprise: the model produced voices, intonation, the gurgle of tea and the crowd noise itself. No separate voice-over needed.&lt;/p&gt;

&lt;p&gt;I accepted the draft with two notes. First, the gun wasn't visible in the shooting scene. That came straight from the prompt: Claude, being cautious, had banned close-ups of the gun, and the model removed it altogether. Second, Claude had composited a real stats screenshot onto the green phone screen, but at 480p the "Best series 22/25" line was unreadable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fixes: reshoot pieces, not the whole ad
&lt;/h2&gt;

&lt;p&gt;Regenerating the whole ad for two notes means gambling everything that already works. The model shoots differently every time, and the heroine in the tea shot could come back as someone else. So Claude reshot only the weak pieces as separate generations. The first round, the phone and the shot, took about twenty minutes. The shot was later reshot once more, more on that below.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Piece&lt;/th&gt;
&lt;th&gt;Draft v1&lt;/th&gt;
&lt;th&gt;Final&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Phone, 4 s&lt;/td&gt;
&lt;td&gt;Green screen with a perspective-warped screenshot. Numbers blur at 480p&lt;/td&gt;
&lt;td&gt;The model got our own clip as a "repeat this frame by frame" reference plus the By station screenshot. Motion repeated, screen drawn by the model, large station badges readable. Later the Russian demo clubs were swapped for US ones&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Shot, 5 s&lt;/td&gt;
&lt;td&gt;Silhouette from behind, no gun visible, a "pistol" pose&lt;/td&gt;
&lt;td&gt;Third take: one shot from behind and slightly to the side, a silhouette at sunrise, the whole gun visible, no face. The prompt describes a long double-barrel shotgun and a proper trap stance; a pistol grip is banned&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Phone in wide shots&lt;/td&gt;
&lt;td&gt;A 26×12 px green rectangle on the table&lt;/td&gt;
&lt;td&gt;We tried the splash screen and the icon; both dissolve into a blob at that size. The screen is now off: nearly black with a reflection&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Length&lt;/td&gt;
&lt;td&gt;15 s&lt;/td&gt;
&lt;td&gt;20.6 s: 18 s of story from three generations with freeze frames at the joins, plus a 2.5 s end card&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The biggest surprise was the phone screen. The assumption had been that you can't trust a model with small UI, so Claude always composited the real screenshot on top. It turns out that if you give the model its own clip as a motion reference plus the screen image, it repeats the shot and draws the UI itself. Large elements, numbers and badges, come out readable. Small text still drifts, so this only works for large on-screen elements.&lt;/p&gt;

&lt;h2&gt;
  
  
  The edit: an EDL and a censor
&lt;/h2&gt;

&lt;p&gt;The final ad is assembled from pieces of three generations. Claude described it as an edit decision list: for every piece, the source, in and out points, which audio to use and whether to hold a freeze frame at the end. A build script assembles the video from that list and lays on the subtitles, the end card and the sound. The gunshot is a real one, taken from the App Preview recording, layered over the generated one.&lt;/p&gt;

&lt;p&gt;The cuts inside the generated draft had to be found by hand: standard scene-change detectors found nothing in this video. Claude compared neighbouring frames pixel by pixel and located cuts by spikes in the difference, then timed the subtitles by the loudness of the audio track.&lt;/p&gt;

&lt;p&gt;Censorship landed in the edit too. In the second take of the shooting scene the model swung the barrels straight at the camera for just over a second. That's a no-go for an ad, so Claude cut the piece entirely. What was left of the three-quarter view lasted about half a second and looked like a fragment. So I asked for the scene to be reshot differently: one shot from behind and slightly to the side, a silhouette against the sunrise. The whole gun is visible, and the barrels physically can't point at the camera. That third take made the final cut.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmarydhp9hv5otzwn90ud.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmarydhp9hv5otzwn90ud.jpg" alt="The final shooting scene: the Legend in silhouette from behind, a double-barrel shotgun at her shoulder, sunrise behind her" width="560" height="996"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Polishing: one more day
&lt;/h2&gt;

&lt;p&gt;The ad that looked done on the evening of October 8 wasn't ready to run: no app name, no App Store link, and the picture was still 480p. Polishing took another day, and the model didn't shoot a single new frame for it. It's all editing.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;1080×1920 on our own.&lt;/strong&gt; Regenerating in 1080p would have meant reshooting every piece and gambling the good takes again. So Claude upscaled the 480p sources during assembly with careful scaling and light sharpening. Subtitles and cards are drawn natively at 1080, so text stays sharp even where the picture is softer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A 2.5-second end card.&lt;/strong&gt; The last frame blurred, the icon, the name Clay Sniper, the subtitle from the App Store listing and the official Download on the App Store badge, taken from Apple's site rather than redrawn.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;US clubs on screen.&lt;/strong&gt; The phone close-up showed clubs from Moscow and Krasnodar at the bottom, the app's demo data. For a US campaign Claude captured a fresh screenshot with US demo data, clubs in Texas and Pennsylvania. Instead of regenerating the piece, the new card was pasted in frame by frame: on the close-up it's anchored to the old screen by keypoints; on the table, where the screen is tiny and in steep perspective, the screen corners are tracked frame to frame and motion blur is added to match.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The pump click.&lt;/strong&gt; In the shooting scene the model generated the sound of a pump-action being racked. A double-barrel has no pump, and any shooter would hear it. Claude muted that third of a second.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One thing stayed as it was. In the phone piece the model zooms in until the screen fills the frame and the phone body disappears. I wanted the whole phone in her hand, but there's no such frame in the footage. We discussed three options: redraw the frame with a local model and paste in the screenshot, crop the zoom out, or reshoot the piece. We decided it doesn't hurt the ad.&lt;/p&gt;

&lt;h2&gt;
  
  
  What didn't work
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The wink.&lt;/strong&gt; I asked for a glance over the shoulder with a wink before the shot. The model never did it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resolution.&lt;/strong&gt; The sources are 480p and the final is upscaled to 1080×1920. Fine for a phone feed, but softer than true 1080p.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The whole phone.&lt;/strong&gt; The model zooms in so far that the phone body disappears. There's no frame with the whole phone in her hand.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Subtitles by ear.&lt;/strong&gt; Timing was matched to the track's loudness; no human ear has checked it yet.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What I took away
&lt;/h2&gt;

&lt;p&gt;It felt less like using a tool and more like working with a small film crew. I didn't write prompts or scrub a timeline. I looked at frames and said "yes", "no", "actually, let's show the gun". Claude kept the whole project in its head, from the promise to the last cut, and talked to each crew member in their own language: character sheets for Codex, a second-by-second brief for Seedance.&lt;/p&gt;

&lt;p&gt;Second: fixes. Generate the whole ad once, then reshoot only the weak pieces. What works stays put, and a fix takes minutes instead of hours.&lt;/p&gt;

&lt;p&gt;Third: fact-checking beats beauty. The most dangerous mistakes in this project weren't in the picture but in the meaning: a line about a feature the agent didn't find at first, and a glove hook that turned out to be false. A model will draw anything, so whether it's true has to be checked before you generate.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://klukyanov.ru/notes/clay-sniper-ai-ad/" rel="noopener noreferrer"&gt;klukyanov.ru&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Shorter weekly write-ups (in Russian) — on &lt;a href="https://t.me/+KSAy8mfFOsgwYWMy" rel="noopener noreferrer"&gt;Telegram&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>video</category>
      <category>marketing</category>
      <category>ios</category>
    </item>
    <item>
      <title>Google put AI chips in orbit: radiation is not the problem, heat is</title>
      <dc:creator>Kirill Lukyanov</dc:creator>
      <pubDate>Wed, 07 Oct 2026 19:08:21 +0000</pubDate>
      <link>https://dev.to/klukyanov/google-put-ai-chips-in-orbit-radiation-is-not-the-problem-heat-is-451g</link>
      <guid>https://dev.to/klukyanov/google-put-ai-chips-in-orbit-radiation-is-not-the-problem-heat-is-451g</guid>
      <description>&lt;p&gt;On October 1, another Falcon 9 lifted off from Vandenberg on the Transporter-18 rideshare, carrying about 130 payloads at once. Among the cubesats and Earth-observation satellites was a fridge-sized spacecraft that Google internally calls simply MVP. Inside are four server-grade AI chips, the same ones that run Gemini models in Google Cloud.&lt;/p&gt;

&lt;p&gt;The headlines say "Google launched a neural network into space", and the obvious question is: why? Neural networks work perfectly well on the ground. The answer is more interesting than it looks. Google is not testing a model, it is testing a hypothesis about data centers. And the main problem this satellite has already surfaced is not the one everyone worried about before launch.&lt;/p&gt;

&lt;h2&gt;
  
  
  What actually flew
&lt;/h2&gt;

&lt;p&gt;The spacecraft is the first prototype of Google's research effort Project Suncatcher. The bus was built by Planet, the company that already operates hundreds of Earth-imaging satellites. Google is responsible for the payload.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Launch&lt;/td&gt;
&lt;td&gt;October 1, 2026, Falcon 9, Transporter-18, Vandenberg&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chips&lt;/td&gt;
&lt;td&gt;4 TPU Trillium (v6e), a v6e-4 configuration, roughly one ground server&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Power&lt;/td&gt;
&lt;td&gt;Solar panels, about 1 kW&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Orbit&lt;/td&gt;
&lt;td&gt;Sun-synchronous dawn-dusk, about 650 km&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lifetime&lt;/td&gt;
&lt;td&gt;About a year of planned operations, up to six years in orbit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Status&lt;/td&gt;
&lt;td&gt;Contact established, the spacecraft is "operating as expected" (Travis Beals, project lead at Google)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The orbit is not random. In a dawn-dusk sun-synchronous orbit the satellite rides the terminator line, and the Sun almost never sets for it. By Google's own estimate, a solar panel there produces up to eight times more energy than the same panel on the ground: no night, no clouds, no atmosphere.&lt;/p&gt;

&lt;h2&gt;
  
  
  Radiation: an exam the chips passed on Earth
&lt;/h2&gt;

&lt;p&gt;The obvious fear is space radiation. Server chips are designed for data centers, not orbit, and what usually flies is radiation-hardened electronics that lag generations behind in speed. If a commercial chip dies within a month, the whole idea dies with it.&lt;/p&gt;

&lt;p&gt;So Google irradiated the chips first. At UC Davis's Crocker Nuclear Laboratory, Trillium TPUs were run under a 67 MeV proton beam, under real AI workloads rather than idle. The results were published as a preprint in November 2025 and later in the peer-reviewed journal Joule:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;15 krad(Si)&lt;/strong&gt;: the maximum dose tested, with no permanent failures&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;~0.75 krad(Si)&lt;/strong&gt;: the dose a shielded chip accumulates over five years in orbit&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;2 krad(Si)&lt;/strong&gt;: the point where HBM memory started to show errors, the most vulnerable component&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;1&lt;/strong&gt; silent data corruption event: a wrong result that nothing flagged&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is a twentyfold margin over the five-year dose. Most bit flips are cleared by resetting the chip. The last item is the unpleasant one: an error that does not announce itself cannot be fixed by a reset. It has to be caught by checks in software. More on that below.&lt;/p&gt;

&lt;h2&gt;
  
  
  The real enemy is heat
&lt;/h2&gt;

&lt;p&gt;Here is what looks like the main lesson of the first week. According to TechTimes, once in orbit the mission is defined not by radiation but by cooling. The chips run short Gemini queries in bursts of roughly fifteen minutes, after which compute has to stop so the radiators can shed the accumulated heat.&lt;/p&gt;

&lt;p&gt;It feels counterintuitive: space is cold. But cold does not mean easy to cool. On Earth, air or water carries heat away from a server: convection. In a vacuum there is no convection. Only radiation is left, with the radiator glowing in the infrared. That is slow. Dissipating a kilowatt takes a lot of panel area, and every square metre is mass you have to launch.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;In one line:&lt;/strong&gt; energy in space is abundant, getting rid of heat is hard. An orbital data center is limited not by the power outlet but by the radiator.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A caveat: Google has not disclosed details of the duty cycle, and the fifteen-minute figure comes from TechTimes. But the physics behind it is unambiguous, and every orbital compute project runs into the same wall.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why bother: the $200-per-kilogram economics
&lt;/h2&gt;

&lt;p&gt;The motive is simple. Training and serving large models is bottlenecked by electricity: new data centers wait years for grid connections, and power systems cannot keep up with demand. In orbit the Sun shines almost around the clock, there is no land to pay for and no interconnection permits.&lt;/p&gt;

&lt;p&gt;Google itself names the condition under which this works: launch costs must fall to about $200 per kilogram, roughly by the mid-2030s. Only then does an orbital data center match a ground one on energy cost. Today we are far from that number, and the whole bet rides on fully reusable super-heavy rockets like Starship.&lt;/p&gt;

&lt;p&gt;Google's roadmap:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;2026&lt;/strong&gt;: one MVP satellite, to see whether a commercial TPU survives real flight&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;2027&lt;/strong&gt;: two satellites with Planet, testing free-space laser links between spacecraft&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Later&lt;/strong&gt;: clusters; the research models a swarm of 81 satellites within a one-kilometre radius, linked optically&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Laser links are the second key question after heat. Large models train on thousands of chips that constantly exchange data. If satellites cannot talk to each other at speeds comparable to cables inside a data center, the cluster becomes a collection of loners.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who else is in the race
&lt;/h2&gt;

&lt;p&gt;Google is neither the first nor the only one. Over the past year several players have reached orbit, each with its own approach.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Player&lt;/th&gt;
&lt;th&gt;In orbit&lt;/th&gt;
&lt;th&gt;Approach and plans&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Google + Planet&lt;/td&gt;
&lt;td&gt;Project Suncatcher: 1 satellite, 4 Trillium TPUs, ~1 kW (October 2026)&lt;/td&gt;
&lt;td&gt;A decade-long research effort: two satellites with laser links in 2027, then clusters of 81&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Starcloud&lt;/td&gt;
&lt;td&gt;Starcloud-1 with an NVIDIA H100 (November 2025)&lt;/td&gt;
&lt;td&gt;First data-center GPU in space, first model trained in orbit. Raised $170M at a $1.1B valuation (March 2026) and $250M more at $2.3B (August 2026)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SpaceX&lt;/td&gt;
&lt;td&gt;A filing so far&lt;/td&gt;
&lt;td&gt;In January 2026 filed with the FCC for up to a million data-center satellites at 500–2,000 km, linked via Starlink&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Axiom Space + Kepler&lt;/td&gt;
&lt;td&gt;2 orbital data center nodes (January 2026)&lt;/td&gt;
&lt;td&gt;Processing other satellites' data in orbit, Kepler optical network at 2.5 Gbps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ADA Space + Zhejiang Lab (China)&lt;/td&gt;
&lt;td&gt;12 satellites of the "Three-Body Computing Constellation" (May 2025)&lt;/td&gt;
&lt;td&gt;744 TOPS per satellite, target of 2,800 spacecraft&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The approaches split into two camps. China and Axiom build compute &lt;em&gt;for&lt;/em&gt; space: satellites process their own imagery and data in orbit instead of pushing raw terabytes down a narrow link. That is pragmatic and pays off today. Google, Starcloud and SpaceX aim at something else, compute in space &lt;em&gt;for Earth&lt;/em&gt;: moving the data centers that train and serve models into orbit. That is the $200-per-kilogram bet.&lt;/p&gt;

&lt;p&gt;Starcloud stands apart: the startup not only flew the first data-center GPU, it also ran Google's Gemma model on it. In a sense, Google was beaten to "a neural network in orbit" with its own model.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the skeptics say
&lt;/h2&gt;

&lt;p&gt;Not everyone shares the enthusiasm. Commenting to TechTimes, astrophysicist Jonathan McDowell of the Harvard-Smithsonian Center for Astrophysics pointed to the cost of deorbiting: thousands of burning-up satellites leave combustion products in the upper atmosphere, and nobody really knows how that affects atmospheric chemistry. Space debris expert Moriba Jah of the University of Texas warns that mass deployments raise the risk of Kessler syndrome, a cascade of collisions that renders orbits unusable.&lt;/p&gt;

&lt;p&gt;There are plain engineering questions too. Solar panels degrade by 0.5–0.8% a year. A broken chip in orbit cannot be replaced, while a ground data center swaps hardware every few years as faster generations ship. An orbital cluster ages together with its chips.&lt;/p&gt;

&lt;h2&gt;
  
  
  My take
&lt;/h2&gt;

&lt;p&gt;What interests me most here is not space but how it changes the requirements for software. When hardware can return a wrong bit at any moment and goes off to cool every fifteen minutes, the program has to survive that: checkpoint, re-verify critical computations, resume calmly after a reset. On Earth we are used to assuming a server "just works". In an orbital data center that assumption is gone, and that single silent data corruption from the lab test says it louder than any number of kilowatts.&lt;/p&gt;

&lt;p&gt;The MVP itself is not a data center. It is a check that the basic assumptions hold in real flight. It has answered the first question: the chips are alive. The second, what it costs to throw away heat, turned out to matter more than it looked on paper. The third, launch price, is decided not at Google but on SpaceX's launch pads. A real data center in orbit is probably a decade away if everything goes to plan. But for the first time it is not a slide deck, it is hardware that flies and answers queries.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://klukyanov.ru/notes/google-suncatcher-orbit/" rel="noopener noreferrer"&gt;klukyanov.ru&lt;/a&gt;.&lt;/em&gt;&lt;br&gt;
&lt;em&gt;Shorter weekly write-ups (in Russian) — on &lt;a href="https://t.me/+KSAy8mfFOsgwYWMy" rel="noopener noreferrer"&gt;Telegram&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>hardware</category>
      <category>google</category>
      <category>space</category>
    </item>
    <item>
      <title>Lunar Fasting: an intermittent fasting app that puts your Apple Health activity on the lunar calendar</title>
      <dc:creator>Kirill Lukyanov</dc:creator>
      <pubDate>Sun, 04 Oct 2026 16:34:20 +0000</pubDate>
      <link>https://dev.to/klukyanov/lunar-fasting-an-intermittent-fasting-app-that-puts-your-apple-health-activity-on-the-lunar-4e2n</link>
      <guid>https://dev.to/klukyanov/lunar-fasting-an-intermittent-fasting-app-that-puts-your-apple-health-activity-on-the-lunar-4e2n</guid>
      <description>&lt;p&gt;Intermittent fasting has one simple rule: eat inside a window, don't eat outside it. The rule is easy, keeping it is not. Some days the window holds effortlessly, other days you break by lunch and have no idea why. I wanted an app that doesn't just tick a timer but shows me, from my own data, which days are easier and which are harder.&lt;/p&gt;

&lt;p&gt;That's how &lt;strong&gt;Lunar Fasting&lt;/strong&gt; came about. It went live on the App Store on October 2, 2026: 157 days from the first commit, 28 builds, 656 automated tests and one App Review rejection. Below: how to pick a fasting interval, what the app does, and the two features it was really built for.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fasting intervals: which one to pick
&lt;/h2&gt;

&lt;p&gt;"16:8" means 16 hours without food and an 8-hour eating window. The longer the fast, the stricter the regime. The app supports six protocols:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Protocol&lt;/th&gt;
&lt;th&gt;Fast&lt;/th&gt;
&lt;th&gt;Eating window&lt;/th&gt;
&lt;th&gt;In real life&lt;/th&gt;
&lt;th&gt;Good for&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;12:12&lt;/td&gt;
&lt;td&gt;12 h&lt;/td&gt;
&lt;td&gt;12 h&lt;/td&gt;
&lt;td&gt;Dinner at 8 pm, breakfast at 8 am — just no night snacks&lt;/td&gt;
&lt;td&gt;Beginners&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;14:10&lt;/td&gt;
&lt;td&gt;14 h&lt;/td&gt;
&lt;td&gt;10 h&lt;/td&gt;
&lt;td&gt;Dinner at 7 pm, breakfast at 9 am&lt;/td&gt;
&lt;td&gt;A gentle next step&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;16:8&lt;/td&gt;
&lt;td&gt;16 h&lt;/td&gt;
&lt;td&gt;8 h&lt;/td&gt;
&lt;td&gt;Eat from noon to 8 pm&lt;/td&gt;
&lt;td&gt;The most popular one, the default&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;18:6&lt;/td&gt;
&lt;td&gt;18 h&lt;/td&gt;
&lt;td&gt;6 h&lt;/td&gt;
&lt;td&gt;Eat from 1 pm to 7 pm, two meals&lt;/td&gt;
&lt;td&gt;When 16:8 feels easy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;20:4&lt;/td&gt;
&lt;td&gt;20 h&lt;/td&gt;
&lt;td&gt;4 h&lt;/td&gt;
&lt;td&gt;Late lunch and early dinner in one short window&lt;/td&gt;
&lt;td&gt;Experienced, for a while&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OMAD&lt;/td&gt;
&lt;td&gt;23 h&lt;/td&gt;
&lt;td&gt;1 h&lt;/td&gt;
&lt;td&gt;One meal a day&lt;/td&gt;
&lt;td&gt;The strictest, only deliberately&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The app is not a doctor: with diabetes, pregnancy, eating disorders or any chronic condition, talk to a doctor before you start.&lt;/p&gt;

&lt;p&gt;My advice: start with 12:12 or 14:10 and move up when the current step stops taking effort. You can switch protocols any time, and past days won't be recolored — each day is judged against the goal that was active when it ended.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fasting without a "start" button
&lt;/h3&gt;

&lt;p&gt;Most fasting trackers have a timer you start and stop by hand. Forget to tap it and the day is lost. Lunar Fasting doesn't store fasting windows at all: they are &lt;strong&gt;derived from logged meals&lt;/strong&gt;. Log breakfast and dinner, and the app knows how long you went without food.&lt;/p&gt;

&lt;p&gt;A few rules came out of this, each pinned by tests. A 2 am snack honestly breaks the fast instead of stretching it. If you forgot to log yesterday's dinner, you don't get a 40-hour "record" — you get "no data". Log a meal retroactively and the whole chain recalculates.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why lunar days, not calendar dates
&lt;/h2&gt;

&lt;p&gt;A lunar day runs from one moonrise to the next, about 24 h 50 min. There are roughly thirty of them in a lunar month. Most lunar calendars compute them with a mean formula and are off by up to half a day. Lunar Fasting computes moonrise astronomically for your location and uses true new moon instants (Meeus), not averages.&lt;/p&gt;

&lt;p&gt;To be clear: I don't claim the Moon affects appetite or how much you move. Science hasn't shown that. The app doesn't promise — it &lt;strong&gt;checks, on your own data&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Calories from a photo
&lt;/h2&gt;

&lt;p&gt;Snap your plate and a vision model splits it into items — side dish, cutlet, salad — each with its weight in grams. Add a text hint for ambiguous dishes ("buckwheat with mushrooms, no oil") and accuracy goes up noticeably.&lt;/p&gt;

&lt;p&gt;One deliberate decision: &lt;strong&gt;the model never computes the total&lt;/strong&gt;. It only returns item names, grams and kcal per 100 g; the app does the arithmetic. Small models are surprisingly bad at mental math, and this way every number is visible and editable.&lt;/p&gt;

&lt;p&gt;Recognition runs either &lt;strong&gt;on-device via Apple Intelligence&lt;/strong&gt; (no network, no key, the photo never leaves the phone) or through &lt;strong&gt;your own key&lt;/strong&gt; for OpenAI, Gemini, Qwen or DeepSeek, stored in the Keychain and sent straight to the provider. "Auto" mode tries on-device first. Meals are written to Apple Health too.&lt;/p&gt;

&lt;h2&gt;
  
  
  The main feature: your activity on the lunar calendar
&lt;/h2&gt;

&lt;p&gt;On first launch the app pulls a year of activity from Apple Health — steps, active energy, workouts and stand hours — and keeps it updated, re-syncing the last week each time because watch data arrives late.&lt;/p&gt;

&lt;p&gt;Four numbers become one &lt;strong&gt;activity index from 0 to 100&lt;/strong&gt;. Each metric is normalized to a daily target and capped, so overachieving doesn't inflate it:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;Daily target&lt;/th&gt;
&lt;th&gt;Weight&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Steps&lt;/td&gt;
&lt;td&gt;10,000&lt;/td&gt;
&lt;td&gt;35%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Active energy&lt;/td&gt;
&lt;td&gt;500 kcal&lt;/td&gt;
&lt;td&gt;30%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Workouts&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;20%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stand hours&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;15%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Without an Apple Watch, workouts and stand hours are almost always zero and the index would cap at about 65. So in statistics the app drops components you have no data for and renormalizes the weights.&lt;/p&gt;

&lt;p&gt;Calendar days and lunar days don't line up, so each lunar day gets a weighted value from the two calendar days it overlaps, proportional to time. The charts show your average index for each of the thirty lunar days and each moon phase — your own year of movement, not someone's theory.&lt;/p&gt;

&lt;h2&gt;
  
  
  A forecast for the lunar month
&lt;/h2&gt;

&lt;p&gt;The forecast is an additive model, and the app shows each day's breakdown:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Baseline&lt;/strong&gt; — your mean index with a 45-day half-life, so recent weeks weigh more.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Weekday effect&lt;/strong&gt; — 7 and 29.5 are incommensurable; without this axis, the weekly rhythm would leak into a fake lunar signal.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Recent trend&lt;/strong&gt; — the last two weeks vs. baseline, decaying over the horizon.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Moon phase and lunar day number&lt;/strong&gt; — hierarchical, and only if your history actually shows it.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The last part matters most: lunar effects go through &lt;strong&gt;empirical-Bayes shrinkage&lt;/strong&gt;. With few observations they shrink to zero, so with no lunar pattern in your data the forecast honestly falls back to baseline, weekday and trend. There's an uncertainty band that widens with the horizon and a confidence level: the forecast appears after 21 days of history, medium confidence from 60 days, high from 180. With 60+ days the app also backtests itself: it hides the last two weeks, predicts them and compares the error with a naive "same as average" forecast.&lt;/p&gt;

&lt;h2&gt;
  
  
  Coming in 1.1: Google Health
&lt;/h2&gt;

&lt;p&gt;If you wear a Google or Fitbit band with an iPhone, its data reaches Apple Health poorly: workouts go missing, calories and heart rate disagree, steps double. Lunar Fasting 1.1 adds a direct bridge: sign in with Google, and the app pulls workouts, steps, distance, active energy and heart rate from the Google Health API and writes them to Apple Health — deduplicated via &lt;code&gt;HKMetadataKeySyncIdentifier&lt;/code&gt;, with Google's echo of Apple Health data filtered out. Band activity then feeds the index and forecast just like Apple Watch data.&lt;/p&gt;

&lt;p&gt;One caveat: Google requires OAuth verification and a security audit for health scopes. Until then the feature runs in testing mode, capped at 100 users, so 1.1 ships it to a limited group first.&lt;/p&gt;

&lt;h2&gt;
  
  
  Free vs. Pro
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Free:&lt;/strong&gt; six fasting protocols, meals and manual calories, water, weight, daily ratings, lunar calendar, stats for steps, water, weight and calories, CSV export. No account, no server.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pro:&lt;/strong&gt; activity index, monthly forecast, calories from a photo. Weekly or yearly subscription with a 3-day free trial.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;iPhone and iPad, iOS 17+, English and Russian. &lt;a href="https://apps.apple.com/app/id6772260495" rel="noopener noreferrer"&gt;Get it on the App Store&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Would you trust a forecast that openly tells you when it has nothing to say?&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://klukyanov.ru/notes/lunar-fasting/" rel="noopener noreferrer"&gt;klukyanov.ru&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Shorter weekly write-ups (in Russian) — on &lt;a href="https://t.me/+KSAy8mfFOsgwYWMy" rel="noopener noreferrer"&gt;Telegram&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ios</category>
      <category>swift</category>
      <category>healthkit</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Kimi K3, DeepSeek and GLM free from NVIDIA: I tested the claim and here is the catch</title>
      <dc:creator>Kirill Lukyanov</dc:creator>
      <pubDate>Thu, 01 Oct 2026 09:42:31 +0000</pubDate>
      <link>https://dev.to/klukyanov/kimi-k3-deepseek-and-glm-free-from-nvidia-i-tested-the-claim-and-here-is-the-catch-2m9b</link>
      <guid>https://dev.to/klukyanov/kimi-k3-deepseek-and-glm-free-from-nvidia-i-tested-the-claim-and-here-is-the-catch-2m9b</guid>
      <description>&lt;p&gt;A claim is going around: NVIDIA hands out a free API key for Kimi K3, DeepSeek V4.1 Flash and two flavours of GLM 5.3 — no credit card, fifteen minutes. I went through it myself. The models are real, the free tier is more generous than the reposts say, and there is one catch the headline leaves out: a phone number check that does not cover every country.&lt;/p&gt;

&lt;h2&gt;
  
  
  What NVIDIA gives away
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://build.nvidia.com" rel="noopener noreferrer"&gt;NVIDIA Build&lt;/a&gt; is NVIDIA's catalog of hosted open models. The API is OpenAI-compatible: same &lt;code&gt;/v1/chat/completions&lt;/code&gt; request, you only swap the base URL and the key. As of October 1, 2026, &lt;code&gt;integrate.api.nvidia.com/v1/models&lt;/code&gt; lists 81 models, including the four most interesting open-weight releases of this autumn.&lt;/p&gt;

&lt;p&gt;The part most reposts get wrong is the money. New accounts used to get roughly 1,000 credits, and people still quote that number. Credits are gone. NVIDIA's own account verification dialog now says &lt;em&gt;"Unlimited API requests without daily limits"&lt;/em&gt;. What is limited is the rate: threads on the NVIDIA developer forum converge on about 40 requests per minute per key, and a forum moderator stated in July that the limit depends on the model, use case and overall traffic and cannot be officially raised on the free tier.&lt;/p&gt;

&lt;p&gt;40 RPM is 57,600 requests a day if you hammer it nonstop. For prototyping, a personal agent or evaluating a model on your own tasks, that is effectively unlimited. For production, NVIDIA points you to paid options: partner endpoints or self-hosted deployment.&lt;/p&gt;

&lt;h2&gt;
  
  
  The four models
&lt;/h2&gt;

&lt;p&gt;All four are mixture-of-experts models, and all four ship with a 1,048,576-token context window.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;API ID&lt;/th&gt;
&lt;th&gt;Total params&lt;/th&gt;
&lt;th&gt;Active per token&lt;/th&gt;
&lt;th&gt;Highlights&lt;/th&gt;
&lt;th&gt;License&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Kimi K3&lt;/td&gt;
&lt;td&gt;&lt;code&gt;moonshotai/kimi-k3&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;~2.8T&lt;/td&gt;
&lt;td&gt;not stated&lt;/td&gt;
&lt;td&gt;Long-horizon agentic coding, tool use, image input; thinking always on&lt;/td&gt;
&lt;td&gt;Modified MIT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GLM 5.3&lt;/td&gt;
&lt;td&gt;&lt;code&gt;z-ai/glm-5.3&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;753B&lt;/td&gt;
&lt;td&gt;~40B&lt;/td&gt;
&lt;td&gt;Text, reasoning, tool calling&lt;/td&gt;
&lt;td&gt;MIT with a clause for &amp;gt;$10B-revenue resellers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GLM 5.3 Flash&lt;/td&gt;
&lt;td&gt;&lt;code&gt;z-ai/glm-5.3-flash&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;320B&lt;/td&gt;
&lt;td&gt;18B&lt;/td&gt;
&lt;td&gt;Text + images, tools, structured output, thinking budget&lt;/td&gt;
&lt;td&gt;MIT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DeepSeek V4.1 Flash&lt;/td&gt;
&lt;td&gt;&lt;code&gt;deepseek-ai/deepseek-v4.1-flash&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;552B&lt;/td&gt;
&lt;td&gt;8B prefill / 16B decode&lt;/td&gt;
&lt;td&gt;Multimodal, reasoning effort adjustable 1–100&lt;/td&gt;
&lt;td&gt;MIT&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Source: model cards on build.nvidia.com.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;For coding I would start with Kimi K3 — it is the reason for the hype, and running it yourself takes a rack you do not have. Free access on someone else's GPUs is the only sensible way for most of us to try it. GLM 5.3 Flash and DeepSeek V4.1 Flash are for fast, cheap calls where you do not need the smartest answer.&lt;/p&gt;

&lt;h2&gt;
  
  
  The catch: phone verification
&lt;/h2&gt;

&lt;p&gt;Sign-up itself is smooth: email, password, NVIDIA Developer Program account. No card, as promised. But on the API keys page you get a modal — &lt;em&gt;"We'll need to verify your phone number"&lt;/em&gt; — and no key until you enter a one-time SMS code. NVIDIA frames it as fraud and abuse protection.&lt;/p&gt;

&lt;p&gt;The country list is not global. Russia is not on it at all; under the list NVIDIA says it is "rapidly expanding worldwide availability". Kazakhstan is listed, but in my attempt with a Kazakh number the "Send Code to Phone" button never became active, and the page showed no error. I could not confirm whether Kazakh numbers go through.&lt;/p&gt;

&lt;p&gt;I did not try to get around the check and would not recommend it: virtual numbers and borrowed SIMs violate the terms, and a key obtained that way can be revoked along with the account. So "fifteen minutes, no card" is true only if your phone number is from a supported country.&lt;/p&gt;

&lt;h2&gt;
  
  
  First request
&lt;/h2&gt;

&lt;p&gt;If your number is supported, the first call takes a minute. Any client that lets you change the base URL works, including coding agents.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;NVIDIA_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"nvapi-..."&lt;/span&gt;

curl https://integrate.api.nvidia.com/v1/chat/completions &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$NVIDIA_API_KEY&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "model": "moonshotai/kimi-k3",
    "messages": [{"role": "user", "content": "Explain Swift async/await in three sentences"}],
    "max_tokens": 1024
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Swap &lt;code&gt;model&lt;/code&gt; for any ID from the table. One Kimi K3 detail: thinking is always on, and in multi-turn chats or tool calls you must send back the full previous assistant message, including &lt;code&gt;reasoning_content&lt;/code&gt; and &lt;code&gt;tool_calls&lt;/code&gt;, or it loses the thread.&lt;/p&gt;

&lt;h2&gt;
  
  
  My take
&lt;/h2&gt;

&lt;p&gt;The offer itself is great: four of the strongest open models of the season, no payment, no daily cap, standard API. If your phone number qualifies, it is the easiest way to try Kimi K3 without renting hardware. Just know that "no card, fifteen minutes" quietly skips the phone step — and that step is where some of us stop.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://klukyanov.ru/notes/nvidia-build-free-models/" rel="noopener noreferrer"&gt;klukyanov.ru&lt;/a&gt;.&lt;/em&gt;&lt;br&gt;
&lt;em&gt;Shorter weekly write-ups (in Russian) — on &lt;a href="https://t.me/+KSAy8mfFOsgwYWMy" rel="noopener noreferrer"&gt;Telegram&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>opensource</category>
      <category>api</category>
    </item>
    <item>
      <title>Listen to your coding agent instead of reading it: how I save my eyes</title>
      <dc:creator>Kirill Lukyanov</dc:creator>
      <pubDate>Tue, 29 Sep 2026 18:42:49 +0000</pubDate>
      <link>https://dev.to/klukyanov/listen-to-your-coding-agent-instead-of-reading-it-how-i-save-my-eyes-4ci0</link>
      <guid>https://dev.to/klukyanov/listen-to-your-coding-agent-instead-of-reading-it-how-i-save-my-eyes-4ci0</guid>
      <description>&lt;p&gt;My working day at the computer used to be code and documentation. Now there's a third stream, and it turned out to be the biggest one: the agent's replies. Claude Code reports every step, explains what it changed, asks clarifying questions and sends summaries. All of it is text, and all of it is read with your eyes, in small terminal font.&lt;/p&gt;

&lt;p&gt;By evening you feel it physically. So I put together a pair of my own macOS apps. The first one, SafeYourEye, makes sure my eyes actually get rest. The second one, PromtsMaker, takes part of the load off them: the agent talks to me by voice, and I answer by voice too. Here's how it works for me and how to set it up in ten minutes.&lt;/p&gt;

&lt;h2&gt;
  
  
  The agent writes more than I can read
&lt;/h2&gt;

&lt;p&gt;With an agent your eyes don't get a break, they work harder. It writes the code, but I read its reports, check diffs and answer questions. Instead of typing text I read it, constantly, in small portions, switching between windows.&lt;/p&gt;

&lt;p&gt;Yet most of what the agent writes doesn't need a screen. "Starting", "tests are green", "found two places where this is used, fix both?" can simply be heard. You need the screen for diffs and code; for status and questions, voice is enough.&lt;/p&gt;

&lt;p&gt;Hence two fixes: don't let your eyes work without breaks, and move to audio everything that doesn't have to be read.&lt;/p&gt;

&lt;h2&gt;
  
  
  Half one: SafeYourEye keeps the breaks
&lt;/h2&gt;

&lt;p&gt;Everyone knows the 20-20-20 rule: every 20 minutes, look at something about 20 feet away for 20 seconds. Almost nobody follows it, because 20 minutes fly by at work. Here's what the app does:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Timer.&lt;/strong&gt; Counts a work session (5 to 60 minutes) and shows a break window with a 20-second countdown. A window is harder to dismiss than a banner.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Idle detection.&lt;/strong&gt; Walk away from the computer and the session doesn't burn: time without keyboard and mouse isn't counted as work.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Distance and light.&lt;/strong&gt; Using the camera, it hints when you sit too close to the screen or the room gets dark. Frames are processed on the Mac itself and never leave it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vision checks.&lt;/strong&gt; Four self-checks on one screen, with history and a PDF export for your doctor. Not a diagnosis, a way to notice a trend.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With an agent the timer turned out to be especially useful. While the agent runs a long task I don't sit staring at the terminal, I take the break. The SafeYourEye window and the agent's summary often arrive at about the same time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Half two: PromtsMaker gives the agent a voice
&lt;/h2&gt;

&lt;p&gt;PromtsMaker started as a prompt editor: dictate a thought, the app cleans up the text and adds project context. You don't have to use prompts at all, though. Since version 1.4 the app has a bridge to the agent, and that alone is worth installing it for.&lt;/p&gt;

&lt;p&gt;Inside PromtsMaker runs a local MCP server. Claude Code connects to it like to any other tool, and the agent gets a mouth and ears:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;say&lt;/strong&gt; — speak a short line during the work: "starting", "build passed";&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ask_user&lt;/strong&gt; — ask by voice and wait for a spoken answer: the app starts dictation itself and returns the transcript to the agent;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;report_result&lt;/strong&gt; — read the summary aloud, while details (diff, command output) stay as text in the panel;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;wait_for_prompt&lt;/strong&gt; — pick up a new task I dictated in PromtsMaker, without copying it into the terminal.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The agent has one rule: don't read walls of text. One or two sentences aloud; a long result only after "read it all?". Without that rule the first version of the bridge honestly read everything.&lt;/p&gt;

&lt;p&gt;I run the bridge live with Claude Code and OpenCode. The protocol is standard, MCP over HTTP, so any agent that can connect MCP servers over HTTP should work. Codex CLI supports such servers, but I haven't tested it with the bridge myself yet.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it looks like on an exercise bike
&lt;/h2&gt;

&lt;p&gt;My favourite scenario. A long task: rewrite a module, run the tests, fix whatever breaks. No reason to watch it in the terminal.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Dictate the task&lt;/strong&gt; into PromtsMaker as a normal sentence. The app strips the "umm"s and fixes terms using the project glossary. Sending it to the agent is ⌘⏎, no window switching.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Get on the bike.&lt;/strong&gt; The screen is far away; I don't need to read it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The agent works and talks.&lt;/strong&gt; Short updates are spoken, and I know where it is without looking.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The agent asks, I answer by voice.&lt;/strong&gt; At a fork it asks out loud, the app starts dictation, I say the answer, the agent continues.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The summary is spoken.&lt;/strong&gt; If it's clear, I dictate the next task right away. I look at the diff later, in one pass, instead of in bits for an hour.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Double benefit: my eyes rest on the far distance instead of the terminal, and my body moves while the agent does work that needs only a couple of spoken answers from me.&lt;/p&gt;

&lt;h2&gt;
  
  
  Eyes or ears: what moved where
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What's happening&lt;/th&gt;
&lt;th&gt;Before&lt;/th&gt;
&lt;th&gt;Now&lt;/th&gt;
&lt;th&gt;Who helps&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Give a task&lt;/td&gt;
&lt;td&gt;Type or paste into the terminal&lt;/td&gt;
&lt;td&gt;Dictate, ⌘⏎&lt;/td&gt;
&lt;td&gt;PromtsMaker&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Know which step the agent is on&lt;/td&gt;
&lt;td&gt;Watch terminal output&lt;/td&gt;
&lt;td&gt;A short spoken line&lt;/td&gt;
&lt;td&gt;PromtsMaker, &lt;code&gt;say&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Answer a clarifying question&lt;/td&gt;
&lt;td&gt;Read it, type an answer&lt;/td&gt;
&lt;td&gt;Hear it, answer by voice&lt;/td&gt;
&lt;td&gt;PromtsMaker, &lt;code&gt;ask_user&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Get the result&lt;/td&gt;
&lt;td&gt;Read the whole report&lt;/td&gt;
&lt;td&gt;Spoken summary, details as text&lt;/td&gt;
&lt;td&gt;PromtsMaker, &lt;code&gt;report_result&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Review diff and code&lt;/td&gt;
&lt;td&gt;Eyes&lt;/td&gt;
&lt;td&gt;Eyes, in one pass at the end&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;While the agent works long&lt;/td&gt;
&lt;td&gt;Sit at the screen and wait&lt;/td&gt;
&lt;td&gt;Break or exercise bike&lt;/td&gt;
&lt;td&gt;SafeYourEye&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Don't overstay at the screen&lt;/td&gt;
&lt;td&gt;Hope you remember&lt;/td&gt;
&lt;td&gt;Break window every 20 minutes&lt;/td&gt;
&lt;td&gt;SafeYourEye&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sat too close, room got dark&lt;/td&gt;
&lt;td&gt;Don't notice&lt;/td&gt;
&lt;td&gt;Camera hint&lt;/td&gt;
&lt;td&gt;SafeYourEye&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The code I always review with my eyes, and that's fine. Tool names are for the agent; users never need to know them.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to set up the same pair
&lt;/h2&gt;

&lt;p&gt;Both apps are for macOS and are in the Mac App Store. &lt;a href="https://apps.apple.com/us/app/promtsmaker/id6786639355?mt=12" rel="noopener noreferrer"&gt;PromtsMaker&lt;/a&gt; is free (macOS 14+). &lt;a href="https://apps.apple.com/us/app/safeyoureye-eye-care-timer/id6770624870?mt=12" rel="noopener noreferrer"&gt;SafeYourEye&lt;/a&gt; runs on macOS 13+, it's free to download, with full features in a Pro subscription ($2.99/month or $19.99/year).&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Install SafeYourEye&lt;/strong&gt; and set the session length. You can skip camera access: distance and blink hints turn off, the timer keeps working.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Install PromtsMaker&lt;/strong&gt; and open your project folder in it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enable the agent bridge.&lt;/strong&gt; The app starts the server on 127.0.0.1 only, generates an access token and shows a ready-made connect command.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Connect Claude Code&lt;/strong&gt; with that command. It looks like this (the app picks the port, the token is added as an Authorization header):
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude mcp add &lt;span class="nt"&gt;--transport&lt;/span&gt; http promtsmaker http://127.0.0.1:8765/mcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Tell the agent "wait for tasks from PromtsMaker".&lt;/strong&gt; On first connect it stores the bridge rules in its own memory; you don't need to add instructions to project files.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Allow speech recognition&lt;/strong&gt; when macOS asks. Better do it right away: the agent's first voice question otherwise waits on the system prompt, and you can't answer until it's dismissed.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What's next: read any reply with one key
&lt;/h2&gt;

&lt;p&gt;The bridge works when the agent decides to say something. But sometimes the session runs in a plain terminal, without the bridge, and you'd rather listen to the reply than read it. For that, the next PromtsMaker update adds a global hotkey: it reads the latest Claude Code reply for the project in the open tab, and pressing it again stops. The app strips Markdown first, so you don't hear asterisks and hashes.&lt;/p&gt;

&lt;p&gt;It already works in my dev build and will ship in the next App Store version.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://klukyanov.ru/notes/listen-to-agent/" rel="noopener noreferrer"&gt;klukyanov.ru&lt;/a&gt;.&lt;/em&gt;&lt;br&gt;
&lt;em&gt;Shorter weekly write-ups (in Russian) — on &lt;a href="https://t.me/+KSAy8mfFOsgwYWMy" rel="noopener noreferrer"&gt;Telegram&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>macos</category>
      <category>productivity</category>
      <category>mcp</category>
    </item>
    <item>
      <title>Fitbit Air and iPhone: why your band's data gets lost on the way to Apple Health</title>
      <dc:creator>Kirill Lukyanov</dc:creator>
      <pubDate>Mon, 28 Sep 2026 09:30:09 +0000</pubDate>
      <link>https://dev.to/klukyanov/fitbit-air-and-iphone-why-your-bands-data-gets-lost-on-the-way-to-apple-health-43g8</link>
      <guid>https://dev.to/klukyanov/fitbit-air-and-iphone-why-your-bands-data-gets-lost-on-the-way-to-apple-health-43g8</guid>
      <description>&lt;p&gt;I wear a Google Fitbit Air on my wrist and carry an iPhone. Sounds like a normal combo. In practice it's two health worlds that barely understand each other: the band counts steps, heart rate, sleep and workouts, the Google Health app shows all of it, but Apple Health — where every other iPhone app gets its data — receives only part of it, and not always in the right shape.&lt;/p&gt;

&lt;p&gt;I ran into this as a developer: one of my apps builds activity analytics on top of Apple Health, and with the band's data the analytics started to lie. Here's what's actually broken, why it's hard to fix, what the paid bridges on the App Store cost, and how I built my own.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two "Health" apps that refuse to be friends
&lt;/h2&gt;

&lt;p&gt;Apple and Google store health data in fundamentally different ways. Apple Health (HealthKit) lives only on the phone: an encrypted on-device database with no cloud API. Google Health is the opposite — a cloud service: the band sends data to the phone, the phone sends it to your Google account, and that's where it lives.&lt;/p&gt;

&lt;p&gt;To move data from one world to the other you need a program that runs on the iPhone, downloads data from Google's cloud and writes it into Apple's local store. Nobody else can do it: Google's cloud can't reach the database on your iPhone, and Apple only lets apps on the device itself write to it.&lt;/p&gt;

&lt;p&gt;For years Google simply didn't ship such a program. When HealthKit launched in 2014, Fitbit said outright it had no plans to support it, and Fitbit owners with iPhones lived on third-party utilities for a decade. Only in August 2026, in version 5.05, did the Google Health app learn to write to Apple Health itself. Problem solved? Not quite.&lt;/p&gt;

&lt;h2&gt;
  
  
  What gets lost on the way
&lt;/h2&gt;

&lt;p&gt;The official sync works, but with losses. On my own data:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Workouts go missing.&lt;/strong&gt; Some workouts recorded by the band never show up in Apple Health, although they're in Google Health.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Calories and heart rate don't match&lt;/strong&gt; between the two apps for the same day.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Duplicates.&lt;/strong&gt; The same steps and calories land in Apple Health twice and inflate the daily total.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Some metrics don't transfer at all&lt;/strong&gt;, e.g. heart rate variability (HRV) — even the coverage of the update admits it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you only glance at steps, that's cosmetic. But fitness apps, food diaries and training plans read Apple Health and draw conclusions from an incomplete, partly doubled picture.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why it's hard to do right
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Different data models.&lt;/strong&gt; In HealthKit a workout is a single object with calories and distance inside. In Google's model it's a set of separate points: an exercise segment, per-minute calories, per-minute distance. Copy everything as-is and calories inside a workout are counted twice.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The echo.&lt;/strong&gt; Google Health also &lt;em&gt;reads&lt;/em&gt; Apple Health (iPhone steps, Apple Watch workouts), uploads them to Google's cloud, and they come back as "Google data". A bridge that can't tell its own records from the echo grows duplicates on every sync.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The locked phone.&lt;/strong&gt; Apple Health's store is encrypted while the iPhone is locked, so nothing can be written. Background sync works in fits and starts, and long history imports die when the screen turns off.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Old paths are closing.&lt;/strong&gt; Many cheap bands have been writing to Google Fit for years. Since May 1, 2024 new developers can't sign up for its APIs, and they shut down at the end of 2026. The replacement is the Google Health API, which has its own strings attached (see below).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Paid bridges on the App Store and what they cost
&lt;/h2&gt;

&lt;p&gt;All of them are free to download and charge via in-app purchases. US App Store prices as of September 28, 2026:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;App&lt;/th&gt;
&lt;th&gt;Subscription&lt;/th&gt;
&lt;th&gt;Lifetime&lt;/th&gt;
&lt;th&gt;Rating&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Fitbit Sync To Apple Health (Syncfit)&lt;/td&gt;
&lt;td&gt;$4.99–9.99/mo, $19.99–39.99/yr&lt;/td&gt;
&lt;td&gt;$59.99&lt;/td&gt;
&lt;td&gt;4.6 (19,688)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fitbit to Apple Health Sync (myFitnessSync)&lt;/td&gt;
&lt;td&gt;$5.99–9.99/mo, $9.99/wk, $39.99/yr&lt;/td&gt;
&lt;td&gt;$39.99–59.99&lt;/td&gt;
&lt;td&gt;4.3 (29,189)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Power Sync for Fitbit&lt;/td&gt;
&lt;td&gt;auto-sync $1.99/mo, $7.99/yr (daily totals only)&lt;/td&gt;
&lt;td&gt;$14.99&lt;/td&gt;
&lt;td&gt;4.2 (15,642)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Power Sync: Fitness to Health&lt;/td&gt;
&lt;td&gt;$5.99/wk, $10.99/mo, $19.99–24.99/yr&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;4.5 (12,888)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fitbit to Health Sync Solver&lt;/td&gt;
&lt;td&gt;$9.99/wk, $39.99/yr&lt;/td&gt;
&lt;td&gt;$59.99&lt;/td&gt;
&lt;td&gt;4.5 (3,250)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fitbit Sync to Health App&lt;/td&gt;
&lt;td&gt;$9.99/wk, $19.99/mo, $39.99/yr&lt;/td&gt;
&lt;td&gt;$59.99&lt;/td&gt;
&lt;td&gt;4.1 (1,628)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fitbit to Apple Health Sync · (StepsApp)&lt;/td&gt;
&lt;td&gt;Pro: $4.99 or $19.99&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;4.3 (374)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The typical price is $39.99/year or $59.99 lifetime. The Fitbit Air costs about $100, so you're asked to pay almost half the band's price again just to get its data onto your iPhone properly. Weekly $9.99 plans add up to roughly $520 a year — five times the band.&lt;/p&gt;

&lt;p&gt;One caveat matters more than price: nearly all of these are built around the Fitbit / Google Health account. If your band writes to the old Google Fit, a bridge may not see its data. Test on the free trial before paying for a year.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I built my own bridge
&lt;/h2&gt;

&lt;p&gt;I didn't want to pay for a bridge, but my app's analytics had to be fixed, so I wrote the sync myself: the app pulls data straight from the Google Health API and writes it into Apple Health. (Turn off Google's own sync in that case, so you don't have two sources of the same thing.) The core work took one day; the interesting part is the pitfalls.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;API.&lt;/strong&gt; Google Fit REST is closed to new developers, so it's the Google Health API v4 (&lt;code&gt;dataTypes/{type}/dataPoints&lt;/code&gt;). All its scopes are classified as Restricted — more on that below.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sign-in without a secret.&lt;/strong&gt; Google officially expects a web-server client with a client secret, and you can't ship a secret inside an iOS app. An iOS client with PKCE via &lt;code&gt;ASWebAuthenticationSession&lt;/code&gt; worked — no backend, no Google SDK. Tokens live in the Keychain.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dedup the Apple way.&lt;/strong&gt; Every HealthKit sample gets &lt;code&gt;HKMetadataKeySyncIdentifier&lt;/code&gt; like &lt;code&gt;gh:&amp;lt;type&amp;gt;:&amp;lt;point id&amp;gt;&lt;/code&gt; plus &lt;code&gt;HKMetadataKeySyncVersion&lt;/code&gt;. A repeated sync replaces the record instead of adding a new one.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Echo filtering.&lt;/strong&gt; Points that came into Google from Apple Health (platform &lt;code&gt;HEALTH_KIT&lt;/code&gt;) are skipped, otherwise you get a loop.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Whole workouts.&lt;/strong&gt; Workouts are built with &lt;code&gt;HKWorkoutBuilder&lt;/code&gt; with calories and distance inside, and per-minute calories/distance that fall into the workout window are dropped so the day doesn't count them twice.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;History in chunks.&lt;/strong&gt; Fresh days first, then history from newest to oldest: workouts and sleep up to a year, steps and calories 90 days, heart rate 30. Progress is stored per metric, so an interrupted sync resumes where it stopped.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep the screen on.&lt;/strong&gt; During a manual sync the idle timer is disabled, and if the phone gets locked anyway the user sees a clear hint instead of a database error.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Format surprises.&lt;/strong&gt; 64-bit numbers arrive as strings, distance comes in millimeters and sits somewhere other than the docs suggested — the first parser version crashed on a real response. The mapper is covered by tests on trimmed real data.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The main limitation isn't technical. Until the app passes Google's OAuth verification and a third-party security audit, the feature runs in testing mode: at most 100 users, and the Google sign-in expires every 7 days. Fine for personal use, not for everyone. The paid bridges above prove the path is passable — it just takes weeks and money.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to do right now if you own a Google band
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Turn on the official sync&lt;/strong&gt; in Google Health: add Apple Health in the connections settings. It's free, and for steps and sleep it's often enough.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Set source priority&lt;/strong&gt; in Apple Health: open a metric → Data Sources &amp;amp; Access → Edit, and put the band above the iPhone so phone and wrist steps don't add up.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compare a week of workouts&lt;/strong&gt; in Google Health and Apple Health. No differences — you need nothing else.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;If workouts go missing and they matter&lt;/strong&gt;, pick a bridge from the table — but start with the trial and check &lt;em&gt;your&lt;/em&gt; data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep one bridge.&lt;/strong&gt; Official sync plus a paid app at the same time is the shortest path to duplicates.&lt;/li&gt;
&lt;/ol&gt;

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

&lt;p&gt;The sync already works in my test build, and I'm going to ship it as a separate app — just the Google Health → Apple Health bridge, nothing else. No name yet: Google verification comes first. I'll write about it when it's out.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://klukyanov.ru/notes/fitbit-air-apple-health/" rel="noopener noreferrer"&gt;klukyanov.ru&lt;/a&gt;.&lt;/em&gt;&lt;br&gt;
&lt;em&gt;Shorter weekly write-ups (in Russian) — on &lt;a href="https://t.me/+KSAy8mfFOsgwYWMy" rel="noopener noreferrer"&gt;Telegram&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ios</category>
      <category>healthkit</category>
      <category>swift</category>
      <category>android</category>
    </item>
  </channel>
</rss>
