`dothething`: The Shell Script That Hides a Full AI Agent Stack

A local-first autonomous agent that bootstraps its own runtime, browser tooling, and multi-model council from one entry point.

9 min read • View on GitHub • More from fluffypony

A large rolled-up shell script sits on a white desk like a blueprint. Tiny mechanical subsystems emerge from it: a browser window, a file cabinet, a model council table, and a looping update arrow that feeds back into the script. The image explains the project’s central trick: one public entry point conceals a much larger local agent system underneath.
One file on the outside, an entire execution stack on the inside.
Key Takeaways

`dothething` is built on a simple bet: the best way to ship an agent is to make it feel small, even when the machinery beneath it is anything but. The repo presents itself as a shell script, but that wrapper is really a front door to a local runtime, a browser stack, a model router, and a persistence layer.

Why the one-script form matters

The distribution model is the first design decision worth noticing. A single entry point lowers the barrier to entry, but it also hides a lot of operational work: version sync, dependency setup, environment isolation, and state management in `~/.dtt/`.

DimensiondothethingAutoGPT / BabyAGIHosted agent platformFramework-first stack
Entry formOne shell scriptPython app or loopWeb app or hosted consoleLibrary and SDK
Runtime locationLocal machineUsually local or mixedProvider-controlledDeveloper-chosen
State ownershipUser-owned files and threadsOften local but ad hocVendor-owned or vendor-managedDepends on implementation
Browser strategyHardened browser stack with anti-fingerprintingOften standard automation toolsUsually abstracted awayLeft to the builder
Model routingPrimary, summarizer, oracleTypically single-model or simple fallbackPlatform decidesBuilder wires it up
Long-task handlingResume, summarize, and re-inject contextVaries widelyPlatform-specificFramework-specific
Best fitPrivate, durable, local workflowsExperiments and demosManaged deploymentComposable app development

It handles research, data extraction, browser automation, file editing, and code execution.

Project README, Repository documentation · fluffypony/dothething README

Inside dtt.sh

The heart of the repo is `dtt.sh`, a polyglot bootstrapper that does more than launch code. It checks versions, updates itself, prepares a Python environment, and then hands off to embedded agent logic that can select from a large tool set.

A governed loop, not a blind loop. The summarizer keeps the primary context usable, and the oracle only enters when the system gets stuck.

# Simplified shape of the bootstrap pattern
if [ ! -d "$DTT_VENV" ]; then
  python3 -m venv "$DTT_VENV"
fi

source "$DTT_VENV/bin/activate"
python3 -m pip install -r requirements.txt

check_for_update
maybe_self_replace
run_agent "$@"

That is the operational trade-off in miniature. The script is not trying to be elegant in a software-architecture sense. It is trying to be installable, recoverable, and hard to break.

A close-up council chamber shows three chairs arranged with hierarchy. The central chair is large and direct, the summarizer chair is smaller and angled nearby, and the oracle chair sits farther back behind a glass partition. Notes flow from tool outputs into the summarizer and then back into the primary seat, while the oracle lane lights up only when the system stalls. The image explains how the repo separates reasoning, compression, and second opinions.
The model hierarchy is the real architecture. It is less a single brain than a staffed room with different jobs.

The model council

The most distinctive idea in `dothething` is not that it uses multiple models. It is that each model has a specific role in keeping the agent sane over time.

RoleModelJob
PrimaryClaude Opus 4.6Make decisions and drive the task forward.
SummarizerClaude Sonnet 4.6Compress tool output before it pollutes the main context.
OracleGPT-5.4 or GPT-5.4-proProvide a second opinion when the system is stuck or uncertain.

That structure is a practical answer to three problems that kill long-running agents: reasoning quality, context growth, and fallback reliability. Instead of letting every tool result pile up in the main prompt, `dothething` filters the noise before it can crowd out the signal.

Ctrl-Q queues input for after the current step finishes Farms out grunt work to a cheaper model.

Project README, Repository documentation · fluffypony/dothething README

How it avoids drowning in context

This is where the project stops being a novelty and starts looking like infrastructure. Long agent runs do not fail because they cannot think once. They fail because they accumulate too much raw material, then lose the thread.

`result_mode` is the answer to that problem. Tool output can be summarized by a smaller model and re-injected as a compact state object, which keeps the primary model working with distilled evidence instead of a landfill of logs, pages, and traces.

if result_mode:
    raw = run_tool_call()
    summary = summarize_with_sonnet(raw)
    context.append(summary)
else:
    context.append(run_tool_call())

That pattern is easy to miss, but it is the difference between an agent that feels decisive and one that slowly becomes incoherent.

Browsing like it has something to hide

The browser layer is not treated as a commodity. With Camoufox, Notte, and SearXNG in the stack, the repo acknowledges that real web automation means dealing with bot detection, fragile sites, and hostile interfaces.

Browser approachStrengthWeakness
Standard automationSimple and familiarEasy to fingerprint and block
Hardened browser stackBetter at navigating real sitesMore moving parts
Hosted browsingManaged by a vendorLess control over identity and state

That is another clue about the project’s philosophy. It is not trying to make the web friendly for agents. It is trying to make the agent resilient enough to operate inside the web as it exists.

Why this feels anti-SaaS

Taken together, the design choices point in a clear direction. The files live on your machine. The runtime persists under your control. The script updates itself, but it does so against a public version source rather than a hosted console that owns the workflow.

That makes `dothething` feel politically different from hosted agent products. It is less about platform gravity and more about user-owned execution, which matters when the task involves private files, browser sessions, and long-lived state.

What the pattern suggests

The lesson here is broader than one repo. If autonomous agents are going to move past demos, they need distribution that is easy to start, state that is durable, browser automation that can survive real sites, and model routing that treats uncertainty as a first-class event.

`dothething` is interesting because it compresses those requirements into a form that looks almost too small to matter. That is the point. The smallest public surface can still hide a very serious machine.