13 projects shipped on a single $5 VPS over ~30 days. Solo dev, no team, no fundraising. Everything below is publicly accessible right now.
| Total projects | 13 |
| Public URLs (HTML pages) | ~75 |
| Public API endpoints | ~30 |
| Downloadable files | 23+ (2 OSS sdist + 5 product deliverables + 21 dataset archives) |
| Sitemap URLs | ~75 |
| Total unit tests | ~210 (92 FF main + 14 OSS + 22 signals + 14 research + 27 cronviz + others) |
| Autonomous systemd timers | 3 (signals_bot 1h · research daily 06:00 · dataset daily 04:00) |
| Stack | Python 3.12 · Flask · SQLite WAL · systemd · vanilla HTML |
| Resident memory (all 5+ services) | ~80 MB |
| Cumulative downtime | 0 minutes |
Cross-exchange perpetual funding rate scanner across 20 venues.
Real-time data API + dashboard pulling funding rates every 5 minutes from 20 exchanges (~6,800 USDT-margined symbols). Stddev-based divergence ranking with persistence filter, slippage-aware net APY, per-symbol funding interval correctness. 5 systemd services on a single $5 VPS.
20 exchanges · ~6,800 perp symbols · 5-min refresh · 92 unit tests · 24-path OpenAPI
★ Now (canonical landing) · Heatmap · JSON snapshot · vs Coinglass · Pricing
Hourly cross-venue funding rate signal alerts to a public feed and Telegram.
An autonomous bot that pulls /api/funding/divergence?signed=true every hour, applies a noise filter (drops cap-floor outliers, requires persistence), picks the top 1-3 actionable signals, posts to Telegram, and appends to a public JSON feed served at /signals. Cooldown layer prevents re-posting the same dislocation. systemd timer every hour.
22 unit tests · 1h systemd timer · cooldown 6h with growth override
Auto-generated daily research blog from live cross-venue data.
A Python generator that runs daily at 06:00 UTC, pulls FF data + the signals feed, derives structured insights (sentiment, top dislocations, top arbs, top volume, extremes), and writes a Markdown research post + rebuilds the index. Each post is its own URL for long-tail SEO. Daily systemd timer.
14 unit tests · daily 06:00 UTC timer · stdlib only
Server-rendered utility calculators for active perp traders.
10 small server-rendered HTML calculators, each at its own URL for long-tail SEO. Funding fee, annualization, position size, cross-venue fees, liquidation price, perpetual basis, PnL, breakeven, Kelly criterion. No JS, no DB. Each tool ships with the launch waitlist form embedded.
10 calculators · 6 sitemap entries · waitlist embedded on every tool
Curated directory of infra resources for solo devs and indie hackers.
Editorial directory across 8 categories (hosting, email, payments, auth, monitoring, database, analytics, frontend hosting) with 35 entries total. Each entry has free badge + pricing + an honest take. No paid placements yet. The takes reflect what I actually use across my own projects.
8 categories · 35 curated entries · 9 sitemap URLs
Recipe book of production-tested patterns for shipping side projects on a $5 VPS.
17 of 30 planned patterns drafted, organized into 6 themes. The 5 free patterns (systemd unit, SQLite WAL, rate limiting, ThreadPoolExecutor, Telegram bot) are ~5,000 words and read like real reference material. Full pack is a €19 one-time purchase via Stripe — instant download after checkout.
17/30 patterns · ~17,000 words · 5 free, 25 paid · CC BY-SA + MIT
24h uptime tracker for the 20 perpetual exchanges, with per-venue SEO landing pages.
Computes 24h uptime per exchange by bucketing the funding_rates table into 288× 5-min slots and counting hits. Status badges (UP/STALE/DOWN), average uptime, per-venue history page. No instrumentation needed — derived from existing collector data. Each venue has its own /status/<exchange> URL for long-tail search intent.
20 venues tracked · 288 buckets/24h · 21 sitemap URLs · auto-refresh 60s
Packaged historical funding-rate dataset, daily rebuild, CC BY 4.0.
Daily rebuild of the full funding_rates table into a downloadable CSV.gz archive (combined + per-exchange × 20). Auto-generated README + manifest.json with row counts, date ranges, and SHA256 checksums. ~2.58M rows. Stdlib only (csv, gzip, json, sqlite3). Daily systemd timer at 04:00 UTC. Permissive license (CC BY 4.0) so researchers can use it without contacting me.
~2.58M rows · daily 04:00 UTC rebuild · CC BY 4.0 · 21 archives (combined + per-exchange)
Surfaces coins likely being delisted via multi-venue funding rate cap-floor signals.
When a perpetual is being delisted, the order book becomes thin and one-sided, and funding rate pins at the venue's hard cap (~±2000% APY). When ≥2 venues simultaneously show this pattern on the same coin, it's a strong structural signal of impending delisting. /delistings surfaces these — the OPPOSITE filter of /signals (which drops cap-floor as untradeable noise). New audience use case: traders avoiding delisting traps before sizing positions.
≥1500% APY threshold · ≥2 venues required · sorted by (capped count, max |APY|) · 5-min refresh
wttr.in-style plaintext at /t/<base> — built for curl pipelines and shell scripts.
A 6-line plaintext response designed for terminal humans and shell scripts. `curl http://178.104.60.252:8083/t/btc` returns base, average annualized APY, sentiment label, venue count, freshness, and the high/low spread legs — the same data as the JSON API but in a shape that pipes cleanly through awk/grep/cut. Different audience (devs/ops/sysadmins) and different content-type (text/plain) from the 11 prior projects which all serve HTML/JSON/SVG.
any base · text/plain · 60s cache · CORS-open · pipes cleanly through awk/cut/grep
Plaintext index · BTC plaintext · ETH plaintext · SOL plaintext
Long-tail SEO comparison pages: BASE_A vs BASE_B funding rate side-by-side.
Auto-generated coin-vs-coin comparison pages at /compare/<a>/<b>. Each page targets a specific search query like 'btc vs eth funding rate today', server-rendered with OG tags and a verdict line ('X is the more crowded long'). Multiplies the indexable surface by 100s of pages from existing data — no new collection. Distribution mechanism is structurally distinct: long-tail SEO is the only channel that compounds without credentials, since Google indexes autonomously.
any base × any base · 12 prebuilt pairs in sitemap · auto-refresh 5min · OG tags
Embeddable SVG badges of live funding rates — markdown-friendly, work in any GitHub README or dev.to article.
Shields.io-style server-rendered SVG badges showing the cross-venue average funding rate for any base coin. Each badge is ~900 bytes, cached 60s, CORS-open, embedded as a markdown image (works where iframes don't: GitHub, dev.to, Reddit, Notion, Substack). Distribution model is structurally distinct from the rest of the portfolio: every embed is an outbound backlink, the host's audience becomes ours.
any base coin · ~900 bytes/badge · 60s cache · CORS-open
Landing + copy-paste snippets · BTC badge · ETH badge · Market sentiment badge
Stdlib-only CLI for unified cron + systemd timer observability.
Scans /etc/crontab, /etc/cron.d/, /etc/cron.{hourly,daily,weekly,monthly}, /var/spool/cron/, and systemctl list-timers. Optional --history flag annotates each job with its last-run timestamp from journalctl + systemctl show. Zero dependencies. 27 unit tests. MIT.
27 unit tests · stdlib only · 5 source files · 4 output formats (table/json/tsv/markdown)