Inspiration
The inspiration came from playing with tamagotchis when I was younger, so I decided to create my own with evolutions mixed in based on how you treat it.
A widget is the screen you actually look at. An app you open twice a day is a worse home for a pet than a square you glance at forty times. So the pet went in the widget, and feeding it never needs the app opened at all.
What it does
A Cadgling lives on your home screen. You feed it straight from the widget. Petting and treats happen in the app.
Five traits drift with how you actually interact with your cadgling, and at the last stage the strongest of chaos, clinginess and sass sets in for good. Two people who both fed it every day still end up with different cadglings.
Care is free forever. Three feeds a day cost nothing, petting costs nothing, and a treat costs one Snack you earn by turning up. Cadge+ adds every launch outfit and doubles bonding.
Play with it. Tap it, tickle it, cuddle it, drag it around, or flick it to make it hop. Three mini games: Snack Catch, Peek and Echo.
One Kotlin brain. The pet's rules, schedule and Cadge+ unlocks live in one Kotlin Multiplatform module built for Android and iOS. Both native apps (Compose, SwiftUI) and both widgets (Glance, WidgetKit) call the same resolve function. 131 test vectors from a written spec pin it down.
Push that waits to be asked. OneSignal stays off until you tap "Let it text you?". Then it gets four tags (bond level, dominant trait, subscriber, platform), never the pet's name. Segments are set up, and the first campaign said "no no, take your time." The pet's own reminders are scheduled on the device.
Rooms that move, an icon that follows. Six painted rooms with stars, fireflies, rain and confetti, still if your phone asks for less motion. The app icon follows the pet's growth and mood, and becomes an empty nest when it goes out. On by default on Android, a switch on iPhone.
Revenue that stays out of care. Three streams: Cadge+ (monthly, or yearly with a 3 day free trial), Founder (one payment, never lapses, adds a crown Cadge+ never gets) and the rewarded ad below. On Google Play, first run ends on the offer.
One ad, and you tap for it. The only ad is a rewarded one on the pet's TV. It loads when you open that screen and plays when you tap "Watch telly together". Four a day, never in the widget. AdMob serves it, and on Google Play RevenueCat Ads tracks it and it asks for G rated ads only.
Kind on purpose. Bond only goes up, and a pet that goes out is there when you come back. Care is free and there is no account.
How we built it
Kotlin Multiplatform. The pet's simulation lives in one shared module, so the Compose app on Android, the SwiftUI app on iOS and the home screen widget all read the same state instead of three copies drifting apart.
RevenueCat carries Cadge+ and the Founder purchase. OneSignal handles opt in, tags, segments and campaigns, and the pet's own reminders are scheduled on the device. AdMob serves one rewarded ad on the TV screen, and nowhere else.
Challenges we ran into
The pet keeps ageing while nothing is running. That forced the simulation to run on time rather than on events: any surface can ask "what is true right now" and get the same answer, whether it last ran a second ago or a week ago. It was also difficult to keep the two apps in sync without anything drifting. The rules live once in the shared module, and the same 131 test vectors check it on the JVM and, through the real framework, from the iPhone app's tests.
Accomplishments that we're proud of
The widget is not a shortcut into the app. Feeding completes on the home screen without opening the app. I am very proud of creating these cadges each with their own look and behaviour.
What we learned
A pet that only changes when you are watching is not alive. Making the simulation answer "what is true right now" from a timestamp, rather than from a queue of events, is what let the same pet exist truthfully in three places at once. This was a great learning experience using Kotlin and the new tools added from exposure to my first Shipaton
What's next for Cadge
More launch outfits, and a second Cadgling so the traits have something to react to. Also focus mode so your cadgling can help you stay focused when you need to.
Log in or sign up for Devpost to join the conversation.