Act Natural is a daily practice app for actors: a gym, not a school.
It's for actors between jobs, students outside the big drama schools, and anyone who trains alone.
Inspiration
One of my friends wants to be an actor, and a few others are studying directing at the New York Film Academy in Los Angeles. Through them I heard about the struggles actors have, and how they actually train.
"Acting is not something you learn alone. It requires listening, physical awareness, and the ability to respond in the moment."
In forums and reviews, that's the most common thing actors say about practising alone. They're right, and that's exactly the problem. Actors train hard for two or three years, then train alone for most of a career. The one thing everyone agrees you cannot do by yourself is the thing you'll spend your working life doing by yourself.
I don't act, so before building anything I studied the market properly: the competitors, their App Store reviews, and the forums where their users talk about them. Every claim here came out of that.
The category had settled on line memorisation. Rehearsal Pro ($19.99, 1.2M scripts rehearsed), coldRead ($6.99 to $10.99/mo), Acting Pal (42 AI voices). All three help you learn lines. None of them teaches technique.
The reviews set the price. coldRead's users complain about two things: "costs more than streaming services," and an eight-line free limit. So $2.99/month buys only the two features that cost money to run, and everything else is free and offline.
What it does
- 79 exercises across nine crafts: timed, step by step, read aloud, hands free
- 53 monologues and 18 scenes in full: public domain, complete texts, not summaries
- Scene partner: pick your part, and the app reads the other one aloud
- Cue mode: listens for the end of your line and moves the scene on
- Script workspace: import by PDF, photo or paste; highlight your lines, mark beats, and build the character on worksheets
- Streaks, a practice calendar, hours by craft, recordings: the work, counted
- Act Natural Pro, $2.99/month: two AI generators, one for cold-read scenes you've never seen and one for characters to improvise from. These are the only paid features.
No account. Nothing leaves the device. Works offline.
Entered for:
- RevenueCat Design Award: open any exercise and the screen goes dark for the session, and each of the nine crafts keeps its colour from the tile to the timer. Type follows the content: serif for the text you perform, Geologica for everything the app says, mono for numbers and labels.
- HAMM Award: everything free to run is free; $2.99/month unlocks only the two AI generators, through RevenueCat.
- RevenueCat Peace Prize: the training itself is free, offline and account-free, for actors who can't pay for classes between jobs.
How I built it
SwiftUI, iOS 17+, SwiftData, RevenueCat, and a Cloudflare Worker fronting Claude. 115 Swift files, about 22,600 lines, 98 tests, 170 commits.
The plan called for three paid AI vendors: ElevenLabs for the scene partner, a second TTS for guided exercises, an LLM for the generators. What shipped uses on-device AVSpeechSynthesizer and SFSpeechRecognizer, and only two features touch a network model at all. That's why it works on a plane, needs no account, and costs nothing to run for a free user.
RevenueCat is wired entitlement-first. Every gate asks whether the "pro" entitlement is active; no code names a product identifier. What's for sale is decided in the dashboard, so pricing and packaging can change without an app update.
The RevenueCat side was set up through RevenueCat's MCP server, from inside Claude Code: the project, the pro entitlement, the product and the current offering. The same connection reads the charts, which is how the numbers in this submission were checked.
The app never names an AI model. The Worker chooses the model and builds the prompts, so switching models is a server deploy that reaches every install at once, with no App Store update.
Challenges I ran into
The AI features were dead on arrival. They read an Anthropic key from the Keychain, and the only way one got there was the user typing it in. Every real user got "No API key configured." A Worker holds the key now, rate limits by IP, and builds the prompts server-side.
Public-domain text turns out to be un-generatable. Reproducing verbatim Shakespeare returns 400 Output blocked by content filtering policy, because the filter can't tell a 400-year-old play from a screenplay. So the pipeline fetches the Gutenberg source over the shell and writes the Swift file straight to disk, which also guarantees every text is verbatim.
A green build hides almost everything. A seven-day week rendered as five columns, because ForEach(["M","T","W","T","F","S","S"]) keyed on the strings themselves collapses the duplicates. Delete silently vanished from seven screens when they left List. And cards sat on a ground at 1.09:1 contrast; a test now asserts at least 1.15:1.
Accomplishments that I'm proud of
The library is the part nobody clones in a weekend. The exercises were written against how Juilliard, Yale and RADA actually sequence three years of training, and every monologue and scene is reproduced in full, verbatim from a public-domain source, with tests pinning the counts and the integrity of every text.
A design system strict enough to break the build. Every colour and font resolves through one module behind a CI guard that must report zero, so changing the app's entire typeface was a rewrite of one file rather than a sweep of 333 call sites. The bundled face was picked by reading cmap tables across eighteen candidates for Kazakh coverage. Eight failed, including three that get recommended for exactly this brief.
Private by default. No account, nothing you write or record leaves the device, and RevenueCat is the only third-party SDK in the app.
What I learned
Two RevenueCat dashboard facts empty a paywall with no error anywhere in code: the entitlement identifier must match exactly, and an offering must be marked current. A valid API key with no current offering is indistinguishable from a broken integration.
I broke every guard on purpose. Each check in this project was verified by introducing a violation and watching it fail before it was trusted.
What's next for Act Natural: Actor Training
Kazakh and Russian localisation (typography groundwork done and tested), a yearly tier, and a scene partner that answers the moment you finish your line: today the partner reads the other part and cue mode listens for yours, and joining them is the next release. After that, a self-tape studio and feedback on recordings, the one thing an actor practising alone genuinely cannot get. On the technical side, a small remote config: the AI model, feature flags, and an in-app notice for things like an AI outage or a required update, all changeable without a release.
Built With
- claude
- cloudflare
- figma
- ios
- photoshop
- revenuecat
- swift
- swiftui
- xcode

Log in or sign up for Devpost to join the conversation.