ShakeMemo – Handsfree Todo List
Inspiration
Someone online was asking for yet another reminder app. The kind of request you see all the time. What stuck with me was not the ask itself but one specific problem: they wanted to turn off reminders on some devices and keep them on others. Same list, same account, but control over where it goes off.
I got it because I live in the same mess. JIRA at work, Google Tasks for personal stuff, ClickUp for side projects, Miro and a few other tools. One Gmail account on my phone, laptop, tablet, and wherever else I'm signed in. When a reminder hits, it hits everywhere. I've been on calls when every device in the room started pinging. I've been screen-sharing when a notification popped up for everyone to see. You add a reminder in one place and the whole stack screams at you. I wanted to fix that.
So I built ShakeMemo. Voice capture because it's fast: shake, speak, done. Sync so the same list is everywhere. And the part that really mattered to me: you choose which devices can alert you. Phone on, tablet off. Laptop quiet during meetings, phone still reminds you when you're away. One list, many devices, and you decide where the notifications go.
That's the back story. Not "another reminder app," but "reminders that respect which device you're on."
What it does
ShakeMemo is a handsfree todo and reminder app. Shake your phone to open the mic, speak your reminder in plain language, and it's saved. The app transcribes your voice, extracts title and due date (e.g. "call mom tomorrow at 3pm"), and syncs in real time across all your devices.
The part I cared about most: per-device notification control. You can disable alerts on your tablet or laptop but keep them on your phone. Reminders stay in sync everywhere; only the devices you allow will ring or show a push. It works offline and syncs when you're back online, and it integrates with Google Tasks so you can keep one task list across tools. Premium users get shared groups, tags, priority, and more.
How I built it
Mobile (iOS and Android): React Native with Expo. Shake is detected via expo-sensors (accelerometer); voice capture uses expo-av and @react-native-voice/voice. Audio is sent to my API for transcription and parsing. The UI is Expo Router with a minimal, high-contrast design and dark mode. I use Firebase Auth (Google and Apple sign-in), Firebase Realtime Database for real-time sync, and Firebase Cloud Messaging for push. Device registration and the "notifications enabled" flag are stored per device in Firebase and sent to the API so the backend knows which devices should receive notifications. Subscriptions are handled with RevenueCat.
Backend: Node.js and Express (TypeScript). I use Google Cloud Speech-to-Text for transcription, Google Cloud Translation for non-English input, and a mix of rule-based NLP and an LLM (OpenRouter) for extracting title, date, and time from natural language. Reminders and user data live in Firebase Realtime Database. The backend evaluates due times and sends push notifications only to devices that have notifications enabled, via FCM. I also added two-way sync with Google Tasks (googleapis), shared groups, and REST APIs for reminders, devices, and auth.
Infrastructure: Firebase (Auth, Realtime Database, Cloud Messaging), Google Cloud (Speech-to-Text, Translation, optional Natural Language), and a Node API (e.g. Vercel or any Node host).
Challenges I ran into
- Natural language parsing: Turning "tomorrow at 3" or "next Tuesday noon" into a correct timestamp across timezones and device locales was hard. I combined date-fns, compromise, and an LLM fallback with device timezone offset so relative times are interpreted in the user's local time.
- Per-device notifications: I had to model "devices" as first-class entities: each device registers with an FCM token and a
notificationsEnabledflag. The notification job had to filter to only those devices before sending, and the mobile app had to expose a clear way to turn alerts on or off per device. - Offline and sync: Letting users create and edit reminders offline, then merging cleanly when back online without overwriting or duplicating, required careful use of Firebase Realtime Database and local state.
- Voice on iOS and Android: Different behavior and permissions for microphone and voice libraries on each platform; I had to test and tune on both and keep the shake gesture reliable across devices.
Accomplishments that I'm proud of
- Shipping a cross-platform (iOS and Android) app that does something most reminder apps do not: real per-device notification control so you can mute alerts on your laptop during meetings but keep them on your phone.
- A single, clear interaction: shake, speak, done. No extra steps to capture a reminder.
- Real-time sync across devices with offline support and optional Google Tasks sync so power users can keep one list.
- A working backend pipeline: voice to text, language detection, translation, and structured reminder extraction (title, date, time) in one flow.
What I learned
- Modeling "devices" and "notifications enabled per device" is a small design choice in the schema but a big win for people who use multiple devices and tools (JIRA, Google Tasks, etc.) and get bombarded by alerts.
- Voice-first capture is fast, but getting dates and times right from natural language is still the hard part; combining rules and an LLM with timezone handling made a real difference.
- Users care a lot about where reminders ping. Giving them control per device reduced frustration more than I expected.
What's next for ShakeMemo – Handsfree Todo list
- Improve reminder extraction (recurrence, better handling of vague times like "later" or "tonight") and add optional calendar view.
- Expand shared groups (roles, assignees) and make collaboration a first-class use case.
- Keep refining per-device settings (e.g. quiet hours per device, or "only notify on primary device").
- Listen to feedback from people who, like me, live across many task tools and devices and want one place to capture reminders without notification overload.
Built With
- node.js
- react-native
- revenuecat

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