🏠 Dashboard
Loading…
3
🔥 Day Streak
73
Tasks Shipped
7
Live Sites
—
Server Uptime
🌐 Sites Status
oc.beyond20.ca
Homepage
pool.oc.beyond20.ca
Sean's Pool
ianspool.oc.beyond20.ca
Ian's Pool
dad.oc.beyond20.ca
Dad Dashboard
kira.oc.beyond20.ca
Kira's Page
games.oc.beyond20.ca
Games
cc.oc.beyond20.ca
Mission Control ← you are here
📅 Today
Loading…
🏒 Pool Quick View
🖥️ System
Live server health — auto-refreshes every 30s
⚡ CPU
Usage—
Load avg (1m)—
🧠 Memory
Used—
Available—
💾 Disk
Used—
Free—
💾 Storage Volumes
/ (root) — 63 GB
7.2 GB used
54 GB free
/boot — 881 MB
115 MB used
704 MB free
⏱️ Uptime & Info
Loading…
📋 Cron Jobs
Loading last run times…
Sean's Pool — pool_update.py
Every 30 min
▼
Central orchestrator for Sean's hockey pool. Runs every 30 minutes and decides what to update based on the time of day (ET). News & advisor run from 7 AM–1 AM. Points (game results) update during active game hours — weekdays 6 PM–1:30 AM, weekends 12 PM–1:30 AM, plus a full overnight rebuild at 2 AM daily.
📄 pool_advisor.py
Fetches player news via Brave Search API, checks for injuries, TOI drops, and DNP patterns. Writes advisor data + news items to data.json and news-data.json. Sends urgent alerts if needed.
📄 update_days.py
Pulls each player's game schedule and results from the NHL API. Updates the days[] array in data.json with points scored, future games (fut), or did-not-plays (dnp). Today's unplayed games are marked fut until the game finishes.
📄 fetch_stats.py
Fetches detailed per-game stats (G, A, TOI for skaters; GA, SV%, decision for goalies) from the NHL API and writes them to stats[] in data.json. Used for stat tooltips and PPG calculations.
*/30 * * * * /usr/bin/python3 /var/www/pool.oc.beyond20.ca/pool_update.py >> /var/log/pool_update.log 2>&1
Ian's Pool — pool_update.py
Every 30 min
▼
Identical orchestrator to Sean's pool but runs against Ian's data directory (/var/www/ianspool.oc.beyond20.ca/). Fully separate scripts, data files, and logs — no shared state with Sean's pool. Ian's roster: IanK (Thompson, Quinn, Barzal, Tkachuk, etc.).
*/30 * * * * /usr/bin/python3 /var/www/ianspool.oc.beyond20.ca/pool_update.py >> /var/log/ianspool_update.log 2>&1
Kira's Daily Image — kira_image.py
Daily 11:00 UTC (6 AM ET)
▼
Generates Kira's Picture of the Day using HuggingFace's Stable Diffusion XL API. Rotates through 36 kid-friendly, science-themed prompts. Saves the image as kira-image.jpg and metadata to kira-image-meta.json in the dad dashboard directory. Displayed on kira.oc.beyond20.ca.
🖼️ Image generation
Uses HuggingFace SDXL (stabilityai/stable-diffusion-xl-base-1.0) via the router endpoint. Prompts are curated for a smart 6-year-old — science, animals, space, nature. Safe for kids, no people/faces.
0 11 * * * HUGGING_FACE_API_KEY=[hidden] /usr/bin/python3 /var/www/dad.oc.beyond20.ca/kira_image.py >> /var/log/kira_image.log 2>&1
Mission Control System API
systemd service (always on)
▼
Tiny Python HTTP server running on 127.0.0.1:8765. Serves /api/system with live CPU, RAM, disk, uptime, and cron log data. Proxied through nginx so this page can read it. Managed by systemd (cc-system-api.service) — auto-restarts on failure.
systemctl status cc-system-api # always active, restarts on failure
🏒 Pool Hub
FEB–MAR 2026 pool season
Sean's Pool
pool.oc.beyond20.ca
👤 16 players · 14 skaters + 2 goalies
🔄 Trades: 2 skater · 2 goalie remaining
📊 Updates every 30 min
🔴 Trade #1: McMichael → bench, Rossi → active
📝 Pool Notes
• Trades = bench ↔ active swaps only (no external acquisitions)
• Goalie scoring: Win=1pt · Win+1GA=2pts · Loss+1GA=1pt · Shutout win=4pts
• Skater scoring: G+A pts · OT goal=+1 bonus · SO winner goal=+1 bonus
• PROJ column: active players get pts + PPG × remaining games; bench = pts only
• Pool month is its own entity — points and bench lines reset monthly
• 🔥 Hot = top 4 players by raw last-5 pts across full roster
🔗 Quick Links
All your sites and tools in one place
🌐 Sites
🛠️ Tools & Services
✅ To-Do
Persistent — saved in localStorage
💡 Ideas
Scratch pad — saved in localStorage
New Idea
📋 Dev Log
What Arti and Sean have built together
3
🔥 Day Streak
73
Total Tasks
3
Days Active
Mar 7, 2026
VM upgrade, API keys, avatar gen, pool deep-dive, Ian's pool, Mission Control
- 🔧 InfraUpgraded Azure VM from B2s → B2ls_v2 (2 vCPU, 4GB RAM) — same price, 41% faster single-core
- 📡 DataBuilt benchmark.py — CPU, disk, Node baseline captured
- 🔧 InfraAdded Gemini API key (gemini-2.5-flash) + HuggingFace token to systemd env
- 🆕 CreateGenerated Arti avatar via HuggingFace SDXL — teal circuits, glowing eyes; Sean selected arti_v77.jpg
- ✨ EnhanceRebuilt homepage hero with Arti identity — replaced generic domain header
- ✨ EnhanceReplaced 🦾 with 🔵 sitewide — consistent teal brand
- ✨ EnhanceRebuilt dad dashboard — live clock, 3-day forecast, live NHL scores, Kira's Corner
- 🆕 CreateBuilt Kira's Picture of the Day — 36 rotating SDXL prompts, cron at 6 AM ET daily
- 🔧 InfraPassword protected oc.beyond20.ca with nginx basic auth (later removed)
- ✨ EnhanceHockey pool: bench_periods data model — date-aware bench status using [{from,to}] arrays
- ✨ EnhanceFixed PROJ column: active = pts + PPG projection; bench = pts only, no projection
- ✨ EnhanceFixed VIEW_INDICES capped to today — grid never shows future date columns
- 🤖 AutoBuilt pool_update.py orchestrator — single cron */30; smart scheduling for news vs stats
- 🤖 AutoFixed update_days.py: today's unplayed games → 'fut' not 'dnp'; added ABBREV_MAP for NHL API team names
- ✨ EnhanceAdvisor urgency thresholds: 🔴 >1.9pts gain, 🟡 1.2–1.9, 🟢 0–1.2, ⚪ negative
- ✨ EnhanceHot tab: ranks all 16 players by raw last-5 pts regardless of bench status; 🔥 flame badge in grid + bench chip
- 🐛 DebugFixed news race condition — moved news fetch inside data.json callback so PLAYERS is populated first
- 🆕 CreateBuilt Ian's pool at ianspool.oc.beyond20.ca — fully separate from Sean's (separate dir, scripts, cron, git)
- 🐛 DebugFixed Ian's pool: had Sean's hardcoded PLAYERS array; replaced with empty array + rebuild from data.json
- 📡 DataRebuilt Ian's data.json with correct IanK roster (Thompson, Quinn, Barzal, Tkachuk, etc.) from Excel spreadsheet
- ✨ EnhanceGoalie scoring updated: Win+1GA=2pts, Loss+1GA=1pt — both sites recomputed
- ✨ EnhanceTrade pills moved to Bench section; removed from AI Advisor section
- ✨ EnhanceRemoved 🔥 Hot badge from AI Advisor swap cards — flame shown on player names only
- 🆕 CreateBuilt Mission Control (this page) at cc.oc.beyond20.ca — dashboard, system, pools, todo, ideas, dev log
- 🧠 MemoryNamed Kira's stuffed dog Biscuit 🍪
No tasks match this filter.
Mar 6, 2026
Hockey pool deep dive — roster, scoring rules, injury logic, news UI
- 📡 DataInvestigated Harley Feb 4 discrepancy — NHL API confirmed 0G 1A regulation, 1pt (admin error)
- ✨ EnhanceImplemented OT goal scoring rule (+1 bonus) — stored as otg in stats, fetched from NHL game-log API
- ✨ EnhanceImplemented shootout winner scoring (+1) — cross-references boxscore to confirm game ended in SO
- 📡 DataCorrected starting bench; added Rossi (VAN), Garland (CBJ), McMichael (WSH) — completing 16-player roster
- 🐛 DebugFixed STL "ST LOUIS" vs "ST. LOUIS" name mismatch — Holloway had 0 future games
- 🤖 Autopool_advisor.py: has_played_since() skips injury alerts if player played after news date
- 🤖 Autopool_advisor.py: TOI monitoring — 30%+ drop flagged significant, 15%+ watch; compound logic with injury news
- ✨ EnhanceInjured tab rebuilt — driven by ADVISOR_DATA, shows injury reason, bench status, clickable news links
- ✨ EnhanceNews tabs: "Injuries & Returns" + "General" — 1-week cutoff applied
- 🐛 DebugCleared Draisaitl urgent flag — he was playing, alert was stale
- 📡 DataBackfilled Mar 1–6 game results from NHL stats API — Excel only had Feb data
- 🧠 MemoryUpdated README.md with full 16-player roster, nhle_id table, feature list, pipeline docs
No tasks match this filter.
Mar 5, 2026
Day 1 — Full stack from zero. Big day.
- 🔧 InfraSet up DNS, nginx, and SSL for oc.beyond20.ca and all subdomains
- 🆕 CreateBuilt homepage at oc.beyond20.ca — reworked as mission control dashboard
- 🆕 CreateBuilt hockey pool tracker at pool.oc.beyond20.ca (built and rebuilt 3+ times)
- ✨ EnhanceHeatmap grid: sticky columns, status dots, month tabs, hamburger menu, bench advisor
- 📡 DataSet up NHL API integration — stats sync and live score scripts
- 🤖 AutoCron: daily NHL stat sync (1 AM ET) + live updates (every 5 min 7–midnight)
- 🆕 CreateBuilt scores.oc.beyond20.ca — live NHL score dashboard with pool player highlights
- 🆕 CreateBuilt dad.oc.beyond20.ca — family dashboard with weather, countdowns, dad jokes
- 🆕 CreateBuilt games.oc.beyond20.ca — 6 classic browser games via subagent build
- 🆕 CreateBuilt news.oc.beyond20.ca — AI news aggregator, rebuilt nightly via cron
- 🧠 MemoryCreated Arti identity — IDENTITY.md, SOUL.md, USER.md
- 🆕 CreateSet up productivity tracking page (predecessor to this Dev Log)
- 🐛 DebugDiagnosed and fixed tool access issues on fresh OpenClaw install
- 🤖 AutoConfigured daily AI news briefing via Brave Search API
- 🔧 InfraConfirmed B2ts_v2 downgrade (1GB RAM) too risky — idle usage ~1.4GB, would OOM
- ✨ EnhanceReworked homepage: typing effect, featured card, project grid, stats strip
No tasks match this filter.
🧠 LLM Usage
Token tracking, free tier management, and model rotation strategy
🎯 Free Tier Strategy
1. Primary: GitHub Copilot (Claude Sonnet 4.6) — premium, covered by Sean's Copilot subscription
2. Free tier rotation: Gemini 2.5 Flash (free tier) → Brave Search (1000/mo free) → HuggingFace (free inference)
3. Future fallback: Self-hosted LLM (to be set up) when premium exhausted
💡 Goal: cycle API keys across free tiers to keep costs at $0 wherever possible
Claude Sonnet 4.6
via GitHub Copilot
via GitHub Copilot
PREMIUM
—
Sessions
—
Est. Tokens
∞
Limit
Main model for all Arti conversations. Covered under Sean's GitHub Copilot subscription — no per-token cost. Used for: planning, code, pool analysis, writing.
✅ Active · Default model
Gemini 2.5 Flash
Google AI Studio
Google AI Studio
FREE TIER
0
API Calls
1M
ctx window
1500/day
Free limit
Used for: kira_image.py prompt generation, news summaries, text tasks. Free tier: 1,500 req/day, 1M token context. Env var: GEMINI_API_KEY.
⬜ Available — not yet used for direct calls
HuggingFace SDXL
Stable Diffusion XL Base 1.0
Stable Diffusion XL Base 1.0
FREE TIER
1
Images Made
Free
Cost
~daily
Limit
Used for: Kira's daily image (kira.oc.beyond20.ca), Arti avatar generation. Rate limits apply on free inference tier — 1 image/call, ~few per hour. Env var: HUGGING_FACE_API_KEY.
✅ Active — kira_image.py runs daily at 6 AM ET
Self-Hosted LLM
To be set up — Ollama / llama.cpp
To be set up — Ollama / llama.cpp
PLANNED
—
Status
$0
Cost
∞
Requests
Future fallback when premium quota exhausted. Options: Ollama (Mistral 7B, Llama 3), llama.cpp server. Will auto-route when GitHub Copilot requests run low. Azure VM has 4GB RAM — constrained but usable for 7B quant.
⏳ Not yet configured
📝 Session Log
Manually log a session (auto-logging coming later)
🔧 Tools & APIs
Usage tracking for every external service Arti uses
Brave Search API
FREE · 2000/mo
~150
Used this month
~1850
Remaining
Loading…
Used by: pool_advisor.py (both pools) for player news. Throttled to every 8h per pool = ~64 searches/day max = ~1920/month (under 2000 cap). Key: BSA0… env var BRAVE_API_KEY.
HuggingFace Inference
FREE TIER
1
Images generated
SDXL
Model
Endpoint: router.huggingface.co/hf-inference. Used for Kira's daily image + Arti avatar generation. Free tier has rate limits but no hard monthly cap. Key: hf_… env var HUGGING_FACE_API_KEY.
NHL Stats API
FREE · UNLIMITED
~48×
Calls/day
$0
Cost
api-web.nhle.com — used by update_days.py and fetch_stats.py. Fetches game schedules, player stats, game logs, boxscores. Unofficial public API — no key required, no rate limit documented. Runs during active game hours.
Google Gemini API
FREE · 1500/day
0
Calls made
1500/day
Free limit
Model: google/gemini-2.5-flash. Text only (no Imagen). Used for: news summaries, prompt generation, analysis tasks. Free tier: 1,500 requests/day, 1M token context. Key: GEMINI_API_KEY env var.
GitHub Copilot API
SUBSCRIPTION
Daily
Usage
Copilot
Plan
Primary LLM gateway — routes to Claude Sonnet 4.6 (and Claude Opus 4.6 for sub-agents). Covered under Sean's GitHub Copilot subscription. All main Arti conversations go through this. No separate token cost.
Let's Encrypt / Certbot
FREE
8
Active certs
90 days
Renewal cycle
SSL certificates for all *.oc.beyond20.ca subdomains. Auto-renewed by certbot systemd timer. No cost, no rate limits under normal use. Domains: oc, pool, ianspool, dad, kira, games, mc + others.
📊 Usage Log
Log a tool usage event
📅 Cron History
All times in Eastern (ET). Click a day to see every run.
—
Total Runs
—
OK
—
Alerts Fired
—
Last Run (ET)
Run Calendar — March 2026
SUN
MON
TUE
WED
THU
FRI
SAT