Ping - a TagTimeLike for iOS!

Hi - long time lurker first time poster!

Last February I decided to use the TagTime algorithm to track my time. So… being a software engineer, I made my own tracker for iPhone, of course! There was some trickery involved with setting up notifications, etc, but once that was past it is truly the best place for such an app. From the iPhone you receive pings through the Watch, and since the recent macOS - on the Mac as well. (Entry is still limited to the iPhone, however, and there is no sync - all data is fully local.)

I use the standard TagTime schedule.

The data is stored in a local SQLite database; there is export and import, although I made up my own CSV format for that. In particular I’d love to know which format could also be used for the exports.

There are some reporting features already, and it’s something I would like to make more of in the future; looking for suggestions as well.

I also integrated with Apple Health to automatically tag sleep and workouts.

It’s a very stable beta (I’ve been using it full-time for 11 months). Here’s the TestFlight invite link, and I’m very interested in what you think

5 Likes

I just downloaded it and will test it this week!

I’m curious: what tech stack did you use besides the SQLite db? I’m also a dev, that’s why I’m asking.

1 Like

It’s hardly a stack. :slight_smile:

The app is in Swift + SwiftUI and uses GRDB for SQLite. GRDB includes live-updating views from SQL queries, so it’s all you need.

I started off using SwiftData - the first-party database for SwiftUI - but it has next to no support for aggregations - so most features required either hard up-front precalculation on write (number of pings per tag, first/last ping, etc) or lots and lots of iterating over objects.

With SQLite I can delegate much of the aggregation work to the database, and avoid instantiating so many objects - it was instantly better performing than SwiftData.

1 Like

Just found a bug: if you try to delete a tag that has pings associated with it, the app crashes. If you instead remove the tag from the pings and then delete it then it works correctly.

Thanks! Will fix in the next build.