[{"data":1,"prerenderedAt":601},["ShallowReactive",2],{"navigation":3,"\u002Fgetting-started\u002Finstallation":169,"\u002Fgetting-started\u002Finstallation-surround":596},[4,28,85,127,157],{"title":5,"path":6,"stem":7,"children":8,"icon":27},"Getting Started","\u002Fgetting-started","1.getting-started\u002F1.index",[9,12,17,22],{"title":10,"path":6,"stem":7,"icon":11},"Introduction","i-lucide-house",{"title":13,"path":14,"stem":15,"icon":16},"Installation","\u002Fgetting-started\u002Finstallation","1.getting-started\u002F2.installation","i-lucide-download",{"title":18,"path":19,"stem":20,"icon":21},"Quick start","\u002Fgetting-started\u002Fquick-start","1.getting-started\u002F3.quick-start","i-lucide-zap",{"title":23,"path":24,"stem":25,"icon":26},"Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F4.architecture","i-lucide-layers","i-lucide-rocket",{"title":29,"icon":30,"path":31,"stem":32,"children":33,"page":84},"Concepts","i-lucide-lightbulb","\u002Fconcepts","2.concepts",[34,39,44,49,54,59,64,69,74,79],{"title":35,"path":36,"stem":37,"icon":38},"Durable agents","\u002Fconcepts\u002Fdurable-agents","2.concepts\u002F1.durable-agents","i-lucide-infinity",{"title":40,"path":41,"stem":42,"icon":43},"Glossary","\u002Fconcepts\u002Fglossary","2.concepts\u002F10.glossary","i-lucide-book-a",{"title":45,"path":46,"stem":47,"icon":48},"Restate in five minutes","\u002Fconcepts\u002Frestate-primer","2.concepts\u002F2.restate-primer","i-lucide-cpu",{"title":50,"path":51,"stem":52,"icon":53},"Entities & addressing","\u002Fconcepts\u002Fentities-addressing","2.concepts\u002F3.entities-addressing","i-lucide-at-sign",{"title":55,"path":56,"stem":57,"icon":58},"Timelines & events","\u002Fconcepts\u002Ftimelines-events","2.concepts\u002F4.timelines-events","i-lucide-list-ordered",{"title":60,"path":61,"stem":62,"icon":63},"Projections & the catalog","\u002Fconcepts\u002Fprojections-catalog","2.concepts\u002F5.projections-catalog","i-lucide-database",{"title":65,"path":66,"stem":67,"icon":68},"Workspaces & execution","\u002Fconcepts\u002Fworkspaces","2.concepts\u002F6.workspaces","i-lucide-terminal",{"title":70,"path":71,"stem":72,"icon":73},"Harnesses","\u002Fconcepts\u002Fharnesses","2.concepts\u002F7.harnesses","i-lucide-plug",{"title":75,"path":76,"stem":77,"icon":78},"Multi-agent patterns","\u002Fconcepts\u002Fmulti-agent","2.concepts\u002F8.multi-agent","i-lucide-network",{"title":80,"path":81,"stem":82,"icon":83},"Lifecycle & control","\u002Fconcepts\u002Flifecycle","2.concepts\u002F9.lifecycle","i-lucide-sliders-horizontal",false,{"title":86,"icon":87,"path":88,"stem":89,"children":90,"page":84},"Guides","i-lucide-book-open","\u002Fguides","3.guides",[91,106],{"title":92,"icon":93,"path":94,"stem":95,"children":96,"page":84},"Agents","i-lucide-bot","\u002Fguides\u002Fagents","3.guides\u002F1.agents",[97,101],{"title":98,"path":99,"stem":100,"icon":93},"Building agents","\u002Fguides\u002Fagents\u002Fbuilding-agents","3.guides\u002F1.agents\u002F1.building-agents",{"title":102,"path":103,"stem":104,"icon":105},"Frontend integration","\u002Fguides\u002Fagents\u002Ffrontend-integration","3.guides\u002F1.agents\u002F2.frontend-integration","i-lucide-monitor",{"title":107,"icon":108,"path":109,"stem":110,"children":111,"page":84},"Operations","i-lucide-server-cog","\u002Fguides\u002Foperations","3.guides\u002F2.operations",[112,117,122],{"title":113,"path":114,"stem":115,"icon":116},"Self-hosting","\u002Fguides\u002Foperations\u002Fself-hosting","3.guides\u002F2.operations\u002F1.self-hosting","i-lucide-server",{"title":118,"path":119,"stem":120,"icon":121},"Auth & API keys","\u002Fguides\u002Foperations\u002Fauth-api-keys","3.guides\u002F2.operations\u002F2.auth-api-keys","i-lucide-key-round",{"title":123,"path":124,"stem":125,"icon":126},"Backup & restore","\u002Fguides\u002Foperations\u002Fbackup-restore","3.guides\u002F2.operations\u002F3.backup-restore","i-lucide-database-backup",{"title":128,"icon":129,"path":130,"stem":131,"children":132,"page":84},"Reference","i-lucide-book-marked","\u002Freference","4.reference",[133,138,143,148,153],{"title":134,"path":135,"stem":136,"icon":137},"Event schema","\u002Freference\u002Fevents","4.reference\u002F1.events","i-lucide-list-tree",{"title":139,"path":140,"stem":141,"icon":142},"Addressing","\u002Freference\u002Faddressing","4.reference\u002F2.addressing","i-lucide-map-pin",{"title":144,"path":145,"stem":146,"icon":147},"Gateway HTTP API","\u002Freference\u002Fgateway-api","4.reference\u002F3.gateway-api","i-lucide-webhook",{"title":149,"path":150,"stem":151,"icon":152},"CLI","\u002Freference\u002Fcli","4.reference\u002F4.cli","i-lucide-square-terminal",{"title":154,"path":155,"stem":156,"icon":83},"Configuration","\u002Freference\u002Fconfiguration","4.reference\u002F5.configuration",{"title":158,"path":159,"stem":160,"children":161,"icon":163},"Contributing","\u002Fcontributing","5.contributing\u002F1.index",[162,164],{"title":158,"path":159,"stem":160,"icon":163},"i-lucide-git-pull-request",{"title":165,"path":166,"stem":167,"icon":168},"The package map","\u002Fcontributing\u002Fpackage-map","5.contributing\u002F2.package-map","i-lucide-boxes",{"id":170,"title":13,"body":171,"description":589,"extension":590,"links":591,"meta":592,"navigation":593,"path":14,"seo":594,"stem":15,"__hash__":595},"docs\u002F1.getting-started\u002F2.installation.md",{"type":172,"value":173,"toc":583},"minimark",[174,178,183,241,245,474,478,515,541,569,573,579],[175,176,177],"p",{},"This page takes you from nothing to a running teaspill platform: the five infrastructure services, plus the reference deployment's demo agents, all on your machine.",[179,180,182],"h2",{"id":181},"prerequisites","Prerequisites",[184,185,186,203,213,230],"ul",{},[187,188,189,193,194,198,199,202],"li",{},[190,191,192],"strong",{},"Docker"," with the Compose plugin (",[195,196,197],"code",{},"docker compose",", not the legacy ",[195,200,201],{},"docker-compose",").",[187,204,205,208,209,212],{},[190,206,207],{},"Node.js"," ",[195,210,211],{},"20.19"," or newer — Node 22 recommended.",[187,214,215,208,218,221,222,225,226,229],{},[190,216,217],{},"pnpm",[195,219,220],{},"11"," (the repository pins ",[195,223,224],{},"11.13.0","; ",[195,227,228],{},"corepack enable"," gives you the right version automatically).",[187,231,232,235,236,240],{},[190,233,234],{},"An Anthropic API key"," — optional, but without one the demo agents won't be served and the ",[237,238,239],"a",{"href":19},"quick start","'s researcher can't call a model.",[179,242,244],{"id":243},"install","Install",[246,247,249,254,257,286,290,293,313,317,324,356,367,371,378,393,396,405,412,427,431,441,467],"steps",{"level":248},"3",[250,251,253],"h3",{"id":252},"clone-and-install","Clone and install",[175,255,256],{},"teaspill ships as a pnpm workspace — the platform, the SDKs, the CLI, and the reference deployment all live in one repository.",[258,259,264],"pre",{"className":260,"code":261,"language":262,"meta":263,"style":263},"language-sh shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","git clone https:\u002F\u002Fgithub.com\u002Feverynow-dev\u002Fteaspill.git\ncd teaspill\npnpm install\n","sh","",[195,265,266,274,280],{"__ignoreMap":263},[267,268,271],"span",{"class":269,"line":270},"line",1,[267,272,273],{},"git clone https:\u002F\u002Fgithub.com\u002Feverynow-dev\u002Fteaspill.git\n",[267,275,277],{"class":269,"line":276},2,[267,278,279],{},"cd teaspill\n",[267,281,283],{"class":269,"line":282},3,[267,284,285],{},"pnpm install\n",[250,287,289],{"id":288},"build-the-packages-and-service-bundles","Build the packages and service bundles",[175,291,292],{},"The gateway and the reference deployment run in Docker from self-contained bundles, built once up front:",[258,294,296],{"className":260,"code":295,"language":262,"meta":263,"style":263},"pnpm -r build\npnpm --filter @teaspill\u002Fgateway bundle\npnpm --filter @teaspill\u002Freference-deployment bundle\n",[195,297,298,303,308],{"__ignoreMap":263},[267,299,300],{"class":269,"line":270},[267,301,302],{},"pnpm -r build\n",[267,304,305],{"class":269,"line":276},[267,306,307],{},"pnpm --filter @teaspill\u002Fgateway bundle\n",[267,309,310],{"class":269,"line":282},[267,311,312],{},"pnpm --filter @teaspill\u002Freference-deployment bundle\n",[250,314,316],{"id":315},"configure-the-environment","Configure the environment",[175,318,319,320,323],{},"Every variable has a working default — ",[195,321,322],{},".env"," only needs the dev API key, which lets services (and you) register and issue commands through the gateway:",[258,325,327],{"className":260,"code":326,"language":262,"meta":263,"style":263},"cp .env.example .env\necho 'GATEWAY_BOOTSTRAP_API_KEY=tsp_local_dev_only' >> .env\necho 'TEASPILL_API_KEY=tsp_local_dev_only' >> .env\n# optional — enables the demo agents:\necho 'ANTHROPIC_API_KEY=sk-ant-...' >> .env\n",[195,328,329,334,339,344,350],{"__ignoreMap":263},[267,330,331],{"class":269,"line":270},[267,332,333],{},"cp .env.example .env\n",[267,335,336],{"class":269,"line":276},[267,337,338],{},"echo 'GATEWAY_BOOTSTRAP_API_KEY=tsp_local_dev_only' >> .env\n",[267,340,341],{"class":269,"line":282},[267,342,343],{},"echo 'TEASPILL_API_KEY=tsp_local_dev_only' >> .env\n",[267,345,347],{"class":269,"line":346},4,[267,348,349],{},"# optional — enables the demo agents:\n",[267,351,353],{"class":269,"line":352},5,[267,354,355],{},"echo 'ANTHROPIC_API_KEY=sk-ant-...' >> .env\n",[175,357,358,359,362,363,366],{},"The bootstrap key is a development convenience: it works before any real key exists. For anything beyond local dev, mint real keys with ",[195,360,361],{},"teaspill keys create"," and drop the bootstrap — the ",[237,364,365],{"href":119},"Auth & API keys guide"," covers both.",[250,368,370],{"id":369},"boot-the-stack","Boot the stack",[175,372,373,374,377],{},"The previous step built the ",[195,375,376],{},"teaspill"," CLI into the workspace. Alias it once per shell and point it at your dev key now — the richer boot loop below and the checks in the next step both use it:",[258,379,381],{"className":260,"code":380,"language":262,"meta":263,"style":263},"alias teaspill=\"node $PWD\u002Fpackages\u002Fcli\u002Fdist\u002Findex.js\"\nexport TEASPILL_API_KEY=tsp_local_dev_only\n",[195,382,383,388],{"__ignoreMap":263},[267,384,385],{"class":269,"line":270},[267,386,387],{},"alias teaspill=\"node $PWD\u002Fpackages\u002Fcli\u002Fdist\u002Findex.js\"\n",[267,389,390],{"class":269,"line":276},[267,391,392],{},"export TEASPILL_API_KEY=tsp_local_dev_only\n",[175,394,395],{},"The base compose file runs the infrastructure; the overlay adds the reference deployment's two services on top:",[258,397,399],{"className":260,"code":398,"language":262,"meta":263,"style":263},"docker compose -f docker-compose.yml -f docker-compose.overlay.yml up -d --build\n",[195,400,401],{"__ignoreMap":263},[267,402,403],{"class":269,"line":270},[267,404,398],{},[175,406,407,408,411],{},"The first boot builds three images and pulls four, so it takes a few minutes. Prefer a richer dev loop? ",[195,409,410],{},"teaspill dev"," wraps the same boot with a gateway health wait, deployment registration with retries, and tailed logs:",[258,413,415],{"className":260,"code":414,"language":262,"meta":263,"style":263},"export COMPOSE_FILE=docker-compose.yml:docker-compose.overlay.yml\nteaspill dev --deployment http:\u002F\u002Fagent-loop:9080 --deployment http:\u002F\u002Fexecutor:9081\n",[195,416,417,422],{"__ignoreMap":263},[267,418,419],{"class":269,"line":270},[267,420,421],{},"export COMPOSE_FILE=docker-compose.yml:docker-compose.overlay.yml\n",[267,423,424],{"class":269,"line":276},[267,425,426],{},"teaspill dev --deployment http:\u002F\u002Fagent-loop:9080 --deployment http:\u002F\u002Fexecutor:9081\n",[250,428,430],{"id":429},"check-that-its-up","Check that it's up",[175,432,433,434,437,438,440],{},"Well done — the platform should now be running. The gateway answers on port ",[195,435,436],{},"8787",", and the ",[195,439,376],{}," alias you set above lists what's running:",[258,442,444],{"className":260,"code":443,"language":262,"meta":263,"style":263},"curl http:\u002F\u002Flocalhost:8787\u002Fhealth\n# {\"ok\":true}\n\nteaspill agents ls\n",[195,445,446,451,456,462],{"__ignoreMap":263},[267,447,448],{"class":269,"line":270},[267,449,450],{},"curl http:\u002F\u002Flocalhost:8787\u002Fhealth\n",[267,452,453],{"class":269,"line":276},[267,454,455],{},"# {\"ok\":true}\n",[267,457,458],{"class":269,"line":282},[267,459,461],{"emptyLinePlaceholder":460},true,"\n",[267,463,464],{"class":269,"line":346},[267,465,466],{},"teaspill agents ls\n",[175,468,469,470,473],{},"An empty list is the correct answer on a fresh stack — nothing has been spawned yet. If both commands succeed, everything is wired. (The ",[237,471,472],{"href":150},"CLI reference"," covers every command and flag.)",[179,475,477],{"id":476},"what-you-just-started","What you just started",[175,479,480,481,484,485,488,489,491,492,495,496,499,500,503,504,507,508,511,512,202],{},"The compose stack runs ",[190,482,483],{},"five infrastructure services",": the ",[190,486,487],{},"gateway"," (port ",[195,490,436],{}," — the single front door for your app, your UI, and the CLI), ",[190,493,494],{},"Restate"," (the coordination core that runs your agents durably), ",[190,497,498],{},"Postgres"," (the ",[237,501,502],{"href":61},"catalog",": the registry of every agent), ",[190,505,506],{},"Electric"," (live sync of the catalog into browsers), and the ",[190,509,510],{},"durable streams server"," (the history store behind every agent's ",[237,513,514],{"href":56},"timeline",[175,516,517,518,521,522,525,526,529,530,533,534,537,538,540],{},"The overlay adds the ",[190,519,520],{},"two services you deploy"," when you build your own system: an ",[190,523,524],{},"agent-loop"," (here, the reference deployment's demo and test agents) and an ",[190,527,528],{},"executor"," (which hosts sandboxed ",[237,531,532],{"href":66},"workspaces"," for agents that run commands). The ",[237,535,536],{"href":24},"architecture overview"," explains how the pieces fit; ",[237,539,113],{"href":114}," covers running this stack for real.",[542,543,544],"warning",{},[175,545,546,547,550,551,554,555,558,559,561,562,564,565,568],{},"One networking rule bites everyone eventually: a service running ",[190,548,549],{},"on your host"," (like the quick start's agent process) must register itself as ",[195,552,553],{},"http:\u002F\u002Fhost.docker.internal:\u003Cport>"," — never ",[195,556,557],{},"localhost",". Restate dials registered URLs from inside its container, where ",[195,560,557],{}," means the container itself, so a ",[195,563,557],{}," registration succeeds and then every invocation fails. The ",[237,566,567],{"href":114},"Self-hosting guide"," has the full story.",[179,570,572],{"id":571},"next-steps","Next steps",[175,574,575,576,578],{},"The stack is up — now make it do something. The ",[237,577,239],{"href":19}," builds your first agent and streams its timeline into your browser.",[580,581,582],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":263,"searchDepth":270,"depth":276,"links":584},[585,586,587,588],{"id":181,"depth":276,"text":182},{"id":243,"depth":276,"text":244},{"id":476,"depth":276,"text":477},{"id":571,"depth":276,"text":572},"Clone the repository, boot the five-service stack with Docker Compose, and confirm the platform is healthy.","md",null,{},{"icon":16},{"title":13,"description":589},"4UxPlWnbgWzpj3HVqBvIOD-39UTsZ8qa_rXgLs9bi5Q",[597,599],{"title":10,"path":6,"stem":7,"description":598,"icon":11,"children":-1},"What teaspill is, the problems it removes, and what building on it looks like.",{"title":18,"path":19,"stem":20,"description":600,"icon":21,"children":-1},"Define a researcher agent, deploy it against the running stack, talk to it from the CLI, and watch its timeline live — then make it multi-agent.",1784473421996]