# sideagent > Embed a docs chat agent in your app. Give it your documentation and an OpenAI-compatible LLM host and key; get a secure agent endpoint (`sideagent/server`) and a React chat UI (`sideagent`). ## Docs - [Introduction](https://egig.github.io/sideagent/): Embed a docs chat agent in your app. You give it your documentation (markdown and URLs) and an OpenAI-compatible host and key. It gives you a secure agent endpoint and a React chat UI that answers from your docs and shows its sources. - [Quickstart](https://egig.github.io/sideagent/quickstart): Let your coding agent (Claude Code, Cursor, Codex and others) add sideagent to your app. Install the skill once: - [Server](https://egig.github.io/sideagent/server): Import from `sideagent/server`. - [Client](https://egig.github.io/sideagent/client): With an agent hosted on sideagent Cloud, pass its publishable key instead of `endpoint`. The key names the agent and its host, so the chat derives the URL (`https:///v1/agents/`) and sends the key in the `x-sideagent-key` header on every request. The key is public: it is safe in the browser and proves nothing on its own. - [Hooks](https://egig.github.io/sideagent/hooks): Hooks are your code that runs at set points. There are server hooks (on `createAgent`) and client hooks (on `AgentChat` / `AgentProvider`). - [Theming](https://egig.github.io/sideagent/theming): Neutral by default (grayscale, host font, 10px radius). `theme="auto"` (or `"system"`) follows the OS (unless a host `.light` / `data-theme="light"` / `data-bs-theme="light"` is set) and a host `.dark` / `data-theme="dark"` / `data-bs-theme="dark"`; pass `"light"` or `"dark"` to force one. Match your design system with CSS variables on `:root`: - [Persistence](https://egig.github.io/sideagent/persistence): By default everything is kept in memory and lost on restart. In production, pass your own storage to `createAgent`. All three options are independent and optional. - [Chat history](https://egig.github.io/sideagent/history): `AgentChat` has a History button (list, open, delete) and reopens the last conversation after a refresh. Messages live in your LangGraph `checkpointer`; the list lives in a `threadStore` (in-memory by default). Both must be persistent in production. See [Persistence](./persistence.md) for setup: - [Knowledge](https://egig.github.io/sideagent/knowledge): Give the agent markdown and URL sources to answer from. - [Deployments](https://egig.github.io/sideagent/deployments): `getAuth(request)` runs on every request. Throw, or return no `userId`, and the request gets `401`. - [Example](https://egig.github.io/sideagent/example): A small docs assistant: an agent endpoint over a markdown source and a web page, a React app with the chat docked on the side, and a scripted mock LLM so it runs without an API key. - [Cloudflare Workers](https://egig.github.io/sideagent/cloudflare-workers): `sideagent/server` runs on Workers. Use `nodejs_compat` (or just `nodejs_als`) in `wrangler.jsonc`. LangGraph relies on `AsyncLocalStorage`, and the Workers build of LangGraph does not register it. sideagent registers it for you when the runtime has it. ## Optional - [Full docs in one file](https://egig.github.io/sideagent/llms-full.txt) - [Source](https://github.com/egig/sideagent)