Inspiration
Zimo started with one member of the team, a Chinese beginner who moved to China as an exchange student. He couldn't read a menu, a metro sign, or a text from his landlord, and he needed to catch up on characters fast for everyday life. Having prior knowledge on how to learn those characters , i.e. Japanese proficiency, he developed a concept for efficiently learning Chinese characters.
Spoken phrases and a little pinyin only get you so far when daily life in China is written in characters. We wanted to build the missing bridge for anyone, whether you're starting from zero or already know some pinyin and characters.
What it does
Zimo is a Chinese character learning app for beginners at any starting point.
- See how Zimo teaches. A short walkthrough shows how each character comes as a complete package — shape, sound, and meaning — and how pinyin and spaced repetition work together.
- Start where you are. A one-time skip token lets you jump straight to the level that matches your real level, and any characters you skip can be added back into your review loop, so nothing you skipped gets forgotten.
- Learn in short levels. Each level is a set of interactive cards showing the character, its pinyin with audio, its meaning, and its type, so shape, sound, and meaning are learned together.
- Track your review, stage by stage. A two-stage progress bar shows exactly where each character stands in your review cycle, so structured review is never a guessing game.
- Keep unlocking mascots. Every level hides its own mascot in silhouette until you clear it. More are always waiting up ahead.
How we built it
Team: Zimo is built by a cross-national team that sees the problem from both sides: a Chinese beginner who lives the frustration, and a native Chinese speaker who knows how these characters are actually used in daily life.
UX/UI Design: We started with user research and personas, not assumptions. A mood board set the visual direction before we drew any screens, and design and testing ran in loops so each round of feedback fed the next iteration. A lot of that iteration went into keeping learners motivated, especially how the app responds when someone gets an answer wrong. On the visual side, we designed a mascot, illustrations for each level, and small mascot animations that show up throughout the app to keep things engaging.
Technology: Zimo is one TypeScript codebase for iOS and Android, built with React Native and Expo (Expo Router, NativeWind, React Compiler) and shipped through EAS. Supabase handles sign-in (email, Apple and Google) and stores the pronunciation audio. The app downloads each card's audio ahead of time and keeps it on the device, so sounds play instantly. Everything else runs on our own Next.js + Prisma API on Vercel. That covers the spaced-repetition scheduler, which tracks reviews, the level logic, and the push reminders, which arrive at whatever time each user picks. Review progress is saved on the device as you go, so an interrupted session picks up where it left off. Subscriptions run on RevenueCat, with a single premium entitlement covering the monthly, annual and lifetime plans. We designed the paywall in Figma and exported it straight into RevenueCat. Access is enforced on the server: a RevenueCat webhook writes the entitlement to the user's record, so the app itself never decides what a user can unlock.
Challenges we ran into
- Fully remote, across countries and languages. We're all in the same time zone but in different cities, so everything happened online, across different nationalities and languages, and entirely outside our day jobs.
- Content is a big part of the build. Every level needs its own characters, example words, audio, and illustrations. In a language app, the content is as much work as the code.
- Two kinds of learners, one path. Complete beginners and learners with some pinyin don't start in the same place, but we wanted one level structure that works for both.
- Getting the paywall and RevenueCat to agree. Small mismatches between how we named things in the design and how offerings were set up in RevenueCat kept breaking the connection, and we had to sort that out before anything worked.
- Designing for motivation, not just correctness. A language app lives or dies on whether people come back. We spent real time on how characters enter the review loop, and how wrong answers are handled so people keep going instead of giving up.
Accomplishments that we're proud of
- A complete learning loop, from a first character to timed review, that works for beginners at any starting point.
- A mascot illustration for every level, each designed to match that level's content and earn genuine excitement when it's unlocked.
- 20 levels, covering 704 characters and words.
- Live on both the App Store and Google Play.
What we learned
A learner and a native speaker see different things. The learner tells you what actually blocks people, and the native speaker knows how the language is really used. Having both perspectives helped us shape content that actually works for a beginner.
In a language app, content is the product. We underestimated how much of the work would be characters, examples, and illustrations. Next time, we'd plan the content pipeline first.
Payments belong in the design conversation early. Decisions about pricing and offerings shaped the paywall design more than we expected.
What's next for Zimo Chinese
- Add more levels and characters
- Let users invite friends to grow together
- Develop a Zimo community where learners can connect and support each other
Built With
- android
- eas
- expo-push-notifications
- expo-router
- expo.io
- google-sign-in
- ios
- nativewind
- next.js
- pg-cron
- postgresql
- prisma
- react
- react-native
- react-native-gesture-handler
- react-native-reanimated
- revenuecat
- revenuecat-paywalls
- sign-in-with-apple
- supabase
- supabase-auth
- supabase-storage
- tailwind-css
- typescript
- vercel


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