{
  "$schema": "https://ui.shadcn.com/schema/registry.json",
  "name": "astry-design-system",
  "homepage": "https://brand.astry.agency",
  "description": "Astry brand design system. Square corners, semantic tokens, single-file primitive pack, mascot library. Fetch any item via /r/<name>.json.",
  "version": "2026-05-22",
  "canonical": "https://brand.astry.agency",
  "repo": "https://github.com/martinbon39/astry",
  "instructions": {
    "installPrimitivePack": "npx shadcn@latest add https://brand.astry.agency/r/astry-ui.json",
    "fetchItem": "curl https://brand.astry.agency/r/<name>.json",
    "listAll": "curl https://brand.astry.agency/r/index.json",
    "contract": "Read /r/voice.json + /r/accessibility.json before writing any UI copy or interactive primitive."
  },
  "counts": {
    "total": 77,
    "mascots": {
      "available": 11,
      "missing": 46,
      "total": 57
    },
    "logos": 7
  },
  "items": [
    {
      "name": "tokens",
      "type": "registry:style",
      "title": "Astry tokens",
      "description": "CSS variables (light + dark) and Tailwind theme extension. Brand primitives → semantic tokens.",
      "url": "https://brand.astry.agency/r/tokens.json"
    },
    {
      "name": "astry-ui",
      "type": "registry:ui",
      "title": "Astry UI",
      "description": "Single-file pack of all Astry primitives. Square corners · semantic-token consumers · framer-motion animations · HugeIcons-backed Icon. Install once, get every primitive.",
      "url": "https://brand.astry.agency/r/astry-ui.json"
    },
    {
      "name": "voice",
      "type": "registry:lib",
      "title": "Astry voice contract",
      "description": "Direct. Concrete verbs. One idea per sentence. Period in brand color.",
      "url": "https://brand.astry.agency/r/voice.json"
    },
    {
      "name": "accessibility",
      "type": "registry:lib",
      "title": "Astry accessibility contract",
      "description": "WCAG 2.2 AA floor. Most primitives clear AAA.",
      "url": "https://brand.astry.agency/r/accessibility.json"
    },
    {
      "name": "angle",
      "type": "registry:file",
      "title": "Brand corner angle",
      "description": "Source path used by AngleCorner and BracketFrame. Keep as raw SVG for one-off compositions.",
      "url": "https://brand.astry.agency/r/angle.json"
    },
    {
      "name": "skill",
      "type": "registry:lib",
      "title": "Astry design-system skill (Claude Code)",
      "description": "Drop-in skill file for Claude Code · teaches any agent to query the Astry registry and respect brand rules.",
      "url": "https://brand.astry.agency/r/skill.json",
      "meta": {
        "kind": "skill",
        "assetUrl": "https://brand.astry.agency/r/skill.md"
      }
    },
    {
      "name": "fonts",
      "type": "registry:lib",
      "title": "Astry typography — Neue Haas Display Pro",
      "description": "Brand sans-serif. Drop the .ttf files into your project, then wire next/font/local or @font-face. Inter (mono) loads from Google Fonts — no local file needed.",
      "url": "https://brand.astry.agency/r/fonts.json",
      "meta": {
        "kind": "fonts",
        "family": "Neue Haas Display Pro",
        "fileCount": 16,
        "directory": "https://brand.astry.agency/fonts/Neue/"
      }
    },
    {
      "name": "team-martin",
      "type": "registry:file",
      "title": "Martin Bonan — Founder, Engineering",
      "description": "Astry founder portrait. 4 angles available. Use angles[] when generating images so models lock the identity.",
      "url": "https://brand.astry.agency/r/team-martin.json",
      "meta": {
        "kind": "team",
        "slug": "martin",
        "name": "Martin Bonan",
        "role": "Founder, Engineering",
        "founder": true,
        "assetUrl": "https://brand.astry.agency/brand/team/martin.png",
        "angleCount": 4
      }
    },
    {
      "name": "team-teo",
      "type": "registry:file",
      "title": "Téo Dagher — Founder, Operations",
      "description": "Astry founder portrait. 7 angles available. Use angles[] when generating images so models lock the identity.",
      "url": "https://brand.astry.agency/r/team-teo.json",
      "meta": {
        "kind": "team",
        "slug": "teo",
        "name": "Téo Dagher",
        "role": "Founder, Operations",
        "founder": true,
        "assetUrl": "https://brand.astry.agency/brand/team/teo.png",
        "angleCount": 7
      }
    },
    {
      "name": "team-mathis",
      "type": "registry:file",
      "title": "Mathis Cohen-Solal — Co-founder, Head of Sales",
      "description": "Astry founder portrait. 6 angles available. Use angles[] when generating images so models lock the identity.",
      "url": "https://brand.astry.agency/r/team-mathis.json",
      "meta": {
        "kind": "team",
        "slug": "mathis",
        "name": "Mathis Cohen-Solal",
        "role": "Co-founder, Head of Sales",
        "founder": true,
        "assetUrl": "https://brand.astry.agency/brand/team/mathis.png",
        "angleCount": 6
      }
    },
    {
      "name": "team-albert",
      "type": "registry:file",
      "title": "Albert Vallée-Duval — Chief of Staff",
      "description": "Astry team member portrait. 1 angle available. Use angles[] when generating images so models lock the identity.",
      "url": "https://brand.astry.agency/r/team-albert.json",
      "meta": {
        "kind": "team",
        "slug": "albert",
        "name": "Albert Vallée-Duval",
        "role": "Chief of Staff",
        "founder": false,
        "assetUrl": "https://brand.astry.agency/brand/team/albert.png",
        "angleCount": 1
      }
    },
    {
      "name": "mascot-happy",
      "type": "registry:file",
      "title": "Astry mascot — happy",
      "description": "Default positive state · success · onboarding completion · 'all good'.",
      "url": "https://brand.astry.agency/r/mascot-happy.json",
      "meta": {
        "kind": "mascot",
        "emotion": "happy",
        "category": "mood",
        "available": true,
        "needsGeneration": false,
        "assetUrl": "https://brand.astry.agency/brand/mascot/happy.svg",
        "pngUrl": "https://brand.astry.agency/brand/mascot-png/happy.png"
      }
    },
    {
      "name": "mascot-enjoy",
      "type": "registry:file",
      "title": "Astry mascot — enjoy",
      "description": "Casual engagement · 'this feels good' · positive secondary state.",
      "url": "https://brand.astry.agency/r/mascot-enjoy.json",
      "meta": {
        "kind": "mascot",
        "emotion": "enjoy",
        "category": "mood",
        "available": true,
        "needsGeneration": false,
        "assetUrl": "https://brand.astry.agency/brand/mascot/enjoy.svg",
        "pngUrl": "https://brand.astry.agency/brand/mascot-png/enjoy.png"
      }
    },
    {
      "name": "mascot-love",
      "type": "registry:file",
      "title": "Astry mascot — love",
      "description": "Favorites · likes · saved items · enthusiasm · '+1'.",
      "url": "https://brand.astry.agency/r/mascot-love.json",
      "meta": {
        "kind": "mascot",
        "emotion": "love",
        "category": "mood",
        "available": true,
        "needsGeneration": false,
        "assetUrl": "https://brand.astry.agency/brand/mascot/love.svg",
        "pngUrl": "https://brand.astry.agency/brand/mascot-png/love.png"
      }
    },
    {
      "name": "mascot-sad",
      "type": "registry:file",
      "title": "Astry mascot — sad",
      "description": "Errors · failed actions · empty results · negative feedback.",
      "url": "https://brand.astry.agency/r/mascot-sad.json",
      "meta": {
        "kind": "mascot",
        "emotion": "sad",
        "category": "mood",
        "available": true,
        "needsGeneration": false,
        "assetUrl": "https://brand.astry.agency/brand/mascot/sad.svg",
        "pngUrl": "https://brand.astry.agency/brand/mascot-png/sad.png"
      }
    },
    {
      "name": "mascot-tired",
      "type": "registry:file",
      "title": "Astry mascot — tired",
      "description": "End of session · 'time to wrap up' · billing summary · monthly reset.",
      "url": "https://brand.astry.agency/r/mascot-tired.json",
      "meta": {
        "kind": "mascot",
        "emotion": "tired",
        "category": "mood",
        "available": false,
        "needsGeneration": true,
        "assetUrl": "https://brand.astry.agency/brand/mascot/tired.svg",
        "pngUrl": null
      }
    },
    {
      "name": "mascot-excited",
      "type": "registry:file",
      "title": "Astry mascot — excited",
      "description": "Big reveal · feature launches · '+340% throughput' · achievement unlocked.",
      "url": "https://brand.astry.agency/r/mascot-excited.json",
      "meta": {
        "kind": "mascot",
        "emotion": "excited",
        "category": "mood",
        "available": false,
        "needsGeneration": true,
        "assetUrl": "https://brand.astry.agency/brand/mascot/excited.svg",
        "pngUrl": null
      }
    },
    {
      "name": "mascot-agree",
      "type": "registry:file",
      "title": "Astry mascot — agree",
      "description": "Confirmations · approval · review accepted · 'looks good'.",
      "url": "https://brand.astry.agency/r/mascot-agree.json",
      "meta": {
        "kind": "mascot",
        "emotion": "agree",
        "category": "reaction",
        "available": true,
        "needsGeneration": false,
        "assetUrl": "https://brand.astry.agency/brand/mascot/agree.svg",
        "pngUrl": "https://brand.astry.agency/brand/mascot-png/agree.png"
      }
    },
    {
      "name": "mascot-thumbsup",
      "type": "registry:file",
      "title": "Astry mascot — thumbsup",
      "description": "Direct approval · CI passed · PR merged · quick yes.",
      "url": "https://brand.astry.agency/r/mascot-thumbsup.json",
      "meta": {
        "kind": "mascot",
        "emotion": "thumbsup",
        "category": "reaction",
        "available": false,
        "needsGeneration": true,
        "assetUrl": "https://brand.astry.agency/brand/mascot/thumbsup.svg",
        "pngUrl": null
      }
    },
    {
      "name": "mascot-surprised",
      "type": "registry:file",
      "title": "Astry mascot — surprised",
      "description": "Notifications · new features · unexpected events · 'wait, what?'.",
      "url": "https://brand.astry.agency/r/mascot-surprised.json",
      "meta": {
        "kind": "mascot",
        "emotion": "surprised",
        "category": "reaction",
        "available": true,
        "needsGeneration": false,
        "assetUrl": "https://brand.astry.agency/brand/mascot/surprised.svg",
        "pngUrl": "https://brand.astry.agency/brand/mascot-png/surprised.png"
      }
    },
    {
      "name": "mascot-shrug",
      "type": "registry:file",
      "title": "Astry mascot — shrug",
      "description": "'I don't know' · ambiguous results · model has no answer.",
      "url": "https://brand.astry.agency/r/mascot-shrug.json",
      "meta": {
        "kind": "mascot",
        "emotion": "shrug",
        "category": "reaction",
        "available": false,
        "needsGeneration": true,
        "assetUrl": "https://brand.astry.agency/brand/mascot/shrug.svg",
        "pngUrl": null
      }
    },
    {
      "name": "mascot-cheering",
      "type": "registry:file",
      "title": "Astry mascot — cheering",
      "description": "Strong positive · big wins · QBR moment · annual roundup.",
      "url": "https://brand.astry.agency/r/mascot-cheering.json",
      "meta": {
        "kind": "mascot",
        "emotion": "cheering",
        "category": "reaction",
        "available": false,
        "needsGeneration": true,
        "assetUrl": "https://brand.astry.agency/brand/mascot/cheering.svg",
        "pngUrl": null
      }
    },
    {
      "name": "mascot-question",
      "type": "registry:file",
      "title": "Astry mascot — question",
      "description": "Empty states · help · search-no-results · 'how does this work?'.",
      "url": "https://brand.astry.agency/r/mascot-question.json",
      "meta": {
        "kind": "mascot",
        "emotion": "question",
        "category": "ux-state",
        "available": true,
        "needsGeneration": false,
        "assetUrl": "https://brand.astry.agency/brand/mascot/question.svg",
        "pngUrl": "https://brand.astry.agency/brand/mascot-png/question.png"
      }
    },
    {
      "name": "mascot-sleepy",
      "type": "registry:file",
      "title": "Astry mascot — sleepy",
      "description": "Idle · paused workflows · inactive accounts · zzz states.",
      "url": "https://brand.astry.agency/r/mascot-sleepy.json",
      "meta": {
        "kind": "mascot",
        "emotion": "sleepy",
        "category": "ux-state",
        "available": true,
        "needsGeneration": false,
        "assetUrl": "https://brand.astry.agency/brand/mascot/sleepy.svg",
        "pngUrl": "https://brand.astry.agency/brand/mascot-png/sleepy.png"
      }
    },
    {
      "name": "mascot-waving",
      "type": "registry:file",
      "title": "Astry mascot — waving",
      "description": "Hello · onboarding welcome · empty inbox · 'say hi to your team'.",
      "url": "https://brand.astry.agency/r/mascot-waving.json",
      "meta": {
        "kind": "mascot",
        "emotion": "waving",
        "category": "ux-state",
        "available": false,
        "needsGeneration": true,
        "assetUrl": "https://brand.astry.agency/brand/mascot/waving.svg",
        "pngUrl": null
      }
    },
    {
      "name": "mascot-waiting",
      "type": "registry:file",
      "title": "Astry mascot — waiting",
      "description": "Queued jobs · scheduled tasks · pending approval · 'we'll let you know'.",
      "url": "https://brand.astry.agency/r/mascot-waiting.json",
      "meta": {
        "kind": "mascot",
        "emotion": "waiting",
        "category": "ux-state",
        "available": false,
        "needsGeneration": true,
        "assetUrl": "https://brand.astry.agency/brand/mascot/waiting.svg",
        "pngUrl": null
      }
    },
    {
      "name": "mascot-focused",
      "type": "registry:file",
      "title": "Astry mascot — focused",
      "description": "Deep work · concentration mode · 'do not disturb' · async writing.",
      "url": "https://brand.astry.agency/r/mascot-focused.json",
      "meta": {
        "kind": "mascot",
        "emotion": "focused",
        "category": "ux-state",
        "available": false,
        "needsGeneration": true,
        "assetUrl": "https://brand.astry.agency/brand/mascot/focused.svg",
        "pngUrl": null
      }
    },
    {
      "name": "mascot-neutral",
      "type": "registry:file",
      "title": "Astry mascot — Neutral",
      "description": "Default identity · use as logo lockup mate · no expression.",
      "url": "https://brand.astry.agency/r/mascot-neutral.json",
      "meta": {
        "kind": "mascot",
        "emotion": "neutral",
        "category": "pose",
        "available": false,
        "needsGeneration": true,
        "assetUrl": "https://brand.astry.agency/brand/mascot/neutral.svg",
        "pngUrl": null
      }
    },
    {
      "name": "mascot-three-quarter-left",
      "type": "registry:file",
      "title": "Astry mascot — 3/4 Left",
      "description": "Decorative card edge · three-quarter pose facing left.",
      "url": "https://brand.astry.agency/r/mascot-three-quarter-left.json",
      "meta": {
        "kind": "mascot",
        "emotion": "three-quarter-left",
        "category": "pose",
        "available": false,
        "needsGeneration": true,
        "assetUrl": "https://brand.astry.agency/brand/mascot/three-quarter-left.svg",
        "pngUrl": null
      }
    },
    {
      "name": "mascot-three-quarter-right",
      "type": "registry:file",
      "title": "Astry mascot — 3/4 Right",
      "description": "Decorative card edge · three-quarter pose facing right.",
      "url": "https://brand.astry.agency/r/mascot-three-quarter-right.json",
      "meta": {
        "kind": "mascot",
        "emotion": "three-quarter-right",
        "category": "pose",
        "available": false,
        "needsGeneration": true,
        "assetUrl": "https://brand.astry.agency/brand/mascot/three-quarter-right.svg",
        "pngUrl": null
      }
    },
    {
      "name": "mascot-side-profile",
      "type": "registry:file",
      "title": "Astry mascot — Side profile",
      "description": "Strict side · used in motion strips · scrolling stickers.",
      "url": "https://brand.astry.agency/r/mascot-side-profile.json",
      "meta": {
        "kind": "mascot",
        "emotion": "side-profile",
        "category": "pose",
        "available": false,
        "needsGeneration": true,
        "assetUrl": "https://brand.astry.agency/brand/mascot/side-profile.svg",
        "pngUrl": null
      }
    },
    {
      "name": "mascot-standing",
      "type": "registry:file",
      "title": "Astry mascot — Standing",
      "description": "Foundational pose · body upright · still presence.",
      "url": "https://brand.astry.agency/r/mascot-standing.json",
      "meta": {
        "kind": "mascot",
        "emotion": "standing",
        "category": "pose",
        "available": false,
        "needsGeneration": true,
        "assetUrl": "https://brand.astry.agency/brand/mascot/standing.svg",
        "pngUrl": null
      }
    },
    {
      "name": "mascot-moving",
      "type": "registry:file",
      "title": "Astry mascot — Moving",
      "description": "Forward motion · subtle walk cycle · 'in transit'.",
      "url": "https://brand.astry.agency/r/mascot-moving.json",
      "meta": {
        "kind": "mascot",
        "emotion": "moving",
        "category": "motion",
        "available": false,
        "needsGeneration": true,
        "assetUrl": "https://brand.astry.agency/brand/mascot/moving.svg",
        "pngUrl": null
      }
    },
    {
      "name": "mascot-running",
      "type": "registry:file",
      "title": "Astry mascot — Running",
      "description": "Active motion · 'shipping fast' · velocity-positive states.",
      "url": "https://brand.astry.agency/r/mascot-running.json",
      "meta": {
        "kind": "mascot",
        "emotion": "running",
        "category": "motion",
        "available": false,
        "needsGeneration": true,
        "assetUrl": "https://brand.astry.agency/brand/mascot/running.svg",
        "pngUrl": null
      }
    },
    {
      "name": "mascot-sprinting",
      "type": "registry:file",
      "title": "Astry mascot — Sprinting",
      "description": "Maximum momentum · 'we're moving fast' · launch days.",
      "url": "https://brand.astry.agency/r/mascot-sprinting.json",
      "meta": {
        "kind": "mascot",
        "emotion": "sprinting",
        "category": "motion",
        "available": false,
        "needsGeneration": true,
        "assetUrl": "https://brand.astry.agency/brand/mascot/sprinting.svg",
        "pngUrl": null
      }
    },
    {
      "name": "mascot-braking",
      "type": "registry:file",
      "title": "Astry mascot — Braking",
      "description": "Slowing down · 'pause and review' · QA / staging gates.",
      "url": "https://brand.astry.agency/r/mascot-braking.json",
      "meta": {
        "kind": "mascot",
        "emotion": "braking",
        "category": "motion",
        "available": false,
        "needsGeneration": true,
        "assetUrl": "https://brand.astry.agency/brand/mascot/braking.svg",
        "pngUrl": null
      }
    },
    {
      "name": "mascot-jumping",
      "type": "registry:file",
      "title": "Astry mascot — Jumping",
      "description": "Leap forward · 'big release' · over a hurdle.",
      "url": "https://brand.astry.agency/r/mascot-jumping.json",
      "meta": {
        "kind": "mascot",
        "emotion": "jumping",
        "category": "motion",
        "available": false,
        "needsGeneration": true,
        "assetUrl": "https://brand.astry.agency/brand/mascot/jumping.svg",
        "pngUrl": null
      }
    },
    {
      "name": "mascot-runny",
      "type": "registry:file",
      "title": "Astry mascot — Runny",
      "description": "Loading · in-progress spinner · 'we're working on it'.",
      "url": "https://brand.astry.agency/r/mascot-runny.json",
      "meta": {
        "kind": "mascot",
        "emotion": "runny",
        "category": "motion",
        "available": true,
        "needsGeneration": false,
        "assetUrl": "https://brand.astry.agency/brand/mascot/runny.svg",
        "pngUrl": "https://brand.astry.agency/brand/mascot-png/runny.png"
      }
    },
    {
      "name": "mascot-pointing",
      "type": "registry:file",
      "title": "Astry mascot — Pointing",
      "description": "Direct attention · 'look here' · annotated UI element.",
      "url": "https://brand.astry.agency/r/mascot-pointing.json",
      "meta": {
        "kind": "mascot",
        "emotion": "pointing",
        "category": "gesture",
        "available": false,
        "needsGeneration": true,
        "assetUrl": "https://brand.astry.agency/brand/mascot/pointing.svg",
        "pngUrl": null
      }
    },
    {
      "name": "mascot-signaling",
      "type": "registry:file",
      "title": "Astry mascot — Signaling",
      "description": "Coordinating · 'sending a signal' · webhook fired.",
      "url": "https://brand.astry.agency/r/mascot-signaling.json",
      "meta": {
        "kind": "mascot",
        "emotion": "signaling",
        "category": "gesture",
        "available": false,
        "needsGeneration": true,
        "assetUrl": "https://brand.astry.agency/brand/mascot/signaling.svg",
        "pngUrl": null
      }
    },
    {
      "name": "mascot-signal-flag",
      "type": "registry:file",
      "title": "Astry mascot — Signal flag",
      "description": "Raising a flag · status change · 'mark this for review'.",
      "url": "https://brand.astry.agency/r/mascot-signal-flag.json",
      "meta": {
        "kind": "mascot",
        "emotion": "signal-flag",
        "category": "gesture",
        "available": false,
        "needsGeneration": true,
        "assetUrl": "https://brand.astry.agency/brand/mascot/signal-flag.svg",
        "pngUrl": null
      }
    },
    {
      "name": "mascot-spotting",
      "type": "registry:file",
      "title": "Astry mascot — Spotting",
      "description": "Found something · 'we caught it' · anomaly detected.",
      "url": "https://brand.astry.agency/r/mascot-spotting.json",
      "meta": {
        "kind": "mascot",
        "emotion": "spotting",
        "category": "gesture",
        "available": false,
        "needsGeneration": true,
        "assetUrl": "https://brand.astry.agency/brand/mascot/spotting.svg",
        "pngUrl": null
      }
    },
    {
      "name": "mascot-observing",
      "type": "registry:file",
      "title": "Astry mascot — Observing",
      "description": "Monitoring · watching the dashboard · passive presence.",
      "url": "https://brand.astry.agency/r/mascot-observing.json",
      "meta": {
        "kind": "mascot",
        "emotion": "observing",
        "category": "gesture",
        "available": false,
        "needsGeneration": true,
        "assetUrl": "https://brand.astry.agency/brand/mascot/observing.svg",
        "pngUrl": null
      }
    },
    {
      "name": "mascot-carrying",
      "type": "registry:file",
      "title": "Astry mascot — Carrying",
      "description": "Hauling work · 'doing the heavy lifting' · batch jobs.",
      "url": "https://brand.astry.agency/r/mascot-carrying.json",
      "meta": {
        "kind": "mascot",
        "emotion": "carrying",
        "category": "gesture",
        "available": false,
        "needsGeneration": true,
        "assetUrl": "https://brand.astry.agency/brand/mascot/carrying.svg",
        "pngUrl": null
      }
    },
    {
      "name": "mascot-at-the-system",
      "type": "registry:file",
      "title": "Astry mascot — At the system",
      "description": "Working at a console · 'in the tool with you'.",
      "url": "https://brand.astry.agency/r/mascot-at-the-system.json",
      "meta": {
        "kind": "mascot",
        "emotion": "at-the-system",
        "category": "gesture",
        "available": false,
        "needsGeneration": true,
        "assetUrl": "https://brand.astry.agency/brand/mascot/at-the-system.svg",
        "pngUrl": null
      }
    },
    {
      "name": "mascot-auditing",
      "type": "registry:file",
      "title": "Astry mascot — Auditing",
      "description": "Diagnostic phase · two-week audit · workflow map.",
      "url": "https://brand.astry.agency/r/mascot-auditing.json",
      "meta": {
        "kind": "mascot",
        "emotion": "auditing",
        "category": "role",
        "available": false,
        "needsGeneration": true,
        "assetUrl": "https://brand.astry.agency/brand/mascot/auditing.svg",
        "pngUrl": null
      }
    },
    {
      "name": "mascot-mapping",
      "type": "registry:file",
      "title": "Astry mascot — Mapping",
      "description": "Charting workflows · drawing the as-is.",
      "url": "https://brand.astry.agency/r/mascot-mapping.json",
      "meta": {
        "kind": "mascot",
        "emotion": "mapping",
        "category": "role",
        "available": false,
        "needsGeneration": true,
        "assetUrl": "https://brand.astry.agency/brand/mascot/mapping.svg",
        "pngUrl": null
      }
    },
    {
      "name": "mascot-analyzing",
      "type": "registry:file",
      "title": "Astry mascot — Analyzing",
      "description": "Crunching the data · finding leverage points.",
      "url": "https://brand.astry.agency/r/mascot-analyzing.json",
      "meta": {
        "kind": "mascot",
        "emotion": "analyzing",
        "category": "role",
        "available": false,
        "needsGeneration": true,
        "assetUrl": "https://brand.astry.agency/brand/mascot/analyzing.svg",
        "pngUrl": null
      }
    },
    {
      "name": "mascot-implementing",
      "type": "registry:file",
      "title": "Astry mascot — Implementing",
      "description": "Building the system · embedded engineering.",
      "url": "https://brand.astry.agency/r/mascot-implementing.json",
      "meta": {
        "kind": "mascot",
        "emotion": "implementing",
        "category": "role",
        "available": false,
        "needsGeneration": true,
        "assetUrl": "https://brand.astry.agency/brand/mascot/implementing.svg",
        "pngUrl": null
      }
    },
    {
      "name": "mascot-connecting",
      "type": "registry:file",
      "title": "Astry mascot — Connecting",
      "description": "Wiring tools together · integration setup.",
      "url": "https://brand.astry.agency/r/mascot-connecting.json",
      "meta": {
        "kind": "mascot",
        "emotion": "connecting",
        "category": "role",
        "available": false,
        "needsGeneration": true,
        "assetUrl": "https://brand.astry.agency/brand/mascot/connecting.svg",
        "pngUrl": null
      }
    },
    {
      "name": "mascot-integrating",
      "type": "registry:file",
      "title": "Astry mascot — Integrating",
      "description": "Plugging into existing infra · CRM / Slack / inbox.",
      "url": "https://brand.astry.agency/r/mascot-integrating.json",
      "meta": {
        "kind": "mascot",
        "emotion": "integrating",
        "category": "role",
        "available": false,
        "needsGeneration": true,
        "assetUrl": "https://brand.astry.agency/brand/mascot/integrating.svg",
        "pngUrl": null
      }
    },
    {
      "name": "mascot-reviewing",
      "type": "registry:file",
      "title": "Astry mascot — Reviewing",
      "description": "QA / human-in-the-loop · checking outputs.",
      "url": "https://brand.astry.agency/r/mascot-reviewing.json",
      "meta": {
        "kind": "mascot",
        "emotion": "reviewing",
        "category": "role",
        "available": false,
        "needsGeneration": true,
        "assetUrl": "https://brand.astry.agency/brand/mascot/reviewing.svg",
        "pngUrl": null
      }
    },
    {
      "name": "mascot-shipping",
      "type": "registry:file",
      "title": "Astry mascot — Shipping",
      "description": "Going to production · deploy event · release.",
      "url": "https://brand.astry.agency/r/mascot-shipping.json",
      "meta": {
        "kind": "mascot",
        "emotion": "shipping",
        "category": "role",
        "available": false,
        "needsGeneration": true,
        "assetUrl": "https://brand.astry.agency/brand/mascot/shipping.svg",
        "pngUrl": null
      }
    },
    {
      "name": "mascot-scanning",
      "type": "registry:file",
      "title": "Astry mascot — Scanning",
      "description": "Active query · vector search · searching workflows.",
      "url": "https://brand.astry.agency/r/mascot-scanning.json",
      "meta": {
        "kind": "mascot",
        "emotion": "scanning",
        "category": "role",
        "available": false,
        "needsGeneration": true,
        "assetUrl": "https://brand.astry.agency/brand/mascot/scanning.svg",
        "pngUrl": null
      }
    },
    {
      "name": "mascot-debugging",
      "type": "registry:file",
      "title": "Astry mascot — Debugging",
      "description": "Finding the bug · investigation mode · incident triage.",
      "url": "https://brand.astry.agency/r/mascot-debugging.json",
      "meta": {
        "kind": "mascot",
        "emotion": "debugging",
        "category": "role",
        "available": false,
        "needsGeneration": true,
        "assetUrl": "https://brand.astry.agency/brand/mascot/debugging.svg",
        "pngUrl": null
      }
    },
    {
      "name": "mascot-securing",
      "type": "registry:file",
      "title": "Astry mascot — Securing",
      "description": "Locking down · auth / RBAC / encryption work.",
      "url": "https://brand.astry.agency/r/mascot-securing.json",
      "meta": {
        "kind": "mascot",
        "emotion": "securing",
        "category": "role",
        "available": false,
        "needsGeneration": true,
        "assetUrl": "https://brand.astry.agency/brand/mascot/securing.svg",
        "pngUrl": null
      }
    },
    {
      "name": "mascot-alerting",
      "type": "registry:file",
      "title": "Astry mascot — Alerting",
      "description": "Sending the alert · SLO breach · pager fire.",
      "url": "https://brand.astry.agency/r/mascot-alerting.json",
      "meta": {
        "kind": "mascot",
        "emotion": "alerting",
        "category": "role",
        "available": false,
        "needsGeneration": true,
        "assetUrl": "https://brand.astry.agency/brand/mascot/alerting.svg",
        "pngUrl": null
      }
    },
    {
      "name": "mascot-measuring",
      "type": "registry:file",
      "title": "Astry mascot — Measuring",
      "description": "Tracking metrics · throughput / latency / cost.",
      "url": "https://brand.astry.agency/r/mascot-measuring.json",
      "meta": {
        "kind": "mascot",
        "emotion": "measuring",
        "category": "role",
        "available": false,
        "needsGeneration": true,
        "assetUrl": "https://brand.astry.agency/brand/mascot/measuring.svg",
        "pngUrl": null
      }
    },
    {
      "name": "mascot-automating",
      "type": "registry:file",
      "title": "Astry mascot — Automating",
      "description": "Replacing manual steps · agentic workflow live.",
      "url": "https://brand.astry.agency/r/mascot-automating.json",
      "meta": {
        "kind": "mascot",
        "emotion": "automating",
        "category": "role",
        "available": false,
        "needsGeneration": true,
        "assetUrl": "https://brand.astry.agency/brand/mascot/automating.svg",
        "pngUrl": null
      }
    },
    {
      "name": "mascot-collaborating",
      "type": "registry:file",
      "title": "Astry mascot — Collaborating",
      "description": "Working with humans · review loop · pair work.",
      "url": "https://brand.astry.agency/r/mascot-collaborating.json",
      "meta": {
        "kind": "mascot",
        "emotion": "collaborating",
        "category": "role",
        "available": false,
        "needsGeneration": true,
        "assetUrl": "https://brand.astry.agency/brand/mascot/collaborating.svg",
        "pngUrl": null
      }
    },
    {
      "name": "mascot-deploying",
      "type": "registry:file",
      "title": "Astry mascot — Deploying",
      "description": "Pushing to environments · staging → prod.",
      "url": "https://brand.astry.agency/r/mascot-deploying.json",
      "meta": {
        "kind": "mascot",
        "emotion": "deploying",
        "category": "role",
        "available": false,
        "needsGeneration": true,
        "assetUrl": "https://brand.astry.agency/brand/mascot/deploying.svg",
        "pngUrl": null
      }
    },
    {
      "name": "mascot-working",
      "type": "registry:file",
      "title": "Astry mascot — Working",
      "description": "Active automation · 'agents are running' · cron tick.",
      "url": "https://brand.astry.agency/r/mascot-working.json",
      "meta": {
        "kind": "mascot",
        "emotion": "working",
        "category": "role",
        "available": true,
        "needsGeneration": false,
        "assetUrl": "https://brand.astry.agency/brand/mascot/working.svg",
        "pngUrl": "https://brand.astry.agency/brand/mascot-png/working.png"
      }
    },
    {
      "name": "mascot-searching",
      "type": "registry:file",
      "title": "Astry mascot — Searching",
      "description": "Active query · scanning logs · 'looking for matches'.",
      "url": "https://brand.astry.agency/r/mascot-searching.json",
      "meta": {
        "kind": "mascot",
        "emotion": "searching",
        "category": "role",
        "available": false,
        "needsGeneration": true,
        "assetUrl": "https://brand.astry.agency/brand/mascot/searching.svg",
        "pngUrl": null
      }
    },
    {
      "name": "mascot-thinking",
      "type": "registry:file",
      "title": "Astry mascot — Thinking",
      "description": "AI processing · deliberating · mid-tool-call.",
      "url": "https://brand.astry.agency/r/mascot-thinking.json",
      "meta": {
        "kind": "mascot",
        "emotion": "thinking",
        "category": "role",
        "available": false,
        "needsGeneration": true,
        "assetUrl": "https://brand.astry.agency/brand/mascot/thinking.svg",
        "pngUrl": null
      }
    },
    {
      "name": "mascot-party",
      "type": "registry:file",
      "title": "Astry mascot — Party",
      "description": "Celebrations · launches · achievements · weekly digest.",
      "url": "https://brand.astry.agency/r/mascot-party.json",
      "meta": {
        "kind": "mascot",
        "emotion": "party",
        "category": "milestone",
        "available": true,
        "needsGeneration": false,
        "assetUrl": "https://brand.astry.agency/brand/mascot/party.svg",
        "pngUrl": "https://brand.astry.agency/brand/mascot-png/party.png"
      }
    },
    {
      "name": "mascot-cool",
      "type": "registry:file",
      "title": "Astry mascot — Cool",
      "description": "Premium plans · confident states · enterprise tier.",
      "url": "https://brand.astry.agency/r/mascot-cool.json",
      "meta": {
        "kind": "mascot",
        "emotion": "cool",
        "category": "milestone",
        "available": false,
        "needsGeneration": true,
        "assetUrl": "https://brand.astry.agency/brand/mascot/cool.svg",
        "pngUrl": null
      }
    },
    {
      "name": "mascot-worried",
      "type": "registry:file",
      "title": "Astry mascot — Worried",
      "description": "Warnings · risk indicators · 'this could be a problem'.",
      "url": "https://brand.astry.agency/r/mascot-worried.json",
      "meta": {
        "kind": "mascot",
        "emotion": "worried",
        "category": "alert",
        "available": false,
        "needsGeneration": true,
        "assetUrl": "https://brand.astry.agency/brand/mascot/worried.svg",
        "pngUrl": null
      }
    },
    {
      "name": "mascot-confused",
      "type": "registry:file",
      "title": "Astry mascot — Confused",
      "description": "Validation errors · 'we couldn't parse this'.",
      "url": "https://brand.astry.agency/r/mascot-confused.json",
      "meta": {
        "kind": "mascot",
        "emotion": "confused",
        "category": "alert",
        "available": false,
        "needsGeneration": true,
        "assetUrl": "https://brand.astry.agency/brand/mascot/confused.svg",
        "pngUrl": null
      }
    },
    {
      "name": "client-eight-advisory",
      "type": "registry:file",
      "title": "Client logo — eight-advisory",
      "description": "Logo of an Astry client — drop into image-gen prompts as a visual reference when the post mentions this client.",
      "url": "https://brand.astry.agency/r/client-eight-advisory.json",
      "meta": {
        "kind": "client",
        "slug": "eight-advisory",
        "assetUrl": "https://brand.astry.agency/brand/clients/eight-advisory.svg"
      }
    },
    {
      "name": "client-endemol",
      "type": "registry:file",
      "title": "Client logo — endemol",
      "description": "Logo of an Astry client — drop into image-gen prompts as a visual reference when the post mentions this client.",
      "url": "https://brand.astry.agency/r/client-endemol.json",
      "meta": {
        "kind": "client",
        "slug": "endemol",
        "assetUrl": "https://brand.astry.agency/brand/clients/endemol.svg"
      }
    },
    {
      "name": "logo-banner",
      "type": "registry:file",
      "title": "Astry logo — banner",
      "description": "Astry brand logo asset (banner, PNG).",
      "url": "https://brand.astry.agency/r/logo-banner.json",
      "meta": {
        "kind": "logo",
        "assetUrl": "https://brand.astry.agency/brand/logo/banner.png"
      }
    },
    {
      "name": "logo-icon-blue",
      "type": "registry:file",
      "title": "Astry logo — icon-blue",
      "description": "Astry brand logo asset (icon-blue, PNG).",
      "url": "https://brand.astry.agency/r/logo-icon-blue.json",
      "meta": {
        "kind": "logo",
        "assetUrl": "https://brand.astry.agency/brand/logo/icon-blue.png"
      }
    },
    {
      "name": "logo-icon-on-blue",
      "type": "registry:file",
      "title": "Astry logo — icon-on-blue",
      "description": "Astry brand logo asset (icon-on-blue, PNG).",
      "url": "https://brand.astry.agency/r/logo-icon-on-blue.json",
      "meta": {
        "kind": "logo",
        "assetUrl": "https://brand.astry.agency/brand/logo/icon-on-blue.png"
      }
    },
    {
      "name": "logo-icon-on-cream",
      "type": "registry:file",
      "title": "Astry logo — icon-on-cream",
      "description": "Astry brand logo asset (icon-on-cream, PNG).",
      "url": "https://brand.astry.agency/r/logo-icon-on-cream.json",
      "meta": {
        "kind": "logo",
        "assetUrl": "https://brand.astry.agency/brand/logo/icon-on-cream.png"
      }
    },
    {
      "name": "logo-largelogoofficial",
      "type": "registry:file",
      "title": "Astry logo — largelogoofficial",
      "description": "Astry brand logo asset (largelogoofficial, SVG).",
      "url": "https://brand.astry.agency/r/logo-largelogoofficial.json",
      "meta": {
        "kind": "logo",
        "assetUrl": "https://brand.astry.agency/brand/logo/largelogoofficial.svg"
      }
    },
    {
      "name": "logo-lockup-blue",
      "type": "registry:file",
      "title": "Astry logo — lockup-blue",
      "description": "Astry brand logo asset (lockup-blue, PNG).",
      "url": "https://brand.astry.agency/r/logo-lockup-blue.json",
      "meta": {
        "kind": "logo",
        "assetUrl": "https://brand.astry.agency/brand/logo/lockup-blue.png"
      }
    },
    {
      "name": "logo-wordmark-blue",
      "type": "registry:file",
      "title": "Astry logo — wordmark-blue",
      "description": "Astry brand logo asset (wordmark-blue, PNG).",
      "url": "https://brand.astry.agency/r/logo-wordmark-blue.json",
      "meta": {
        "kind": "logo",
        "assetUrl": "https://brand.astry.agency/brand/logo/wordmark-blue.png"
      }
    }
  ]
}