Single-binary self-hosted market watcher for stocks, ETFs, indexes, and futures: live charts, key stats, fundamentals, SEC filings, and SSE streaming.
axumdockerfinancerustself-hostedsqlitestocksvite
1{% extends "base.html" %}
2{% block title %}Data health{% endblock %}
3{% block description %}Live status of the on-demand data fetches, the endpoint guards, and the fetch log.{% endblock %}
4{% block extra_css %}<link rel="stylesheet" href="{{ vite_asset('static_src/health/index.js', 'css') }}">{% endblock %}
5
6{% block main %}
7<div class="wrap">
8 <div class="page-head">
9 <h1>Data health</h1>
10 <span class="health-asof" data-role="asof"></span>
11 </div>
12
13 {# Systems verdict (Phase 7): a one-line plain read distilling the whole page
14 — are the upstreams healthy, are the jobs on schedule, how fresh is the
15 last fetch. Filled + kept live by the page script from the same snapshot
16 that drives the detail below, so it never disagrees with it. #}
17 <div class="health-verdict" data-role="verdict" hidden>
18 <span class="health-verdict__dot"></span>
19 <div class="health-verdict__text">
20 <p class="health-verdict__head" data-role="verdict-head"></p>
21 <p class="health-verdict__detail" data-role="verdict-detail"></p>
22 </div>
23 </div>
24
25 <p class="health-lede">
26 This app fetches market data <strong>on demand</strong> — when you open
27 a page — through a request guard per upstream; the timed jobs are the
28 live intraday poll for the symbols on screen and the 15-minute home sweep
29 that keeps the dashboard fresh. Laid open here: each guard and its hourly
30 budget, those jobs, and a live tail of the fetch log.
31 </p>
32
33 {# Shown only while a job is fetching; the page script toggles `hidden`. #}
34 <div class="health-banner" data-role="banner" hidden></div>
35
36 <h2 class="section-title">Endpoints</h2>
37 <div data-role="endpoints"></div>
38
39 <h2 class="section-title">Background jobs</h2>
40 <div data-role="jobs"></div>
41
42 <h2 class="section-title">Activity log</h2>
43 <div data-role="log"></div>
44
45 {# Initial snapshot, rendered by the page script on load so there is no
46 flash; `<`/`>`/`&` are pre-escaped to \uXXXX (see routes::health). #}
47 <script type="application/json" id="health-data">{{ health_json|safe }}</script>
48</div>
49{% endblock %}
50
51{% block extra_js %}<script type="module" src="{{ vite_asset('static_src/health/index.js') }}"></script>{% endblock %}