Sandboxed
No tools, no function calling, no browsing. There is nothing to escalate to.
Open source · MIT · by repo.box
Concierge is a chat widget plus a sandboxed proxy. It answers visitor questions from one page brief you wrote, streams fast, and has no tools, no browser, no retrieval and no memory. Jailbreak it and the worst case is an off-brand sentence.
The widget in the corner of this page is Concierge, briefed on Concierge. Ask it what this is. That is the pitch.
One decision does the work: the agent has no capabilities.
No tools, no function calling, no browsing. There is nothing to escalate to.
The whole brief sits in the system prompt. It answers from what is in front of it and refuses when the answer is not there.
A small model, streamed tokens, no retrieval round-trip. First token lands quickly.
Hardened prompt, client system roles stripped, depth and length caps, per-IP and per-session rate limits, bounded concurrency, a provider circuit breaker.
Six questions produce a brief the server accepts. Nothing here is stored beyond a 30-minute sandbox you opt into.
Every token the widget knows is adjustable. The preview is the real widget talking to the real server; when you have used a brief above, it answers from that brief.
Values below are the preset defaults after accent, radius and density are applied. Edit any of them; blank restores the default.
Inline mount of the same embed bundle served at /concierge/embed.js. The preview always mounts inline; Position only changes the export.
Everything below is derived from the configuration above. Paste the script tag into a blank HTML file and it renders exactly this widget against this server.
Drop this into the file you point CONCIERGE_BRIEF at, or as one page of CONCIERGE_BRIEFS / a packet.
Two ways, same widget. The script tag needs no build step; the server serves the bundle at /embed.js so the host page never hosts the asset.
data-* attributesEvery prop has a data-* equivalent (launcherLabel → data-launcher-label).
| Prop | data-* | Default | What it does |
|---|
Six required strings. docs is the agent's entire world; end it with a LINKS: block of the exact URLs it may share. capabilities is optional and honoured only from server-loaded briefs.
Validate any brief against the running server without storing it:
curl -s -X POST https://concierge.repo.box/concierge/brief/validate \
-H 'content-type: application/json' --data @brief.json
# → {"ok":true,"errors":[]} or 422 {"ok":false,"errors":["docs must not be empty", …]}
Generated at page load from the widget's own TOKEN_METADATA and THEME_PRESETS exports, so this table cannot drift from the bundle you embed. Composition order: preset → accent derivation → radius scale → density → themeVars.
| Token | Category | Controls | midnight | Preset differences |
|---|
Server limits (env, default): CONCIERGE_MAX_CONCURRENT 4 · CONCIERGE_MAX_QUEUE_DEPTH 16 · CONCIERGE_REQUEST_TIMEOUT_MS 30000 · CONCIERGE_RATE_LIMIT_IP 20/min · CONCIERGE_RATE_LIMIT_SESSION 12/min · CONCIERGE_CIRCUIT_FAILURES 3. GET /health reports liveness and queue/circuit state; GET /ready returns 503 when saturated. Error codes: queue_full, rate_limited_ip, rate_limited_session, provider_circuit_open. The sandbox used by this page is opt-in (CONCIERGE_SANDBOX=1) and off in a default install.
Powerless by default. Each pack is a door you open, only from trusted server-side brief JSON; the /chat body cannot enable, inject or modify any of it.
maxInjectedChars.capture_lead, handoff_human). Side-effect tools ask for confirmation; repeats are deduplicated. Client-requested tools are rejected.ui: true lets the model render declared components through a typed event protocol; off, the stream is text and tool results only.