Krohnos
Português

Multi-agent AI. Local control.

Krohnos is a self-hosted multi-agent AI orchestrator that connects projects, SEO and knowledge to deliver reviewed, verified results, managed through WhatsApp or its panel.

Install How it works
bash
git clone https://github.com/BRK13/krohnos.git krohnos && cd krohnos
docker compose build painel
docker compose run --rm --no-deps --entrypoint krohnos painel init
docker compose up -d
curl -fsS http://127.0.0.1:8787/saude

From direction to delivery

  1. Request
  2. Orchestrator
  3. Parallel agents
  4. Review + checks
  5. Live, with evidence

Claude Code + Codex · WhatsApp + panel

Close

What is inside

Orchestration and parallel execution The orchestrator plans and dispatches tasks through a Linear queue. Claude Code and Codex accounts work in building, operating and reviewing lanes, with automatic handover to another available account when a quota is exhausted. Parallel execution reduces waiting time between requests.

Review and the Done gate Review by another model, such as Codex, is part of the CI, merge and deployment workflow. The Done gate requires evidence of integration, publication and passing checks and reopens tasks closed without delivery. Each completion represents a verifiable result.

Second brain and recipe library The knowledge graph, compiled wiki and visual map preserve decisions and connect lessons. The library injects relevant recipes into task dispatch to reduce repeated work and maintain continuity across projects.

Multi-project management One panel brings sites and businesses together, with BI per project and integrations for Google Search Console, GA4, Clarity, Meta and CRM. Each integration follows the configuration of the business, providing a consolidated view for decisions.

SEO and field performance SEOmator auditing provides weekly coverage per section, while Clarity and RUM track real browsing experience. The system monitors rankings and visibility across ChatGPT, Claude, Gemini and Perplexity and routes eligible findings to automatic fixes with review and verification.

Monitoring and operational efficiency Watchers and the debugger identify failures and route repairs. Model selection considers the task, and CI, review and deployment waits can resume without another AI call, reducing operational consumption.

How the orchestrator works

The path of a task Each step below is a module of the repository, with its real file name. Whoever writes a change does not review it, and nothing stays Done without a receipt. The plain-text summary is in docs/ARQUITETURA.md.

Request: WhatsApp, panel or Linear

Everything becomes an issue in Linear. From the panel, the action writes the request into the command inbox the WhatsApp bot also reads; in Linear, a webhook tells the hub when someone speaks on the issue.

  1. WhatsApp
  2. Panel
  3. Linear
  4. issue

View the code: hub/linear.py hub/acoes.py deploy/linear-webhook.py

Plan

The agent starts by commenting a short plan on the issue. Plan items carry a check command (check:) that code runs, and anything that leaves for a third party (email, post, money) becomes a proposal only the owner can approve.

  1. request
  2. short plan
  3. items with a check
  4. proposal, if it leaves the house

View the code: hub/plano_itens.py hub/propostas.py hub/tarefas.py

Issue in the queue, tick per account

A cron every 5 minutes (tick) reads the scheduled tasks, enqueues what is due and starts at most one item per free account, by priority and arrival. Two accounts never take the same item or enter the same repository.

  1. tarefas/*.md
  2. queue
  3. 5-minute tick
  4. free account

View the code: hub/agenda.py deploy/agenda.py

Accounts and lanes

Each agent account has its own login, a lock (one job at a time), a pause when the usage limit is reached and a usage log. The lane says what it takes: construtor (builder: tracker requests), operador (operator: scheduled routines), revisor (reviewer) and codex (requests labelled for Codex). When one account's quota runs out, the work goes to another.

  1. construtor
  2. operador
  3. revisor
  4. codex

View the code: hub/conta.py hub/roteamento.py hub/esteira.py

Execution in its own worktree

Every task runs in a git worktree of its own, never in the base clone. A global memory budget limits how many sessions open at once, because several builds together have taken a server down.

  1. base clone
  2. task worktree
  3. commits
  4. own branch

View the code: hub/linear.py hub/memoria.py hub/repos.py

Pull request and review by another model

The pull request is reviewed by a different model from the one that wrote it: Codex reviews what Claude did, and Claude reviews the codex/ branches. The review comments findings on the tip commit; a serious finding goes back to the author, who fixes it and pushes again. The Codex-side script is not in the public repository yet.

  1. PR
  2. Codex review
  3. findings
  4. fix
  5. new review

View the code: hub/revisor_merge.py hub/revisar_codex.py

Local CI and merge

Tests run on a machine of your own, not in a hosted CI; a red main becomes an incident. The merge is mechanical, with no model in the middle: issue marked for merge, pull request open, CI green and the tip commit's review without a serious finding.

  1. local CI
  2. review without serious finding
  3. mechanical merge

View the code: scripts/checar.sh hub/main_vermelho.py hub/automerge.py

Waiting outside the session

The agent never polls CI or a deploy: it records the wait and ends the session, and the hub wakes it when the status changes. Stuck work has an alarm and a time and attempt budget, and a cap on runs per task pauses the loop.

  1. records the wait
  2. ends the session
  3. status changes
  4. hub wakes the task

View the code: hub/esperas.py hub/retomada.py hub/parada.py

Deploy and watchdog

After the merge, the watchdog checks each app's latest deploy. A deploy stuck past its limit is cancelled and redone once; a deploy with an error is redone once; if the second one fails, it opens an issue in the repository with the end of the log.

  1. merge
  2. deploy
  3. watchdog
  4. redo once
  5. issue with the log

View the code: hub/vigia_deploy.py

Done gate with a receipt

An issue stays Done only if every cited pull request is merged and live (the commit in production is checked), what the acceptance asked for exists (attachment, video, PDF, notice), the URLs open and the last comment leaves no open item ("Missing", "I will be back") without pointing to another issue. If something is missing, the issue goes back to In Progress with the reason, or becomes "Stuck: needs the owner" if it depends on them. The audit that created the gate found 873 Done issues, 9 with an open pull request, 7 with only closed ones and 187 with a pending note in the last comment.

  1. Done
  2. receipt checks
  3. passed: stays Done
  4. missing: reopens with the reason

View the code: hub/recibo.py hub/portao_done.py hub/portao.py

Watchdog and debugger

Every failure becomes an incident with the failure class and the part of the harness that changes, and goes into the repair log. The debugger tracks failures per repository, opens one pull request per error class and marks red as resolved only when the source confirms it.

  1. failure
  2. incident
  3. debugger
  4. fix PR
  5. log

View the code: hub/debugger.py hub/incidentes.py hub/consertos.py

Recipe library and "does this already exist"

Before dispatching, the hub looks for recipes similar to the task using BM25 (exact words) and embeddings (meaning), merges the lists with RRF and pastes up to three into the prompt. A pull request that used a recipe cites the file in its body, and the hub counts the use. The same hybrid search covers memories, plans, issues and recipes in the second brain.

  1. task
  2. BM25 + vector
  3. up to 3 recipes in the prompt
  4. PR cites the recipe
  5. use counted

View the code: hub/biblioteca_indice.py hub/biblioteca_uso.py hub/grafo.py

Memory

The owner's decisions live in memory files, one note per fact, with one index per project. A gate checks that no pointer broke and no decision of the owner disappeared, and the second-brain map shows the relations between repositories, domains, routines and decisions.

  1. decision
  2. memory note
  3. index
  4. gate checks
  5. map

View the code: hub/memorias.py hub/cerebro.py hub/grafo.py

SEO with real data and cost

Where each number comes from Krohnos has no search index of its own. It combines sources the site owner can already use, pays per use where it needs market data, and keeps everything in a per-site store.

SEO data sources
SourceWhat it providesCostCode
DataForSEOGoogle SERP, keyword volume, keywords a site ranks for, search competitors, backlinks, and answers from ChatGPT, Gemini, Claude, Perplexity and Google AI OverviewPay per use, no subscription; default daily cap of US$ 2hub/dataforseo.py, hub/ranking.py, hub/mcp_grupos/backlinks.py, hub/mcp_grupos/visibilidade_ia.py
Google Search ConsoleClicks, impressions, query and page of your own siteFreehub/google.py, gsc_oportunidades.py
GA4Visits, source, pages and events of your own siteFreehub/bi_ingest.py, hub/bi_historico.py
ClarityReal recordings, clicks and scrollFree, no traffic limithub/bi_ingest.py
PageSpeedMobile LCP and TBT of the home page and the 3 most viewed pagesGoogle Cloud API keyhub/velocidade.py
SEOmatorTechnical audit (373 rules) running on your own machineMIT package, no usage costhub/seomator.py, deploy/seomator/lote.mjs

Weekly audit

Every night SEOmator audits one site at a time, in batches of about 60 pages taken from the sitemap. Large sites get a slice of each section at a time, so every section is covered at least once a week, and a summary with the score and worst failures goes out per site.

  1. sitemap
  2. batch of 60 pages
  3. score per site
  4. weekly summary

View the code: hub/seomator.py deploy/seomator/lote.mjs

Opportunities

Search Console shows what Google already sees: a gap is a query with 50 impressions or more, position worse than 10, zero clicks and no page on the site for it; a leak is a first-page result nobody clicks. The ranking measured every week on DataForSEO shows whether the position moved.

  1. Search Console
  2. gap or leak
  3. weekly ranking
  4. opportunity issue

View the code: gsc_oportunidades.py hub/ranking.py hub/impacto.py

AI visibility

The tracker sends prompts from your market to the AI engines through DataForSEO and separates a mention (the name in the answer) from a citation (a page of the site among the sources). The cost estimate appears before the run: in the code, US$ 0.004 per ChatGPT, Gemini or Google AI Overview answer, US$ 0.04 on Perplexity and US$ 0.18 on Claude.

  1. market prompts
  2. 5 AI engines
  3. mention vs citation
  4. cost estimated first

View the code: hub/mcp_grupos/visibilidade_ia.py hub/mcp_grupos/visibilidade_ia_rodada.py hub/citacao.py

Automatic fixes, with review

An audit failure that the project's rule allows fixing becomes an issue, enters the pipeline and follows the same path as any task: pull request, review by another model, CI, merge, deploy and receipt. Then the impact is measured: clicks and impressions 14 days before against 14 days after.

  1. eligible failure
  2. issue in the pipeline
  3. PR + review
  4. deploy
  5. impact at 14 days

View the code: hub/esteira.py hub/impacto.py hub/acoes.py

Compared with Semrush and Ahrefs

Features and cost, not quality Prices and limits were read from the official pages on 2026-10-20, in US dollars, and change without notice: check the link before deciding. Semrush shows the monthly equivalent of the annual plan and the monthly-billing price; the table shows both.

What you pay and what you get
ToolWhat you pay per monthWhat you get (limits from the page itself)
SemrushSEO: US$ 139 (US$ 117.33 billed annually). Starter: US$ 199 (US$ 165.17). Pro+: US$ 299 (US$ 248.17). Advanced: on request. Extra user from US$ 45SEO: 5 websites and 500 keywords a day. Starter: the same plus 50 AI prompts a day. Pro+: 15 websites, 1,500 keywords, 100 AI prompts
AhrefsLite: US$ 129. Standard: US$ 249. Advanced: US$ 449. Enterprise: US$ 1,499 (annual contract). Extra user: US$ 40, 60 or 80 depending on the planLite: 5 non-verified projects, 750 tracked keywords, 6 months of history. Standard: 20 projects, 2,000 keywords, 2 years. Advanced: 50 projects, 5,000 keywords, 5 years. Enterprise: unlimited history
SimilarwebDoes not publish prices: packages through sales100+ countries, daily data, up to 37 additional months of history
DataForSEONo subscription; US$ 50 minimum credit deposit. Google SERP: US$ 0.0006 (standard queue), US$ 0.0012 (priority) or US$ 0.002 (live) per 10-result SERPData through an API, no interface: keywords, SERP, backlinks (US$ 0.024 per request plus US$ 0.000036 per row), page audit (from US$ 0.00015 per page)

What they do and Krohnos does not Krohnos does not crawl the web and has no backlink index of its own: it queries DataForSEO's. It does not estimate traffic of third-party sites, only measures yours through Search Console and GA4. Its history starts at installation, while Ahrefs states 6 months, 2 years or 5 years of history depending on the plan. It also has no ready-made keyword research interface: research runs through the API and the agent.

What Krohnos does and these tools do not advertise It is not only SEO: it creates the issue, writes the fix, sends it through review by another model, deploys and checks the receipt. The data stays on your server, and the code is AGPL-3.0, open to audit.

Typical Krohnos cost
ItemWhat it costs (source and date: 2026-10-20)
ServerFrom € 5.99 a month, excluding VAT, at Hetzner Cloud. It needs 2 GB of free RAM: check the plan's RAM on the page first
DataForSEOPer use. Example calculation, not a measurement: 100 keywords checked per week on the standard queue are 400 SERPs a month, 400 × US$ 0.0006 = US$ 0.24. Krohnos' default daily cap is US$ 2 (hub/dataforseo.py), at most US$ 60 in 30 days
Agent subscriptionClaude Pro: US$ 20 a month (US$ 17 billed annually), Max from US$ 100. ChatGPT Plus with Codex: US$ 20. The plan's usage limit sets how much work fits
LinearFree: US$ 0, up to 250 issues and 2 teams. Basic: US$ 10 per user per month billed yearly
Google, Clarity and SEOmatorSearch Console and Analytics: free. Clarity: free, no traffic limit. SEOmator: MIT package

In practice Two US$ 20 agent subscriptions, a small server and cents of DataForSEO per site come in under Ahrefs' cheapest plan (US$ 129) and Semrush's SEO plan (US$ 139), but they deliver different things: there you buy data and reports, here you run the delivery. The author's own operation uses Max accounts, with a larger usage limit.

What you need to have

Accounts and monthly cost Sources and date are in the cost table above (2026-10-20). Krohnos itself is free (AGPL-3.0); what you pay for are the services it uses.

Required accounts
AccountWhat forCost per monthRequired?
Claude Code or CodexThe agents that write and reviewUS$ 20 (Claude Pro or ChatGPT Plus); Max or Pro from US$ 100At least one. Two, from different companies, for cross review
LinearThe issue queue and the agent panelUS$ 0 on Free (250 issues, 2 teams); Basic US$ 10 per userOptional: Linear at US$ 0 is enough to start; a built-in queue that drops the need for Linear is on the way
ServerRuns the panel, the queue and the servicesFrom € 5.99 excluding VATYes, it can be your own PC
DataForSEOSERP, keywords, backlinks, AI visibilityPer use, US$ 50 minimum depositOptional: without it, ranking, backlinks and AI are off
Google (Search Console, GA4, PageSpeed)Clicks, visits and speed of your siteSearch Console and GA4 are freeOptional
ClaritySession recordings and scrollFreeOptional

Production operations

Six businesses in operation Krohnos has operated six businesses for at least one week, with execution history since October 8, 2026 and a project registry verified on October 17, 2026.

1,038 successful executions On October 16, 2026, the usage log recorded 1,038 agent and routine executions completed successfully without interruption. Measurement source and methodology.

Two measured days On 2026-10-15 the usage log has 1,342 runs, 1,316 completed successfully and without interruption; on 2026-10-16, 1,043 and 1,038. They count agents and routines, including resumptions, and are not the same as Done issues. The logs are private. Methodology.

Install

Requirements Linux with Docker 24+ and Docker Compose v2, 2 GB of free RAM and about 4 GB of disk. Secrets live in Docker volumes, never in the image.

bash
# 1. Get the code
git clone https://github.com/BRK13/krohnos.git krohnos && cd krohnos
# 2. Build the image (one image serves the 4 services)
docker compose build painel
# 3. Configure: creates krohnos.toml, the master key, the vault and your owner user
docker compose run --rm --no-deps --entrypoint krohnos painel init
# 4. Start the 4 services (panel, scheduler, webhook, MCP)
docker compose up -d
# 5. Check: it should answer ok
curl -fsS http://127.0.0.1:8787/saude

Then open the panel, sign in with the owner e-mail and password, and follow the setup assistant in the panel. Full guide: docs/INSTALAR.md.

Requirements

Server A Linux machine (VPS or PC) with Docker 24+ and the Docker Compose v2 plugin, 2 GB of free RAM and about 4 GB of disk. A domain pointed at the server is optional, only needed to open the panel over the internet with TLS.

Check Both commands must answer with a version. Secrets never enter the image: they live in Docker volumes.

bash
docker --version
docker compose version

Configuration

krohnos.toml krohnos init creates it in the config volume (/etc/krohnos/krohnos.toml inside the containers). Any key can be overridden by KROHNOS_<SECTION>_<KEY>. Ports, for example, change like this:

bash
KROHNOS_PAINEL_PORTA=9000 docker compose up -d
toml
[painel]
dominio = "krohnos.example.test"
porta = 8787

[agentes]
contas = ["1", "2"]

Secrets Passwords, tokens and API keys never go in krohnos.toml: a key with those names is refused. They live in the vault (cofre volume). The owner password is generated once by init, or read from an environment variable, never from the command line:

bash
docker compose run --rm --no-deps --entrypoint krohnos painel init --dono-senha-env NAME_OF_VARIABLE

Connect agent accounts

One login per account Each agent account (Claude Code, Codex) has its own login, kept in the home volume so it survives recreating containers. List the accounts under [agentes] in krohnos.toml, then sign in to each one once. Replace N with the account number.

bash
docker compose exec painel sh -c 'CLAUDE_CONFIG_DIR="$HOME/.claude-N" claude login'

The panel also does this on the Agents screen. An account without a login stays idle until you sign in.

Update

Pull, rebuild, restart Data, vault and logins live in volumes, so an update keeps them. Check the release notes first.

bash
git pull
docker compose build painel
docker compose up -d
curl -fsS http://127.0.0.1:8787/saude

Uninstall

Stop This stops the four services and keeps your data, vault and logins.

bash
docker compose down

Remove everything This also deletes the volumes: data, vault, master key and panel logins. There is no undo. Back up the master key first.

bash
docker compose down -v