Honest & Calm. Software people are glad they used.
Every product makes choices about your user's money, attention, data and time. This guide teaches you to see the manipulative versions of those choices, to name them, and to design the honest, calm versions instead. For a solo creator this is not a luxury: trust is the one asset a one-person product can build faster than any big company, and lose faster too.
TeachersRams, Weiser & Brown, Amber Case, Kenya Hara, Harry Brignull, Tristan Harris, Ink & Switch, Mike Monteiro
By the end you will be able to
Explain how deceptive patterns work, using the cognitive biases they exploit (understand)
Name and spot the common deceptive patterns in any checkout, sign-up, consent banner or cancellation flow (analyze)
Apply the principles of calm technology to decide what belongs in the center and what in the periphery of attention (apply)
Judge whether a habit loop or streak serves the user, using the "glad they did it" test (evaluate)
Write a notification policy, a privacy posture and a sunset plan for your own product (create)
Design for longevity: open formats, exports, older devices, light pages (create)
Write your own design oath and an ethics and trust pre-ship checklist, and use them (create)
Warm-up: what do you already notice?
Before we name anything, test your instincts. You have spent years on the receiving end of these designs: the subscription that would not die, the cookie banner with one big green button, the app that pings you at 9:47 pm with "You have new activity!". You already know a lot. The goal of this guide is to turn that vague irritation into precise vocabulary and, more importantly, into design decisions you make on purpose in your own product.
How to study this guide: read one Part per sitting. Do the quizzes before reading the explanation. Do at least the exercises marked "on your own product", because ethics you have not applied to your own work is just opinion. The four Parts build on each other: honesty (not tricking people), calm (not exhausting them), trust (not exploiting their data or their future), and responsibility (not harming them or others).
The map of this guide. Each Part protects a different thing a product can quietly take from a person. You will meet all four in your own product, usually in the boring flows (checkout, sign-up, settings, cancel), not in the hero screen.
Diagnostic 1
Your reading app's paid plan converts poorly. A friend suggests making the "Start free trial" button big and green and changing the dismiss link to "No thanks, I don't care about reading more". What is the real problem with this suggestion?
This is confirmshaming. It works on some people in the short term because nobody likes to agree with an insulting sentence about themselves. But the people it converts are the ones who did not really want the trial, so they churn, ask for refunds and remember you as the app that guilt-tripped them. Chapter 3 shows the honest version.
Diagnostic 2
Which of these is the best sign that a notification is "calm" in the sense this guide means?
Calm is about the user's attention budget, not about tone. A useful notification informs and lets go. Optimising for open rate (c) or using badges to create a sense of debt (d) are the opposite. Part 2 builds a full notification policy.
Reflection prompt
Write down three moments in the last month when an app made you feel tricked, guilty, or drained. Keep the list. You will classify each one with the vocabulary in Part 1 and Part 2, and you will probably find one of them in your own product.
Part one
Honesty: don't trick people
We start with the clearest line in product ethics: do not deceive. Dieter Rams made honesty one of his ten principles in the 1970s; Harry Brignull gave the violations names in 2010; regulators on three continents have since turned many of those names into law. This Part teaches you the mechanism behind deception (it rides on predictable human biases), the main families of deceptive patterns, an honest redesign for each, and what the law now says. You will finish by playing a spotter game on a mock checkout.
1
Good design is honest
Taught by Dieter Rams, with Kenya Hara and Don Norman
An honest product shows what it is, does what it says, and costs what it claims. Every gap between what the interface implies and what is true is a lie, even if no sentence in it is false.
Rams wrote his ten principles of good design while he was head of design at Braun. Two of them frame this whole guide. The sixth: good design is honest. In the version Vitsœ publishes, it does not make a product appear more innovative, powerful or valuable than it really is, and it does not try to manipulate the consumer with promises that cannot be kept. The seventh: good design is long-lasting. It avoids being fashionable, and therefore never appears antiquated. We come back to longevity in Part 3. Here, honesty.
For a physical object, honesty is mostly about form. A radio should not pretend to be a piece of furniture; a plastic part should not be painted to look like metal. Software has no material, so its honesty lives somewhere else: in the relationship between what the interface signals and what the system actually does. Norman would call this the gap between the conceptual model the user forms and the real model underneath. Normally we try to close that gap so people are not confused. A deceptive pattern opens the gap on purpose, so that people act on a false model in a way that benefits the business.
Four places software can lie
When you audit your product for honesty, you are looking in four places. Each has its own common lies.
Signals. What visual weight, color and position imply. A green, huge "Accept" next to a gray, tiny "Settings" says "this is the normal choice" even if nobody wrote that.
Words. What labels, headlines and microcopy state or imply. "Free" that turns into a charge, "Only 2 left" that is always 2, "Continue" that actually means "subscribe".
Defaults. What happens if the person does nothing. Pre-ticked boxes, opt-outs buried in settings, auto-renewal with no reminder.
Effort. How hard each path is. Sign-up in one tap, cancel by phone during office hours. The asymmetry is itself a message: we will make leaving painful.
Measure the gap, not the sentences. You can deceive with every sentence technically true. The test is what a reasonable, busy person would believe after a glance, compared with what will actually happen.
Why honesty is also the better business for you
Deception works in a narrow, measurable way: it raises a short-term number (sign-ups, add-ons, retention this month). It costs in ways that are slower and harder to measure: refunds, chargebacks (payment processors penalize merchants with high chargeback rates), support load, angry reviews, app store rejection, legal risk, and, worst for a small product, the death of word of mouth. A large company can absorb that. A one-person product lives on recommendations from people who trust it. Your honesty is your marketing budget.
There is also a quieter argument. Kenya Hara writes about design as a way of making people perceive things clearly, of "awakening" them to what is already there. Deception is the precise opposite: it designs for a person's inattention. If you want to be the kind of designer who makes things people see clearly, you cannot also be the kind who relies on them not seeing.
Don't
Every word is true, the page is a lie. The real price (₹499 a month, forever) sits in small, faint fine print styled to be skipped. The gap between belief and reality is the whole strategy.
Do
The real price is the headline. The offer is still attractive. The reminder promise turns the scariest part of a subscription into a reason to trust you.
Key idea
Ask "what will a busy person believe after two seconds?" and design so that belief is true.
Do
Put the real cost, duration and renewal terms at the same visual level as the offer.
Make the honest path the easy path: equal effort to say yes and no.
Describe features as they are today, not as the roadmap hopes.
Let defaults favor the user when in doubt (off for marketing, off for sharing).
Don't
Rely on "it's technically in the terms".
Use visual weight to hide the option you would rather people did not pick.
Claim "AI-powered", "secure", "private" or "unlimited" without being precise about what that means.
Test deceptive variants "just to see"; the variant that wins is often the one that tricks best.
In the wild
Braun product lineDieter Rams era, 1960s–90s
Controls look like what they do; materials are not disguised. Rams formulated "honest" as a principle partly against products dressed up to seem more than they were. Software equivalent: a button looks like what it does and does what it says.
Basecamp pricing37signals
Basecamp has long published simple, flat pricing on a single page and made a point of explaining it plainly rather than through tiers designed to confuse. Simple pricing is itself an honesty signal.
Apple subscriptionsApp Store, since 2010s
Subscriptions bought through the App Store can all be seen and cancelled in one system place (Settings, your name, Subscriptions), and the store requires free-trial terms to be disclosed before purchase. Platforms are pushing a baseline of honesty; meet it on the web too.
For the solo creator
You are designer, engineer and the person who reads the refund emails. That is your advantage: you feel the cost of a dishonest pattern directly. Keep a "surprise log": every support email that starts with "I didn't realize…" goes into one note. Each entry marks a gap between what your interface implied and what happened. Fix the top one every month.
Common mistakes
Confusing "persuasive" with "honest"
Good copy persuades by showing real value. Founders slide from "show value clearly" to "make the alternative look bad" without noticing.
Persuasion is fine when it would survive the user knowing exactly what you are doing. If the technique only works when hidden, it is manipulation.
Treating legal text as disclosure
Terms of service feel like they protect you, so it seems fine to put important facts there.
Anything that changes what a person pays, shares, or can undo belongs in the interface at the moment of decision, in plain words.
Copying a competitor's flow wholesale
Large products have spent years on growth experiments, so their flows look "proven".
Proven for which metric? Copy their structure only after auditing it with the four places to lie: signals, words, defaults, effort.
Check yourself
Your note-taking app's sync is "end-to-end encrypted" for note bodies, but titles and tags are stored in plain text on your server so search works. The marketing page says "Your notes are end-to-end encrypted." Which fix is most honest?
Precision is honesty. A reasonable reader of "your notes are end-to-end encrypted" assumes titles too, and titles often contain the most sensitive words. (b) throws away a real benefit; (c) is the legal-text mistake. Being exact also signals competence, which security-minded users notice.
Exercise 1.1 40 minutes · on your own product
The four-places honesty audit
Pick the three flows where money, data or commitment changes hands (for example: upgrade, sign-up, delete account).
Screenshot every screen. For each, write one line per lens: Signals (what does visual weight imply?), Words, Defaults, Effort (count taps for yes vs no).
For each screen, write "a busy person believes: …" and "what actually happens: …". Mark every gap.
Fix the largest gap in code today.
You're done when: you have a one-page table of gaps for three flows, and one gap is closed in your shipped build.
Beginner
Competent
Strong
Lists screens and notes vague "feels pushy" issues.
Uses the four lenses on each screen and counts taps for yes vs no.
States belief vs reality for every screen, ranks gaps by harm, and ships a fix with a before/after screenshot.
2
How deceptive patterns work
Taught by Harry Brignull, with Daniel Kahneman and Arunesh Mathur
A deceptive pattern is an interface that exploits a predictable shortcut in human thinking to make people do something they did not intend. Learn the shortcuts and you can recognize any pattern, including new ones nobody has named yet.
Harry Brignull, a UX designer with a PhD in cognitive science, coined the term "dark patterns" in 2010 and started a website cataloguing them. He later renamed the site deceptive.design and, in 2023, published the book Deceptive Patterns. The names changed over the years (for example "roach motel" became "hard to cancel", "sneak into basket" became part of "sneaking", "privacy zuckering" was retired as a name), so you will see both old and new labels. This guide uses whichever name is clearest and mentions the other.
In 2019 a Princeton team led by Arunesh Mathur crawled around 11,000 shopping websites and found dark patterns on roughly one in ten of them, including fake countdown timers and fake "someone just bought this" messages, some generated by third-party plug-ins sold for that purpose. The point for you: these patterns are not rare and not only in big companies. They often arrive in your product through a template, a plug-in or a growth tutorial.
The engine underneath: shortcuts in thinking
Kahneman's distinction between fast, automatic thinking (System 1) and slow, deliberate thinking (System 2) explains why these patterns work. People using an app are almost always in System 1: skimming, tapping the obvious button, trusting defaults. Deceptive patterns are built to be correct for System 2 and misleading for System 1. The full information is there for a careful reader. Almost nobody is a careful reader at a checkout. (See The Human Mind for the full treatment of attention and bias.)
Six shortcuts, many patterns. When you meet a new trick, ask which shortcut it leans on. That tells you how to neutralize it: make the default neutral, make scarcity real, make proof true, remove the shame, equalize salience, equalize effort.
Three families you will meet
To keep the catalogue usable, this guide groups the common patterns into three families, each with its own chapter. The grouping is ours, made for designers; it is not an official taxonomy.
Family
What it does
Patterns
Chapter
Pressure
Pushes a decision with emotion or false time limits
Confirmshaming, fake scarcity, fake urgency, fake social proof, nagging
A test you can run on any design: the four questions
When a pattern does not have a name, run these four questions. If any answer is "yes", you are probably looking at a deceptive pattern.
Would it stop working if users understood it? Honest persuasion survives being explained. "Annual plan saves 30%" still works when you know why it is there. A fake countdown does not.
Is the effort asymmetric? Count the taps and the reading needed for each option. Yes in one tap and no in six is a tell.
Would you be embarrassed to show it on stage? Imagine a slide at a design conference titled "How we got 12% more add-ons". Would you show the screenshot?
Would the user be glad, a week later? This is the test we will reuse for habits and notifications in Part 2.
Deceptive patterns are not a design problem a designer can always fix alone; they are usually a business decision expressed in pixels.Paraphrasing a theme of Harry Brignull, Deceptive Patterns, 2023
Do
Learn the six shortcuts; they generalize to patterns that have no name yet.
Audit third-party plug-ins, checkout templates and "conversion" widgets before you install them.
Use the four questions as a review step for every flow involving money, data or commitment.
Don't
Assume a pattern is fine because a famous product uses it.
Argue about labels; argue about the gap and the effort.
Treat "users can read the details" as a defense; design for how people actually read.
In the wild
deceptive.designHarry Brignull, since 2010
The reference site: a type list with definitions, a "hall of shame" of real examples, and a summary of relevant laws and cases. Bookmark it and read the hall of shame once a quarter; it trains your eye.
Princeton shopping-site studyMathur et al., 2019
Automated crawl of about 11K shopping sites; found 1,818 dark pattern instances on 1,254 sites, and third-party services openly selling fake urgency and fake activity widgets. Patterns arrive through tools, not only through intent.
For the solo creator
There is no growth team pushing you. That is good and bad. Good: nobody forces you. Bad: the pressure arrives as tutorials, "conversion" plug-ins for your store, or a revenue dip at 2 am. Decide your red lines now, while calm, and write them down (Chapter 18 shows how). Decisions made at 2 am during a bad month are where most solo dark patterns come from.
Common mistakes
Only looking for the famous names
People memorize "confirmshaming" and "roach motel" and miss a new variant.
Use the shortcut map and the four questions instead of matching names.
Installing a "social proof" or "urgency" widget
Store platforms sell them as conversion boosters and the setup takes one click.
Check what data drives the widget. If it is not your real, current data, do not install it.
Check yourself
A habit tracker shows, when you try to delete a habit: "Delete 'Run' and erase your 41-day history forever?" with a red "Delete forever" and a gray "Archive instead". The history really would be erased. Is this a deceptive pattern?
Using a bias is not the same as exploiting it. Telling someone a true consequence at the moment of decision is good design (it is error prevention). It would become deceptive if the loss were exaggerated ("you'll lose all your progress" when it is archived anyway) or if "Delete" were hidden. Effort here is equal, and the statement survives being understood.
Exercise 2.1 30 minutes · on apps you use daily
Shortcut spotting walk
Open three apps or sites where you spend money (food delivery, travel, a subscription).
Go through a purchase up to the payment screen without paying.
For every element that pushed you, write the shortcut it uses (default, scarcity, social proof, shame, salience, effort).
Mark each one "honest use" or "exploit" with the four questions.
You're done when: you have at least ten elements classified, with at least two you initially thought were honest but changed your mind on (or the reverse).
Beginner
Competent
Strong
Names patterns by gut feel.
Maps each element to a shortcut and applies the four questions.
Also writes a one-line honest redesign for every exploit found.
3
Patterns of pressure
Taught by Harry Brignull, with Robert Cialdini
Pressure patterns push a decision by manufacturing emotion: shame, fear of missing out, herd instinct, or simple fatigue. The honest version gives the same true information and lets the person decide at their own pace.
Cialdini's Influence (1984) described the levers that make people say yes: reciprocity, commitment, social proof, liking, authority and scarcity. Every one of them is real and every one can be used honestly. A genuinely limited batch is scarce. A genuinely popular plan has social proof. Pressure patterns are what you get when the lever is pulled without the fact behind it, or with the fact exaggerated. Below are the five you will meet most, each with a drawn honest alternative.
Confirmshaming
The decline option is worded to make the person feel stupid, selfish or lazy for declining: "No thanks, I prefer to stay uninformed." It works because agreeing with an insulting sentence about yourself is uncomfortable, so a few people click yes to avoid the discomfort. The honest version names both options neutrally. If your offer only works when "no" is humiliating, the offer is weak.
Deceptive
The "no" insults you. It also signals the business thinks little of its customers.
Honest
Neutral words, comparable buttons. The value proposition does the persuading, and the cost (an email a month) is stated.
Fake scarcity and fake urgency
Scarcity ("only 2 left") and urgency ("offer ends in 09:59") both trigger loss aversion: we weigh a loss more heavily than an equal gain, so the fear of missing out short-circuits comparison shopping. They are honest when true and specific. They become deceptive when the number is invented, the timer resets on reload, or "only 2 left" means "only 2 left at this price on this site in this minute". In 2019 the UK's Competition and Markets Authority secured commitments from several large hotel booking sites to stop misleading pressure selling such as false claims about how many rooms were left or how many people were looking.
Deceptive
Invented limits. Digital goods are not scarce, and a timer that restarts is a lie that anyone can discover by reloading.
Honest
A real deadline with a date. Urgency is honest when it is a fixed, public date that you actually honor (and do not "extend by popular demand").
Fake social proof
"Priya from Pune just bought this", "1,203 people are viewing", "4.9 from 10,000 reviews". Social proof works because, under uncertainty, we copy what others do. Faking it is now explicitly targeted by regulators: the US FTC finalized a rule in 2024 banning fake reviews and testimonials, including reviews by people who do not exist and buying positive reviews. For a small product the temptation is different: you have few users, so the numbers look thin. The honest response is to show the proof you really have (one detailed quote from a named user, with permission) rather than inflate it.
Deceptive
Activity that never happened. These toasts are often generated by plug-ins from a list of names and cities.
Honest
Small and true beats big and fake. A specific quote from a real person is more persuasive than an implausible number.
Nagging
The same request, repeated until the person gives in: "Turn on notifications?" with only "OK" and "Not now", asked every launch. "Not now" is not "no"; it is a promise to ask again. Nagging exploits fatigue: eventually, saying yes costs less than one more dismissal. The honest version accepts a "no" and remembers it, and asks again only when something meaningful changes (the user creates their first reminder, for example), at most once.
Deceptive
No real "no". Asking on every launch turns a choice into a war of attrition.
Honest
Ask when the value is obvious. The request explains itself, and "No, thanks" is final until the user changes it in Settings.
Key idea
Every persuasion lever is honest when the fact behind it is true, specific and the same for everyone.
Do
Word "no" options neutrally ("Not now", "No, thanks", "Skip").
Use deadlines only with a public date and time you keep.
Show real counts with how they are measured, or show none.
Ask for a permission once, in context, and remember the answer.
Don't
Put fake stock limits on digital goods.
Reset or "extend" deadlines you said were final.
Install "recent purchase" pop-ups fed by anything other than real, consented data.
Offer only "OK" and "Later" for a question you will keep asking.
In the wild
Hotel booking sitesUK CMA action, 2019
After an investigation, several major booking sites committed to stop giving false impressions of room availability and popularity, and to stop hiding fees. Urgency claims are now an enforcement topic, not just a style choice.
FTC fake reviews ruleUnited States, 2024
Bans fake or AI-generated reviews attributed to people who do not exist, buying reviews, and some forms of review suppression. Inflated proof is a legal risk as well as an ethical one.
Indie launchesCommon pattern
Many indie apps run a launch discount with a stated end date and keep it, then mention in the changelog that it ended. Keeping a deadline you set is cheap credibility.
For the solo creator
You will feel tempted by urgency at launch because launches feel like your one shot. Use real urgency instead: a dated launch price, a limited number of founding-member seats you actually cap, or an honest "this price is for the first month after launch". Then write the end date in your calendar and honor it publicly.
Common mistakes
"Cute" confirmshaming
It feels like brand voice ("No thanks, I love missing deadlines").
Personality goes in the offer, never in the decline. Read the decline aloud to a stranger; if it insults them, rewrite it.
Evergreen "limited time"
The discount worked once, so it never ends.
If it never ends, it is your price. Show it as the price.
Rounding up your users
"Thousands of users" feels close enough to 840.
Use the real number or a qualitative proof (a named quote). Precise small numbers read as honest.
Check yourself
You sell a writing course with live cohorts of 20 seats. Which urgency message is honest?
(c) is real scarcity: specific, true, and it tells the person their alternative (June), which removes panic. (a) is vague and permanent, (b) is fake urgency, (d) is invented.
Exercise 3.1 30 minutes · on your own product
Rewrite every "no"
Search your codebase and copy for decline strings: "No thanks", "Not now", "Skip", "Maybe later", "Cancel", and every dismiss link.
Paste them into one list with where each appears.
Rewrite each so it is neutral, specific and final when it should be final. Note whether the prompt will ever reappear and when.
Check that each decline has comparable size and contrast to its accept button.
You're done when: you have a list of every decline in your product, each rewritten, with a rule for when (if ever) the prompt returns.
Beginner
Competent
Strong
Rewrites the obvious shaming lines.
Covers every decline and equalizes button weight.
Also implements "remember the no" in code with a clear re-ask rule, and documents it.
4
Patterns of sneaking
Taught by Harry Brignull, with Richard Thaler & Cass Sunstein
Sneaking patterns change the deal while the person is not looking: an item appears in the basket, a fee appears at the last step, an ad dresses up as a button, a question is worded to be misread, a box is already ticked. The honest version shows the whole deal, up front, in the words a skimmer will actually read.
Thaler and Sunstein's Nudge (2008) made "choice architecture" famous: the way options are arranged changes what people choose, and there is no neutral arrangement. They argued for nudges that are transparent and easy to opt out of, aimed at choices people would endorse. Sneaking patterns are the inverse, sometimes called "sludge" (a word Thaler later popularized for friction that works against people's interests). They rely on the fact that defaults stick and that skimmers read the first two words of a sentence.
Sneak into basket and preselection
An add-on ("Priority support, ₹199") is added to the cart or ticked by default, so the person has to notice and remove it. The default effect is powerful: most people keep whatever is preselected, partly from inertia and partly because a default looks like a recommendation. The EU's Consumer Rights Directive (2011) already bans pre-ticked boxes for extra payments, and the Court of Justice of the EU ruled in the Planet49 case (2019) that a pre-ticked box is not valid consent for cookies. The honest version: add-ons start unticked, and the total updates visibly when someone ticks one.
Deceptive
The default does the selling. The buyer must notice and untick, in the one moment they are least likely to read.
Honest
Opt-in, labeled "Optional". If the add-on is good, enough people will tick it. That number is honest data about its value.
Hidden costs (drip pricing)
The advertised price is lower than the price you pay: a "convenience fee", "platform fee", tax or delivery charge appears only at the last step. By then, the person has invested time (sunk cost) and committed mentally to the purchase, so most continue. India's 2023 dark pattern guidelines call this drip pricing. In the US, the FTC finalized a rule in late 2024 requiring all-in prices for live-event tickets and short-term lodging. The honest version shows the total, including mandatory fees, from the first price the person sees.
Deceptive
Sunk cost as a weapon. The "real" price is shown only when walking away feels wasteful.
Honest
The first number is the last number. A breakdown is available on demand; nothing is added later.
Disguised ads
An advertisement styled to look like content or like part of the interface: a big green "Download" button on a file site that is actually an ad, a "recommended article" that is paid placement without a label. It exploits the learned meaning of interface elements. For you, the risk is subtler: cross-promotion of your own other app styled as a native feature, or affiliate links in a "recommendations" list without disclosure. The honest version labels ads and sponsorship clearly, in words ("Ad", "Sponsored", "Affiliate link"), and never styles them as controls.
Deceptive
Borrowed meaning. The only disclosure is a tiny, faint "ad" under the button. A button means "this page's action". Using that look for an ad is a lie about function.
Honest
Ads look like ads. A label in words, a different container, and never a control's styling.
Trick questions
A question worded so that a skimmer gives the opposite answer to the one they intend: double negatives, a switch between "tick to opt in" and "tick to opt out" in the same form, or a dropdown where the "no" option is hidden among normal ones. Brignull's best-known example is an airline checkout where the way to decline travel insurance was the option "Don't insure me", placed alphabetically inside a list of countries of residence. The honest version: one question, one meaning, phrased positively, with the same polarity for every checkbox.
Deceptive
Designed to be misread. The skimmer applies the first rule to both boxes.
Honest
One polarity, plain words. Toggles default off, labels describe what you get, and the frequency is honest.
Key idea
The whole deal, up front, in words a skimmer reads correctly. Anything added later or worded to be misread is sneaking.
Do
Start every optional add-on and marketing choice unticked.
Show all-in prices from the first view; offer a breakdown on demand.
Label ads, sponsorships and affiliate links in plain words.
Phrase every checkbox so that "checked means yes".
Don't
Add anything to a cart that the person did not add.
Introduce a fee on the last screen.
Style promotions as buttons, system alerts or content.
Mix opt-in and opt-out wording in one form.
In the wild
Planet49 rulingCourt of Justice of the EU, 2019
A pre-ticked checkbox does not constitute valid consent to store cookies. Preselection is legally not a choice in the EU.
"Don't insure me"Airline checkout, catalogued by Brignull
The opt-out from insurance was hidden inside a country dropdown. The classic trick question: the "no" disguised as an unrelated option.
Food delivery feesIndia, 2020s
Platform, packaging and "small order" fees often appear late in the order flow; drip pricing is one of the 13 patterns named in India's 2023 guidelines. Show the fee before the person invests effort.
For the solo creator
Payment providers and store templates decide many of these for you, so check them. Does your checkout template pre-tick "Subscribe to newsletter"? Does the tax get added at the end because your price is entered ex-tax? In India, showing GST-inclusive prices from the first view is both honest and simple. Set your price display once, correctly, in the config.
Common mistakes
Opt-out marketing "because it's standard"
Every template does it; it feels harmless.
In the EU (GDPR) and in many other places it is not valid consent anyway. Default off; earn the opt-in with a clear benefit.
Prices entered without tax
You enter ₹499 in the dashboard and the payment page adds 18% GST.
Decide whether your displayed price includes tax and show the payable amount everywhere.
Unlabeled affiliate links
They feel like normal recommendations to you.
Add "affiliate link" next to them. Readers trust a disclosed recommendation more, not less.
Check yourself
Your app shows "₹299/year" on the pricing page. At checkout, the payment provider adds "₹54 tax" so the user pays ₹353. A user complains. What is the best fix?
The honest fix is that the first number equals the last number. (a) and (c) are technically disclosures but still leave a surprise for the skimmer. Many consumer laws also require prices to be shown inclusive of mandatory charges.
Exercise 4.1 25 minutes · on your own product
The first-number-equals-last-number test
Start from your landing or pricing page as a new user with a fresh browser profile.
Record every price you see, every checkbox state, and every item in the cart, screen by screen, until the final payment confirmation.
Highlight any number that changes and any box you did not tick that is ticked.
Fix the first-change point so the first number is the final number.
You're done when: a fresh user sees one price from first view to receipt, and no option is pre-selected that costs money or data.
Beginner
Competent
Strong
Notices the tax jump.
Fixes price display and unticks optional boxes.
Also audits emails, receipts and renewal reminders so every number matches.
5
Patterns of obstruction
Taught by Harry Brignull, with the US FTC and the Norwegian Consumer Council
Obstruction makes the choice the business dislikes harder than the one it likes: one tap to join, a maze to leave; one tap to share, five screens to keep things private. The honest rule is symmetry: leaving, refusing and deleting should take no more effort than joining, accepting and creating.
Effort is a cost people pay in time and attention. When one option is cheap and the other is expensive, most people take the cheap one, even when they wanted the other. That is not a character flaw; it is how a limited attention budget works. Obstruction patterns turn that fact into revenue. They are also, today, the patterns most likely to get a company sued.
Roach motel (hard to cancel) and forced continuity
The name comes from an old US insect-trap advertising slogan: easy to get in, impossible to get out. Signing up takes a minute online; cancelling requires a phone call, a chat with a "retention specialist", a buried link under Help, a survey, three offers and a final confirmation email. Its partner is forced continuity: a free trial that silently becomes a paid subscription, with no reminder before the first charge.
In 2018 the Norwegian Consumer Council published "Deceived by Design", analyzing how large platforms steered users through privacy settings. In 2021 it followed with "You can log out, but you can never leave", documenting the many steps needed to cancel Amazon Prime. The US Federal Trade Commission sued Amazon in 2023 over Prime sign-up and cancellation flows; in September 2025 Amazon agreed to a settlement reported at $2.5 billion, including refunds to customers. Separately, the FTC adopted a "click-to-cancel" rule in 2024 requiring cancellation to be as easy as sign-up, but a federal appeals court vacated it in July 2025 on procedural grounds before it took effect, and the FTC has since reopened rulemaking on subscriptions with an advance notice of proposed rulemaking. Check the current status before you rely on it. Existing laws (like the US ROSCA act and several state laws, such as California's automatic renewal law) still require simple cancellation. Treat symmetry as the standard regardless of what any single rule says this year.
Lab: try to cancel a subscription
Taps 0Screens 1Words to read 0
Your results will appear here: try both flows.
Your task: cancel the ₹499 monthly "Premium" membership of a reading app. Start with the roach motel flow, then try the honest one. Watch the taps and the words you had to read. Notice which buttons are traps (they send you back or quietly keep you subscribed).
Obstruction in general
Cancellation is the famous case, but obstruction appears anywhere a business prefers one answer: deleting an account (no button, "email support"), exporting your data (only one export per 30 days, in a proprietary format), turning off personalization (hidden four levels deep), comparing plans (prices only shown after a demo call; this is sometimes called comparison prevention). The tell is always the same asymmetry.
Count both directions. The honest design allows one extra confirm step for a consequential action. It never requires a different channel or a negotiation.
Interface interference
Visual design used to hide or demote the option the business dislikes: the "Reject" button in light gray on white, the "Decline" link at 11 px under a 48 px green "Accept", the "Delete account" text styled as plain body copy. It works because people navigate by salience (see Visual Design on hierarchy). Hierarchy itself is not wrong: there is usually a recommended action. The line is crossed when the demoted option is a legitimate choice the person came to make, and when it is made hard to see, not just secondary.
Deceptive
A real choice made nearly invisible. "Decline" is tiny, faint gray text under a huge green button, and is not even shaped like a control.
Honest
Recommend, do not hide. One button can be filled, the other outlined; both are clearly buttons with readable labels.
Privacy zuckering
Brignull's old name (now retired on his site) for tricking people into sharing more personal data than they meant to: confusing privacy settings, "find your friends" flows that upload the whole address book and email every contact, defaults that make a profile public. In 2015 LinkedIn agreed to a $13 million settlement in a US class action over its "Add Connections" feature sending repeated invitation emails to users' contacts. The honest version: share nothing by default, ask for the narrowest data needed, and show exactly who will see or receive what before it happens. Part 3 goes deeper into privacy.
Deceptive
"Continue" means "spam everyone you know". The consequence is real and hidden in faint text.
Honest
Narrow, visible, one-shot. The user picks people, sees the exact message, and knows nothing else happens.
Key idea
Symmetry: no is as easy as yes, leaving as easy as joining, private as easy as public.
Do
Put "Cancel subscription" in the same place a person would look to manage it, reachable in two or three taps.
Email a reminder before a trial converts or an annual plan renews.
Allow one honest save attempt at most (a pause option or a plan change), shown alongside "Cancel", not instead of it.
Make delete account and export data self-serve.
Don't
Require a phone call, chat or email to cancel something bought online.
Put "Cancel" behind a mandatory survey or several offers.
Use visual weight to make a legitimate option invisible.
Share or upload anything about other people (contacts) without explicit, specific action.
In the wild
Amazon Prime cancellationFTC case 2023, settled 2025
The FTC alleged a multi-step cancellation flow (internally nicknamed "Iliad", according to the complaint) and sign-up flows that enrolled people without clear consent. Even the largest companies are now held to symmetry.
App Store subscriptionsApple
System-level list of all subscriptions with a cancel button for each, independent of the app. The platform's baseline; your web billing should be at least this easy.
Stripe customer portalStripe Billing
A hosted page where customers can update cards, see invoices and cancel, configurable by the merchant. For a solo founder, honest cancellation can be a configuration, not a project.
For the solo creator
Honest cancellation is cheaper for you. Every obstructed cancel becomes a support email, often an angry one, and sometimes a chargeback with a fee. A two-tap cancel page plus a one-question optional "why?" gives you better exit data than any retention maze, because people who are not trapped will tell you the truth.
Common mistakes
"Contact us to cancel"
You have not built the billing UI yet, so email feels like a fine placeholder.
Use your payment provider's hosted portal from day one. It takes an afternoon.
Save offers that replace the exit
A discount on the cancel screen improves retention numbers.
Offer at most one alternative (pause, cheaper plan) next to a clearly labeled "Cancel" that works on first tap.
No renewal reminder
Reminders "cause cancellations".
They cause cancellations by people who would have asked for refunds. Send them; the rest renew happier.
Check yourself
Which cancellation flow meets the symmetry standard for an app where sign-up took two taps?
(d) is three taps plus a confirmation that gives true, useful information, with one save option offered beside the exit. (a) changes channel, (b) forces a survey, (c) stacks offers and demotes the exit.
Exercise 5.1 45 minutes · on your own product
The symmetry table
List five pairs of opposite actions in your product: subscribe/cancel, sign up/delete account, share/unshare, opt in/opt out, import/export.
For each, count taps, screens and words to read in both directions, on a phone.
Mark any pair where the "leaving" direction is more than one step longer or uses a different channel.
Fix the worst pair. If you have no billing UI, set up your provider's customer portal.
You're done when: you have a five-row symmetry table, and every row is within one step, or has a dated fix ticket.
Beginner
Competent
Strong
Measures cancel only.
Measures all five pairs and fixes the worst.
Also adds pre-renewal reminders and a self-serve export, and documents the policy on your help page.
6
Spot them, then know the law
Taught by Harry Brignull, with the EU, the US FTC and India's Central Consumer Protection Authority
Practice turns a vocabulary into an eye. Then learn the short version of the law: in the EU, the US and India, many deceptive patterns are no longer just bad manners but violations with real penalties.
First, play. The mock checkout below contains several deceptive elements mixed with honest ones. Tap anything that you think is deceptive. Each tap tells you what you found, or why the element is fine. Try to find them all before revealing the answers. Expect to miss one or two: the good ones are designed to be missed.
Lab: dark pattern spotter
Found 0 of 8Honest elements flagged 0
Tap the elements you think are deceptive.
The law, in one page
You are not a lawyer and this is not legal advice. But a designer who ships to the world should know the shape of the rules, because they increasingly name specific interface patterns. The direction of travel is clear and global: regulators now judge the design, not only the terms.
The trend is one-directional. Each year more patterns get named in law or case law. Designing honestly now means you never have to redesign under deadline later.
GDPR (applies since 2018) requires consent to be freely given, specific, informed and unambiguous, and says withdrawing consent must be as easy as giving it. Pre-ticked boxes and "by continuing you agree" do not count. Data protection by design and by default (Article 25 GDPR) requires you to build privacy in, not bolt it on. The Digital Services Act (Article 25) prohibits online platforms from designing interfaces that deceive or manipulate users or otherwise materially distort their ability to make free and informed decisions; it applies to online platforms since February 2024 (micro and small enterprises are exempt from this particular article, but general consumer law still applies to them). The Unfair Commercial Practices Directive also covers misleading and aggressive practices like fake urgency. French regulator CNIL fined Google and Facebook in January 2022 (€150M and €60M) because refusing cookies took more clicks than accepting them.
The FTC Act (Section 5) prohibits unfair or deceptive practices, and the FTC has used it against dark patterns directly; its 2022 staff report "Bringing Dark Patterns to Light" lays out its view. ROSCA (2010) requires clear disclosure, express consent and a simple cancellation method for online subscriptions. In the Epic Games case (orders finalized 2023), Epic agreed to pay $245 million in refunds over Fortnite purchase flows the FTC described as dark patterns. The 2024 click-to-cancel amendments were vacated by a federal appeals court in July 2025; the FTC has since reopened rulemaking. The 2024 fake reviews rule is in effect. States add their own: California's privacy law (CPRA) says agreement obtained through dark patterns is not consent, and its automatic renewal law requires online cancellation.
India's Central Consumer Protection Authority notified the Guidelines for Prevention and Regulation of Dark Patterns, 2023 under the Consumer Protection Act, 2019, in November 2023. They list 13 specified dark patterns: false urgency, basket sneaking, confirm shaming, forced action, subscription trap, interface interference, bait and switch, drip pricing, disguised advertisement, nagging, trick question, SaaS billing, and rogue malwares. They apply to platforms offering goods or services in India, as well as advertisers and sellers. The Digital Personal Data Protection Act, 2023 adds consent requirements for personal data: consent must be free, specific, informed, unconditional and unambiguous, with a clear affirmative action, and withdrawing must be as easy as giving it.
India's 13 (2023)
Family in this guide
Honest version
False urgency
Pressure
Real, dated deadlines and true stock
Basket sneaking
Sneaking
Only what the user added
Confirm shaming
Pressure
Neutral "no"
Forced action
Obstruction
Do not require unrelated actions (sign-up, sharing) to complete a task
Subscription trap
Obstruction
Two-tap cancel, renewal reminders
Interface interference
Obstruction
Visible, comparable choices
Bait and switch
Sneaking
Deliver the thing advertised
Drip pricing
Sneaking
All-in price from first view
Disguised advertisement
Sneaking
Label ads in words
Nagging
Pressure
Ask once, remember "no"
Trick question
Sneaking
One polarity, plain words
SaaS billing
Sneaking
No silent charges or unannounced conversions in software subscriptions
Rogue malwares
(Security)
No malware, no fake "free" software that holds data hostage
Watch out
Laws change, and this page summarizes them only at a high level. Before launching paid features in a new market, read the regulator's own guidance or ask a lawyer. The good news: if you design to the honest versions in Chapters 3 to 5, you will already comply with most of it.
Do
Treat the strictest market you sell in as your global default.
Keep a dated record of your consent and cancellation flows (screenshots), in case you ever need to show them.
Use the honest-version column above as a design spec.
Don't
Assume "small" means "exempt"; consumer law usually applies to any seller.
Design to the minimum legal line; laws trail behavior by years.
Copy consent banners from big sites; several have been fined.
In the wild
CNIL decisionsFrance, January 2022
Google and Facebook were fined because rejecting cookies required several clicks while accepting took one. Both changed their banners to add a one-click reject in France. Click-count asymmetry is now evidence.
FTC v. Epic GamesUS, 2022–2023
The FTC alleged confusing button layouts led players to make unwanted purchases with a single press. Button placement can be a legal issue.
For the solo creator
You cannot track every law. Use a short rule set instead: all-in prices, opt-in for everything optional, equal-effort reject and cancel, no fake numbers, labeled ads, self-serve delete and export. That set covers the core of the EU, US and Indian rules above.
Common mistakes
Relying on a consent plug-in's defaults
The plug-in says "GDPR compliant", so you ship it unconfigured.
Configure it: a first-layer "Reject all", no pre-ticked categories, and scripts that actually wait for consent.
Thinking "India doesn't enforce this"
Enforcement history feels short.
The guidelines are specific and enforceable, and enforcement attention has grown since 2023. Design for them now.
Check yourself
Your EU-facing app's cookie banner has "Accept all" and "Settings". In Settings, all categories are off and there is a "Save" button. Is this enough?
Regulators (CNIL most clearly) have said refusing must be as easy as accepting. One click to accept versus two or more to refuse is the asymmetry that got Google and Facebook fined. (d) goes too far: "Accept all" is fine if "Reject all" is equal.
Exercise 6.1 30 minutes · on your own product
Run the 13 against yourself
Copy the table of India's 13 patterns.
For each, write "absent", "present" or "not applicable" for your product, with the screen name.
For any "present", write the honest version and estimate the effort to fix.
Repeat the spotter game above with a friend and time how fast they find all eight.
You're done when: you have a 13-row self-assessment for your product with evidence, and a fix list for every "present".
Beginner
Competent
Strong
Marks rows from memory.
Checks each row against real screens.
Also checks emails, receipts and third-party plug-ins, and fixes at least one item.
Part 1 recap: connect the ideas
Which single principle best explains why confirmshaming, roach motels and interface interference are all deceptive (linking back to Norman's conceptual models in The Human Mind)?
All three create asymmetry, in emotion (shame), effort (maze) or visibility (gray link). The result is a gap between intention and action, which is the exact gap Norman's "gulf of execution" teaches us to close. Deceptive design widens it on purpose.
Part two
Calm: respect attention
Not tricking people is the floor. The next level is not exhausting them. Attention is the scarcest resource your user has, and almost every product competes for it. This Part goes back to the 1990s, when researchers at Xerox PARC asked what computing would feel like once it was everywhere, and forward to streaks, feeds and push notifications. You will learn to design for the periphery, to leave room, to tell good habits from captured ones, and to write a notification policy for your own app.
7
Calm technology: center and periphery
Taught by Mark Weiser & John Seely Brown, with Natalie Jeremijenko
Good technology lives mostly in the periphery of attention, where you can sense it without thinking about it, and moves to the center only when it matters, then back again. Calm is not the absence of information; it is information that does not demand.
Mark Weiser was chief technologist at Xerox PARC and coined "ubiquitous computing" (his 1991 Scientific American article "The Computer for the 21st Century" opens with the idea that the most profound technologies are those that disappear into everyday life). In 1995 he and John Seely Brown wrote a short paper, "Designing Calm Technology", arguing that if computers were going to be everywhere, they had better not shout. Their central point was a distinction between the center of attention (what you are consciously focused on) and the periphery (what you are aware of without attending to it, like the sound of traffic or the weather out of the corner of your eye).
They argued that calm technology does two things. It uses the periphery, so we can be aware of many things without being overburdened; and it lets things move easily between periphery and center, so we can take control when we need to. They wrote that a calm technology will move easily from the periphery of our attention, to the center, and back. The feeling this creates, they said, is of being "at home": attuned to what is around you, in control.
Two zones, one movement. Calm products put most status in the periphery (sync, word count, battery) and promote something to the center only when it needs a decision. The mistake is keeping everything in the center.
The Dangling String
Weiser and Brown's favorite example was an artwork by Natalie Jeremijenko at PARC: a length of plastic spaghetti-like string hanging from a small motor in the ceiling, wired to the office Ethernet. Each packet of network traffic made the motor twitch. A quiet network meant a gentle twitch every few seconds; a busy network made the string whirl and make a soft noise. Nobody needed to look at it. You heard and saw it at the edge of awareness, and you noticed when something was unusual. Information about the network was present, continuous and undemanding. That is the model: ambient, continuous, glanceable, and silent until it matters.
Translating it to screens
On a screen, the periphery is the edges: the status bar, the corner of a window, the color of a small dot, the length of a scroll bar, a gentle change in a title's weight. The center is anything that interrupts: modals, alerts, sounds, toasts that block content, badges demanding to be cleared. Calm software puts status in the edges and keeps the center for the person's own work.
Sync status: center vs periphery
The river was low that summer, and the stones on its bed were warm by noon. She walked
Syncing…
Uploading 1 change to the cloud. Please wait.
Chapter 3Saved
The river was low that summer, and the stones on its bed were warm by noon. She walked
If sync fails for more than a few minutes, the dot turns into a short line: "Offline, changes saved on this device". No modal.
Without: a routine status takes the center, blocks the writing, and demands a tap that changes nothing.
With: the same information lives in the corner as a small dot and one word. It escalates (gently, still in place) only if something actually needs attention.
Don't
Everything in the center. Banner, badge and toast all compete with the text the person came to read.
Do
The text is the center. Progress lives in a thin line at the edge. News waits on a "What's new" row in Settings.
Key idea
Put status in the periphery, decisions in the center, and make the trip between them easy and rare.
Do
Inventory everything your app shows that is not the user's own content. Assign each item to center or periphery.
Use position, a small dot, a weight change or a thin bar for status.
Escalate in steps: dot, then inline message, then (only for real risk) a modal.
Don't
Use modals for information that needs no decision.
Use red badges for counts that do not represent obligations.
Animate peripheral items; motion pulls them into the center.
In the wild
Kindle reading progressAmazon
Progress is a small line of text or a thin bar at the bottom, and can be hidden while reading. Status at the edge, content in the center.
iA WriterInformation Architects, 2010–
The editor hides almost all chrome while you type; counts and options appear at the edges or on demand. Writing is the center; everything else waits.
macOS menu barApple
Battery, Wi-Fi and time live in a thin strip at the top edge: glanceable and silent until a low-battery warning. The classic peripheral display on a computer.
For the solo creator
Calm is cheaper to build. A status dot is ten lines of code; a modal system with queues and dismiss logic is a project. When you feel the urge to tell the user something, first ask: does this need a decision? If no, it goes in the periphery, and you just saved yourself a feature.
Common mistakes
Confusing calm with hidden
Designers remove status entirely to look minimal.
People then worry ("did it save?"). Calm keeps information present but quiet. Show it at the edge.
Escalating everything equally
One notification system handles everything, so a "saved" message and a "payment failed" message look the same.
Define levels (periphery, inline, interrupt) and map each event to one.
Check yourself
Your markdown editor syncs to a cloud folder. Sync is occasionally delayed for a minute. Which design is calmest while staying honest?
(b) uses the periphery and escalates in place only when the delay becomes meaningful, and it tells the truth (the work is safe locally). (a) hides useful truth; (c) pulls a non-event into the center; (d) interrupts for something the system can retry itself.
Exercise 7.1 40 minutes · on your own product
Center and periphery map
On your main screen, list every element that is not the user's own content (status, counts, badges, banners, toasts, tips).
Draw two circles. Place each element where it currently sits: center (interrupts or competes) or periphery.
Now place each where it should be. Draw arrows for moves.
Implement the moves for the top three.
You're done when: you have a before/after center-periphery map and three elements moved in the shipped build.
Beginner
Competent
Strong
Lists elements.
Maps and moves three of them.
Defines an escalation ladder (periphery, inline, interrupt) for every event and documents it in your design notes.
8
Amber Case's eight principles
Taught by Amber Case, with Mark Weiser
Amber Case turned Weiser and Brown's idea into eight working principles. Each one is a question you can ask of any feature: how little attention can this need, and what happens when it fails?
Amber Case is a designer and researcher who wrote Calm Technology: Principles and Patterns for Non-Intrusive Design (O'Reilly, 2015). She frames technology as something that should inform without overburdening, and her principles are deliberately practical. Here they are, each with a software example drawn below. Read the list, then study the drawings: each shows one concrete way to apply the principle in a small app.
Technology should require the smallest possible amount of attention. It should create ambient awareness through different senses and communicate without taking you out of your world.
Technology should inform and create calm. Its job is to give you what you need to know so you can stop worrying, not to give you something new to worry about.
Technology should make use of the periphery. It should move easily from the periphery to the center and back.
Technology should amplify the best of technology and the best of humanity. Machines should not act like humans, and humans should not act like machines; give each the work it is good at.
Technology can communicate, but doesn't need to speak. A tone, a light, a vibration can carry status without words or a voice.
Technology should work even when it fails. A broken escalator becomes stairs. Design a sensible default state for failure.
The right amount of technology is the minimum needed to solve the problem. Every added feature, sensor or connection adds a way to fail and a demand on attention.
Technology should respect social norms. Introduce new behavior gradually, and consider the people around the user, not only the user.
1 · Smallest attentionAutosave removes a whole category of thought ("did I save?"). The only trace is a quiet word at the edge.2 · Inform and calmAnswer the worry directly: when, what, and "nothing for you to do". Information that ends a concern.3 · Use the peripheryA focus timer as a filling ring in the menu bar. You sense time passing without opening anything.4 · Amplify bothThe machine is good at spotting; the person is good at judging intent. A suggestion beats a silent autocorrect.5 · Communicate without speakingApple Watch can tap your wrist before a turn in Maps directions. In an app: a soft haptic on completion instead of a dialog.6 · Work when it failsWhen the network goes, the app degrades to a fully working local editor. The failure state is useful, not a spinner.7 · Minimum technologyEach extra feature is another way to fail and another demand on attention. Ship the timer.8 · Respect social normsSince iOS 14, a small green dot shows when the camera is on (orange for the microphone). In your app: clear signs when recording, sharing or broadcasting.
How to use the eight as a review
The principles overlap, which is fine: use them as eight lenses during a review, not as a scoring rubric. In practice, three of them do most of the work for a small software product. Principle 6 (work when it fails) forces you to design offline, error and empty states, which most apps skip. Principle 7 (minimum technology) is your best defense against feature creep. Principle 8 (social norms) is the one most often forgotten: the person next to your user (on a call, on a train, in a shared document) also experiences your product.
Principle
Review question
Typical fix
1 Smallest attention
What could happen without the user thinking about it?
Autosave, sensible defaults, remembered settings
2 Inform and calm
Does this message end a worry or start one?
State what is safe and whether action is needed
3 Periphery
Could this be a glance instead of a read?
Dot, bar, color, position
4 Amplify both
Is the machine doing machine work and the human human work?
Suggest, do not silently decide
5 No need to speak
Does it need words or a sound?
Haptic, subtle motion, icon state
6 Work when failing
What does the user see offline, on error, at zero data?
Local-first, cached content, useful error
7 Minimum
Which feature could we delete?
Cut, merge, or hide behind a setting
8 Social norms
Who else is affected, and do they know?
Indicators, consent, quiet defaults in shared spaces
Do
Run the eight questions on every new feature spec, in a five-minute pass.
Design the failure state first for anything that depends on the network.
Prefer non-verbal feedback (state change, haptic) for routine success.
Don't
Add "smart" features because they are possible.
Make the machine pretend to be a person (fake typing indicators, invented names for bots) when it adds nothing.
Forget the people near your user: sounds, cameras, auto-shared status.
In the wild
iOS camera and mic indicatorsApple, iOS 14, 2020
A colored dot in the status bar whenever an app uses the camera or microphone. Principle 8 as a system feature; tiny, peripheral, always there.
Things 3Cultured Code
Completing a to-do is a small checkbox animation and the item quietly moves away; there are no congratulation dialogs. Principle 5: routine success without words.
Google Docs offlineGoogle
Docs can be enabled for offline editing and sync later. Principle 6: a failure that still lets you work.
For the solo creator
Principle 7 is your superpower and your survival strategy. Every feature you do not build is one you never have to maintain, document or support. When you are unsure whether to add something, add nothing for a month and see if anyone asks.
Common mistakes
Reading "calm" as "quiet visual style"
A muted palette looks calm in a screenshot.
Calm is behavior: interruptions, demands, failure handling. A gray app that pings ten times a day is not calm.
Skipping the failure state
You develop on fast Wi-Fi.
Test daily in airplane mode for one week. Every screen that becomes a spinner is a principle 6 failure.
Humanizing for its own sake
Chat-style copy and fake typing dots feel friendly.
If a machine did it, show it as a machine result, fast and clear (see Designing with AI).
Check yourself
Your meditation app plays an end-of-session gong. Users report the sound startles people around them on trains. Which principle applies most directly, and what is the fix?
The problem is the people around the user. Respect the context (silent mode, no headphones) and use principle 5's non-verbal channel. (b) loses useful information; the user still needs to know the session ended.
Exercise 8.1 50 minutes · on your own product
The eight-lens review
Pick your app's most-used flow.
For each of the eight principles, write one observation and one proposed change (it is fine to write "already good" with a reason).
Turn on airplane mode and walk through the flow again. Note every place that breaks.
Ship the two highest-value changes.
You're done when: you have an eight-row review table, an airplane-mode failure list, and two shipped changes.
Beginner
Competent
Strong
Fills in the table with general remarks.
Proposes specific UI changes and tests offline.
Ships changes, including a designed offline state, and deletes at least one feature or setting under principle 7.
9
Emptiness: leaving room
Taught by Kenya Hara, with Naoto Fukasawa and Oliver Reichenstein
Emptiness is not a lack. An empty vessel is useful because it can receive anything. A calm product leaves room for the person's own content, intention and pace, instead of filling every gap with suggestions, prompts and promotion.
Kenya Hara, art director of MUJI since 2002, writes about emptiness as a design idea in Designing Design (2007) and White (2010). He distinguishes simplicity in the Western modernist sense (reducing to essentials for efficiency) from emptiness in a Japanese sense: a space that invites the viewer to bring their own meaning. His image is a vessel: its value comes from the empty space inside. MUJI's posters with a single horizon line and a tiny figure are, in his framing, empty containers that viewers fill with their own feelings.
Hara also describes MUJI's aim with a contrast between two Japanese phrases. "Kore ga ii" means roughly "this is what I want", the feeling of a product that excites a specific desire. "Kore de ii" means roughly "this will do", a quieter satisfaction: the product is good enough that you do not need to think about it further. MUJI aims for a confident version of the second. For software this is a surprisingly radical idea: build a product that people can stop thinking about.
Emptiness in software
The baseline guide covered whitespace as a visual tool (see also Visual Design). Here we care about emptiness as an ethical stance. An attention-maximizing product treats every empty moment as wasted inventory: an empty feed gets "suggested posts", an empty search gets "trending", a finished task gets "what's next?". A calm product treats empty moments as the user's to keep.
The empty moment is a gift, not inventory. A completed state that ends gives people a clean exit and a sense of finishing, which is also what makes them come back willingly.
Don't
No room left. The person came to write one thought; the screen offers ten other things to do first.
Do
A vessel. The emptiness invites the person's own content. One quiet line answers the one question they might have.
The empty vessel is useful precisely because it can hold anything; design that leaves room lets people bring their own meaning.Paraphrasing Kenya Hara, Designing Design, 2007
Four kinds of room to leave
Room in space. Empty canvas, generous margins, no promotional slot "because there was space".
Room in time. No autoplay, no "next" timer, no immediate follow-up prompt after completion.
Room in meaning. Let people name, organize and use things their own way; avoid forcing your categories (Fukasawa calls designs that fit unconscious behavior "without thought").
Room in commitment. Allow light use. Someone who opens your app once a month should not be punished with guilt, lost streaks or "we miss you" emails.
Do
Design the "done" state as a real ending.
Let empty states be quiet invitations with one hint at most.
Support occasional use without penalties.
Don't
Fill every empty slot with suggestions or upsells.
Treat a user's free moment as an opportunity to increase engagement.
Confuse emptiness with missing information; the essential status still shows, quietly.
In the wild
MUJIRyohin Keikaku, art direction by Kenya Hara since 2002
Unbranded-looking goods, plain packaging, and campaign images built around emptiness and horizon lines. A product can be confident by asking for less attention.
iA WriterInformation Architects
Opens to a blank page and a cursor; no templates gallery, no onboarding tour. The empty page is the feature.
Things 3 "Today"Cultured Code
When you clear today's list, the view is simply empty and quiet, not filled with suggestions. Done means done.
For the solo creator
Emptiness saves you work. Templates galleries, tip systems and "what's next" carousels all need content, maintenance and localization. An empty state with one helpful sentence is a decision you can make today and never revisit.
Common mistakes
Fear of the blank screen
Onboarding advice says empty states must "drive activation".
Activation comes from the first real use. Make the first action obvious and the screen calm; skip the tour (see Problems Worth Solving on onboarding).
Punishing absence
Re-engagement emails and streak resets feel like retention tools.
Let people leave and return without penalty. A light user who comes back gladly is worth more than a guilt-driven daily user.
Check yourself
A user finishes reading the last saved article in your read-later app. What should the screen do?
(c) leaves room and gives an honest ending with a path for the person who wants more. (a) turns the empty moment into inventory, (b) removes the person's choice, (d) uses a moment of satisfaction to extract something.
Exercise 9.1 30 minutes · on your own product
Design three endings
Find three moments when a user finishes something in your app (a task, a list, a session).
Screenshot what appears now.
Redesign each as an ending: one clear acknowledgment, no promotion, an optional small path onward.
Sketch them in code or a quick mock and compare side by side.
You're done when: three before/after pairs exist and at least one is shipped.
Beginner
Competent
Strong
Removes clutter from one ending.
Designs three real endings.
Also reviews re-engagement emails and removes any that punish absence.
10
The attention economy and stopping cues
Taught by Tristan Harris and the Center for Humane Technology, with Adam Alter and Natasha Dow Schüll
When a business earns more the longer people stay, the product slowly learns to remove the moments when people would naturally stop. Calm design puts those stopping points back.
In 2013 Tristan Harris, then a design ethicist at Google, circulated an internal slide deck titled "A Call to Minimize Distraction & Respect Users' Attention". He argued that a handful of designers at a few companies were shaping how billions of people spend their time, mostly by optimizing for time-on-site. The idea grew into the "Time Well Spent" movement and, in 2018, the Center for Humane Technology, which he co-founded with Aza Raskin and Randima Fernando. Its argument is not that technology is bad, but that a business model built on capturing attention creates pressure to exploit human weaknesses.
How products remove stopping cues
Adam Alter, in Irresistible (2017), uses the phrase stopping cues for the natural signals that tell us we are done: the end of a chapter, the last page of a newspaper, the end of an episode. Many attention-optimized designs work by removing them. Natasha Dow Schüll's study of slot machines, Addiction by Design (2012), shows the same thing in gambling: machines are designed to keep players in a continuous "zone" with no natural pause.
Mechanism
Which stopping cue it removes
Calm alternative
Infinite scroll
The bottom of the page
Pagination, "you're all caught up", a visible end
Autoplay next
The end of an episode or video
Autoplay off by default, or a clear "Play next" button
Variable rewards (pull to refresh, randomized feeds)
Predictability: knowing there is nothing new
Clear timestamps, "nothing new since 9:12", scheduled updates
Streaks
The freedom to skip a day
Weekly goals, rest days, forgiving counters
Notification pings
The end of a session (pulls you back in)
Digests, quiet hours, opt-in only for useful events
Unread badges
The sense of "finished"
No badge for non-obligations; counts only for real tasks
Aza Raskin designed an early version of infinite scroll in 2006 and has since spoken publicly about regretting how it has been used. Loren Brichter, who invented pull-to-refresh for the Tweetie app, has also said in interviews that he has misgivings about it, since it can work like a slot machine lever. Neither invention is evil in itself. Infinite scroll is fine for a search result list you are actively scanning; it becomes a problem when combined with a feed engineered to be endless.
A stopping cue is a design element. It has to be drawn on purpose. Without it, the session ends only when the person's willpower does.
A feed with and without a stopping cue
Post from @studio_k2m
Suggested for youSponsored
Post from @ravi.writes1h
Because you liked a postSuggested
Post from @maya5h
Loading more…●
Post from @studio_k2m
Post from @ravi.writes1h
Post from @maya5h
You're all caught up3 new posts since yesterday · Older posts ›
Without: suggestions are mixed in so the feed never runs out; the spinner promises one more item forever.
With: the feed shows what you follow, then says so. "Older posts" is still there for the person who chooses it.
Healthy defaults
Defaults are the strongest design decision you make, because most people never change them (Chapter 4). That cuts both ways: a healthy default protects everyone who never opens Settings. Practical healthy defaults: autoplay off; notifications off except ones the user explicitly creates (a reminder they set); feed sorted chronologically or bounded; daily summary rather than real-time pings; no badge on the app icon for non-obligations; session end markers on.
Do
Draw an explicit end to every list that represents "new since last time".
Make autoplay opt-in, and make "Play next" a deliberate tap.
Show timestamps and "nothing new" honestly to remove the slot-machine feel of refresh.
Measure success by outcomes ("finished reading", "tasks completed"), not minutes.
Don't
Mix suggestions into a feed to hide its end.
Randomize content order to make refresh feel rewarding.
Optimize for time-in-app unless time is literally the value (a meditation timer).
In the wild
Instagram "You're All Caught Up"Meta, 2018
A marker in the feed after you have seen all new posts from the past two days. Below it, the app later added suggested posts. A stopping cue is easy to add, and easy to undermine with what comes after it.
Netflix autoplay settingsNetflix, 2020
Netflix added settings to turn off autoplay of previews and of the next episode. Even attention businesses have moved toward user control of autoplay.
Reeder and RSS readersSilvio Rizzi and others
Chronological unread lists that end; marking all as read gives a clean empty state. A feed can be bounded by design.
For the solo creator
You probably do not sell ads, so you are free from the main pressure behind attention capture. Do not import its metrics by accident. If your analytics dashboard leads with "session length" and "DAU", replace them with outcome metrics that reflect the job your product does (articles finished, notes created, tasks done). What you measure becomes what you design for (see Testing & Iteration).
Common mistakes
Copying feed patterns into a tool
Feeds feel modern, so a notes or reading tool gets an "activity feed".
Ask whether the user needs a feed at all. Usually a bounded list with filters serves the job better.
Using engagement as a proxy for value
It is easy to measure.
Pick one outcome metric per core job and track it. Time can go down while value goes up.
A caught-up marker followed by more content
"They might keep scrolling anyway."
After the marker, show only a link. Let the person choose to go further.
Check yourself
Your podcast app's data shows that turning on autoplay of the next episode raised listening time 18%. What is the right decision for a calm product?
Listening time is not value. Some people want continuous play (on a long drive), so make it a visible, deliberate choice. Measure outcomes such as episodes finished from the user's own queue. (c) removes a genuinely useful feature.
Exercise 10.1 40 minutes · on your own product
Stopping cue audit
List every list, feed or sequence in your app.
For each, write where it ends and how the person knows.
Add a stopping cue where none exists (end marker, "caught up" state, session summary).
List your defaults for autoplay, notifications, badges and sorting; change any that favor time-in-app over the user's job.
You're done when: every sequence in your app has a designed end, and your default settings table is documented with reasons.
Beginner
Competent
Strong
Adds one end marker.
Covers every list and documents defaults.
Also replaces time-based metrics in your dashboard with outcome metrics.
11
Habits that serve: the "glad they did it" test
Taught by Nir Eyal and his critics, with BJ Fogg and James Clear
Habit-forming design is a tool, not a sin. The question is whose goal the habit serves. The test: a week later, would the person be glad they did it, and would they still choose it if they saw exactly how you designed it?
Nir Eyal's Hooked (2014) describes a four-step loop that many popular products share: a trigger (external, like a notification, then internal, like boredom or loneliness), an action (the simplest behavior done in anticipation of reward), a variable reward (of the tribe, the hunt, or the self), and an investment (the user puts something in, like data, content or followers, that makes the next loop more likely). The model drew on BJ Fogg's behavior model, which says a behavior happens when motivation, ability and a prompt converge at the same moment.
The book was widely used by startups, and widely criticized. Critics argued that it gave product teams a recipe for compulsion, especially the variable reward step, which borrows from the reinforcement schedules that make slot machines compelling. Eyal himself included an ethics section, the Manipulation Matrix, and later wrote Indistractable (2019), about how individuals can control their attention. That second book drew its own criticism: some argued it shifts responsibility for distraction from companies to users. You do not need to settle the debate to use its best part, which is the matrix.
The loop is neutral; the answers are not. A reminder the user set, an action they intended, a predictable useful result and an investment they can export is a healthy habit. Remove those and the same loop becomes capture.
The Manipulation Matrix
Eyal asks two questions of any habit-forming product: Would I use it myself? and Will it help users materially improve their lives? The four answers give four roles.
Aim for the top left. As a solo creator who builds for your own needs, you start with an advantage: you are a user. The second question still has to be answered with evidence, not hope.
The streak debate, as a worked example
Duolingo is the best-known example of streaks in a useful product. A streak counts consecutive days of practice; the app reminds you to keep it and lets you buy or earn "streak freezes" to skip a day without losing it. Duolingo has said publicly that streaks are one of its most effective features for retention. For a language learner, daily practice genuinely helps, so the habit serves a real goal. Critics point at the edge cases: people doing a 30-second lesson at 11:58 pm just to save the number, anxiety about losing a 400-day streak, notifications with guilt-laden copy. The number, at some point, becomes the goal instead of the learning.
Work through it with the glad test. Would the person be glad, a week later, that they did today's lesson? Mostly yes. Would they be glad they did a token lesson at midnight purely to save the count? Probably not; that is the streak serving itself. So an ethical streak design would: reward real practice (not the minimum tap), forgive misses (rest days, weekly goals), keep reminder copy factual rather than guilt-based, and let people turn streaks off without losing their learning history.
Captures
The number wins, the learning loses. The reminder exploits loss aversion at the worst moment and counts a token tap as practice.
Serves
The habit serves the goal. Weekly targets forgive a missed day, the reminder comes at a time the person chose, and the copy is factual.
Four questions for any habit feature
Whose goal is it? Did the user state this goal, or did you choose it for them?
Is the reward the value itself? Learning, a finished draft, a cleaner inbox, or a random hit of novelty?
Can they skip without punishment? Rest days, pause, forgiveness.
Can they leave with their investment? Export of history, notes, data.
Key idea
A good habit feature helps people do what they already wanted to do, more easily. A bad one makes them want what you wanted them to want.
Do
Let users set their own goals, times and frequency.
Use weekly or flexible targets instead of unbroken daily chains.
Reward meaningful completion, not the minimum tap.
Write reminders as facts, not threats.
Don't
Use loss framing ("your streak will die") in notifications.
Randomize rewards to make checking compulsive.
Lock a person's history behind continued use.
In the wild
Duolingo streaksDuolingo
Daily streak with freezes, reminders, and a famously persistent owl mascot. Habit design that supports a real goal, with edges worth debating.
Apple Fitness ringsApple Watch, 2015–
Daily ring goals the user can adjust; in later versions Apple added the ability to pause rings for rest or illness. A forgiving mechanism added after years of rigid streaks.
Tiny HabitsBJ Fogg, 2019
Fogg's method anchors tiny behaviors to existing routines and celebrates them; it is aimed at the person designing their own habits. Habit design can be done with the user, not to them.
For the solo creator
Write your product's "glad sentence": "A week later, my user is glad they ___." Every habit feature (streaks, reminders, badges, daily goals) must make that sentence more true. If a feature raises your retention chart but does not touch the sentence, cut it.
Common mistakes
Adding streaks because they "work"
Retention case studies are everywhere.
Streaks fit products where daily practice is the value (language, exercise). For a notes or reading tool, a streak often adds guilt and nothing else.
No exit from the habit
You never designed "turn this off".
Every habit mechanic needs an off switch that keeps the user's history intact.
Check yourself
You are adding a habit feature to your journaling app. Which design best passes the glad test?
Journaling's value is in the reflection, not the unbroken chain. (b) helps the person do what they intended at a time they chose and shows progress without punishment. (c) is a variable reward; (d) adds social pressure to a private act.
Exercise 11.1 35 minutes · on your own product
Glad-test your habit mechanics
Write your product's glad sentence.
List every mechanic that brings people back: reminders, streaks, badges, emails, counters.
For each, answer the four questions (whose goal, real reward, skip without punishment, leave with investment).
Redesign or delete any mechanic that fails two or more.
You're done when: you have a glad sentence, a scored table of mechanics, and one mechanic redesigned or removed.
Beginner
Competent
Strong
Writes the glad sentence.
Scores all mechanics honestly.
Ships a redesign and asks three real users whether they are glad they used the app last week.
12
A notification policy for your app
Taught by Amber Case, with Apple's and Google's platform guidelines
A notification spends someone else's attention. Decide in writing which events deserve that spend, at what level, at what time, and how often, before you write a single push. Then let the user tighten it further.
Every notification is an interruption, and interruptions have a cost beyond the seconds it takes to read them: the person loses their place in whatever they were doing and has to rebuild it. A notification that is useful pays that cost back. One that is promotional, vague or badly timed does not, and the person learns a lesson: this app's pings are noise. After enough of those they turn notifications off entirely, and now your genuinely important messages cannot reach them either. Notification abuse destroys the channel.
Step 1: classify every event
Before designing any push, list every event your system could notify about and put each in one of three classes. Be strict.
Class
Definition
Examples
Delivery
Critical
The user will be harmed or will miss something they explicitly asked for if they don't know now.
Payment failed and access ends tomorrow; a reminder they set; security alert (new login); a message from a person in a 1:1 chat.
Immediate. May break through quiet hours only if the user allowed it (for example iOS "Time Sensitive").
Useful
Good to know, not urgent. The user would want it eventually.
Export finished; a shared document was edited; weekly summary; new comment on your post.
Batched into a digest, or delivered silently to the notification center.
Promotional
Benefits you more than the user right now.
New feature; sale; "we miss you"; "complete your profile"; tips.
Not a push. Use in-app "What's new", a changelog, or opt-in email.
The policy is a filter in code. Implement it as a single function every notification passes through, so a hurried feature cannot bypass it.
Step 2: batching, digests and quiet hours
Batching combines several useful events into one ("3 comments on 'Draft 2'") instead of three pings. A digest delivers all useful events at a predictable time the user chooses. Quiet hours hold everything except critical events during the user's night and focus times. Apple built two of these into the system in iOS 15 (2021): the Scheduled Summary, which collects non-urgent notifications into a summary at set times, and Focus modes, which filter notifications by context. Apps can mark notifications with an interruption level (passive, active, time-sensitive, critical), and the system respects the user's settings. Android has had notification channels since Android 8 (2017), so users can turn off one category without silencing the whole app.
One day of notifications from a notes app
21:47
N
You have new activity!Tap to see what's happening.
21:47
N
We miss youIt's been 2 days. Your notes are waiting.
20:00
N
New: Templates!Try our 40 new templates now.
18:12
N
Asha edited "Trip plan"
16:03
N
Asha edited "Trip plan"
16:04
N
Weekend sale: 40% off ProEnds Sunday!
11:30
N
Export readynotes.zip is ready to download.
09:15
21:47
N
Reminder: call the landlordYou set this for 18:00.
18:00
N
Your evening summary
Asha edited "Trip plan" (2 changes)
Your export notes.zip is ready
19:00
Feature news and offers live in the app's "What's new". Nothing else today.
Noisy: seven pings, four of them promotional, two duplicates, one vague. The one the user needed (the export) is buried, and the late "new activity" ping arrives during the evening.
Calm: one reminder the user created arrives on time. Useful events are batched into one summary at a chosen hour. Promotion never reaches the lock screen.
Step 3: ask for permission at the right moment
On iOS the system permission prompt can be shown only once per app; if the user says "Don't Allow", only Settings can change it. On Android 13 and later, notifications also need a runtime permission. So when you ask matters enormously. Asking on first launch, before the person has any idea why you need it, wastes your one chance and trains a reflexive "no". Ask when the person does something that needs notifications (sets a reminder, follows a thread), and explain the value in one sentence first. iOS also offers provisional authorization (since iOS 12): your app can deliver notifications quietly to the notification center without asking, and the person can choose to keep or turn them off from the notification itself.
Ask at the moment of need. The person can see the trade they are making, and a "yes" given then is a real yes.
Lab: what your notifications cost your users
0
minutes of attention per user per week
0
pings per user per week that were not useful
0
hours per week across all your users
This is simple arithmetic with your own assumptions, not a research result. Set "seconds lost" to what you believe a ping costs, including getting back to the task. Then drop the useful share to see the waste, or cut pushes to two a day to see what a digest buys back.
Step 4: write it down
Here is a policy template you can adapt. Keep it in your repository next to the notification code.
NOTIFICATION POLICY · Shelf (v1)
Critical (push now): reminders the user set; payment failed;
new sign-in from unknown device. Max ~1/day.
Useful (digest 19:00, user can change): edits to shared notes,
exports ready, comments. Batched. Silent delivery.
Promo (never push): features, offers, tips → "What's new".
Quiet hours: 22:00–08:00 local; only reminders the user set.
Permission: ask when first reminder is set. Never on launch.
No: "we miss you", streak threats, vague "new activity".
Every push names the specific thing and opens it directly.
Key idea
A notification should be something the person would have asked for, if they had known it was coming.
Do
Classify every event; implement the policy as one function.
Name the specific thing ("Asha edited 'Trip plan'"), and deep-link straight to it.
Give users per-category controls, and respect the system's Focus and summary settings.
Ask for permission in context, after explaining the value.
Don't
Send marketing as push.
Send vague pings ("You have new activity") designed to make people open the app.
Mark ordinary pushes as time-sensitive to break through Focus.
Send re-engagement guilt ("We miss you").
In the wild
iOS Scheduled Summary and FocusApple, iOS 15, 2021
System-level digests and context filters; apps declare interruption levels. Apple's guidelines say time-sensitive should be reserved for events that need attention now. The platform is designed for calm; don't fight it.
Each app category becomes a separate switch the user controls. Design your categories so users can silence promotion without losing critical alerts.
Slack notification scheduleSlack
Users can set hours when notifications pause, and the app shows others that you are not being notified. Quiet hours can also be a social signal (principle 8).
For the solo creator
Ship with fewer notification types than you think. Start with only the reminders the user sets plus one critical class (billing or security). Add a digest later if users ask. Every type you add needs copy, settings, testing and support, and it is far easier to add a notification later than to win back someone who turned them all off.
Common mistakes
Asking for permission on first launch
The template or tutorial puts it in the app delegate.
Move the request to the first moment of need, after an explanation in your own UI.
One notification per event
The code fires on each database change.
Debounce and batch: collect events for a window (a few minutes for collaboration, a day for summaries).
Using email as a loophole
Push is restricted, so promotion moves to daily email.
Apply the same policy to email: opt-in, specific, with one-click unsubscribe.
Check yourself
Your habit app's push open rate is falling. A growth tutorial suggests sending a push titled "Something new is waiting for you...". What should you do?
A falling open rate means users have learned your pings are noise. Vague curiosity bait accelerates that and pushes people to disable notifications entirely. Fewer, specific notifications restore trust in the channel.
Exercise 12.1 60 minutes · on your own product
Write and implement your notification policy
List every event that currently sends a push or email.
Classify each as critical, useful or promotional. Move every promotional one out of push.
Write a policy in the template format above: classes, digest time, quiet hours, permission moment, banned patterns.
Implement a single shouldNotify(event, user) function that every notification passes through.
You're done when: the policy file is in your repo, every push goes through one function, and you have moved permission prompting to a moment of need.
Beginner
Competent
Strong
Classifies events.
Writes the policy and removes promotional pushes.
Implements the policy function with quiet hours and batching, and adds per-category user controls.
Part 2 recap: connect the ideas
You want people to read more in your reading app. Which plan combines Part 2's ideas best (calm periphery, emptiness, stopping cues, glad test, notification policy)?
(c) respects the user's goal (they choose the time), keeps status peripheral, gives an honest ending, and uses one batched summary instead of pings. It would pass the glad test. (a) removes stopping cues and adds guilt; (d) adds social pressure; (b) ignores that good design can help people do what they want.
Part three
Trust: data, money and the future
People hand your product three things they cannot easily take back: their data, their money and their time invested in your format. This Part covers privacy by design and local-first software, everyday honesty in progress bars, pricing, social proof and change logs, and the longest-term respect of all: building software and files that last, on pages and devices that do not waste energy or force upgrades.
13
Privacy by design
Taught by Ann Cavoukian, with the GDPR and Apple's and Signal's practice
The most private data is data you never collect. Collect the minimum, keep it for the shortest time, process it on the device when you can, explain it in plain words, and let people take it with them or delete it themselves.
Ann Cavoukian, then Information and Privacy Commissioner of Ontario, developed "Privacy by Design" in the 1990s and published its seven foundational principles in 2009. Among them: be proactive, not reactive; make privacy the default setting; embed it into the design; aim for full functionality (positive-sum, not privacy versus features); protect data through its whole life cycle; be visible and transparent; and keep it user-centric. The EU's GDPR made a version of this law in 2018 as "data protection by design and by default", alongside the principle of data minimization: collect only what is adequate, relevant and limited to what is necessary for the purpose.
Why should a solo creator care beyond compliance? Because every field of personal data you store is a liability: something to secure, back up, disclose in a breach, answer requests about, and explain. Data you never collect cannot leak. Minimization is the rare principle that is both more ethical and less work.
The data ladder
Every rung down adds risk and work. Most indie products can live on rungs 1 to 4. If a feature needs rung 5, question the feature.
Clear permissions and honest sign-in
Ask for system permissions (contacts, location, photos, camera) only when a feature needs them, and ask for the narrowest version: "selected photos" rather than the whole library, "while using the app" rather than "always", approximate rather than precise location when that is enough. Both iOS and Android now offer these narrower choices; design your feature so it works with them. For sign-in, offer options that do not force more data than needed: email with a magic link, Sign in with Apple (which lets people hide their real email behind a relay address), or no account at all for a local app. Do not demand a phone number or social login to use a notes app.
Consent banners: the classic battleground
Cookie banners are where privacy and deceptive design meet most visibly. The honest move for most small products is to not need one: use privacy-friendly, cookieless analytics (or none), no ad trackers, and no third-party embeds that set cookies. If you do need consent, make it a real choice. Try both versions below with the same task.
Lab: reject non-essential cookies
Taps 0Screens 1Words to read 0
Try both banners to compare.
Your task: refuse everything except strictly necessary cookies. In the manipulative version, notice the pre-enabled toggles, the separate "legitimate interest" screen, and how "Accept all" follows you on every screen.
Don't
Collecting "just in case". Every field is a liability and a reason to abandon sign-up.
Do
Ask for data when a feature needs it. Value first, account later, and a plain statement of what you keep.
Labels, export and delete
Since December 2020 Apple's App Store requires a "privacy nutrition label" for each app, summarizing what data is collected and whether it is linked to the user or used for tracking. Google Play added a similar Data safety section in 2022. Since iOS 14.5 (2021), App Tracking Transparency requires apps to ask before tracking users across other companies' apps and websites. Since mid-2022, Apple requires apps that let people create an account to also let them delete it from within the app. Treat these as a floor for the web too: publish a short, plain privacy page that matches your label, offer a self-serve export in an open format, and a self-serve delete that really deletes (after a short, stated grace period if you want one).
Do
Write a one-screen privacy summary in plain words: what you collect, why, where it lives, for how long.
Use cookieless analytics or none; avoid ad SDKs.
Ask for the narrowest permission at the moment of need.
Offer export (open format) and delete (self-serve) in Settings.
Don't
Collect fields "for later" or "for personalization" without a feature that needs them today.
Bundle consent for different purposes into one checkbox.
Make "Reject" harder than "Accept" on a banner.
Keep data after account deletion beyond what law requires.
In the wild
SignalSignal Foundation
Designed to know as little as possible; Signal has published legal responses showing it could provide only very limited account metadata, such as when an account was created and last connected. Minimization as architecture, not policy.
Plausible and FathomPrivacy-focused analytics
Cookieless web analytics that count visits without personal profiles, which typically lets a site avoid a cookie banner for analytics. The best banner is no banner.
Sign in with AppleApple, 2019
Offers "Hide My Email", a relay address unique to each app. Honest sign-in options let people share less.
Apple PhotosApple
Recognizes people and objects in photos on the device itself. On-device processing gives a smart feature without sending private data to a server.
For the solo creator
Your privacy policy should be short enough that you can keep it true. Write it from your actual data model: open your database schema and list every table that holds personal data. If you cannot explain why a column exists, delete the column. You will sleep better, and your privacy label will be honest because it is simple.
Common mistakes
Analytics SDKs that collect more than you know
You added a crash reporter and an analytics SDK with default settings.
Read what each SDK collects, turn off what you do not need, and reflect it in your privacy label.
"Delete" that only deactivates
Soft-delete is easier to implement.
Schedule a real purge after a stated grace period, including backups within your retention window, and say so.
A banner nobody needed
You copied a consent plug-in from a template.
Remove the trackers and you can usually remove the banner.
Check yourself
Your recipe app wants to suggest recipes based on what is in season near the user. What is the most privacy-respecting design?
The feature needs a region, not coordinates. (b) climbs the data ladder: user choice or approximate, on-device, minimal, at the moment of need. The others collect far more than the feature needs.
Exercise 13.1 60 minutes · on your own product
Data inventory and one-screen privacy summary
List every piece of personal data your product touches (database, logs, analytics, crash reports, payment provider, email tool).
For each, write: purpose, rung on the data ladder, where it lives, how long you keep it.
Delete or move up the ladder at least one item.
Write a one-screen privacy summary in plain words and check that your store privacy label matches it.
You're done when: you have the inventory table, one item removed or moved up, and the summary published in your app or site.
Beginner
Competent
Strong
Lists database fields.
Includes third-party tools and retention, and publishes the summary.
Also ships self-serve export and delete, and removes the cookie banner by removing trackers.
14
Local-first: you own your data
Taught by Ink & Switch (Martin Kleppmann, Adam Wiggins, Peter van Hardenberg, Mark McGranaghan)
In local-first software the primary copy of your data lives on your own device, and the cloud is a helper for sync and backup, not the owner. It is the strongest structural form of respect: the app stays fast, works offline, and keeps working even if the company disappears.
In 2019 the research lab Ink & Switch published an essay, "Local-first software: You own your data, in spite of the cloud". The authors observed that cloud apps (like Google Docs) made collaboration easy but took away ownership: if the service goes down, changes its terms or shuts down, your work goes with it. Old-fashioned desktop apps with files gave you ownership but made collaboration hard. They proposed a goal that combines both, and described it with seven ideals.
#
Ideal (Ink & Switch, 2019)
What it means for your design
1
No spinners: your work at your fingertips
Reads and writes hit local storage; the UI never waits on the network to show your own data.
2
Your work is not trapped on one device
Sync across devices is a feature, not an afterthought.
3
The network is optional
Full editing offline; sync when connected.
4
Seamless collaboration with your colleagues
Concurrent edits merge (for example with CRDTs) instead of producing conflicts.
5
The Long Now
Data stays readable for decades, independent of your company.
6
Security and privacy by default
End-to-end encryption is natural when servers only relay.
7
You retain ultimate ownership and control
Users can copy, export, modify and delete without asking permission.
Move the truth to the person. In local-first, each device holds a full copy; the server's job shrinks to relaying changes and backup, which also makes end-to-end encryption easier.
You don't have to go all the way
Full local-first with real-time collaboration is still hard engineering (libraries such as Automerge, from Ink & Switch, and Yjs help). But you can take most of the benefit with simpler moves: store user documents as plain files the user can see (Markdown, JSON, SQLite); cache everything locally and render from cache; queue writes offline; sync files through a service the user already owns (iCloud Drive, Dropbox); and make export a first-class feature. Each move climbs toward ownership.
Don't
Cloud as owner. The person's own writing is unavailable because a server is.
Do
Device as owner. The network status lives in the periphery and nothing waits on it.
Do
Render user data from local storage first, always.
Prefer formats users can open without you: Markdown, plain text, CSV, JSON, SQLite, standard image and audio formats.
Design an explicit offline experience (Chapter 8, principle 6).
Write down what happens to user data if you stop working on the product.
Don't
Gate reading your own data behind a network request.
Invent a proprietary format when an open one fits.
Promise "you own your data" while offering no export.
In the wild
ObsidianDynalist Inc., 2020–
Notes are a folder of Markdown files on your disk; sync is an optional paid service, and you can use your own. The file system as a promise: you can leave any day with everything.
iA WriterInformation Architects
Works on plain text Markdown files in folders you choose, synced through services like iCloud or Dropbox. A writing app that does not own your writing.
Actual BudgetOpen source, local-first
A personal budgeting app built local-first, with optional sync and the option to self-host. Local-first works for serious, everyday tools, not only research demos.
For the solo creator
Local-first is also operationally kind to you. Fewer server round-trips means fewer outages to wake up for, lower hosting bills, and a product that keeps working while you are on holiday. If you are starting a new tool for individuals, start from files or SQLite on the device and add sync later.
Common mistakes
"Offline mode" as a read-only cache
Write sync is harder than read caching.
Queue writes locally with clear status. Even last-writer-wins with conflict copies beats blocking the user.
Open format, closed metadata
Notes are Markdown, but tags, links and attachments live only in your database.
Store metadata in the files (front matter) or include it in export.
Check yourself
You are building a journaling app for individuals. Which architecture best fits the seven ideals with reasonable solo effort?
(d) gives speed, offline work, multi-device sync, privacy and ownership. (c) is local but traps data in your format, failing "the Long Now" and ownership.
Exercise 14.1 45 minutes · on your own product
Seven-ideals scorecard
Score your product 0 to 2 on each of the seven ideals.
For each score below 2, write the smallest change that would raise it by one.
Answer in writing: "If I stopped working on this tomorrow, what happens to my users' data?"
Implement the cheapest improvement (often: export to an open format).
You're done when: you have a scored table, a written "if I stop" answer you would be comfortable publishing, and one improvement shipped.
Beginner
Competent
Strong
Scores the ideals.
Ships export or offline editing.
Publishes the "if I stop" commitment on your site and designs the offline state fully.
15
Honesty in everyday interface
Taught by Dieter Rams, with Brad Myers and indie practice
Trust is built in small, repeated moments: a progress bar that tells the truth, a price that does not change, a change log that admits what broke, a feature retired with notice and an export. None of these are hard. All of them are noticed.
Honest progress
Brad Myers showed in 1985 that people prefer having a progress indicator during long waits. Progress bars are among the most common "small lies" in software: a bar that races to 90% and then sits there, a fake multi-step "Analyzing your profile…" animation for something that took 50 ms, a spinner with no end. Some deliberate slowdowns are defended as making a result feel more valuable ("labor illusion"). The honest line: a waiting indicator should reflect real work. If you know the steps, show them. If you do not know the duration, say what is happening instead of faking a percentage. If the work is instant, show the result instantly.
Exporting 1,204 notes
Exporting…
0%
Exporting 1,204 notes
Ready to start
1. Writing notes as Markdown
2. Copying 86 attachments
3. Compressing to .zip
Fake: the bar jumps to 90% quickly, then stalls with no explanation. People start wondering if it crashed.
Honest: the bar is driven by real counts, and the current step is named. Slow parts are explained, so waiting feels safe.
Fair pricing and easy cancellation
Chapter 5 covered cancellation. Fair pricing is its twin: prices that are easy to compare, renewal terms visible before purchase, reminders before renewal, no surprise price rises (announce them in advance and honor the old price until renewal at least), and a plain refund policy. Many indie products also offer a lifetime or one-time purchase option, or "pay once for this version" models, which remove subscription anxiety entirely (see Identity & Launch for pricing pages).
Transparent changes: changelogs
A changelog is a trust device. It shows the product is alive, admits fixes ("Fixed a bug where search skipped notes with emoji titles"), and warns of changes before they surprise people. Good changelogs are dated, specific, written for users not developers, and honest about removals and regressions. Bad ones say "Bug fixes and performance improvements" every time, which tells the user nothing and, over the years, reads as concealment.
Don't
Silence is a decision. People discover the removal on the day they need it.
Do
Specific, dated, and honest about the hard part. A paywall change announced months ahead is a business decision; announced never, it is a betrayal.
Sunsetting features (and products) responsibly
Every product eventually removes things. How you do it says everything about you. Google Reader's shutdown in 2013 is the classic case: announced in March, closed on 1 July, with an export through Google Takeout. People were upset, but they could leave with their subscriptions in a standard format (OPML), which is why a new generation of RSS readers could import them. A responsible sunset has five parts.
Notice. Announce early (months, not days), in the app and by email, with a date.
Reason. Say why, briefly and truthfully.
Export. Provide a full export in an open format, and keep it working until after the shutdown date.
Alternatives. Point to replacements, including competitors if needed.
Money. Refund unused prepaid time, pro rata.
Do
Drive progress indicators from real work, and name the step.
Announce price rises in advance; honor the old price until renewal.
Write specific, dated changelogs, including removals and regressions.
Plan sunsets with notice, reason, export, alternatives, refunds.
Don't
Fake progress or add theatrical delays.
Quietly remove or paywall features.
Write "bug fixes and improvements" for a release that changes behavior.
Shut down without an export.
In the wild
Google Reader shutdownGoogle, 2013
About three and a half months' notice, with export via Takeout in OPML. An open export format turned a shutdown into a migration.
Linear changelogLinear
A frequent, specific, illustrated public changelog. A changelog can be a calm, steady trust signal and a marketing asset.
Sketch and other "keep this version" licensesVarious indie and pro apps
Some apps let you keep using the last version you paid for when a subscription or update license lapses. Fair pricing can leave people with something when they stop paying.
For the solo creator
Write the changelog as you work, not at release. Keep a CHANGELOG.md open; every merged change gets one plain sentence. At release time you edit, not invent. And write your sunset plan now, while the product is healthy: a one-page document that says how you would shut down. It forces export to exist.
Common mistakes
Spinner for everything
It is the default component.
Use determinate progress when you know counts, a named step when you do not, and nothing for anything under about a second (see Motion & Feel on perceived speed).
Grandfathering forgotten
The new price applies to everyone because billing is simpler that way.
Give existing customers at least one renewal at the old price, with notice.
Check yourself
Your AI summary feature returns in 0.4 s. A friend suggests a 3-second "Analyzing… Reading… Thinking…" animation so users value it more. What do you do?
A fake wait is a small lie and a real cost (3 seconds of each user's time, every use). The honest way to show value is to state real work. Speed is itself a quality signal.
Exercise 15.1 45 minutes · on your own product
Trust details sweep
Find every progress indicator. Mark each as real, estimated or fake. Fix the fakes.
Rewrite your last three release notes to be specific and honest.
Write a one-page sunset plan for your product (notice, reason, export, alternatives, money).
You're done when: no fake progress remains, three changelog entries are rewritten, and the sunset plan exists in your repo.
Beginner
Competent
Strong
Fixes one progress bar.
Completes all three tasks.
Publishes the changelog and a short "our promise if we shut down" page.
16
Longevity: software that lasts
Taught by Dieter Rams, with Donald Knuth, Low-tech Magazine and the Sustainable Web Design community
Long-lasting design avoids fashion, keeps people's work readable for decades, runs on the devices they already own, and wastes neither energy nor attention. Maintenance is a form of respect: it says "I am still here, and your trust is still safe."
Rams's seventh principle says good design is long-lasting: it avoids being fashionable and therefore never appears antiquated. His ninth says good design is environmentally friendly: it conserves resources and minimizes physical and visual pollution through the product's life. Braun products he designed in the 1960s still look current and many still work. Software decays faster, but not by necessity. Most software rot comes from three choices: trendy styling, closed formats, and growing weight that pushes older devices out.
1 · Files that outlive the app
The single most important longevity decision is the format of the user's work. A plain text file from 1975 opens today on any computer. A document in a proprietary format from a dead app from 2010 may not open anywhere. Open, documented, widely implemented formats outlive companies.
The format is the promise. Users trust tools whose files they could open without the tool.
2 · Style that does not date
Trends in UI come in waves: heavy skeuomorphism, then extreme flat, then neumorphism, glassmorphism, gradient blobs, and whatever is fashionable this year. Each looks fresh for a year or two and then marks the product as "from that year". Timeless interfaces lean on typography, spacing, clear hierarchy and system conventions rather than surface effects. You can still have personality, but put it where it ages well: in words, in a well-chosen typeface, in a single accent color, in thoughtful details.
Dates fast
A style is a timestamp. Effects chosen for fashion will read as "2021" or "2025" soon; they also often hurt contrast.
Lasts
Type, space, hierarchy. This card could have shipped in 2012 or 2032. Its quality is in the clarity, not the surface.
3 · Light pages and the energy of software
Digital products use energy: in data centers, networks and especially in the devices that download and run them. Heavier pages and apps cost energy, data plans (a real expense for many users in India and elsewhere) and battery, and they push older devices out sooner. The HTTP Archive's measurements show the median web page has grown to over 2 MB. A text-centric product rarely needs more than a fraction of that. Practical moves: compress and size images, avoid autoplaying video, use system fonts or a small number of subsetted webfonts, ship less JavaScript, cache well, and lazy-load what is below the fold.
Most weight is optional. For reading products, text is tiny; images and scripts are where the weight, energy and slowness come from.
Myth
"Dark mode saves lots of battery." On OLED screens dark pixels do use less power, but a 2021 Purdue University study found the savings at typical indoor brightness were only a few percent, and much larger only at high brightness. Offer dark mode because people like it and it suits low light, not as a big green win. Page weight and CPU work usually matter more.
4 · Support older devices
Every time an app drops support for an older OS or a slower phone, some people are pushed to buy new hardware or lose access. Hardware manufacturing is where much of a device's lifetime carbon footprint comes from, so keeping old devices useful is one of the most effective environmental moves software can make. Check your analytics for the oldest OS versions and slowest devices in real use, test on a cheap or old phone regularly, and drop support only with notice and a reason.
5 · Finished software and maintenance as respect
There is a quiet tradition of software that is allowed to be finished. Donald Knuth froze TeX's features decades ago; new versions only fix bugs, and the version number converges toward π (3.14159265…), a joke that is also a philosophy. Many small Unix tools have done one job unchanged for decades. "Finished" does not mean abandoned: it means feature-complete, with ongoing maintenance (security fixes, OS compatibility, bug fixes). For a solo creator, deciding that your product's core is finished can be the most respectful thing you do: users get stability instead of churn, and you get time to maintain it well.
Key idea
Open formats, timeless style, light weight, old devices welcome, and a product allowed to be finished. That is long-lasting design in software.
Do
Store and export user work in open, simple formats.
Set a page-weight and bundle-size budget and check it in CI.
Test on an old, cheap device every release.
Decide what "finished" means for your core and protect it from churn.
Don't
Redesign for fashion every year.
Ship autoplay video, huge hero images or several webfonts on reading pages.
Drop older OS versions just to use a new API you could do without.
Rewrite stable features because they are boring to you.
In the wild
Low-tech MagazineSolar-powered website, 2018–
A site served from a small solar-powered server, with dithered images and a static design to keep pages tiny; it can go offline in long cloudy spells. A vivid demonstration of how small a good reading page can be.
TeXDonald Knuth, 1978–
Feature-frozen for decades, still maintained, with documents from the 1980s still compiling. Finished software, maintained, is a gift to users.
CraigslistSince 1995
Barely changed visually in decades and fast on any device. You don't have to copy its look; notice that people never had to relearn it.
For the solo creator
Longevity is the solo creator's natural advantage. You will not out-feature a funded competitor, but you can out-last them: simple files, small codebase, few dependencies, slow and careful change. Every dependency you avoid is one that cannot break your app in five years.
Common mistakes
Redesigning when bored
You look at your app every day; users do not.
Change things when users struggle, not when you are tired of them.
Dependency sprawl
Each library saves an hour today.
Prefer platform features and small, stable libraries; each dependency is a future maintenance task.
Only testing on your new phone
It is the device you own.
Keep an old, cheap device on your desk and use it weekly.
Check yourself
You are choosing how to store documents in a new writing app. Which choice best serves longevity?
Markdown with front matter is open, human-readable, widely supported and diffable. (b) and (d) trap data in your code; (c) traps it on your server.
Exercise 16.1 60 minutes · on your own product
Longevity audit
Formats: list where user work is stored and in what format. Can a user open it without your app?
Weight: measure your main page or app bundle size and set a budget (for example, 300 KB for a reading page).
Devices: find your oldest supported OS and test there.
Style: list any visual effects you added because they were trendy; decide whether each earns its place.
You're done when: you have a four-part audit, a weight budget written down, and one improvement shipped (an export, a smaller bundle, or an old-device fix).
Beginner
Competent
Strong
Measures page weight.
Completes the four-part audit and sets a budget.
Adds a size check to your build, and publishes a "how long we support devices" note.
Part 3 recap: connect the ideas
Which single product decision supports privacy (Ch. 13), local-first ownership (Ch. 14), honest sunsetting (Ch. 15) and longevity (Ch. 16) all at once?
Open local files minimize what you hold (privacy), keep ownership with the user (local-first), make any shutdown survivable (sunset), and keep work readable for decades (longevity). One architectural choice, four kinds of respect.
Part four
Responsibility: harm, and your own oath
The last Part widens the view from the user in front of you to everyone your product touches: the person who might be tracked through a sharing feature, the child who downloads your app, the stranger who receives a message. Then it narrows to you: one person who is designer, engineer and business at once. You will finish by writing your own design oath and an ethics and trust checklist to run before every release.
17
Safety by design: abuse, moderation and kids
Taught by Eva PenzeyMoog, with Australia's eSafety Commissioner and the UK ICO
Every feature that connects people, shares data or shows location can be used to hurt someone. Design for the abuser as a user persona, make the safe choice the default, and give the person at risk the tools to see and stop what is happening.
Eva PenzeyMoog's Design for Safety (2021) starts from a hard fact: technology is routinely used in domestic abuse, through shared accounts, location sharing, smart home devices, shared calendars, and access to someone's phone. Most product teams design only for well-meaning users and treat abuse as an edge case. PenzeyMoog's method is to add an abuser persona and a survivor persona to your design process and walk every feature through their eyes. Australia's eSafety Commissioner promotes a similar "Safety by Design" approach built on three principles: service provider responsibility, user empowerment and autonomy, and transparency and accountability.
Abuse vectors in ordinary features
Feature
How it can be abused
Safer design
Location sharing
A partner silently tracks someone; sharing turned on once is forgotten.
Visible, persistent indicator; periodic reminders that sharing is on; easy one-tap stop; time-limited sharing by default.
Shared accounts and family plans
The account owner sees everything another member does.
Separate private spaces; clear statement of what the owner can see; ability to leave a shared plan without the owner's approval.
Read receipts, "last seen", activity status
Monitoring and pressure to respond.
Off by default or reciprocal; easy to hide.
Comments, messages, mentions
Harassment, pile-ons, unwanted contact.
Block that really blocks, mute, limit who can reply, rate limits for new accounts.
Public profiles and activity maps
Revealing home address or routines.
Private by default; strip location metadata from photos; privacy zones around home.
Invites and shared documents
Spam, or regaining access after a breakup.
Owner can see and revoke all access; access logs; notify when someone is added.
The abuser is a user too. If a feature works perfectly for the intended user but silently for the abuser, it is not finished.
Don't
Silent and permanent. Convenient for the intended user, perfect for the abuser.
Do
Visible, temporary, revocable. The person always knows, and the default ends by itself.
Moderation for small apps
If your product lets people send anything to other people (comments, messages, shared links, public profiles), you are running a small moderation operation whether you planned to or not. Big platforms have teams; you have yourself. So design to reduce how much moderation you need. Prefer private and invite-only spaces over public ones. Slow down new accounts (rate limits on messages and invites). Make block and report one tap away, and make block mean the blocked person cannot see or contact the blocker. Write short, plain community rules. Keep a simple review queue, and decide in advance how you will handle illegal content (in many countries you must act on reports and, for some content like child sexual abuse material, report it to authorities). Consider not building the social feature at all: a sharing link that the user sends through their own messaging app avoids an entire category of harm.
Children
Children are in your audience if your product is likely to be used by them, even if it is "not for kids". The UK's Age Appropriate Design Code (the "Children's code", in force since 2021) sets 15 standards for online services likely to be accessed by children, including high-privacy defaults, location off by default, no nudge techniques that encourage children to weaken privacy, and minimal data collection. In the US, COPPA requires verifiable parental consent before collecting personal information from children under 13. India's DPDP Act, 2023 treats anyone under 18 as a child and requires verifiable parental consent for processing their data, and bars tracking and targeted advertising directed at children. The design response is the same everywhere: high-privacy defaults for everyone, no dark patterns, no public profiles by default, and no engagement mechanics designed to keep young people hooked.
Do
Add abuser and person-at-risk personas to every feature that shares, connects or locates.
Make sharing visible, time-limited and revocable.
Ship block, mute and report with any feature that lets people reach each other.
Default to high privacy for everyone, which also protects children.
Don't
Treat abuse as an edge case to handle later.
Build public social features you cannot moderate.
Let one account holder silently see another member's private data.
Use engagement mechanics in products likely to be used by children.
In the wild
AirTag unwanted tracking alertsApple, 2021–2024
After reports of AirTags used for stalking, Apple added alerts for unknown trackers traveling with you and an Android app to scan for them; in 2024 Apple and Google shipped cross-platform alerts based on a shared specification. A safety layer added after harm; you can design it in from the start.
Strava heatmap2018
A public global heatmap of activities revealed the layout of sensitive military sites from soldiers' runs. Strava has offered privacy controls such as hiding the start and end of activities near home. Aggregated "harmless" data can expose people.
Signal and WhatsApp group controlsMessaging apps
Settings that control who can add you to groups, with invitations instead of automatic adds in some configurations. Consent before contact is a safety feature.
For the solo creator
Your best safety tool is scope. Every social, public or location feature you skip is a moderation and safety burden you never carry. When you do add one, add the safety controls in the same release, not "later". And write down, now, what you will do the first time someone reports abuse: who you contact, what you remove, how fast.
Common mistakes
Block that doesn't really block
It hides the blocked person's content from you but still lets them see and contact you.
Make blocking two-way for contact and visibility, and do not notify the blocked person.
Public by default
It helps growth and discovery.
Private by default; let people choose to publish specific things.
Account recovery as an attack
Recovery by "answering a question" or a shared email lets a former partner take over.
Notify on recovery attempts, show active sessions, let people sign out other devices.
Check yourself
You are adding "shared shelves" to your reading app so couples can see each other's books. What is the most important safety addition?
In a relationship that turns controlling, the person at risk needs to control their own sharing and to leave quietly. (b) and (d) give the more controlling member visibility by default.
Exercise 17.1 45 minutes · on your own product
Abuser persona walkthrough
List every feature that shares data, connects people, or reveals activity or location.
For each, write how an abusive partner, a harasser and a curious stranger could misuse it.
Write what the person at risk would need to notice and stop it.
Ship one fix (indicator, time limit, block, revoke access, private default).
You're done when: you have a misuse table for every connecting feature and one safety fix shipped; or a written decision not to build a social feature, with the reason.
Beginner
Competent
Strong
Lists features and obvious misuses.
Covers three abuser types and ships a fix.
Also writes an abuse-report response plan and tests account recovery for takeover risk.
18
Ethics for one: your oath and your checklist
Taught by Mike Monteiro, with Dieter Rams and everything in this guide
When you are the designer, the engineer and the business, nobody else will stand up for the user in the room, because the room is your head. Write your principles down while you are calm, turn them into a checklist, and run it before every release.
Mike Monteiro, a designer and co-founder of the studio Mule Design, has argued for years that designers are responsible for the work they put into the world, and that "I was just doing my job" is not a defense. His 2013 talk "How Designers Destroyed the World" and his 2019 book Ruined by Design make the case that design decisions have consequences at scale, and he published "A Designer's Code of Ethics" in 2017, which begins from the idea that a designer is first a human being, and only then a professional. In a team, the designer often plays the user's advocate against business pressure. Alone, you play both roles. That is harder than it sounds, because the business side of you always has a number to point at and the user side only has a feeling.
Pre-commitment is the solo designer's ethics team. Decide your red lines while calm, so you do not have to argue with yourself when revenue is down.
Write your oath
A design oath is a short list of commitments specific enough to decide real cases. "Be ethical" decides nothing. "Cancelling takes no more taps than subscribing" decides a lot. Write seven to ten lines, each a rule you could check. Here is an example drawn from this guide; adapt the wording, keep the specificity.
MY DESIGN OATH (Rohit, v1)
1. The first price a person sees is the price they pay.
2. Saying no, leaving and deleting take no more effort than
saying yes, joining and creating.
3. Nothing optional is pre-selected.
4. I never show numbers, deadlines or reviews that are not true.
5. Pushes are for things a person asked for. Promotion never is.
6. Every list has an end. Every session can finish.
7. I collect the minimum, keep it short, and let people export
and delete it themselves.
8. People's work lives in open formats they can open without me.
9. I walk every sharing feature through an abuser's eyes.
10. If I shut down, I give notice, export and refunds.
Saying no to features that harm
Some requests will come from users ("let me see when my partner reads my messages"), some from your own growth instincts ("import contacts to grow"), some from partners ("add our SDK"). For each, look for the legitimate need under the request, and design for that need without the harm. Often there is a version that gets most of the business value honestly.
As requested
The request as written. Real business goal (growth), harmful mechanism.
Reframed
The need, without the harm. Word of mouth that the user controls is slower to start but trusted.
Three habits that keep you honest
The pre-ship checklist. Run the checklist below before every release that touches money, data, notifications or sharing. It takes ten minutes.
The decision log. When you choose between business and user interests, write one paragraph: the options, what you chose and why. Re-read it after a month. It is surprisingly good at revealing rationalizations.
The stranger test. Before shipping a persuasive element, show it to someone outside tech and ask "what do you think happens if you tap this?". If their answer differs from reality, you have a gap.
Checklist: ethics & trust pre-ship
Honesty
Calm
Privacy and trust
Longevity and safety
Do
Write your oath in checkable rules and keep it in your repo.
Look for the legitimate need under harmful requests.
Log hard trade-offs and re-read them.
Make the checklist part of your release routine.
Don't
Write vague values you cannot test.
Decide ethics case by case under revenue pressure.
Assume that being small makes your choices harmless.
In the wild
Ruined by DesignMike Monteiro, 2019
A blunt argument that designers share responsibility for the harms of the products they build. You are not neutral, even alone.
Basecamp and HEY policies37signals
HEY, its email service, blocks the tracking pixels that many marketing emails use to report when you open them, and the company publishes its policies plainly. Principles can be a product feature and a brand.
Indie "values" pagesCommon practice
Many small app makers publish short pages on privacy, pricing and longevity commitments. Publishing your oath makes it harder to break and easier to trust.
For the solo creator
Publish a short version of your oath on your website. It becomes a promise users can hold you to, a differentiator against bigger competitors, and a guardrail against your own worst month. Keep the full checklist private and use it.
Common mistakes
Values as marketing only
A privacy page is written by copying a template.
Write from what your code actually does. If you cannot keep a promise, do not make it.
Skipping the checklist on "small" releases
The change looks minor.
Run the parts that apply. Most harmful patterns arrive as small changes (a pre-ticked box, a new ping).
Check yourself
Revenue dropped 20% this month. You consider making the yearly plan the preselected default on the upgrade screen, with monthly behind a "see other options" link. What does your oath-and-checklist process tell you?
Recommending an option is honest. Hiding the alternative is not. (d) is exactly the 2 am decision the oath exists to prevent.
Exercise 18.1 60 minutes · on your own product
Write your oath and run your first pre-ship check
Draft seven to ten checkable rules, using the example as a starting point and your audits from earlier chapters.
Test each rule against two recent decisions. Rewrite rules that would not have decided them.
Run the pre-ship checklist above on your current build. Note every unchecked item.
Publish a short public version of your oath on your site or in your app's About screen.
You're done when: the oath is in your repo, a public version is live, and you have a list of checklist failures with dates to fix them.
Beginner
Competent
Strong
Writes general values.
Writes checkable rules and runs the checklist.
Publishes the oath, adds the checklist to the release process, and starts a decision log.
Wrap-up
Ten things to remember
Honesty is the size of the gap between what a busy person believes and what really happens.
Deceptive patterns exploit six shortcuts: defaults, scarcity, social proof, shame, salience and effort. Neutralize the shortcut, not just the name.
Persuasion is honest when the fact behind it is true, specific and the same for everyone.
Symmetry: no as easy as yes, leaving as easy as joining, private as easy as public.
The law in the EU, US and India now names many of these patterns. Design to the honest version and you mostly comply.
Calm technology keeps status in the periphery and brings things to the center only when a decision is needed.
Leave room: empty moments and endings belong to the user. Every list needs a stopping cue.
A habit feature is good when, a week later, the person is glad they did it.
Collect the minimum, keep data on the device and in open formats, and let people export and delete it themselves.
Write your oath while calm, walk features through an abuser's eyes, and run the pre-ship checklist every release.
Self-assessment: I can…
Practice assignment for the next two weeks
Days 1 to 3: Honesty audit. Run Exercises 1.1, 4.1 and 5.1 on your product. Fix the largest gap and the worst asymmetry.
Days 4 to 5: Spot practice. Each day, find and screenshot three deceptive patterns in apps you use. Label each with its shortcut and sketch the honest version. Keep a swipe file.
Days 6 to 8: Calm pass. Exercises 7.1 and 10.1: center/periphery map and stopping cues. Write and implement your notification policy (12.1).
Days 9 to 10: Data and ownership. Data inventory (13.1), seven-ideals scorecard (14.1), and ship one export or delete improvement.
Days 11 to 12: Longevity and safety. Longevity audit (16.1) and abuser walkthrough (17.1).
Days 13 to 14: Oath. Write and publish your oath (18.1), run the pre-ship checklist, and write a one-page reflection: what did you change, what did it cost, what did you learn about yourself as the business and the advocate?
Reflection prompt
Go back to the three moments you wrote down in the warm-up. Name each one precisely now. Then ask: is there a version of any of them in your own product? What would it take to remove it this week?
Reading list
Deceptive Patterns (2023) and deceptive.design
Harry Brignull · The definitive catalogue, with the cognitive science and legal cases behind each pattern.
Designing Calm Technology (1995)
Mark Weiser & John Seely Brown · A short paper; read it in twenty minutes and you will see "periphery" everywhere.
Calm Technology (2015)
Amber Case · The eight principles with practical patterns and examples.
Designing Design (2007) and White (2010)
Kenya Hara · Emptiness, receptivity and MUJI's "this will do" philosophy.
Local-first software (2019)
Ink & Switch (Kleppmann, Wiggins, van Hardenberg, McGranaghan) · The seven ideals and the engineering behind them.
Hooked (2014) and Indistractable (2019)
Nir Eyal · Read Hooked to recognize the loop and use the Manipulation Matrix; read the critics alongside it.
Irresistible (2017)
Adam Alter · The psychology of behavioral addiction and the idea of stopping cues.
Addiction by Design (2012)
Natasha Dow Schüll · An ethnography of slot machine design; uncomfortable parallels with feeds.
Center for Humane Technology resources
Tristan Harris, Aza Raskin and colleagues · Essays, a podcast ("Your Undivided Attention") and design guides on attention.
Design for Safety (2021)
Eva PenzeyMoog · Practical methods for designing against interpersonal abuse.
Ruined by Design (2019)
Mike Monteiro · A call to responsibility; read it before writing your oath.
Nudge (2008)
Richard Thaler & Cass Sunstein · Choice architecture, defaults and the line between nudge and sludge.
Bringing Dark Patterns to Light (2022)
US FTC staff report · How a regulator describes and classifies dark patterns.
Guidelines for Prevention and Regulation of Dark Patterns, 2023
India's Central Consumer Protection Authority · The 13 patterns, with illustrations, in the regulator's own words.
Next: The Solo Practice turns everything in the course into a working routine. For reference versions of this guide's checklists, see the Reference Library.