Honest cost
- On the order of 30–60 minutes (image pull + first health wait, which the installer budgets at up to 420 seconds)
- A 16 GB-class machine (installer floor is 15000 MB). WSL: 10 GB. Docker Desktop on macOS: at least 8 GB allocated to the VM
- They still complete first-run in a browser: first account + an LLM. Vendor API key goes in the onboarding form (or a password manager), never pasted into a conversation. On a laptop, Ollama is enough — no vendor key. Embedding can use the system default. Search and chat both fail until an LLM is configured (HTTP 500:
LLM configuration is missing). That is not an empty index. - Slack / Drive / Jira still need a browser later (OAuth). For a laptop demo, upload files to the Knowledge Base (no OAuth, no extra Docker mounts) or use Local FS with a bind-mount
1. Preconditions
--yes anyway.
If docker ps already shows a PipesHub (pipeshub-ai, port 3000, or another project), do not run a bare --yes. Use a separate project and port (below) or attach to the instance they already have (Connect).
2. Install (slim)
Empty machine (no existing PipesHub):./pipeshub/ (or PIPESHUB_DIR) and defaults to port 3000, project pipeshub-ai.
This machine already has a PipesHub — required, not optional. Export the knobs before the pipe so both curl and bash see them (a prefix on curl does not reach the installer):
./install.sh --yes at the repository root is a wrapper; compose files live under deployment/docker-compose/. Same PIPESHUB_PROJECT / PIPESHUB_PORT rules apply. More flags: Quickstart and Advanced deployment.
Leave FRONTEND_PUBLIC_URL blank (--yes does). Do not expose port 3000/3200 on a public interface until first-run is finished.
3. Wait until healthy
PollGET http://localhost:<APP_PORT>/api/v1/health/services (default 3000, or the port you set). Ready when query, connector, indexing, and docling are "healthy". Do not wait for embedding. Do not poll /health — that path returns the SPA and is 200 immediately.
4. Human first-run (browser)
They openhttp://localhost:<APP_PORT>:
- Create the first account (Individual is enough).
-
Onboarding: configure an LLM. Paste a vendor API key into the form (not into chat), or pick Ollama: a model they already have installed (
ollama list), endpoint left at the defaulthttp://host.docker.internal:11434. Compose already maps that hostname to the host (docker-compose.ymlextra_hosts). Confirm from the install directory:Embedding: system default is fine for a demo. - Developer Settings: create an OAuth app or a personal access token. They put the PAT in a local env file or the client’s secret store — never paste it into chat.
GET /api/v1/org/onboarding-status as readiness. It only gates the UI wizard (notConfigured → /onboarding). pipeshub_search returning HTTP 500 with LLM configuration is missing means they skipped the LLM step.
5. Index something that does not need OAuth
Fastest for a Docker demo: the Demo connector — a fictional company across five systems, no files and no OAuth (first release after 0.8.0). Otherwise, Knowledge Base upload in the UI (no extra mounts): have them drop a few.md / .txt / PDF files.
Local FS (docs): no login, but the path must exist inside the container. After install, in the directory the installer printed (./pipeshub or PIPESHUB_DIR), add docker-compose.override.yml and recreate:
/data/demo, enable sync, run a sync. A host path that is not mounted is invisible (docker compose exec pipeshub-ai ls /data/demo must list files).
Do not start Slack/Drive OAuth unless they asked for those systems.
6. Attach MCP
Cursor and Claude Code can usehttp://localhost:<APP_PORT>/mcp. Claude.ai and Claude Desktop’s custom connector cannot (they need public HTTPS). Config is in Connect. For a PAT, prefer the stdio bridge with env interpolation — do not commit the token.
7. Prove it works (do not skip)
Callpipeshub_sources, then pipeshub_search on a term from the files they uploaded — or, with the Demo connector, on its first question: “Why was the payment service architecture changed, and how was the decision made?” (there are no uploaded files in that setup). Back off (e.g. 15s, 30s, 60s, up to several minutes):
Do not curl first-run APIs (
POST /org, login, PAT create, LLM config) from a chat. PAT create returns the secret in JSON. Use the bootstrap script instead: First-run without a browser.
Then put the skill + AGENTS.md in their repo — For coding agents.