Next-gen creative tooling that lets users generate, remix & monetise media across Telegram, Discord and a rich Web Canvas – all powered by ComfyUI Deploy, on-chain credits and an extensible Tool Registry.
• One codebase → three front-ends (Telegram Bot, Discord Bot, Web Sandbox).
• Unified Internal / External REST API exposing core capabilities.
• Pluggable ToolDefinition & ToolRegistry system – add new AI workflows with JSON only.
• WorkflowExecutionService orchestrates sync, webhook & poll execution strategies.
• On-chain CreditService (Ethereum) with price feeds, NFT valuation & risk engine.
• Real-time notifications via WebSockets & platform notifiers.
• Modular Core Services layer: ComfyUI, Points, Media, Sessions, Storage, OpenAI, Analytics, …
• Resilient startup sequence – continues even if optional services are offline.
• Crypto-centric AI Service Aggregator – unify cutting-edge AI models with on-chain credit accounts, token-gated access and immutable blockchain audit trails in a single pipeline.
• Referral Vault & Incentivised Innovation – earn Credits for inviting new users; build custom workflows, contribute training data or fine-tune models and get rewarded automatically. The result is a powerful community-driven flywheel for new tools, datasets and revenue streams.
• NFT Creation Flywheel / Independent AI Lab – one-click minting pipelines transform generated media into ERC-721 collections, letting any user spin-up an independent AI studio that monetises art without leaving the platform.
• Uncensored by Default – StationThis does not impose upstream model moderation. We champion creative freedom while respecting legal boundaries in your jurisdiction.
StationThis is currently in public beta. While HTTPS, credential encryption and strict access controls are in place, data is not yet end-to-end encrypted and some storage components run in shared cloud infrastructure. Private prompts, models or media you upload could theoretically be accessed by platform operators or cloud providers.
Delivering zero-knowledge storage and client-side encryption is our next top engineering priority. Until this ships, please avoid storing highly-sensitive or regulated data on StationThis.
flowchart TD
subgraph Client Platforms
TG["Telegram Bot"]
DC["Discord Bot"]
WEB["Web Canvas / SPA"]
end
TG ---|REST / WebSocket| API
DC ---|REST / WebSocket| API
WEB ---|REST / WebSocket| API
subgraph API Layer
INT["Internal API (auth required)"]
EXT["External API (public endpoints)"]
end
INT <---> SVC["Core Services"]
EXT --> SVC
subgraph Core Services
COMFY(ComfyUIService)
WF(WorkflowsService)
EXEC(WorkflowExecutionService)
POINTS(PointsService)
MEDIA(MediaService)
OPENAI(OpenAIService)
STORAGE(StorageService)
CREDIT(CreditService)
UTILS(ToolRegistry\nUserSettingsService)
end
SVC --> DB[(Mongo / R2)]
CREDIT <---> ETH[(Ethereum)]
| Path | Purpose |
|---|---|
app.js |
Application entry – initialises DB, Core Services, Platforms & WebSocket server |
src/core/ |
Platform-agnostic services, init logic & dependency injection |
src/platforms/ |
Adapters for Telegram, Discord & Web (Express) |
src/api/ |
Internal & External API routers (mounted by app.js) |
src/workflows/ |
Platform-agnostic business workflows |
public/ |
Web frontend assets (static HTML/CSS/JS) |
roadmap/ |
Source of truth for planning – master outline, roadmap, feature folders, templates & guides |
archive/ |
Legacy implementation kept for reference |
-
Install deps
npm install
-
Create
.env– copy.env-exampleand fill required keys:TELEGRAM_TOKEN=xxxx DISCORD_TOKEN=xxxx INTERNAL_API_KEY_SYSTEM=super-secret ETHEREUM_RPC_URL=https://... ETHEREUM_SIGNER_PRIVATE_KEY=0x... MONGO_PASS=mongodb+srv://user:pass@cluster/db
-
Start Dev Environment
./run-dev.sh
This helper script will:
• Export all variables from your.envinto the current shell session
• Unlock the keystore’s private key usingKEYSTORE_PASSWORD(or prompt you interactively)
• Launch the app with Nodemon so that code changes hot-reload during development• Web UI → http://localhost:4000
• Internal API → http://localhost:4000/internal
• External API → http://localhost:4000/api/v1
The bot signs-in to Telegram/Discord automatically.
We run a single-node instance on a DigitalOcean Droplet with the following spec:
| Image | Size (vCPU / RAM / Disk) | Region | Example Public IP |
|---|---|---|---|
| Ubuntu Docker 22.04 | 1 vCPU, 1 GB, 25 GB SSD ($6 / mo) |
NYC1 |
(assigned on creation) |
Steps to deploy a fresh droplet:
- Create Droplet – choose the Docker on Ubuntu 22.04 Marketplace image and the specs above. Enable IPv4 (mandatory), IPv6 / VPC networking if required.
- SSH in
ssh root@<DROPLET_IP>
- Install Git & clone repo
apt update && apt install -y git git clone https://github.com/<your-org>/stationthis.git cd stationthis
- Prepare secrets
• Copy your
.envto the droplet (e.g.scp .env root@<DROPLET_IP>:~/stationthis/).
• Copy thekeystore.jsonfile referenced byETHEREUM_KEYSTORE_PATH.
• EnsureKEYSTORE_PASSWORDis present in the.env. - Deploy
The script builds a production Docker image, runs database migrations (if any) and starts the container in detached mode.
./deploy.sh
- Update / Redeploy
The existing container is replaced with an updated image with zero downtime.
git pull ./deploy.sh
The droplet runs an edge Caddy server (installed via the official script or Docker). Caddy automatically provisions free Let’s Encrypt certificates and forwards traffic to the app container.
- Ensure DNS
A/AAAArecords for your domain point to the droplet IP. - Place a
Caddyfilein/etc/caddy/Caddyfile(or the repo root if using Docker) similar to:
yourdomain.com, www.yourdomain.com {
encode zstd gzip
reverse_proxy hyperbot:4000
log {
output file /var/log/caddy/access.log
}
}- Reload Caddy after any change:
sudo systemctl reload caddyWith Caddy in front, your app is served over HTTPS at https://yourdomain.com.
For defence-in-depth you should also restrict inbound traffic at the droplet or Cloud-Firewall layer so only the services you actually expose are reachable.
| Protocol | Port | Source | Purpose |
|---|---|---|---|
| TCP | 22 | Your workstation(s) only | SSH administration |
| TCP | 80 | 0.0.0.0/0, ::/0 |
HTTP → Caddy |
| TCP | 443 | 0.0.0.0/0, ::/0 |
HTTPS → Caddy |
DigitalOcean makes this easy via Networking → Firewalls → Create:
- Add a new rule set with the table above.
- Attach the firewall to your droplet.
Finding “your workstation IP”
curl -s https://ifconfig.me
# or
dig +short myip.opendns.com @resolver1.opendns.comIf you commonly connect from several places, create multiple rules (one per public IP). For a small office range you might use a CIDR like 203.0.113.0/28.
This complements the container-level hardening already provided by deploy.sh (--cap-drop ALL, --security-opt no-new-privileges, private Docker network with no published ports).
- Create a
ToolDefinitionJSON describing inputs, outputs, cost & executionStrategy. - Drop it into
src/core/tools/definitions/(or register dynamically). - Restart the app → ToolRegistry auto-loads and:
• Generates Telegram
/command
• Appears in Web Canvas sidebar
• Exposed via/api/v1/tools/registryendpoint.
See ADR-004-ToolRegistry for full schema.
coming...
We follow the collaborative rules in roadmap/_guides/AGENT_COLLABORATION_PROTOCOL_v3.md.
All pull-requests must:
- Start the title with
[roadmap:<epic>/<module>](see PR template). - Update the relevant module row in
roadmap/master-outline.md. - Append notes to the Implementation Log of any affected ADR (or create a new ADR using the template).
- Create a Handoff file in the current sprint folder summarising work.
Refer to roadmap/_guides/WORKFLOW_DECISION_TREE.md for a quick decision flow (small fix vs large feature).
StationThis is released under the vpl License – see LICENSE for details.