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

8 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.

2 Likes

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.

2 Likes

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.

Just started trying it on mac, could just set up through test flight :slight_smile: Will be primarily using it on my computer rather than phone, I understand currently there is no way to sync them? In any case, thanks for making this - already looks great!

Actually, does this work for apple watch yet? If I could answer pings there it might be the best place for it.

1 Like

Thanks! Glad that it works on the Mac for you. One nice thing about running it on the Mac is that the SQLite database is directly accessible - at least technically, and if you can find it in the ~/Library folder.

There is no sync and no watch app. I plan to add both in future versions, but for now I’ve decided to focus on shipping a nice app for one platform.

I agree the watch sounds best, and it was even my initial plan. However you can’t do a feature complete watch app - only input makes sense - so you still need an iphone app, and of course the iphone app also needs input functionality, so this is where we are now. :slight_smile:

2 Likes

Thanks for your answer! Completely agree - its more important in my view to have a stable limited scope app that works well and is reliable than many features none of which work great. Thanks again for your work on this, really appreciated. Will also be happy to pay for the app once its fully released :pray:

Wow, this looks incredible—thank you!

The main features I’d be excited to see are (ordered by descending interest):

  1. Automatic sync to Beeminder, similar to the old Android app. (This is the big thing preventing me from using it full time).
  2. Adjustable ping interval (I like to use 90 minutes).
  3. Bidirectional Mac / phone sync.
  4. More elaborate version of (2): I’d love to be able to create a schedule in which, for example, nights and weekends have an average interval of 2 hours, but workdays have an average interval of 45 minutes. (Any reports or syncs to Beeminder would then weight the ping using the average interval which was operative when the ping was generated.)
  5. Cloud backup of the ping log. Possibly this falls naturally out of (3).

(I’m very appreciative of whatever you decide to implement of course!)

And like jir13, I’m looking forward to paying for it, or donating if you decide to open source.

1 Like

Thank you for your feedback and your kind words!

  1. Could you give more details about the beeminder integration, or is there a doc somewhere? I do feel like a tagtime-based product must have integration with beeminder. :slight_smile:
  2. is planned for a future release,
  3. is also planned;
  4. would the math actually work this way? i mean i see how every ping has its weight but to me - without a strong statistical background - it seems too simple to be correct?
  5. as the export is already there, it would be fairly easy to throw a daily backup to icloud docs, i’ll add that to the backlog
2 Likes

Nice, great to hear about the roadmap!

My memory of the old android app is that for any of your beeminder goals, you could define a set of “activating” tags. And then, if a ping was tagged with at least one such tag, a datapoint would be added to the beeminder goal. The datapoint’s value would be your current interval, and the text would be a list of tags.

When it came to sync behavior, you could delete an entry in beeminder without it affecting tagtime; but if you later removed the all the activating tags from a ping, that datapoint would get deleted from beeminder. (Which was helpful in cases where you mistakenly tagged a ping.)

One last detail: in the list-of-pings view, if a ping did happen to activate any of your goals, there’d be a little bee icon on the ping, which was red if a sync hadn’t happened yet, or had failed to sync, and yellow once the datapoint had been added to beeminder.

Re (4), I’m happy to be corrected by someone (@dreev?), but I think it actually is that simple, yeah. At any particular instant, your current estimate of the total time spent is an unbiased one. Which means that you can switch to a different interval at that instant with no introduction of bias, as long as your records / calculations use the new interval for any new pings.

2 Likes