Inspiration
My week is school, a timetable that changes every day, robotics lab, homework, and a bunch of small stuff I always mean to write down and never do. The problem was never that I didn't have an app for it. I had too many. By the time I opened the calendar, found the right day and typed it out, I'd already lost the thought.
What I actually wanted was to just say it. "Physics homework page 42, and the lab needs 10k resistors." One sentence, and it goes where it belongs.
What it does
Ridik is basically one mic button. You talk normally and it works out what you meant:
- "dentist Tuesday at 3" goes in your calendar
- "spent fifteen forty on lunch" gets logged under Food
- "I can't solder the board until the bearings arrive" links the two tasks, so the blocked one waits
- "homework for Math" lands the day before your next Math class, because it knows your timetable
- "find the wifi password" searches your notes
One sentence can do several things at once. After every request it shows you exactly what it changed, with an Undo button, because talking is fast and mishearing happens.
There's no account. Everything lives in one file on your phone, and before anything gets sent anywhere it tells you who receives it. If you say no, it still works offline for simple sentences.
How I built it
- Expo + React Native + TypeScript, so one codebase for iPhone and Android
- SQLite with Drizzle for all the data, stored locally on the phone
- Gemini to understand the sentence. The important decision was that the model never touches the database. It can only propose actions from a fixed list (checked with Zod), and my own code decides whether to actually do them.
- Speech to text on the phone where possible: Apple's new SpeechAnalyzer on iOS 26, and a local Whisper model (whisper.cpp) that re-reads what you said without uploading the recording
- Native widgets in Swift (WidgetKit) and Kotlin, with a mic button right on the home screen
- RevenueCat for subscriptions
Challenges
Honestly, most of the hard problems weren't the AI part.
- Speech recognition that's confidently wrong. The phone would return a transcript with half the words missing and still say it was sure. A fallback never kicks in if nothing technically failed. That's why I ended up adding a second engine that re-reads the same audio.
- A Samsung phone reporting every recording as an error. It delivered a perfect transcript and then threw a "client error" right after, so every sentence failed. It took a lot of logging to even see what was happening.
- Local Whisper was slow the first time. Loading the model cold took about 14 seconds, compared with about 1.6 once it was warm. So now it loads in the background when the app starts, not when you first press the mic.
- An SDK breaking notifications. A push notification library I had added quietly took over iOS notifications, so reminders stopped showing while the app was open. I removed it completely.
- Being sure the app doesn't guess. If you say "tick off Alex" and there are two Alexes, it has to ask you instead of picking one. A wrong guess silently changes your data, which is worse than asking.
What I learned
- A green build doesn't mean the app works. I had an Android build that logged everything fine and then crashed right after launch because of a wrong API key. Now I always look at the actual screen.
- For voice, showing the user what happened matters more than being clever. The undo receipt is the thing that makes it safe to talk without looking.
- Privacy is much easier to design in from day one than to add later.
What's next
Testing it with more people (especially on older Android phones), finishing Google Calendar sync against the real API, and getting it on the App Store and Google Play.
Built With
- android
- drizzle-orm
- expo.io
- gemini
- ios
- jest
- kotlin
- react-native
- reanimated
- revenuecat
- speechanalyzer
- sqlite
- swift
- swiftui
- tanstack-query
- typescript
- whisper.cpp
- widgetkit
- zod

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