Skip to main content
This is the playbook when there is no running PipesHub. Offer a local Docker install. Do not start it until they agree. Do not invent a RAG stack while you wait. If they already have an instance, go back to For coding agents and skip to Connect.

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
--yes skips installer prompts, including the low-RAM abort. Check RAM before invoking. Keep the stack on localhost until first-run is done — POST /api/v1/org is unauthenticated first-run, so whoever reaches a fresh instance first owns it. --yes without PIPESHUB_PROJECT always targets Compose project pipeshub-ai. If that stack already exists, --yes updates it — it does not create a second copy. Never attach to someone else’s corpus.

1. Preconditions

If Docker is missing or RAM is below the floor, stop. Do not run --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):
That writes ./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):
From a clone, ./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

Poll GET 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 open http://localhost:<APP_PORT>:
  1. Create the first account (Individual is enough).
  2. 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 default http://host.docker.internal:11434. Compose already maps that hostname to the host (docker-compose.yml extra_hosts). Confirm from the install directory:
    Embedding: system default is fine for a demo.
  3. 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.
Poll until the account exists:
Do not treat 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:
Then in Workspace Settings → Your Connectors → Local FS, set Local folder to /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 use http://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)

Call pipeshub_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.