個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證正在載入完整 README。 以下為已儲存的摘錄。
API-controlled, headless Steam automation platform designed for large-scale batch operations and multi-region deployment.
Instead of one all-in-one process per machine (the ASF model), Vapor splits into a centralized control plane — public REST API, SQLite-backed orchestration, audit logs, web consoles — and a fleet of headless agents that execute jobs over an outbound WebSocket tunnel, close to Steam's regional endpoints. One control plane can steer agents in every region; agents reach the control plane, never the other way around.檢視完整 README ↗English | 简体中文
API-controlled, headless Steam automation platform designed for large-scale batch operations and multi-region deployment. Inspired by ArchiSteamFarm's Bot/Action model.
The Steam protocol layer is built on SteamKit2; the product shape reuses ASF's bot-session concepts in a control-plane / agent split instead of one process per machine. One control plane can steer agents in every region, close to Steam's regional endpoints. Agents reach the control plane, never the other way around.
Each account runs as a persistent Steam bot session: credential login with token refresh, SteamGuard / 2FA challenges, TOTP and QR-code login, and .maFile import from SDA or steamguard-cli. On top of that sit 65 actions — card farming, playtime boosting, trade offers, market listings with fee-aware pricing, inventory and duplicate scanning, achievement management, key redemption, free-license and points-shop claims, plus the Dota 2 trading plugin. Every action carries an execution-safety class, which is what lets the scheduler cap redispatch at 2 attempts for actions whose repetition can double an external side effect, while read-only and idempotent actions keep the configured ceiling. The actions catalog lists every payload field.
Declarative orchestration: you state online / idle / farm / boost per account and the reconciler converges reality to that statement, rotating farming targets as card drops run out and reassigning accounts when an agent disappears. GET /v1/orchestration/farm shows the live loop.
Risky surfaces ship disabled. Market listing creation and cancels default to dry_run and need both a per-account and a per-agent switch; trade auto-accept requires an explicit per-account policy with a partner whitelist and gifts-only mode. Every one of those decisions lands in the audit log.
Plugins load into isolated AssemblyLoadContexts and unload without a restart. Manifests carry a SemVer API contract, a trust level and permission grants; the runtime PluginStore installs packages agent-targeted from a catalog. Seven official plugins ship in-tree: Monitoring, MobileAuthenticator, MarketWatch, CS2/CSGO, Dota 2, GameData, GameAccess — the last carrying the game-access action surface as a wire-compatible extraction from the host. See plugin development.
For operations: a control-plane script repository to store and dispatch operator scripts to connected agents plus ordered script flows (sequential steps, per-step status, stop/continue failure policy), OpenAPI/Swagger, SSE event streams (jobs, sessions, auth challenges), Prometheus metrics with a Grafana dashboard, OpenTelemetry tracing across the agent tunnel, HMAC-signed webhooks, and structured logs that redact credentials and codes at output. Security posture is AES-GCM encrypted credential stores with key rotation tooling, per-role API keys, and an audit log redacted at rest — under one hard rule: Steam Guard codes and credentials never leave the agent, only a boolean crosses the wire.
┌────────────────────────────────────────────┐
│ Control Plane │
operators ──────▶│ REST /v1 (68 routes / 84 ops) · OpenAPI·SSE│
(curl / UI) │ SQLite: jobs · accounts · audit · crawl · scripts │
│ DesiredStateReconciler · schedulers │
│ admin.html · dashboard.html · gamedata │
└───────────────┬────────────────────────────┘
│ outbound WSS tunnel (agent key)
┌───────────────┴──────────┐ ┌──────────────┐
│ Agent #1 │ │ Agent #N │ ← one per region
│ session engine (bots) │ │ │
│ 65 actions · plugins │ │ plugins │
│ encrypted credentials │ │ │
└───────────────┬──────────┘ └──────┬───────┘
│ │
▼ ▼
Steam network Steam network
Demo site https://vapor.cuihairu.site/ | demo account demo / demo-899d0e86ad4d1c524da9c47a9d0f160e (for trial use, data resets periodically)
401. The real
admin key lives only on the deploy machine and is never published./admin.html (admin console)
or /dashboard.html (read-only dashboard)
and paste the demo password into the API-key prompt.main: deploys happen only when the full test
gate (all-green suite + 100% line/branch coverage) and the image build are
green, with automatic rollback on failure. Demo data is reset on every
deploy — a demo agent stays connected and seeded demo accounts/jobs keep the
consoles populated.| Control plane console | Account overview |
|---|---|
| Job history | Live event stream |
Docker Compose (control plane + one agent):
git clone https://github.com/cuihairu/vapor.git
cd vapor
docker compose up -d # + --profile observability for Prometheus/Grafana
curl -s http://127.0.0.1:8080/healthz
Declare an account and run your first job (dev key defaults, see docker.md for the variable table):
curl -sS -X PUT http://127.0.0.1:8080/v1/accounts/acct-1 \
-H "Authorization: Bearer admin-dev-token" -H "Content-Type: application/json" \
-d '{"enabled":true,"desiredState":"Online","region":"eu-west","agentId":"agent-1","updatedBy":"quickstart"}'
curl -sS -X POST http://127.0.0.1:8080/v1/jobs \
-H "Authorization: Bearer admin-dev-token" -H "Content-Type: application/json" \
-d '{"action":"ping","region":"eu-west","targets":["acct-1"]}'
Then open the consoles: /admin.html (full management UI) · /dashboard.html (read-first, one whitelisted reconcile action) · /gamedata.html (game data dictionary). The full walkthrough — login, challenges, farming, plugins — is in docs/getting-started.md.
CI and local development branch three ways by change surface — a one-line docs edit should not compile the world.
*.md, docs/**, images): no compile. The main CI
workflow's paths-ignore already skips these paths.dotnet test <changed csproj>dotnet test -c Release): only triggered by — *.csproj /
*.sln, .github/**, Docker/Compose config, and pre-release.| Section | Contents |
|---|---|
| Getting started | Walkthrough · Local run · Docker & Compose · Production deployment |
| Reference | REST API · Actions catalog · Data dictionary · Performance · Dependency policy · Releasing |
| Design | Architecture · Domain model · Consistency model · Session engine · Plugin development · |
net10.0)./scripts/run-tests.sh (or pwsh ./scripts/run-tests.ps1)./scripts/run-tests.sh --coverage; full-solution gate runs use ./scripts/collect-coverage-serial.sh (per-project collection with report validation)DOTNET_ROLL_FORWARD=Major can bridge an older runtime.vX.Y.Z (see docs/releasing.md)CHANGELOG.mdVapor is currently alpha (breaking changes expected).
Apache-2.0, see LICENSE.
See CONTRIBUTING.md and SECURITY.md.
See SUPPORT.md.
| Operations | Troubleshooting · Testing |
| Project | Changelog · Contributing · Security policy · Support |