Inspired by @dreev I also went for a three-letter-based system. One argument in favor of it is having small buttons in the app all with a fixed size.
Generally I mix english and german tags, take the first letter of the word and then the starting letter of subsequent syllables or the last letter of the word:
an incomplete list:
ank -> Anki
azt (german Arzt) -> doctor’s appointment
bad (german Bad) -> Bathroom
bhn (german Bahn) -> train
bsp (german Besprechung) -> meeting
buy -> shopping
bwt -> body weight training
cde -> coding
cok -> cook
esn (german essen) -> eat
fml -> family (spending actively time with them)
hlp -> helping others
lrn -> learn
lsn (german lesen) -> reading
rtn -> routines (like getting dressed etc)
slp -> sleep
spt -> sport
wrk -> work (really work I have a different tag for spending time at the work place)
I probably should review them from time to time and remove tags which are used to little to provide significant insights.
I try to keep a predefined set of tags and not to introduce new tags on the fly. I never use the keyboard to type in the tags in the app but use the buttons to prevent typos and also force myself to use the predefined ones. On the desktop I use https://github.com/mykter/TagTime-desktop which provides autocompletion.
Additionally after merging the tags from the different devices I check all tags for typos and consistency using an automated script. Additionally I set simple rules (also provided with the original per TagTime implementation) like “body weight training is a kind of sport, so bwt -> spt” or “anki means learning, so ank -> lrn”.
When I do nothing in particular or nothing that I think it should be worth to track ( e.g. because it is just temporary and will not generate enough tags to provide enough evidence) I often provide no tag at all since it does not affect all the other time measurements.
If I have the impression I cannot tag a certain action on which I spent a significant portion of my time, I make a note to add a tag to my predefined set