I'm sharing this work privately, including some that's still in development. Please don't share the link or screenshots. Thank you.
Thiink
AI that runs the solar, batteries, EV chargers, HVAC, and district heating in homes and buildings.
Role: Head of Product and Design, reporting to the CEO
Product
Home EV charging
Problem: Smart charging launched as an experimental feature. Its plans were often off, and customers stopped trusting it: they rated it 2.3 out of 5, the lowest of any feature in our survey.
Result: I led the redesign, shipped in the second-generation Home AI app. Over three months, car registration rose from 20% to 90%, and EV charging support tickets fell by more than 70%. Registered cars open the next step: connecting to the car itself, so Thiink knows its battery and location before it's plugged in.
PainOptionsDecision
1 · Which car is charging?
Pain
Only about 20% of charger owners had registered their car, so plans assumed a default 70 kWh battery.Production data
“…let users manually input the car battery size, since I understand Thiink assumes all batteries are around 70 kWh.”Customer R65
Options
Keep car details in settings
Settings › My car
Where it was: most never found it
Ask for the battery size
Battery size: __ kWh
Only 3% ever changed the default
Pick the car during charger setup
Which car charges here?
Tesla · Model Y Long Range
Volvo · EX40 Recharge
Decision
Ask during setup. “Which car charges here?” The model fills in the battery size. Registration: 20% → 90% in three months
Shipped · charger setup
2 · How do I control charging?
Pain
Settings were confusing: charge limits and power levels were unclear.Survey, winter 2025–26
96% of configured chargers used lowest-price mode.Production data
Options
Keep three equal modes
Lowest price
Solar
Boost
96% picked the same one
Smart by default, overrides one tap away
Ready by 8:15 AM
Smart
Solar Only
Charge Now
Decision
Smart is the default. Set when you leave and how full. Solar Only and Charge Now are one-tap overrides.
Shipped · charger
3 · Ready means warm
Pain
In a Nordic winter, a charged car that's frozen isn't ready to drive.What I learned
Options
Ready = charged
100% by 6:00 AM
A full battery in a frozen car
Ready = charged and warm
Ready by 6:00 AM
Preconditioning 5:30 AM
Decision
Warm-up is part of the plan. The schedule preconditions the car before you leave.
Shipped · charging
4 · Which chargers do we support?
Pain
Every charger brand has its own API, with different capabilities and quirks.Integration work
Our most adopted charger brand also scored lowest for smart charging.Survey, winter 2025–26
Options
An aggregator API for every brand
One API → all chargers
Broad, but each brand's quirks slip through
Two tiers
Premium: tested on real devices
Others: aggregator API
Decision
Depth where adoption is, breadth everywhere else. Premium brands get end-to-end testing on real devices in our device farm, edge cases included. Other brands connect through a third-party aggregator.
AI assistant
Problem: Portfolio managers, homeowners, installers, and partners all want to understand their energy in depth, and each asks different questions. We needed answers that know who is asking and what they can see, without hiring an army of support staff.
Decision: Make it context aware. Sparky, our assistant, knows who is asking and answers only from what they are allowed to see. It starts with two kinds of questions: how to use the app, and what is happening in my buildings, drawn from live data and our docs. When you want to act, it points to the right screen.
Tradeoff: Read-only first. A wrong action in a building costs more than a missing answer, so actions come later, each behind an explicit confirm.
Result: It starts with portfolio managers, inside the Enterprise dashboard.
PainOptionsDecision
1 · Which buildings have alerts?
Pain
“The question asked ‘which buildings,’ and the reply gives only a count.”AI judge, June 2026
Six of the 16 answers that failed made this same mistake.Failure review, June 2026
Options
Just the count
You have 27 buildings with active alerts.
Doesn't say which
Every building
Building 7
Engelbrektsgatan 10 Tower
…and 25 more
Too long to read in a side panel
Name a few, link the rest
27 buildings with alerts
Building 7 · Engelbrektsgatan 10 Tower · Fleminggatan 87 Tower
Open the alerting buildings view
Decision
Name a few, link the rest. All of them when there are five or fewer. Otherwise the first three, and a link to the full view.
2 · Should every answer show its source?
Pain
A source chip on every answer overpromises trust without adding anything you can act on.Design review, May 2026
Options
Source chip on every answer
From the product guide
Looks trustworthy, changes nothing
“Answered from reviewed guide” badge
✓ Reviewed
Always true, so it says nothing
Say what kind of answer it is
From the guide
Live state
Live: as of when it was read
Decision
Label the kind of answer. In the on-site assistant, each answer says whether it comes from the guide or from live data, and live data says when it was read.
3 · Can the AI reword live numbers?
Pain
A reworded answer could contradict the live data it cites.Code review, June 2026
Options
The model writes every answer
Model rewrites the numbers
Can contradict its own source
Code states facts, the model explains
Live numbers: straight from the system
How-to answers: the model
Decision
Code states the facts. Live numbers come straight from the system. The model only writes how-to answers.
4 · Can we trust the grader?
Pain
“PASS is the only reachable outcome regardless of quality.”Audit, June 2026
The first fair run scored 92, but 16 answers fell below the bar.Blind judge, round 1
Options
Judge sees the answer keyIt just matches text
The model grades itselfGrading its own homework
Pass on the averageOne bad answer hides in the average
Blind judge, hard floor
Each answer graded on its own
One below the floor fails the run
Decision
Blind judge, hard floors. A different model grades each answer without the answer key. I hand-labeled answers first, with a one-line reason each, so the judge learned what good looks like. Every thumbs-down can become a new test. Below the floor: 16 → 2 in three rounds.
Problem: Our sales calculator estimates what a Thiink system is worth to a home. Without real consumption data, the estimate stays rough.
Decision: Record real use with a small logger on the meter's P1 (HAN) port, installed by a technician or mailed to the homeowner. The logger has no internet, so an app downloads its data over Bluetooth and sends it to sales.
Challenge: A month of readings takes about five minutes over Bluetooth, too long to stand at a meter cabinet. So the app downloads the 15-minute readings first, in about a minute, and opens the chart. Minute and 10-second detail fills in behind it, with a status line showing progress.
Result: We designed and built the app in about a month and shipped it on iOS and Android.
Enterprise installation
Problem: Before Thiink can optimize a building, it has to know what every sensor and setting in its control system is. A building can have thousands, with cryptic names like AI_3.TempOut. By hand, sorting them out took days per building, and connecting a fleet took months.
Decision: Onboarding as a Service: an agentic workflow where AI agents walk each BMS's tree of points with a recipe book per vendor and propose the mapping. I owned the installer experience around it. I built the fully automatic path first, then the paths for when the system is less sure, and installers review mappings in a batch instead of confirming each point.
Prioritization: I deferred the hardest integration tier, about 5% of buildings, so the common path could ship first.
Result: Shaped by what we learned connecting buildings by hand. The aim: a building connected in minutes, with no site visit and no manual mapping.
PainOptionsDecision
1 · Do I have to confirm every point?
Pain
The first plan had installers confirm every point, one at a time.First spec, March 2026
“A 600-point Regin building… per-point pacing would be brutal.”Design brief, April 2026
Options
Confirm every point
Point 1 of 600
Confirm
Skip
Slow, even where the AI is sure
Ask only when unsure
High: binds on its own
Medium: yes or no
Low: pick from a short list
Decision
Ask only when unsure. High-confidence matches bind on their own. The installer reviews the rest in one batch.
2 · How long is left?
Pain
We had no data yet to predict how long a building takes.Design brief, April 2026
Options
Time estimate
About 1 min remaining
A precise-looking number breaks trust the first time it is wrong
Overall confidence gauge
Confidence ▮▮▮▮▯
Readiness already is the summary
Stages, as they happen
Mapper · running
Scanner ✓
Normalizer ✓
Decision
Show only what's true. The progress screen shows which stage is running and what's done, never a guess at the time left.
3 · The AI is only fairly sure. Now what?
Pain
Installers couldn't see why the AI picked AV.038 over AV.041.My walkthrough, May 2026
The AI's own reasoning named a second candidate, but the screen never offered it. Saying no showed the same pick again.Wizard review
Not every installer wants to explain themselves to a chat.What I learned
Options
Ask the chat
Why did you pick AV.078?
A paragraph back
An answer to read, not a choice to make
Yes or no
Mapper picked AV.078
Yes
No
No leads back to the same pick
Choices, search, and a hint
AV.078 · 0.78
AV.082
None of these · search
Your hint → new cards
Decision
Choices first, words as a hint. The AI's guesses become cards, each with its reading and its reason. Search covers the rest. Free text goes back to the AI as a hint, and new cards come back, not a chat reply.
Exploration. Pick a card, or choose None of these and search.
Gap review: 30 of 33 required signals matched, 3 need the installer's judgment
Enterprise dashboard
Problem: We designed for portfolio managers with up to 5,000 buildings. They need to onboard sites with installers at scale, know when something goes wrong, and see where their energy savings come from.
Insight: I studied eight platforms, from Vercel and Datadog to the incumbent Kiona. Kiona is built for technicians: system diagrams, hundreds of unconfirmed alarms, dashboards built from scratch.
Decision: Model it on developer platforms like Vercel and Stripe, not on energy consoles. A site picker sets the scope for every page, buildings are the drill-down, and what needs attention comes first.
Tradeoff: I made it a rule: switching a service off must be as easy as switching it on, even though that makes leaving easy. If leaving is painful, vendor neutrality is just marketing.
Prioritization: Distributors manage their customers' buildings too, but I held their screens back for a concrete use case. The data layer supports them from day one, so adding them later isn't a rebuild.
Result: Shaped with our CTO and sales team, starting with the portfolio overview and app marketplace. The marketplace is designed so a manager can try a service on a few buildings, measure it, and keep or drop it.
PainOptionsDecision
1 · Where do I start with 5,000 buildings?
Pain
Card layouts work for Vercel's 5 to 20 projects. They don't scale to 5,000 buildings.My platform research, March 2026
“At 5,000 buildings, clicking through the sidebar doesn't scale.”Search spec, April 2026
Options
Buildings in the sidebar
▸ Stockholm Campus
Building 7
Can't list 5,000
Building cards
Building
Building
Building
Building
Fine for 20, not 5,000
Search and a dense table
⌘K Find a building
Name · Site · Health · Services
Decision
Search first. ⌘K finds any building, and a filterable table replaces the cards. The sidebar holds only sections.
2 · Sites were bolted on. Now what?
Pain
Sites arrived as three cards under the numbers, while the picker still said All Buildings.The dashboard, May 2026
“Per-building enumeration on Overview does not scale.”Navigation spec, May 2026
Options
Keep the wide sidebar
Overview · Operations · Buildings
Costs about 200px of room for data
Icon rail and a site picker
All sites ▾
Gothenburg Office · Malmö Hub · Stockholm Campus
Decision
Scope, don't navigate. One picker at the top re-frames every page, like switching organizations in GitHub.
Before · May 2026
3 · How should sites show on the overview?
Pain
“The Overview becomes a roll-up across sites, not a list of three site cards.”Design brief, May 2026
Options
Map and heatmap
Map of Sweden
“Table that for now”
Leaderboard
Sites ranked by one metric
Built for hundreds of sites
Picker only
All sites ▾
No way to compare sites
Compact cards with health bars
Gothenburg ▮▮▮▯
Malmö ▮▮▮▮
Decision
Cards, while sites are few. I designed for fewer than eight sites. What happens beyond that is a known open question, not a hidden one.
4 · What needs me today?
Pain
A single onboarding banner was the only call to action on the page.Design brief, May 2026
Options
One onboarding banner
21 buildings onboarding · Track progress
Hides alerts and maintenance
Three rows, as drawn
Idle / onboarding
Merged two rows that need different actions
Four groups, one action each
In progress · Track
Ready · Start
Alerts · Triage
Maintenance · Schedule
Decision
Every row is an action. Inside a site, buildings sort by urgency: the 20 most active first, the rest on request.
Portfolio overviewApp marketplace
Home installation guides
Problem: Every inverter, battery, and EV charger wires up differently, so installers need a guide for each combination. Static images were all they had.
Decision: Use AI to generate an interactive guide for each combination: a drawing of the real cabinet, built from Thiink's wiring drawing, that walks through the install one step at a time.
Result: The first guide covers the Solis S6 Hybrid 6–10 kW, in six steps. Try it below.
Design
Design system
In summer 2026, our CTO and I added Thiink Logger, which lets sales collect a home's energy use from a Connection Unit on the meter's P1 (HAN) port. Its app started in Flutter, which prompted a second revision of the design system I began in January. The first version stored tokens in TypeScript, since I expected only web and React Native clients.
Decision: Move tokens from TypeScript to JSON, in the W3C Design Tokens Community Group format, so one set of generators writes CSS for web, TypeScript for React Native, and Dart for Flutter, instead of a hand-written converter for each.
Source: tokens/*.json
Color, spacing, type, motion and component values, stored once in the W3C design-token format.
color/semantic/recipes/dimension/components/
↓
Generators
Style Dictionary resolves the references, then our own scripts write the files for each platform. The same JSON always produces the same files.
CSS
generated/css
Web apps, plain or React.
TypeScript
generated/ts
React Native.
Dart
generated/dart
Flutter. Thiink Logger copies these files into the app.
1Shared values
Eight color families, 12 shades each, for light and dark.
earth-9 · #144128
2Purpose name
Components ask for a job, not a color.
accent-bg = shade 9
3Brand map
Each brand picks the color family behind the job.
green → earth
Result
48 px tall
Components: Tokens cross platforms, widgets don't. So each component gets one written contract, and web and Flutter each build it natively against the same checklist. Six have contracts so far: button, chip, segmented control, steps, switcher, and toggle. I ruled on each one from live examples on the Logger's design board.
Button contract, excerpt
Job: "A button is a verb: it does something and remembers nothing."
Ruling: A disabled button is grey, not a paler blue. On the Logger's job screen, a paler Send button read as a quieter button, not one you can't press.
Ruling: The loading spinner replaces the label and the button keeps its width, so nothing moves out from under the finger.
The reference website reads the same generated files, so it can't drift from the package.
Reference website · each accent role doing its job on real Thiink content
Home AI mobile
I led the redesign of the second-generation Home AI app around two questions customers kept asking: is Thiink saving me money, and what is my car doing?
PainOptionsDecision
1 · Is Thiink saving me money?
Pain
“Hard to know if the savings are real.”Customer R30
About 18 of 66 couldn't see or trust their savings.Survey, winter 2025–26
Options
A · Vertical stack
Today's cost 15.55 kr
Without Thiink 34.10 kr
Saved 18.55 kr
B · Side by side
With 15.55
Without 34.10
Saved 18.55 kr
Takes more width, less emphasis on savings
C · Savings as hero
You saved 18.55 kr
Your cost 15.55 kr
Hides what you actually paid
Decision
A, simplified. Lead with what you paid, then what you saved. Honesty before celebration.
Shipped · home
2 · What is my car doing?
Pain
41% of customers charge an EV through Thiink.Survey, winter 2025–26
After saving their settings, owners had no clear summary of what Thiink would do, or when.Field teams
“There should be a way to tell the system when I plan to charge the car.”Customer R31
Options
Charger-first cards
Easee Charger #3
Smart charging
People think “my Tesla,” not their charger
Car first, plan in words
Tesla Y
Starts 9:45 PM · Ready by 7:00 AM
May only reach ~60% by 7:00 AM
Decision
Car first, plan in words. Each card leads with the car, says when charging starts and when it will be ready, and warns early if it may fall short.
Shipped · home
Home AI reads a homeowner's electricity bill to understand their starting energy use and fill in details most people do not know, including their electricity provider, electrical phase, and fuse size.