{"id":50696041,"url":"https://github.com/sphildreth/oxidebbs","last_synced_at":"2026-06-09T06:30:31.749Z","repository":{"id":361709438,"uuid":"1255477304","full_name":"sphildreth/oxidebbs","owner":"sphildreth","description":"A modern Rust BBS for ANSI terminals, telnet callers, door games, and echomail.","archived":false,"fork":false,"pushed_at":"2026-06-07T22:42:10.000Z","size":6979,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-08T00:21:28.819Z","etag":null,"topics":["ansi","bbs","binkp","cp437","decentdb","doors","doors-gameplay","fidonet","retrocomputing","telnet","terminal","zmodem"],"latest_commit_sha":null,"homepage":"https://oxidebbs.com/","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/sphildreth.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":"NOTICE","maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null},"funding":{"ko_fi":"sphildreth"}},"created_at":"2026-05-31T21:51:50.000Z","updated_at":"2026-06-07T15:06:20.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/sphildreth/oxidebbs","commit_stats":null,"previous_names":["sphildreth/oxidebbs"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/sphildreth/oxidebbs","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sphildreth%2Foxidebbs","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sphildreth%2Foxidebbs/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sphildreth%2Foxidebbs/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sphildreth%2Foxidebbs/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sphildreth","download_url":"https://codeload.github.com/sphildreth/oxidebbs/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sphildreth%2Foxidebbs/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34095240,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-09T02:00:06.510Z","response_time":63,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ansi","bbs","binkp","cp437","decentdb","doors","doors-gameplay","fidonet","retrocomputing","telnet","terminal","zmodem"],"created_at":"2026-06-09T06:30:28.962Z","updated_at":"2026-06-09T06:30:31.741Z","avatar_url":"https://github.com/sphildreth.png","language":"Rust","funding_links":["https://ko-fi.com/sphildreth"],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n    \u003cimg src=\"graphics/logo.png\" alt=\"OxideBBS logo\" width=\"440\" /\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n    \u003ca href=\"https://www.rust-lang.org\"\u003e\n        \u003cimg src=\"https://img.shields.io/badge/language-Rust-orange\" alt=\"Language: Rust\" /\u003e\n    \u003c/a\u003e\n    \u003ca href=\"LICENSE\"\u003e\n        \u003cimg src=\"https://img.shields.io/badge/license-Apache--2.0-blue\" alt=\"License: Apache-2.0\" /\u003e\n    \u003c/a\u003e\n    \u003ca href=\"https://github.com/sphildreth/oxidebbs/actions/workflows/ci.yml\"\u003e\n        \u003cimg src=\"https://github.com/sphildreth/oxidebbs/actions/workflows/ci.yml/badge.svg\" alt=\"CI\" /\u003e\n    \u003c/a\u003e\n    \u003ca href=\"https://github.com/sphildreth/oxidebbs/releases\"\u003e\n        \u003cimg src=\"https://img.shields.io/github/v/release/sphildreth/oxidebbs?sort=semver\" alt=\"Latest release\" /\u003e\n    \u003c/a\u003e\n    \u003ca href=\"https://oxidebbs.com\"\u003e\n        \u003cimg src=\"https://img.shields.io/badge/docs-oxidebbs.com-2ea44f\" alt=\"Documentation\" /\u003e\n    \u003c/a\u003e\n\u003c/p\u003e\n\n# OxideBBS\n\n**OxideBBS** is a modern Rust BBS engine for telnet and serial callers,\nANSI/CP437 screens, DecentDB persistence, local sysop operations, FTN/OxideNet\nnetworking, caller file transfers, and DOS door games.\n\nIt keeps the caller experience byte-oriented and classic while giving sysops a\nclean Rust codebase, a real database layer, auditable runtime operations,\noperational health checks, Docker deployment, and a GitHub-native release\nworkflow.\n\nOxideBBS remains a modern Rust server. C64, C64 Ultimate, and C64 terminal\napplication users are supported as remote callers through a C64-friendly\nterminal profile; this is not a C64-native server port.\n\n\u003e **Built for sysops. Driven by code.**\n\n## Features\n\n- 📡 **Telnet And Serial Caller Runtime** - Multi-node telnet serving plus\n  disabled-by-default physical serial/modem devices, with session lifecycle\n  tracking, idle timeout handling, graceful shutdown, and live node state.\n- 🎨 **ANSI/CP437-First UI** - Raw ANSI assets, CP437 conversion, C64-friendly\n  40-column plain/PETSCII-fallback caller profile, 80-column ANSI profile,\n  paging, caller-safe prompts, and CRLF-normalized telnet output.\n- 🧭 **Configurable Menus** - Login, main, info, message, door, logoff, and\n  nested submenu routing with hotkey-driven caller commands.\n- 👤 **Accounts And Auth** - New-user creation, Argon2id password hashing,\n  sysop accounts, security levels, persistent lockout state, and audit-friendly\n  login outcomes.\n- 💬 **Local Message Areas** - DecentDB-backed message areas, posting, reading,\n  replies, private-mail foundation, moderation fields, and SQL-side visibility\n  filtering.\n- 📁 **Caller File Areas And Transfers** - File-area management, ZMODEM\n  send/receive, XMODEM-CRC fallback, upload sanitization, pending-review\n  uploads, transfer history, and binary-safe caller transport handling.\n- 🕹️ **DOS Door Compatibility** - DOSEMU2-based live door launches, `DOOR.SYS`,\n  `DORINFO1.DEF`, `CHAIN.TXT`, `DOORFILE.SR`, `PCBOARD.SYS`, and\n  `CALLINFO.BBS` drop files, per-node runtime directories, byte bridging,\n  timeout cleanup, and durable `door_runs` records.\n- 🌐 **Remote Door Providers** - BBSLink and DoorParty-style provider adapters,\n  local dry-run checks, DecentDB-backed provider credentials, and redacted\n  secret display across sysop surfaces.\n- 🧪 **Bundled Door Fixture** - Oxide-owned `oxide-check` DOS test door for\n  validating drop files, DOSEMU2 command planning, and live COM1 byte flow\n  without bundling third-party doorware.\n- 🛰️ **FTN And BinkP Networking** - Type-2 packet I/O, echomail toss/scan,\n  netmail routing, bundles, nodelists/nodediffs, AreaFix, BinkP polling and\n  listener support, TLS modes, retries, queues, packet retention, and stats.\n- 🧬 **OxideNet** - First-party FTN-style network profile with application\n  review, address assignment, credential lifecycle, config package generation\n  and import, nodelist publication, suspended-node enforcement, and CLI/TUI\n  operations.\n- 🗄️ **DecentDB Persistence And Maintenance** - [DecentDB](https://github.com/sphildreth/decentdb) is the only system database, with\n  schema markers, migrations, users, sessions, messages, doors, file transfers,\n  network state, audit events, doctor checks, verify, backup, export, import,\n  compaction, and audit purge operations.\n- 🧑‍💻 **Sysop CLI And TUI** - Local CLI commands plus a Ratatui sysop console\n  for dashboard, nodes, users, doors, files, messages, database, logs, config,\n  ANSI, audit, doctor, network, OxideNet, and read-only workflows.\n- 🔌 **Local Control Socket** - Same-UID Unix control channel for live status,\n  node list/show, disconnects, direct node messages, broadcasts, and stale-node\n  recovery.\n- 🩺 **Remote Monitoring And Health Surface** - Opt-in plain-HTTP loopback monitoring web\n  listener with a human-readable root page, `/status`, doctor-backed `/health`,\n  `/healthz`, `/healtz`, sysop-authenticated read-only JSON APIs, CSRF/replay\n  protections, origin checks, rate limits, and read-only mutation blocking.\n- 🌐 **Browser Caller Terminal** - Optional `/terminal` endpoint on the same listener\n  as `[admin_web]` that opens a full-browser CP437 terminal connected to a normal\n  caller session via `/terminal/ws`, then prompts for the same BBS login menu flow as\n  telnet callers.\n- ⚡ **Browser ZMODEM Transfer** - `zmodem.js` is available on `/terminal/zmodem.js`\n  and `/terminal` routes upload/download bytes through the existing caller transfer\n  engine without changing transport protocol.\n- 📝 **Operational Logs And Audit Trail** - Configurable text or JSON logs,\n  rotation, monitoring web activity lines, audit retention, startup/shutdown\n  events, door events, auth events, and sysop action records.\n- 🐳 **Docker Deployment** - Cross-platform Docker Compose path for Windows,\n  macOS, and Linux hosts with OxideBBS, DOSEMU2, assets, config, and the test\n  door inside a Linux runtime image.\n- 🚢 **Release Automation** - Version metadata alignment, release archive smoke\n  checks, checksum verification, docs builds, Docker smoke checks, optional\n  DOSEMU2 smoke automation, and Codeberg mirror dry-run automation.\n- 🧱 **Modular Rust Workspace** - Focused crates for server, core domain, term,\n  telnet, serial/file transfer helpers, DecentDB repositories, doors, FTN,\n  BinkP, OxideNet, and local sysop tooling.\n\n## Sysop TUI\n\n\u003cp align=\"center\"\u003e\n    \u003cimg src=\"graphics/screenshots/sysop-tui-oxide-theme.png\" alt=\"OxideBBS sysop TUI dashboard showing node map, recent events, health, and alerts\" width=\"900\" /\u003e\n\u003c/p\u003e\n\n## Quick Start With Docker\n\nDocker Compose is the recommended cross-platform deployment path. It includes\nDOSEMU2 and the bundled Oxide-owned test door fixture.\n\n```bash\ndocker compose pull\nOXIDEBBS_SYSOP_PASSWORD='choose-a-real-password' docker compose up -d\n```\n\nConnect with SyncTERM, telnet, or a C64/C64 Ultimate terminal client:\n\n```bash\ntelnet localhost 2323\n```\n\nCommon Docker sysop commands:\n\n```bash\ndocker compose run --rm oxidebbs status\ndocker compose run --rm oxidebbs nodes list\ndocker compose run --rm oxidebbs doors check oxide-check\ndocker compose run --rm oxidebbs doors test oxide-check --user sysop --dry-run\n```\n\nSee [docs/project/docker.md](docs/project/docker.md) for first-boot variables,\npublished image tags, volumes, reset steps, door testing, and Windows/macOS\nnotes.\n\n## Install From Releases\n\nGitHub Releases publish `oxidebbs-server` packages and SHA-256 checksums for:\n\n- `oxidebbs-\u003ctag\u003e-linux-x86_64-gnu.tar.gz`\n- `oxidebbs-\u003ctag\u003e-macos-x86_64.tar.gz`\n- `oxidebbs-\u003ctag\u003e-windows-x86_64-msvc.zip`\n\nEach package includes the server binary, bundled assets, example configs, the\nOxide-owned `oxide-check` test door fixture, license files, and security policy.\nManual release workflow dispatches default to a dry run that builds and smokes\nall three archive formats, verifies checksums, builds docs, and builds the\nDocker image without publishing artifacts. Publish runs also push Docker images\nto GitHub Container Registry as `ghcr.io/sphildreth/oxidebbs:\u003cversion\u003e` and\n`ghcr.io/sphildreth/oxidebbs:v\u003cversion\u003e`.\nDocker remains the simplest deployment path for Windows and macOS sysops who\nwant DOS door support because live door execution targets a Linux runtime with\nDOSEMU2.\n\n## Build From Source\n\nPrerequisites:\n\n- Rust stable with `rustfmt` and `clippy`\n- `clang` and `libclang-dev` for DecentDB's native build integration\n- DOSEMU2 for live DOS door execution\n- Node.js for building the documentation site\n\nOn Debian/Ubuntu:\n\n```bash\nsudo apt-get install -y clang libclang-dev\n```\n\nCreate a local board:\n\n```bash\ncargo run -p oxidebbs-server -- setup\n```\n\nValidate the configuration:\n\n```bash\ncargo run -p oxidebbs-server -- check\ncargo run -p oxidebbs-server -- config check\n```\n\nStart the telnet listener:\n\n```bash\ncargo run -p oxidebbs-server -- serve\n```\n\nAfter `setup`, OxideBBS uses `config/oxidebbs.toml` by default. A clean checkout\nwithout that file falls back to `config/oxidebbs.example.toml`.\n\n## Sysop Operations\n\nOxideBBS is local-admin-first. Mutating sysop operations live in the CLI, the\nlocal sysop TUI, and the same-UID local control socket. The optional monitoring\nweb listener is intended for loopback status, health checks, and authenticated\nread-only JSON views.\n\n```bash\ncargo run -p oxidebbs-server -- status\ncargo run -p oxidebbs-server -- nodes list\ncargo run -p oxidebbs-server -- users list\ncargo run -p oxidebbs-server -- messages areas list\ncargo run -p oxidebbs-server -- doors list\ncargo run -p oxidebbs-server -- files areas list\ncargo run -p oxidebbs-server -- net status oxidenet\ncargo run -p oxidebbs-server -- logs recent\ncargo run -p oxidebbs-server -- db doctor\n```\n\nLaunch the local sysop TUI:\n\n```bash\ncargo run -p oxidebbs-server -- sysop\n```\n\nThe TUI can attach to a running server through\n`runtime/oxidebbs-control.sock`; when no socket is available it can start an\nembedded serve runtime for the TUI session. Selectable themes include\n`oxide-classic`, `wildcat`, `telegard`, `vbbs`, `mystic`, `midnight`, and\n`high-contrast`.\n\nWhen `[admin_web]` is enabled, the loopback listener exposes a landing page and\nmonitoring-friendly health checks. `/status` is public only when\n`public_status_enabled = true`. OxideBBS serves this listener as plain HTTP\nonly; use a local reverse proxy such as Caddy for HTTPS/TLS termination. Do\nnot connect directly with `https://127.0.0.1:8080`; terminate HTTPS at the\nproxy and forward plain HTTP to OxideBBS.\n\nIf `[web_terminal].enabled = true` (default), the same listener also serves:\n\n- `GET /terminal` - full-browser caller terminal.\n- `GET /terminal/ws` - websocket byte stream.\n- `GET /terminal/zmodem.js` - browser-side zmodem helper.\n\nThe browser terminal uses the same login, menu flow, sessions, node allocation,\nand disconnect handling as telnet/raw callers. ZMODEM upload/download flows use\nthe same transfer stack through the websocket stream.\n\n```bash\ncurl http://127.0.0.1:8080/\ncurl http://127.0.0.1:8080/health\ncurl http://127.0.0.1:8080/status\n```\n\n## Doors\n\nOxideBBS isolates door execution from core session logic. Local DOS doors run\nthrough DOSEMU2 with compatibility drop files, while remote provider entries\nconnect to BBSLink and DoorParty-style services without changing the caller\nmenu flow. A live local DOS door session uses this byte path:\n\n```text\ncaller telnet client\n  \u003c-\u003e OxideBBS caller transport\n  \u003c-\u003e OxideBBS PTY byte bridge\n  \u003c-\u003e DOSEMU2 COM1 pts backend\n  \u003c-\u003e DOSEMU2-emulated COM1 UART\n  \u003c-\u003e DOS door program\n```\n\nValidate the bundled `oxide-check` fixture without launching a live caller\nsession:\n\n```bash\ncargo run -p oxidebbs-server -- --config config/oxidebbs.example.toml doors check oxide-check\ncargo run -p oxidebbs-server -- --config config/oxidebbs.example.toml doors dropfile oxide-check --user sysop --node 1 --format DORINFO1.DEF\ncargo run -p oxidebbs-server -- --config config/oxidebbs.example.toml doors test oxide-check --user sysop --dry-run\n```\n\nSupported local drop-file writers include `DOOR.SYS`, `DORINFO1.DEF`,\n`CHAIN.TXT`, `DOORFILE.SR`, `PCBOARD.SYS`, and `CALLINFO.BBS`.\n\nOxideBBS does not bundle copyrighted or abandonware DOS doors. Add third-party\ndoors only when you have the rights to run and distribute them.\n\n## Documentation\n\nThe documentation site is published at [oxidebbs.com](https://oxidebbs.com).\nSource lives in [docs/](docs/).\n\n```bash\nnpm ci\nnpm run docs:dev\nnpm run docs:build\n```\n\nUseful docs:\n\n- [Getting Started](docs/project/getting-started.md)\n- [Deployment and Operations](docs/project/deployment.md)\n- [Docker Deployment](docs/project/docker.md)\n- [Sysop CLI](docs/project/sysop-cli.md)\n- [Remote Monitoring And Health](docs/project/remote-admin.md)\n- [Caller Commands](docs/project/caller-commands.md)\n- [Serial And Modem Transport](docs/project/serial.md)\n- [File Transfers](docs/project/file-transfers.md)\n- [Doors](docs/project/doors.md)\n- [FTN Architecture](docs/ftn/architecture.md)\n- [BinkP](docs/ftn/binkp.md)\n- [OxideNet](docs/oxidenet/overview.md)\n- [Architecture](docs/project/architecture.md)\n- [Release v1.2 Plan](design/RELEASE_v1_2_PLAN.md)\n- [Changelog](docs/about/changelog.md)\n\n## Repository Layout\n\n```text\n.\n├── crates/\n│   ├── oxidebbs-server/     # binary entrypoint, CLI, telnet server\n│   ├── oxidebbs-core/       # users, sessions, nodes, permissions, menus\n│   ├── oxidebbs-term/       # ANSI/CP437 rendering and terminal helpers\n│   ├── oxidebbs-telnet/     # telnet transport and negotiation\n│   ├── oxidebbs-db/         # DecentDB repository layer and schema helpers\n│   ├── oxidebbs-door/       # door metadata, drop files, runners\n│   ├── oxidebbs-sysop/      # local Ratatui sysop console and services\n│   ├── oxidebbs-transfer/   # file-transfer protocols (ZMODEM, XMODEM-CRC)\n│   ├── oxidebbs-network/    # shared network protocol types and tables\n│   ├── oxidebbs-ftn/        # legacy FTN packet engine and tosser/scanner\n│   ├── oxidebbs-binkp/      # BinkP client/server for FTN/OxideNet transport\n│   └── oxidebbs-oxidenet/   # OxideNet first-party network profile\n├── assets/                  # bundled ANSI, ASCII, text, and screen assets\n├── config/                  # example board and door configuration\n├── design/                  # specs, roadmap, ADRs, and architecture notes\n├── docs/                    # VitePress documentation site\n├── graphics/                # project logo and README graphics\n├── scripts/                 # development and door validation scripts\n└── tools/doors/             # Oxide-owned DOS test door fixture\n```\n\n## Development\n\nThe CI gate is:\n\n```bash\n./scripts/dev-check.sh\n```\n\nIt runs:\n\n```bash\ncargo fmt --all --check\ncargo check --workspace --locked\ncargo test --workspace --locked\ncargo clippy --workspace --all-targets --locked -- -D warnings\n```\n\nUse `--locked` when validating Rust changes because `Cargo.lock` is committed.\nMeaningful behavior, architecture, config, or product-scope changes should also\nupdate the relevant design docs and ADRs.\n\n## Contributing\n\nIssues and pull requests are welcome. Start with\n[CONTRIBUTING.md](CONTRIBUTING.md), keep the caller experience ANSI-first, and\nrun `./scripts/dev-check.sh` before submitting changes.\n\n## Security\n\nReport security issues privately to the repository owner. See\n[SECURITY.md](SECURITY.md) for the current policy and priorities.\n\n## License\n\nOxideBBS is licensed under the Apache License, Version 2.0. See\n[LICENSE](LICENSE) and [NOTICE](NOTICE). The repository licensing decision and\ncontribution policy are recorded in\n[design/adr/0007-use-github-and-apache-2.md](design/adr/0007-use-github-and-apache-2.md).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsphildreth%2Foxidebbs","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsphildreth%2Foxidebbs","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsphildreth%2Foxidebbs/lists"}