Jean uses a project-based organization system where each git repository is a Project, and you work in isolated Worktrees for different branches and tasks.
Projects in Jean represent git repositories you’ve added to the app. Each project stores metadata and configuration for managing worktrees.
interface Project { id: string // Unique identifier (UUID v4) name: string // Display name (from repo directory) path: string // Absolute path to original git repo default_branch: string // Branch to create worktrees from added_at: number // Unix timestamp when added order: number // Display order in sidebar parent_id?: string // Parent folder ID (for organization) is_folder?: boolean // True if this is a folder, not a project avatar_path?: string // Custom avatar image path enabled_mcp_servers?: string[] // MCP servers enabled for this project custom_system_prompt?: string // Custom prompt appended to sessions default_provider?: string | null // Default AI provider (Claude, OpenRouter, etc.) default_backend?: string | null // Default CLI backend (claude, codex, opencode) worktrees_dir?: string | null // Custom base directory for worktrees linear_api_key?: string | null // Linear API key for this project linear_team_id?: string | null // Linear team ID filter}
The path field points to your original repository. Worktrees are created in a separate location (by default ~/jean/<project-name>/<worktree-name>).
Git worktrees allow you to have multiple working directories from a single repository. Each worktree has its own branch and working files, but they all share the same git history.Benefits:
Work on multiple branches simultaneously
Avoid branch switching overhead
Isolated environments for different tasks
Each worktree can have different dependencies installed
Automate worktree initialization with setup scripts defined in jean.json at your project root:
{ "setup": "npm install && npm run build"}
The setup script runs automatically after creating each worktree. Results are stored:
interface Worktree { setup_output?: string // Full console output setup_script?: string // The command that ran setup_success?: boolean // true/false/undefined}