Headless visual output layer for AI agents. One API call → self-contained SVG.
Project description
Headless visual output layer for AI agents.
One API call → self-contained SVG. No JavaScript. No dependencies. No runtime.
Works everywhere an <img> tag works.
The Problem
When an AI agent needs visual output, it generates React code or HTML that breaks across platforms, carries no brand identity, and is illegible to the next agent in the chain. There's no portable, reliable visual primitive for agents.
HyperWeave is that primitive. Semantic SVGs with embedded CSS state machines, accessibility markup, and machine-readable metadata. The artifact stays live, stays on-brand, and stays legible — whether it's rendered in a GitHub README, Slack, Notion, documentation site, email, VS Code, or terminal. Every surface that renders an <img> tag is a HyperWeave surface.
Agent Receipts
Every AI coding session produces a receipt — cost, tokens, tool distribution, session rhythm. One install, fully automatic. The artifact isn't a visualization of data. It is the record.
hyperweave install-hook
Every session drops a receipt SVG into .hyperweave/receipts/. No config, no server, no manual step. Skin auto-detects from the coding agent's runtime — Claude Code resolves to the warm-paper skin; everything else falls back to voltage. Pin a different default with hyperweave install-hook --genome cream.
262M tokens · 562 calls · 52 stages · $175 — voltage skin
Same protocol, different genome — claude-code skin
Rhythm strip — the same session data at 92px tall
Genomes — Aesthetic DNA
A genome is a portable, machine-readable aesthetic specification. It encodes the complete visual identity — chromatic system, surface material, motion vocabulary, geometric form language — as a set of CSS custom properties that any agent can consume and apply consistently across every artifact type.
Three production genomes ship today. Custom genome generation via AI skill files coming soon.
chrome
chrome paradigm · metallic env-mapping · smooth corner radii| Signals state machine |
|
|---|---|
| Dashboard strip |
|
| Profile stats card |
|
| Star Chart star history |
|
| Marquee horizontal ticker |
|
| Icons circle + square |
|
| Divider band |
|
brutalist
brutalist paradigm · sharp zero-radius · 5 border SMIL motions| Signals state machine |
|
|---|---|
| Dashboard strip |
|
| Profile stats card |
|
| Star Chart star history |
|
| Marquee horizontal ticker |
|
| Icons circle + square |
|
| Divider seam |
|
automata
cellular paradigm · bifamily teal × amethyst · abyssal-cyber chromatics| Signals chromatic variant |
|
|---|---|
| Dashboard strip · bifamily |
|
| Profile stats card |
|
| Star Chart star history |
|
| Marquee horizontal ticker · bifamily |
|
| Icons circle + square |
|
| Divider dissolve |
|
| chrome | brutalist | automata | |
|---|---|---|---|
| Surface | #000a14 deep void |
#14532D dark field |
#04060A void |
| Signal | #5ba3d4 metallic blue |
#10B981 emerald |
#1E849A teal · #6B3B8A amethyst |
| Profile | chrome (smooth, env-mapped) | brutalist (sharp, zero-radius) | brutalist (cellular paradigm) |
| Chromatic variant | — | — | blue / purple / bifamily |
| Motions | 5 border SMIL | 5 border SMIL | static, chromatic-pulse, rimrun, corner-trace |
| Divider | band (envelope drift) |
seam (expansion joint) |
dissolve (bifamily bridge) |
The two automata signal badges share a URL and differ only in the chromatic variant: ?variant=blue renders the teal palette, ?variant=purple the amethyst, ?variant=bifamily both. Each genome declares its allowed variants in its JSON config; unknown values return 422.
/a/inneraura/dividers/
| block De Stijl composition |
|
|---|---|
| current animated rainbow bezier |
|
| takeoff rocket trajectory + thrust |
|
| void spectral bloom + hover state |
|
| zeropoint aurora rule + nexus beacon |
|
Error fallback — SMPTE NO SIGNAL
Every broken <img> URL renders the SMPTE RP 219 test pattern with ERR_NNN matching the HTTP status, instead of a browser broken-image icon.
/v1/badge/{title}/{value}/{unknown-genome}.statichyperweave.app/v1/badge/TEST/value/unknown-genome.static
Install
uv add hyperweave
# or
pip install hyperweave
Requires Python 3.12+.
Entry Points
Four interfaces, one pipeline. Every path produces the same artifact through the same compositor.
MCP
{
"mcpServers": {
"hyperweave": {
"command": "hyperweave",
"args": ["mcp"]
}
}
}
# Static badge
hw_compose(type="badge", title="BUILD", value="passing", genome="brutalist")
# Data-driven badge — unified token grammar (gh:owner/repo.metric, pypi:pkg.metric, ...)
hw_compose(type="badge", title="STARS", data="gh:anthropics/claude-code.stars", genome="brutalist")
# Strip with multiple live metrics
hw_compose(type="strip", title="readme-ai",
data="gh:eli64s/readme-ai.stars,gh:eli64s/readme-ai.forks,pypi:readmeai.version",
genome="chrome")
# Marquee with mixed text + live tokens
hw_compose(type="marquee-horizontal",
data="text:NEW RELEASE,gh:anthropics/claude-code.stars,text:DOWNLOAD",
genome="brutalist")
# Discoverable shortcut for single-metric live badges
hw_live(provider="github", identifier="anthropics/claude-code", metric="stars")
hw_kit(type="readme", genome="brutalist", badges="build:passing")
hw_discover(what="all")
CLI
# Badge
hyperweave compose badge "build" "passing" --genome brutalist
# Strip with metrics
hyperweave compose strip "readme-ai" "STARS:2.9k,FORKS:278" -g brutalist
# Live data through the unified --data token grammar
hyperweave compose badge "STARS" --data 'gh:anthropics/claude-code.stars' -g brutalist
# Marquee with mixed text + live tokens
hyperweave compose marquee-horizontal --data 'text:NEW RELEASE,gh:owner/repo.stars,text:DOWNLOAD' -g brutalist
# Artifact kit
hyperweave kit readme -g brutalist --badges "build:passing,version:v0.2.0" --social "github,discord"
# Profile card (live GitHub data, path-segment identity)
hyperweave compose stats eli64s -g chrome -o stats.svg
# Star history chart
hyperweave compose chart stars eli64s/readme-ai -g brutalist -o chart.svg
# Custom genome from a local JSON file (validated against the profile contract)
hyperweave compose badge "DEPLOY" "live" --genome-file ./my-genome.json
hyperweave validate-genome ./my-genome.json
HTTP API
# URL grammar: /v1/{type}/{title}/{value}/{genome}.{motion}
curl 'https://hyperweave.app/v1/strip/readme-ai/brutalist.static?value=STARS:2.9k,FORKS:278'
# Live data via the unified ?data= grammar (works on badge / strip / marquee)
curl 'https://hyperweave.app/v1/badge/STARS/chrome.static?data=gh:anthropics/claude-code.stars'
curl 'https://hyperweave.app/v1/strip/readme-ai/brutalist.static?data=gh:eli64s/readme-ai.stars,gh:eli64s/readme-ai.forks'
curl 'https://hyperweave.app/v1/marquee/SCROLL/brutalist.static?data=text:NEW%20RELEASE,gh:anthropics/claude-code.stars'
# Chromatic variant (automata's blue/purple/bifamily axis) and size (badge default/compact)
curl 'https://hyperweave.app/v1/badge/PYPI/automata.static?variant=purple&data=pypi:hyperweave.version'
curl 'https://hyperweave.app/v1/badge/build/passing/automata.static?size=compact'
# Genome-themed dividers
curl 'https://hyperweave.app/v1/divider/band/chrome.static'
curl 'https://hyperweave.app/v1/divider/seam/brutalist.static'
curl 'https://hyperweave.app/v1/divider/dissolve/automata.static'
# Genome-agnostic dividers
curl 'https://hyperweave.app/a/inneraura/dividers/zeropoint'
# POST compose
curl -X POST https://hyperweave.app/v1/compose \
-H "Content-Type: application/json" \
-d '{"type":"strip","title":"hyperweave","genome":"brutalist","value":"STARS:2.9k"}'
# Local server
hyperweave serve --port 8000
How It Works
Every artifact is the output of a single composition formula:
ARTIFACT = FRAME × PROFILE × GENOME × SLOTS × MOTION × ENVIRONMENT
Python builds context dicts. Jinja2 builds SVG. YAML defines config. Three layers, no mixing. Zero f-string SVG in Python.
ComposeSpec → engine.py → assembler.py (CSS) → lanes.py (validate) → templates.py (Jinja2) → SVG
Every artifact ships with:
- Semantic metadata — provenance, reasoning, spatial trace, aesthetic DNA. Machine-readable context so the next agent in the chain knows what it's looking at and why.
- CSS state machines —
data-hw-status,data-hw-state,data-hw-regimedrive visual transitions through the Custom Property Bridge. No JavaScript. - Pure CSS/SMIL animation — all motion uses compositor-safe properties (
transform,opacity,filter). No script tags. Works inside GitHub's Camo proxy, email clients, Notion embeds — anywhere SVGs render. - Accessibility — WCAG AA,
prefers-reduced-motion,prefers-color-scheme,forced-colors, ARIA markup. Structural, not decorative.
| Dimension | Count |
|---|---|
| Frame types | 9 (badge, strip, icon, divider, marquee-horizontal, stats, chart, receipt, rhythm-strip) |
| Genomes | 3 (automata, brutalist, chrome) |
| Motion configs | 6 (1 static + 5 border SMIL) |
| Glyphs | 99 (93 Simple Icons + 6 geometric) |
| Divider variants | 8 — 3 genome-themed (band chrome, seam brutalist, dissolve automata) + 5 genome-agnostic (block, current, takeoff, void, zeropoint) at /a/inneraura/dividers/ |
| Metadata tiers | 5 (Tier 0 silent → Tier 4 reasoning) |
| Paradigms | 4 per frame (default, brutalist, chrome, cellular) — per-frame dispatch from genome |
| Bundled fonts | 3 (JetBrains Mono, Orbitron, Chakra Petch — base64-embedded) |
Stack: Pydantic, FastAPI, FastMCP v3, Jinja2, Typer.
Contributing
HyperWeave is early. If you're interested in building genomes, extending frame types, or just seeing what this looks like in your own README — join the Discord.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file hyperweave-0.2.21.tar.gz.
File metadata
- Download URL: hyperweave-0.2.21.tar.gz
- Upload date:
- Size: 994.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2897ec82e68ee8fbfc5a2d769d8444cd46980142d026eed23ba8cc1151af7da5
|
|
| MD5 |
d647b6b6893bee1f9df78ba4752f80d2
|
|
| BLAKE2b-256 |
313d3c521a8c43b40bc203681160efb6c5e9f831f5eb0d2884c7b0221c289777
|
Provenance
The following attestation bundles were made for hyperweave-0.2.21.tar.gz:
Publisher:
publish.yml on InnerAura/hyperweave
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
hyperweave-0.2.21.tar.gz -
Subject digest:
2897ec82e68ee8fbfc5a2d769d8444cd46980142d026eed23ba8cc1151af7da5 - Sigstore transparency entry: 1441940668
- Sigstore integration time:
-
Permalink:
InnerAura/hyperweave@2b324c3c845a180d52f8bf0071c8c0b2742dcc5b -
Branch / Tag:
refs/tags/v0.2.21 - Owner: https://github.com/InnerAura
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@2b324c3c845a180d52f8bf0071c8c0b2742dcc5b -
Trigger Event:
push
-
Statement type:
File details
Details for the file hyperweave-0.2.21-py3-none-any.whl.
File metadata
- Download URL: hyperweave-0.2.21-py3-none-any.whl
- Upload date:
- Size: 460.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
25673da653af6ca083959c1ecc8142825560ed163ea305e4676ec2ca5dd48acc
|
|
| MD5 |
ae7c6faddef6a9391d5375b7cbb53bf5
|
|
| BLAKE2b-256 |
c1697a905dc9fd07b7ac0c8c8a439568e366c83aafb699d9aaaba51c86b3af97
|
Provenance
The following attestation bundles were made for hyperweave-0.2.21-py3-none-any.whl:
Publisher:
publish.yml on InnerAura/hyperweave
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
hyperweave-0.2.21-py3-none-any.whl -
Subject digest:
25673da653af6ca083959c1ecc8142825560ed163ea305e4676ec2ca5dd48acc - Sigstore transparency entry: 1441940811
- Sigstore integration time:
-
Permalink:
InnerAura/hyperweave@2b324c3c845a180d52f8bf0071c8c0b2742dcc5b -
Branch / Tag:
refs/tags/v0.2.21 - Owner: https://github.com/InnerAura
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@2b324c3c845a180d52f8bf0071c8c0b2742dcc5b -
Trigger Event:
push
-
Statement type: