System Status

Orchestrator: {{ (status.status || 'unknown').toUpperCase() }} Interval: {{ status.interval }}s
BrowserMgr active {{ status.browser_metrics.active_sessions }}/{{ status.browser_metrics.max_concurrency }} runs {{ formatNumber(status.browser_metrics.runs_total || 0) }} ok {{ formatNumber(status.browser_metrics.success_total || 0) }} err {{ formatNumber(status.browser_metrics.errors_total || 0) }} retry {{ formatNumber(status.browser_metrics.retries_total || 0) }} q.avg {{ status.browser_metrics.queue_wait_avg_ms || 0 }}ms
Total Fixtures
{{ formatNumber(stats.fixtures || 0) }}
Across {{ Object.keys(stats.by_source || {}).length }} sources
Total Markets
{{ formatNumber(stats.markets || 0) }}
Total Odds Tracked
{{ formatNumber(stats.odds || 0) }}

Crawler Operations

Sharpbook Makers
{{ plugin.alias.substring(0,2) }}

{{ plugin.alias }}

{{ plugin.last_success ? new Date(plugin.last_success).toLocaleTimeString([], {hour: '2-digit', minute:'2-digit'}) : 'Never' }}
SHARP {{ plugin.state }} {{ getCooldownLabel(plugin) }} {{ getStaleLabel(plugin) }}

{{ plugin.message }}

{{ formatHealth(plugin) }}
{{ formatNumber(stats.by_source?.[plugin.alias] || 0) }} DB
Softbook Sites
{{ plugin.alias.substring(0,2) }}

{{ plugin.alias }}

{{ plugin.last_success ? new Date(plugin.last_success).toLocaleTimeString([], {hour: '2-digit', minute:'2-digit'}) : 'Never' }}
{{ plugin.state }} {{ getCooldownLabel(plugin) }} {{ getStaleLabel(plugin) }}

{{ plugin.message }}

{{ formatHealth(plugin) }}
{{ formatNumber(stats.by_source?.[plugin.alias] || 0) }} DB

Recent Fixtures

Total: {{ formatNumber(totalFixtures) }}
Page {{ currentPage }}
Source Sport/League Match (Home vs Away) Start Time Updated
No data available.
{{ f.source_alias }}
{{ f.sport_name }}
{{ f.league_name }}
{{ f.home_team }}
VS
{{ f.away_team }}
{{ formatDate(f.start_time) }}
{{ formatDate(f.updated_at) }}

Site Analyzer & Plugin Generator

{{ analyzeError }}

{{ analyzeResult.success ? 'Analysis Complete' : 'Analysis Unconfirmed' }}

Decision: {{ analyzeResult.result.decision }}
Site Type: {{ analyzeResult.result.matched_template || analyzeResult.result.site_type || 'unknown' }}
API Base: {{ analyzeResult.result.api_base || '-' }}
Confidence: {{ Math.round((analyzeResult.result.confidence || 0) * 100) }}%
Reason: {{ analyzeResult.result.unknown_reason }}
Credential Debug
Backend received username: {{ analyzeResult.request_debug?.username_present ? `yes (${analyzeResult.request_debug?.username_length || 0})` : 'no' }}
Backend received password: {{ analyzeResult.request_debug?.password_present ? `yes (${analyzeResult.request_debug?.password_length || 0})` : 'no' }}
Auth probe attempted: {{ analyzeResult.result.debug?.auth_probe_attempted ? 'yes' : 'no' }}
Plugin Generated: {{ analyzeResult.plugin_path }}
Evidence
- {{ item }}
Top Candidates
{{ candidate.site_type }} {{ Math.round((candidate.confidence || 0) * 100) }}%
{{ candidate.api_base }}
{{ candidate.evidence[0] }}
Auth Probe Debug
{{ probe.site_type }} {{ probe.success ? 'success' : 'failed' }}
{{ probe.api_base }}
{{ item }}

{{ analyzeResult.message }}

Next steps: Add {{ analyzeAlias || analyzeResult.result.site_type }} to enabled_sites in your config.yaml and restart the orchestrator.

{{ analyzeRegisterMessage }}

Site Registry

{{ siteRegistryError }}
Loading registry...
No sites saved in registry yet.
Alias Type Visible State Profiles Source Action
{{ item.alias }} {{ item.site_type || '-' }} {{ item.enabled ? 'VISIBLE' : 'HIDDEN' }} {{ item.runtime?.state || 'UNKNOWN' }} {{ item.auth_profile_count || 0 }} (+{{ item.fallback_count }} fb) {{ item.source_kind || 'config' }}

Surebet Scanner

Mode
VS
{{ arbError }}

No arbitrage opportunities found for {{ arbSiteA }} vs {{ arbSiteB }}.

No overlapping fixtures found between {{ arbSiteA }} and {{ arbSiteB }}.

Match Market Site A Site B Profit% Stake A Stake B Expected
Start Time Sport & League Site A Match Name ({{ arbSiteA }}) Site B Match Name ({{ arbSiteB }}) Match Confidence Action
{{ formatDate(match.start_time) }}
{{ match.sport }}
{{ match.league_name }}
{{ match.home_team }} VS {{ match.away_team }} {{ match.home_team }} VS {{ match.away_team }} {{ (match.similarity_score * 100).toFixed(0) }}%
{{ filteredArbs.length }} opportunities found ({{ arbResults.filter(a => a.profit_pct > 0).length }} positive) Bankroll: ₩{{ formatNumber(arbBankroll) }}
{{ matchedFixtures.length }} overlapping fixtures detected AI Match Active ID Match Active
{{ selectedArb.market_type }} {{ formatPeriodLabel(selectedArb.period, selectedArb) }} Line: {{ selectedArb.line }} {{ selectedArb.profit_pct > 0 ? '+' : '' }}{{ selectedArb.profit_pct.toFixed(2) }}%
{{ selectedArb.home_team }} VS {{ selectedArb.away_team }}
{{ formatDate(selectedArb.start_time) }} {{ selectedArb.league || selectedArb.league_name }}
{{ side.alias }} {{ side.fixture_id }}
{{ market.name }} {{ market.type }}
TARGET
{{ odd.name }} {{ odd.line > 0 && market.type === 'handicap' ? '+' : '' }}{{ odd.line }}
{{ odd.price.toFixed(2) }}
{{ selectedFixture.source_alias }} {{ selectedFixture.sport_name }}
{{ selectedFixture.home_team }} VS {{ selectedFixture.away_team }}
{{ formatDate(selectedFixture.start_time) }} {{ selectedFixture.league_name }}

{{ modalError }}

No markets available for this fixture.

{{ market.name }} {{ market.type }}
{{ odd.name }} {{ odd.line > 0 ? '+' : '' }}{{ odd.line }}
{{ odd.price.toFixed(2) }}

Odds History

{{ chartLabel }}

Loading history...

Multi-Site Best Odds Scanner

Select 2+ sites to find best odds combinations
|
Audit pass {{ multiAuditSummary.pass || 0 }} warn {{ multiAuditSummary.warn || 0 }} fail {{ multiAuditSummary.fail || 0 }} last: {{ formatDate(multiAuditLastRunAt) }}
{{ multiError }}
{{ multiAuditError }}

Select sites and click Scan to find best odds combinations.

No arbitrage opportunities found.

Found {{ filteredMultiArbs.length }} opportunities across {{ multiSelectedSites.length }} sites
Match Market Audit Best Selection A Best Selection B Margin Profit% Stakes
{{ arb.home_team }} vs {{ arb.away_team }}
{{ arb.league }} · {{ arb.sport }} · {{ formatDate(arb.start_time) }}
{{ arb.market_type }} {{ arb.line }} [{{ formatPeriodLabel(arb.period, arb) }}] {{ arb.margin?.toFixed(4) }} {{ arb.profit_pct > 0 ? '+' : '' }}{{ arb.profit_pct?.toFixed(2) }}% {{ formatNumber(arb.stake_a) }} / {{ formatNumber(arb.stake_b) }} {{ formatNumber(arb.stake_home) }} / {{ formatNumber(arb.stake_draw) }} / {{ formatNumber(arb.stake_away) }}

Audit Detail

{{ multiAuditDetailArb.home_team }} vs {{ multiAuditDetailArb.away_team }}

{{ String(multiAuditDetail.status || 'unknown').toUpperCase() }} score {{ Number.isFinite(Number(multiAuditDetail.score)) ? Number(multiAuditDetail.score) : '-' }} reasons {{ Number.isFinite(Number(multiAuditDetail.reason_count)) ? Number(multiAuditDetail.reason_count) : (Array.isArray(multiAuditDetail.reasons) ? multiAuditDetail.reasons.length : 0) }} {{ multiAuditDetailArb.market_type }} {{ multiAuditDetailArb.line }} [{{ formatPeriodLabel(multiAuditDetailArb.period, multiAuditDetailArb) }}]
No audit issues detected.
{{ reason.level || 'info' }} {{ reason.code || 'unknown_code' }}

{{ reason.message || 'No message.' }}

{{ selectedMultiArb.home_team }} vs {{ selectedMultiArb.away_team }}

{{ selectedMultiArb.league }} · {{ selectedMultiArb.market_type }} {{ selectedMultiArb.line > 0 ? '+' : '' }}{{ selectedMultiArb.line }} · Profit: {{ selectedMultiArb.profit_pct > 0 ? '+' : '' }}{{ selectedMultiArb.profit_pct?.toFixed(2) }}%
{{ sel }} {{ info.price }} {{ info.site }}
Margin {{ selectedMultiArb.margin?.toFixed(4) }}

Loading market data...

{{ getActiveMultiDetailSide().alias }} {{ getActiveMultiDetailSide().fixture_id }}
No markets available
{{ market.name }} {{ market.type }}
TARGET
{{ odd.name }}
{{ odd.price?.toFixed(2) }}
{{ odd.line > 0 ? '+' : '' }}{{ odd.line }}
No site detail available

Site Diagnostics

{{ siteDiagnosticsAlias }}

Loading diagnostics...

{{ siteDiagnosticsError }}
{{ siteDiagnostics.runtime?.state || 'UNKNOWN' }} {{ siteDiagnostics.registry?.site_type || '-' }}
URL{{ siteDiagnostics.registry?.site_url || '-' }}
API Base{{ siteDiagnostics.registry?.api_base || '-' }}
Auth Mode{{ siteDiagnostics.registry?.auth_mode || '-' }}
Failures{{ siteDiagnostics.runtime?.consecutive_failures || 0 }}
Last Error{{ siteDiagnostics.runtime?.last_error_message || siteDiagnostics.runtime?.message || '-' }}

Temporary Auth Test / Save Profile

{{ siteAuthEditingProfileId ? 'EDITING' : 'NEW' }}
Editing saved profile · {{ siteAuthEditingMaskedSummary }}. Leave secret fields blank to keep existing values.
Priority
{{ siteAuthFormMessage }} {{ siteAuthFormError }}

Auth Profiles

No saved auth profiles.
{{ profile.label }}
{{ profile.auth_mode }} · {{ profile.masked_summary }}
PRIMARY FALLBACK {{ profile.last_test_status || 'untested' }}

Recent Auth Events

No auth events recorded.
{{ event.event_type }} {{ event.success ? 'success' : 'failed' }}
{{ event.phase || 'runtime' }} · {{ event.error_category || 'ok' }} · {{ Math.round(event.duration_ms || 0) }}ms
{{ event.error_message }}

Recent Crawl Runs

No crawl runs recorded.
{{ run.status }}
{{ formatDate(run.finished_at) }}
{{ run.matches_count }} matches / {{ run.markets_count }} markets / {{ run.odds_count }} odds
{{ run.error_message }}