Some checks failed
Build and Push / Build and Push Docker Image (push) Failing after 2s
- Content-Security-Policy: nonce-based per-request plug replacing unsafe-inline scripts - RemoteIp: CIDR-based trust gating via InetCidr, skips forwarded headers from untrusted peers - Rate limiting: auth pipeline (20/min), LiveView event handlers, existing mobile channel limits - NetworkPolicy: 4 k8s policies (web ingress, cluster, metrics, egress) for least-privilege networking - PartitionManager: deadlock retry with exponential backoff in drop_partition - Tests: reduced parallelism (max_cases 4), packets_test async:false to prevent trigger contention - k8s: APRS_PASSWORD -> APRS_PASSCODE secretRef, vendor/aprs submodule hardened
61 lines
2.4 KiB
Text
61 lines
2.4 KiB
Text
<!DOCTYPE html>
|
|
<html lang="en" data-theme="light">
|
|
<head>
|
|
<meta charset="utf-8" />
|
|
<meta
|
|
name="viewport"
|
|
content="width=device-width, initial-scale=1, maximum-scale=5, user-scalable=yes, viewport-fit=cover"
|
|
/>
|
|
<meta name="csrf-token" content={get_csrf_token()} />
|
|
<meta name="apple-mobile-web-app-capable" content="yes" />
|
|
<meta name="apple-mobile-web-app-status-bar-style" content="default" />
|
|
<meta name="mobile-web-app-capable" content="yes" />
|
|
<meta name="theme-color" content="#6366f1" />
|
|
<meta name="format-detection" content="telephone=no" />
|
|
<meta name="referrer" content="origin" />
|
|
<script nonce={@conn.private[:csp_nonce]}>
|
|
(function() {
|
|
try {
|
|
var theme = (typeof localStorage !== 'undefined' && localStorage.getItem('theme')) || 'auto';
|
|
if(theme === 'auto') {
|
|
if(window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {
|
|
document.documentElement.setAttribute('data-theme', 'dark');
|
|
} else {
|
|
document.documentElement.setAttribute('data-theme', 'light');
|
|
}
|
|
} else {
|
|
document.documentElement.setAttribute('data-theme', theme);
|
|
}
|
|
} catch(e) {
|
|
document.documentElement.setAttribute('data-theme', 'light');
|
|
}
|
|
})();
|
|
</script>
|
|
<.live_title suffix=" · aprs.me">
|
|
{assigns[:page_title] || "Aprs"}
|
|
</.live_title>
|
|
<link phx-track-static rel="stylesheet" href={~p"/assets/css/app.css"} />
|
|
|
|
<!-- Minimal vendor CSS -->
|
|
<link phx-track-static rel="stylesheet" href={~p"/assets/vendor/css/minimal-bundle.css"} />
|
|
|
|
<!-- Core utilities - always loaded -->
|
|
<script phx-track-static src={~p"/assets/vendor/js/core-bundle.js"}>
|
|
</script>
|
|
|
|
<!-- App scripts -->
|
|
<script phx-track-static type="text/javascript" src={~p"/assets/app.js"}>
|
|
</script>
|
|
|
|
<!-- Privacy-friendly analytics by Plausible -->
|
|
<script async src="https://a.w5isp.com/js/pa-7BkaTcdFcxr5y-7yhqhlJ.js">
|
|
</script>
|
|
<script nonce={@conn.private[:csp_nonce]}>
|
|
window.plausible=window.plausible||function(){(plausible.q=plausible.q||[]).push(arguments)},plausible.init=plausible.init||function(i){plausible.o=i||{}};
|
|
plausible.init()
|
|
</script>
|
|
</head>
|
|
<body class={body_class(assigns)}>
|
|
{@inner_content}
|
|
</body>
|
|
</html>
|