[{"data":1,"prerenderedAt":150},["ShallowReactive",2],{"blog-en-buttons-are-verbs":3},{"id":4,"title":5,"body":6,"cover":134,"date":135,"description":136,"draft":137,"extension":138,"locale":139,"meta":140,"navigation":141,"path":142,"seo":143,"stem":144,"tags":145,"__hash__":149},"blog\u002Fblog\u002Fen\u002Fbuttons-are-verbs.md","Buttons are verbs",{"type":7,"value":8,"toc":126},"minimark",[9,13,16,22,27,30,37,48,54,58,61,64,74,77,90,93,97,100,103,106,113,117,120,123],[10,11,12],"p",{},"There's a line in meetre's design book that I've probably defended more than any colour or radius: \"Verbs on buttons, never 'OK' when a verb fits.\" The record button says Record. The stop button says Stop. The button that reruns a meeting's summary says Summarize again. Not \"Regenerate\", not \"Retry\", and definitely not a circular arrow you have to hover over to decode.",[10,14,15],{},"It sounds like pedantry until you watch someone use a dialog. People don't read the question. They read the buttons. If the buttons are \"OK\" and \"Cancel,\" they now have to go back up and read the question, figure out which of the two outcomes \"OK\" means, and hope they guessed right. If the buttons are \"Not now\" and \"Record,\" they already know what will happen. The question becomes optional.",[17,18,19],"blockquote",{},[10,20,21],{},"A button label is a promise about what happens next. \"OK\" promises nothing.",[23,24,26],"h2",{"id":25},"the-small-rules-that-add-up","The small rules that add up",[10,28,29],{},"Most of my microcopy rules are boring on their own. Together they're the difference between an app that feels considered and one that feels assembled.",[10,31,32,36],{},[33,34,35],"strong",{},"Sentence case everywhere."," \"Open library,\" not \"Open Library.\" Title case makes every label shout a little, and in a dense interface that adds up to a room full of people talking slightly too loud.",[10,38,39,42,43,47],{},[33,40,41],{},"The name is always lowercase."," meetre is written ",[44,45,46],"code",{},"meetre",", also when it starts a sentence in the UI. That one bothered me for about a day, then it became the brand. A lowercase name reads calmer, which is the whole point of a tool that sits next to your meetings.",[10,49,50,53],{},[33,51,52],{},"Never mix languages inside one control."," The meetre UI is English with a German localization, and the meeting content follows whatever language the meeting was in. What you'll never see is a German label with an English tooltip, or a button that says \"Speichern\" next to one that says \"Cancel.\" That happens all the time in half-localized apps and it instantly makes software feel cheap.",[23,55,57],{"id":56},"two-products-two-voices","Two products, two voices",[10,59,60],{},"Here's where it gets fun. I made two menu bar apps this year, and they have almost opposite rules for tone.",[10,62,63],{},"meetre's copy is \"calm, short, concrete.\" No exclamation marks anywhere in the interface. No emoji in the chrome (they're allowed inside your own meeting content, because that's yours). The onboarding is one short line per scene: \"Hi.\" Then \"It listens.\" Then \"It writes it down.\" Then \"And it stays on this Mac.\" The model download step just says \"Downloading the brain.\" It's a tool you trust with private conversations, so it talks like someone you'd trust with private conversations.",[10,65,66,73],{},[67,68,72],"a",{"href":69,"rel":70},"https:\u002F\u002Fgithub.com\u002Fmaxlkatze\u002Ftaskalarm",[71],"nofollow","TaskAlarm"," goes the other way on purpose. Its tagline is \"The to-do list that cheers you on,\" and the copy guide says to write the way a supportive friend texts you. When something's due, the card says \"It's time!\" with an actual exclamation mark. When you press Done, it asks \"Is it really done?\" The brand file even allows an emoji now and then, with a hard limit of one per message.",[10,75,76],{},"The guide has a little two-column table I'm quite fond of. On the left, what TaskAlarm says. On the right, what it would say if a bank had written it:",[78,79,80,84,87],"ul",{},[81,82,83],"li",{},"\"It's time!\" instead of \"ALERT: Task due\"",[81,85,86],{},"\"Is it really done?\" instead of \"Confirm completion\"",[81,88,89],{},"\"All done. Go enjoy your day\" instead of \"No remaining tasks.\"",[10,91,92],{},"Neither voice is right in general. They're right for their job. One app records your meetings and should stay out of the way. The other one exists to get you off the couch, and a to-do list that sounds like a compliance department has never got anyone off a couch.",[23,94,96],{"id":95},"empty-states-and-errors-get-one-of-everything","Empty states and errors get one of everything",[10,98,99],{},"An empty state in meetre is a recipe: a symbol, one sentence, one button. When you've never recorded anything, the library says \"No meetings yet.\" and offers a button that says Record. That's it. No illustration of a sad folder, no three paragraphs about all the wonderful things you could do here. You're on an empty screen because you haven't done the one thing yet, so the screen hands you the one thing.",[10,101,102],{},"Errors follow the same shape. An inline banner at the top of whatever broke, one sentence about what happened, one button that fixes it. Alerts (the modal kind that block everything) are reserved for confirming destructive actions, like moving a meeting to the Trash. Using a modal alert to tell someone the model download failed is like stopping them in the street to say it might rain.",[10,104,105],{},"The onboarding failure state is the strictest version of this. If setup fails, you get one sentence, the last line of the actual error, and \"Try again.\" Never the full log. The full log is one click away in settings behind a \"Copy error log\" button, which copies versions, settings and errors but never your transcripts. People who want to debug can. People who don't aren't scared by a wall of Python.",[10,107,108],{},[109,110],"img",{"alt":111,"src":112},"A meetre prompt asking whether to record a detected Teams call, with Not now and Record buttons","\u002Fimages\u002Fblog\u002Fmeetre\u002Fcall-prompt.png",[23,114,116],{"id":115},"german-isnt-a-translation-layer","German isn't a translation layer",[10,118,119],{},"Both apps treat German as a first-class language, which is easy to say and annoying to do. In TaskAlarm you can type \"Zahnarzt morgen um 10 Uhr\" into the add field and it understands it as a task called Zahnarzt, tomorrow at ten. \"Sport jeden Montag 18 Uhr\" becomes a weekly repeat. The parser knows \"werktags,\" \"jeden Abend\" and \"alle 3 Wochen\" alongside their English twins, because the people using it don't switch languages to write a reminder.",[10,121,122],{},"meetre does the same with speaker labels: you're \"Ich\" in a German meeting and \"Me\" in an English one, people in your room are \"Vor Ort 1\" or \"Local 1.\" Small thing. But a transcript of a German meeting that suddenly calls you \"Me\" reads like someone else wrote it.",[10,124,125],{},"I spend weeks on the big things in these apps, the transcription pipeline, the alarm logic, the sound design. And the thing people actually comment on is that the button said what it was going to do.",{"title":127,"searchDepth":128,"depth":128,"links":129},"",2,[130,131,132,133],{"id":25,"depth":128,"text":26},{"id":56,"depth":128,"text":57},{"id":95,"depth":128,"text":96},{"id":115,"depth":128,"text":116},"\u002Fimages\u002Fblog\u002Ftaskalarm\u002Fcollage.png","2026-10-16","On the smallest copy in an interface. Why I banned \"OK\", how one product of mine allows zero exclamation marks while the other cheers you on, and why every error message gets exactly one sentence and one fix.",false,"md","en",{},true,"\u002Fblog\u002Fen\u002Fbuttons-are-verbs",{"title":5,"description":136},"blog\u002Fen\u002Fbuttons-are-verbs",[146,147,148],"UX Writing","UI","Copywriting","F0mhb51W2dmtagQtP7L1wJvgzHGcb_hexkvYLNUe8qw",1792165381650]