# 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

1. Export your Jules workspace with Google's official script ([Jules changelog](https://jules.google/docs/changelog/2026-10-29/)).
2. Zip the `jules-export/` folder so that folder is the archive root.
3. Open `/import`, choose the zip (100 MB max) and upload it.
4. Wait for the status to reach `done`, then read the counts and any warnings.
5. Use `/repos` and `/sessions/<id>` to inspect what came across.

Step-by-step detail, file layout and error cases: [Import from Google Jules](/docs/import-from-jules).

## Plans and limits

| Plan | Price | Tasks per day | Concurrent tasks | Model calls |
|---|---|---|---|---|
| Pro | $20/month | 2 tasks/day | 2 concurrent | Included |
| Plus | $50/month | 7 tasks/day | 4 concurrent | Included |
| Max | $100/month | 14 tasks/day | 8 concurrent | Included |
| Team | $200/month | 25 tasks/day | 15 concurrent | Included |
| BYOK | $29/month | 20 tasks/day | 3 concurrent | Your own provider key (BYOK) |

| 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`, `Secure` outside 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.txt` is the short index for AI assistants; `/llms-full.txt` is every page in one file.
- `/sitemap.xml` and `/robots.txt` are generated from the same page list.

---

Source: https://halvin.dev/docs · Last updated: 2026-11-10
