6 min read

AstrBot: Self-Hosted AI Chatbot for Telegram, Discord, Slack and More (GitHub, Scanned)

A self-hosted AI agent that answers in Telegram, Discord, Slack, QQ, Feishu and other chat apps.

AstrBot logo
✅
Scan: safe. Nothing malicious. Two things to know: anonymous usage statistics are on by default, and community plugins are third-party code that runs with the bot's access. Scanned Oct 26, 2026; the full report is below.

AstrBot connects an AI agent to the chat apps people already use. One instance can answer in Telegram, Discord, Slack, LINE, Mattermost, Misskey, KOOK, QQ, WeChat Work, WeChat Official Accounts, Feishu and DingTalk, with Matrix and others through community adapters. Behind it you choose the model: OpenAI, Anthropic, Gemini, DeepSeek and other APIs, local models through Ollama or LM Studio, or agent platforms such as Dify and Coze.

It goes well beyond a chat relay: personas, a knowledge base, MCP tools and skills, automatic context compression, speech-to-text and text-to-speech, a web dashboard for configuration, a web chat interface, and a sandbox for running the agent's code and shell commands in isolation. A plugin market lists more than 1,000 community plugins that install from the dashboard.

It is AGPL-3.0, with about 43,700 stars, 381 contributors and frequent releases, at v4.29.3 when scanned. Much of its community and documentation is Chinese-first, and the README is available in several languages.

  • Repository: github.com/AstrBotDevs/AstrBot
  • Licence: AGPL-3.0 (GNU Affero General Public License v3.0)
  • Language: Python. Stars: 43.7K. Forks: 3,202. Last push: Oct 25, 2026.
  • Scan: safe, Oct 26, 2026, commit 832fc6d

Who it is for

People who want an AI assistant inside their group chats or community servers, and developers building a bot for a team or customers on Telegram, Discord, Slack or the Chinese messaging platforms.

Getting started

1. Install with uv

uv tool install astrbot --python 3.12

2. Initialise on first run

astrbot init

3. Start the bot and its dashboard

astrbot run

The dashboard opens on port 6185; sign in with the username and random password printed in the startup log, then change them. Docker, a desktop app and several server panels are documented on docs.astrbot.app. To turn off usage statistics, set ASTRBOT_DISABLE_METRICS=1 or use the dashboard setting.

Safety scan

We cloned AstrBotDevs/AstrBot at commit 832fc6d on Oct 26, 2026 and ran the checks described on the GitHub Tools page: credential patterns, decode-and-execute code, install-time scripts, committed binaries, risky CI workflows, every host the code talks to, known vulnerabilities in pinned dependencies, and project hygiene. A person read every hit. This is what we found.

  • The 6 secret hits are fake keys in tests for its log redaction and dashboard (tests/unit/test_diagnostic_redaction.py and tests/test_fastapi_v1_dashboard.py). No real credentials.
  • Pattern hits: the exfil-host flags on api.telegram.org are the Telegram adapter talking to Telegram's own bot API; the Dockerfile installs Node.js with NodeSource's curl | bash; one generated dashboard API file has a 23,162-character line.
  • Usage statistics are on by default: counts of messages and model calls, adapter and model names, OS, Python version, an installation ID and the machine's hostname, sent to tickstats.soulter.top. Section 8 of the EULA discloses this, and ASTRBOT_DISABLE_METRICS=1 or the 'Disable Anonymous Usage Statistics' setting turns it off. Updates, the plugin list and the default text-to-image service also use the developer's soulter.top servers.
  • Plugins from the market are community Python code that runs inside AstrBot with access to its configuration and chats; install only ones you have reason to trust.
  • 187 known advisories (4 critical, 84 high), almost all in dashboard/pnpm-lock.yaml (171), the web dashboard's dependencies such as axios, Vue and handlebars, some of which end up in the dashboard you open in a browser, and docs/pnpm-lock.yaml (24), the documentation site.
  • 12 workflows, none using pull_request_target; none of the 17 third-party actions is pinned. The install.sh and install.ps1 scripts (about 450 lines each, no sudo) add uv to your PATH through your shell profile. CodeQL and Dependabot on; no security policy.

What the scanner counted

CheckResult
Secrets6 candidates found and read; see the notes above.
Suspicious code8 pattern hits found and read; every one is listed under the raw findings.
Install-time code4 installer scripts (one edits your shell profile; one can call sudo)
Committed binariesNone.
CI workflows12 workflows. None use pull_request_target. 17 of 17 third-party actions pinned to a tag rather than a commit.
Network hosts40 distinct hosts referenced from source; most often github.com, docs.astrbot.app, cdn.jsdelivr.net, api.telegram.org. 3 URLs to a bare IP address, listed under the raw findings.
Known vulnerabilities187 advisories across 867 pinned packages: 4 critical, 84 high, 81 moderate, 18 low. dashboard/pnpm-lock.yaml: 742 packages, 171 advisories; docs/pnpm-lock.yaml: 167 packages, 24 advisories; requirements.txt: 2 packages, 0 advisories.
Project hygieneHas automated dependency updates, CodeQL, licence file, contributing guide. Missing security policy.
OpenSSF ScorecardNot scored: the project is not in Scorecard's weekly index.

The raw findings

Every hit the scanner wrote out, with a link to the exact line at the scanned commit. Secrets candidates are redacted.

Secret candidates (6, redacted)
WhereRuleMatch
tests/test_fastapi_v1_dashboard.py:4821private-key-----B…--- (27 chars)
tests/unit/test_diagnostic_redaction.py:47private-key-----B…--- (35 chars)
tests/unit/test_diagnostic_redaction.py:152private-key-----B…--- (27 chars)
tests/unit/test_diagnostic_redaction.py:163private-key-----B…--- (27 chars)
tests/unit/test_diagnostic_redaction.py:254private-key-----B…--- (27 chars)
tests/unit/test_diagnostic_redaction.py:278private-key-----B…--- (27 chars)
Pattern hits (8)
WhereRuleMatch
Dockerfile:19download-piped-to-shell&& curl -fsSL https://deb.nodesource.com/setup_lts.x | bash - \
astrbot/core/config/default.py:467exfil-host"telegram_api_base_url": "https://api.telegram.org/bot",
astrbot/core/platform/sources/telegram/tg_adapter.py:61exfil-host"https://api.telegram.org/bot",
astrbot/core/platform/sources/telegram/tg_adapter.py:64exfil-hostbase_url = "https://api.telegram.org/bot"
dashboard/src/api/generated/openapi-v1/sdk.gen.ts:4very-long-line23162 chars
docs/public/install.sh:65download-piped-to-shell# Read menus from the terminal, never from the script stream in curl | bash.
tests/fixtures/helpers.py:47exfil-host (test/example)"telegram_api_base_url": "https://api.telegram.org/bot",
tests/fixtures/mocks/telegram.py:121exfil-host (test/example)bot.base_url = "https://api.telegram.org/bottest_token_123/"
URLs to bare IP addresses (3)
WhereRuleMatch
tests/test_fastapi_v1_dashboard.py:4801ip-literal-url"public_endpoint": "http://8.8.8.8:8080/v1",
tests/test_fastapi_v1_dashboard.py:4821ip-literal-urlf"{secret}\n{quote(secret, safe='')}\n{plugin_secret}\n{trace_secret}\nhttp://8.8.8.8:8080/v1 https://[2606:4700:4700::1111]:443/v1 http://192.168.1.2:6185/heal…
tests/unit/test_diagnostic_redaction.py:288ip-literal-url"api_base": "http://8.8.8.8:8080/v1",
Installer scripts (4)
Worst known vulnerabilities (24 of 187)
AdvisorySeverityPackageSummary
GHSA-2w6w-674q-4c4qcriticalhandlebars@4.7.8Handlebars.js has JavaScript Injection via AST Type Confusion
GHSA-8r5x-fm3f-whwjcriticalhandlebars@4.7.8Handlebars: JavaScript Injection via AST Type Confusion in compile (bypass of CVE-2026-33937)
GHSA-p8wg-vrv2-v86fcriticalhandlebars@4.7.8Handlebars: JavaScript Injection via Own Property Check Bypass
GHSA-23hp-3jrh-7fpwcriticaltar@6.2.1node-tar: Decompression/parse DoS via unlimited input
GHSA-g2v6-rqmx-r4w6high@vue/server-renderer@3.3.4@vue/server-renderer: XSS via missing CR in attribute-name blacklist
GHSA-35jp-ww65-95whhighaxios@1.13.5axios Vulnerable to Full Man-in-the-Middle via Prototype Pollution Gadget in `config.proxy`
GHSA-3g43-6gmg-66jwhighaxios@1.13.5axios Vulnerable to Credential Theft and Response Hijacking via Prototype Pollution Gadget in Config Merge
GHSA-3pq3-5fj3-cg6vhighaxios@1.13.5Axios: HTTP/2 adapter bypasses configured DNS lookup and proxy controls
GHSA-542g-h47m-68v8highaxios@1.13.5Axios: Denial of Service via Unhandled 'error' Event in HTTP/2 ClientHttp2Session Initialization
GHSA-6chq-wfr3-2hj9highaxios@1.13.5Axios: Header Injection via Prototype Pollution
GHSA-777c-7fjr-54vfhighaxios@1.13.5Allocation of Resources Without Limits or Throttling in Axios
GHSA-hfxv-24rg-xrqfhighaxios@1.13.5Axios: Regular Expression Denial of Service (ReDoS) via Cookie Name Injection
GHSA-j5f8-grm9-p9fchighaxios@1.13.5Axios: Proxy-Authorization header leaks to redirect target when proxy is re-evaluated to direct connection
GHSA-p92q-9vqr-4j8vhighaxios@1.13.5Axios: Proxy-Authorization Credential Leak to Origin Server Across HTTP-to-HTTPS Redirect in Axios Node.js HTTP Adapter
GHSA-pf86-5x62-jrwfhighaxios@1.13.5Axios: Prototype Pollution Gadgets - Response Tampering, Data Exfiltration, and Request Hijacking
GHSA-pmwg-cvhr-8vh7highaxios@1.13.5Axios: Incomplete Fix for CVE-2025-62718 - NO_PROXY Protection Bypassed via RFC 1122 Loopback Subnet (127.0.0.0/8) in Ax…
GHSA-q8qp-cvcw-x6jjhighaxios@1.13.5Axios has prototype pollution read-side gadgets in HTTP adapter that allow credential injection and request hijacking
GHSA-3jxr-9vmj-r5cphighbrace-expansion@1.1.12brace-expansion: DoS via exponential-time expansion of consecutive non-expanding {} groups
GHSA-6j4f-fj2g-mc7phighbrace-expansion@1.1.12brace-expansion: DoS via uncontrolled recursion in parseCommaParts causing stack exhaustion
GHSA-mh99-v99m-4gvghighbrace-expansion@1.1.12brace-expansion: DoS via unbounded expansion length causing an out-of-memory process crash
GHSA-qhr7-859c-m2p7highbrace-expansion@1.1.12brace-expansion: DoS via uncontrolled recursion on nested brace groups causing stack exhaustion
GHSA-rgw5-rvv9-x895highbrace-expansion@1.1.12brace-expansion: DoS via unbounded intermediate arrays, bypassing the CVE-2026-14257 mitigation
GHSA-3jxr-9vmj-r5cphighbrace-expansion@2.0.2brace-expansion: DoS via exponential-time expansion of consecutive non-expanding {} groups
GHSA-6j4f-fj2g-mc7phighbrace-expansion@2.0.2brace-expansion: DoS via uncontrolled recursion in parseCommaParts causing stack exhaustion

By the numbers

Stars43.7K
Forks3,202
Contributors381
Commits5,455
Open issues700
Open pull requests341
Releases261
Latest releasev4.29.3
LicenceAGPL-3.0
Main languagePython
Project age3 years
Last pushOct 25, 2026
Tracked files1,871
Lines of code449.4K
Checkout size22 MB

Lines by language: Python 251.1K, Vue 84.6K, JSON 36.1K, Markdown 35.1K, TypeScript 19.3K, YAML 8,749.

Questions

Is AstrBot free?

Yes. AstrBot is free and open source under AGPL-3.0, and the project states that it runs no paid services and never charges users. You pay only for the model APIs you connect, or nothing with local models.

Does AstrBot collect data?

By default it sends anonymous usage statistics, such as message counts, adapter and model names, OS and an installation ID, but not message text, according to its EULA. Set ASTRBOT_DISABLE_METRICS=1 or switch on 'Disable Anonymous Usage Statistics' in the dashboard to stop it.

Which chat platforms does AstrBot support?

Officially QQ, the OneBot v11 protocol, Telegram, WeChat Work, WeChat Official Accounts, Feishu (Lark), DingTalk, Slack, Discord, LINE, Satori, KOOK, Misskey and Mattermost, with Matrix, Rocket.Chat and VoceChat through community plugins.


This post is part of GitHub Tools, where every repository is cloned and scanned before it is written up. The scan is a snapshot of one commit on one day; the repository has moved on since, so check it before you install.