awdiscord
Source · pip install git+https://github.com/Aitherium/awdiscord.git · The Aither World
The Aither World is an operating system for agents — a Linux you can hand to one, the runtimes it works in, and the tools it works with. awnix is the Linux underneath it; awdiscord is one of its 68 bricks — each installs on its own, runs offline, and needs no account.
Start here: Put an agent you already run into your Discord server as a bot with /ask.
Put any agent on Discord as a real bot, with an operator in the loop.
An agent behind an OpenAI-compatible endpoint (an adk serve agent, llama.cpp /
Bonsai, vLLM, Ollama, LM Studio, a gateway) becomes a Discord bot with slash
commands, plugins each server turns on for itself, rate limits, and approval
buttons that only your operators can press. Your model, your machine.
pip install "awdiscord[gateway]"
awdiscord setup # paste the bot token once; it does the rest
awdiscord run
setup checks the token is a bot token, writes the app's profile and
least-permission install settings, finds a model server running on this machine
(Bonsai/llama.cpp :8090/:8080, Ollama :11434, LM Studio :1234, vLLM :8000), makes
the app's owner (or team) the operators, saves everything to
~/.awdiscord/awdiscord.env (mode 600), registers the commands and prints the
install link. The one step Discord does not allow from an API is creating the
application: do that at https://discord.com/developers/applications, open Bot,
press Reset Token.
| command | what it does |
|---|---|
/ask question [persona] [private] |
the agent answers; private shows only you |
/share |
posts your last answer in the channel |
/status |
is the agent up, which personas exist |
/plugins list|info|enable|disable |
what this server has on (enable/disable: Manage Server) |
Plugins
Built in:
| plugin | default | commands |
|---|---|---|
community |
on | /poll with vote buttons, /faq ask|list|set|remove (the agent answers from the FAQ only), /rules |
projects |
off | /task add|list|start|done|assign|drop, /standup written by the agent from the board |
github |
off | /gh board|untracked|issue|connect for a GitHub Projects board (AWDISCORD_GITHUB_TOKEN) |
Each server turns plugins on and off for itself; its data is kept per server and
never visible to another. A plugin's persona text is added to /ask only where
it is on.
Write your own:
awdiscord new-plugin standup-bot # scaffolds ~/.awdiscord/plugins/standup_bot.py
awdiscord plugins # proves it loads (exit 1 names anything that failed)
from awdiscord.plugins import Command, Option, Plugin
def hello(ctx): # ctx.user, ctx.guild, ctx.store, ctx.agent, ctx.opt()
return ctx.reply(f"hello <@{ctx.user}>")
PLUGIN = Plugin(name="hello", version="0.1.0", description="Says hello",
commands=[Command("hello", "Say hello", hello)])
Plugins are found in awdiscord.builtin, the awdiscord.plugins entry-point group
(so pip install a plugin package and it loads), AWDISCORD_PLUGIN_DIRS and
~/.awdiscord/plugins. AWDISCORD_PLUGINS=a,b narrows the set.
Packs
awdiscord pack install ./packs/dgg_pm # a plugin pack
awdiscord pack install ~/my-agent-pack # an awdk agent pack
awdiscord pack install https://github.com/org/repo#packs/x # from git
awdiscord pack list | remove NAME
An agent pack (brain_pack.yaml / agent.yaml / skills/, the awdk and
awpack shape) becomes a plugin: its system prompt rides along on /ask where it
is on, its skills are listed to the agent, and /<pack> ask answers in its voice.
packs/dgg_pm is an example plugin pack: Digital Ground Game's org board with
their own status flow.
Run it under a supervisor
awdiscord run --inbox-port 8371 opens GET /health for a supervisor. The awdk
addon manifest does exactly that, so adk addon (and awsh) can start, health-check
and restart the bot like any other local component.
Rails
- Bot tokens only. Every request is sent as
Authorization: Bot <token>, and the runtime asks Discord who the token belongs to before anything else. A user account is refused. Driving a person's account ("self-bot") is against Discord's terms. - Least permission. The install link asks for
bot+applications.commandsand four permissions: view channel, send messages, embed links, read message history.install_url()refuses administrator, manage-server, manage-roles, manage-webhooks, ban, kick and mention-everyone. - Rate limits. Token buckets per user, per server and for the whole bot; a request must find room in all three, and a refusal says how long to wait.
- Mentions off. Every answer goes out with
allowed_mentions: {parse: []}, so an agent cannot ping@everyone. - Approvals. A card with Approve / Deny buttons. The button id carries an HMAC of
the approval id and the verb, only user ids in
AWDISCORD_OPERATORScount, a decision is taken exactly once, and the result is POSTed to your callback with anX-Awdiscord-Signatureheader (HMAC-SHA256 of the body under the same secret).
Approvals from your own code
Run the bot with an inbox, then raise cards from anything on the same machine:
export AWDISCORD_OPERATORS=<your user id>
export AWDISCORD_APPROVAL_SECRET=$(python -c "import secrets;print(secrets.token_hex(32))")
export AWDISCORD_INBOX_PORT=8371 AWDISCORD_INBOX_TOKEN=<a long random string>
awdiscord run &
awdiscord approval "Publish the release notes?" "v1.4 notes are drafted" \
--callback http://127.0.0.1:9000/decided
Without AWDISCORD_APPROVAL_CHANNEL the card is sent to each operator by DM.
Use the pieces alone
from awdiscord import install_url, RateLimiter, ApprovalDesk, post_webhook, Dispatcher
install_url("123456789012345678")
post_webhook("https://discord.com/api/webhooks/...", "deploy finished")
Dispatcher takes the interaction JSON Discord sends and returns the response JSON,
with no network, so the bot's behaviour is testable with plain dicts.
Configuration
| variable | meaning |
|---|---|
DISCORD_BOT_TOKEN / AWDISCORD_TOKEN |
the bot token |
DISCORD_APP_ID / AWDISCORD_APP_ID |
application id (looked up from the token if unset) |
AWDISCORD_AGENT_URL, AWDISCORD_AGENT_MODEL, AWDISCORD_AGENT_KEY |
the agent |
AWDISCORD_PERSONAS_DIR |
<name>.md or <name>/SOUL.md files become /ask persona: choices |
AWDISCORD_DEFAULT_PERSONA |
persona used when none is chosen |
AWDISCORD_CA_BUNDLE |
CA file for an agent served over a private CA |
AWDISCORD_OPERATORS, AWDISCORD_APPROVAL_SECRET |
enable approvals |
AWDISCORD_APPROVAL_CHANNEL |
post cards here instead of DMing operators |
AWDISCORD_INBOX_PORT, AWDISCORD_INBOX_TOKEN, AWDISCORD_INBOX_HOST |
local inbox |
AWDISCORD_DEV_GUILD |
also register commands on one server (instant, for testing) |
AWDISCORD_STATE_DIR |
where approvals are stored (default ~/.awdiscord) |
awdiscord --self-test proves every rail offline and exits non-zero if one does not hold.
License
Apache-2.0
The aw family
Standalone tools that share one idea: replace something you would otherwise have to trust with something you can check.
Each installs on its own, works offline, and needs no account.
| instead of trusting | you check | |
|---|---|---|
| awdk | a framework's idea of how your agents should run | one loop you can read, pointed at a backend you already pay for |
| awskills | that an agent knows your procedure | the procedure written down, versioned, and loadable by any agent |
| awpack | that the pack you want shipped inside somebody's SDK, under whatever licence that SDK happens to carry | the pack as its own versioned artifact, with its own licence, that any agent runtime can install |
| awm | that memory stayed in its lane | tenant:user:project scopes, so a write cannot cross a boundary |
| awdesk | that the agent is somewhere behind a browser tab | a tray icon, a face on your desktop, and the decision card that pops when it needs you |
| awnode | a vendor's cloud with every prompt | a local gateway routing to backends you chose |
| awgraph | that grep found everything | an AST + tree-sitter call graph an agent can traverse |
| awgit | that no one else is editing this file | a lease, refused at commit time if you do not hold it |
| awdelphi | one agent's confident take on a decision | the round trace, the anonymity, and who dissents |
| awclassify | a filename, a folder, or whoever last touched it | doc_type, visibility, audience and topics, with the evidence lines that decided each |
| awdecide | a hosted classifier's probability that never learns whether it was right | the decision, its probability, and the calibration curve from your own resolved outcomes |
| awtoll | that your tooling is saving you context | the measured token cost of each tool call, and what the alternative cost |
| awseal | that the artifact came from who you think | an Ed25519 seal — the key that verifies is not the key that forges |
| awshare | that the download is intact | content-addressed bundles, verified on fetch |
| awsuite | that an agent holding your mailbox will not send on its own | every send, draft, upload and create returns a dry-run until confirm is true |
| awnest | that there is a person on the other end | a verdict with evidence, where "we could not tell" is not "yes" |
| awrena | a leaderboard someone can edit, and votes nobody counted | a scored duel with both answers kept, and a result bound to them |
| awnboard | a share link anyone who sees it can use | an invitation addressed to one person, for one gate, revocable |
| awnix | that the box is what you left it as | an immutable image you built, with atomic rollback |
| awrecover | that the restore worked | a restore that fully lands or does not land at all |
| awstorage | a du you ran last month, and a peers file that says 3 TB free | an inventory snapshot per node with a diff since the last one, and each tree classified re-fetchable or not |
| awrelay | a SaaS in the middle of your agents | findings, alerts and coordination over your own transport |
| awask | that anyone read the paragraph where you asked | the ask itself, with a button that steers the session that raised it |
| awmail | a mailbox somebody else can read | mail your agents send and receive over your own server |
| awdiscord (you are here) | a self-bot on someone's account, or a bot that acts without asking | slash commands, rate limits, and approval buttons only your operators can press |
| awswarm | that a model either fits your GPU or it doesn't run at all | a placement plan and an acquisition-probability estimate before you spend on a run |
| awfind | one vendor's idea of the web | results from whichever providers you configured |
| awbrowse | that the page said what you were told | the render, the DOM and the requests it made |
| awvoice | that a cloud vendor may hold your audio | a transcript and a wav from a service you host |
| awvision | a filename and a caption somebody wrote | what a model actually reports about the pixels |
| awscreen | a selector that was true when the page was written | the elements actually rendered, by what they look like |
| awbeads | that a layout your users built survives the next deploy | the arrangement as data you can read back, diff, and hand to another surface |
| awbonsai | that inference always means a request left the machine | a WebGPU model answering on the tab's own GPU, with a consent record logged before it ever loaded |
| gawbbonet | the model to keep a 300-message campaign coherent by itself | campaign facts recalled from scoped memory you can list and edit |
| aitherkvcache | a vendor's quantisation defaults | sub-byte KV cache kernels you can benchmark yourself |
| awrtifact | a hand-rolled split script and a hand-edited worker manifest | byte-verified parts in a release, served with Range + CORS, sizes asserted by a live gate |
| AitherZero | a pile of scripts nobody has numbered | numbered, discoverable automation with declarative playbooks |
| AitherConnect | what a page tells your browser to do | a federated search and desktop bridge you host |
| awreason | a confident paragraph | the phases it went through, and every tool call it made to get there |
| awrecurse | that everything you pasted in was actually read | which slices it opened, and what it concluded from each |
| awprism | the first explanation that fits | the ranked alternatives, and the observation that separates them |
| awrepl | what the agent believes the value is | the value, printed from the live session |
| awreport | that the report you pasted carried no token in it | a redacted report, and the duplicate it merged into instead of filing twice |
| awresearch | a summary of pages nobody opened | every claim against the source it came from |
| awfocus | twelve terminal tabs and a bad memory | one command that names every session, finds any transcript, and opens or steers the one you want |
| awgym | that a world model learned anything from the games it saw | transitions captured from real play, fed back, and the retrodiction score falling on grids it never saw |
| awpredict | a model because it trained without erroring | its prediction against a self-updating lookup, on the rows that are actually novel |
| awevolve | that your optimisation loop is finding anything | every version it kept, the score that version earned, and the edit that produced it |
| awsh | that you already know the name of the command | what it decided your line meant, before it acts on it |
| awmine | that a session's lesson survived the session | a row per outcome, a candidate per lesson, and the transcript line each one came from |
| awrise | that a scheduled agent ran at all, and ran exactly once | a durable record of every wake -- fired, skipped, overlapped or timed out -- each with its reason |
| awkno | that the docs site is up, or that you remember the family | the whole ecosystem in your terminal, with no network at all |
| awwall | that a service only talks to the hosts you think it talks to | an explicit egress allowlist, where a denial names the rule that denied it |
| awembed | a general-purpose embedder that has never seen your code | a held-out split of whole directories, scored teacher vs student vs int8 |
| awtax | a closed tax app's sealed file you can never read again | a plain, provider-neutral schema of every figure, with the page it came from |
| awsettings | that you will remember to re-approve the same thing on every box you work from | one profile, unioned rather than overwritten, with the credentials left behind |
| awavatar | a cloud 3D vendor's opaque task id | a manifest with a sha256, a licence and a rig-audit verdict per file |
awnix is the ground floor — A Linux you can hand to an agent — immutable base, capabilities included.
The Aitherium ecosystem
Every repository here is public. Each publishes an aither-manifest.json beside its page, so any surface can read every sibling's — the network is browsable from any node in it.
| repo | what it is | pages |
|---|---|---|
| awdk | Build AI agent fleets — 3 lines, any backend, local or cloud | docs |
| awskills | Portable agent skills — self-contained procedures an agent loads on demand | docs |
| awpack | First-party agent packs — the ones we build, versioned and installable on their own | docs |
| awm | A portable, scoped agent memory | docs |
| awdesk | Aither World Desk -- the desktop body of AitherOS Online: tray, avatars, decision cards, the Living Desktop as an overlay | docs |
| awnode | A lightweight local gateway — bridges your apps to the AI backends you chose | docs |
| awrun | A priority-aware queue and dispatcher for agentic runs and ad-hoc CI builds. It also judges whether the runner pool is big enough for the queue it is draining, and can ask a host to grow it -- reserving capacity is zero-sum, so a saturated pool needs more of it, not a different share of it | docs |
| awgraph | A semantic code graph for agents — AST + tree-sitter, call graphs | docs |
| awgit | Semantic version control on top of git — edit-ops and leases | docs |
| awdelphi | Anonymous multi-round expert panels — a converged answer with a trace | docs |
| awclassify | Classify any document -- what it is, who may read it, who it is for, what it is about | — |
| awdecide | One typed-decision contract -- choice / score / bool with a probability -- over a ladder of backends you already run (rules, tiny local models, an LLM's logprobs), fail-closed, with a Brier ledger that resolves every decision against its outcome | — |
| awtoll | What every tool call costs you in context, measured from your own transcripts | docs |
| awseal | Sign an artifact so a stranger can verify it | docs |
| awshare | Publish an artifact and fetch it back verified | docs |
| awsuite | Your Google Workspace as agent tools, and no write happens without a yes | — |
| awdit | An append-only audit trail whose gaps are DETECTABLE | docs |
| awbac | Role-based access control that fails closed and explains itself | docs |
| awiam | Who is this caller? A directory and session store that fails honestly | docs |
| awtunnel | Reach a service that has no public address | docs |
| awnest | Prove there is a human before you let them into the nest | docs |
| awrena | Put two agents head to head and get a verdict you can check | docs |
| awnboard | A front gate you can put in front of anything, and hand someone the key to | docs |
| awnix | A Linux you can hand to an agent — immutable base, capabilities included | docs |
| awrecover | Labelled snapshots with an all-or-nothing restore | docs |
| awstorage | Every drive on every node, indexed, classified and diffed -- so you can see what you own before you delete it | docs |
| awrelay | Portable agent messaging — findings, alerts, coordination | docs |
| awask | Your agent asks you a question — and acts on your answer | docs |
| awmail | Give an agent an email address — send, and actually receive | docs |
| awdiscord (you are here) | Put any agent on Discord as a real bot, with an operator in the loop | — |
| awnet | The agentic web — agents host a mesh, and agents join one | docs |
| awswarm | Run one model too big for any single GPU across a pool of small ones | — |
| awfind | A portable search client — query, results, ranking | docs |
| awbrowse | A portable browser client — navigate, console, network, DOM, screenshot | docs |
| awvoice | Hear and speak — transcribe audio, synthesize a voice | docs |
| awvision | See an image — describe it, ask it a question, compare two | docs |
| awscreen | See this machine — what is on screen, and where to click it | docs |
| awkit | Render an agent panel from a tool result — one component, any React app | — |
| awbeads | A spatial canvas for a page — arrange things, connect them, and keep the arrangement | — |
| awbonsai | Run a real model in the visitor's own browser — no server round trip, no upload | — |
| awknowledge | How to run a coding agent so the result survives — the laws, with evidence | docs |
| awbrain | Your history as a wiki of linked markdown — claims pinned to the evidence | — |
| gawbbonet | GobboNet campaigns with a real agent brain — scoped memory, graph recall | docs |
| aitherkvcache | Near-optimal KV cache quantization for LLM inference — sub-byte compression | docs |
| awrtifact | Deliberately chunk artifacts into GitHub release assets — the productized aitherkvcache mirror lane | docs |
| AitherZero | PowerShell 7+ automation framework — numbered, self-describing scripts | docs |
| AitherConnect | Browser extension — federated AI search, page context, and the Living OS overlay | docs |
| awreason | A portable reasoning client — sessions, phases, thoughts, and the chain that produced the answer | docs |
| awrecurse | Answer a question over a context far larger than the window — recursively, with the trace kept | docs |
| awprism | Turn a failure into ranked hypotheses — and say what would confirm each one | docs |
| awrepl | A REPL an agent can actually use — state that survives between turns | docs |
| awreport | File a bug report that has already scrubbed your secrets and collapsed the duplicate | — |
| awresearch | Ask a research question, get a cited report you can check | docs |
| awfocus | See, search and steer every Claude session from one command | docs |
| awgym | An ARC training gym — a game a world model can watch, and six roles that play through it | docs |
| awpredict | Predict what your environment does next, and how surprised you were | docs |
| awevolve | Point an agent at a file and a command that scores it, and let it improve | — |
| awsh | Your terminal answers you -- type a question where a command would go | docs |
| awmine | Mine what your agents did -- outcomes, lessons and procedures out of the transcripts they left behind | — |
| awrise | Wake an agent on a schedule, let it do one thing, and put it back to sleep | docs |
| awkno | The man page for the Aither World — every brick, stack and law, offline | docs |
| awwall | Say what a workload may reach, and watch everything else fail closed | docs |
| awrouter | OpenRouter for your own fleet: pick a model backend by cost/latency/ capability, fail over, fit the context window, stream. Standalone, OpenAI-compatible, no Aither-specifics required to be valuable | — |
| awembed | Train an embedding model that knows your corpus, and prove it beats the big one | docs |
| awtax | Turn any tax PDF -- returns, W-2, 1099, statements, even scans -- into structured data you can check | docs |
| awflow | A deterministic workflow runtime — chain agent calls with journal replay and budget control | docs |
| awsettings | Your agent's permissions and config, following you to the next machine | docs |
| awavatar | One character spec in, a rigged, animated, multi-style avatar pack out | docs |
Built on REA (Reverse Engineer Anything) · llama.cpp · vLLM · ComfyUI · CentOS Stream · Podman · Docker · LanceDB · WireGuard · FFmpeg · Blender + Rigify · headroom · SANA · Hunyuan3D · repowise · Playwright · Chromium · Next.js · React.
<script src="aither-constellation.js"></script>Metadata
Release files for awdiscord 0.3.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| awdiscord-0.3.0.tar.gz | 112.8 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| awdiscord-0.3.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 201.3 kB
Release files / awdiscord-0.3.0.tar.gz
| Download URL | awdiscord-0.3.0.tar.gz |
|---|---|
| Size | 112.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
0f2be1ea23be6fc698140c9cedc7625ceca75eff6ddf8efd666e93a3cc8cecea
|
|
BLAKE2b-256 checksum How to use checksums |
794de6aecf1205eab8d07781617b73d9c9ad020825b74d0be8a24c0dcafdb6a5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.3
|
Release files / awdiscord-0.3.0-py3-none-any.whl
| Download URL | awdiscord-0.3.0-py3-none-any.whl |
|---|---|
| Size | 88.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
a8a3332b07397b044e4716854d113cce7ed35494790a1d21d48581b5c8b8a104
|
|
BLAKE2b-256 checksum How to use checksums |
f37e0164d637f4082b01b7afb46c4cc9b3a49617c7f52ae5c05b96ceb48571ec
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.3
|