The system behind this site, mapped to Depot.
This portfolio runs on a six-layer design system: a neutral token contract, one client pack that binds the brand, and components that only ever speak semantic names. Trainline runs Depot. Depot is internal, so the right-hand column below comes from what Trainline has published: a blog post, a job listing, a brand portal case study, the public brand guidelines. Every claim carries its source. Where I had to guess, I say so.
Brand primitives
tokens.css §1The brand's facts, and nothing else. A palette, one self-hosted face, a 4px spacing scale, a clamp() type ramp, soft radii by rule. This site shipped in my own brand first; the pack it wears now is built from Trainline's published colours — the re-skin was this one file.
The semantic contract
tokens.contract.cssThe interface. Every name a component is allowed to use, declared once with neutral defaults. No brand lives here; with no pack loaded, the base still renders coherent.
The client pack
tokens.css §2The binding. Primitives mapped onto the contract's slots, so a full re-skin is one swapped file and the structure never changes.
The component library
components.cssBrand-agnostic atoms, chrome and patterns. They reference semantic tokens only: never a primitive, never a literal. site.js builds the header and footer from config, so even the chrome re-skins as data.
The surfaces
This site, four case studies, five working prototypes. Each prototype app carries its own tokens inside the shell: the shell frames the exhibit; the work keeps its own voice.
The governance
The same shape, at two scales.
Palette, faces, scales, radius 0: the brand's facts in one file.
The names everything builds against, with neutral defaults.
Naming conventions and filing structures, standardised and fed into Depot.3 Design tokens: not published, so that one is my inference.
One swapped file re-skins the whole base. The structure never changes.
Co-branding rules (shared clear space, a dividing bar2) and Partner Solutions, which retails white-label under partner brands.
Brand-agnostic, discoverable, semantic names only.
This site, the case studies, five working prototypes.
The Trainline app on iOS and Android, the web, and the partner surfaces the platform retails through.
Read-only mirrors, a fixed load order, a promotion rule.
- Trainline, built with Frontify: the brand portal as single source of truth, since 2020.
- Our brand, thetrainline.com: logo, clear space and co-branding rules.
- How Trainline is reducing waste in the design process: The Trainline blog, 2023. It names Depot and describes the Design Waste Crew, naming conventions, templates, and "coded, discoverable" systems.
- Senior Product Designer, Design System (DEPOT): a Trainline job listing. The role champions Depot across divisions, evolves it, and partners with engineering.
One base, many brands.
Enterprise Solutions sells exactly this mechanic at scale: one retailing platform, re-branded for every carrier and business that runs on it. My version is portfolio-sized, but it is the same discipline: a contract the components trust, and a brand that arrives as data. Swap the pack, keep the system.
The practice page shows how I run it day to day: agents read the rules, gates hold the craft.