[{"data":1,"prerenderedAt":228},["ShallowReactive",2],{"blog-en-taskalarm-the-to-do-list-that-cheers-you-on":3},{"id":4,"title":5,"body":6,"cover":212,"date":213,"description":214,"draft":215,"extension":216,"locale":217,"meta":218,"navigation":219,"path":220,"seo":221,"stem":222,"tags":223,"__hash__":227},"blog\u002Fblog\u002Fen\u002Ftaskalarm-the-to-do-list-that-cheers-you-on.md","TaskAlarm, the to-do list that cheers you on",{"type":7,"value":8,"toc":203},"minimark",[9,13,24,31,36,39,42,48,51,55,78,89,96,99,103,106,109,112,115,121,125,128,131,135,142,145,149,152,185,196,199],[10,11,12],"p",{},"There's a notification on my screen right now that I have dismissed eleven times. I know it's eleven because the app proudly tells me. That's the whole problem with reminders in one sentence: they're either so quiet you swipe them away without reading, or so loud and guilt-flavoured that you start resenting the thing that's supposed to help you.",[10,14,15,16,23],{},"So I built ",[17,18,22],"a",{"href":19,"rel":20},"https:\u002F\u002Fgithub.com\u002Fmaxlkatze\u002Ftaskalarm",[21],"nofollow","TaskAlarm",". It's a small to-do list that lives in the macOS menu bar, and its whole personality fits in the tagline: the to-do list that cheers you on.",[10,25,26],{},[27,28],"img",{"alt":29,"src":30},"Four TaskAlarm screens on a black background: settings, the main task list greeting \"Good evening\", a task detail page with repeat options, and an \"It's time!\" reminder card.","\u002Fimages\u002Fblog\u002Ftaskalarm\u002Fcollage.png",[32,33,35],"h2",{"id":34},"a-smiley-instead-of-a-badge","A smiley instead of a badge",[10,37,38],{},"The menu bar icon is a face. Its color is the status: green when everything's clear, amber when something's due, red when you missed something. Its expression does the rest. It's happy when you're relaxed, eager when you have things to do today, excited when something is due right now, and it grins when you tick the last thing off.",[10,40,41],{},"It only looks worried when something actually got missed. That's a rule, not a coincidence, and it's the reason the app works for me. A red number in a badge says \"you are behind.\" A face that's mostly smiling says \"you've got this,\" and the one time it isn't, you notice.",[43,44],"portrait-image",{"alt":45,"caption":46,"src":47},"The TaskAlarm app icon: a purple tile with a smiling alarm clock face, two amber bells, a little hammer and tiny feet.","The app icon is the smiley dressed up as an alarm clock. In the menu bar it's just the face.","\u002Fimages\u002Fblog\u002Ftaskalarm\u002Ficon.png",[10,49,50],{},"In the app icon the smiley is an alarm clock, with two amber bells, a little hammer and tiny feet. In the menu bar it's only the face, because at 16 pixels you get eyes, a mouth and some blush, and that's about it.",[32,52,54],{"id":53},"type-it-like-youd-say-it","Type it like you'd say it",[10,56,57,58,62,63,66,67,70,71,70,74,77],{},"The add field reads plain language. ",[59,60,61],"code",{},"Call Anna tomorrow 3pm"," becomes \"Call Anna\", tomorrow at 15:00. ",[59,64,65],{},"Gym every Mon and Thu 6pm"," repeats twice a week. ",[59,68,69],{},"Pay rent every month",", ",[59,72,73],{},"Review every 3 days",[59,75,76],{},"Meeting in 2 hours"," all do what they say.",[10,79,80,81,84,85,88],{},"German works too, because most of my life happens in German: ",[59,82,83],{},"Zahnarzt morgen um 10 Uhr"," or ",[59,86,87],{},"Sport jeden Montag 18 Uhr",". The parser handles \"jeden Werktag\", \"alle 3 Wochen\", \"täglich\" and friends with its own patterns, and leaves the actual dates to the system's date detector, which already speaks a lot of languages.",[10,90,91,92,95],{},"My favourite small rule in there: words like \"daily\" or \"weekly\" only count as repetition when they're not the first word. So a task called ",[59,93,94],{},"Daily every workday 8:30am"," keeps its name \"Daily\" (that's my stand-up) and repeats Monday to Friday. I found that bug the first morning I used it, which is the only kind of user research I can afford.",[10,97,98],{},"If typing isn't your thing, there are repeat and calendar buttons next to the field, and clicking a task opens a page with notes, date, time and repeat presets, plus custom rules like every N days, weeks, months or years, or specific weekdays.",[32,100,102],{"id":101},"three-stages-getting-louder","Three stages, getting louder",[10,104,105],{},"A reminder in TaskAlarm is a little story with three acts.",[10,107,108],{},"First, an optional heads-up, five minutes before by default. A soft \"Coming up\" card, nothing more.",[10,110,111],{},"Then the moment itself. A warm chime, and a card slides in from the top-right corner that says \"It's time!\". With persistent popups switched on, that card stays until you press Done or pick \"Remind in…\" for somewhere between 5 and 30 minutes.",[10,113,114],{},"Then, if you ignore it, the third act. A timed task counts as missed only after a five-minute grace period, because \"due at 3\" and \"it's 3:01\" shouldn't feel like failure. After that the card turns red, plays a soft ding-dong alarm, shakes once, and repeats every few minutes until you deal with it.",[116,117,118],"blockquote",{},[10,119,120],{},"A reminder should feel like a friend tapping your shoulder, not a boss reading your timesheet out loud.",[32,122,124],{"id":123},"is-it-really-done","\"Is it really done?\"",[10,126,127],{},"When you press Done, TaskAlarm can ask one more question: \"Is it really done?\" It sounds silly. It is the most useful feature in the app.",[10,129,130],{},"My worst habit with to-do lists was ticking things off to make the reminder go away. The task wasn't done, I just wanted the noise to stop. One extra tap is enough friction to make me be honest with myself, and the smiley switches to its celebrating face while it waits, which makes the honest answer feel rewarding instead of annoying. Popups always ask; for ticking things off in the list it's a toggle in settings.",[32,132,134],{"id":133},"nothing-leaves-your-mac","Nothing leaves your Mac",[10,136,137,138,141],{},"Tasks are stored in a single JSON file in ",[59,139,140],{},"~\u002FLibrary\u002FApplication Support\u002FTaskAlarm\u002Ftasks.json",". There's no account, no sync service and no network code at all. If the file ever gets corrupted, the app moves it aside as a timestamped backup instead of silently starting over. Uninstalling is deleting the app and that folder.",[10,143,144],{},"All the sounds are synthesized at runtime too, so there aren't even audio files in the bundle. That deserves its own post, and it's getting one.",[32,146,148],{"id":147},"getting-it","Getting it",[10,150,151],{},"It's one line in Terminal:",[153,154,159],"pre",{"className":155,"code":156,"language":157,"meta":158,"style":158},"language-bash shiki shiki-themes github-light github-dark","curl -fsSL https:\u002F\u002Fraw.githubusercontent.com\u002Fmaxlkatze\u002Ftaskalarm\u002Fmain\u002Finstall.sh | bash\n","bash","",[59,160,161],{"__ignoreMap":158},[162,163,166,170,174,178,182],"span",{"class":164,"line":165},"line",1,[162,167,169],{"class":168},"sScJk","curl",[162,171,173],{"class":172},"sj4cs"," -fsSL",[162,175,177],{"class":176},"sZZnC"," https:\u002F\u002Fraw.githubusercontent.com\u002Fmaxlkatze\u002Ftaskalarm\u002Fmain\u002Finstall.sh",[162,179,181],{"class":180},"szBVR"," |",[162,183,184],{"class":168}," bash\n",[10,186,187,188,191,192,195],{},"That downloads the latest release into ",[59,189,190],{},"\u002FApplications"," and launches it. Look for the smiley in your menu bar. If you'd rather build it yourself, it's a Swift package that needs macOS 14 and the Xcode command line tools, and ",[59,193,194],{},".\u002Fscripts\u002Fbuild.sh --install"," does the rest.",[10,197,198],{},"It's open source under MIT. I built it because my old reminder app made me feel bad about myself about four times a day, and the new one hasn't managed that once yet.",[200,201,202],"style",{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":158,"searchDepth":204,"depth":204,"links":205},2,[206,207,208,209,210,211],{"id":34,"depth":204,"text":35},{"id":53,"depth":204,"text":54},{"id":101,"depth":204,"text":102},{"id":123,"depth":204,"text":124},{"id":133,"depth":204,"text":134},{"id":147,"depth":204,"text":148},"\u002Fimages\u002Fblog\u002Ftaskalarm\u002Fhero.png","2026-10-16","I built a tiny macOS menu bar app that reminds me of things like a friend would. A smiley that changes color, reminders you can type in plain English or German, warm synthesized sounds, and no network at all.",false,"md","en",{},true,"\u002Fblog\u002Fen\u002Ftaskalarm-the-to-do-list-that-cheers-you-on",{"title":5,"description":214},"blog\u002Fen\u002Ftaskalarm-the-to-do-list-that-cheers-you-on",[22,224,225,226],"Tools","macOS","SwiftUI","P3jGS7TL0WSMyRYS-gBQorRPrJvhW0-NUS34_U4S_pQ",1792165383121]