Jolo - not quite Yolo, but close enough.
Jolo is meant to help you get a project up in minutes. Spin up isolated devcontainers with AI agents that work together (and will let you know when they are done if you have notifications set up). It is designed around being as provider agnostic as possible. So for instance, all agents will get the same skills, and will use the same project based system for long term memory instead of just their own.
This project started as a way to isolate my Emacs config automatically to be able to easily try changes there. But Emacs is just a git repo. So I made it work with any repo, and now Emacs is just there along for the ride.
Alpine Linux container with Emacs, agents (Claude, Gemini, Codex, Pi) without permission checks, language servers, browser automation, lots of guard rails (linters, pre-commit hooks), and all the developer tools I’ve come to expect on regular systems.
Each jolo up invocation gets an isolated container with its own (permanent) port, shell history, and AI credentials. Every container starts a 7-window tmux session: Emacs, Claude, Codex, Gemini, Pi, dev, and a shell.
All agents share the same skills and project memory (docs/). Skills are namespaced with jolo: to avoid collision with third-party skill packs. Agents get push notifications via ntfy when they finish, with buttons that link to the commit, PR, or the running app depending on context.
spawn mode fans out N worktrees with agents round-robin through Claude, Gemini, Codex, and Pi. Each gets a unique $PORT (4000, 4001, …). Ports 4000-5000 are forwarded to the host.
See AGENTS.md for the full reference.
Agents send push notifications via ntfy when they finish. The notification includes the last commit message and up to two action buttons depending on context:
- Open app — links to your dev server URL (web projects only, with optional page-specific path)
- View PR or View commit — links to GitHub
Works with the ntfy Android/iOS app, the web UI, and ntfy subscribe on the CLI (including Termux). Self-hosted ntfy servers are supported via NTFY_SERVER.
The dev server URL is also copied to clipboard via OSC 52 on jolo up, so you can paste it on any machine on your Tailscale network.
jolo create generates projects with opinionated defaults and current tooling:
| Flavor | Stack | Dev server | Linter | Test |
|---|---|---|---|---|
typescript-web | Bun + Elysia + HTMX | bun --watch | Biome | Bun test |
typescript-bare | Bun | — | Biome | Bun test |
python-web | FastAPI + Jinja2 | uvicorn --reload | Ruff | pytest |
python-bare | uv | — | Ruff | pytest |
go-web | Go + Templ + Air | air (live-reload) | golangci-lint | go test |
go-bare | Go | — | golangci-lint | go test |
rust-web | Axum + Askama | bacon | clippy | cargo test |
rust-bare | Rust | — | clippy | cargo test |
shell | POSIX sh / Bash | — | ShellCheck | — |
prose | Markdown / Org | — | markdownlint | — |
Every project gets pre-commit hooks, a justfile, type checking config where applicable, and test scaffolding. The dev server always binds to $PORT which is stable per project and accessible over Tailscale.
Emacs runs as a daemon in the container. Your host config (~/.config/emacs/) is copied in at launch, and package caches are mounted so builds are fast after the first run. Works well with claude-code-ide and agent-shell for talking to agents from inside Emacs.
# Install
ln -s $(pwd)/jolo.py ~/.local/bin/jolo
# Scaffold a new project
jolo create myapp
# Clone a repo and start a devcontainer
jolo clone https://github.com/org/repo.git
# Start devcontainer in any git project
cd ~/myproject && jolo up
# Fire and forget — AI works in background
jolo up -p "add OAuth login"
# Spawn parallel agents on the same problem
jolo spawn 5 -p "implement the auth system"
# Research mode (persistent repo at ~/jolo/research)
jolo research "what is an apple"
# Deep research: claude + codex in parallel, gemini synthesis
jolo research --deep "compare sqlite and postgres for local-first apps"
# Start an isolated worktree directly on any git repo
cd ~/myproject && jolo tree feature-x
# Jump into a running container (MRU-sorted fzf picker)
jolo attach
# Clean up orphaned/stopped containers and images
jolo prune
# Unified delete for worktrees and projects
jolo delete myappjolo.py # the CLI launcher _jolo/ # CLI logic package container/ # scripts baked into the image (notify, browser-check, motd) templates/ # scaffolds, skills, and agent configs for new projects docs/ # project context, TODO, conventions, research logos/ # project branding
See LICENSE.