Hi, I'm the developer of Kanji Time.
It started as a side project to learn SwiftUI and watchOS development. I released it first as a standalone watchOS app with a 25MB CoreData DB to work offline, native animations, over 10000 words and support for complications which helps to repeat kanji and words by looking at your watch throughout the day.
Now with iOS 14 and widgets I developed the idea further.
I was curious to evaluate a single code base for watchOS, iOS and macOS. With the constraints I had, SwiftUI (with Catalyst for the Mac) was the obvious choice. It was my goal to keep it as simple as possible, which means there is no upfront registration or account creation as of now. Your private CloudKit store is used to share the progress between devices (about 1-5MB usage). And it’s still completely offline capable, caches the progress and merges changes.
>Why learn on a watch?
Of course it’s supplemental and for short repetition bursts, but I think a watch has less distractions compared to a phone when on the go.
Coming from the watch with support for Complications (ClockKit) I could reuse most of my code to setup WidgetKit on iPhone, iPad and Mac. In my opinion (as of now at least) it is the main differentiator between alternative apps and can be used just on its own to be exposed to new words and kanji.
I have a love-hate relationship with SwiftUI. There are strange quirks for customisation of UIKit components like UITabBar, alerts, modal views. But for interactive animations (e.g. swipeable Card Stack in the app) it is amazing.
The kanji stroke animations btw. are also completely native, and drawn with CoreGraphics path animations on all platforms.
>CoreData backed by CloudKit:
When used as designed and (more or less) documented it works without a lot of custom code you have to write.
Well when I tried to sync the 25MB DB it resulted in a 500MB (!) representation in CloudKit.
So what I decided to do is to have two stores, one is the local (25MB) and the other is for CloudKit to store progress data, dates for repetition and dictionary entry ids to sync with the local store. (Through fetched properties) Now syncing is very fast and lightweight (1-5MB). But it means that I have to write merge logic when learning on different devices in offline mode, or at the same time on my own, well…
Oh, and you can test all features for free, the IAP is only for more advanced words and levels.
Really curious about your feedback!
I am happy to go into more detail in the comments!