Inspiration
A close friend's family was overwhelmed by pickups and drop-offs across several after-school programs, with the times written down in different places. I built them a one-off web calendar and handed it over. The one question that came back was, "Can it send notifications?" The web version couldn't.
That question is why ShuMag is an app. I rebuilt the idea for iPhone with reminders built in, and turned a single-family tool into something any family can set up.
What it does
ShuMag is a Sunday-to-Saturday weekly board where you place magnets.
A magnet is not just a colored block. Each place magnet already holds the place, the child who goes there, how long it takes, who handles drop-off and pickup, and the reminder settings. Drop it on the board and the whole regular plan comes with it. You only choose the day and the start time.
- Regular plans repeat automatically every week
- After-school care, lessons, and cram school all fit on one board
- Share the board in real time by sending a 6-digit invite code (view-only or editor)
- Reminders before a plan starts or ends, with your memo attached
- Edit offline; changes sync when you're back online
- Home Screen and Lock Screen widgets show the next plan and who's on pickup (iOS 17+)
- Attach photos of school handouts to a magnet (paid plans)
Colors carry meaning: the magnet color identifies the place, the pickup icon color identifies the person, and the white icon identifies the child.
Only the board owner pays. Invited family members use the owner's plan for free.
- Free: 1 child, 2 place magnets, 3 custom magnets
- Standard (monthly or yearly, 1-month free trial for all new subscribers): unlimited, photo attachments, 13 months of history
- Family: everything in Standard, shared with up to 10 people
- Standard Lifetime: a one-time purchase
How we built it
- Expo + React Native (TypeScript), state in Zustand
- Supabase for auth, Postgres, Realtime sync, and Edge Functions. Sign-in is anonymous, so there is no account to create
- RevenueCat for all purchases. Prices come only from RevenueCat Offerings. Entitlements merge the database and RevenueCat and take the stronger one. Lifetime owners get a Family upgrade offer in a separate subscription group
- Local notifications with expo-notifications, scheduled in order and repaired by reconciling against the board
- Widgets in Swift/WidgetKit. Each device registers a hashed token, and row-level security scopes the widget's reads to that family. We tested the policies with a scripted set of attack cases before shipping
- Built and submitted with EAS from Windows, without a Mac
Challenges we ran into
- App Review took three rounds before 1.0 was approved
- After launch we found that local notifications kept firing on a device that had left a board, for up to two weeks. Fixed in 1.0.1
- While building widgets, we found they could show stale pickup assignments until the app was opened. The shipped widgets read the server themselves with a per-device token
Accomplishments that we're proud of
- 1.0 on August 31, then 1.0.1, 1.1.0, and 2.0.0 by September 13
- Built, submitted, and updated entirely from Windows with EAS, without a Mac
What we learned
- The words I used to describe the problem weren't the words people searched for. In our Apple Search Ads tests, keywords naming the problem itself got no impressions, while a broad category keyword brought in almost all installs. People search for the tool they want, not the name of their problem
- Adding App Preview videos barely changed the tap-through rate, but the install rate from the product page went from 9.7% to 15% (small sample)
- Explaining features on social media doesn't reach people who haven't found you yet. Getting found comes first
What's next
- Show/hide custom magnets in the palette, repeats on specific dates, and day memos
- Keep shipping updates. On the 2.0.0 release day, product page views spiked well above our usual level
Categories
Grand Prize, RevenueCat Peace Prize, RevenueCat Design Award
Built With
- eas
- expo.io
- postgresql
- posthog
- react-native
- revenuecat
- supabase
- swift
- typescript
- widgetkit
- zustand
Log in or sign up for Devpost to join the conversation.