crypto-empire
Autonomous crypto revenue engine — flash loan arbitrage, Telegram bot, and web dashboard. Polar subscription at $9.99/mo.
PROBLEM
Crypto information is scattered across a dozen ad-saturated sites: one for prices, one for gas, one for whale moves, one for yields, one for launches. Retail bots do /price and stop there. I wanted the Bloomberg-terminal experience — everything on one page, and everything queryable — without a SaaS dashboard aesthetic, and I wanted it running on my own hardware with a real billing path in front of it.
APPROACH
Build it as two products sharing one backend. The web dashboard is a live market newspaper: prices, a multi-chain gas tracker, whale moves, DEX volumes, yield pools, launch calendars — art-directed as a night-print broadsheet rather than yet another admin panel. The Telegram bot puts the same intelligence in your pocket, from instant price lookups to wallet profiling. Everything the dashboard shows is also exposed as a public REST API with free and premium tiers, so the product composes instead of walling off.
Monetization is wired for real: Polar.sh subscriptions with webhook verification, an ad-placement CRUD, sponsored spotlights, and affiliate placements — and the stated status is $0 revenue. Live product, no subscribers yet.
ARCHITECTURE
The web tier is Python 3.11 on Flask 3 with Gunicorn, server-side Jinja2 templates and vanilla JS — deliberately no JS UI framework, so the whole design system lives in one Python module and every page renders server-side. On-chain reads go straight to public Ethereum RPCs (eth_gasPrice, eth_call, eth_getBalance); market data comes from CoinGecko, DeFiLlama, Alternative.me, and CoinTelegraph RSS, cached in SQLite.
The bot runs in dual mode: an always-on polling daemon on my home server under systemd (dominion-bot.service), and a webhook path on Vercel for the web tier's session flows. Its command surface is measured, not vibes: 52 command aliases, 72 symbol shortcuts, and 10 polling commands behind one parser. Five GitHub Actions workflows keep it alive — monitor, whale tracker, check-alerts, distribution, and a secret-scan — so an outage or a leaked credential is caught by a machine, not by a user.
PROOF
- 54 REST routes — the README's earlier "30+ endpoints" was an undercount; the measured route count is 54, all public, with free (100 req/day) and premium (10K req/day) tiers.
- Bot surface measured: 52 command aliases + 72 symbol shortcuts + 10 polling commands — the "50+ commands" claim understates what the parser actually wires.
- 5 GitHub Actions workflows — corrected from 4 during claim verification (the secret-scan workflow exists); the correction is pushed to the repo, not just claimed here.
- Polar.sh integration with full webhook verification for the $9.99/mo premium tier — and the honest number is $0 revenue: no subscribers yet.
STACK
Python 3.11 · Flask 3 + Gunicorn · server-side Jinja2 (no JS framework) · python-telegram-bot (polling + webhook dual mode) · SQLite caching · CoinGecko / DeFiLlama / Alternative.me / CoinTelegraph · public Ethereum RPCs · Polar.sh billing with webhook verification · Vercel (web) + systemd daemon (bot) · 5 GitHub Actions workflows · print-editorial design system (Fraunces + IBM Plex Mono, zero cards, zero radii, zero gradients).
WHAT I'D DO DIFFERENTLY
SQLite is fine at this traffic and wrong at the next tier — the alert and subscription state would move to Postgres before I add a second instance, not after. The bot's parser grew aliases organically; a table-driven registry from the start would have made the 52-alias surface auditable instead of measured-by-script. And I'd ship the whale tracker's alerting path before its dashboard: the polling cron exists and works, but the product moment — getting pinged when a whale moves — is one subscription away from the value, and I built the pretty page first. The design system, though, I'd keep exactly as is: the night-print aesthetic is the reason the dashboard reads like a product instead of a template.