Hal: An AI SysOp That Never Leaves the Server
August 7, 2026
Phosphor has a staff member now. His name is Hal, he listens on the #sysop channel and to direct messages, and he can answer “who’s online,” look up connection logs, walk through board stats, or take care of routine admin work — while the sysop is doing something else. Everything he knows and does stays on the machine the BBS runs on.
The off-grid constraint
The design rule that shaped everything: AI features use local Ollama only. No cloud APIs. A community server whose value proposition is you own the place cannot quietly forward your users’ conversations to a third party. Hal runs against localhost:11434, silently disables if Ollama is down, and is opt-in, off by default. If the network is gone, Hal keeps working — which matters for a server that’s supposed to run through anything.
Under the hood he’s a LangChain4j agent wired to an OllamaChatModel, bridged into the chat bus by SysopAssistantBot. Responses stream back on virtual threads, so the channel stays responsive while he thinks, and chat bubbles word-wrap at three-quarters terminal width like every other message on the system.
A real toolbelt, not a chatbot
Hal isn’t a personality bolted onto a generic model — he has tools scoped to the actual server:
- Admin tools — user and group management, account approve/deny
- Board, mail, news, file, and chat tools — read and act on the live services
- System tools — settings, status, connection log queries
- A read-only DB query tool — for the “how many posts in the general board this month?” class of question
A capability router classifies each prompt first: config-change intents (“set X to N”, “toggle Y”) route to the config assistant, status questions (“who’s online”, “jnet status”) route to read-only queries, and unknown prompts default to admin commands. Classification before execution means the sysop knows which permission gate a request is going through — and per-channel memory isolation keeps a conversation in #sysop from bleeding into a DM.
The part that actually matters: he can’t wreck the place
An AI with admin tools is a liability unless the destructive ones are fenced. Phosphor’s answer is two-phase execution. When Hal proposes something irreversible — ban a user, promote an account — the tool doesn’t do it. It registers the action with a PendingActionManager and returns a CONFIRM: prompt. A human types the confirmation; only then does the action execute.
sysop> @hal ban spammer99
hal> CONFIRM: ban user 'spammer99'? Reply YES to execute.
sysop> YES
hal> Done. User 'spammer99' is banned.
Every lifecycle transition — proposed, confirmed, denied, timed out — lands in an ai_audit_log table. Proposals expire after 30 seconds so stale commands can’t linger. Deny or stay silent and nothing happens. The audit trail means the question “why did the AI do X?” always has a real answer in the database.
There’s also a budget: a sliding one-hour window enforces ai.rate_limit_per_hour across every AI call site, checked live against the settings table before each call — sysop edits apply without a restart — and every call is logged to bbs.ai_call_log. Fail-open semantics mean a database outage errs toward letting the model answer rather than locking up the channel.
Privacy isn’t a feature flag
The scope rule is written down and enforced: Hal never reads user messages outside #sysop and DMs addressed to him. No surveillance, no “summarize today’s chat,” no ambient listening. A staff member who eavesdrops isn’t staff, and an AI that did would poison the trust a digital third place runs on.
Why this belongs in a BBS
The original BBS sysop answered every question, fixed every account, and moderated every board — because they were one person in one room. That scale made the place personal. Modern community software solved scale by removing the person; Phosphor’s bet is that you can keep the person and add staff. Hal handles the routine so the human sysop handles the human parts.
He’s also, quietly, a demonstration of the server’s thesis: everything — the model, the tools, the audit log, the user data — runs on hardware you own. No cloud dependency, no terms of service that can change under you, no data leaving the building.
Full post: https://phosphorbbs.net/blog/hal-an-ai-sysop-that-never-leaves-the-server/
#BBS #AI #digitalthirdplace #dtp #socialterminal #selfhosted #opensource #jterm