[{"data":1,"prerenderedAt":444},["ShallowReactive",2],{"docs-navigation":3,"docs\u002Fdocs\u002Fquickstart\u002Fself-hosted":194,"docs\u002Fdocs\u002Fquickstart\u002Fself-hosted-surround":439},[4],{"title":5,"path":6,"stem":7,"children":8},"Docs","\u002Fdocs","docs",[9,13,35,129,149,154],{"title":10,"path":6,"stem":11,"icon":12},"Overview","docs\u002Findex","i-lucide-house",{"title":14,"icon":15,"path":16,"stem":17,"children":18,"page":34},"Quickstart","i-lucide-rocket","\u002Fdocs\u002Fquickstart","docs\u002F1.quickstart",[19,24,29],{"title":20,"path":21,"stem":22,"icon":23},"Local","\u002Fdocs\u002Fquickstart\u002Flocal","docs\u002F1.quickstart\u002F1.local","i-lucide-laptop",{"title":25,"path":26,"stem":27,"icon":28},"Self-hosted","\u002Fdocs\u002Fquickstart\u002Fself-hosted","docs\u002F1.quickstart\u002F2.self-hosted","i-lucide-server",{"title":30,"path":31,"stem":32,"icon":33},"Cloud","\u002Fdocs\u002Fquickstart\u002Fcloud","docs\u002F1.quickstart\u002F3.cloud","i-lucide-cloud",false,{"title":36,"path":37,"stem":38,"children":39,"icon":41},"Harnesses","\u002Fdocs\u002Fharnesses","docs\u002F2.harnesses\u002Findex",[40,42,47,51,55,59,63,67,71,76,80,84,89,93,97,101,105,109,113,117,121,125],{"title":36,"path":37,"stem":38,"icon":41},"i-lucide-plug",{"title":43,"path":44,"stem":45,"icon":46},"Claude Code","\u002Fdocs\u002Fharnesses\u002Fclaude-code","docs\u002F2.harnesses\u002F1.claude-code","i-lucide-terminal",{"title":48,"path":49,"stem":50,"icon":46},"Devin","\u002Fdocs\u002Fharnesses\u002Fdevin","docs\u002F2.harnesses\u002F10.devin",{"title":52,"path":53,"stem":54,"icon":46},"Kiro","\u002Fdocs\u002Fharnesses\u002Fkiro","docs\u002F2.harnesses\u002F11.kiro",{"title":56,"path":57,"stem":58,"icon":46},"Cline","\u002Fdocs\u002Fharnesses\u002Fcline","docs\u002F2.harnesses\u002F12.cline",{"title":60,"path":61,"stem":62,"icon":46},"Amp","\u002Fdocs\u002Fharnesses\u002Famp","docs\u002F2.harnesses\u002F13.amp",{"title":64,"path":65,"stem":66,"icon":46},"VS Code","\u002Fdocs\u002Fharnesses\u002Fvscode","docs\u002F2.harnesses\u002F14.vscode",{"title":68,"path":69,"stem":70,"icon":46},"Gemini CLI","\u002Fdocs\u002Fharnesses\u002Fgemini-cli","docs\u002F2.harnesses\u002F15.gemini-cli",{"title":72,"path":73,"stem":74,"icon":75},"OpenClaw","\u002Fdocs\u002Fharnesses\u002Fopenclaw","docs\u002F2.harnesses\u002F16.openclaw","i-lucide-puzzle",{"title":77,"path":78,"stem":79,"icon":75},"Hermes Agent","\u002Fdocs\u002Fharnesses\u002Fhermes","docs\u002F2.harnesses\u002F17.hermes",{"title":81,"path":82,"stem":83,"icon":75},"NanoClaw","\u002Fdocs\u002Fharnesses\u002Fnanoclaw","docs\u002F2.harnesses\u002F18.nanoclaw",{"title":85,"path":86,"stem":87,"icon":88},"skills.sh (`npx skills`)","\u002Fdocs\u002Fharnesses\u002Fskills-sh","docs\u002F2.harnesses\u002F19.skills-sh","i-lucide-store",{"title":90,"path":91,"stem":92,"icon":46},"Codex CLI","\u002Fdocs\u002Fharnesses\u002Fcodex","docs\u002F2.harnesses\u002F2.codex",{"title":94,"path":95,"stem":96,"icon":88},"Claude Code plugin marketplace","\u002Fdocs\u002Fharnesses\u002Fclaude-code-marketplace","docs\u002F2.harnesses\u002F20.claude-code-marketplace",{"title":98,"path":99,"stem":100,"icon":88},"Codex plugin marketplace","\u002Fdocs\u002Fharnesses\u002Fcodex-marketplace","docs\u002F2.harnesses\u002F21.codex-marketplace",{"title":102,"path":103,"stem":104,"icon":46},"Cursor","\u002Fdocs\u002Fharnesses\u002Fcursor","docs\u002F2.harnesses\u002F3.cursor",{"title":106,"path":107,"stem":108,"icon":46},"OpenCode V1","\u002Fdocs\u002Fharnesses\u002Fopencode-v1","docs\u002F2.harnesses\u002F4.opencode-v1",{"title":110,"path":111,"stem":112,"icon":46},"OpenCode 2","\u002Fdocs\u002Fharnesses\u002Fopencode-v2","docs\u002F2.harnesses\u002F5.opencode-v2",{"title":114,"path":115,"stem":116,"icon":46},"Oh My Pi (omp)","\u002Fdocs\u002Fharnesses\u002Fomp","docs\u002F2.harnesses\u002F6.omp",{"title":118,"path":119,"stem":120,"icon":46},"Pi","\u002Fdocs\u002Fharnesses\u002Fpi","docs\u002F2.harnesses\u002F7.pi",{"title":122,"path":123,"stem":124,"icon":46},"Copilot CLI","\u002Fdocs\u002Fharnesses\u002Fcopilot","docs\u002F2.harnesses\u002F8.copilot",{"title":126,"path":127,"stem":128,"icon":46},"Antigravity","\u002Fdocs\u002Fharnesses\u002Fantigravity","docs\u002F2.harnesses\u002F9.antigravity",{"title":130,"icon":131,"path":132,"stem":133,"children":134,"page":34},"Concepts","i-lucide-lightbulb","\u002Fdocs\u002Fconcepts","docs\u002F3.concepts",[135,140,145],{"title":136,"path":137,"stem":138,"icon":139},"Reports","\u002Fdocs\u002Fconcepts\u002Freports","docs\u002F3.concepts\u002F1.reports","i-lucide-file-text",{"title":141,"path":142,"stem":143,"icon":144},"Triage","\u002Fdocs\u002Fconcepts\u002Ftriage","docs\u002F3.concepts\u002F2.triage","i-lucide-list-checks",{"title":146,"path":147,"stem":148,"icon":41},"Model and harness independence","\u002Fdocs\u002Fconcepts\u002Fmodel-and-harness-independence","docs\u002F3.concepts\u002F3.model-and-harness-independence",{"title":150,"path":151,"stem":152,"icon":153},"Security","\u002Fdocs\u002Fsecurity","docs\u002F4.security","i-lucide-shield-check",{"title":155,"path":156,"stem":157,"children":158,"icon":160},"Reference","\u002Fdocs\u002Freference","docs\u002F5.reference\u002Findex",[159,161,166,171,174,179,184,189],{"title":155,"path":156,"stem":157,"icon":160},"i-lucide-book-open",{"title":162,"path":163,"stem":164,"icon":165},"API","\u002Fdocs\u002Freference\u002Fapi","docs\u002F5.reference\u002F1.api","i-lucide-braces",{"title":167,"path":168,"stem":169,"icon":170},"Operations","\u002Fdocs\u002Freference\u002Foperate","docs\u002F5.reference\u002F2.operate","i-lucide-settings",{"title":150,"path":172,"stem":173,"icon":153},"\u002Fdocs\u002Freference\u002Fsecurity","docs\u002F5.reference\u002F3.security",{"title":175,"path":176,"stem":177,"icon":178},"Session logs","\u002Fdocs\u002Freference\u002Fsessions","docs\u002F5.reference\u002F4.sessions","i-lucide-history",{"title":180,"path":181,"stem":182,"icon":183},"Releases","\u002Fdocs\u002Freference\u002Freleases","docs\u002F5.reference\u002F5.releases","i-lucide-tags",{"title":185,"path":186,"stem":187,"icon":188},"Client installation","\u002Fdocs\u002Freference\u002Fagent-install","docs\u002F5.reference\u002F6.agent-install","i-lucide-download",{"title":190,"path":191,"stem":192,"icon":193},"Stack installation","\u002Fdocs\u002Freference\u002Fagent-install-stack","docs\u002F5.reference\u002F7.agent-install-stack","i-lucide-container",{"id":195,"title":196,"body":197,"description":432,"extension":433,"meta":434,"navigation":435,"path":26,"seo":436,"stem":27,"verified":437,"__hash__":438},"docs\u002Fdocs\u002F1.quickstart\u002F2.self-hosted.md","Quickstart, self-hosted",{"type":198,"value":199,"toc":426},"minimark",[200,204,209,217,265,291,307,314,317,332,344,355,359,366,374,378,391,395,402,405,414,422],[201,202,203],"p",{},"A self-hosted server collects reports from several machines into one inbox. It is one trust domain with one shared key: everyone who holds the key can read and write. That is right for a team that runs its own infrastructure; it is not a multi-tenant service.",[205,206,208],"h2",{"id":207},"the-short-version","The short version",[201,210,211,212,216],{},"Install the binary with the ",[213,214,215],"a",{"href":21},"local quickstart"," first. On Linux, run the following as the ordinary user who will own the service, not root:",[218,219,224],"pre",{"className":220,"code":221,"language":222,"meta":223,"style":223},"language-sh shiki shiki-themes github-light github-light github-dark","agentfeedback serve --init\nagentfeedback server install --systemd\nsystemctl --user daemon-reload\nsystemctl --user enable --now agentfeedback.service\nsystemctl --user status agentfeedback.service\ncurl -fsS http:\u002F\u002F127.0.0.1:8090\u002Fhealth\n","sh","",[225,226,227,235,241,247,253,259],"code",{"__ignoreMap":223},[228,229,232],"span",{"class":230,"line":231},"line",1,[228,233,234],{},"agentfeedback serve --init\n",[228,236,238],{"class":230,"line":237},2,[228,239,240],{},"agentfeedback server install --systemd\n",[228,242,244],{"class":230,"line":243},3,[228,245,246],{},"systemctl --user daemon-reload\n",[228,248,250],{"class":230,"line":249},4,[228,251,252],{},"systemctl --user enable --now agentfeedback.service\n",[228,254,256],{"class":230,"line":255},5,[228,257,258],{},"systemctl --user status agentfeedback.service\n",[228,260,262],{"class":230,"line":261},6,[228,263,264],{},"curl -fsS http:\u002F\u002F127.0.0.1:8090\u002Fhealth\n",[201,266,267,270,271,274,275,278,279,282,283,286,287,290],{},[225,268,269],{},"serve --init"," creates a private key file and ",[225,272,273],{},"serve.env",", configured for ",[225,276,277],{},"127.0.0.1:8090","; it does not start the server. Keep its output private. ",[225,280,281],{},"server install"," writes the service file but starts nothing; the ",[225,284,285],{},"systemctl"," commands above do that. Enable lingering with ",[225,288,289],{},"loginctl enable-linger \"$USER\""," if it must keep running after logout.",[201,292,293,294,297,298,301,302,306],{},"On macOS use ",[225,295,296],{},"server install --launchd",", or use ",[225,299,300],{},"--compose"," for Docker, then run the startup commands it prints. The ",[213,303,305],{"href":304},"\u002Fdocs\u002Freference\u002Foperate#bare-binary-no-docker","operating guide"," covers these alternatives.",[308,309,311],"callout",{"color":310},"warning",[201,312,313],{},"Before connecting other machines, provide a trusted network path and HTTPS through your reverse proxy or tunnel. Do not expose the plaintext server directly to the internet. Transfer the key to clients out of band, never through an agent's context.",[201,315,316],{},"On each client machine:",[218,318,320],{"className":220,"code":319,"language":222,"meta":223,"style":223},"agentfeedback init --server https:\u002F\u002Fyour-server.example --key-from-stdin \u003C \u002Fpath\u002Fto\u002Fprivate-server-key\nagentfeedback doctor --e2e\n",[225,321,322,327],{"__ignoreMap":223},[228,323,324],{"class":230,"line":231},[228,325,326],{},"agentfeedback init --server https:\u002F\u002Fyour-server.example --key-from-stdin \u003C \u002Fpath\u002Fto\u002Fprivate-server-key\n",[228,328,329],{"class":230,"line":237},[228,330,331],{},"agentfeedback doctor --e2e\n",[201,333,334,335,338,339,343],{},"Replace the URL and private key-file path with your own. The end-to-end check must succeed before relying on reporting. If this client already has a different server configured, ",[225,336,337],{},"init"," refuses to replace it; see the ",[213,340,342],{"href":341},"\u002Fdocs\u002Freference\u002Foperate#wire-the-harnesses","client configuration procedure",".",[201,345,346,347,350,351,354],{},"Clients spool reports when the server is unreachable and retry transient responses such as ",[225,348,349],{},"429"," and ",[225,352,353],{},"5xx","; a failed delivery is not a successful submission.",[205,356,358],{"id":357},"the-playbook","The playbook",[201,360,361,362,365],{},"The ",[213,363,364],{"href":191},"server-and-client playbook"," covers the complete procedure: installing the binary, configuring and starting the service, exposure, key distribution, the triage skill, backups and end-to-end reporting. To have a coding agent perform it, start with:",[218,367,372],{"className":368,"code":370,"language":371,"meta":223},[369],"language-text","Install the AgentFeedback stack from https:\u002F\u002Fgithub.com\u002FAgentFeedback\u002Fagentfeedback: server and client, and verify reporting end to end.\n","text",[225,373,370],{"__ignoreMap":223},[205,375,377],{"id":376},"operating-it","Operating it",[201,379,380,381,383,384,387,388,343],{},"Backups, restore, upgrades, key rotation, retention, monitoring and uninstalling are in the ",[213,382,305],{"href":168},". The container image is ",[225,385,386],{},"ghcr.io\u002Fagentfeedback\u002Fagentfeedback","; choose a released version from the ",[213,389,390],{"href":181},"release reference",[205,392,394],{"id":393},"what-a-self-hosted-server-does-not-do","What a self-hosted server does not do",[201,396,397,398,401],{},"It stores and serves reports for one trust domain; it has no organisations or per-person keys. ",[225,399,400],{},"agentfeedback ui --server"," provides a read-only local viewer for a configured server, not a hosted multi-tenant dashboard.",[201,403,404],{},"To move to another server, run migration from a client still configured for the source. Supply the destination's key separately:",[218,406,408],{"className":220,"code":407,"language":222,"meta":223,"style":223},"agentfeedback migrate --to https:\u002F\u002Ftarget.example --to-key-from-stdin \u003C \u002Fpath\u002Fto\u002Fprivate-target-key\n",[225,409,410],{"__ignoreMap":223},[228,411,412],{"class":230,"line":231},[228,413,407],{},[201,415,416,417,421],{},"UIDs and content are preserved; destination database IDs are new. Re-running skips UIDs already imported. Review the ",[213,418,420],{"href":419},"\u002Fdocs\u002Freference\u002Foperate#restore-and-migration","migration procedure"," before changing the client's source configuration.",[423,424,425],"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":223,"searchDepth":237,"depth":237,"links":427},[428,429,430,431],{"id":207,"depth":237,"text":208},{"id":357,"depth":237,"text":358},{"id":376,"depth":237,"text":377},{"id":393,"depth":237,"text":394},"The same binary as a server for a team, one container, one key.","md",{},{"title":25,"icon":28},{"title":196,"description":432},null,"QQuT59LDir7g3rYwmefkyAOZwHT2uJdYsmu7f_j4ADY",[440,442],{"title":20,"path":21,"stem":22,"description":441,"icon":23,"children":-1},"One binary, a database on your machine, no server and no key.",{"title":30,"path":31,"stem":32,"description":443,"icon":33,"children":-1},"Three ways to connect to the hosted public beta.",1794388867892]