Mural teaches through live speech, not a fixed course
Mural starts a voice conversation in the language you want to practise, shows optional meaning subtitles, lets you type when speaking is inconvenient, and saves useful words for later sessions. Its 11 language modules carry their own teaching guidance and regional choices. The app also has 24 conversation themes, word lookup, corrections, recall bars, and separate progress for every learning language.
This is a native app on both platforms, not a responsive website wrapped for mobile. The iPhone client uses SwiftUI and requires iOS 26.1 or later. Android uses Jetpack Compose and supports Android 8.0 onward. Active voice can continue when the screen locks, subject to each platform's audio behavior and Mural's silence and duration limits.
Learning records stay local while conversation data goes to OpenAI
Transcripts, saved words, preferences, and learning observations live on the device. There is no Mural cloud sync, advertising, or analytics SDK. You can export a JSON backup, move it between iPhone and Android, or delete conversation and learning data. The OpenAI key stays in Keychain or Android Keystore and is excluded from that backup.
Live practice still sends audio, selected text, learning context, and requested searches to OpenAI. Mural says it requests store: false where supported, while correctly warning that this does not remove every provider retention path. Its 30 MB backup import limit applies on Android, and automatic cross-device sync does not exist. Local storage reduces Mural's data role; it does not make an internet conversation local.
What happened when we ran it
Our sandbox tested commit c5f9e97 in the services/api subproject, not the Swift or Kotlin apps. Npm installed 125 packages in 14 seconds and occupied 91 MB. The TypeScript build passed in 6 seconds. Node's test runner passed all 119 tests in 32 seconds, with 0 failures.
Npm audit reported 2 known vulnerabilities, both moderate, with 0 critical and 0 high findings. The full checkout contained 737 files, about 46,142 lines of source, and 49.9 MB. We found 4 CI workflow files, a Dockerfile, a Compose file, and a tests directory. Those are backend and repository signals, not a claim that we compiled either native client.
Personal installation requires native tools and paid API access
An iPhone build needs a Mac, Xcode 26 or later, an Apple Account, a signing team, Developer Mode, and a device on iOS 26.1 or later. A free personal provisioning profile expires after 7 days, so you must refresh it through Xcode without changing the app identity. There is no public TestFlight or App Store listing.
Android installation needs Java 17, SDK Platform 36, Build Tools 35.0.0, and either ADB or manual APK installation. Both clients need an OpenAI project with billing and access to the configured models. A ChatGPT subscription is separate. Mural's timer and recorded cost display are estimates, not spending caps, so the OpenAI project still needs its own usage limits.
Recall bars describe evidence, not learning effectiveness
Mural derives vocabulary and provisional ability observations from replies that pass its validation rules. A word can gain 1 to 3 recall bars as it is retrieved over time and in different contexts. The README says these bars are heuristics, not calibrated forgetting probabilities, proficiency certificates, or proof that a teaching method works. That restraint is appropriate for an app making inferences from AI-mediated conversations.
The project also says Mandarin pinyin comes from system dictionary readings and still needs listening checks for names, ambiguous words, and connected speech. Open issue 138 proposes flashcards but leaves decisions about selection and scoring unresolved. Open issue 20 asks for on-device models and offline conversation. Neither aspiration should be described as a shipped feature.
The backend is a foundation, not a public paid service
The Node service contains accounts, a time ledger, guest transfers, sandbox Stripe flows, and an allowlisted voice experiment. Hosted free conversations and minute purchases are disabled. Live Stripe secrets are rejected, hosted voice defaults off, and the runbook lists provider hangup testing, attestation, refunds, taxes, reconciliation, and spending protection as work required before activation.
GitHub showed 1,563 stars, 29 combined open issues and pull requests, and a last push on October 3, 2026. Recent issue 139, about keeping voice active through screen locks, was closed after implementation work. That pace and the 119 passing backend tests are encouraging. The practical product remains a personal source build with your own API key, and the 2 moderate audit findings still need review before any backend deployment.

