{"id":51307648,"url":"https://github.com/block/summon","last_synced_at":"2026-07-01T01:02:43.952Z","repository":{"id":363356950,"uuid":"1260040233","full_name":"block/summon","owner":"block","description":"Sandboxed, self-contained generative UI. An LLM streams HTML/CSS/JS into a locked-down iframe; the UI communicates with the host only through a typed intent bridge.","archived":false,"fork":false,"pushed_at":"2026-06-17T23:07:41.000Z","size":1504,"stargazers_count":0,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-18T01:09:26.068Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/block.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":"CODEOWNERS","security":null,"support":null,"governance":"GOVERNANCE.md","roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-06-05T05:19:55.000Z","updated_at":"2026-06-17T23:07:48.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/block/summon","commit_stats":null,"previous_names":["block/summon"],"tags_count":0,"template":false,"template_full_name":"block/oss-project-template","purl":"pkg:github/block/summon","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/block%2Fsummon","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/block%2Fsummon/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/block%2Fsummon/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/block%2Fsummon/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/block","download_url":"https://codeload.github.com/block/summon/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/block%2Fsummon/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34476183,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-18T02:00:06.871Z","response_time":128,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-07-01T01:02:39.797Z","updated_at":"2026-07-01T01:02:43.940Z","avatar_url":"https://github.com/block.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Summon\n\nSummon renders AI-generated UI in an inline Arrow sandbox. The generated UI can\nonly use host tools you register, so the host keeps control of data, actions,\ncredentials, network access, state, and persistence.\n\nThe adopter mental model is intentionally small:\n\n| Term | Meaning |\n| --- | --- |\n| Surface | The generated UI Summon renders. |\n| Host tool | A host-owned data source or action the surface may request. |\n| Sandbox | The inline Arrow VM and trusted renderer where generated UI runs. |\n| Surface config | The host's choice of what the surface is allowed to do. |\n| Diagnostics | Stream and Devtools information used when something breaks. |\n\nIn the TypeScript API, a surface config is `SurfacePolicy`. Summon compiles it\ninto a stricter `SurfacePlan` plus a read-only `SurfaceContractView` before any\nmodel-authored output is accepted.\n\n## Project Status: Beta\n\nSummon is pre-1.0 and under active development. The protocol,\ngenerated-surface contract, and public JavaScript exports may change before a\nstable release.\n\nThe public package boundary is:\n\n```txt\n@anarchitecture/summon\n@anarchitecture/summon-server\n@anarchitecture/summon-react\n```\n\n## Quickstart\n\n```sh\npnpm install\ncp apps/server/.env.example apps/server/.env\n# edit apps/server/.env and set ANTHROPIC_API_KEY, OPENAI_API_KEY, or GEMINI_API_KEY\npnpm dev:gallery\n```\n\nOpen `http://localhost:5174`.\n\nThe Surface Gallery is the first OSS demo. It shows static surfaces, host-backed\nsearch, host-owned actions, approval flows, direct Arrow composition, and\nbackground host work without exposing the maintainer workbench.\n\nFor the maintainer workbench:\n\n```sh\npnpm dev:workbench\n```\n\nOpen `http://localhost:5173/generate`.\n\n1. Choose the **Host resource search** showcase scenario.\n2. Confirm the agent broker selects an interactive run with only the `search`\n   host tool allowed.\n3. Run it, then submit a generated search such as `chicken pasta`.\n4. Open `http://localhost:5173/adversarial` and confirm the sandbox\n   boundary still holds.\n\nTo steer generation from a Ghost fingerprint, set `SUMMON_GHOST_ROOTS` in\n`apps/server/.env` before starting the demos. Each configured root should use\nthe canonical `.ghost/fingerprint/manifest.yml` package layout. The Surface\nGallery adds a Ghost fingerprint preset for each root, and the Generate\nworkbench adds a `Fingerprint · \u003cid\u003e` option. A fingerprint run is not a bundled\nvisual direction: Summon consumes the Ghost relay brief as product design\ndirection, then applies host-owned policy, tools, and token CSS.\n\nThe full guided path lives in\n[docs/adoption/quickstart.md](docs/adoption/quickstart.md).\nThe architecture boundary is documented in\n[docs/ghost-fingerprint-architecture.md](docs/ghost-fingerprint-architecture.md).\n\n## How It Fits Together\n\nSummon's supported integration path is narrow:\n\n1. Register the host tools the surface may use.\n2. Choose a surface config for the run.\n3. Generate the surface on the server.\n4. Render accepted output in the sandbox.\n5. Use diagnostics when generation or interaction fails.\n\nThe model can propose UI, but it cannot give itself permissions. Generated\nrequests are advisory until the host validates them and dispatches them through\nregistered host tools.\n\nTo run both demo apps at once:\n\n```sh\npnpm dev:demos\n```\n\n## Demo Map\n\n- `apps/surface-gallery` - primary adopter gallery with curated live\n  presets, compact host tools, Ghost-root presets when configured, an inline\n  Arrow surface, and a small event strip.\n- `/generate` - diagnostic maintainer workbench for broker-selected\n  surface configs, allowed host tools, token overrides, validation summaries,\n  replay, Ghost steering, Devtools, and stream diagnostics.\n- `/batch` - parallel broker harness for prompt coverage, host tool\n  wiring, direction-token visual coverage, throughput, and consistency checks.\n- `/adversarial` - sandbox boundary checks for network, storage, parent\n  access, and unallowed host tool requests.\n- `/strict` - retired overlay note; the current runtime is the inline Arrow\n  sandbox.\n- `/fatal` - retired boot note; current errors surface through the inline Arrow\n  handle and Devtools events.\n\n## Public Packages\n\n- `@anarchitecture/summon` - curated host-authoring helpers, surface config\n  helpers, and explicit subpaths for advanced browser, engine, host, policy,\n  envelope, assets, Devtools, and token CSS APIs.\n- `@anarchitecture/summon-server` - provider-neutral generation lifecycle,\n  Arrow protocol hardening, validation summaries, and model-provider\n  interfaces.\n- `@anarchitecture/summon-react` - `SummonSurface` React adapter for inline\n  Arrow surfaces. `react` and `react-dom` are peer dependencies.\n\n## Workspace Map\n\n- `packages/summon*` - public package facades.\n- `packages/engine`, `packages/host`, `packages/devtools`,\n  `packages/sandbox-runtime`, `packages/server`, `packages/react` - private\n  implementation workspaces published only through the public facades.\n- `apps/server` - multi-provider demo server for Anthropic, OpenAI, and Gemini,\n  direction loading, Arrow protocol diagnostics, and demo backing routes.\n- `apps/surface-gallery` - first-run live example app for OSS adopters.\n- `apps/demo` - Vite maintainer workbench for generation, batch runs,\n  adversarial checks, Ghost steering, diagnostics, and retired iframe-era notes.\n\n## Adoption Docs\n\n- [Quickstart](docs/adoption/quickstart.md) - one golden end-to-end path.\n- [Integration](docs/adoption/integration.md) - minimal host/server wiring with\n  current APIs.\n- [Package Consumption](docs/adoption/package-consumption.md) - how React apps\n  and frameworkless hosts should import built Summon packages.\n- [Mobile WebViews](docs/adoption/mobile-webviews.md) - web-first requirements\n  for iOS/Android WebView embedding.\n- [Security Posture](docs/adoption/security.md) - surface types, host rules,\n  and browser-test expectations.\n- [Debugging](docs/adoption/debugging.md) - diagnostics for failed generation,\n  broken controls, missing data, runtime errors, and sandbox safety.\n- [Agent skill](.agents/skills/summon/SKILL.md) - repo-local operating guide\n  for AI agents working on Summon.\n\n## Security Boundary\n\nSummon runs generated Arrow logic inside a QuickJS/WASM VM and mutates the page\nonly through Arrow's trusted renderer. The host explicitly chooses the allowed\nhost tools for each run; declarations from generated UI are never executable\nauthority. Generated network access is off by default and product data should\nflow through host tools.\n\nRun the safety harness before changing the inline runtime, Arrow bridge,\ngenerated network policy, or tool-dispatch behavior:\n\n```sh\npnpm test:safety\n```\n\n## Useful Commands\n\n```sh\npnpm typecheck\npnpm test\npnpm test:safety\npnpm test:gallery\npnpm build\npnpm check:public-api\npnpm smoke:public-packages\npnpm pack:dry-run\npnpm dev:gallery\npnpm dev:workbench\npnpm dev:demos\npnpm port-direction \u003cpath-to-expression.md\u003e [id]\npnpm eval-directions [--prompts N] [--directions id,id] [--seed N] [--dry]\n```\n\n`pnpm test:safety` runs the Playwright Chromium and WebKit smoke suite for\nsandbox containment and generate-page boot. It starts only the Vite demo app and\ndoes not require a model-provider API key.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fblock%2Fsummon","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fblock%2Fsummon","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fblock%2Fsummon/lists"}