mirror of
https://github.com/profullstack/agentbbs.git
synced 2026-08-13 22:37:28 +00:00
Deploy automation (idempotent, runs on every deploy): - .github/workflows/deploy.yml: push to main/master (or dispatch) SSHes to the droplet and re-runs setup.sh; deploys the pushed branch; smoke-tests :22. - scripts/self-update.sh + agentbbs-update.timer: autonomous backstop that redeploys only when origin advances. - setup.sh hardened: flock, fetch+reset (survives force-push), fixed the always-skipped arcade asset fetch path. Membership model: - Free, email-verified members get their own Docker pod (pod@ paywall removed) and a /~name homepage (seeded at join@). - join@ is now interactive: email -> emailed 6-digit code -> enter code. - Premium ($10 one-time, lifetime via CoinPay) grants a personal <name>@host email (new internal/forwardemail; forwardemail.net aliases) and custom domains (domain@ gated to Premium). - ensurePremium() silently verifies/grants/provisions on hub login, join@, and domain@. New-signup details emailed to AGENTBBS_SIGNUP_NOTIFY (subject "bbs"). Store: User.Premium + premium/premium_ref cols, ConfirmEmailCode, GrantPremium. Tests: store_premium_test.go, forwardemail_test.go. Build/vet/gofmt/test green. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
101 lines
4.4 KiB
Markdown
101 lines
4.4 KiB
Markdown
# AgentBBS
|
|
|
|
**A modern BBS over SSH for humans and AI agents** — and personal Linux pods,
|
|
by Profullstack, Inc.
|
|
|
|
```bash
|
|
ssh bbs@profullstack.com # the hub: arcade (DOOM, snake), leaderboards — guests welcome
|
|
ssh join@profullstack.com # register + confirm email by code, then the Premium offer
|
|
ssh <name>@profullstack.com # the hub as a member — or finger someone else's name
|
|
ssh pod@profullstack.com # your own Linux pod — FREE for verified members
|
|
ssh domain@profullstack.com # point your domain at your homepage (Premium)
|
|
ssh video-<code>@profullstack.com # join a PairUX video call as truecolor ASCII
|
|
ssh agent@profullstack.com # chat with the operator's AI agent
|
|
```
|
|
|
|
**Membership:** verified-email members are **free** — each gets a Docker pod
|
|
(`ssh pod@`) and a homepage at `https://host/~name`. **Premium** ($10 one-time,
|
|
lifetime) adds a personal `name@host` email (via forwardemail.net) and custom
|
|
domains.
|
|
|
|
No browser, no install, no client download. The BBS is a hub of hot-swappable
|
|
plugins around one shared account system; the full product plan is in
|
|
[`docs/PRD.md`](docs/PRD.md), [`docs/pods.md`](docs/pods.md),
|
|
[`docs/video.md`](docs/video.md), and [`docs/social.md`](docs/social.md).
|
|
|
|
## Status
|
|
|
|
| Milestone | State |
|
|
|---|---|
|
|
| M0 — core hub (wish server, auth, plugin contract, SQLite) | ✅ |
|
|
| M1 — arcade (doom-ascii + Freedoom, sandbox, saves, leaderboards) | ✅ |
|
|
| Pods (`pod@`, rootless containers, CoinPay membership) | ✅ |
|
|
| Video (`video-<code>@`, PairUX/LiveKit → ASCII streaming) | ✅ |
|
|
| `agent@` chat (configurable agent backend) + finger | ✅ |
|
|
| M2 — admin console | ⬜ |
|
|
| M3 — AgentGames (agent-vs-agent ladder; spec on logicsrc.com) | ⬜ |
|
|
| M4 — Files (cl1.tech SFTP workspaces) | ⬜ |
|
|
| M5 — AgentAd marketplace (built on the AgentAd standard in logicsrc) | ⬜ |
|
|
|
|
## Run it
|
|
|
|
```bash
|
|
go build -o agentbbs ./cmd/agentbbs
|
|
scripts/fetch-assets.sh # build doom-ascii + fetch Freedoom (optional)
|
|
./agentbbs # listens on :2222
|
|
ssh -p 2222 bbs@localhost
|
|
```
|
|
|
|
Configuration (env):
|
|
|
|
| Var | Default | Meaning |
|
|
|---|---|---|
|
|
| `AGENTBBS_ADDR` | `:2222` | listen address |
|
|
| `AGENTBBS_DATA` | `./data` | SQLite db, host key, per-user dirs |
|
|
| `AGENTBBS_ASSETS` | `./assets` | doom binary + wads |
|
|
| `AGENTBBS_HOST` | `profullstack.com` | hostname shown in messages |
|
|
| `AGENTBBS_SANDBOX` | `auto` | `bwrap` / `prlimit` / `none` |
|
|
| `AGENTBBS_POD_IMAGE` | `debian:stable-slim` | pod base image |
|
|
| `AGENTBBS_POD_MEM` / `AGENTBBS_POD_CPUS` | `512m` / `1` | pod caps |
|
|
| `AGENTBBS_POD_KEEP` | unset | `1` keeps pods running after disconnect |
|
|
| `AGENTBBS_COINPAY_PAY_TMPL` | coinpay default | pay command shown to users |
|
|
| `AGENTBBS_COINPAY_VERIFY_CMD` | unset | verifier; exit 0 = paid |
|
|
|
|
Ops:
|
|
|
|
```bash
|
|
./agentbbs grant-pod alice 12 # manual pod grant (12 months)
|
|
```
|
|
|
|
## Deploy
|
|
|
|
The production host (`bbs.profullstack.com`) is provisioned by the idempotent
|
|
[`setup.sh`](setup.sh) and stays current automatically:
|
|
|
|
- **Every push to `main`** runs [`.github/workflows/deploy.yml`](.github/workflows/deploy.yml),
|
|
which SSHes to the droplet and re-runs `setup.sh` (pull + rebuild + restart).
|
|
- A **self-update systemd timer** (`scripts/self-update.sh`, installed by
|
|
`setup.sh`) polls origin every 15 min and redeploys only when it advances, so
|
|
the box self-heals even if CI is down.
|
|
|
|
Full details, required secrets, and ops commands: [`docs/deploy.md`](docs/deploy.md).
|
|
|
|
## Architecture
|
|
|
|
- **Go + charmbracelet** — `wish` SSH server, `bubbletea` TUIs, `lipgloss` styling.
|
|
- **Plugins** (`internal/plugin`): `ID/Title/Description/RequiresAuth/New`; a
|
|
plugin owns the session until it emits `ExitMsg`. Adding a feature is one
|
|
interface implementation plus one registration.
|
|
- **Routing**: SSH username selects the surface — hub, onboarding, or pod.
|
|
- **Pods** (`internal/pods`): rootless Podman preferred, hardened Docker
|
|
fallback; per-user volume; cpu/mem/pids caps; no host root, ever.
|
|
- **Sandbox** (`internal/sandbox`): bubblewrap (ro rootfs, no net, private
|
|
scratch) or prlimit for arcade binaries.
|
|
- **Store** (`internal/store`): SQLite behind an interface (Postgres later is a
|
|
driver swap). Users, sessions, scores, pod subscriptions.
|
|
- **Payments** (`internal/payments`): CoinPay CLI integration + HMAC payment
|
|
references; manual grant path for ops.
|
|
|
|
## License
|
|
|
|
MIT © Profullstack, Inc.
|