@notambourine/brand-kit 1.2.1 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,18 +1,18 @@
1
1
  # brand-kit
2
2
 
3
- The NoTambourine brand's golden set: `tokens.css`, `components.css`, `deck.css`, the
4
- font binaries, the logo in `logo/`, and `SKILL.md`, which is the written system behind
5
- them - color, type, spacing, component recipes, and voice.
3
+ NoTambourine brand assets and guidance for design, decks, and copy. Use the
4
+ stylesheets, fonts, and logo together. Read `SKILL.md` for the relevant
5
+ guidance.
6
6
 
7
7
  Correct a brand value here. Every other copy is downstream.
8
8
 
9
- | Link this | To get |
10
- |---|---|
11
- | `tokens.css` | The whole system: the faces, every value, and styled bare HTML. |
12
- | `vars.css` | The values alone, for a surface with its own faces and base layer. |
9
+ | Link this | To get |
10
+ | ---------------- | ------------------------------------------------------------------ |
11
+ | `tokens.css` | The whole system: the faces, every value, and styled bare HTML. |
12
+ | `vars.css` | The values alone, for a surface with its own faces and base layer. |
13
13
  | `components.css` | `.nt-btn`, `.nt-card`, `.nt-nav`, and the rest, all `var()`-based. |
14
- | `deck.css` | The Marpit slide theme, 1280x720. Load `vars.css` on the page too. |
15
- | `logo/` | The mark, the lockup, the icons, and the rasters cut from them. |
14
+ | `deck.css` | The Marpit slide theme, 1280x720. Load `vars.css` on the page too. |
15
+ | `logo/` | The mark, the lockup, the icons, and the rasters cut from them. |
16
16
 
17
17
  ## Logo
18
18
 
@@ -25,32 +25,30 @@ stylesheets load. Change the logo by editing that script and re-running it:
25
25
  ./scripts/build-logo.py # needs rsvg-convert on PATH
26
26
  ```
27
27
 
28
- The raster half shells out to `rsvg-convert`, which ships in librsvg: `brew
29
- install librsvg` on macOS or Linux, the GTK runtime on Windows. The vector half
30
- runs without it.
28
+ The raster half shells out to `rsvg-convert`, which ships in librsvg:
29
+ `brew install librsvg` on macOS or Linux, the GTK runtime on Windows. The vector
30
+ half runs without it.
31
31
 
32
32
  ### Vector
33
33
 
34
- | File | Use |
35
- |---|---|
36
- | `logo/lockup.svg` | Default. Mark plus wordmark, outlined, so it needs no font. |
37
- | `logo/lockup-white.svg` | On dark, on pink, on a photo. |
38
- | `logo/lockup-ink.svg` | One-color print, fax-grade output, a light background that fights pink. |
39
- | `logo/lockup-text.svg` | The wordmark as live `<text>` over an inlined ten-glyph Nunito subset. Open this one to edit the type; ship `lockup.svg`. |
40
- | `logo/monogram.svg` | Mark with `no` nested in the crescent, transparent, square. The short form: avatar, app icon, stamp. |
41
- | `logo/monogram-white.svg`, `logo/monogram-ink.svg` | The same two reversals. |
42
- | `logo/mark.svg` | Mark alone, no letters. Watermarks, a bullet, anywhere `no` would be read as a word. |
43
- | `logo/mark-white.svg`, `logo/mark-ink.svg` | The same two reversals. |
44
- | `logo/favicon.svg` | Browser tab: monogram on the dark tile, cut tight so 16px survives. |
45
- | `logo/icon.svg` | App tile, rounded corners, opaque. |
46
- | `logo/icon-square.svg` | App tile, square edges, for iOS and anything else that masks the icon itself. |
47
- | `logo/icon-maskable.svg` | Android maskable: full bleed, monogram inside the 80% safe circle. |
48
-
49
- The monogram is the lockup truncated to its first two letters, not a second
50
- drawing: same face, same size, same origin, so the `n` nests into the crescent's
51
- mouth exactly as it does in the full lockup. At 16px the letters go soft, which
52
- is the price of the monogram over a bare crescent; every browser that matters
53
- reads `favicon.svg` and scales it instead.
34
+ | File | Use |
35
+ | -------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- |
36
+ | `logo/lockup.svg` | Default. Mark plus wordmark, outlined, so it needs no font. |
37
+ | `logo/lockup-white.svg` | On dark, on pink, on a photo. |
38
+ | `logo/lockup-ink.svg` | One-color print or light backgrounds where pink lacks contrast. |
39
+ | `logo/lockup-text.svg` | The wordmark as live `<text>` over an inlined ten-glyph Nunito subset. Open this one to edit the type; ship `lockup.svg`. |
40
+ | `logo/monogram.svg` | Mark with `no` nested in the crescent, transparent, square. The short form: avatar, app icon, stamp. |
41
+ | `logo/monogram-white.svg`, `logo/monogram-ink.svg` | The same two reversals. |
42
+ | `logo/mark.svg` | Mark alone, no letters. Watermarks, a bullet, anywhere `no` would be read as a word. |
43
+ | `logo/mark-white.svg`, `logo/mark-ink.svg` | The same two reversals. |
44
+ | `logo/favicon.svg` | Browser tab: monogram on the dark tile, cut tight so 16px survives. |
45
+ | `logo/icon.svg` | App tile, rounded corners, opaque. |
46
+ | `logo/icon-square.svg` | App tile, square edges, for iOS and anything else that masks the icon itself. |
47
+ | `logo/icon-maskable.svg` | Android maskable: full bleed, monogram inside the 80% safe circle. |
48
+
49
+ The monogram uses the lockup's first two letters with the same face, size, and
50
+ position. The letters lose detail at 16px; use `favicon.svg` for browser
51
+ scaling.
54
52
 
55
53
  `lockup-text.svg` overruns its viewBox in librsvg and resvg, which apply
56
54
  `letter-spacing` differently than a browser does. That is why the outlined
@@ -61,16 +59,16 @@ reads `favicon.svg` and scales it instead.
61
59
  Everything in `logo/export/` is cut from the SVGs above, so treat it as output:
62
60
  regenerate it, never retouch it.
63
61
 
64
- | File | Cut from |
65
- |---|---|
66
- | `favicon.ico` (16, 32, 48) | `favicon.svg` |
67
- | `favicon-16x16.png`, `favicon-32x32.png`, `favicon-48x48.png` | `favicon.svg` |
68
- | `apple-touch-icon.png` (180) | `icon-square.svg` |
69
- | `icon-192.png`, `icon-512.png` | `icon.svg` |
70
- | `icon-maskable-512.png` | `icon-maskable.svg` |
62
+ | File | Cut from |
63
+ | ------------------------------------------------------------------------------------- | ------------------------------------ |
64
+ | `favicon.ico` (16, 32, 48) | `favicon.svg` |
65
+ | `favicon-16x16.png`, `favicon-32x32.png`, `favicon-48x48.png` | `favicon.svg` |
66
+ | `apple-touch-icon.png` (180) | `icon-square.svg` |
67
+ | `icon-192.png`, `icon-512.png` | `icon.svg` |
68
+ | `icon-maskable-512.png` | `icon-maskable.svg` |
71
69
  | `monogram-256.png`, `monogram-512.png`, `monogram-1024.png`, `monogram-white-512.png` | `monogram.svg`, `monogram-white.svg` |
72
- | `mark-256.png`, `mark-512.png`, `mark-1024.png`, `mark-white-512.png` | `mark.svg`, `mark-white.svg` |
73
- | `lockup-1024.png`, `lockup-2048.png`, `lockup-white-1024.png`, `lockup-ink-1024.png` | the three lockups |
70
+ | `mark-256.png`, `mark-512.png`, `mark-1024.png`, `mark-white-512.png` | `mark.svg`, `mark-white.svg` |
71
+ | `lockup-1024.png`, `lockup-2048.png`, `lockup-white-1024.png`, `lockup-ink-1024.png` | the three lockups |
74
72
 
75
73
  ### Wire it up
76
74
 
@@ -78,16 +76,16 @@ regenerate it, never retouch it.
78
76
  `logo/` is served as a unit.
79
77
 
80
78
  ```html
81
- <link rel="icon" href="/logo/favicon.svg" type="image/svg+xml">
82
- <link rel="icon" href="/logo/export/favicon.ico" sizes="32x32">
83
- <link rel="apple-touch-icon" href="/logo/export/apple-touch-icon.png">
84
- <link rel="manifest" href="/logo/site.webmanifest">
79
+ <link rel="icon" href="/logo/favicon.svg" type="image/svg+xml" />
80
+ <link rel="icon" href="/logo/export/favicon.ico" sizes="32x32" />
81
+ <link rel="apple-touch-icon" href="/logo/export/apple-touch-icon.png" />
82
+ <link rel="manifest" href="/logo/site.webmanifest" />
85
83
  ```
86
84
 
87
85
  ## Consume it
88
86
 
89
- Install it and read the bytes out of `node_modules`. Do not copy a stylesheet into a
90
- consumer; a copy drifts and nothing fails when it does.
87
+ Install the package and import its stylesheets from `node_modules`. Keep copied
88
+ assets tied to the installed version.
91
89
 
92
90
  ```bash
93
91
  npm install @notambourine/brand-kit
@@ -103,15 +101,16 @@ import "@notambourine/brand-kit/tokens.css";
103
101
  cp -R node_modules/@notambourine/brand-kit/{fonts,logo} public/
104
102
  ```
105
103
 
106
- `tokens.css` declares the `@font-face` rules and every `var()` the other two read, so
107
- load it first and serve `fonts/` beside it. The paths inside it are relative to the CSS
108
- file, so inlining it into a `<style>` block breaks the faces.
104
+ `tokens.css` declares the `@font-face` rules and every `var()` the other two
105
+ read, so load it first and serve `fonts/` beside it. The paths inside it are
106
+ relative to the CSS file, so inlining it into a `<style>` block breaks the
107
+ faces.
109
108
 
110
109
  ### With Tailwind or StyleX
111
110
 
112
111
  A surface with its own faces and base layer imports `vars.css` alone and writes
113
- `var()` against the semantic aliases. Neither system needs anything from this kit
114
- beyond the custom properties.
112
+ `var()` against the semantic aliases. Neither system needs anything from this
113
+ kit beyond the custom properties.
115
114
 
116
115
  ```js
117
116
  import "@notambourine/brand-kit/vars.css";
@@ -121,55 +120,60 @@ const styles = stylex.create({
121
120
  });
122
121
  ```
123
122
 
124
- Tailwind claims the `--font-*` and `--ease-*` namespaces for its own utilities, which
125
- is why those two groups ship a `--nt-*` primitive under the alias: a Tailwind surface
126
- reads the primitive. StyleX hashes the names it generates and collides with neither.
123
+ Tailwind claims the `--font-*` and `--ease-*` namespaces for its own utilities,
124
+ which is why those two groups ship a `--nt-*` primitive under the alias: a
125
+ Tailwind surface reads the primitive. StyleX hashes the names it generates and
126
+ collides with neither.
127
127
 
128
- Two StyleX-specific traps. Bridging through `stylex.defineVars` breaks `.theme-light`,
129
- because StyleX declares those properties on `:root` and a custom property resolves
130
- where it is declared, so a `.theme-light` subtree still inherits the dark value; a raw
131
- `var()` string resolves at the element and themes correctly. And StyleX outranks the
132
- element styles in `elements.css` only while `useCSSLayers` is off - turn layers on and
133
- an unlayered `h1` wins, so import into a layer StyleX orders itself against:
128
+ Two StyleX-specific traps. Bridging through `stylex.defineVars` breaks
129
+ `.theme-light`, because StyleX declares those properties on `:root` and a custom
130
+ property resolves where it is declared, so a `.theme-light` subtree still
131
+ inherits the dark value; a raw `var()` string resolves at the element and themes
132
+ correctly. And StyleX outranks the element styles in `elements.css` only while
133
+ `useCSSLayers` is off - turn layers on and an unlayered `h1` wins, so import
134
+ into a layer StyleX orders itself against:
134
135
 
135
136
  ```css
136
137
  @import "@notambourine/brand-kit/tokens.css" layer(base);
137
138
  ```
138
139
 
139
- The package ships the stylesheets, `fonts/`, `logo/`, and `SKILL.md`. The logo build
140
- script and `hello-world.html` stay in the repo. Pin an exact version and bump it on
141
- purpose; a caret range moves the brand under a consumer with no diff to review.
140
+ The package ships the stylesheets, `fonts/`, `logo/`, and `SKILL.md`. The logo
141
+ build script and `hello-world.html` stay in the repo. Pin an exact version and
142
+ bump it on purpose; a caret range moves the brand under a consumer with no diff
143
+ to review.
142
144
 
143
145
  Consumers today:
144
146
 
145
- | | |
146
- |---|---|
147
- | `notambourine/claude` | Ships it as the `/nt-brand:system` skill. |
148
- | `notambourine/share` | Serves `tokens.css` and `deck.css` from its own origin; a self-only CSP forbids a CDN. |
149
- | `notambourine/notambourine.com` | The site's stylesheet. |
147
+ | | |
148
+ | ------------------------------- | -------------------------------------------------------------------------------------- |
149
+ | `notambourine/claude` | Ships it as the `/nt-brand:system` skill. |
150
+ | `notambourine/share` | Serves `tokens.css` and `deck.css` from its own origin; a self-only CSP forbids a CDN. |
151
+ | `notambourine/notambourine.com` | The site's stylesheet. |
150
152
 
151
153
  ## Gate a consumer
152
154
 
153
155
  A `var(--x)` that reads a token this repo stopped declaring falls through to its
154
- fallback and the page still renders, so a bump can go wrong quietly. Check three things
155
- in the consumer's CI: the font bytes hash against `fonts/`, every color is one this kit
156
- defines, and every `var()` reads a property it still declares. `notambourine/share`'s
157
- `npm run brand` is the reference implementation.
156
+ fallback and the page still renders, so a bump can go wrong quietly. Check three
157
+ things in the consumer's CI: the font bytes hash against `fonts/`, every color
158
+ is one this kit defines, and every `var()` reads a property it still declares.
159
+ `notambourine/share`'s `npm run brand` is the reference implementation.
158
160
 
159
- ## Release
161
+ ## Format documents
160
162
 
161
- Bump `version` in `package.json`, land it, then tag the merge commit:
163
+ Install dependencies with `npm ci`. Run `npm run format` before sharing
164
+ documents or exporting them. Markdown and MDX are included, along with HTML and
165
+ JSON/YAML. Review rendered output after formatting.
162
166
 
163
- ```bash
164
- git tag v1.0.1 && git push origin v1.0.1
165
- ```
167
+ ## Release
168
+
169
+ Update `version` in `package.json` and the lockfile, then merge to main. The
170
+ publish workflow releases versions that are not already on npm and tags the
171
+ published commit. Formatting must pass before the package is packed or
172
+ published.
166
173
 
167
- `.github/workflows/npm-publish.yml` publishes the tag through npm trusted publishing.
168
- No token lives in this repo, and npm attaches a provenance attestation tying the
169
- published tarball to that workflow run. The workflow fails if the tag and the manifest
170
- disagree.
174
+ Publishing uses npm trusted publishing with provenance.
171
175
 
172
176
  ## License
173
177
 
174
- MIT for the stylesheets and `SKILL.md`. The faces in `fonts/` are SIL Open Font License;
175
- see `fonts/OFL.txt`.
178
+ MIT for the stylesheets and `SKILL.md`. The faces in `fonts/` are SIL Open Font
179
+ License; see `fonts/OFL.txt`.
package/SKILL.md CHANGED
@@ -1,363 +1,44 @@
1
1
  ---
2
2
  name: system
3
- description: NoTambourine brand system - colors, tokens, type, spacing, components, deck theme, voice, and the audit that checks work against them. Use when building or styling anything NoTambourine-branded, when asked for the brand colors, or when checking copy before it ships.
3
+ description:
4
+ Build or review NoTambourine-branded surfaces, decks, and copy. Use for brand
5
+ styling, color questions, positioning, and copy audits before shipping.
4
6
  ---
5
7
 
6
8
  # NoTambourine brand
7
9
 
8
- A boutique AI-enabled engineering agency for leaders whose technology is holding back the
9
- business.
10
- Senior operators work inside the client's org. The constraint may be a legacy commerce stack, a
11
- revenue-share SaaS, a roadmap nobody can staff for. **Value creation is the deliverable,
12
- and trust is earned by shipping.** Improve how the organization works through delivery.
13
- AI at the keyboard is why a small team can price this way; it is not what the client buys.
14
-
15
- Define fit by the business constraint and the responsibility we take on. Mention
16
- private-equity experience when relevant to the conversation. Keep the general positioning
17
- open to clients regardless of ownership structure.
18
-
19
- The name carries the style, not the positioning. A tambourine is what you add when there
20
- is nothing left to add, so **NoTambourine = no padding**. That is why the design is
21
- confident type, one decisive pink, lots of air, no decoration.
22
-
23
- ## Referrals
24
-
25
- Help a referred reader confirm fit and explain the agency to a colleague. Keep the
26
- signature "Senior engineers. No tambourine." beside a concrete explanation of the work.
27
- Use this description for an introduction:
28
-
29
- > NoTambourine works inside your team to resolve technology constraints and leaves you
30
- > equipped to own the result.
31
-
32
- Give referrers recognizable reasons to call:
33
-
34
- - A commerce platform limits what the business can do.
35
- - Vendor dependence makes necessary changes too costly or slow.
36
- - An important roadmap needs capacity the team cannot staff.
37
-
38
- ## Offers
39
-
40
- Use these names in copy and examples. Describe the client's outcome before staffing.
41
-
42
- - **Assessment:** Identify the technology constraint and decide what to address first.
43
- - **Embedded:** Work inside the client's team to lead and deliver the changes.
44
-
45
- Invite a conversation before asking the reader to choose an engagement.
46
-
47
- Fuller doctrine is published, so fetch it rather than reconstructing it. Every path below
48
- returns `text/plain` over plain HTTP with no auth, no signup, and no redirect - `curl` or
49
- `wget` one directly. This file stands alone when the machine is offline.
50
-
51
- | Fetch | For |
52
- |---|---|
53
- | `notambourine.com/llms.txt` | The index. Start here when you do not know which file you want. |
54
- | `notambourine.com/AGENTS.md` | What the firm does, who it serves, and the citation rules. |
55
- | `notambourine.com/SOUL.md` | What NoTambourine believes. The beliefs this design serves. |
56
- | `notambourine.com/CULTURE.md` | How the team works. Async-first, one operator per workstream. |
57
-
58
- `SOUL.md` and `CULTURE.md` are public cuts of longer internal documents, so absence from
59
- them is not evidence of anything. Client material is unpublished and stays that way -
60
- `robots.txt` disallows `/reports/` and `/pog/` for every agent.
61
-
62
- ## Use the files
63
-
64
- Two stylesheets cover ~80% of any build, and a third renders a deck. Copy them next to
65
- your output, or inline them.
66
-
67
- | File | What it does |
68
- |---|---|
69
- | `tokens.css` | The whole system in one link: `fonts.css`, `vars.css`, `logo-vars.css`, `elements.css`. Load first and `h1`, `p`, `a`, `code`, `.eyebrow`, `.display`, `.lede` all come styled. |
70
- | `vars.css` | Every value as a CSS var, and nothing else. What a surface with its own faces and its own base layer imports. |
71
- | `logo-vars.css` | `--nt-mark-url` and `--nt-lockup-url`: the pink artwork as `data:` URIs, for a surface that can reach it only through CSS. A deck theme owns no element inside a slide, and a printed PDF has no origin to fetch from. Generated by `scripts/build-logo.py`. |
72
- | `fonts.css` | The six `@font-face` blocks, pointed at `./fonts/`. |
73
- | `elements.css` | The base element styles: bare `h1`, `p`, `a`, `code` on brand with no classes. |
74
- | `components.css` | `.nt-btn`, `.nt-badge`, `.nt-chip`, `.nt-input`, `.nt-card`, `.nt-nav`, `.nt-switch`/`.nt-check`/`.nt-radio`. All `var()`-based. |
75
- | `deck.css` | Marpit slide theme, 1280x720. Every value a `var()` off `tokens.css`. See "Decks" below for how to feed it markdown. |
76
- | `fonts/` | Six woff2: Nunito, Hanken Grotesk, JetBrains Mono, roman and italic each. Latin subset, variable, SIL OFL 1.1 (`fonts/OFL.txt`). Plus `nunito-wordmark-800.woff2`, a ten-glyph static subset for the lockup alone - 1.5 KB against Nunito's 39 KB, so a PDF or an offline snapshot inlines it as a data URI. |
77
- | `logo/` | The mark, the monogram, the three lockup colorways, the favicon and app tiles, and `export/` rasters cut from them. `scripts/build-logo.py` writes all of it. |
78
- | `hello-world.html` | Working page using both stylesheets. Start here for a mock; open it to eyeball the brand. |
79
-
80
- ```html
81
- <link rel="stylesheet" href="tokens.css">
82
- <link rel="stylesheet" href="components.css">
83
- ```
84
-
85
- **Copy the whole skill directory, not the stylesheets alone.** `tokens.css` pulls in
86
- `fonts.css`, which declares `@font-face` against `./fonts/`, so type is wired up with
87
- no network and no third party - a mock renders on brand from `file://` on a plane.
88
- Those paths resolve against the CSS file, so inlining the CSS into a `<style>` block
89
- instead means `fonts/` has to sit beside the HTML.
90
-
91
- A surface that already ships its own faces and its own base layer imports `vars.css`
92
- alone. It gets every value and none of the opinions, and there is still one copy of
93
- each number.
94
-
95
- Never swap that for a Google Fonts `@import`. It sends the visited URL to Google as a
96
- `Referer` and blocks a self-only CSP, which is why the site deleted its own. A mock is
97
- the artifact most likely to graduate into a real page, so it carries the same rule.
98
-
99
- ### Fonts on a locked-down surface
100
-
101
- Some surfaces cannot load `./fonts/` at all: a claude.ai artifact, an email client, a
102
- README banner. There the faces fall back silently and the brand degrades without a
103
- decision. Make it a decision:
104
-
105
- - Inline the face as a data URI in the `@font-face` `src`: `base64 -i fonts/<file>.woff2`
106
- emits the payload. The wordmark subset is 1.5 KB, so inline it always; a full face runs
107
- 30-40 KB, so inline one only when the surface is worth the bytes.
108
- - Where inlining is not worth it, the fallback stacks in `vars.css` are the brand's
109
- degraded form: `system-ui` for display, `ui-monospace` for body. Ship them knowingly.
110
- The Google Fonts rule above holds here too.
111
-
112
- ## Non-negotiables
113
-
114
- These are the rules that get broken. Check your output against them.
115
-
116
- - **Dark by default.** Page is `var(--bg)` (#0B0B0C), cards `var(--bg-card)` (#141416).
117
- Pure white is never a surface. `class="theme-light"` is opt-in and rare - print, a press
118
- page, a one-off email.
119
- - **One pink.** `#E75A7C` is the only accent. One pink CTA per screen. Mint (`#58C9B9`) is
120
- structural - borders, status dots, supporting icons - **never** a CTA.
121
- - **No gradients.** Not on sections, not on buttons, not on heroes. One radial halo behind
122
- a hero lockup is the sole exception, and it must read as lighting.
123
- - **No stock photography, no AI imagery, no hand-drawn textures.** Imagery is flat,
124
- geometric, two-color. Ask for real assets before papering over.
125
- - **Pill buttons** (`--r-pill`), 14px cards (`--r-md`). Never mix a sharp and a round
126
- corner in one component.
127
- - **No colored-left-border cards.** Full borders, not stripes.
128
- - **Press scales to 0.97, hover does not move.** Hover darkens fill or lifts shadow. No
129
- translate, no scale on hover, no parallax, no looping animation.
130
- - **No emoji in UI chrome, no icon fonts.** Icons are Lucide SVG, 1.75px stroke, rounded
131
- caps - 20px in nav/buttons, 24px in features, 16px in inputs.
132
- - **Never redraw the logo; link a file out of `logo/`.** The lockup is `notambourine` set
133
- in Nunito 800 beside the tambourine mark. Ship `logo/lockup.svg`, or its `-white` and
134
- `-ink` reversals. Where the lockup will not fit - an avatar, an app icon, a stamp - use
135
- `logo/monogram.svg`, the mark with `no` nested in the crescent; `logo/mark.svg` drops
136
- the letters for a watermark or a bullet. `logo/lockup-text.svg` keeps the wordmark as
137
- live `<text>` over an inlined ten-glyph Nunito subset - open that one to edit the type,
138
- and re-run `scripts/build-logo.py` rather than hand-patching an outline.
139
- `--font-wordmark` exists for the lockup and nothing else; a heading that reaches for it
140
- is a bug.
141
- - **One pink word per headline**, via `<em>` - pink *and* italic. Hanken Grotesk ships a
142
- drawn italic, so emphasis carries both and never a browser-faked skew.
143
- - **Every interactive element keeps a visible focus ring.** `tokens.css` ships it
144
- (2px accent, 4px offset). Don't `outline: none` without replacing it.
145
-
146
- ## Voice
147
-
148
- Concise, warm, playful - in that order.
149
-
150
- - **Register follows the artifact.** Site and marketing copy says **you** to the reader.
151
- A client deliverable (deck, plan, README) says **we**, meaning the client's org with us
152
- inside it. A proposal or SOW names the parties. Never "I".
153
- - **A client deliverable does not sell.** No logo wall, no team slide, no methodology.
154
- Explain the client's own system back to them and let the restraint be the credential.
155
- - **Proof shows an observable change.** Use the client's own numbers where available.
156
- Show what was blocked, what changed, and what their team can now own. Include reduced
157
- operating burden and client independence. Without a number, describe a verifiable
158
- before and after. Share client evidence only with permission.
159
- - **Make accountability personal.** Name who joins the engagement and who owns delivery.
160
- Let warmth come through direct, helpful language about working together.
161
- - **Name the mess without blaming anyone for it.** The client lived every decision that
162
- built it. Copy that indicts them loses the room.
163
- - **Express values as commitments.** Show what the client can count on:
164
- direct access to the person responsible for delivery, ownership of estimating mistakes
165
- within agreed scope, and work and operating knowledge that stay with their team.
166
- Describe how coordination works instead of making jokes about ceremony.
167
- - **Four wordmark forms, and only four.** `NoTambourine` in every human-facing sentence.
168
- `notambourine` is the technical slug, correct only in a path, URL, domain, GitHub org,
169
- npm name, or CSS class. `NoTambourine LLC` is the legal entity and appears twice at most
170
- in a contract - the signature block and one Definitions anchor - and nowhere else.
171
- `Notambourine` and `No Tambourine` are not valid forms. The same rules are published for
172
- outside agents at `notambourine.com/AGENTS.md`, so a disputed flag has a public citation.
173
- - **The signature is a sentence, not a wordmark.** In `Senior engineers. No tambourine.`,
174
- `tambourine` is the instrument, lowercase, and the line stands alone - a tagline, a
175
- slide, a sign-off, an email footer. Nothing else may split the wordmark across a space.
176
- - **Sentence case everywhere** - headlines, buttons, nav, labels. "Get started", not
177
- "Get Started". The lockup renders lowercase.
178
- - **ALL CAPS has one job:** the pink eyebrow above a heading, tracked `+0.08em`. Never a
179
- button, never body.
180
- - Five to twelve word sentences. No throat-clearing, no superlatives, no exclamation
181
- marks in body.
182
- - **ASCII punctuation, with one unicode exception.** Hyphen, straight quote, straight
183
- apostrophe. No em dash, no en dash, no curly quote, no single-character ellipsis. The
184
- site source ships zero of each, and an em dash is the most reported AI tell in
185
- marketing copy. The interpunct stays, because the brand uses it as a separator:
186
- `Tom Fuertes · Principal · NoTambourine`.
187
- - **Yes:** "Senior engineers. No tambourine." · "Two engineers, six weeks, one shipped
188
- feature." · "Tell us what you're building. We'll write back the same day."
189
- - **No:** "Unlock your team's full potential with our proven 7-phase framework!" ·
190
- "results-driven, agile-first, AI-powered engineering studio"
191
-
192
- ### Public copy carries no AI tells
193
-
194
- Read anything a stranger sees for these tells: hero, section body, email, deck,
195
- proposal, README. NoTambourine sells the absence of padding, so padded copy argues
196
- against the pitch. Four tells land hardest in consultancy copy:
197
-
198
- - Puffery adjectives. "Boutique" is specific and true; "proven", "world-class",
199
- "results-driven", "battle-tested" are not. Cut the adjective and keep the number.
200
- - Importance-flagging. "This matters." "Speed is not a footnote." Show the consequence
201
- instead.
202
- - The participle tail. "We ship in six weeks, ensuring your roadmap stays on track." Cut
203
- at the comma.
204
- - Grandiose scope. "changes how you build", "the future of engineering". Scope it to a
205
- claim a client could hold you to.
206
-
207
- Three brand fixtures read as tells and must survive the read:
208
-
209
- - **"Senior engineers. No tambourine."** A tailing negation plus a two-beat fragment,
210
- both tells on their own. The line carries the name and the positioning, so it stays.
211
- - **A three-item line whose items are facts.** "Two engineers, six weeks, one shipped
212
- feature" spends all three slots on numbers. A three-item line spending them on
213
- adjectives is the tell.
214
- - **The single pink `<em>` in a headline.** Typographic emphasis, not the boldface tic.
215
-
216
- ## Type and layout
217
-
218
- - **Headings** Hanken Grotesk 700, negative tracking - a serif holds a headline at 400
219
- and a sans goes limp, so the weight is what reads as deliberate. 800 is the hero's, so
220
- `.display` stays distinct from an ordinary `h1`. **Wordmark** Nunito 800, untracked,
221
- the lockup only. **Accent** JetBrains Mono 600 for eyebrows, buttons, badges, nav.
222
- **Body and mono** JetBrains Mono 400. Monospace body is the practitioner signal; it is
223
- the point, not an accident. Every face is variable across its full axis, so no weight
224
- here is ever synthesized.
225
- - **Keep the rounded lockup playful and the headings clear.** Use warm, direct language
226
- throughout. Visual restraint should make the work easy to understand.
227
- - Body runs `1.7` leading and `+0.01em` tracking. Monospace at a sans's 1.55 reads cramped.
228
- - Tracking tightens as size grows: `--ls-tight` (-0.02em) is the floor, and `--ls-display`
229
- (-0.03em) is what hero type above ~56px wants. Zero on body, +0.08em on ALL-CAPS eyebrows.
230
- - `text-wrap: balance` on headings, `pretty` on paragraphs. Always.
231
- - Body copy is a single column, max ~640px. Never full-viewport.
232
- - Card grids are 2 or 3 columns, single on mobile. Never 4.
233
- - 4pt grid. `--sp-16` between big blocks, `--sp-6` inside a card, `--sp-2` label-to-field.
234
- When unsure, add room.
235
- - The nav is the only sticky element. No sticky CTAs, chat bubbles, or cookie banners.
236
-
237
- ## Audit copy against all of the above
238
-
239
- Run this over anything a client or a stranger sees before it ships: deck, proposal, SOW,
240
- cover email, README, landing page, release note. The greps are a first pass that finds
241
- candidates. Every hit needs the rules above to judge it, which is why they live in one
242
- file with them.
243
-
244
- ```bash
245
- # Wordmark: lowercase in prose, outside code, paths, and URLs
246
- grep -nE '(^|[^/.\-_a-z`])notambourine([^/.\-_a-z`]|$)' <file>
247
-
248
- # Sentence case: never a valid form
249
- grep -n 'Notambourine' <file>
250
-
251
- # Spaced form: never a valid form (lowercase is the instrument, in the signature line)
252
- grep -nE 'No[[:space:]]+Tambourine' <file>
253
-
254
- # Legal entity, 2x max (signature block + Definitions anchor)
255
- grep -nc 'NoTambourine LLC' <file>
256
-
257
- # Em dash, en dash, curly quotes, single-char ellipsis. Interpunct deliberately absent.
258
- perl -CSD -ne 'print "$.:$_" if /[\x{2014}\x{2013}\x{2018}\x{2019}\x{201C}\x{201D}\x{2026}]/' <file>
259
-
260
- # Puffery adjectives
261
- grep -niE '\b(proven|world-class|battle-tested|results-driven|cutting-edge|best-in-class|seamless|robust|leverage|synergy|holistic|bespoke)\b' <file>
262
-
263
- # Participle tails: cut the sentence at the comma
264
- grep -niE ',\s+(ensuring|enabling|allowing|helping|driving|empowering|delivering|providing)\b' <file>
265
-
266
- # Importance-flagging and throat-clearing
267
- grep -niE "\b(this matters|it's worth noting|it is worth noting|needless to say|at the end of the day|in today's)\b" <file>
268
-
269
- # Exclamation marks in body, and first person
270
- grep -nE '!(\s|$)' <file>
271
- grep -nE '\bI\b' <file>
272
- ```
273
-
274
- Perl rather than `grep -P` for the punctuation pass. Stock macOS `grep` is BSD and
275
- rejects `-P`, so that flag only works where someone installed GNU grep. Escapes rather
276
- than literal characters, so this file stays ASCII and never trips its own check.
277
-
278
- Across a directory, or a staged diff so a flag lands on work in progress:
279
-
280
- ```bash
281
- grep -rnE '(^|[^/.\-_a-z`])notambourine([^/.\-_a-z`]|$)' <dir>/ --include='*.md'
282
-
283
- git diff --cached | grep -nE '^\+.*[^/.\-_a-z`]notambourine[^/.\-_a-z`]'
284
- git diff --cached | perl -CSD -ne 'print if /^\+.*[\x{2014}\x{2013}\x{2018}\x{2019}\x{201C}\x{201D}\x{2026}]/'
285
- ```
286
-
287
- Then read for the two tells no grep finds: **grandiose scope**, and a **three-item line
288
- spending its slots on adjectives** rather than numbers. Leave the three fixtures above
289
- alone - they read as tells and stay.
290
-
291
- **Ignore:** the slug in frontmatter, paths, URLs, CSS classes, npm names, GH remotes, and
292
- anything inside a code fence or backticks (the wordmark pattern already excludes them). A
293
- puffery word used literally about a thing rather than as a boast - "a robust error path".
294
- `I` inside a quotation, a code identifier, or a name.
295
-
296
- **Judge a hit two ways.** For the wordmark: would a client reading this expect the
297
- wordmark or the slug? A path, URL, or identifier is the slug, so ignore it. For
298
- everything else: would cutting this weaken the claim? If the sentence survives the cut,
299
- the words were padding.
300
-
301
- ## Where truth lives
302
-
303
- **`notambourine/brand-kit` is the golden set.** `tokens.css`, `components.css`, and
304
- `deck.css` here are the brand's only corrected copy. Read a value from this file, correct
305
- a value in this file, and never sync one in. Anything that disagrees with it is downstream
306
- and stale, however it renders.
307
-
308
- A surface that cannot fetch at runtime pins this repo and reads the bytes out of the
309
- checkout - `share.notambourine.com` serves `tokens.css` and `deck.css` from its own origin,
310
- because a self-only CSP forbids a CDN. A pinned checkout is not a fork: the pin names one
311
- commit, and the consumer's CI fails when a `var()` reads a token this repo stopped
312
- declaring. Correct the value here and bump the pin.
313
-
314
- This skill is the complete system, so nothing has to be looked up elsewhere. It carries
315
- both themes: dark surfaces by default, and the light primitives behind `.theme-light`
316
- (`--nt-ink`, `--nt-white`, `--nt-line`, the pink and mint tints, `--nt-paper-warm`).
317
- A shipping surface may render dark only. That is a choice it made, not a shorter system.
318
-
319
- Every stylesheet here is native CSS with no build step, so they load into a plain HTML file,
320
- a Worker, an email template, or a React app unchanged. Write against the semantic layer -
321
- `--bg`, `--bg-card`, `--fg1`/`2`/`3`, `--fg-mute`, `--accent`, `--accent-fg`,
322
- `--accent-text`, `--support`, `--line`, `--sp-*`, `--r-*`, `--shadow-*`, `--ring-accent`,
323
- `--font-*`. It is the stable API and it
324
- survives a theme swap. The `--nt-*` primitives beneath it are the raw palette; reach past
325
- the alias to one only when no alias covers what you need, and never inline a literal
326
- color - `.theme-light` only works because no component hardcodes one. A `var()` fallback
327
- is the one place a literal is correct, and `deck.css` uses them: a renderer can receive
328
- that theme without `tokens.css` beside it, and the deck still comes out on brand.
329
-
330
- ## Decks
331
-
332
- Grammar first: numbered eyebrow → lowercase display headline with one pink `<em>` word →
333
- short body → ALL-CAPS sublabel → typographic concept diagram → running footer. Every
334
- "image" is a diagram built from the same tokens. No photography, no icons standing in for
335
- a chart.
336
-
337
- `deck.css` is the theme that renders it. Markdown in, slides out, through Marpit: `---`
338
- splits a slide and `<!-- paginate: true -->` turns on slide numbers. Load `tokens.css` on
339
- the page too - `deck.css` declares no `:root`, so it reads its colors and faces from
340
- whatever the document root defines, and a brand correction reaches a deck with no second
341
- edit.
342
-
343
- The grammar above is CSS the theme ships, so a deck never writes its own `<style>` block.
344
- Reach for a class and never a hand-picked value: a deck is immutable once shared, so a hex
345
- typed into one is a brand value nothing can ever correct.
346
-
347
- | Write | Get |
348
- |---|---|
349
- | `<p class="eyebrow">01 &middot; the model</p>` | The numbered pink eyebrow. ALL CAPS is applied by the theme, so type it in sentence case. Use it again for the grammar's later sublabel. |
350
- | `# Headline with one *pink* word` | The display headline; `*emphasis*` in an `h1` or `h2` takes the accent and a drawn italic. |
351
- | `<!-- _class: lead -->` | The cover: centered, big lockup up top, no page number. One per deck. |
352
- | `<!-- _class: divider -->` | A turn in the story: one pink line, centered. This is the mid-deck section break, not `lead`. |
353
- | `<!-- _class: quote -->` | The whole slide as a pull quote, set in the display face. |
354
- | `<!-- _class: split -->` | The slide's bullet list in two columns, so eight short bullets fit where five did. |
355
- | `<!-- footer: acme &middot; august 2026 -->` | A running footer on every slide, clear of the mark and the page number. `header:` works the same at the top. |
356
-
357
- Every slide but an `![bg]` one carries the lockup bottom-left, from `--nt-lockup-url`. It
358
- is what identifies the deck once the PDF is an email attachment with no share link around
359
- it, so nothing has to be typeset: the brand name is never display type.
360
-
361
- `share.notambourine.com` runs this theme in its browser renderer and its PDF export, so a
362
- deck shared from there and a deck built by hand come out the same. It serves these bytes
363
- from a pinned checkout of this repo; correct a value here.
10
+ Apply the brand without padding. Keep the design restrained and the work
11
+ concrete.
12
+
13
+ ## Read only what the task needs
14
+
15
+ - For visual design or styling, read [visual rules](references/visual.md),
16
+ including locked-surface font and logo traps.
17
+ - For writing or auditing anything clients or the public see, read
18
+ [voice and copy audit](references/voice.md). Lead with its core framing and
19
+ use its supporting headline for existing systems.
20
+ - For slide authoring or export, read [deck guidance](references/decks.md). Load
21
+ visual or voice guidance only when designing slides or writing/reviewing their
22
+ copy.
23
+ - For a color, type, spacing, or component value, inspect the relevant CSS
24
+ directly. Do not load prose references for a value lookup.
25
+ - For installation, asset selection, logo regeneration, or consumer integration,
26
+ read the relevant section of [README.md](README.md).
27
+
28
+ ## Source of truth
29
+
30
+ Treat `notambourine/brand-kit` as canonical. Read values from its CSS and
31
+ artwork from its assets. Correct brand values here, never by syncing a
32
+ downstream copy back in. Update consumer pins after a correction; a consumer's
33
+ limited theme support does not narrow the brand system.
34
+
35
+ Use semantic CSS aliases. Reach for primitives only when no alias fits or the
36
+ consumer integration requires it; consult README for framework exceptions. Never
37
+ hardcode colors outside renderer `var()` fallbacks.
38
+
39
+ Fetch fuller doctrine only when needed: `http://notambourine.com/llms.txt`
40
+ indexes the public documents; `AGENTS.md` covers positioning and citation rules,
41
+ `SOUL.md` beliefs, and `CULTURE.md` working practices. Use the local voice
42
+ reference for current messaging. Do not infer internal policy from omissions in
43
+ the public cuts. Keep client material unpublished; `/reports/` and `/pog/` are
44
+ disallowed to agents.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@notambourine/brand-kit",
3
- "version": "1.2.1",
4
- "description": "The NoTambourine brand's golden set: tokens, element styles, deck theme, faces, and logo",
3
+ "version": "1.4.0",
4
+ "description": "NoTambourine brand assets and guidance for design, decks, and copy",
5
5
  "license": "MIT",
6
6
  "repository": {
7
7
  "type": "git",
@@ -18,17 +18,26 @@
18
18
  ],
19
19
  "author": "NoTambourine LLC",
20
20
  "type": "module",
21
+ "scripts": {
22
+ "format": "prettier --write \"**/*.{md,mdx,html,json,yml,yaml}\"",
23
+ "format:check": "prettier --check \"**/*.{md,mdx,html,json,yml,yaml}\"",
24
+ "prepack": "npm run format:check"
25
+ },
21
26
  "//": "No exports map: consumers import stylesheets and logo files by path, and their vendor scripts walk fonts/ and logo/ whole. A map would restate the tree and go stale the first time a file is added.",
22
27
  "files": [
23
28
  "*.css",
24
29
  "fonts",
25
30
  "logo",
26
- "SKILL.md"
31
+ "SKILL.md",
32
+ "references"
27
33
  ],
28
34
  "publishConfig": {
29
35
  "access": "public"
30
36
  },
31
37
  "sideEffects": [
32
38
  "*.css"
33
- ]
39
+ ],
40
+ "devDependencies": {
41
+ "prettier": "3.9.6"
42
+ }
34
43
  }
@@ -0,0 +1,29 @@
1
+ # Deck guidance
2
+
3
+ Explain the client's system with typographic concept diagrams built from brand
4
+ tokens. Do not substitute photography or icons for a chart.
5
+
6
+ Use this slide grammar: numbered eyebrow, lowercase display headline with one
7
+ emphasized word, short body, uppercase sublabel, concept diagram, running
8
+ footer. Use `.eyebrow` for both labels and write their source in sentence case.
9
+ Let the theme apply uppercase.
10
+
11
+ Use one `lead` cover per deck. Use `divider` for later section breaks. Select
12
+ existing theme classes for other slide shapes; inspect `deck.css` for their
13
+ behavior. Never add a deck-local `<style>` block or hand-picked brand values.
14
+ Shared decks are immutable artifacts, so embedded overrides cannot receive later
15
+ brand corrections.
16
+
17
+ Feed Markdown through Marpit. Separate slides with `---`, enable numbering with
18
+ `<!-- paginate: true -->`, and select a slide variant with
19
+ `<!-- _class: lead -->`. Use Marpit's `footer:` directive for the running
20
+ footer.
21
+
22
+ Load `tokens.css` on the containing page with `deck.css`. The theme reads the
23
+ document root; its color fallbacks do not provide font faces or logo data. Do
24
+ not mistake a deck that renders for one whose assets loaded.
25
+
26
+ Keep the supplied lockup so an exported PDF identifies itself without the share
27
+ page. Marpit's `![bg]` slides hide corner furniture, including that lockup;
28
+ account for the loss when choosing that layout. Use the logo data URI variables
29
+ for offline output, never retype the brand name in display type.
@@ -0,0 +1,50 @@
1
+ # Visual rules
2
+
3
+ Keep confident type, one decisive pink, and enough air to make the work clear.
4
+ Read exact values and component behavior from the CSS.
5
+
6
+ - Default to dark. Use light surfaces deliberately and rarely, such as print,
7
+ press pages, or a one-off email. Never use pure white as a surface.
8
+ - Use pink as the only accent, with one pink CTA per screen. Mint supports
9
+ structure, status, and supporting icons; never use it for a CTA.
10
+ - Do not use gradients. One radial halo behind a hero lockup is the sole
11
+ exception; it must read as lighting.
12
+ - Use flat, geometric, two-color imagery. No stock photography, AI imagery, or
13
+ hand-drawn textures. Ask for real assets when needed.
14
+ - Keep corners consistent within a component. Use full card borders, never
15
+ colored left stripes.
16
+ - Keep hover stationary. No parallax or looping animation. Preserve visible
17
+ focus rings when customizing controls.
18
+ - Use Lucide SVG icons with rounded caps and a 1.75px stroke: 20px in
19
+ nav/buttons, 24px in features, 16px in inputs. No emoji in UI chrome or icon
20
+ fonts.
21
+ - Use existing logo artwork; never redraw it. Follow README for asset selection
22
+ and regeneration. Reserve `--font-wordmark` for the lockup, never headings.
23
+ Monospace body is the practitioner signal; preserve it.
24
+ - Emphasize one word per headline with `<em>`; preserve the supplied drawn
25
+ italic.
26
+ - Keep body copy in one column, at most about 640px wide. Use two or three
27
+ columns for card grids, one on mobile, never four. Leave generous space
28
+ between blocks.
29
+ - Make nav the only sticky element. No sticky CTAs, chat bubbles, or cookie
30
+ banners.
31
+
32
+ ## Locked surfaces
33
+
34
+ Never substitute a Google Fonts import, including in mocks. It sends a referrer
35
+ to a third party and violates a self-only CSP.
36
+
37
+ When a surface cannot load local fonts, choose the degradation explicitly.
38
+ Inline a supported face as a data URI when the surface warrants the bytes;
39
+ always inline the wordmark subset when using live wordmark text. Otherwise use
40
+ the fallback stacks from `vars.css` knowingly. Email clients and artifact hosts
41
+ may reject font loading even when a page works locally.
42
+
43
+ Inlining CSS moves relative font resolution to the HTML location. Preserve that
44
+ relationship or embed the faces; copying styles alone is insufficient. Use
45
+ README for normal package integration.
46
+
47
+ A self-only CSP requires assets served from the consumer's origin or permitted
48
+ embedded data, not a CDN. For a deck theme with no slide element to attach
49
+ artwork to, use the supplied logo data URI variables. A PDF or offline snapshot
50
+ cannot rely on an origin to retrieve artwork.
@@ -0,0 +1,137 @@
1
+ # Voice and copy audit
2
+
3
+ Lead public-facing pages and introductions with this core framing:
4
+
5
+ > Build the systems and ways of working your business needs next.
6
+
7
+ For a supporting headline about existing systems, use:
8
+
9
+ > Make your systems work harder for your business.
10
+
11
+ Follow each headline with the work we will deliver and its business value. Write
12
+ concisely, warmly, then playfully, in that order.
13
+
14
+ ## Positioning and offers
15
+
16
+ Position NoTambourine as senior engineers who work inside the client's team and
17
+ take responsibility for delivery. Lead with the client's business goal and the
18
+ engineering work needed to reach it. Connect technical infrastructure with the
19
+ processes it supports. Show how better systems let a team handle more work
20
+ without adding manual steps. AI at the keyboard explains small-team economics;
21
+ it is not the offer.
22
+
23
+ Define fit by the intended result and the responsibility taken on. Mention
24
+ private-equity experience when relevant; keep general positioning open to any
25
+ ownership structure. The name means no padding.
26
+
27
+ Help referred readers confirm fit and explain the agency to colleagues. Keep the
28
+ signature beside a concrete explanation. Use this introduction:
29
+
30
+ > Build the systems and ways of working your business needs next. NoTambourine
31
+ > brings senior engineers into your team to lead delivery.
32
+
33
+ For a meta description or short directory listing, use:
34
+
35
+ > Senior engineers working inside your team to build the systems and ways of
36
+ > working your business needs next.
37
+
38
+ Give recognizable reasons to call: upgrading core systems, automating routine
39
+ work, or connecting systems so teams can act on current information. Connect
40
+ each to the work we can deliver. Describe infrastructure improvements through
41
+ the change in daily work: files arrive automatically, orders move between
42
+ systems, or a team can release updates more easily. Use examples that match the
43
+ engagement. Support claims of growth, time saved, or reliability with client
44
+ evidence.
45
+
46
+ Keep public positioning open to ambition as well as an existing constraint. In
47
+ discovery, ask what they want to accomplish, why now, and what successful
48
+ delivery would change. Name constraints once the client has described them or
49
+ the evidence establishes them. In a proposal, connect that specific constraint
50
+ to its business consequence and the work required.
51
+
52
+ Use these offer names and lead with outcomes:
53
+
54
+ - **Assessment:** Decide what to build or change first. Review the technology
55
+ and working processes against your business priorities and choose the next
56
+ investment.
57
+ - **Embedded:** Put senior engineers inside your team to lead delivery. Build
58
+ the systems and ways of working your business needs next.
59
+
60
+ Use "Start a conversation" for the primary invitation. Ask what the reader wants
61
+ to accomplish and when. Discuss fit before asking them to choose an engagement.
62
+
63
+ ## Register and evidence
64
+
65
+ - Address marketing readers as "you". In client deliverables, use "we" for the
66
+ client's organization with us inside it. Name the parties in proposals and
67
+ SOWs. Never use "I" as the author's voice.
68
+ - Do not sell in client deliverables: no logo wall, team slide, or methodology.
69
+ Explain their system back to them.
70
+ - Show the client's objective, what changed, and what they can now do. Use their
71
+ numbers when available, otherwise a verifiable before and after. Connect
72
+ delivered work to commercial and operational results when supported. Share
73
+ client evidence only with permission.
74
+ - Name who joins and takes responsibility for delivery. Express values as
75
+ commitments: direct access to the responsible person and covering our
76
+ estimating mistakes within agreed scope.
77
+ - Describe constraints without blaming the people who built the system. Explain
78
+ coordination without jokes about ceremony.
79
+
80
+ ## Names and mechanics
81
+
82
+ Use `NoTambourine` in human-facing sentences. Reserve `notambourine` for
83
+ technical slugs, paths, URLs, domains, GitHub organizations, npm names, and CSS
84
+ classes. Use `NoTambourine LLC` only in contracts, at most twice: one
85
+ Definitions anchor and the signature block. Reject `Notambourine` and
86
+ `No Tambourine`. Cite the public `AGENTS.md` for disputed naming flags.
87
+
88
+ Preserve `Senior engineers. No tambourine.` as a standalone signature: tagline,
89
+ slide, sign-off, or footer. The instrument is lowercase. This is the only
90
+ permitted spaced form.
91
+
92
+ Use sentence case for headlines, buttons, navigation, and labels. Reserve
93
+ uppercase for pink eyebrows; decks also use that treatment for sublabels. Follow
94
+ deck guidance for lowercase display headlines. Keep sentences short without
95
+ forcing a uniform rhythm. No throat-clearing, superlatives, or exclamation marks
96
+ in body copy.
97
+
98
+ Use ASCII punctuation: hyphens and straight quotes/apostrophes. No em/en dashes,
99
+ curly quotes, or single-character ellipses. Permit the interpunct as a
100
+ separator, as in `Tom Fuertes · Principal · NoTambourine`.
101
+
102
+ ## Audit before shipping
103
+
104
+ Audit anything clients or strangers see: pages, email, decks, proposals, SOWs,
105
+ READMEs, and release notes. Search for candidates, then judge them in context:
106
+
107
+ Check the opening first. It should name work the reader wants done and explain
108
+ our responsibility. Remove assumed pain, unearned urgency, and claims that could
109
+ describe any agency. Keep technical constraints where they explain a specific
110
+ decision or result.
111
+
112
+ ```sh
113
+ rg -n 'notambourine|Notambourine|No\s+Tambourine|NoTambourine LLC' <file>
114
+ rg -n '[\x{2014}\x{2013}\x{2018}\x{2019}\x{201C}\x{201D}\x{2026}]' <file>
115
+ rg -ni '\b(proven|world-class|battle-tested|results-driven|cutting-edge|best-in-class|seamless|robust|leverage|synergy|holistic|bespoke)\b' <file>
116
+ rg -ni ',\s+(ensuring|enabling|allowing|helping|driving|empowering|delivering|providing)\b' <file>
117
+ rg -ni "this matters|it's worth noting|it is worth noting|needless to say|at the end of the day|in today's" <file>
118
+ rg -n '!(\s|$)|\bI\b' <file>
119
+ ```
120
+
121
+ Check legal-name occurrences against the contract limit. Ignore technical slugs
122
+ and code when judging wordmark hits; searches do not understand Markdown fences
123
+ or backticks. Ignore literal technical uses such as "a robust error path" and
124
+ `I` in quotations, identifiers, or names.
125
+
126
+ Cut puffery and keep evidence. Replace importance-flagging with the consequence.
127
+ Cut participle tails at the comma. Read manually for grandiose scope and
128
+ three-item adjective lists; narrow claims to something a client can hold us to.
129
+ If cutting words leaves the claim intact, remove them.
130
+
131
+ Preserve three fixtures even when they resemble padding: the signature, factual
132
+ three-item lines such as "Two engineers, six weeks, one shipped feature", and a
133
+ headline's single pink `<em>`. Typographic emphasis is not a boldface tic.
134
+
135
+ Format source documents with Prettier before sharing or exporting, including
136
+ Markdown. Use the repository's pinned version and configuration. Review the
137
+ rendered document after formatting, especially slide breaks and tables.