Skip to content

A self-hosted OpenClaw alternative, in 11,478 lines of Go.

GoGogot is a self-hosted, open-source AI agent written in Go: one Docker container, a shell, a filesystem, four web tools, persistent memory and a cron scheduler, driven from your terminal, a Telegram bot you own, or any other interface you plug in. It covers a narrower job than OpenClaw does, and it covers it in 11,478 lines instead of roughly 430,000. This page is the honest version of that trade — both directions.

GoGogot's figures were counted from the repository on 2026-10-28. The OpenClaw and Nanobot figures are the author's own measurements of a local install — read them as indicative rather than like-for-like, and open a PR if yours differ.

Five measurements

GoGogot against OpenClaw and Nanobot.

GoGogot compared with OpenClaw and Nanobot across five measurements
MeasurementGoGogotGoOpenClawTypeScriptNanobotPython
Lines of codeHow long it takes to read the whole thing11.5K430K4K
DependenciesHow much of your supply chain you did not choose9800+30+
Install sizeWhat lands on the box206 MB1 GB150 MB
RAM at idleWhat it costs you to just sit there10 MB450 MB100 MB
Minimum hostWhat you have to rentanything with Linux2 GB RAM, 2 CPU512 MB RAM

Install size is what lands on the box, not what the compiler produced: GoGogot's Go binary is about 15 MB, and the published image is larger on purpose because it ships a working Ubuntu userland — python, node, ripgrep, psql, jq — so the shell tool has something to work with.

Where GoGogot loses

What OpenClaw does that GoGogot does not.

A seat beside your editor.
GoGogot has a terminal chat now as well as Telegram, but it is a chat with a container, not an agent in the repository you have open. It sees the directory you mounted and nothing else, there is no editor extension, and nothing sits beside your code while you write it. If what you want is an agent next to your editor — OpenClaw, Claude Code, or anything else that lives there — this is the wrong tool, and no table below will change that.
More than one person.
Every channel names a single owner — on Telegram, TELEGRAM_OWNER_ID — and the core drops every message from anyone else, whatever the bridge does. That is the entire auth model. It is deliberate and it is also a hard ceiling — there is no team mode, no roles and no shared workspace.
An extension ecosystem.
No registry and no marketplace, and tools are not plugins: adding one is Go code and a rebuild — cheap if you write Go, a wall if you do not. Interfaces are the exception. Each one is a plugin, a folder the agent can write for itself, but you will not find a catalogue of them to install.
Retrieval that scales.
There are no embeddings and no vector store. The recall tool hands the model up to 50 past-conversation summaries and asks which look relevant. That is enough for a personal agent and nowhere near enough for a knowledge base.
The other 418,000 lines.
A large codebase is not automatically a worse one. Those lines hold integrations, platform quirks and edge cases that 11,478 lines have simply never met. The argument on this page is that you probably do not need most of them — not that they are not there.

Where GoGogot wins

What GoGogot does that OpenClaw does not.

It runs when you are not there.
The agent writes its own cron entries, and they survive a restart. "Every Friday at 18:00, pull this week’s commits and send me a changelog" is a sentence, not a deployment. An agent that only exists while a terminal is open cannot do that.
It idles at about 10 MB of RAM.
Which is why it lives on a $4 VPS instead of on your laptop. Both linux/amd64 and linux/arm64 images are published, no GPU is involved, and the box only ever has to hold the container.
You can read all of it.
11,478 lines of Go across 82 files, 9 direct dependencies, and a control flow that fits on one screen. Before you hand something a root shell on your server, being able to finish reading it in an afternoon is a security property.
Your keys never leave your environment.
They are environment variables on your machine. There is no GoGogot account, no telemetry and nothing that phones home — and no listener, no webhook and no EXPOSE in the Dockerfile, so nothing can reach it from outside either. Every connection is outbound.
Any model, by slug.
Three environment variables and a restart move it between Anthropic, OpenAI and every model on OpenRouter — Claude, GPT, DeepSeek, Gemini, Qwen, Nemotron, Kimi. You are not waiting on anyone to add a provider.
A mobile client you did not have to build.
Telegram is a third party and your messages pass through it — that is a real cost, stated plainly. What it buys: push notifications, file transfer both ways, and an app already on your phone. And its plugin is one Python file in your data folder, standard library only, that you can read in one sitting.
Any interface is a plugin.
The terminal is built in and Telegram ships as a plugin; Discord, Slack or email is one more. A plugin is a folder in /data/skills with a channel.json and a small program the core talks to in JSON lines over stdin and stdout — the core keeps the owner check, the rendering and the commands. Ask for one and the agent writes it from the bundled add-channel skill and starts it, with no rebuild.

The short version

Which one should you run?

Use OpenClaw
when the agent’s job is next to your code — reading the repository you are in, running your test suite, editing files you are about to review in your editor.
Use GoGogot
when the agent’s job is on a server — long-running, scheduled, reachable from a phone, and cheap enough to leave running for a month without thinking about it.
Use neither
when more than one person needs access. Nothing in GoGogot models a second user, and bolting one on is not a configuration change.

Asked and answered

Questions people ask before switching.

Is GoGogot an OpenClaw alternative?
For one specific job, yes: running an agent on a server you own, reachable from your terminal, Telegram or any interface you plug in, with your API keys in your own environment. GoGogot is 11,478 lines of Go against roughly 430,000 lines of TypeScript, 9 direct dependencies against 800+, and about 10 MB of RAM at idle against roughly 450 MB. It is not a drop-in replacement — it has a console chat, but no editor integration and nothing that works inside the repository you have open.
What does self-hosted actually mean here?
The agent process, its shell, its files, its memory and its scheduler all run in a container on your machine, and everything it writes lands in a directory you mounted. What is not self-hosted is the model: prompts still go to Anthropic, OpenAI or OpenRouter over their API, and that is the one dependency you cannot remove.
What does it cost to run?
A $4/month VPS and whatever your model provider charges. A typical session — roughly 50K tokens in and 10K out — is about a cent on DeepSeek V4 Flash and stays well under a dollar on frontier models. GoGogot itself is MIT licensed, with no seats, no tiers and no account.
Which models does it work with?
Set GOGOGOT_PROVIDER to anthropic, openai or openrouter, set GOGOGOT_MODEL, and supply the matching API key. Any OpenRouter slug works, so Claude, GPT, DeepSeek, Gemini, Qwen, Nemotron and Kimi all run without a code change. Switching model is three environment variables and a restart.
Do I need a GPU?
No. The model runs on your provider’s hardware, so the host only has to hold a ~206 MB image and about 10 MB of resident memory. Images are published for linux/amd64 and linux/arm64.
Is it safe to give a language model a shell?
Not unconditionally. The bash tool runs real commands as root inside the container, and the work directory is a real directory on your host that you mounted in — Docker is the only boundary there is. Run it on a box you can afford to rebuild, and mount read-only anything you would not want rewritten.
How long does it take to set up?
To try it, one docker run -it with three values — a provider, a model and an API key — and it answers in your terminal. To leave it running on a server, add a Telegram bot token from @BotFather and your numeric Telegram user ID: five values, and it is answering you in Telegram about a minute later.
Can I talk to it somewhere other than Telegram?
Yes. The terminal is built in, Telegram ships as a plugin, and several can run at once. Any other interface — Discord, Slack, email — is a plugin: a folder in /data/skills with a channel.json and a small program the core talks to in JSON lines over stdin and stdout. You can write one, or ask the agent to connect itself and it writes one from the bundled add-channel skill and starts it without a rebuild. Its token goes in the container environment, not the chat. Only the terminal and Telegram ship; the rest you add.

Try it instead of reading about it

Run GoGogot in one container.

docker run
docker run -d --restart unless-stopped \
  --name gogogot \
  -e TELEGRAM_BOT_TOKEN=<token> \
  -e TELEGRAM_OWNER_ID=<your-id> \
  -e GOGOGOT_PROVIDER=openrouter \
  -e OPENROUTER_API_KEY=<key> \
  -e GOGOGOT_MODEL=deepseek/deepseek-v4-flash \
  -v ./data:/data \
  -v ./work:/work \
  octagonlab/gogogot:latest

Five values are yours to fill in: a Telegram bot token, your own numeric Telegram ID, a provider, a model and the matching API key. Nothing else is configuration.

No bot yet? Run it with -it and only the last three, and it opens a chat in your terminal instead.

Where each value comes from