Anshu's banner
Anshu's profile picture

Anshu

@anshuc5,530 subscribers

Posting about how to build beautiful apps and products with AI. Let's end slop together. Formerly: YC founder, UI/UX & AI @apple

Shorts

Oh my god Opus 5 is ridiculously good at mobile apps. It might be better than Fable? wtf? I tried my old "conversational calorie tracker" prompts. DAMN this is clean for a v1:

Oh my god Opus 5 is ridiculously good at mobile apps. It might be better than Fable? wtf? I tried my old "conversational calorie tracker" prompts. DAMN this is clean for a v1:

299,093 views

Some of you said it still looks like AI slop, and I agreed, so I told Fable to "100x the design." Here's what it did, and all the details on how.

Some of you said it still looks like AI slop, and I agreed, so I told Fable to "100x the design." Here's what it did, and all the details on how.

738,058 views

This is my "feel the AGI" moment: I used GPT-5.6 Sol to train my own autocorrect model that outperforms GPT-5.6 Sol (wtf??) I have no ML background. I have no idea what I'm doing. I just kept pushing Sol until it spat out a SOTA model. And I spent $0. The motivation: Years of talking to AI have made me terrible at typing. Rather than fix my skill issue, I decided to throw more AI at it. My idea was: instead of autocorrect that interrupts my flow, I want to type fast with mistakes and have AI clean it up after. I wanted the smallest local model possible, for speed, for battery life, for science! So I decided to train my own. Inspired by Andrej Karpathy’s autoresearch, I ran Codex /goal with this setup: pick an experiment, try it, record the results to a doc, throw it out if it fails, and plan the next experiment without repeating failures. I gave a few examples that had to pass, tight latency targets, and let it run. Sol did some amazing things. First, it scanned benchmarks and shortlisted base models: Qwen 3.5, Gemma 4, Liquid LFM 2.5. It found a dataset on HuggingFace for typed text. Then it built a simulator for fingers striking a Mac keyboard, modeling the physical layout with a Gaussian distribution around each key. It simulated striking the wrong key, wrong order, fat-fingering, etc. With the models + data + simulator, it fine-tuned using MLX right on my MacBook. It had a working prototype within an hour! But accuracy was pretty poor. — Problem 1: Tokenization Sol read papers, ran tests, and identified that the tokenizer was the bottleneck. Tokenization makes typos hard for the model to see, so it memorizes mappings instead of using its language priors. Sol tried ByT5, Google’s tokenizer-free byte-level LLM. This made a big improvement, but the model is old and lacked the knowledge needed to reach Sol performance. Sol dug deeper and realized a tokenizer-free model isn’t needed; instead, it used T5Gemma, an encoder-decoder model. This can understand the input deeply before producing output, and furthermore, Sol could post-train the encoder to improve performance. This gave a much higher ceiling. — Problem 2: Loss function Now the model was correcting some typos perfectly, but ignoring most. Sol realized that standard cross-entropy loss was teaching the model to avoid edits, because the vast majority of characters in the training data were left unmodified. The fix was wild: Sol wrote a custom loss function that byte-aligns the source and target strings, uses a dynamic programming algorithm to compute the minimum edits between the two, then weights correct edits much higher than copies. After a lot of tuning, this dramatically improved accuracy. — Problem 3: Autoregression One failure mode remained: if the model made a mistake, it couldn’t backtrack. It could only predict the next token. Teaching it to “think” like a reasoning model would solve this, but would be far too slow. Sol found a beautiful solution: instead of greedily predicting the next token, beam search over all possibilities. This parallelizes the exploration instead of one linear chain-of-thought. At the end, choose the path with highest cumulative log probability. This worked great, but made the experience worse, since the user wouldn’t see progress until the whole search was done. To fix this, Sol made a clever observation: after each search step, the longest common prefix among surviving branches is guaranteed to appear in the final result, so it can be displayed immediately. As the search progresses, weaker paths are dropped and the prefix grows, so the user sees continuous progress. Sol built all this as a custom MLX pipeline that does the parallel decoding on the MacBook GPU, with just ~40ms TTFT. It’s crazy fast and entirely local. — Final eval (error reduction rate, higher is better): - Apple autocorrect: 49.66% - GPT-5.6 Luna: 82.47% - GPT-5.6 Terra: 87.64% - GPT-5.6 Sol: 90.56% - Our model (1.7B): 91.02% Final cost: - 1 quota reset (thanks Tibo) - $0 (And yes, I verified there's no cheating. In fact, we test words scrubbed from the training data to prove the model isn’t memorizing) There were a ton more details and tangents I could write about: contrastive learning, GRPO, DPO, dynamic masking, and more. Sol is a fascinating and creative model. It blew my mind so many times. Don’t let a lack of experience stop you: Sol makes AI experiments accessible to anyone!

This is my "feel the AGI" moment: I used GPT-5.6 Sol to train my own autocorrect model that outperforms GPT-5.6 Sol (wtf??) I have no ML background. I have no idea what I'm doing. I just kept pushing Sol until it spat out a SOTA model. And I spent $0. The motivation: Years of talking to AI have made me terrible at typing. Rather than fix my skill issue, I decided to throw more AI at it. My idea was: instead of autocorrect that interrupts my flow, I want to type fast with mistakes and have AI clean it up after. I wanted the smallest local model possible, for speed, for battery life, for science! So I decided to train my own. Inspired by Andrej Karpathy’s autoresearch, I ran Codex /goal with this setup: pick an experiment, try it, record the results to a doc, throw it out if it fails, and plan the next experiment without repeating failures. I gave a few examples that had to pass, tight latency targets, and let it run. Sol did some amazing things. First, it scanned benchmarks and shortlisted base models: Qwen 3.5, Gemma 4, Liquid LFM 2.5. It found a dataset on HuggingFace for typed text. Then it built a simulator for fingers striking a Mac keyboard, modeling the physical layout with a Gaussian distribution around each key. It simulated striking the wrong key, wrong order, fat-fingering, etc. With the models + data + simulator, it fine-tuned using MLX right on my MacBook. It had a working prototype within an hour! But accuracy was pretty poor. — Problem 1: Tokenization Sol read papers, ran tests, and identified that the tokenizer was the bottleneck. Tokenization makes typos hard for the model to see, so it memorizes mappings instead of using its language priors. Sol tried ByT5, Google’s tokenizer-free byte-level LLM. This made a big improvement, but the model is old and lacked the knowledge needed to reach Sol performance. Sol dug deeper and realized a tokenizer-free model isn’t needed; instead, it used T5Gemma, an encoder-decoder model. This can understand the input deeply before producing output, and furthermore, Sol could post-train the encoder to improve performance. This gave a much higher ceiling. — Problem 2: Loss function Now the model was correcting some typos perfectly, but ignoring most. Sol realized that standard cross-entropy loss was teaching the model to avoid edits, because the vast majority of characters in the training data were left unmodified. The fix was wild: Sol wrote a custom loss function that byte-aligns the source and target strings, uses a dynamic programming algorithm to compute the minimum edits between the two, then weights correct edits much higher than copies. After a lot of tuning, this dramatically improved accuracy. — Problem 3: Autoregression One failure mode remained: if the model made a mistake, it couldn’t backtrack. It could only predict the next token. Teaching it to “think” like a reasoning model would solve this, but would be far too slow. Sol found a beautiful solution: instead of greedily predicting the next token, beam search over all possibilities. This parallelizes the exploration instead of one linear chain-of-thought. At the end, choose the path with highest cumulative log probability. This worked great, but made the experience worse, since the user wouldn’t see progress until the whole search was done. To fix this, Sol made a clever observation: after each search step, the longest common prefix among surviving branches is guaranteed to appear in the final result, so it can be displayed immediately. As the search progresses, weaker paths are dropped and the prefix grows, so the user sees continuous progress. Sol built all this as a custom MLX pipeline that does the parallel decoding on the MacBook GPU, with just ~40ms TTFT. It’s crazy fast and entirely local. — Final eval (error reduction rate, higher is better): - Apple autocorrect: 49.66% - GPT-5.6 Luna: 82.47% - GPT-5.6 Terra: 87.64% - GPT-5.6 Sol: 90.56% - Our model (1.7B): 91.02% Final cost: - 1 quota reset (thanks Tibo) - $0 (And yes, I verified there's no cheating. In fact, we test words scrubbed from the training data to prove the model isn’t memorizing) There were a ton more details and tangents I could write about: contrastive learning, GRPO, DPO, dynamic masking, and more. Sol is a fascinating and creative model. It blew my mind so many times. Don’t let a lack of experience stop you: Sol makes AI experiments accessible to anyone!

178,106 views

lmao I always wondered what elon's X notifications look like, so I asked grok 4.5 to build a simulator (link below)

lmao I always wondered what elon's X notifications look like, so I asked grok 4.5 to build a simulator (link below)

75,181 views

Whoa, GLM-5.2 is INSANE for UI/UX with the right prompting. Open models have finally closed the gap. You have to push it, but it's super creative. I just asked for a beautiful personal site; this was all the model's idea (multiple turns):

Whoa, GLM-5.2 is INSANE for UI/UX with the right prompting. Open models have finally closed the gap. You have to push it, but it's super creative. I just asked for a beautiful personal site; this was all the model's idea (multiple turns):

178,213 views

I learned this the hard way: do NOT use SwiftUI if you want your app to look and feel amazing. At least when coding with AI. (sorry, Apple colleagues reading this 😅) I'm sharing my process vibe coding this calorie tracker. I get a lot of questions about the fluid transition in the video. Here's the whole story. Initially, Claude built the grid with SwiftUI. It was quick and easy, and looked good! But the transition to the day view was a boring navigation push/pop. No fun. I wanted something custom. I asked Claude to make it a fluid transition that remaps the food tiles from their source to destination positions. All hell broke loose. Claude tried a bunch of horrible things. Initially it used matched geometry effects, which worked OK but didn't lend themselves well to gesture-driven animations. So it resorted to SwiftUI preference keys + geometry readers to figure out the source and destination positions and calculate the interpolated position based on gesture progress, coordinating across grid and day views. But this meant it had to write a custom layout because it couldn't reposition tiles inside the native SwiftUI grid. And it had to do an awkward handoff between views, which always created ugly pops or jumps. And don't get me started on trying to put it on a bouncy spring, that only made the math 10x buggier. Fortunately, Claude Fable was smart enough to see that this was becoming a disaster (and discover most of the issues itself, in the simulator), so it pivoted away from SwiftUI. Opus might not be so wise, so you'll have to pay attention and intervene. Ultimately, it rewrote it in plain UIKit and everything turned out great. After that, we moved from 2D images to 3D assets, which introduced a new set of performance challenges and yet another rewrite to a single Metal layer, which is what you see below. I can write more about the 2D-to-3D saga if anyone's interested. If I were to do it again, I'd just say "Don't use SwiftUI" from the very first prompt, and save a few hours of headaches. SwiftUI can be amazing for a human iterating directly in code. But agents don't benefit from any of its advantages. Plus, agents have seen decades of UIKit training data, so they're great at writing it, and it's far more flexible. Here's hoping we see more agent-friendly iterations of SwiftUI in the future. Till then, I'm probably going to avoid it.

I learned this the hard way: do NOT use SwiftUI if you want your app to look and feel amazing. At least when coding with AI. (sorry, Apple colleagues reading this 😅) I'm sharing my process vibe coding this calorie tracker. I get a lot of questions about the fluid transition in the video. Here's the whole story. Initially, Claude built the grid with SwiftUI. It was quick and easy, and looked good! But the transition to the day view was a boring navigation push/pop. No fun. I wanted something custom. I asked Claude to make it a fluid transition that remaps the food tiles from their source to destination positions. All hell broke loose. Claude tried a bunch of horrible things. Initially it used matched geometry effects, which worked OK but didn't lend themselves well to gesture-driven animations. So it resorted to SwiftUI preference keys + geometry readers to figure out the source and destination positions and calculate the interpolated position based on gesture progress, coordinating across grid and day views. But this meant it had to write a custom layout because it couldn't reposition tiles inside the native SwiftUI grid. And it had to do an awkward handoff between views, which always created ugly pops or jumps. And don't get me started on trying to put it on a bouncy spring, that only made the math 10x buggier. Fortunately, Claude Fable was smart enough to see that this was becoming a disaster (and discover most of the issues itself, in the simulator), so it pivoted away from SwiftUI. Opus might not be so wise, so you'll have to pay attention and intervene. Ultimately, it rewrote it in plain UIKit and everything turned out great. After that, we moved from 2D images to 3D assets, which introduced a new set of performance challenges and yet another rewrite to a single Metal layer, which is what you see below. I can write more about the 2D-to-3D saga if anyone's interested. If I were to do it again, I'd just say "Don't use SwiftUI" from the very first prompt, and save a few hours of headaches. SwiftUI can be amazing for a human iterating directly in code. But agents don't benefit from any of its advantages. Plus, agents have seen decades of UIKit training data, so they're great at writing it, and it's far more flexible. Here's hoping we see more agent-friendly iterations of SwiftUI in the future. Till then, I'm probably going to avoid it.

111,617 views

ok WTF, Fable is absolutely cooking update #3 on my vibe-coded calorie tracker: I didn't like the plain images of food, so Claude turned them into Gaussian splats and rendered them on a virtual dining table???

ok WTF, Fable is absolutely cooking update #3 on my vibe-coded calorie tracker: I didn't like the plain images of food, so Claude turned them into Gaussian splats and rendered them on a virtual dining table???

129,863 views

Everyone's sleeping on image-to-3D AI models. They can make your app look incredibly unique, with just a little effort. Here's how. This is my calorie tracker, built in a week with nothing but prompting. Just Claude Code + a couple APIs. The visuals are all AI-generated. I'll be sharing the full workflow + all the crazy technical stuff Claude and I did to make this work, so nobody has to struggle through it like me. Deep dive coming soon! Till then, this is the high-level idea: 1. Get a clean image of the food (or whatever your asset is) - In my app, the user describes foods via text, or attaches images (or both) - If text, an LLM extracts the food description and formats it into a specific prompt I tuned for this design, and we generate an image using Z-Image Turbo through fal - If image, we do the same thing but with FLUX.2 [dev] to edit the user image into our reference design - Originally, both used Google Nano Banana, but switching to open models cut costs and latency a ton 2. Gaussian splatting (2D image → 3D model) - I tried various 2D-to-3D options on fal and ended up with TripoSplat as my preferred balance of speed, cost, latency; this turns an image into a 3D model that looks super high quality (link below) - The app displays the 2D image while our backend generates the 3D splat - We "groom" the splat to reduce size and load time by culling low-opacity/scale points 3. Render efficiently on device Originally, it looked great but ran at 10 FPS. Getting to 120 FPS was a crazy journey. TL;DR: - SwiftUI had to go; it forced us to render each asset in independent MTKViews, which wasn't workable - Instead, we composite every dish into one full-bleed CAMetalLayer using MetalSplatter (link below) - We had to make some optimizations within MetalSplatter's code too, to reduce the overhead of sorting points per render Then I added some finishing touches like the subtle rotation and parallax as they move around. I think it turned out pretty cool :) Overall, this took some effort, but we still got it done in less than a day. Hopefully your agent can follow in the footsteps of mine and do it much faster. Keep an eye out for the bigger writeup, which'll give your agent everything it needs. If you have any questions, drop em below!

Everyone's sleeping on image-to-3D AI models. They can make your app look incredibly unique, with just a little effort. Here's how. This is my calorie tracker, built in a week with nothing but prompting. Just Claude Code + a couple APIs. The visuals are all AI-generated. I'll be sharing the full workflow + all the crazy technical stuff Claude and I did to make this work, so nobody has to struggle through it like me. Deep dive coming soon! Till then, this is the high-level idea: 1. Get a clean image of the food (or whatever your asset is) - In my app, the user describes foods via text, or attaches images (or both) - If text, an LLM extracts the food description and formats it into a specific prompt I tuned for this design, and we generate an image using Z-Image Turbo through fal - If image, we do the same thing but with FLUX.2 [dev] to edit the user image into our reference design - Originally, both used Google Nano Banana, but switching to open models cut costs and latency a ton 2. Gaussian splatting (2D image → 3D model) - I tried various 2D-to-3D options on fal and ended up with TripoSplat as my preferred balance of speed, cost, latency; this turns an image into a 3D model that looks super high quality (link below) - The app displays the 2D image while our backend generates the 3D splat - We "groom" the splat to reduce size and load time by culling low-opacity/scale points 3. Render efficiently on device Originally, it looked great but ran at 10 FPS. Getting to 120 FPS was a crazy journey. TL;DR: - SwiftUI had to go; it forced us to render each asset in independent MTKViews, which wasn't workable - Instead, we composite every dish into one full-bleed CAMetalLayer using MetalSplatter (link below) - We had to make some optimizations within MetalSplatter's code too, to reduce the overhead of sorting points per render Then I added some finishing touches like the subtle rotation and parallax as they move around. I think it turned out pretty cool :) Overall, this took some effort, but we still got it done in less than a day. Hopefully your agent can follow in the footsteps of mine and do it much faster. Keep an eye out for the bigger writeup, which'll give your agent everything it needs. If you have any questions, drop em below!

19,931 views

Videos

No more content to load