Halvin docs
Short docs, honest status. The import path works end to end today; task execution and billing are being shipped in the open.
Getting started
- Export your Jules workspace with Google's official script (Jules changelog).
- Zip the
jules-export/folder so that folder is the archive root. - Open
/import, choose the zip (100 MB max) and upload it. - Wait for the status to reach
done, then read the counts and any warnings. - Use
/reposand/sessions/<id>to inspect what came across.
Step-by-step detail, file layout and error cases: Import from Google Jules.
Plans and limits
Pro
$20 /mo
2 tasks/day (rolling 24h)
2 concurrent tasks
Model calls included
Plus
$50 /mo
7 tasks/day (rolling 24h)
4 concurrent tasks
Model calls included
Max
$100 /mo
14 tasks/day (rolling 24h)
8 concurrent tasks
Model calls included
Team
$200 /mo
25 tasks/day (rolling 24h)
15 concurrent tasks
Model calls included
BYOK
BYOK
$29 /mo
20 tasks/day (rolling 24h)
3 concurrent tasks
Your own model provider key
| Limit | Value | Scope |
|---|---|---|
| Tasks per day | From tasksPerDay in src/config/plans.ts | Rolling 24-hour window, resets continuously |
| Concurrent tasks | From concurrentTasks in src/config/plans.ts | At any instant |
| Session time | No limit | Not enforced |
Security
- Imported env var values are encrypted with AES-GCM (WebCrypto) before they reach the database, and the API returns names only — never values.
- Archive entries that escape the zip root are rejected and the import fails with no rows written.
- Session cookies are HMAC-signed,
HttpOnly,SameSite=Lax,Secureoutside localhost, with a 30-day absolute TTL; sign-out revokes the row server-side. - Secrets are Worker secrets (
wrangler secret put), never vars in committed configuration. Sign-in and import fail closed when a required secret is missing.
Feature status
| Feature | Status | Notes |
|---|---|---|
| Import from Google Jules | Live | Repos, setup scripts, test commands, memories, scheduled tasks, sessions, patches |
| Plans and pricing | Live | Served from src/config/plans.ts at /api/plans |
| GitHub sign-in | Wired, app registration pending | OAuth + sessions implemented; routes return 503 until the OAuth app is registered |
| Cloud task execution | Shipping | Sandbox runner (Containers/Sandbox) and the agent engine |
| Stripe billing | Shipping | Checkout, Customer Portal and webhook |
| GitHub App (clone + open PR) | Shipping | Read code, open pull requests, receive checks |
Public API
| Method | Path | Purpose |
|---|---|---|
| GET | /api/health | { "ok": true } |
| GET | /api/plans | The five plans, exactly as published on /pricing |
| GET | /api/auth/github/start | Begin GitHub sign-in |
| GET | /api/me | Signed-in account and entitlement (401 when signed out) |
| POST | /api/imports | Upload a Jules export zip (100 MB max) → 202 with an import id |
| GET | /api/imports/:id | Import status, counts, warnings |
| GET | /api/repos | Imported repositories |
| GET | /api/sessions?repo= | Session index, optionally filtered by repository |
| GET | /api/sessions/:id | Prompt, plan, patches and summary for one session |
| GET | /api/env-vars | Imported env var names only |
Machine-readable
- Every page here has a Markdown twin:
/index.md,/pricing.md,/docs.md. /llms.txtis the short index for AI assistants;/llms-full.txtis every page in one file./sitemap.xmland/robots.txtare generated from the same page list.