External Integrations
Analysis Date: 2026-05-05
APIs & External Services
GitHub Releases API:
- Betaflight firmware — checks https://api.github.com/repos/betaflight/betaflight/releases/latest
- Used by: betaflight_release agent check in frames/whoop_1s_65mm.crumbframe.json
- Auth: None (unauthenticated public API, rate-limited to 60 req/hr)
- Interval: daily
- Bash command: curl -s https://api.github.com/repos/betaflight/betaflight/releases/latest | jq -r '.tag_name'
- ExpressLRS firmware — checks
https://api.github.com/repos/ExpressLRS/ExpressLRS/releases/latest - Used by:
elrs_releaseagent check inframes/whoop_1s_65mm.crumbframe.json - Auth: None (unauthenticated public API)
- Interval:
weekly - Bash command:
curl -s https://api.github.com/repos/ExpressLRS/ExpressLRS/releases/latest | jq -r '.tag_name'
Shop Availability Check:
- RC Hangar 15 — https://shop.rc-hangar15.de/?s={manufacturer}+{model}
- Used by: product_availability agent check in frames/whoop_1s_65mm.crumbframe.json
- Auth: None (HTTP status code check only)
- Interval: weekly
- Action: sets components.*.available = false if HTTP 404 returned
- Bash command: curl -o /dev/null -s -w '%{http_code}' 'https://shop.rc-hangar15.de/?s={q}'
Partner API (declared, not yet implemented):
- partner_price_update check (type partner_api) is declared in frames/whoop_1s_65mm.crumbframe.json
- No bash field — currently skipped by doktor.sh
- Partner: rc_hangar15
- Interval: monthly
Data Storage
Databases:
- None. All data is flat JSON files on filesystem.
- Frame data: frames/*.crumbframe.json
- Partner database: partners/partners.json
- Agent check results: .doktor_results.json (project root, written by doktor.sh)
File Storage:
- Local filesystem only. No cloud storage.
Caching:
- None formal. .doktor_results.json acts as a lightweight result cache with checked_at timestamp.
Authentication & Identity
Auth Provider:
- None. No user authentication anywhere in the system.
Monitoring & Observability
Error Tracking:
- None. doktor.sh exits with code 1 on fatal errors and prints to stdout.
Logs:
- .doktor_results.json stores last check results per frame in JSON format.
- Fields: frame, checked_at (ISO8601), checks (keyed by check ID with status and optional result)
CI/CD & Deployment
Hosting:
- Static files. Target: crumbair.crumbforest.io (referenced in schema/$id and $schema fields in frame files)
- Schema URL: https://crumbair.crumbforest.io/schema/crumbframe.v1.json
CI Pipeline:
- Not detected. No .github/workflows/ directory. Validation is manual via doktor.sh.
Environment Configuration
Required env vars:
- None. All config is embedded in JSON data files.
Secrets location:
- None. No secrets in this system.
Webhooks & Callbacks
Incoming:
- None.
Outgoing:
- notify_channel: "crumbair_updates" is declared in the betaflight_release agent check — implementation not yet present in doktor.sh (notify action type not handled).
Web Renderer External Resources
Google Fonts:
- Outfit font family loaded from https://fonts.googleapis.com/css2?family=Outfit:wght@300;500;700&display=swap
- Used in web/index.html and web/style.css
Integration audit: 2026-05-05