Skip to content
Ahimsa

Principles

What this system is for, and what it will not do

The refusals are as much a part of Ahimsa as the color tokens. Adopting the look without them produces something that is merely warm, which is worse than neither — warmth is not camouflage.

The premise

Non-harm, applied to interface design

If a design pattern requires the user to lose for the product to win, this system will not produce it.

Ahimsa (Sanskrit अहिंसा, ahiṃsā) is the ethical principle of causing no harm, in thought, word and action. It runs through Gandhi, through King, and through the Buddha's teaching on compassion. Applied to design it means refusing the whole vocabulary of extractive UX.

This is a narrow system on purpose. It belongs to software whose success genuinely correlates with the wellbeing of the person using it. If your product's metrics improve when someone's attention is captured, this is the wrong system and the mismatch will show.

Attention

A strict pull model

Nothing in an Ahimsa interface appears on its own. Whatever someone was doing is what they stay doing. Information waits somewhere findable until they come looking for it.

The test is not "is it dismissible" but: did the person cause this, here, now?

A response — allowed

It appears because the person just acted, in the place they were already looking, without taking focus and without covering their work. A confirmation toast after a save. An inline coaching chip that appears under the text as a consequence of typing.

An interruption — refused

It arrives on its own schedule, or takes focus, or covers the work. A floating update bar is refused even though it is dismissible, because being dismissible is not the test.

This is strict enough to rule out a component this system's own reference apps ship. The right conclusion is one step past "make the bar dismissible": don't announce the update at all. Put it in Settings, behind a control the person presses. See the version-check pattern.

Voice

How Ahimsa writes

The voice is as much a part of the system as the color tokens, and it is the part most often dropped in adoption.

  • Warm, plain, unhurried. Short declarative sentences. No exclamation marks, no ALL-CAPS urgency, no growth-hacky punch. "A quiet place to begin." not "Get started now — don't miss out!"
  • Second person, gently. Invites rather than instructs: "Would you like to continue?" not "CONTINUE→".
  • Declining is a legitimate answer. "Later", "Not now", "Leave it open", "Keep it" — never a label engineered to make saying no feel like a failure.
  • Emotional lines are set apart; factual lines stay plain. A reflective sentence takes the emotional register; a date or a count is upright small caps. The split is the tone.
  • No numbers as pressure. "3 remaining", never "ONLY 3 LEFT!"
  • Lowercase, mostly. Sentence case in body and display. Small caps are the only uppercase, and they read like magazine captions.
  • No emoji. The warmth comes from typography and space.
  • Never quotation marks on a pull quote. The setting is already the quotation.

Nothing here is designed to grab you. · A supporting line, quietly offered. · Continue / Not now

The fingerprint

The five moves

Preserve these and the system stays recognizable; drop one and it stops being Ahimsa. A note on provenance: the original card naming these was lost. What follows is reconstructed from the shipped system, and is labeled as a reconstruction rather than presented as recovered.

Ahimsa Day

  1. Paper, never white. Cocoa ink, never black.
    Pure black on pure white is harsher than any screen needs, and it reads as clinical. Under it, a light gray sky with soft white clouds that never move.
  2. Two voices in type.
    An italic serif for what is felt, wide-tracked small caps for what is known. The split is the tone.
  3. Rounded at every scale. A bottom rule, not a box.
    Sharp corners carry an implicit threat; a box around a field implies something being collected.
  4. One gradient owns a screen, with frosted glass on top.
    Emphasis is a moment, not a texture. Two gradients side by side is the rule this system breaks least gladly.
  5. Motion that settles.
    Every easing ends at 1.0 with nothing above it, so no transition can bounce. Settling, not pouncing.

Ahimsa Night

  1. Deep midnight, never pure black. Frost, never pure white.
    The same color law as Day, held from the other end, under a faint static field of stars.
  2. The same type as Day.
    Fraunces for what is felt, DM Sans for what is known. A person moving between Day and Night has not moved between two products.
  3. Structure by hairline and glow, not shadow.
    A drop shadow is invisible on a dark ground. An inset ring draws the edge; light does the lifting.
  4. One field owns a screen, and it is ambient — never information.
    The decorative layer has no state and nothing that can be missed by ignoring it.
  5. Light that breathes slower than you.
    Nothing pulses faster than 0.1Hz, and nothing animates position.

The ethical fingerprint

Refusals

The list below is normative. An interface built on Ahimsa tokens that does any of these is not using the system, whatever it looks like.

RefusedWhy
No red, and no danger token.Neither aesthetic contains one. Errors are warm clay or warm copper, because a person who hit a problem has not done something wrong.
No notification badge component.Not a styling choice — the component does not exist. Updates surface through the rhythm of use.
Nothing appears unasked.No banners, no modals on load, no floating update bars, no consent interstitials, no push, no autoplay, no beforeunload nag, no hover-delay tooltip that covers content.
No aria-live="assertive", no role="alert".An assertive region interrupts a screen-reader user mid-sentence. Same harm, different channel.
No streaks that punish.Nothing that turns an absence into a failure, and no gap where something used to be that reads as a telling-off.
No numbers used as pressure.Counts are stated neutrally — "3 remaining", never "only 3 left". Stats are reflective, never a scoreboard.
No metric between two people.No score on a relationship, no rank, no tier. A scale invites you to fail at something that is not a test.
No manufactured scarcity or urgency.No countdowns, no timeouts, no "act now". There is no timing dependency anywhere in the system.
No confirmshaming.Escape hatches get neutral, equal-weight labels. Never "No, I don't want to improve".
No hidden opt-outs.If it can be turned on, it can be turned off, in the same number of steps and in the place you would look.
No endless scroll, no feed.A list that flies past under your thumb is a feed, and a feed is the interaction pattern this system exists not to be.
No traffic-light mapping.Never red / amber / green for how something is going. Hue may band by warmth; it may not grade you.
No claiming what cannot be verified.The button says "Add to calendar" and the confirmation says "Ready for your calendar" — never "Added".
No silent failure.A control that goes quiet and stays dead leaves someone tapping at a screen wondering what they did wrong.
No emoji, no icon set.Type and space carry the meaning. A few restrained unicode glyphs are acceptable as quiet affordances.
No dead ends.Every sheet has three ways out. Every link that might not resolve degrades to something that does.

The audit, before you ship

  1. Does anything appear that the person did not cause? Run tools/check-attention.mjs and then look with your own eyes.
  2. Is every escape hatch a real control at equal metrics, labeled for what it is?
  3. Is any number on screen capable of reading as a score, a streak, or a shortfall?
  4. Does any color carry meaning that no word or shape also carries?
  5. If a control fails, does the person find out — and are they told what is still true?
  6. Can every interaction be completed without a drag, a hover, or a gesture?
  7. Does anything claim an outcome the app cannot actually verify?
  8. Is there a way out of every surface, reachable by keyboard?

A note on themes

Follow the operating system

Night is the dark aesthetic. It has its own type voice, its own approach to elevation, and its own ambient layer, but it is also what a person who has asked their device for a dark appearance should get.

So with no stored choice, start in Night when prefers-color-scheme: dark matches and in Day otherwise, and follow the system if it changes. Once someone picks a theme inside your app, that choice wins and is remembered. A person who set their device to dark has already said what they need; making them say it again in every app is a small harm this system declines to cause.