The Virtue Score
The third oat milk latte of the day costs ten points. I decided that one evening in October, calmly, while building the thing that would charge me, and I haven’t had to decide it since. Counting is what actually works for me, so I got Home Assistant to do it. This is the build note I promised in Stop waiting for willpower.
The rules
Every morning at 5am the score goes back to 100. It can climb to 120 and it can’t go below zero. That’s the whole frame: a fresh start each day, and no way to dig a hole you can’t get out of.
The things that cost points are the ones that had crept in. Chocolate under 85% cocoa is ten. Cake or a pastry is fifteen. A takeaway instead of a meal I’d planned is ten. Caramel syrup in a coffee is twenty, which in practice means never.
Lattes have their own rule. I tap for each one, the first two of the day are free, and every one after that costs ten. The number of free ones is a setting on the score’s page, so I can tighten it later without rebuilding anything.
Most of it counts itself
The part I like best is how little of it I have to do. Most of the good side arrives on its own.
The Home Assistant app on my phone passes on what the phone already measures. Its activity detection knows when I’m walking or cycling, so a half-hour walk earns 10 and a forty-minute ride earns 15 without me touching anything. Steps earn five at 7,500 and five more at 10,000. If the phone says I slept seven hours, the day starts with ten already in the bank.
The gym is the same. There’s a zone drawn round each of the two gyms I use, and it’s twice a week, in two halves. If my phone hasn’t spent at least 25 minutes inside one between Monday and Wednesday, I lose 25 on Wednesday night, and the same goes for Thursday to Sunday. Nobody has to press anything: the phone being there is the proof.
Stacked on things I already do
The rest hangs off habits I already had. Fogg calls these anchors, and Atomic Habits calls it habit stacking: tie the new thing to something you already do.
Every night I say good night to Alexa, and a routine turns the house down for the night. That same routine now tells the score I’ve gone to bed, and before 11 on a work night it’s worth ten. I didn’t add a step. The step I already took now counts.
The by-hand ones are easy because there’s an Echo in most rooms. Fruit and my teeth are a phrase to Alexa. Lattes, a black coffee instead of one, and the sins are a tap on the score’s page on my phone.
Into the red
Below 60, the house notices. A note arrives on my phone, and if the office lights are on they go a sulky amber. The flag clears when the score is back to 60, or at 5am. It’s not a punishment so much as a mood. You can’t miss it, and it doesn’t nag.
The teeth streak
The habit I most wanted to stick was doing my teeth properly before 9pm, which
also closes the kitchen for the night. So that one talks back. I say
Alexa, I’ve done my teeth
, or press the button, and if it’s before nine
it’s worth ten points and the streak goes up. After nine it’s five, and the
streak starts again tomorrow.
The Echo that heard me says something different depending on the streak: night one, two in a row, a week, a new best. Never a telling-off. If I forget, the 5am reset quietly zeroes the streak and writes the night’s result in the log.
How a point gets in
Whether it counted itself or I said it, every point ends at one of two scripts, one for losing points and one for earning them. Each caller hands over a price and a reason. The script keeps the score between 0 and 120, writes the reason in the logbook and tells my phone where I am. The prices sit with whatever calls it, and the two I expect to tune, how many lattes are free and when teeth stop counting, are settings on the page.
It was built in an evening in October, from a sketch I’d talked through with Claude beforehand, the same way the rest of the house was rebuilt in Faking intelligence. There’s still no AI in the loop when it runs. The house just follows the rules it was taught.
Why counting works
It’s Fogg’s model in a box. The less there is to do, the more of it actually happens, and the easiest thing to do is nothing at all: go for the walk, and the walk gets counted. The score is a number I can see without having to remember or tot anything up. Nothing about my willpower changed. The thing I’m bad at, keeping count, is now the house’s job.
It also makes the decision once. When the third latte is tempting there’s nothing to decide. I just know it’s ten points.
What it should refuse to do
When Claude and I worked through it, the list of pitfalls was as long as the tariff, and none of them is built yet. Only movement and sleep should take the score above 100, so I can’t eat my way to a good day. As it stands, fruit twice and black coffee twice will do exactly that, which is the first thing to fix. Losses should be capped at 40 a day, so one bad afternoon can’t wreck the week. The house should say the score out loud no more than twice a day. And Saturday might be a day off, when it says nothing at all. A scoring system that nags is one you switch off, and then it counts nothing.
Room to grow
The goal is that anything that can count itself does. I’ve got a few Flic buttons, the little smart buttons you can stick anywhere, that I haven’t added yet. One by the bathroom sink would mean I press it after my teeth and don’t even need to say anything. My toothbrush is Bluetooth, too, and in principle the phone could notice it being used and pass that back to the house. That’s a rabbit hole I haven’t gone down yet.
At the moment the score itself is doing the job. If that ever stops being enough, the next step is stakes. Below a score I’d think too low for the day, not zero, just too low, money could go somewhere I’d hate it to go: a cause I don’t want to support, or a friend who’d take it with glee. I wouldn’t want it back. The point is how much I’d hate giving them the pleasure of watching me fail. That might be its own piece.
Keeping the history
My Home Assistant keeps every change, with its reason, for ten days. For the long run the score and the teeth streak are kept as long-term statistics: the low, high and average for each hour and day, forever, for almost no space. That’s enough to draw a graph over months, which is the only view that matters. One day is noise. The line over a season is the habit.