Documentation
Getting Started
Daily Operations
Networks & Mail
Look & Feel
Doors & Games
Web Features
Development
Reference
Other

Watch It Live — public activity page

A public, no-login web page at /watch showing real-time BBS
activity — who's online right now and roughly what they're doing,
across every protocol (telnet/SSH/rlogin/web) — styled as a retro
terminal display. Meant to be shared or embedded off-site (a social
media post, your own landing page) as a live demonstration of what
ANetBBS actually looks like in use, rather than a static screenshot.

Enabling it

Off by default. Turn it on in Admin → System → Settings (or set
PUBLIC_WATCH_ENABLED=true in .env) — it's a real, deliberate
broadening of exposure, not just a UI toggle: /who already shows
this same presence data, but only to your own logged-in users;
/watch shows it to anyone on the internet. That's the reason it
defaults off rather than on.

What it shows — and deliberately does not

  • Username, connection protocol, and a coarse "what they're doing"
    label (e.g. "MRC Chat", "Games", "Echomail") — built from the same
    privacy-conscious labeling /who already uses, so a web session's
    raw URL path is never exposed, only a general area name.
  • Live counts by protocol, refreshed every ~5 seconds.
  • It does not show message content, room/board names, or a
    mirrored terminal screen. That last one is a real gap in the
    underlying data model right now — see "What it doesn't do yet"
    below — not a design choice made for its own sake.

Letting a user opt out

Any user can hide themselves from this specific page — without
affecting their normal Who's Online visibility to other logged-in
users — via Profile → Edit → Privacy → "Hide me from the public
Watch It Live page"
.

A locked (is_locked) account is always excluded automatically.

Embedding

No extra configuration needed. ANetBBS sends site-wide security
response headers on every other route — including X-Frame-Options: DENY and a Content-Security-Policy with frame-ancestors 'self' —
but /watch is explicitly carved out of both (see
web_app.py's _set_security_headers()), specifically so it keeps
working as an <iframe> embed on another site. See
docs/SECURITY.md for the full response-headers
writeup.

What it doesn't do — and won't, on this page

The original idea for this page was to mirror an actual live terminal
screen, not just a "what area are they in" label. NodeActivity. last_screen is now populated (see 09 — Multinode + NodeSpy)
and rendered live in the admin-only NodeSpy view — but /watch
still never reads it and never will, by design: there's still no
privacy allowlist for which screens would ever be safe to show an
anonymous stranger (never a PM/netmail compose screen, never a
password prompt, never an admin menu), and this public page is the
wrong trust boundary to build that into. NodeSpy is gated behind
_require_admin() — the sysop's own screen-spy tool, not something
to extend to the general internet.

Related files

  • anetbbs/web/watch.py — the blueprint.
  • anetbbs/core/presence_labels.py — the shared, privacy-conscious
    "what is this session doing" labeling logic, also used by /who
    (anetbbs/web/who.py).
  • anetbbs/templates/watch/index.html — the public page itself
    (standalone, does not extend the normal site chrome).