The brand, in full.
A neo-brutalist engineering terminal: pure black ground, white ink, one phosphor-green accent reserved for commitments, one monospace family, zero radius, 2px borders, hard offset shadows, and readouts that are real. It looks like an instrument, not a brochure. Everything below is rendered from the tokens and the brand data — swap the tokens and the whole document re-skins.
- tokens
- v0.1.0
- source
- brand/tokens.json · design-language.md
- status
- handoff artifact · noindex
Identity & voice
Voice is first person singular — I, never we. A plural voice asserts a team that does not exist. Claims sit next to evidence or are written as commitments; marketing adjectives without adjacent evidence are banned outright.
>_ locked copy
- Hero headline
- Web software built end-to-end by one operator.
- Hero sub-line
- I'm Stanimir Nikolov. Full-Stag Digital is my one-operator studio in Eindhoven, Netherlands — web apps, online stores, booking sites. I build them end-to-end and I don't hand you off.
- Primary CTA
- Start the conversation
- Closing CTA
- Send me your problem
- CTA claim line
- Odd problem, weird integration, or no idea where to start — bring it.
- Contact lead-in
- Email is the way in:
>_ commitments — the one job green does
- A written feasibility report before any commitment. src: How I work · step 03
- A fixed quote after it. src: How I work · step 04
- Requirement changes go to a ledger for the next version instead of silently expanding scope. src: stated commitment — no ledger exists yet
>_ voice — do / don't
First person singular
No marketing adjective without adjacent evidence
A claim sits next to its evidence, or is written as a commitment
Banned adjectives: innovative, seamless, cutting-edge, world-class, best-in-class .
The mark
The stag head is the only illustrative element the brand owns. Base fill is white or currentColor — never solid green (one scoped exception: the favicon, Amendment E), never distorted. Shipped sizes (escalated 2026-07-06): CTA glyph 32px, nav 72px, footer 88px, hero up to 320px. Minimum 24px; clear space at least 25% of the mark's height.
- Base fill is white or currentColor — never solid green, never distorted or cropped.
- The only illustrative element the brand owns; icons are lucide, used only to disambiguate a label.
- Amendment C glow trace is scoped to exactly this treatment on exactly this element; it generalises to nothing.
- All motion on the mark is removed under prefers-reduced-motion.
>_ variant inventory (source → shipped)
- The mark — source of truth
- brand/assets/deer-head-outline-1.svgSingle closed compound outline, white fill. Every shipped rendering derives from it.
- Live in-app mark
- app/components/StagMark.vueoutline-1's path inlined verbatim; fill driven by tone (ink / accent / current); aria-hidden.
- Static asset
- public/brand/stag-mark.svgByte-identical copy of outline-1, served at /brand/stag-mark.svg.
- Tab icon — Amendment E
- public/favicon.svgoutline-1 on a black backdrop with the fill flipped to the accent green. The one green-filled rendering — ratified as a scoped exception at operator direction (Amendment E, 2026-07-06); like Amendment C it generalises to nothing else.
- Full illustration
- brand/assets/deer-head.svg → public/brand/stag-mark-full.svgThe detailed gradient-shaded rendering — a static asset for external/manual use, never the UI mark.
- Unused alternates
- brand/assets/deer-head-outline-{2,3}.svgSource options only; no shipped derivative traces to either.
>_ misuse — never
Wordmark lockups
PendingThree dot-pattern wordmark lockups are planned (PLAN.md stage 0) but not on disk. They are documented here when the operator ships them — never mocked up in the meantime.
Colour
Colour carries meaning before branding. Every colour maps to a semantic role; no colour may be introduced without one. The binding rule is on the accent: green marks commitment and nothing else.
>_ semantic roles
>_ surface steps
>_ accent — one atomic state machine
Default, hover, and active change together or not at all. A lone default flip splits the press state's identity — measured: red at rest, green on hover. Hover and active are derived from the default in the skin.
>_ status accents
Typography
JetBrains Mono carries the whole identity. The distinction a second typeface would carry is expressed inside the mono family instead — through weight, case, colour, and tabular figures.
>_ four semantic levels
- Narrative
- Prose a human readsRegular weight, sentence case, foreground
- Specification
- Headings, section labelsBold, uppercase, wide tracking
- Evidence
- Numbers, metrics, code, commitmentstabular-nums, accent or foreground, source + date adjacent
- Metadata
- Labels, captions, provenance linesSmall, muted ink, uppercase where terse
>_ type scale (provisional)
Aa
- display-max
- 6rem
Aa
- display
- 4.5rem
Built end-to-end
- h1
- 3rem
One operator
- h2
- 2rem
A written feasibility report
- h3
- 1.5rem
Email is the way in.
- lead
- 1.25rem
I build them end-to-end and I don't hand you off.
- body
- 1rem
Secondary detail and fine print.
- small
- 0.875rem
SRC: HOW I WORK · STEP 03
- metadata
- 0.75rem
Space, elevation, texture
Hierarchy is built from spacing (8px base), 2px borders, and surface steps, then — as the only sanctioned third dimension — a hard offset shadow. Soft or blurred shadows are banned globally; radius is 0 everywhere.
>_ radius & hard offset shadow
>_ texture
Motion
Motion communicates a state change — press, reveal, focus, load. Durations come only from tokens; no springs, no bounces, no scroll choreography. Three ambient signatures are sanctioned because they signal liveness, and all three vanish under prefers-reduced-motion.
>_ durations
>_ the three sanctioned signatures (live)
tokens v0.1.0 · commit 3bac74d-dirty · built 2026-07-08 11:45 UTC · signature demo — a ticker carries a real readout, never decoration ·
All three are removed entirely under prefers-reduced-motion.
Components
Every component is the real shipped one, rendered live in its variants and states — not a screenshot. This is the implementation reference.
>_ BrutalButton — variants
>_ the primary CTA — focal point (Amendment D)
The one green-stays-green button. Variant "cta" walks the accent atomic group (default → hover → active) instead of inverting to transparent, sits one elevation tier above every other block (8px shadow + the matching deep press), and carries the stag glyph as identity framing. One per page — the closing "Start the conversation" (and the hero's, on the homepage). Nav, form submits, and utility buttons keep the quieter variants so the focal point stays focal.
>_ ServiceCard (teaser) & ServiceBrief (with inspection layer)
- 01
Web apps & SaaS
Custom web applications built end-to-end — data model to interface. Type-safe, fast, and yours to own.
- 02
E-commerce
Online stores that take payment reliably and don't fight you at checkout. Built to sell, not to impress other developers.
My secondary education was e-commerce (2012–2017); the point hasn't moved since: the store has to take money reliably. I build the catalogue, the checkout, and the payment integration, and I write automated tests (Playwright, Vitest) for the exact paths where a failed step costs you an order.
Promo visualTechnical schematic
>_ ProcessStep (with commitment)
03 — Feasibility report
A written recommendation: the direction I'd take, what it involves, and an honest cost — before you commit.
- Outcome
- A written recommendation you can take to any developer.
A written feasibility report before any commitment.
Fig.03Feasibility report
>_ FactList
Education
- 2017 –
Software engineering, Fontys ICT, Eindhoven
Since September 2017 — graduation in progress.
- 2024
Digital Experience Design minor certificate, Fontys ICT
Minor certificate, completed 2024.
>_ PendingSlot (honest absence)
VAT (BTW) number
PendingNot yet designated for publication. Renders visibly pending — never a fabricated value.
>_ LegalEntry
- Trade name
- Full-Stag Digital
>_ ContactForm (disabled prototype preview)
>_ CtaBlock
Not sure it's even possible? That's what the first conversation is for.
You get a written feasibility report and an honest cost before you commit to anything. src: How I work · step 03
>_ SiteNav — index links · accent hover · active underline
The real component in a static frame (in situ it is the sticky header at the top of this page). Each link takes a position-derived 01/02… index and fills with the accent on hover; the link matching the current route carries a 2px underline via aria-current — visible on the live nav when you are on a linked page, not on this unlisted styleguide. Below 1024px the links collapse behind the menu toggle; nothing is hover-only.
>_ SiteSection — the index-rail section shell
The shared full-width section shell: an oversized index block, a terminal-style title, an optional corner pattern accent, and a contained inner wrapper. The homepage sections compose from it.
Content dropped into the default slot sits in the contained inner wrapper. The index is display text kept in sync by hand — section wayfinding, so it renders in the accent only as a sanctioned index, never as a commitment.
>_ InspectionLayer — persistent aside ≥1024px · disclosure below
The brand's interaction signature: Constraint / Decision / Tradeoff rows are always reachable. At ≥1024px it is a persistent aside (shown open here); below 1024px it collapses behind a real [+] / [-] disclosure button that is keyboard-focusable — never hover-only. This is the same layer embedded in ServiceBrief above.
>_ SiteFooter
Live in situ at the foot of every page. Brand colophon, the sitemap and legal columns, and the confirmed studio line (Eindhoven, KvK) — first-person, no marketing adjectives, the same voice invariant the whole site holds.
Block grammar
Pages compose from typed blocks; blocks compose from primitives (Claim, Evidence, Constraint, Decision, Commitment, Action, Context, Reference, Outcome, Tradeoff). Each block states what it must contain and what it may add.
| Block | Requires | Optional |
|---|---|---|
| Hero | Claim, Action | Commitment, live Evidence |
| Service | Claim (plain layer) | Constraint, Decision, Tradeoff (inspection layer) |
| Process step | Claim, Outcome | Commitment, Evidence |
| Ledger row | Outcome, Evidence (with provenance) | Reference, Tradeoff |
| CTA | Action, Commitment | Constraint |
| Contact | Action, Context (real facts only) | Commitment |
Honesty & evidence
Every visual element is honest or load-bearing, or it goes. Data shown is real; a readout that cannot be made real is removed, not faked. These are the mechanics that keep the terminal aesthetic true.
Accessibility
One structure, three readers: the same markup serves eyes, screen readers, and browsing agents. The accessibility rules and the agent rules are the same rules.
- Semantic elements do their real jobs: <button> for actions, <a> for navigation, never a clickable div; headings in document order.
- Every input has a programmatic label; every actionable element is visible, reasonably sized, and shows a pointer cursor.
- Nothing informational is hover-only — everything revealed on hover is reachable by keyboard focus and tap.
- No text hidden from humans but exposed to machines, except assistive labels that describe and never instruct.
Invariants & governance
Invariants come in two classes. Presentational ones are reversible values with no truth content — bendable under a sanctioned experiment. Truth invariants are never bendable; the correct response to a request that breaks one is refusal with citation.
>_ tier 1 — machine-checked
- 01Colours only from tokens — no arbitrary hex, rgb, or unknown utility classes.
- 02border-radius is 0 everywhere; no soft box-shadow outside the .brutal-shadow layer.
- 03Motion durations/easings only from tokens; no infinite loop outside the three sanctioned signatures.
- 04Every Evidence node carries source and date (content-schema gate).
- 05Copy contains no first-person plural and no banned marketing vocabulary (prose linter).
- 06Templates pass accessibility linting; public pages emit JSON-LD.
>_ tier 2 — judgment-checked
- 01Classify every element REQUIRED / SUPPORTING / DECORATIVE / MISLEADING — delete the last two.
- 02Strip test: with CSS off, the page still makes its argument in order.
- 03Survival test: would this element exist if colour, motion, and branding were removed?
- 04Third-reader test: could an agent, given only this page, answer the buyer question and act?
>_ transformation rules
- Hierarchy
- Spacing, then borders, then surface steps, then a hard offset shadow. Never a soft shadow or colour wash.
- Emphasis
- Weight and case, then size, then accent — only if it is a commitment. Never a new colour.
- Grouping
- Whitespace, then a border. Never a rounded card.
- Delight
- Make a readout real, or expose a decision. Never add an ornament.
- Trust
- Add evidence with provenance, or a commitment. Never add an adjective.
>_ forbidden outright
- Fabricated data of any kind — fake telemetry, coordinates, booking slots, statistics.
- Hover-only information (excludes keyboard and touch).
- Decorative symbolic artefacts — spheres, HUD rings, ornament that measures nothing.
- Soft or blurred shadows; rounded corners.
- Marketing adjectives without adjacent evidence.
- Any colour without a semantic role.
A request that breaks a presentational invariant is answered refuse → formal amendment → implement : the reviewing agent refuses with citation until the operator issues a scoped amendment, then implements it exactly. The accent index numerals and the mark's glow trace both entered this way.
Colophon
This magazine renders from the brand's own source of truth. Nothing here is hand-copied — the values trace to the tokens, the components are the shipped ones, and the copy is the ratified deck.
- Token source
- brand/tokens.json · v0.1.0
- Values read live via app/utils/brand.ts.
- Content source
- design-language.md · agent-kit · site.ts
- Copy is the operator-ratified deck.
- Templatable
- Swap the tokens, re-skin the document.
- Fully real once the token build script lands; today @theme is hand-synced with the source and CI diffs it.
- Framework seam
- A disciplined internal design system.
- Build the renderer once; every future brand instance earns its own magazine by swapping tokens.