Quickstart
Uniph.ai — Quickstart (friction-first)
Minimal steps to run the stack and get first value fast. The app is intent-first: internal execution context is created behind the scenes.
- Frontend (production):
https://uniph.ai - Backend API (production):
https://api.uniph.ai - Local API base:
http://localhost:3001(or setAPI_BASE)
One-command start
docker compose up
Open http://localhost:3000 and sign in. The dashboard will auto-start ambient onboarding if you have no goals.
Optional smoke tests
From repo root:
npm run test:api npm run test:quickstart
1. curl (recommended first check)
API_BASE="${API_BASE:-http://localhost:3001}" # Health curl -s "$API_BASE/api/health" | jq . # Ambient start: creates first useful outcome with minimal input curl -s -X POST "$API_BASE/api/orchestrate/start" \ -H "Content-Type: application/json" \ -H "X-User-Email: user@example.com" \ -d '{"userMessage":"Plan my top priorities for this week"}' | jq . # Friction KPIs curl -s "$API_BASE/api/evaluation/friction" | jq .
1b. Optional: direct chat call
curl -s -X POST "$API_BASE/api/infer/chat" \ -H "Content-Type: application/json" \ -H "X-User-Email: user@example.com" \ -d '{"messages":[{"role":"user","content":"What should I focus on this week?"}]}' | jq .
2. Node (fetch)
const API_BASE = process.env.API_BASE || "http://localhost:3001"; async function main() { const res = (method, path, body = null, apiKey = null) => { const opts = { method, headers: { "Content-Type": "application/json" } }; if (body) opts.body = JSON.stringify(body); if (apiKey) opts.headers["Authorization"] = `Bearer ${apiKey}`; return fetch(`${API_BASE}${path}`, opts).then((r) => r.json()); }; const started = await res("POST", "/api/orchestrate/start", { userMessage: "Help me execute one high-impact objective this week", }); console.log("Action taken:", started.actionTaken); console.log("Outcome summary:", started.outcome?.summary); } main().catch(console.error);
3. Python (requests)
import os import json import requests # pip install requests API_BASE = os.environ.get("API_BASE", "http://localhost:3001") def main(): # Ambient start r = requests.post( f"{API_BASE}/api/orchestrate/start", json={"userMessage": "Help me execute one high-impact objective this week"}, headers={"X-User-Email": "user@example.com"}, ) r.raise_for_status() data = r.json() print("Action:", data.get("actionTaken")) print("Outcome:", data.get("outcome", {}).get("summary")) if __name__ == "__main__": main()
4. API overview
| Action | Method | Path | Auth |
|--------|--------|------|------|
| Health | GET | /api/health | — |
| List goals | GET | /api/goals | user auth context |
| List tasks | GET | /api/tasks | user auth context |
| Start orchestration | POST | /api/orchestrate/start | user auth context |
| Chat | POST | /api/infer/chat | user auth context |
| Memory recall | POST | /api/memory/recall | user auth context |
See API.md for full reference.