Inspiration
I've always loved ASCII art: old terminals, CRT glow, and programs like cbonsai that grow a tree out of slashes and tildes while you watch. There's something calming about a picture made only of characters. On my phone, though, the things I reach for when I want to zone out are feeds that never end. I wanted something as calm as a terminal toy that also reacts when you touch it, and that you can put down whenever you like.
What it does
ASCII TOYS is an iPhone app of small interactive, haptic toys drawn entirely in monospaced characters. It helps you kill time, get relaxed, and just fidget around while you're bored.
- Touch Grass: drag your finger through a field of
|/\blades and they bend away, then spring back. - Campfire: stoke it by touching it, or by blowing into the mic.
- Bonsai: tap to grow a new tree from a sapling, a different one every time.
- Plus Bubble Wrap, Zen Sand Garden, Aquarium, Fireworks, a fidget Spinner with metal detent sounds, Snow, a spinning Globe, Horse, Fan, Wood (knock on it), Bouncing Ball, and more. 14 toys in total.
- Tools: an ASCII Camera that turns the live viewfinder into characters, Draw for inking on ASCII "paper", and Edit, which turns your photos into glyph art (including a cutout mode where the subject becomes characters).
- Themes × Effects: pick a palette (Phosphor Green, Amber CRT, Klein Blue, and others) and combine it with any stack of Metal effects: glow, bloom, HDR, and a full CRT look with scanlines and barrel warp.
- StandBy widget: an ASCII toy sits on your nightstand while your phone charges, and tapping it reseeds the scene.
Three toys are free. A one-time $4.99 lifetime unlock through RevenueCat opens everything else, with a single 24-hour free trial. There's no subscription.
How we built it
I built it solo in SwiftUI, pairing heavily with Claude Code. Every toy is drawn on a grid of monospaced characters, and a theme system can recolor any toy instantly. On top of that sit custom Metal shader effects: glow, bloom, HDR, and a full CRT look with scanlines and screen curvature. The toys use simple physics with haptics, like springy grass blades and flickering fire, so they react the way you'd expect real things to. RevenueCat handles the one-time lifetime unlock and the free trial.
Challenges we ran into
Performance was the hardest part. The busiest toys, like Touch Grass and Campfire, change color thousands of times in every frame, and my first renderer ran badly on real iPhones. I rebuilt how the characters get drawn so each color is painted in one batch, and now even the busiest scenes run smoothly.
Accomplishments that we're proud of
- How Touch Grass and Campfire feel. They're the toys people keep going back to. Getting the spring stiffness, damping, and haptics right took more work than any feature, and it's the part I'm happiest with.
- The theme and effects system. Any palette works with any effect stack. Amber CRT with bloom and scanlines on the Campfire looks like a program running on a 1983 monitor.
- Real users. It's live on the App Store with 1,200 downloads and $320 in revenue from a $4.99 one-time purchase.
- Shipping steadily from 1.0 to 1.2, with a new toy in almost every release.
What we learned
- Constraints breed creativity. When everything has to be a character in a grid, you can't reach for a gradient or an image. You have to choose the right slash. Nearly every good design decision in the app came from that limit.
- Feel matters more than features. A toy with good spring physics and a well-timed haptic beats five toys that sit there doing nothing. Now, before I add a toy, I ask whether it's instant, whether it feels organic, whether it always settles back, and whether it has no goal. If it fails one of those, it's a tool, not a toy.
What's next for ASCII TOYS
- More toys from a growing list: Pop-It, Pea Pod, Matrix Rain, Conway's Life, Mandelbrot.
- Apple TV version: ASCII campfires and aquariums on your TV, with the CRT effect on a real big screen.
Built With
- metal
- revenuecat
- swiftui
- xcode
Log in or sign up for Devpost to join the conversation.