# Cooper Corbett Founder and product engineer in Australia. I lead product and engineering at Tilt Legal and write about software and legal work. ## Writing 2026-04-25 — [Hello, World]() — First post — placeholder content for the blog pipeline. [all writing]() ## Elsewhere [Work]() — Selected work in legal software, AI, and research. [About]() — I build software for legal work. [Currently]() — 2026-09-20 — A snapshot of what I'm spending my attention on. [GitHub]() [Email]() --- # About I'm Cooper, a co-founder and chief technology officer at [Tilt Legal](https://tilt.legal). I lead product and engineering, working with lawyers to understand their work and turn it into useful software. ## Work I've built legal software with law firms internationally, taking products from concept to paid use. That work includes environmental, social, and governance compliance, workplace investigations, and legal-cost assessment. I also work on [Mobius](https://tilt.legal/mobius), Tilt Legal's AI platform for legal work. I design agents to gather evidence, use tools, and produce analysis with sources that lawyers can check. My work covers the product, the software behind it, and the tests used to assess its behaviour. ## Background I studied law and computer science at Monash, with a focus on AI and data science. Before Tilt Legal, I worked across legal practice, the Digital Law Group, and legal operations at Herbert Smith Freehills, now Herbert Smith Freehills Kramer. I built workflow software, researched smart legal contracts, and taught lawyers software development. That combination shapes how I build. I work through the decisions, evidence, and review points with lawyers, then decide what the software should automate, explain, or leave to them. --- # Work Selected work in legal software, AI, and research. ## Products \& systems ### Tilt Legal 2022— · co-founder \& CTO I co-founded Tilt Legal and lead product and engineering. I've built legal software with Australian and UK legal teams and taken products from concept to paid use. ### Mobius 2022— · agents, evaluation \& product [Mobius]() is Tilt Legal's AI platform for legal work. I lead development of long-running agents that use tools and sandboxed environments to examine documents and produce analysis with sources for lawyer review, and the evaluation harnesses that check legal meaning, evidence, citations, process, and lawyer oversight together. I also led its re-architecture around Effect, a TypeScript library, so people and coding agents can make safe, testable changes. Mobius was selected for the [2025 cohort of Lander \& Rogers' LawTech Hub](). ### HERO client work · regulatory data \& delivery Through Tilt Legal, I worked on [HERO]() with Herbert Smith Freehills Kramer: a regulatory data platform that turns AASB S2, ESRS, and related ESG reporting frameworks into a structured model lawyers can maintain as the rules change. The team delivered a working MVP in three months and onboarded the first paying client in six; major ASX 100 organisations now use it. ### CSRD Mapper client work · rules engine \& legal logic A separate Herbert Smith Freehills Kramer project. I translated rules about jurisdiction, corporate structure, entity classification, ownership, and exceptions into testable decision logic with legal explanations. ### Legal Aid MCP 2026 · civic legal information I converted Victoria Legal Aid information into a structured Markdown corpus and built an MCP server over it with search, page listing, and content retrieval, plus a proxy for public HTML. It is exploratory work on making public legal information easier for people and AI systems to use. ## Research \& writing ### Smart legal contracts 2020—22 · research \& legal engineering At Monash and in the Digital Law Group, I researched how software can represent legal rights and obligations, and what happens when its behaviour differs from the contract's meaning. ### Accord Project 2020—22 · prototype I built an executable asset-sale agreement prototype with the Accord Project: a natural-language template, a Concerto typed model, and Ergo logic for the agreement's behaviour. ### Monash \& LSE 2017—22 · research essays \& coursework At Monash, I built and evaluated machine-learning models for cancer-tissue images and created interactive data visualisations. During LSE's Cyberlaw summer school, I researched data-localisation policies, weighing privacy and security aims against costs, competition, and the needs of digital services. ## Speaking \& practice ### AI \& Legal Practice 2025 · invited panellist I joined the Victorian Bar's AI \& Legal Practice: Practicalities, Challenges \& New Horizons symposium at Koiki Mabo Chambers, alongside the Victorian Legal Services Commissioner, senior counsel, and legal technologists, to discuss the practical uses and limits of AI in legal work. ### Digital Law Group 2019—22 · training \& communication At Herbert Smith Freehills, now Herbert Smith Freehills Kramer, I built internal workflow software, contributed technology-law research, and trained lawyers in software development and project management. ### Start-up and Innovation Law Clinic 2021 · supervised client advice Through Monash's Start-up and Innovation Law Clinic, I advised startups under supervision on privacy, consumer data, and product design. ## Recognition ### Australian AI Awards 2026 · finalist Named a finalist for AI Software Engineer of the Year at the Australian AI Awards 2026. --- # Currently A snapshot of what I'm spending my attention on. Inspired by Derek Sivers' [/now page](https://nownownow.com/about) idea — updated when it changes, dated when it last changed. ## Work Most of my time goes into [Mobius](https://tilt.legal/mobius) at Tilt Legal. The current focus is an evaluation framework for long-running agent tasks — testing and refining the prompts, skills, tools, and workflows the agents use — and the investigation workflows we've shaped with workplace investigators, where agents gather, organise, and cite evidence and the lawyer keeps the findings. Underneath that is the engineering system: a monorepo built on Effect with live, test, and mock service layers, so the team and our coding agents can change things safely. ## Tinkering This site, mostly. Page copy authored in Markdown with validated frontmatter, a token-first design system in `packages/ui`, file-based routes in `apps/web`, and Markdown and MCP siblings so machines can read the same content people do. ## Where Melbourne. --- # Writing \& notes A chronological feed. 2026-04-25 — [Hello, World]() — First post — placeholder content for the blog pipeline. --- # Hello, World This is the first post in the blog. It's used as a smoke test for the `@packages/blog` content pipeline (parse, validate frontmatter, expose typed posts). A snippet from the post loader, to exercise the syntax theme: ```typescript import { defineDocs } from "fumadocs-mdx/config"; export const posts = defineDocs({ dir: "../../content/posts", docs: { async: true }, }); ``` And the local-dev command that boots the site: ```bash cd apps/web && PORT=3460 bun --bun vite dev ``` --- # Design system An index for the site design source of truth. Start with foundations, inspect component primitives, then compose them into route layouts. Foundations for colour, type, spacing, radii, shadows, semantic surfaces, and texture restrictions. Foundations theme Reusable UI primitives from apps/web, shown in their composed states with the surface component beside controls and forms. Library components Canonical page shells and skeletons that show how routes compose primitives, composites, and layout leaves. Layouts layouts Principles, token semantics, page archetypes, and texture restrictions. Primitive -\> composite -\> layout -\> route rules, component admission, non-display reasons, and leaf ownership. Primitive tokens, semantic aliases, Tailwind theme references, and CSS-backed overlay contracts. Visible status, owner, source path, package export, states, accessibility, usage, examples, and non-display reasons. Route/page skeletons showing how primitives and composites become layouts. Current document owners and the accepted Site replacement. contribution Start from the local inventory and route catalogue, then update the current owner through docs/README.md. component admission A reusable component needs package ownership, explicit export, /design/components metadata, meaningful states, accessibility notes, usage guidance, and browser proof. feedback Record visual or composition defects in the active spec or plan with screenshots, route paths, affected primitive/composite level, and the shared owner to fix. deprecation Mark deprecated or app-only items with status, replacement guidance, and a migration note before removal. Do not silently remove exported package surfaces. non-display If a component cannot render directly in the catalogue, keep a visible non-display reason with owner, source path, states, accessibility, and usage guidance. Design system An index for the site design source of truth. Start with foundations, inspect component primitives, then compose them into route layouts. design system sections model composition model The route family follows the primitive, composite, and layout hierarchy used by product pages. /design Landing page and map of the system. /design/theme Foundations, semantic roles, component recipes, and texture restrictions. /design/components Component primitives and their documented surface recipes. /design/layouts Page skeletons composed from primitives and composites. governance source of truth and contribution Local docs, route catalogues, package code, and MCP references each have a specific job. Keep durable design changes visible here. home design --- # Theme Themes and token foundations: colour, typography, spacing, radii, shadows, semantic planes, component recipes, and documented texture behavior. page plane raised plane inset plane hairline between rows dotted 2px row rhythm structure: section, header, nameplate ember: the present tense editorial emphasis interaction 0.75rem / captions, kbd, footnotes 0.875rem / small UI, table cells 1rem / body 1.125rem / wordmark, deck 1.375rem / sub-headings 1.75rem / section headings 2.25rem / page headings 3rem / post titles 4.5rem / display only nameplate display and page titles display headings, compact UI body and decks prose reading text nameplate floor display section titles headings body captions, kbd mono labels, wordmark cooper corbett nameplate / mono 700 / lowercase / front page only Design system display / sans / tight leading / display tracking A drafting-board interface with visible construction. page-title / sans / responsive title scale Founder and product engineer in Australia. cover / sans / the front page's cover line Primitive token to semantic alias section-title / sans / snug leading Overlay surface pair subheading / sans / compact panel headings Themes and token foundations stay inspectable without becoming route-local utility piles. lead / sans / normal leading Role classes own family, size, line-height, weight, and tracking while tone remains separate. body / sans / normal leading Dense catalogue notes remain readable without local type utility piles. body-small / sans / dense descriptions Email address label / sans / form and control labels caption / source path / package export caption / mono / loose tracking 20 Sep 2026 slot / mono / dates, periods and routes in the gutter Foundations mono-label / uppercase / catalogue eyebrows \--text-4xl--line-height code / mono / compact technical identifiers .type-nameplate The front page's title, once per site. .type-display Hero and design-system introduction titles. .type-page-title Route titles, post headers, and long page headings. .type-body Default prose, page copy, and route explanations. .type-slot Dates, periods and routes hung in the page gutter. .mono-label Eyebrows, source labels, dates, and technical metadata. 0 2px / chips, kbd, tags, favicon 4px / buttons, inputs 6px / cards 8px / dialogs, popovers flat page canvas; no texture ordinary content plane; no texture standalone panel; no texture contained secondary plane; no texture floating interactive plane; no texture rare editorial plane; paper texture allowed page canvas, prose, controls \--bg / --fg base semantic reference Card, Surface content, inventory rows \--bg-elevated raised surface pair DropdownMenu, Select, Combobox, Tooltip, AlertDialog ui-overlay-surface overlay surface pair Button default, brand emphasis \--primary-foreground primary control pair editorial emphasis, focused menu items \--accent-foreground emphasis pair links, focus, live UI \--ring interaction reference surface semantic tone + border + foreground Ordinary panels and catalogue specimens; no texture. overlay popover pair + border-strong + shadow-pop + z-index layer Popup menus, selects, comboboxes, tooltips, and dialogs. control control fill + control foreground + focus ring + compact radius Buttons, triggers, and compact command surfaces. feature feature tone + paper pseudo-layer + readable content Documented /design specimen only; never ordinary cards or controls. A drafting-board interface with visible construction. The sans face carries prose and headings. The mono face is reserved for dates, labels, code, numerals, and the site identity. v0.1.0 \--font-mono Aa composite token anatomy Typography roles are composite tokens: each role binds family, size, line-height, weight, and tracking while tone stays separate. responsive specimen A deliberately long route title that has to wrap without touching the next line of copy. page-title / narrow frame / balanced wrap dense example Compact catalogue text stays legible at control density. mono-label + body-small + caption long code stress \--type-page-title-letter-spacing remains readable beside captions, labels, and dense metadata. caption mono code tone="canvas" Flat page canvas. This role establishes the quiet background and never receives texture. tone="base" Ordinary content plane for unframed route sections. It remains quiet in both themes. tone="raised" Standalone panel with a tonal step and hairline boundary, without decorative texture. tone="inset" Contained secondary plane for dense metadata, code, and secondary information. tone="overlay" Opaque interactive plane for menus, dialogs, and other floating UI. Texture is not allowed. tone="feature" texture="paper" Rare editorial plane. Paper is a decorative layer behind content, removed for print and stronger-contrast modes. primitive token semantic alias reference \--bg quiet page canvas \--bg-elevated raised panels and cards \--bg-sunken code, loading, inset states signal material The field prints in one place only: a framed plate, a keyline and a paper gap around a night ground. It is a 4 x 4 ordered dither on 2 CSS px cells with four ink levels. A plate is tuned to a frequency taken from its route, so the same page always prints the same plate, and a new frequency retunes it in four dither steps. It drifts for eight seconds after arriving or retuning, then holds a still frame. The page around it is flat paper: nothing prints behind text. threshold order Theme Themes and token foundations: colour, typography, spacing, radii, shadows, semantic planes, component recipes, and documented texture behavior. themes primitive and semantic colour Primitive scales stay available for inspection. Components use semantic tokens so light and dark themes are a token flip. relationships primitive token to semantic alias Primitive tokens name raw scales. Semantic aliases and references carry product meaning, then components consume those semantic relationships. type fonts and scale The default reading face carries prose and headings. The mono face carries identity, dates, code, labels, and numeric texture. spacing spacing, radii, and shadows The system favors a 4px spacing ladder, small architectural radii, and hairlines before elevation. surfaces semantic planes, texture, and signal material Primitive color inputs feed semantic roles. Surface recipes choose those roles; paper texture is restricted to the feature specimen. The signal material is app-owned, outside the package API, and marks only generated content, never the reading surface. composites composite token recipes Composite tokens are repeated token relationships: surface, overlay, control, and feature recipes that combine related decisions. home design theme cooper corbett --- # Components The relevant shared UI primitives rendered as a catalogue. Compose these before adding route-local UI. flat page canvas; no texture ordinary content plane; no texture standalone panel; no texture contained secondary plane; no texture floating interactive plane; no texture rare editorial plane; paper texture allowed role and aria semantics come from Alert structure default, destructive Callouts, errors, warnings, and route boundary messages. dialog title, description, focus return, Escape close closed, open, cancel, action Destructive confirmations and irreversible command review. text label remains visible; never color-only status default, secondary, outline, destructive Inline status, category, and metadata labels. labelled nav landmark, ordered list, aria-current page, decorative separators link, current, separator, app-owned link class Route orientation trails where apps own TanStack Link and routes own item order. native button semantics with focus-visible ring default, secondary, outline, ghost, link, disabled Every command button and custom trigger base. labelled input owns active option and empty state closed, open, filtered, empty Search-as-you-type selection where filtering matters. renders time with dateTime muted, subtle, strong Single date rendering primitive for posts and metadata. menu roles, keyboard navigation, Escape focus return closed, open, highlighted, disabled Small command menus and selection-like action lists. announces empty content through normal document flow empty, empty with action No-results, 404, missing data, and loading fallback endpoints. label, description, and invalid state stay adjacent default, invalid, disabled Form field rhythm around inputs, textareas, and selects. inherits native input semantics default, focus, invalid, disabled Single-line text entry. role group keeps addons and control connected inline start/end, block start/end, action button Inputs with prefix, suffix, keyboard hints, or local command. ul/li semantics preserve chronological list structure default, compact, date/body/title/description slots Chronological writing, activity, and work feeds before route-local list scaffolding. native label; caller supplies htmlFor or wraps control default, disabled via parent group Standalone form labels when Field is too heavy. description-list semantics preserve term and value pairs responsive, inline, stack; foreground, muted, subtle tones Compact route, post, and project metadata rows. main, header, section, and article semantics shell width, shell rhythm, header layout, section rhythm PageShell, PageHeader, PageSection, and ProsePage for route-high layout composition. role alert from Alert; route supplies action semantics default, destructive, with action slot Presentational route error UI while TanStack retry commands remain in the route. keyboard selection with visible trigger value closed, open, selected, disabled Bounded option sets where filtering is unnecessary. decorative separator hidden from focus order horizontal Section breaks and card internals instead of border divs. textarea owns native multiline semantics default, focus, invalid, disabled Multiline text entry. Heading level selects native h1-h6; text and code use native elements without ARIA-only semantics Heading levels 1-6, text roles, code/span/kbd elements, foreground/muted/subtle/beacon/destructive tones Canonical Heading, Text, and CodeText primitives for visible text roles. native select has a deterministic accessible label light, dark, system Compact native light, dark, and system selector. hover and focus disclosure for short hints closed, open, delayed Short labels for icon-only or dense controls. figure caption and copy button label static, copy idle, copy success MDX code figures and pre overrides in posts. alt text is mandatory; caption is optional image, image with caption MDX images until responsive sources land. heading and description hierarchy stays inside card default, with footer actions Repeated content surfaces and component examples. paper texture is decorative, stays behind content, and is suppressed for print and stronger-contrast modes tone: canvas | base | raised | inset | overlay | feature; texture: none | paper Semantic planes composed high in routes; paper is limited to documented feature specimens. text identity; not a navigation landmark header, footer Site identity in header, footer, and design specimens. composed page fallback keeps user action explicit App-only route boundary; represented here by Alert plus Button examples. caught error, reset command Route error leaves own fallback messaging and reset command. composed empty page keeps heading and recovery action App-only route boundary; represented here by the Empty primitive. missing route 404 leaf owns its fallback copy and navigation command. loading skeleton announces status, decorative blocks stay hidden, and loaded MDX keeps its source semantics App-only content-loader boundary; the post route capture shows loaded content and browser tests cover the skeleton. loaded MDX, loading skeleton Post routes load compiled MDX while keeping a token-backed, announced fallback beside the owning Suspense boundary. inherits native Button naming, focus, disabled, and command semantics App-only router command wrapper; represented by the package Button while browser tests prove invalidation. default, disabled, route invalidation Shared retry command for route loader and error branches without duplicating router invalidation in each route. A drafting-board interface with visible construction. The sans face carries prose and headings. The mono face is reserved for dates, labels, code, numerals, and the site identity. v0.1.0 \--font-mono Aa composite token anatomy Typography roles are composite tokens: each role binds family, size, line-height, weight, and tracking while tone stays separate. responsive specimen A deliberately long route title that has to wrap without touching the next line of copy. page-title / narrow frame / balanced wrap dense example Compact catalogue text stays legible at control density. mono-label + body-small + caption long code stress \--type-page-title-letter-spacing remains readable beside captions, labels, and dense metadata. caption mono code tone="canvas" Flat page canvas. This role establishes the quiet background and never receives texture. tone="base" Ordinary content plane for unframed route sections. It remains quiet in both themes. tone="raised" Standalone panel with a tonal step and hairline boundary, without decorative texture. tone="inset" Contained secondary plane for dense metadata, code, and secondary information. tone="overlay" Opaque interactive plane for menus, dialogs, and other floating UI. Texture is not allowed. tone="feature" texture="paper" Rare editorial plane. Paper is a decorative layer behind content, removed for print and stronger-contrast modes. primitive token semantic alias reference \--bg quiet page canvas \--bg-elevated raised panels and cards \--bg-sunken code, loading, inset states signal material The field prints in one place only: a framed plate, a keyline and a paper gap around a night ground. It is a 4 x 4 ordered dither on 2 CSS px cells with four ink levels. A plate is tuned to a frequency taken from its route, so the same page always prints the same plate, and a new frequency retunes it in four dither steps. It drifts for eight seconds after arriving or retuning, then holds a still frame. The page around it is flat paper: nothing prints behind text. threshold order / source path package export states: accessibility: usage: non-display: primitive catalogue composite catalogue layout catalogue primitive examples typography primitives Heading, Text, and CodeText expose the canonical role layer. Semantic section title with native heading level Role controls family, size, line-height, weight, and tracking. Tone stays separate and resolves through semantic color tokens. Section title Dense descriptions use the same primitive instead of local text utility piles. \--type-body-font-size packages/ui/src/components/typography.tsx cmd k @packages/ui/components/typography actions and status Button and Badge variants provide the action and status base. default secondary outline ghost link default secondary outline destructive @packages/ui/components/card inspect form controls Field primitives own label, description, and validation rhythm. name cooper corbett Inputs stay square, dense, and tokenized. notes Pattern usage, component behavior, and token rationale. standalone label search component leaves cmd k filter tokens run semantic split Beacon carries interaction. Ember carries editorial emphasis. They should not decorate the same element. breadcrumb navigation Breadcrumbs expose route hierarchy while links remain app owned. home design components Use the native link primitive for plain anchors. Route modules can apply the same link class to TanStack Link so navigation remains app-owned. @packages/ui/components/breadcrumb overlay primitives Popup surfaces use the shared opaque overlay contract. menu inspect copy token archive Overlay primitive level primitive composite layout tooltip opaque popover surface Find primitive find primitive no primitive button menu Selected primitives alert dialog overlay contract Dialog content uses the same opaque popover plane as menus. cancel confirm @packages/ui overlay primitives empty and theme leaves Leaves own fallback content, commands, and local interaction state. no matching components Empty states are primitives with their own copy and recovery slot. clear filters theme-toggle Native light, dark, and system select. mdx primitives CodeBlock and Picture render post-owned content with package primitives. component.tsx picture primitive Isometric grid pattern sample MDX image wrapper with mandatory alt text. layout primitives Page, feed, metadata, and route error primitives stay presentational while routes own data and commands. layout Route-composed section PageHeader supplies the shell. The route supplies the visible text, loader data, and leaves. Feed and metadata slots Composable layouts Feed rows expose slots without knowing about posts. owner @packages/ui route work loader data and retry commands Recoverable route state Routes match the error and pass actions into this slot. retry @packages/ui/components/page @packages/ui/components/index-feed composite examples card composition Header, content, and footer keep repeated surfaces consistent. Cards are composites that combine typography, spacing, borders, and action slots without route-local styling. @packages/ui/components/card feature surface Surface exports CVA-backed tone and texture axes. Paper is decorative, behind readable content, and restricted to documented feature specimens. @packages/ui/components/surface surfaceVariants tone="feature" texture="paper" Components The relevant @packages/ui primitives rendered as a catalogue. Compose these before adding route-local UI. components component library Reusable primitives come from @packages/ui. This route composes them rather than forking a separate design system. examples component examples Primitive and composite examples exercise the exported package components before route-local markup is considered. surfaces surface primitive Surface applies documented semantic planes. It exposes CVA-owned tone and texture inputs without owning route structure or content. home design components cooper corbett Copy code Copied Code copied to the clipboard. Code could not be copied. Try again. \