universal ping schedule and custom midnight


am I correct in thinking that the universal ping schedule ALWAYS uses 45 mins? and that if you change the TagTime config away from this value, you will no longer be on the universal ping schedule?

related question: why 45 mins? I sometimes find that there are gaps of like 3-5 hours, which is extremely scary given that I am usually skating my road. I sorta feel that more frequent pings (while a bit more annoying) would make it safer for me

perhaps it would be even possible to switch the ping schedule up to like 15 mins if it’s approaching midnight and I need a ping for defs. what do you think? would this work? is it cheating? it doesn’t feel like cheating, because you’re not gaming the system you’re just increasing the sampling frequency to make sure you sneak in before midnight

which brings me on to a related topic: all my custom midnights are set to 5am. ideally, I could keep working until 5am to get a ping on a TagTime goal. but from observation, it seems that TagTime does not work with custom midnight. is there any way around this?

Mixed TagTime + manual timer strategies

Hi Noah!

TagTime is too scary for me to tie my Beeminder goals to. It’s great for tracking how I spend my time, though.

If the ping interval were any less than 45 minutes, I’d be driven mad by the frequency of pings when they come close together. I find that bad enough now!

@byorgey had an idea about using both TagTime and a manual timer in ways that didn’t invalidate the time spent, and which make eep! days less scary.

I’m not sure whether in Brent’s scenario he uses TagTime to update his Beeminder goals directly, because I would expect it might get confused by the presence of manual entries.

Yes, the universal schedule is determined by the 45 minute average interval and by the default random seed. Change either of those, and the world changes.

I’m pretty sure that wouldn’t work. The whole setup assumes that the interval and seed have never changed, for the whole history of that tagtime log file and your related Beeminder goals.

If you ever decide to change the ping interval, I think you also need to start a new log file and new Beeminder goals. @dreev would know better than me.

Not sure whether to encourage this, but…

I think that TagTime is fine with you changing the deadline, but you need to tell the TagTime script, because that’s where the ‘what day is it?’ calculation happens.

By default, it seems to use midnight in your computer’s timezone. Every time you change timezone, it recalculates what day all the historical pings were on, and updates your Beeminder goals accordingly. I discovered this on business trips to continental Europe and North America.

So now, I force my TagTime to be always on London time, which is also my Beeminder timezone, by adding this line near the top of settings.pl

$ENV{TZ} = 'Europe/London';

Presumably, if you set this to be a timezone in which their midnight is your 5am local, it’ll do what you want. (There’s a finite number of TZ strings that will work; I use 'Europe/Paris' when I’m on the continent.)

Changing this will also recalculate everything and update your Beeminder goals. If that causes a spurious derailment, shout and obviously we’ll undo that for you.


As I explain later in that thread:

What I do is that for each tag foo that I might sometimes track manually, I have another tag called foo-m which I use when I get pinged while a manual timer is running. Of course it is only set up to send a data point to Beeminder for foo, not for foo-m. But when analyzing the data I can strip out the -m suffixes if I want to know how much I did that activity in total.


@byorgey, I understand how you can prevent pings-while-on-manual from being counted by using a different (but cunningly related) tag.

Are you able to add manual datapoints to a tagtime-fuelled goal without having TagTime freak out at finding unexpected entries at the next sync? Or is there an extra step that makes this work?


Thanks, @philip. I’ve updated Beeminder to use Atlantic Standard Time (UTC -4, which for me in Germany is 5am) and updated my .tagtimerc with America/Puerto_Rico which according to a bit of research uses AST all year round. So things should stay in sync. (I’m also going to switch all my goals to “regular midnight” settings.)


@byorgey, to reiterate what @philip asked: what do you do with your manual timer data? Say you’ve completed one 45 min timer. Where do you record that? As far as I understand it, if you enter it manually into the Beeminder goal, the next TagTime ping will wipe the data. Do you manually fake a ping in the TagTime log? I can’t think of any other way to get this to play nice with the Beeminder integration…


This was a bad idea, it turns out. I’ve set this to my timezone so the Beeminder graphs actually display the right deadline. (Also, I realise now this would’ve confused all my other non-TagTime goals.) But I’ve left my TagTime with America/Puerto_Rico.


I agree, changing your Beeminder timezone to be something other than where you live (or where you currently are) is madness.

Above, I’d meant to suggest only changing the TagTime timezone if you really want it to have a different idea of when midnight falls.

Apologies if I was confusing, but I think that’s where you’ve ended up, so that’s good.

And of course, there’s confusion ahead, because Europe and North America change to and from ‘summer time’ on different dates. Choosing a stable timezone like Puerto Rico might be a stroke of brilliance.


Cool, thanks. I actually think I might reverse this and go back to regular midnight as a deadline. But only if I can figure out how to get this manual timer stuff working correctly.

Here’s the only proposal I can come up with that appears to work with both TagTime and a TagTime powered Beeminder goal:

  1. Set the timer for a 45 min period and focus on one task.
  2. If you lose focus, ala the pomodoro technique, then the 45 mins is voided.
  3. REGARDLESS of whether or not the 45 mins was voided or not, all pings during that time are marked as “ignored” or literally deleted from the log file (or conversely, never recorded in the first place, because, perhaps, you disabled the TagTime daemon).
  4. At the end of that period, as long as it wasn’t voided, create a log entry in the TagTime log with the tag “fake” and whatever else it was you were working on.

I believe this works?

The only issue here I see is that 45 mins is a long stretch for focus (especially for people with ADHD, like me). It would be nice to set the timer to any custom range. But then I don’t know how to record that by faking the TagTime log.

I am wondering if @byorgey has a way to record this data that doesn’t involve faking logs. Because that would side-step this issue.


I kind of expect that his goals are mostly updated by his timer programme, and then if he’s pinged when not timing, he manually adds 45 minutes to the relevant goal.

That approach wouldn’t need any fake log entries, and wouldn’t need to set a 45 minute timer — Brent’s algorithm works for any manually timed period, doesn’t even need to be chosen in advance.

Having said that, I also expect that he’s somehow automated the TagTime side of things, or he wouldn’t need to distinguish pings that arrive while ‘on manual’ by using different tags for them.

Doubly curious now.


I do not fake my tagtime logs. When I use a manual timer I just submit the time value directly to the beeminder goal. When I record a tagtime ping, tagtime sends a value to the beeminder goal. So the beeminder goal is getting data from two different sources. This does not confuse tagtime at all since as far as I know it doesn’t care about what values are recorded for a given beeminder goal. (Unless the desktop version does? I don’t know, I exclusively use tagtime for android.)

Does that answer your questions? To be honest I am a little confused about what you are confused about.


from the TagTime GitHub README:

WARNING: If you point TagTime at an existing Beeminder goal, TagTime will DELETE ALL YOUR DATA.

also this:

WARNING: TagTime will replace all existing data for the goal to make it match your TagTime log. In other words, your TagTime log is the master copy and TagTime will keep Beeminder in sync with it, including deleting data that’s not found in your TagTime log.

perhaps @dreev can weigh in at this point? I’m guessing this is a discrepancy in behaviour between the Android client and the desktop version (unless I am misunderstanding these two warnings, I suppose I should test it!)


update: I’ve switched my TagTime TZ back. the weirdness is too confusing. even more reason for me to figure out how to get this manual timer thing to work!

reminds me also: it’s not always about me wanting to squeeze in a ping before midnight. sometimes a friend will invite me to do something with them on the spot and it always feels kinda shitty saying “I am busy and I don’t know how long it will take” if I know I need to clock a bit more time on a few goals before I can pack up for the day

I mean this is an issue I get because I’m always skating my roads. but then, that behaviour why I’m using Beeminder in the first place, right? :wink:


Aha! I see. Yes, that would seem to be a big difference between the desktop and Android versions of TagTime.


There’s the key to our confusion!

I’m also using the desktop version, and it believes that its log file is ‘the truth’.


Sorry I’m late on this thread! I might need a recap of questions still outstanding. Let me start by quoting @bee from a support email thread with @nslater:

It used to be the case that [desktop] TagTime did not know about beeminder
deadlines, and thus would enter data according to the calendar day.
Now it pays attention to deadlines with no need to adjust the computer
timezone or change settings in tagtime. Switching the Beeminder
deadline is enough for TagTime to pick it up and then adjust your
tagtime data. It’s the tagtime data shift that can and often does
cause derails after switching the beeminder deadline. Since it goes
through deleteing and re-adding datapoints through the entire history
of the goal. But that’s OK/our fault. We can fix things up again after
the fact.

Correct that desktop TagTime and Android are very different. Android TagTime just feeds data to a Beeminder goal. Desktop TagTime treats its own TagTime log as ground truth and forces the Beeminder goal to match it.

And I highly recommend not messing with timezones! :slight_smile:


thanks @dreev, @Bethany_M_Soule explained this to me in an email also!

any tips on how I should do the manual timer stuff with the desktop TagTime? the only way I can think of that plays well with the system is to always do a timer of exactly 45 minutes, and then add “fake” TagTime pings for each timer (following all the rules as stipulated to make sure that you’re not actually breaking the integrity of the statistical model)


Good question. It’s messy enough that I’ve just made it a strict personal rule to never mix manual timing with TagTime. If I have a beemergency on a TagTime goal I just keep an eye on tminder.tagti.me so I can start making sure to get very focused when the probability of success drops below 99.9% so I don’t miss any pings. It’s nerve-racking but beautifully effective in inducing focus!

Or a super conservative rule of thumb is that you should count on 4-6 hours of work per emergency ping you need. Of course on average it will only take 45 minutes but if you set aside 4 hours you can be pretty sure you’ll get it and at 6 hours you can treat it effectively as a guarantee.

(That’s 99.5% and 99.97% respectively – those probabilities may seem high but remember that you’re probably going to be taking such a gamble repeatedly so if you just went with, say, 95% then it would probably catch up with you by the 20th time. Maybe that’s fine if it’s a $5 pledge though. Of course these slopes can be slippery…)


Good to know. I’m doubtless using a ridiculously old version on account of having hacked mine to support multiple log files and (probably) rendered it unupgradable.