The serious one, allegedly. Still a work in progress.
WeazlCode is a sovereign, local-first AI coding TUI that splits the brain to save the codebase. Big models review the plan; local models do the grindage. Stop letting expensive APIs vomit thousands of lines of messy code into your editor. WeazlCode delivers project-aware terminal sessions, explicit local tools, resumable context, and tightly bounded tasks without turning your workflow into a bloated, black-box agent carnival.
WeazlCode has moved beyond simple chat. Phase 1 through 6 of the IDE architecture are implemented, smoke-tested, and live:
- Project-Aware Metal: Git root detection, local
.weazlcode/state, project summaries, and isolated tool logs. - The Grindage Loop: Bounded task packets, structured
WorkerPatchoutput, unified diffs, path validation, and capped repair loops. - Split Roles: Orchestrator, worker, reviewer, and summarizer roles with runtime-configured providers.
- Hardened Execution: Separate read-only vs. verification command execution. Bounded-path guardrails keep the worker from wandering outside the sandbox.
- LSP Foundation: Go-first language server support with diagnostics, symbols, and definitions fed directly into task packets.
- Async TUI: Command palettes, diff views, and diagnostics. Async plan/worker/reviewer spinners keep the IDE view alive while long-running models grind in the background.
- Skills Surface: Project and global
SKILL.mddiscovery,/skillsinspection, planner skill selection, and explicit task-level skill attachment. - Parallel Workers:
workers.concurrency, taskdepends_on,/run-workers, non-overlapping path scheduling, per-task worker cancellation, and configurable worker request timeouts. - Review Loops: Claude/OpenAI-class reviewers can inspect task-scoped evidence, request focused repairs, and send only bounded repair packets back to the local worker.
- Replan And Cleanup: Rejected or blocked worker outputs are restored to their task baselines, and
/plan replancan turn completed work, blocked evidence, and remaining tasks into a fresh draft plan. - Hooks: Optional
before_tool,after_tool, andtask_donecommands receive structured JSON on stdin and log results under.weazlcode/logs/hooks.jsonl. - Notifications: Optional terminal-bell notifications for task completion, blocked tasks, worker blockers, and repair requests.
- External Editor:
/edit <path> [line]opens project files through a configured editor command while keeping paths scoped to the project root. - Debug Adapter Foundation:
/debuginspects configured adapters, and/debug launch <name>runs a bounded DAP launch handshake with logs in/outputs.
On first launch, WeazlCode drops a fresh config.json into ~/.config/weazlcode/ with sensible local defaults:
local-vllm:http://localhost:8000- model:
local-model local-ollama:http://localhost:11434workers.concurrency:2workers.request_timeout_seconds:300
Because hardcoding endpoints into a coding tool is how tiny annoyances become permanent roommates, WeazlCode reads your endpoints and models from the config at runtime.
WeazlCode also infers a worker capacity profile from the configured worker model name. A model like granite-8b, llama3.1:8b, or any other 8b-style name automatically nudges the planner toward tiny, narrow, 8B-friendly task packets without making you repeat that constraint in every prompt.
go run ./cmd/weazlcode./scripts/install.shNo wizards. No corporate installers. The script handles the chores: it builds weazlcode, tucks it into ~/.weazlcode/bin, and adds that directory to your shell PATH.
During setup, you configure the local worker first, usually Ollama or vLLM. The script queries the provider for available models, then asks for an optional heavyweight LLM provider for planning and review. If you choose none, WeazlCode falls back to your local model for planning and will warn you that the orchestration might be a bit raw.
Provider URL rules: bare-metal base URLs only.
- vLLM:
https://host:portorhttps://host, without/v1 - Ollama:
http://host:11434, without/api - OpenAI-compatible:
https://host, without/v1
If you accidentally paste the /v1 or /api suffixes, the installer quietly sanitizes them for you.
The installer will also ask for a context window preset, from 8192 up to 128000 tokens. Heads up: the XL preset may cause out-of-memory panics on smaller local servers. Finally, you'll set a local history password. Session history and workspace saves are locked in SQLite with a password-protected vault and AES-GCM encrypted payloads.
WeazlCode is pure Go, but it uses SQLite through go-sqlite3. Builds require Go 1.25 or newer, CGO, and a working C compiler. It's built for solid, reliable standards-based systems like Ubuntu LTS. That C compiler requirement is the one little bit of yak hair you have to shave.
xcode-select --install
go build -o weazlcode ./cmd/weazlcodeInstall Go for Windows, then use MSYS2 to install a C compiler.
pacman -S --needed mingw-w64-ucrt-x86_64-gccThen build:
go build -o weazlcode.exe ./cmd/weazlcodeInitialize project instructions from your repo root to drop the primary WEAZLCODE.md instruction file:
weazlcode initSlash commands drive the IDE. Hit / to open the palette.
- Workflow:
/plan draft,/plan generate,/plan replan,/run-task,/run-worker,/run-workers,/run-reviewer,/commit-message,/export-run. - Views:
/diff,/outputs,/files,/preview,/edit,/debug,/skills,/diagnostics,/symbols. - Control:
ctrl+ttrims context,ctrl+unukes active session context,ctrl+ssaves workspace, andctrl+r/ctrl+wopens the workspace picker. - Mouse/Copy:
ctrl+mtoggles between terminal copy mode and TUI mouse-scroll mode.
The status line gives you the vitals on your local inference: estimated context usage, token counts, and generation speed (t/s).
Running out of room? Press ctrl+t. WeazlCode commands the active model to summarize the current conversation into a compact checkpoint. Future requests send that tight summary plus only the new messages, saving your hardware from replaying the entire session from the top.
If you forget to trim, WeazlCode steps in with opinionated working-context thresholds. Small windows run close to the edge; large windows compact much earlier so your 128k context stays as useful headroom instead of degrading into a giant prompt tax.
The happy path is simple: the orchestrator creates small tasks, local workers write patches, and the reviewer approves the task-scoped diff. When the worker gets it wrong, WeazlCode keeps the blast radius tight:
- Reviewer
needs_fixverdicts restore the task's allowed paths to the captured baseline before sending a focused repair packet back to the worker. - Worker blockers and reviewer-blocked tasks also restore their allowed paths, so rejected files do not linger as half-truths in your repo.
- Every cleanup is recorded as an
output_cleanuptask event. /plan replan [guidance]asks the orchestrator to build a fresh draft plan from completed tasks, blocked-task evidence, and still-pending work.
That is the split-brain bargain: local models can try, fail, and retry cheaply, while the frontier model spends tokens on judgment and plan correction instead of writing every line itself.
While the models grind, WeazlCode uses Bubble spinner animations with rotating status phrases like hacking_the_gibson, wheezing_the_juice, and chilling_the_tokens to keep the screen alive.
Tool calls stay neatly tucked away as using tools in the transcript. WeazlCode keeps the raw JSON bookkeeping in the encrypted history so the model maintains state, but hides the ugly scaffolding from your view. Assistant responses are rendered cleanly with Glamour-powered Markdown once they land.
WeazlCode is not a static chat window. It supports native function calling to interact with your local workspace. Important: you need a model with native tool support, such as Llama 3.1 or Mistral-Nemo, for the fun stuff.
Configure tools in ~/.config/weazlcode/config.json:
- Workspace Tools: Operates strictly under configured
workspace_roots. Includesread_file,git_diff,apply_patch, and local SQLite querying. - Execution Tools:
run_readonly_commandexecutes a tight allowlist of inspection commands likerg,cat, andls.run_verification_commandruns approved linters/tests and requires explicit prompt-level approval. - Memory: Encrypted local memory storage with remember/recall support.
Hooks are disabled by default. When enabled, each configured command receives a JSON event payload on stdin and runs from the project root with a short timeout. Configure them in ~/.config/weazlcode/config.json:
{
"hooks": {
"enabled": true,
"timeout_seconds": 10,
"events": {
"task_done": [
{
"command": "notify-send",
"args": ["WeazlCode", "Task completed"]
}
]
}
}
}Supported events: before_tool, after_tool, and task_done. Hook results are visible in /outputs.
Native notifications are intentionally boring and local: disabled by default, terminal bell when enabled. For desktop notifications, use hooks with a command like notify-send.
{
"notifications": {
"enabled": true,
"bell": true,
"events": ["task_done", "task_blocked", "repair_requested", "worker_blocker"]
}
}Configure an editor command if you want WeazlCode to hand off a file without leaving the TUI workflow:
{
"editor": {
"command": "code",
"args": ["--goto", "{file}:{line}"],
"wait": false
}
}Use /edit README.md 42 to open a file. {file} and {line} are replaced in configured args. If no args are configured, WeazlCode uses +line file, which works for many terminal editors. If no command is configured, it falls back to VISUAL and then EDITOR.
Debugger support is intentionally a foundation right now, not a full interactive debugger UI. Configure adapters and launch configurations, then use /debug to inspect them or /debug launch <name> to run a bounded launch handshake:
{
"debug": {
"timeout_seconds": 30,
"adapters": {
"go": {
"command": "dlv",
"args": ["dap"]
}
},
"configurations": [
{
"name": "app",
"type": "go",
"request": "launch",
"program": "cmd/weazlcode/main.go",
"cwd": "."
}
]
}
}The command runs locally, sends a DAP-framed launch request on stdin, captures output, enforces project-root path validation for program and cwd, and records results in .weazlcode/logs/debug.jsonl.
We take data sovereignty seriously, but this is a TUI app, not a hardware security boundary. The bcrypt checks and AES-GCM payloads exist to lock out casual snooping. They are not a guarantee that a weak password will survive a dedicated offline attack against your database.
- Safe tools are strictly read-only or create-only.
create_filewill flat-out refuse to overwrite existing files.- Shell commands are allowlisted and pass safely as args, never as raw shell strings.
- Tool execution happens locally inside the WeazlCode process. API keys live in your config and never leave your machine.
WeazlCode is released under the MIT License. Fork it, learn from it, ship it.
The WeazlCode name, screenshot, and cyborg-ferret branding are part of this project's identity. If you publish a heavily modified fork, strip the branding and rename it so users know who is actually maintaining the code.
