# odoodev-equitania v0.45.0 | python/uv
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
▸ Setup:    uv venv --python 3.12 && venv+ && uv pip install -e ".[dev]"
▸ Run:      odoodev --help
▸ Test:     pytest
▸ Lint:     ruff check . && ruff format --check .
▸ Format:   ruff check --fix . && ruff format .
▸ Types:    mypy odoodev
▸ Build:    uv build
▸ Python:   3.12/3.13 (tested), >=3.12 (pyproject.toml)
▸ Mac/Apple Container: odoodev config set container_runtime apple   # persistent default; then `odoodev start 18` just works. See usage/apple-container.md
▸ Runtime:  odoodev start 18 --runtime apple     # one-off override; offers to save as default. Container: `container ls` (NOT `container machine list`)
▸ Restore:  odoodev db restore 18 -z bak.zip -n db   # ZIP/7z/tar/tar.zst/gz/SQL; DB untouched by default — --sanitize for cron+neutralize+anon+wipe
▸ Anon-User: odoodev db restore 18 ... --anonymize-users   # opt-in: res_users -> user<id>/ownerp (admin kept)
▸ Uninstall: odoodev db restore 18 ... --sanitize --uninstall-modules m1,m2 [-y]   # drop conflicting modules BEFORE sanitize; standalone: db uninstall -n db -m m1,m2
▸ Users:    odoodev db users 18 [-n db]              # TUI: p=set password t=disable 2FA d=switch-db /=search a=portal-toggle
▸ Restore+: odoodev db restore 18 ... --no-check-space --delete-backup   # disk pre-check (default on); filestore MOVED not copied; --delete/--keep-backup
▸ Neutral:  odoodev db neutralize 18 -n db           # native odoo-bin neutralize + bank-sync (--stdout dry-run)
▸ Backup:   odoodev db backup 18 -n db -t tar.zst -l 19  # sql/zip/tar.zst; -l zstd level (tar.zst); ~/Downloads/ (--output overrides)
▸ TUI:      odoodev start 18 --tui                    # b=backup d=switch-db a=update-apps k=cleanup-modules x=export-csv; y=mark mode (y enter, drag to select, y copies & exits, Esc cancels)
