惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

IT之家
IT之家
腾讯CDC
博客园 - Franky
S
SegmentFault 最新的问题
美团技术团队
阮一峰的网络日志
阮一峰的网络日志
J
Java Code Geeks
Y
Y Combinator Blog
Engineering at Meta
Engineering at Meta
Microsoft Security Blog
Microsoft Security Blog
MongoDB | Blog
MongoDB | Blog
I
InfoQ
T
Tailwind CSS Blog
Hugging Face - Blog
Hugging Face - Blog
B
Blog RSS Feed
博客园 - 叶小钗
博客园_首页
有赞技术团队
有赞技术团队
雷峰网
雷峰网
量子位
小众软件
小众软件
月光博客
月光博客
U
Unit 42
D
DataBreaches.Net

DEV Community

Authentication Security Deep Dive: From Brute Force to Salted Hashing (With Java Examples) Why AI Systems Don’t Fail — They Drift Spilling beans for how i learn for exam😁"Reinforcement Learning Cheat Sheet" I Replaced Chrome with Safari for AI Browser Automation. Here's What Broke (and What Finally Worked) How Python Borrows Other People's Work The $40 Architecture: Processing 1 Billion API Requests with 99.99% Uptime Vibe Coding: A Workflow Guide (From Zero to SaaS) Most webhook security guides protect the wrong side. The scary part is delivery. Headless CMS for TanStack Start: Build a Blog with Cosmic EU Age Verification App "Hacked in 2 Minutes" — What Actually Happened Comfy Cloud’s delete function does not actually remove files Running AI Models on GPU Cloud Servers: A Beginner Guide Event-driven media intelligence with AWS Step Functions and Bedrock I scored 500 AI prompts across 8 quality dimensions — here's what broke How to Call Google Gemini API from Next.js (Free Tier, No Backend Needed) The Portal Protocol: Reclaiming Human Connection in the Age of AI How to Fix Your Team's Scattered Knowledge Problem With a Self-Hosted Forum Intro to tc Cloud Functors: A Graph-First Mental Model for the Modern Cloud Designing Multi-Tenant Backends With Both Ownership and Team Access I Built a Neumorphic CSS Library with 77+ Components — Here's What I Learned PostgreSQL Performance Optimization: Why Connection Pooling Is Critical at Scale Cómo construí un SaaS multi-rubro para gestionar expensas en Argentina con FastAPI + Vue 3 🚀 I Built an Ethical Hacking Scanner Tool – Open Source Project I Replaced /usage and /context in Claude Code With a Single Statusline A Pythonic Way to Handle Emails (IMAP/SMTP) with Auto-Discovery and AI-Ready Design I Collected 8.9 Million Polymarket Price Points — Here's What I Found About How Markets Really Move EcoTrack AI — Carbon Footprint Tracker & Dashboard Everyone's Using AI. No One Agrees How. 5 self-hosted ebook managers worth trying in 2026 Building Your First AI Agent with LangChain: From Chatbot to Autonomous Assistant
I Built a Flask Dashboard That Aggregates 60+ Indie Hacke...
孫昊 · 2026-05-07 · via DEV Community

孫昊

TL;DR: Single-pane view of every indie hacker asset (paste-ready content, products, roadmaps, audit results, revenue, ASC build state) auto-generated from filesystem + APIs. ~600 lines of Flask. Saves 30+ min/day of "what's the state of things" overhead.


The problem: too many silos

By Day 60 of my indie experiment I had:

  • 50+ paste-ready dev.to articles in reports/
  • 23+ Substack newsletters
  • 6 Gumroad SKUs
  • 4 iOS apps with build state in ASC API
  • 9 LIVE site pages
  • 12 ops scripts
  • 30+ commits across week
  • 33 LIVE URLs to verify

Looking at all this required: 5 terminal windows, 3 browser tabs, 2 API calls, manual mental aggregation. ~30 min/day "checking state."

So I built a dashboard.

Architecture

Single Flask app, ~600 lines:

dashboard/
├── app.py              # Flask routes
├── manifest_scan.py    # YAML frontmatter aggregator
├── asc_api.py          # Apple ASC JWT helper
├── gumroad_api.py      # Gumroad REST client
├── verify_urls.py      # HTTP 200 audit
├── revenue_state.py    # cross-channel revenue aggregator
├── templates/
│   ├── index.html      # 3-pane main view
│   ├── audit.html      # URL audit table
│   └── revenue.html    # revenue dashboard
└── data/
    ├── asc_status.json # cached, refreshed hourly
    └── audit.json      # cached, refreshed daily

Enter fullscreen mode Exit fullscreen mode

The 3-pane main view

┌──────────────────┬──────────────────┬──────────────────┐
│ TODO             │ User check items │ Quick run scripts│
│ (pending tasks)  │ (manual actions) │ (run via button) │
├──────────────────┼──────────────────┼──────────────────┤
│ [Publish #51-56] │ [✓ Apple email?] │ [▶ daily_brief]  │
│ [Reddit post]    │ [✓ Gumroad sale?]│ [▶ asc_status]   │
│ [B2B outreach]   │ [✓ DM reply?]    │ [▶ verify_urls]  │
└──────────────────┴──────────────────┴──────────────────┘

Enter fullscreen mode Exit fullscreen mode

3 panels, 3 actions. Not a Markdown viewer — it's a control panel.

Key endpoints

@app.route('/api/audit')
def audit_urls():
    """HTTP 200 verifier — runs across all LIVE assets"""
    urls = scan_for_live_urls()  # finds Gumroad/Substack/dev.to/Site URLs
    results = []
    for url in urls:
        try:
            r = requests.head(url, timeout=10, allow_redirects=True)
            results.append({'url': url, 'status': r.status_code, 'ok': r.status_code == 200})
        except Exception as e:
            results.append({'url': url, 'status': 'ERR', 'ok': False, 'error': str(e)[:80]})
    ok = sum(1 for r in results if r['ok'])
    return jsonify({'total': len(results), 'ok': ok, 'fail': len(results) - ok, 'details': results})

@app.route('/api/revenue')
def revenue():
    """Aggregate revenue across all channels"""
    return jsonify({
        'gumroad': gumroad_total(),
        'asc_iaps': asc_iap_total(),
        'b2b_consulting': b2b_revenue_csv(),
        'affiliates': affiliate_revenue(),
        'total': sum_all(),
    })

@app.route('/api/asc-status')
def asc_status():
    """Cached Apple ASC build state — refreshed hourly via cron"""
    with open('data/asc_status.json') as f:
        return jsonify(json.load(f))

Enter fullscreen mode Exit fullscreen mode

Caching strategy

  • Audit cache: 24h TTL (URLs rarely break in 24h)
  • ASC build state cache: 1h TTL (build state refreshes via hourly cron)
  • Gumroad sales cache: 5 min TTL (real-time enough for indie scale)
  • Manifest scan: no cache, scans on every request (fast — 60 files in <100ms)

What this lets you do in 30 sec/morning

  1. Open dashboard
  2. Glance at 3 panes
  3. Click 1 button (e.g. "▶ daily_brief")
  4. See: "5 Gumroad SKUs LIVE, all 4 apps build VALID, 33/33 URLs OK, 0 stale assets, 1 user action pending: paste Reddit"

You don't need to remember. You don't need to check 5 different places. The dashboard is the truth.

What I'd skip if rebuilding

  • Real-time WebSockets for revenue (overkill — polling is fine)
  • Per-asset detail pages (just link to the file directly)
  • Authentication (it's localhost — useless)
  • Service-worker offline support (you'll always have wifi when you check)

What I'd keep:

  • 3-pane layout (TODO / user / scripts)
  • Frontmatter-driven asset list
  • Click-to-run script buttons
  • Caching for slow APIs

Source

Full Flask dashboard with all 6 endpoints + 3-pane view + caching:

AutoApp Dashboard ($39) is literally this dashboard. Drop-in for any indie hacker workflow with markdown content + API-aggregated state.


If you spend 30+ min/day "checking state" across silos, you have a dashboard-shaped problem. Cost: 4 hours of dev. Payback: 30 min/day = 4 hours / week.