<?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: tanizya</title>
    <description>The latest articles on DEV Community by tanizya (@tanizya).</description>
    <link>https://dev.to/tanizya</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3840295%2Fd3a25018-53bf-4d0a-aa09-f0e98bdcb9a0.jpeg</url>
      <title>DEV Community: tanizya</title>
      <link>https://dev.to/tanizya</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tanizya"/>
    <language>en</language>
    <item>
      <title>I Built an iOS Stock Prediction App with Claude Code — Here's How It Went</title>
      <dc:creator>tanizya</dc:creator>
      <pubDate>Mon, 23 Mar 2026 14:41:48 +0000</pubDate>
      <link>https://dev.to/tanizya/i-built-an-ios-stock-prediction-app-with-claude-code-heres-how-it-went-2d2e</link>
      <guid>https://dev.to/tanizya/i-built-an-ios-stock-prediction-app-with-claude-code-heres-how-it-went-2d2e</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Claude Code's coding ability has gotten seriously impressive. I used it to build an iOS app and ship it to the Apple App Store.&lt;/p&gt;

&lt;p&gt;In this post, I'll walk through the development process — what prompts worked well, where the bottlenecks were, and what it's like to vibe-code an entire app.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Stock HiLo&lt;/strong&gt; — an iOS app where you swipe cards to predict whether a stock will go up or down.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apps.apple.com/us/app/stock-hilo/id6759896635" rel="noopener noreferrer"&gt;https://apps.apple.com/us/app/stock-hilo/id6759896635&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Swipe up for High, swipe down for Low. After voting, you see the community's prediction. I designed it around a card UI so you focus on one stock at a time — the swipe gesture doubles as both navigation and voting.&lt;/p&gt;

&lt;p&gt;I built this because I wanted a quick way to check shifting Mag 7 market caps, chart patterns, and new highs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture
&lt;/h2&gt;

&lt;p&gt;Here's the high-level architecture and tech stack:&lt;/p&gt;

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

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Technology&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Frontend&lt;/td&gt;
&lt;td&gt;SwiftUI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Charts&lt;/td&gt;
&lt;td&gt;Lightweight Charts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Backend&lt;/td&gt;
&lt;td&gt;Supabase (PostgreSQL + REST API)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data Collection&lt;/td&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pipeline&lt;/td&gt;
&lt;td&gt;GitHub Actions (weekdays at 5 PM EST)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ads&lt;/td&gt;
&lt;td&gt;Google AdMob&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Fully serverless on free-tier plans. Data updates run via GitHub Actions cron, and the API is Supabase's built-in REST API.&lt;/p&gt;

&lt;h2&gt;
  
  
  Deep Dive
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Development Approach
&lt;/h3&gt;

&lt;p&gt;My first prompt was essentially: "Yo! Let's build an iOS app! It's a stock app, the UI should be Tinder-like with swipe to..." — dumping the entire mental image into one big prompt to get a prototype.&lt;/p&gt;

&lt;p&gt;I considered starting with a spec-driven approach, but decided to ride the initial impulse for this side project. Pure vibes, let the AI code.&lt;/p&gt;

&lt;h3&gt;
  
  
  Charts: TradingView Lightweight Charts
&lt;/h3&gt;

&lt;p&gt;Candlestick charts are rendered using TradingView's &lt;a href="https://www.tradingview.com/lightweight-charts/" rel="noopener noreferrer"&gt;Lightweight Charts&lt;/a&gt; inside a WKWebView.&lt;/p&gt;

&lt;h3&gt;
  
  
  Splash Screen: HTML/CSS Animation
&lt;/h3&gt;

&lt;p&gt;The splash screen uses SVG animated with HTML/CSS inside a WKWebView — an isometric animation of cards flying out of a phone.&lt;/p&gt;

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

&lt;p&gt;I didn't know the word "isometric" at the time, so I told Claude Code: "Make it look like that old AWS logo thing — the tilted, 3D-looking style, but make it fancy." Claude responded with: "I wrote you an isometric splash screen."&lt;/p&gt;

&lt;p&gt;There's something called the Joshua Tree effect — once you learn the name of a street tree is a Joshua tree, you suddenly notice them everywhere. It's the "there are 200 shades of white" moment.&lt;/p&gt;

&lt;p&gt;If you don't know the name of something, you can't write a precise, colorful prompt for it. I think the next generation of full-stack engineers will get more leverage from AI by learning design vocabulary — words like haptic, parallax, glassmorphism. You may not need to know that glassmorphism is built with &lt;code&gt;blur&lt;/code&gt; and &lt;code&gt;transparency&lt;/code&gt;, but you need to know what visual effect "glassmorphism" refers to.&lt;/p&gt;

&lt;p&gt;Back to the point: while this splash screen plays, the app preloads chart data for the first tab.&lt;/p&gt;

&lt;h3&gt;
  
  
  Supabase
&lt;/h3&gt;

&lt;p&gt;Just 2 tables and 1 view:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;cards&lt;/code&gt; — stock data (price, chart data, signals)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;votes&lt;/code&gt; — user votes&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;vote_counts&lt;/code&gt; — aggregated vote counts (database view)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The app hits Supabase's REST API directly. Just a GET request with the anon key — no SDK needed.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;request&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;URLRequest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;anonKey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;forHTTPHeaderField&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"apikey"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Bearer &lt;/span&gt;&lt;span class="se"&gt;\(&lt;/span&gt;&lt;span class="n"&gt;anonKey&lt;/span&gt;&lt;span class="se"&gt;)&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;forHTTPHeaderField&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"Authorization"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;_&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="kt"&gt;URLSession&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;shared&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;for&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When you create a table in Supabase, it automatically generates a REST endpoint at &lt;code&gt;https://&amp;lt;project&amp;gt;.supabase.co/rest/v1/&amp;lt;table_name&amp;gt;&lt;/code&gt;. You get full CRUD without writing a single line of backend code.&lt;/p&gt;

&lt;h3&gt;
  
  
  SwiftUI: Card Swipe UI
&lt;/h3&gt;

&lt;p&gt;This was the most time-consuming part, and where the most tokens were spent.&lt;/p&gt;

&lt;p&gt;The design is inspired by playing cards — rank (A, K, Q...) and suit (♠♥♦♣) in the top-left corner, with a flipped ticker in the bottom-right.&lt;/p&gt;

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

&lt;p&gt;When you swipe up, the next card's ticker peeks out from the bottom, so in a market-cap-sorted deck, you can guess the next card and quickly browse through charts.&lt;/p&gt;

&lt;p&gt;The header layout required meticulous tuning, even with vibe coding. AI is still weak at visual precision.&lt;/p&gt;

&lt;p&gt;I had to specify margins in pt, and when placing the Ace of Spades rank and suit in a VStack, the second line got pushed too far down — so I suggested "try a ZStack instead" and "use a negative offset." That kind of frontend knowledge still matters when you want to nail a layout in a single turn.&lt;/p&gt;

&lt;h3&gt;
  
  
  App Store Connect
&lt;/h3&gt;

&lt;p&gt;Claude Code can't interact with the App Store Connect website, so this was where I felt the human bottleneck most acutely.&lt;/p&gt;

&lt;p&gt;There were hallucinations too. App Store Connect auto-publishes when the status reaches "Ready for Distribution," but Claude Code — even with Opus 4.6 — told me to wait for a "Distributing" status that doesn't exist.&lt;/p&gt;

&lt;p&gt;Other gotchas: what AdMob calls "Developer Website" is called "Marketing URL" in App Store Connect. These kinds of platform-specific mismatches tripped up the AI frequently.&lt;/p&gt;

&lt;h3&gt;
  
  
  In-App Ads: Google AdMob
&lt;/h3&gt;

&lt;p&gt;I used Google AdMob for in-app ads.&lt;/p&gt;

&lt;p&gt;AdMob requires an &lt;code&gt;app-ads.txt&lt;/code&gt; file at the root of your developer website. I hosted mine on GitHub Pages to keep costs at zero.&lt;/p&gt;

&lt;p&gt;Google's crawler took quite a while to pick it up. Now that AI makes coding faster, waiting days for external processes felt even more painful.&lt;/p&gt;

&lt;h2&gt;
  
  
  Performance Optimization
&lt;/h2&gt;

&lt;p&gt;The AI's first draft was painfully slow — both cold start and cached. But when I asked "list every performance improvement you can think of and implement them one by one," it spent about 20 minutes heads-down coding. This is where AI truly surpasses humans.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Cache-first&lt;/strong&gt; — Show disk cache immediately, update in background&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chart preload&lt;/strong&gt; — Load first 2 cards during splash screen&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Optimistic updates&lt;/strong&gt; — Votes reflect in UI instantly&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fetch cooldown&lt;/strong&gt; — 60-second cache on vote data per tab&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Reflection
&lt;/h2&gt;

&lt;p&gt;The first time I tried iOS development was back in the iOS 5/6 era with Objective-C. I wanted to build culturally cool apps like RapBot or iDaft, but Xcode and Objective-C were a terrible developer experience, and my skill set — battle-hardened by legacy Struts 1.x systems at a Japanese megabank — didn't translate at all. I could barely get past a Hello World.&lt;/p&gt;

&lt;p&gt;Even so, seeing my own creation running on a real device was thrilling. I proudly posted it on Instagram.&lt;/p&gt;

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

&lt;p&gt;My programming life has been a constant battle against error messages. I failed a year in college, and I still occasionally dream about my thesis code not compiling.&lt;/p&gt;

&lt;p&gt;Claude Code completely transformed that experience. It blew away everything I hated about programming.&lt;/p&gt;

&lt;p&gt;AI coding tools are great for work, but I think they shine even brighter in side projects.&lt;/p&gt;

&lt;p&gt;Happy vibe coding to you all!&lt;/p&gt;




&lt;p&gt;Stock HiLo is &lt;a href="https://apps.apple.com/us/app/stock-hilo/id6759896635" rel="noopener noreferrer"&gt;live on the App Store&lt;/a&gt;. Give it a try — feedback is welcome!&lt;/p&gt;

</description>
      <category>ai</category>
      <category>ios</category>
      <category>swift</category>
      <category>supabase</category>
    </item>
  </channel>
</rss>
