Files
2026-07-03 21:05:07 +02:00

353 lines
10 KiB
HTML

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Privacy Policy | RadioPlayer</title>
<meta name="description" content="Privacy policy for the RadioPlayer web app.">
<meta name="theme-color" content="#111318">
<link rel="manifest" href="manifest.json?v=__BUILD_STAMP__">
<link rel="icon" type="image/png" sizes="192x192" href="assets/radioplayer-logo-192.png">
<link rel="icon" type="image/png" sizes="512x512" href="assets/radioplayer-logo-512.png">
<link rel="apple-touch-icon" href="assets/radioplayer-logo-192.png">
<style>
:root {
color-scheme: dark;
--page-bg: #111318;
--panel: rgba(16, 20, 27, 0.82);
--panel-strong: rgba(12, 15, 20, 0.94);
--border: rgba(255, 255, 255, 0.12);
--text-main: #f7f8fb;
--text-muted: rgba(247, 248, 251, 0.72);
--accent: #4dd7c8;
--accent-2: #ffb45c;
--accent-3: #8fb3ff;
--shadow: 0 28px 72px rgba(0, 0, 0, 0.35);
}
* {
box-sizing: border-box;
}
html {
min-height: 100%;
background: var(--page-bg);
font-family: Inter, "Segoe UI", system-ui, -apple-system, BlinkMacSystemFont, sans-serif;
}
body {
margin: 0;
min-height: 100vh;
color: var(--text-main);
background:
radial-gradient(circle at 18% 8%, rgba(77, 215, 200, 0.24), transparent 34%),
radial-gradient(circle at 86% 82%, rgba(255, 180, 92, 0.2), transparent 32%),
linear-gradient(180deg, #111318 0%, #101218 58%, #111821 100%);
}
body::before {
content: "";
position: fixed;
inset: 0;
pointer-events: none;
background-image:
linear-gradient(rgba(255, 255, 255, 0.04) 1px, transparent 1px),
linear-gradient(90deg, rgba(255, 255, 255, 0.035) 1px, transparent 1px);
background-size: 42px 42px;
mask-image: linear-gradient(to bottom, rgba(0, 0, 0, 0.72), transparent 82%);
opacity: 0.5;
}
a {
color: inherit;
}
.page-shell {
position: relative;
z-index: 1;
width: min(960px, calc(100% - 32px));
margin: 0 auto;
padding: 28px 0 64px;
}
.topbar {
display: flex;
justify-content: space-between;
align-items: center;
gap: 16px;
margin-bottom: 20px;
}
.brand {
display: inline-flex;
align-items: center;
gap: 12px;
text-decoration: none;
}
.brand img {
width: 44px;
height: 44px;
border-radius: 14px;
box-shadow: 0 12px 28px rgba(77, 215, 200, 0.18);
}
.brand-title {
display: block;
font-size: 1.02rem;
font-weight: 800;
color: var(--text-main);
}
.brand-subtitle {
display: block;
color: var(--text-muted);
font-size: 0.82rem;
font-weight: 700;
}
.back-link {
padding: 0.7rem 1rem;
border: 1px solid var(--border);
border-radius: 999px;
background: rgba(255, 255, 255, 0.06);
color: var(--text-main);
text-decoration: none;
font-size: 0.92rem;
font-weight: 700;
}
.back-link:hover,
.back-link:focus-visible {
border-color: rgba(77, 215, 200, 0.45);
background: rgba(255, 255, 255, 0.1);
}
.privacy-card {
padding: clamp(24px, 4vw, 42px);
border: 1px solid var(--border);
border-radius: 28px;
background:
linear-gradient(145deg, rgba(77, 215, 200, 0.08), transparent 42%),
linear-gradient(315deg, rgba(255, 180, 92, 0.08), transparent 36%),
linear-gradient(180deg, rgba(16, 20, 27, 0.8), rgba(255, 255, 255, 0.035));
box-shadow: var(--shadow);
backdrop-filter: blur(22px) saturate(130%);
}
.eyebrow {
margin: 0 0 10px;
color: var(--accent);
font-size: 0.78rem;
font-weight: 800;
letter-spacing: 0.08em;
text-transform: uppercase;
}
h1 {
margin: 0;
font-size: clamp(2rem, 5vw, 3.25rem);
line-height: 0.98;
}
.lead {
max-width: 64ch;
margin: 18px 0 0;
color: var(--text-muted);
font-size: 1rem;
line-height: 1.7;
}
.meta {
display: inline-flex;
margin-top: 18px;
padding: 0.45rem 0.8rem;
border-radius: 999px;
background: rgba(143, 179, 255, 0.12);
color: var(--text-main);
font-size: 0.82rem;
font-weight: 700;
}
.sections {
display: grid;
gap: 16px;
margin-top: 28px;
}
section {
padding: 18px 20px;
border: 1px solid rgba(255, 255, 255, 0.08);
border-radius: 20px;
background: rgba(255, 255, 255, 0.045);
}
h2 {
margin: 0 0 10px;
font-size: 1.05rem;
}
p,
li {
color: var(--text-muted);
line-height: 1.7;
}
p:last-child,
ul:last-child {
margin-bottom: 0;
}
ul {
margin: 0;
padding-left: 1.2rem;
}
strong {
color: var(--text-main);
}
.note {
margin-top: 22px;
color: var(--text-muted);
font-size: 0.9rem;
}
@media (max-width: 720px) {
.page-shell {
width: min(100% - 20px, 960px);
padding-top: 16px;
}
.topbar {
flex-direction: column;
align-items: stretch;
}
.back-link {
text-align: center;
}
.privacy-card {
border-radius: 22px;
}
section {
padding: 16px;
border-radius: 18px;
}
}
</style>
</head>
<body>
<div class="page-shell">
<div class="topbar">
<a class="brand" href="./">
<img src="assets/radioplayer-logo-192.png" alt="RadioPlayer">
<span>
<span class="brand-title">RadioPlayer</span>
<span class="brand-subtitle">Web radio player</span>
</span>
</a>
<a class="back-link" href="./">Back to the app</a>
</div>
<main class="privacy-card">
<p class="eyebrow">Policy</p>
<h1>Privacy Policy</h1>
<p class="lead">
This page explains which data RadioPlayer stores only in your browser, why it uses that data, and how you
can remove it. This text applies to the web version of the app and to its PWA installation.
</p>
<div class="meta">Effective date: April 29, 2026</div>
<div class="sections">
<section>
<h2>What data is created during use</h2>
<p>
RadioPlayer does not require registration or a user account. The app may, however, store settings and
lists that you create locally in your browser so they are available again the next time you visit.
</p>
<ul>
<li>playback volume, the last selected station, and the last selected country filter,</li>
<li>your list of favorite stations and local playback statistics used to show recently played stations,</li>
<li>stations that you add manually in the editor,</li>
<li>the selected audio casting mode for a Google Cast connection.</li>
</ul>
</section>
<section>
<h2>Where the data is stored</h2>
<p>
The data listed above is stored locally in your browser or in this website's data on your device. For
more persistent storage of settings and stations, the app uses the browser's local IndexedDB database.
When you use a new version for the first time, it may also migrate older local settings from previous
local storage so your data is preserved. RadioPlayer does not send these settings to its own server and
does not share them with other users without your action.
</p>
<p>
The app also uses cached application files for faster startup and operation without downloading all static
files again. You can clear this cache at any time in your browser settings.
</p>
</section>
<section>
<h2>External providers and streaming</h2>
<p>
When you start a radio stream, your browser connects directly to the radio station's server or another
stream provider. These external providers typically receive the technical data required to deliver the
stream, such as your IP address, browser details, and the time of the request.
</p>
<p>
If you use Google Cast, the Google Cast Web Sender SDK is used to establish and manage casting. In that
case, Google or the playback device may process data required for the casting session and media routing.
</p>
<p>
On Apple devices, the app may also offer AirPlay output selection. In that case, the media stream is
routed to the selected AirPlay device through your browser and operating system capabilities, so the
external device or Apple may process data required to establish and manage playback.
</p>
</section>
<section>
<h2>Cookies and analytics</h2>
<p>
The current version of the app does not use analytics scripts for user profiling and does not set its own
advertising cookies. To store settings, the app uses the browser's local storage and IndexedDB rather
than traditional cookies.
</p>
</section>
<section>
<h2>Hosting logs</h2>
<p>
The website host may automatically keep basic technical access logs for security, stability, or debugging
purposes. The scope of these logs depends on the hosting provider and is not part of the settings managed
by the RadioPlayer user interface.
</p>
</section>
<section>
<h2>How to delete local data</h2>
<p>
If you want to remove saved favorite stations, custom stations, or other settings, delete this website's
data in your browser. This removes local settings and cached application files from this device.
</p>
</section>
<section>
<h2>Policy updates</h2>
<p>
This policy may be updated if the app's behavior, hosting setup, or external providers change. The
current version of the text will always be published on this page.
</p>
</section>
</div>
</main>
</div>
</body>
</html>