# Import from Google Jules

Jules becomes read-only on November 11, 2026 and shuts down on December 31, 2026. This guide takes a Jules workspace and lands it in Halvin: repositories, setup scripts, test commands, memories, scheduled tasks and every session with its patches.

## Before you start

- A Jules workspace you can still export from (Jules read-only still allows export per its changelog).
- A Halvin account — sign-in uses GitHub.
- The zip must be 100 MB or smaller.

## 1. Export from Jules

Use Google's official export script; the current instructions live in the [Jules changelog](https://jules.google/docs/changelog/2026-10-29/). The script writes a folder named `jules-export/`.

## 2. Zip the folder

Zip the `jules-export/` folder itself, not its contents, so the archive root contains `jules-export/`. The importer expects these paths:

- `jules-export/user-settings.json`, `env-variables.json`, `scheduled-tasks.json`, `sources.json`, `sessions.json`
- `jules-export/repos/<source-id>/{memories.json,memories.md,setup.sh,test-command.txt}`
- `jules-export/sessions/<task-id>/{session.json,activities.json,patch-<n>.diff,summary.md}`

These files come from undocumented Google endpoints, so the parser is deliberately lenient: every field is optional, unknown keys are ignored, and a missing optional file produces a warning instead of a failure.

## 3. Upload and watch the status

1. Open `/import`.
2. Choose the zip and press “Upload & Import”.
3. The status moves `pending → processing → done`. Counts appear for repositories, sessions, patches, scheduled tasks, memories, env vars and setup scripts.
4. Re-uploading the same archive is safe: rows are updated, not duplicated.

## 4. Read the result

- `/repos` lists each repository with its setup script and test command.
- `/sessions` lists imported sessions; `/sessions/<id>` shows the prompt, the plan, the patches with diffs, and the summary.
- `/api/env-vars` returns imported environment variable names only — values are never exposed.

## Errors you may see

| Message | Meaning |
| --- | --- |
| Corrupt or invalid zip archive | The upload is not a readable zip. Re-create the archive. |
| Zip slip path traversal detected | The archive contains entries outside its root (for example `../evil.txt`). It is rejected and nothing is written. |
| File size exceeds 100 MB limit | Split the export or drop large binary artifacts before zipping. |
| session-missing-files | A warning, not an error: an older Jules session lacked optional files such as `summary.md`. |

- [Import from Jules](https://halvin.dev/import)
- [Back to docs](https://halvin.dev/docs)

---

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