cloudflare
tcp/443 tcp/80 tcp/8443
Open service 172.66.45.31:443 · sleepmon.pages.dev
2026-01-12 17:37
HTTP/1.1 404 Not Found
Date: Mon, 12 Jan 2026 17:37:41 GMT
Content-Length: 0
Connection: close
Access-Control-Allow-Origin: *
Cache-Control: no-store
referrer-policy: strict-origin-when-cross-origin
Vary: accept-encoding
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=hsSZLGblvNCr8P6wyDFARDEbNLLODltPZBa8Jw54CjzuotsMw6Zx%2Bk8CZDsgraM8NH35kaKrGRn61oLBSI7rtg36UHzfKJIxyd7ccmBLD2%2Bmwg%3D%3D"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server: cloudflare
CF-RAY: 9bce6c5a2959abdc-YYZ
alt-svc: h3=":443"; ma=86400
Open service 172.66.45.31:80 · sleepmon.pages.dev
2026-01-12 17:37
HTTP/1.1 301 Moved Permanently
Date: Mon, 12 Jan 2026 17:37:41 GMT
Content-Length: 0
Connection: close
Location: https://sleepmon.pages.dev/
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=8HtyPouFrVrTkcKW8NPV4lu96SiuSkSZ4cGI7Y5k8W1Zb9Nv8mtx%2FOUP%2Bd8EoS6j%2BB1HCDx1K5GgogJcbLJMXLjZT9DQr02ZHzUEU1NT3SD%2Bww%3D%3D"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server: cloudflare
CF-RAY: 9bce6c599fbf8cbf-EWR
alt-svc: h3=":443"; ma=86400
Open service 2606:4700:310c::ac42:2d1f:80 · sleepmon.pages.dev
2026-01-12 17:37
HTTP/1.1 301 Moved Permanently
Date: Mon, 12 Jan 2026 17:37:41 GMT
Content-Length: 0
Connection: close
Location: https://sleepmon.pages.dev/
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=N9f1KvDF2vxe173wh8R21HVEA1riWyuxV8RSrSvyS3ExbLCnPAmjgBudpBfYN2iaa767YETv1rloEQeO39BUz3DbcoU7aTspYqQdvggH3hUJOu2H6skP6OPk7oreAA%3D%3D"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server: cloudflare
CF-RAY: 9bce6c598f03aa9d-YYZ
alt-svc: h3=":443"; ma=86400
Open service 2606:4700:310c::ac42:2d1f:8443 · sleepmon.pages.dev
2026-01-12 17:37
HTTP/1.1 404 Not Found
Date: Mon, 12 Jan 2026 17:37:41 GMT
Content-Length: 0
Connection: close
Access-Control-Allow-Origin: *
Cache-Control: no-store
referrer-policy: strict-origin-when-cross-origin
Vary: accept-encoding
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=%2Fn20qJcVR0Q1JtnVp%2FsI5H0AigNfONsygFeawqQ1VnGxos8RqAOxj0b1VN961w23PUq6kJGufDHrFlJfCdGtCWItLs25o9yrPEQBLLTF%2FDAqC49oi7PncSYhgfhf%2BA%3D%3D"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server: cloudflare
CF-RAY: 9bce6c59bf04dc9a-FRA
alt-svc: h3=":8443"; ma=86400
Open service 172.66.46.225:8443 · sleepmon.pages.dev
2026-01-12 17:37
HTTP/1.1 404 Not Found
Date: Mon, 12 Jan 2026 17:37:41 GMT
Content-Length: 0
Connection: close
Access-Control-Allow-Origin: *
Cache-Control: no-store
referrer-policy: strict-origin-when-cross-origin
Vary: accept-encoding
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=PJFOI9W2Dznmy6TDApFz2q2SdekrL5wrIzBy9DRe1KrZAwoY9U2D6a3r8QpHpLSpYwiYnianu8s33qqyE7c0IAMD1Sfs9r2vXOpztJnKeDsCQA%3D%3D"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server: cloudflare
CF-RAY: 9bce6c598dc19f64-AMS
alt-svc: h3=":8443"; ma=86400
Open service 172.66.46.225:443 · sleepmon.pages.dev
2026-01-12 17:37
HTTP/1.1 404 Not Found
Date: Mon, 12 Jan 2026 17:37:41 GMT
Content-Length: 0
Connection: close
Access-Control-Allow-Origin: *
Cache-Control: no-store
referrer-policy: strict-origin-when-cross-origin
Vary: accept-encoding
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=TTwNP9%2BfLt9%2B3gL0w77NKG1mokoKX96Gb9gWKKfcqZv5Xzm0CQUG42%2FMlbQrqy9Oug3MzXfkFo%2B%2Bq307uvT8d5LhOkENWoA2D0JY35pDmeKEVg%3D%3D"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server: cloudflare
CF-RAY: 9bce6c5989bbac7e-YYZ
alt-svc: h3=":443"; ma=86400
Open service 2606:4700:310c::ac42:2d1f:443 · sleepmon.pages.dev
2026-01-12 17:37
HTTP/1.1 404 Not Found
Date: Mon, 12 Jan 2026 17:37:41 GMT
Content-Length: 0
Connection: close
Access-Control-Allow-Origin: *
Cache-Control: no-store
referrer-policy: strict-origin-when-cross-origin
Vary: accept-encoding
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=p%2BDjg%2BBleDyOIWfLYxbrDqcY9GKyRlACtgzLN1MFaC3mirGoOtyxcZn3GtlAuHcBFy4eMwihGqls0Piah6uh9LKXzk%2BfciZsRJy0ZFf%2FLSlDbwWHZD1tNfrrgxfyDg%3D%3D"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server: cloudflare
CF-RAY: 9bce6c5999f3e911-LHR
alt-svc: h3=":443"; ma=86400
Open service 172.66.46.225:80 · sleepmon.pages.dev
2026-01-12 17:37
HTTP/1.1 301 Moved Permanently
Date: Mon, 12 Jan 2026 17:37:41 GMT
Content-Length: 0
Connection: close
Location: https://sleepmon.pages.dev/
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=%2B%2B7I%2Bz83PT8I1SUKuTX%2FZrBvSNmF9%2BJSnXqilvM2aiI5gPsEJdrNmepSi0qhI50ER3GgyHgTesdGtYnUkqIsREo8TwUYjB1Fb%2FGJdl6BISMoGw%3D%3D"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server: cloudflare
CF-RAY: 9bce6c59392c90cc-AMS
alt-svc: h3=":443"; ma=86400
Open service 172.66.45.31:8443 · sleepmon.pages.dev
2026-01-12 17:37
HTTP/1.1 404 Not Found
Date: Mon, 12 Jan 2026 17:37:41 GMT
Content-Length: 0
Connection: close
Access-Control-Allow-Origin: *
Cache-Control: no-store
referrer-policy: strict-origin-when-cross-origin
Vary: accept-encoding
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=XCXk5UK3PtPrAnoopTnZWESY1TvGlIWckadZrYWfdotzdUmqVhhwDExkCkRyjJstLy9Rcp%2FiB5AHKU%2FGQ9035lfYxm6YhqEcj0Hlfjgf4Lo%3D"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server: cloudflare
CF-RAY: 9bce6c59bc2ba1e0-YYZ
alt-svc: h3=":8443"; ma=86400
Open service 2606:4700:310c::ac42:2ee1:8443 · sleepmon.pages.dev
2026-01-12 17:37
HTTP/1.1 404 Not Found
Date: Mon, 12 Jan 2026 17:37:41 GMT
Content-Length: 0
Connection: close
Access-Control-Allow-Origin: *
Cache-Control: no-store
referrer-policy: strict-origin-when-cross-origin
Vary: accept-encoding
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=oXkHSfZ2HDcU2xkWFwX6U2%2B12BL4Lnm%2B7zrQSnkb8PW%2B3HUMZV%2BR5SabINxYpY2taUuZ0p23lqhQhQ7dXJ4z0m8OPxFg4Rtu2guc1ZMWnmL1ecW1RhvGZ6NSH8lb1w%3D%3D"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server: cloudflare
CF-RAY: 9bce6c58e8fe780c-EWR
alt-svc: h3=":8443"; ma=86400
Open service 2606:4700:310c::ac42:2ee1:443 · sleepmon.pages.dev
2026-01-12 17:37
HTTP/1.1 404 Not Found
Date: Mon, 12 Jan 2026 17:37:41 GMT
Content-Length: 0
Connection: close
Access-Control-Allow-Origin: *
Cache-Control: no-store
referrer-policy: strict-origin-when-cross-origin
Vary: accept-encoding
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=hAhmdRVz8Wt1GdSRUVX6prGqOHyJ%2FKx0nmTB1HgYCwg2OMEZOV9toV4TiBRaXq7lyZgFmEHoucgrSFqfGioSapZ7QN0mNrXGvATypbZ%2BnD9rUJrt%2FULdQvIhAgko4A%3D%3D"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server: cloudflare
CF-RAY: 9bce6c58eb8f430e-EWR
alt-svc: h3=":443"; ma=86400
Open service 2606:4700:310c::ac42:2ee1:80 · sleepmon.pages.dev
2026-01-12 17:37
HTTP/1.1 301 Moved Permanently
Date: Mon, 12 Jan 2026 17:37:41 GMT
Content-Length: 0
Connection: close
Location: https://sleepmon.pages.dev/
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=bF%2FIBF9hd1AdWg8dWQZ4eNagkOAvlFCRpdZ%2Fn8LXfWPu9bQKN%2F2U6qEcaZskTKb%2FUnVQ38RoVWsyHMYZpIw8Qhj9NPn32%2FWN1v1vuUkUsuD8wCjkWROoZB7Y6qFHiA%3D%3D"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server: cloudflare
CF-RAY: 9bce6c588ae8d2d3-FRA
alt-svc: h3=":443"; ma=86400
Open service 2606:4700:310c::ac42:2ee1:8443 · sleepmon.pages.dev
2026-01-08 15:03
HTTP/1.1 200 OK
Date: Thu, 08 Jan 2026 15:03:37 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 2859
Connection: close
Access-Control-Allow-Origin: *
Cache-Control: public, max-age=0, must-revalidate
ETag: "29556f812903f7e748bf258cbe81e746"
referrer-policy: strict-origin-when-cross-origin
x-content-type-options: nosniff
Vary: accept-encoding
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=Hoja%2F%2Bm3eZPYMWyEJOX3uOxUIYbxYhGY4LAfjpdHkQKENwfcr5EBDzf%2FepR2pcGiq5%2BRXCmbrqxlwsxd7c8c1B6S79SEncrNoePsoGbE1wphjJxWtEF4xhU9IQT2Cw%3D%3D"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server: cloudflare
CF-RAY: 9bac95283ef3db9f-FRA
alt-svc: h3=":8443"; ma=86400
Page title: SleepMon – SpO2 & RMS Monitor
<!doctype html>
<html lang="vi">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width,initial-scale=1" />
<title>SleepMon – SpO2 & RMS Monitor</title>
<link rel="stylesheet" href="./style.css" />
</head>
<body>
<header class="bar">
<div class="title">SleepMon</div>
<div class="pill" id="connPill">API: chưa kết nối</div>
<div class="pill" id="livePill">LIVE: OFF</div>
</header>
<main class="container">
<section class="card">
<div class="row">
<div>
<div class="h">Chọn ngày (tối đa 7 ngày gần nhất)</div>
<div class="sub">Chọn nhiều ngày để so sánh (tự tắt Live).</div>
</div>
<div class="row right">
<label class="toggle">
<input type="checkbox" id="liveToggle" />
<span>Live</span>
</label>
<button id="reloadBtn">Tải lại</button>
</div>
</div>
<div id="dateBox" class="datebox"></div>
<div class="note" id="modeNote"></div>
</section>
<section class="grid2">
<section class="card">
<div class="h">SpO2 (%)</div>
<canvas id="spo2Chart" height="160"></canvas>
<div class="chartFooter" id="spo2DayLabel"></div>
</section>
<section class="card">
<div class="h">Audio RMS</div>
<canvas id="rmsChart" height="160"></canvas>
<div class="chartFooter" id="rmsDayLabel"></div>
</section>
</section>
<section class="card">
<div class="row">
<div>
<div class="h">Abnormal files (WAV)</div>
<div class="sub">Lưu tối đa 7 ngày trên cloud.</div>
</div>
<div class="row right">
<label class="sub">Hiển thị:</label>
<select id="abnDays">
<option value="1">1 ngày</option>
<option value="2">2 ngày</option>
<option value="3">3 ngày</option>
<option value="7" selected>7 ngày</option>
</select>
<button id="abnReload">Tải</button>
</div>
</div>
<div id="abnList" class="list"></div>
</section>
<section class="card">
<div class="h">Cấu hình</div>
<div class="sub">
Sửa <code>API_BASE</code> trong <code>app.js</code> thành domain Worker của bạn.
Trang này public (ai cũng xem được), nhưng API ghi dữ liệu yêu cầu token.
</div>
</section>
</main>
<script src="https://cdn.jsdelivr.net/npm/luxon@3.5.0/build/global/luxon.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/chart.js@4.4.3/dist/chart.umd.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/chartjs-adapter-luxon@1.3.1/dist/chartjs-adapter-luxon.umd.min.js"></script>
<script src="./app.js"></script>
</body>
</html>
Open service 2606:4700:310c::ac42:2d1f:8443 · sleepmon.pages.dev
2026-01-08 15:03
HTTP/1.1 200 OK
Date: Thu, 08 Jan 2026 15:03:37 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 2859
Connection: close
Access-Control-Allow-Origin: *
Cache-Control: public, max-age=0, must-revalidate
ETag: "29556f812903f7e748bf258cbe81e746"
referrer-policy: strict-origin-when-cross-origin
x-content-type-options: nosniff
Vary: accept-encoding
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=aCNi7yX%2F78jZipcJF40XEoLdX%2F0LctZoM3N4ZlaSL9eYxg595F0XnIZDTo9terl56CgSOqgP%2B%2F865zXrRpmANCgoK0072Kn3u3vmOOxCWko4mhITSlfTDw%2FKZLZZKA%3D%3D"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server: cloudflare
CF-RAY: 9bac952828b1380f-FRA
alt-svc: h3=":8443"; ma=86400
Page title: SleepMon – SpO2 & RMS Monitor
<!doctype html>
<html lang="vi">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width,initial-scale=1" />
<title>SleepMon – SpO2 & RMS Monitor</title>
<link rel="stylesheet" href="./style.css" />
</head>
<body>
<header class="bar">
<div class="title">SleepMon</div>
<div class="pill" id="connPill">API: chưa kết nối</div>
<div class="pill" id="livePill">LIVE: OFF</div>
</header>
<main class="container">
<section class="card">
<div class="row">
<div>
<div class="h">Chọn ngày (tối đa 7 ngày gần nhất)</div>
<div class="sub">Chọn nhiều ngày để so sánh (tự tắt Live).</div>
</div>
<div class="row right">
<label class="toggle">
<input type="checkbox" id="liveToggle" />
<span>Live</span>
</label>
<button id="reloadBtn">Tải lại</button>
</div>
</div>
<div id="dateBox" class="datebox"></div>
<div class="note" id="modeNote"></div>
</section>
<section class="grid2">
<section class="card">
<div class="h">SpO2 (%)</div>
<canvas id="spo2Chart" height="160"></canvas>
<div class="chartFooter" id="spo2DayLabel"></div>
</section>
<section class="card">
<div class="h">Audio RMS</div>
<canvas id="rmsChart" height="160"></canvas>
<div class="chartFooter" id="rmsDayLabel"></div>
</section>
</section>
<section class="card">
<div class="row">
<div>
<div class="h">Abnormal files (WAV)</div>
<div class="sub">Lưu tối đa 7 ngày trên cloud.</div>
</div>
<div class="row right">
<label class="sub">Hiển thị:</label>
<select id="abnDays">
<option value="1">1 ngày</option>
<option value="2">2 ngày</option>
<option value="3">3 ngày</option>
<option value="7" selected>7 ngày</option>
</select>
<button id="abnReload">Tải</button>
</div>
</div>
<div id="abnList" class="list"></div>
</section>
<section class="card">
<div class="h">Cấu hình</div>
<div class="sub">
Sửa <code>API_BASE</code> trong <code>app.js</code> thành domain Worker của bạn.
Trang này public (ai cũng xem được), nhưng API ghi dữ liệu yêu cầu token.
</div>
</section>
</main>
<script src="https://cdn.jsdelivr.net/npm/luxon@3.5.0/build/global/luxon.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/chart.js@4.4.3/dist/chart.umd.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/chartjs-adapter-luxon@1.3.1/dist/chartjs-adapter-luxon.umd.min.js"></script>
<script src="./app.js"></script>
</body>
</html>
Open service 172.66.45.31:8443 · sleepmon.pages.dev
2026-01-08 15:03
HTTP/1.1 200 OK
Date: Thu, 08 Jan 2026 15:03:37 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 2859
Connection: close
Access-Control-Allow-Origin: *
Cache-Control: public, max-age=0, must-revalidate
ETag: "29556f812903f7e748bf258cbe81e746"
referrer-policy: strict-origin-when-cross-origin
x-content-type-options: nosniff
Vary: accept-encoding
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=drrIeNnpeL7ok4CfwE5nJUhixlVJxxRbLHpOBRX82GjrXDVMP2oOC%2Fy5hQExXF7mzB8O4NRHr7kz%2Bkv%2FaLQluPPjWjGMRAPwh22vdk7BRdrv4w%3D%3D"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server: cloudflare
CF-RAY: 9bac95280b693a9a-FRA
alt-svc: h3=":8443"; ma=86400
Page title: SleepMon – SpO2 & RMS Monitor
<!doctype html>
<html lang="vi">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width,initial-scale=1" />
<title>SleepMon – SpO2 & RMS Monitor</title>
<link rel="stylesheet" href="./style.css" />
</head>
<body>
<header class="bar">
<div class="title">SleepMon</div>
<div class="pill" id="connPill">API: chưa kết nối</div>
<div class="pill" id="livePill">LIVE: OFF</div>
</header>
<main class="container">
<section class="card">
<div class="row">
<div>
<div class="h">Chọn ngày (tối đa 7 ngày gần nhất)</div>
<div class="sub">Chọn nhiều ngày để so sánh (tự tắt Live).</div>
</div>
<div class="row right">
<label class="toggle">
<input type="checkbox" id="liveToggle" />
<span>Live</span>
</label>
<button id="reloadBtn">Tải lại</button>
</div>
</div>
<div id="dateBox" class="datebox"></div>
<div class="note" id="modeNote"></div>
</section>
<section class="grid2">
<section class="card">
<div class="h">SpO2 (%)</div>
<canvas id="spo2Chart" height="160"></canvas>
<div class="chartFooter" id="spo2DayLabel"></div>
</section>
<section class="card">
<div class="h">Audio RMS</div>
<canvas id="rmsChart" height="160"></canvas>
<div class="chartFooter" id="rmsDayLabel"></div>
</section>
</section>
<section class="card">
<div class="row">
<div>
<div class="h">Abnormal files (WAV)</div>
<div class="sub">Lưu tối đa 7 ngày trên cloud.</div>
</div>
<div class="row right">
<label class="sub">Hiển thị:</label>
<select id="abnDays">
<option value="1">1 ngày</option>
<option value="2">2 ngày</option>
<option value="3">3 ngày</option>
<option value="7" selected>7 ngày</option>
</select>
<button id="abnReload">Tải</button>
</div>
</div>
<div id="abnList" class="list"></div>
</section>
<section class="card">
<div class="h">Cấu hình</div>
<div class="sub">
Sửa <code>API_BASE</code> trong <code>app.js</code> thành domain Worker của bạn.
Trang này public (ai cũng xem được), nhưng API ghi dữ liệu yêu cầu token.
</div>
</section>
</main>
<script src="https://cdn.jsdelivr.net/npm/luxon@3.5.0/build/global/luxon.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/chart.js@4.4.3/dist/chart.umd.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/chartjs-adapter-luxon@1.3.1/dist/chartjs-adapter-luxon.umd.min.js"></script>
<script src="./app.js"></script>
</body>
</html>
Open service 172.66.45.31:80 · sleepmon.pages.dev
2026-01-08 15:03
HTTP/1.1 301 Moved Permanently
Date: Thu, 08 Jan 2026 15:03:36 GMT
Content-Length: 0
Connection: close
Location: https://sleepmon.pages.dev/
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=FPfK6IPWjUbkLC1d%2FDQN6YPgaAYifY1im%2F1PUSNSjdUO3MlS9%2FUaoIcIj5rKeG%2BLx%2FANXS9Cs%2Ff7cHD%2F7IyLZURGPweBLtGAMTKQwQxqZA%2BocA%3D%3D"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server: cloudflare
CF-RAY: 9bac9527796d3a76-FRA
alt-svc: h3=":443"; ma=86400
Open service 2606:4700:310c::ac42:2ee1:443 · sleepmon.pages.dev
2026-01-08 15:03
HTTP/1.1 200 OK
Date: Thu, 08 Jan 2026 15:03:37 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 2859
Connection: close
Access-Control-Allow-Origin: *
Cache-Control: public, max-age=0, must-revalidate
ETag: "29556f812903f7e748bf258cbe81e746"
referrer-policy: strict-origin-when-cross-origin
x-content-type-options: nosniff
Vary: accept-encoding
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=BX1dYkHXG9xI8452EeAerK%2F3T4xZQ65gn9UaWAjUdX74xQLPBx8hb3pGD7A9XsSxRzGXnz33xVC2PuMcu8EKzWKqrDfN1sxpFGMbb2nR72MD59N1AkZ%2FELhqH8%2FU1g%3D%3D"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server: cloudflare
CF-RAY: 9bac95282e0d4d64-FRA
alt-svc: h3=":443"; ma=86400
Page title: SleepMon – SpO2 & RMS Monitor
<!doctype html>
<html lang="vi">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width,initial-scale=1" />
<title>SleepMon – SpO2 & RMS Monitor</title>
<link rel="stylesheet" href="./style.css" />
</head>
<body>
<header class="bar">
<div class="title">SleepMon</div>
<div class="pill" id="connPill">API: chưa kết nối</div>
<div class="pill" id="livePill">LIVE: OFF</div>
</header>
<main class="container">
<section class="card">
<div class="row">
<div>
<div class="h">Chọn ngày (tối đa 7 ngày gần nhất)</div>
<div class="sub">Chọn nhiều ngày để so sánh (tự tắt Live).</div>
</div>
<div class="row right">
<label class="toggle">
<input type="checkbox" id="liveToggle" />
<span>Live</span>
</label>
<button id="reloadBtn">Tải lại</button>
</div>
</div>
<div id="dateBox" class="datebox"></div>
<div class="note" id="modeNote"></div>
</section>
<section class="grid2">
<section class="card">
<div class="h">SpO2 (%)</div>
<canvas id="spo2Chart" height="160"></canvas>
<div class="chartFooter" id="spo2DayLabel"></div>
</section>
<section class="card">
<div class="h">Audio RMS</div>
<canvas id="rmsChart" height="160"></canvas>
<div class="chartFooter" id="rmsDayLabel"></div>
</section>
</section>
<section class="card">
<div class="row">
<div>
<div class="h">Abnormal files (WAV)</div>
<div class="sub">Lưu tối đa 7 ngày trên cloud.</div>
</div>
<div class="row right">
<label class="sub">Hiển thị:</label>
<select id="abnDays">
<option value="1">1 ngày</option>
<option value="2">2 ngày</option>
<option value="3">3 ngày</option>
<option value="7" selected>7 ngày</option>
</select>
<button id="abnReload">Tải</button>
</div>
</div>
<div id="abnList" class="list"></div>
</section>
<section class="card">
<div class="h">Cấu hình</div>
<div class="sub">
Sửa <code>API_BASE</code> trong <code>app.js</code> thành domain Worker của bạn.
Trang này public (ai cũng xem được), nhưng API ghi dữ liệu yêu cầu token.
</div>
</section>
</main>
<script src="https://cdn.jsdelivr.net/npm/luxon@3.5.0/build/global/luxon.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/chart.js@4.4.3/dist/chart.umd.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/chartjs-adapter-luxon@1.3.1/dist/chartjs-adapter-luxon.umd.min.js"></script>
<script src="./app.js"></script>
</body>
</html>
Open service 2606:4700:310c::ac42:2d1f:80 · sleepmon.pages.dev
2026-01-08 15:03
HTTP/1.1 301 Moved Permanently
Date: Thu, 08 Jan 2026 15:03:36 GMT
Content-Length: 0
Connection: close
Location: https://sleepmon.pages.dev/
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=H5fO3NmzsE632MpXceoQdky3YOKIgttxnlhZHfRERuhyieJrFHiilhggIEqcZOngVqyA3cDmE%2B6rH052Jjxt4OpKIIsQQmPPi1QgSb7fBClqn6ZWqkjhCy27OxftSw%3D%3D"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server: cloudflare
CF-RAY: 9bac952768c4c4e4-LHR
alt-svc: h3=":443"; ma=86400
Open service 2606:4700:310c::ac42:2ee1:80 · sleepmon.pages.dev
2026-01-08 15:03
HTTP/1.1 301 Moved Permanently
Date: Thu, 08 Jan 2026 15:03:36 GMT
Content-Length: 0
Connection: close
Location: https://sleepmon.pages.dev/
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=mwk1Dv9QWvuFFo%2BuUtAvwGgMDqgd9gMdpraPLSFHM4bD%2B6RXO4%2FpxsJQM2TbvccsDCtv4opRpCZklXLVhoTr8wMHlL5wWaaSDNHXkrpjLZL5Y4IiZ8HD3Gp7ccCaLw%3D%3D"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server: cloudflare
CF-RAY: 9bac95276999d26d-FRA
alt-svc: h3=":443"; ma=86400
Open service 2606:4700:310c::ac42:2d1f:443 · sleepmon.pages.dev
2026-01-08 15:03
HTTP/1.1 200 OK
Date: Thu, 08 Jan 2026 15:03:36 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 2859
Connection: close
Access-Control-Allow-Origin: *
Cache-Control: public, max-age=0, must-revalidate
ETag: "29556f812903f7e748bf258cbe81e746"
referrer-policy: strict-origin-when-cross-origin
x-content-type-options: nosniff
Vary: accept-encoding
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=gxAANH9Vl8kG0%2BPjnTIEFIcfjRqpVkxj%2FnOgRhPu%2FpIv35NZTL88gpYy8WUeqaijki9trUvIyuy%2BxY%2BdIB1K41fjlUmP%2FRvvvD5nbbVyPLNj46QPBUe8KABdn52KDw%3D%3D"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server: cloudflare
CF-RAY: 9bac9527ea73de6d-EWR
alt-svc: h3=":443"; ma=86400
Page title: SleepMon – SpO2 & RMS Monitor
<!doctype html>
<html lang="vi">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width,initial-scale=1" />
<title>SleepMon – SpO2 & RMS Monitor</title>
<link rel="stylesheet" href="./style.css" />
</head>
<body>
<header class="bar">
<div class="title">SleepMon</div>
<div class="pill" id="connPill">API: chưa kết nối</div>
<div class="pill" id="livePill">LIVE: OFF</div>
</header>
<main class="container">
<section class="card">
<div class="row">
<div>
<div class="h">Chọn ngày (tối đa 7 ngày gần nhất)</div>
<div class="sub">Chọn nhiều ngày để so sánh (tự tắt Live).</div>
</div>
<div class="row right">
<label class="toggle">
<input type="checkbox" id="liveToggle" />
<span>Live</span>
</label>
<button id="reloadBtn">Tải lại</button>
</div>
</div>
<div id="dateBox" class="datebox"></div>
<div class="note" id="modeNote"></div>
</section>
<section class="grid2">
<section class="card">
<div class="h">SpO2 (%)</div>
<canvas id="spo2Chart" height="160"></canvas>
<div class="chartFooter" id="spo2DayLabel"></div>
</section>
<section class="card">
<div class="h">Audio RMS</div>
<canvas id="rmsChart" height="160"></canvas>
<div class="chartFooter" id="rmsDayLabel"></div>
</section>
</section>
<section class="card">
<div class="row">
<div>
<div class="h">Abnormal files (WAV)</div>
<div class="sub">Lưu tối đa 7 ngày trên cloud.</div>
</div>
<div class="row right">
<label class="sub">Hiển thị:</label>
<select id="abnDays">
<option value="1">1 ngày</option>
<option value="2">2 ngày</option>
<option value="3">3 ngày</option>
<option value="7" selected>7 ngày</option>
</select>
<button id="abnReload">Tải</button>
</div>
</div>
<div id="abnList" class="list"></div>
</section>
<section class="card">
<div class="h">Cấu hình</div>
<div class="sub">
Sửa <code>API_BASE</code> trong <code>app.js</code> thành domain Worker của bạn.
Trang này public (ai cũng xem được), nhưng API ghi dữ liệu yêu cầu token.
</div>
</section>
</main>
<script src="https://cdn.jsdelivr.net/npm/luxon@3.5.0/build/global/luxon.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/chart.js@4.4.3/dist/chart.umd.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/chartjs-adapter-luxon@1.3.1/dist/chartjs-adapter-luxon.umd.min.js"></script>
<script src="./app.js"></script>
</body>
</html>
Open service 172.66.45.31:443 · sleepmon.pages.dev
2026-01-08 15:03
HTTP/1.1 200 OK
Date: Thu, 08 Jan 2026 15:03:37 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 2859
Connection: close
Access-Control-Allow-Origin: *
Cache-Control: public, max-age=0, must-revalidate
ETag: "29556f812903f7e748bf258cbe81e746"
referrer-policy: strict-origin-when-cross-origin
x-content-type-options: nosniff
Vary: accept-encoding
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=7OWCyoXlFovMhQYfGFcxavjC8NOJi4fsM3nnTgu6ITrsMMn4lDI8HxK91EYvXZAVR5BZukVe1zCZWnKVcYfkmE%2F%2BZtTjLM5nd9ESbVqtVP4%3D"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server: cloudflare
CF-RAY: 9bac95284cbbf5f6-EWR
alt-svc: h3=":443"; ma=86400
Page title: SleepMon – SpO2 & RMS Monitor
<!doctype html>
<html lang="vi">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width,initial-scale=1" />
<title>SleepMon – SpO2 & RMS Monitor</title>
<link rel="stylesheet" href="./style.css" />
</head>
<body>
<header class="bar">
<div class="title">SleepMon</div>
<div class="pill" id="connPill">API: chưa kết nối</div>
<div class="pill" id="livePill">LIVE: OFF</div>
</header>
<main class="container">
<section class="card">
<div class="row">
<div>
<div class="h">Chọn ngày (tối đa 7 ngày gần nhất)</div>
<div class="sub">Chọn nhiều ngày để so sánh (tự tắt Live).</div>
</div>
<div class="row right">
<label class="toggle">
<input type="checkbox" id="liveToggle" />
<span>Live</span>
</label>
<button id="reloadBtn">Tải lại</button>
</div>
</div>
<div id="dateBox" class="datebox"></div>
<div class="note" id="modeNote"></div>
</section>
<section class="grid2">
<section class="card">
<div class="h">SpO2 (%)</div>
<canvas id="spo2Chart" height="160"></canvas>
<div class="chartFooter" id="spo2DayLabel"></div>
</section>
<section class="card">
<div class="h">Audio RMS</div>
<canvas id="rmsChart" height="160"></canvas>
<div class="chartFooter" id="rmsDayLabel"></div>
</section>
</section>
<section class="card">
<div class="row">
<div>
<div class="h">Abnormal files (WAV)</div>
<div class="sub">Lưu tối đa 7 ngày trên cloud.</div>
</div>
<div class="row right">
<label class="sub">Hiển thị:</label>
<select id="abnDays">
<option value="1">1 ngày</option>
<option value="2">2 ngày</option>
<option value="3">3 ngày</option>
<option value="7" selected>7 ngày</option>
</select>
<button id="abnReload">Tải</button>
</div>
</div>
<div id="abnList" class="list"></div>
</section>
<section class="card">
<div class="h">Cấu hình</div>
<div class="sub">
Sửa <code>API_BASE</code> trong <code>app.js</code> thành domain Worker của bạn.
Trang này public (ai cũng xem được), nhưng API ghi dữ liệu yêu cầu token.
</div>
</section>
</main>
<script src="https://cdn.jsdelivr.net/npm/luxon@3.5.0/build/global/luxon.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/chart.js@4.4.3/dist/chart.umd.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/chartjs-adapter-luxon@1.3.1/dist/chartjs-adapter-luxon.umd.min.js"></script>
<script src="./app.js"></script>
</body>
</html>
Open service 172.66.46.225:80 · sleepmon.pages.dev
2026-01-08 15:03
HTTP/1.1 301 Moved Permanently
Date: Thu, 08 Jan 2026 15:03:36 GMT
Content-Length: 0
Connection: close
Location: https://sleepmon.pages.dev/
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=X%2FDLu%2FxQATcZPBXBFata%2BCoHgF9r9lb2ehVFWqjbqfkFiaJIH9f9GLUhMV5Md%2BWg18JGDX4IWenABvM2xuZilQ%2F0jrrxi8KxN3Ng0bDzG07Oug%3D%3D"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server: cloudflare
CF-RAY: 9bac95270d705a2e-SJC
alt-svc: h3=":443"; ma=86400
Open service 172.66.46.225:443 · sleepmon.pages.dev
2026-01-08 15:03
HTTP/1.1 200 OK
Date: Thu, 08 Jan 2026 15:03:37 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 2859
Connection: close
Access-Control-Allow-Origin: *
Cache-Control: public, max-age=0, must-revalidate
ETag: "29556f812903f7e748bf258cbe81e746"
referrer-policy: strict-origin-when-cross-origin
x-content-type-options: nosniff
Vary: accept-encoding
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=Q%2FHAVXtfeoT%2BAG2eCrp5WsAMUeApCkINR%2BYaHtpAFM4niuulQEGg4%2Bt8SpjQrrBctKCkByKhB4BgWatRy2zA1%2FZnK2lxeqNwogY0znNZKvjiLQ%3D%3D"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server: cloudflare
CF-RAY: 9bac9528187b4358-EWR
alt-svc: h3=":443"; ma=86400
Page title: SleepMon – SpO2 & RMS Monitor
<!doctype html>
<html lang="vi">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width,initial-scale=1" />
<title>SleepMon – SpO2 & RMS Monitor</title>
<link rel="stylesheet" href="./style.css" />
</head>
<body>
<header class="bar">
<div class="title">SleepMon</div>
<div class="pill" id="connPill">API: chưa kết nối</div>
<div class="pill" id="livePill">LIVE: OFF</div>
</header>
<main class="container">
<section class="card">
<div class="row">
<div>
<div class="h">Chọn ngày (tối đa 7 ngày gần nhất)</div>
<div class="sub">Chọn nhiều ngày để so sánh (tự tắt Live).</div>
</div>
<div class="row right">
<label class="toggle">
<input type="checkbox" id="liveToggle" />
<span>Live</span>
</label>
<button id="reloadBtn">Tải lại</button>
</div>
</div>
<div id="dateBox" class="datebox"></div>
<div class="note" id="modeNote"></div>
</section>
<section class="grid2">
<section class="card">
<div class="h">SpO2 (%)</div>
<canvas id="spo2Chart" height="160"></canvas>
<div class="chartFooter" id="spo2DayLabel"></div>
</section>
<section class="card">
<div class="h">Audio RMS</div>
<canvas id="rmsChart" height="160"></canvas>
<div class="chartFooter" id="rmsDayLabel"></div>
</section>
</section>
<section class="card">
<div class="row">
<div>
<div class="h">Abnormal files (WAV)</div>
<div class="sub">Lưu tối đa 7 ngày trên cloud.</div>
</div>
<div class="row right">
<label class="sub">Hiển thị:</label>
<select id="abnDays">
<option value="1">1 ngày</option>
<option value="2">2 ngày</option>
<option value="3">3 ngày</option>
<option value="7" selected>7 ngày</option>
</select>
<button id="abnReload">Tải</button>
</div>
</div>
<div id="abnList" class="list"></div>
</section>
<section class="card">
<div class="h">Cấu hình</div>
<div class="sub">
Sửa <code>API_BASE</code> trong <code>app.js</code> thành domain Worker của bạn.
Trang này public (ai cũng xem được), nhưng API ghi dữ liệu yêu cầu token.
</div>
</section>
</main>
<script src="https://cdn.jsdelivr.net/npm/luxon@3.5.0/build/global/luxon.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/chart.js@4.4.3/dist/chart.umd.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/chartjs-adapter-luxon@1.3.1/dist/chartjs-adapter-luxon.umd.min.js"></script>
<script src="./app.js"></script>
</body>
</html>
Open service 172.66.46.225:8443 · sleepmon.pages.dev
2026-01-08 15:03
HTTP/1.1 200 OK
Date: Thu, 08 Jan 2026 15:03:36 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 2859
Connection: close
Access-Control-Allow-Origin: *
Cache-Control: public, max-age=0, must-revalidate
ETag: "29556f812903f7e748bf258cbe81e746"
referrer-policy: strict-origin-when-cross-origin
x-content-type-options: nosniff
Vary: accept-encoding
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=m0%2Firjoa%2B1JnlMc8UxN9WEAl%2BJE44WZtF7ERvjqiTGMytc3%2FUw6TTWZoiFzsxZRLOxTplQrSWcUIv%2FquwgGKDQEr8f7YsUM39qnyJXOat2BAYQ%3D%3D"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server: cloudflare
CF-RAY: 9bac9527edc64f4e-EWR
alt-svc: h3=":8443"; ma=86400
Page title: SleepMon – SpO2 & RMS Monitor
<!doctype html>
<html lang="vi">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width,initial-scale=1" />
<title>SleepMon – SpO2 & RMS Monitor</title>
<link rel="stylesheet" href="./style.css" />
</head>
<body>
<header class="bar">
<div class="title">SleepMon</div>
<div class="pill" id="connPill">API: chưa kết nối</div>
<div class="pill" id="livePill">LIVE: OFF</div>
</header>
<main class="container">
<section class="card">
<div class="row">
<div>
<div class="h">Chọn ngày (tối đa 7 ngày gần nhất)</div>
<div class="sub">Chọn nhiều ngày để so sánh (tự tắt Live).</div>
</div>
<div class="row right">
<label class="toggle">
<input type="checkbox" id="liveToggle" />
<span>Live</span>
</label>
<button id="reloadBtn">Tải lại</button>
</div>
</div>
<div id="dateBox" class="datebox"></div>
<div class="note" id="modeNote"></div>
</section>
<section class="grid2">
<section class="card">
<div class="h">SpO2 (%)</div>
<canvas id="spo2Chart" height="160"></canvas>
<div class="chartFooter" id="spo2DayLabel"></div>
</section>
<section class="card">
<div class="h">Audio RMS</div>
<canvas id="rmsChart" height="160"></canvas>
<div class="chartFooter" id="rmsDayLabel"></div>
</section>
</section>
<section class="card">
<div class="row">
<div>
<div class="h">Abnormal files (WAV)</div>
<div class="sub">Lưu tối đa 7 ngày trên cloud.</div>
</div>
<div class="row right">
<label class="sub">Hiển thị:</label>
<select id="abnDays">
<option value="1">1 ngày</option>
<option value="2">2 ngày</option>
<option value="3">3 ngày</option>
<option value="7" selected>7 ngày</option>
</select>
<button id="abnReload">Tải</button>
</div>
</div>
<div id="abnList" class="list"></div>
</section>
<section class="card">
<div class="h">Cấu hình</div>
<div class="sub">
Sửa <code>API_BASE</code> trong <code>app.js</code> thành domain Worker của bạn.
Trang này public (ai cũng xem được), nhưng API ghi dữ liệu yêu cầu token.
</div>
</section>
</main>
<script src="https://cdn.jsdelivr.net/npm/luxon@3.5.0/build/global/luxon.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/chart.js@4.4.3/dist/chart.umd.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/chartjs-adapter-luxon@1.3.1/dist/chartjs-adapter-luxon.umd.min.js"></script>
<script src="./app.js"></script>
</body>
</html>