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
Preferred for a Docker demo: 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. 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.