poke/html/priv.ejs
2025-09-11 14:23:30 +02:00

684 lines
30 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!--
This Source Code Form is subject to the terms of the GNU General Public License:
Copyright (C) 2021-2025 Poke (https://codeberg.org/ashley/poke)
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see https://www.gnu.org/licenses/.
-->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>Poke — Privacy Policy</title>
<meta name="viewport" content="width=device-width,initial-scale=1,viewport-fit=cover" />
<meta content="website" property="og:type">
<meta content="PokeTube - Legal thingy to put you into sleep" property="og:title">
<meta content="This is the PokeTube Privacy Policy meta description. Wow, helpful meta description Poke. Thanks!" property="twitter:description">
<meta content="https://cdn.glitch.me/d68d17bb-f2c0-4bc3-993f-50902734f652/aa70111e-5bcd-4379-8b23-332a33012b78.image.png?v=1701898829884" property="og:image" />
<meta content="summary_large_image" name="twitter:card">
<link href="/css/yt-ukraine.svg?v=7" rel="icon">
<style>
/* ===== Base ===== */
*, *::before, *::after { box-sizing: border-box; }
html, body { margin: 0; padding: 0; }
html { -webkit-text-size-adjust: 100%; text-size-adjust: 100%; }
body {
font-family: system-ui, -apple-system, Segoe UI, Roboto, Ubuntu, Cantarell, Noto Sans, Helvetica, Arial, "Apple Color Emoji", "Segoe UI Emoji";
line-height: 1.6;
color: #eaeaea;
background:
radial-gradient(1200px 600px at 0% 0%, #0ea5e9 0%, #0ea5e900 60%),
radial-gradient(1000px 700px at 100% 0%, #8b5cf6 0%, #8b5cf600 65%),
radial-gradient(1000px 700px at 0% 100%, #14b8a6 0%, #14b8a600 65%),
#0b0b0b;
}
a { color: #7dd3fc; text-decoration: none; }
a:hover { text-decoration: underline; }
:focus-visible { outline: 2px solid #54c8ff; outline-offset: 2px; }
img { max-width: 100%; height: auto; }
code, pre, kbd, samp {
font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "DejaVu Sans Mono", monospace;
font-size: 0.95em;
}
/* ===== Document Layout ===== */
.shell {
max-width: 1200px;
margin: 0 auto;
padding: 24px;
}
header.site {
position: sticky;
top: 0;
z-index: 10;
backdrop-filter: saturate(140%) blur(10px);
background: color-mix(in oklab, #0b0b0b 80%, transparent);
border-bottom: 1px solid #222;
width: 100%;
}
/* Make header content truly full-width on mobile while keeping desktop centered */
.site-row {
display: flex; align-items: center; justify-content: space-between;
gap: 16px;
padding: 12px clamp(12px, 4vw, 24px);
max-width: 1200px;
margin: 0 auto;
width: 100%;
}
.brand {
display: inline-flex; align-items: center; gap: 12px;
text-decoration: none; color: #fff; font-weight: 800; letter-spacing: .2px;
min-width: 0;
}
.brand img { width: 8.5em; transform: scale(1.2); height: auto; }
/* Two-column doc: sticky sidebar + paper article */
.doc {
display: grid;
grid-template-columns: 280px 1fr;
gap: 20px;
margin-top: 22px;
}
nav.toc {
position: sticky; top: 76px;
align-self: start;
background: #0f0f10;
border: 1px solid #1f1f22;
border-radius: 16px;
padding: 14px;
max-height: calc(100vh - 96px);
overflow: auto;
}
nav.toc h2 {
margin: 0 0 10px 0; font-size: 1rem; letter-spacing: .2px; color: #e8f6ff;
}
.toc ul { list-style: none; padding: 0; margin: 0; }
.toc li { margin: 6px 0; }
.toc a { color: #cfe8ff; font-size: .95rem; }
article.paper {
background: #0f0f10;
border: 1px solid #1f1f22;
border-radius: 18px;
padding: clamp(18px, 2.6vw, 28px);
box-shadow:
0 0 0 1px rgba(255,255,255,0.02) inset,
0 20px 60px rgba(0,0,0,0.35);
}
/* Article typographic styling */
.doc-title { margin: 0 0 6px 0; font-size: clamp(1.6rem, 3vw, 2.2rem); letter-spacing:.2px; }
.doc-lede { margin: 6px 0 16px 0; color: #cfcfcf; }
.meta-row {
display: flex; flex-wrap: wrap; gap: 10px; align-items: center;
margin: 10px 0 18px 0;
}
.meta {
background: #0c1114; border: 1px solid #132029; color: #d2ebff;
border-radius: 12px; padding: 8px 10px; font-size: .93rem;
}
.callout {
background: #0c1114; border: 1px solid #132029; color: #d2ebff;
padding: 12px 14px; border-radius: 14px; margin: 10px 0 18px 0;
}
h2.section {
margin: 22px 0 8px 0;
font-size: clamp(1.24rem, 2.4vw, 1.6rem);
border-bottom: 1px solid #1f1f22;
padding-bottom: 6px;
}
p { margin: 10px 0; color: #e7e7e7; }
ul { margin: 10px 0 10px 22px; }
.grid-2 {
display: grid; gap: 12px; grid-template-columns: 1fr 1fr;
}
/* --- Mobile enhancements (desktop unchanged) --- */
@media (max-width: 900px) {
html { font-size: 17px; }
.brand img { width: 7.2em; transform: none; }
.doc { grid-template-columns: 1fr; }
nav.toc { display: none; } /* hide sidebar TOC on mobile */
.mobile-toc { display: block; } /* show mobile TOC instead */
article.paper { padding: 20px; }
.doc-title { font-size: 1.6rem; }
.grid-2 { grid-template-columns: 1fr; }
.meta { font-size: .95rem; }
.shell { padding: 18px; }
}
/* Mobile TOC block (hidden on desktop) */
.mobile-toc {
display: none;
margin: 10px 0 16px 0;
background: #0f0f10;
border: 1px solid #1f1f22;
border-radius: 14px;
overflow: hidden;
}
.mobile-toc summary {
cursor: pointer;
padding: 12px 14px;
font-weight: 700;
color: #e6f7ff;
list-style: none;
display: flex; align-items: center; gap: 10px;
}
.mobile-toc summary::before {
content: "▸"; color: #8bd2ff; transition: transform .15s ease;
}
.mobile-toc[open] summary::before { transform: rotate(90deg); }
.mobile-toc .toc-links { padding: 8px 14px 14px; }
.mobile-toc .toc-links a { display: block; padding: 8px 6px; color: #cfe8ff; }
/* Floating search (works on desktop & mobile without altering layout) */
.search-fab {
position: fixed;
right: 20px; bottom: 24px;
z-index: 60;
}
.search-fab button {
appearance: none; border: 0; cursor: pointer;
border-radius: 999px;
padding: 10px 12px;
background: linear-gradient(135deg, #0ea5e9, #8b5cf6);
color: #0b0b0b; font-weight: 800;
box-shadow: 0 10px 30px rgba(0,0,0,.35);
}
.search-panel {
position: fixed;
right: 20px; bottom: 72px;
background: #0f0f10;
border: 1px solid #1f1f22;
border-radius: 14px;
padding: 10px;
width: min(520px, calc(100vw - 36px));
box-shadow: 0 12px 36px rgba(0,0,0,.45);
display: none;
}
.search-panel.active { display: block; }
.search-row {
display: flex; gap: 8px;
}
.search-row input[type="search"] {
flex: 1;
border-radius: 10px;
border: 1px solid #232327;
background: #0c0c0d;
color: #eaeaea;
padding: 10px 12px;
}
.search-row button {
appearance: none; border: 0; cursor: pointer;
padding: 10px 14px; border-radius: 10px;
background: #111; color: #ddd; border: 1px solid #222;
}
.search-row button:hover { background: #161616; border-color: #2a2a2a; }
.search-hint { margin-top: 6px; color: #a9a9a9; font-size: .925rem; }
/* prevent overlapping on iOS safe areas */
@supports (padding: max(0px)) {
.search-fab { right: max(20px, env(safe-area-inset-right)); bottom: max(24px, env(safe-area-inset-bottom)); }
.search-panel { right: max(20px, env(safe-area-inset-right)); bottom: max(72px, calc(env(safe-area-inset-bottom) + 48px)); }
}
/* Footer */
footer.site {
color: #bdbdbd; text-align: center; margin: 28px auto 50px;
}
.small { font-size: .925rem; }
.mono { font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "DejaVu Sans Mono", monospace; }
/* Print */
@media print {
header.site, nav.toc, .mobile-toc, .search-fab, .search-panel, noscript { display: none !important; }
body { background: #fff; color: #000; }
article.paper { background: #fff; border-color: #999; box-shadow: none; }
a { color: #0645ad; }
}
</style>
</head>
<body>
<!-- Site Header -->
<header class="site" role="banner" aria-label="Site header">
<div class="site-row">
<a class="brand" href="/" aria-label="Poke home">
<img src="/css/logo.svg?v=5" alt="Poke logo">
</a>
<!-- No-JS visible search fallback (also visible if JS disabled) -->
<noscript>
<form action="/search" method="GET" style="margin-left:auto">
<input type="search" name="query" placeholder="Search…" aria-label="Search Poke"
style="border-radius:10px;border:1px solid #232327;background:#0c0c0d;color:#eaeaea;padding:8px 10px;">
<button type="submit" style="margin-left:6px;border:1px solid #222;background:#111;color:#ddd;border-radius:10px;padding:8px 12px;">
Go
</button>
</form>
</noscript>
</div>
</header>
<!-- Document Body -->
<div class="shell doc" id="top">
<!-- Sidebar TOC (desktop only) -->
<nav class="toc" aria-label="Table of contents">
<h2>Contents</h2>
<ul>
<li><a href="#overview">Overview</a></li>
<li><a href="#summary">TL;DR</a></li>
<li><a href="#ownership">Ownership</a></li>
<li><a href="#initiative-privacy">Initiative Site Privacy</a></li>
<li><a href="#what-we-collect">What We Do/Dont Collect</a></li>
<li><a href="#cookies">Cookies &amp; Storage</a></li>
<li><a href="#openstreetmap">OpenStreetMap</a></li>
<li><a href="#weather">Weather Pages &amp; Services</a></li>
<li><a href="#translate">Translate Page (SimplyTranslate)</a></li>
<li><a href="#third-parties">Third-Party Requests &amp; Proxy</a></li>
<li><a href="#api-logs">API Logs Policy</a></li>
<li><a href="#legal-bases">Legal Bases (GDPR)</a></li>
<li><a href="#your-rights">Your Rights</a></li>
<li><a href="#retention">Data Retention</a></li>
<li><a href="#javascript">JavaScript &amp; No-JS</a></li>
<li><a href="#self-host">Self-Hosting</a></li>
<li><a href="#changes">Changes to this Policy</a></li>
<li><a href="#history">Document History</a></li>
<li><a href="#warranty">Warranty Disclaimer</a></li>
<li><a href="#contact">Contact</a></li>
<li><a href="#license">Policy License</a></li>
</ul>
</nav>
<!-- Paper Article -->
<article class="paper" role="article" aria-label="Poke Privacy Policy">
<details class="mobile-toc">
<summary>Contents</summary>
<div class="toc-links">
<a href="#overview">Overview</a>
<a href="#summary">TL;DR</a>
<a href="#ownership">Ownership</a>
<a href="#initiative-privacy">Initiative Site Privacy</a>
<a href="#what-we-collect">What We Do/Dont Collect</a>
<a href="#cookies">Cookies &amp; Storage</a>
<a href="#openstreetmap">OpenStreetMap</a>
<a href="#weather">Weather Pages &amp; Services</a>
<a href="#translate">Translate Page (SimplyTranslate)</a>
<a href="#third-parties">Third-Party Requests &amp; Proxy</a>
<a href="#api-logs">API Logs Policy</a>
<a href="#legal-bases">Legal Bases (GDPR)</a>
<a href="#your-rights">Your Rights</a>
<a href="#retention">Data Retention</a>
<a href="#javascript">JavaScript &amp; No-JS</a>
<a href="#self-host">Self-Hosting</a>
<a href="#changes">Changes to this Policy</a>
<a href="#history">Document History</a>
<a href="#warranty">Warranty Disclaimer</a>
<a href="#contact">Contact</a>
<a href="#license">Policy License</a>
</div>
</details>
<header>
<h1 class="doc-title">Poke Privacy Policy</h1>
<p class="doc-lede">
<strong>We dont collect any data about you.</strong> No telemetry, no trackers! Because Poke is <strong>free software</strong>, you can also check the source and self-host.
</p>
<div class="meta-row" aria-label="Document metadata">
<span class="meta">Instance: <span class="mono">poketube.fun</span></span>
<span class="meta">Version date: <time datetime="2025-09-11">September 11, 2025</time></span>
</div>
</header>
<!-- Overview / Preamble -->
<section id="overview" aria-labelledby="preamble-heading">
<h2 id="preamble-heading" class="section">Preamble</h2>
<p>
Welcome to Pokes Privacy Policy. We dont collect data about you and we dont run telemetry. Poke is <strong>free software</strong> you can read, remix, and run yourself.
</p>
<p class="callout">Not legal advice lol</p>
</section>
<!-- TL;DR -->
<section id="summary" aria-labelledby="summary-heading">
<h2 id="summary-heading" class="section">TL;DR</h2>
<div class="grid-2">
<div>
<ul>
<li><strong>No data collected.</strong> at all!!</li>
<li><strong>No telemetry.</strong> We dont phone home.</li>
<li><strong>No third-party trackers.</strong> Yippe!!</li>
<li><strong>YouTube cant see what you watch here.</strong> Its all done on the backend.</li>
</ul>
</div>
<div>
<ul>
<li><strong>Poke Account:</strong> no email required, no personal info needed.</li>
<li><strong>Poke Maps:</strong> uses OpenStreetMap data; map tiles/attribution may have separate privacy rules depending on the tile server you use.</li>
<li><strong>No required cookies.</strong> Preferences (like theme or layout) may live in local storage on your device.</li>
</ul>
</div>
</div>
</section>
<!-- Ownership -->
<section id="ownership" aria-labelledby="ownership-heading">
<h2 id="ownership-heading" class="section">Ownership</h2>
<p>
The Poke service and this default instance (<span class="mono">poketube.fun</span>) are owned and operated by the <strong>Poke Project</strong>.
Learn more at <a href="https://initiative.poketube.fun/" rel="noopener">initiative.poketube.fun</a>.
</p>
</section>
<!-- Initiative site privacy -->
<section id="initiative-privacy" aria-labelledby="initiative-privacy-heading">
<h2 id="initiative-privacy-heading" class="section">Initiative Site Privacy</h2>
<p>
The informational website at <a href="https://initiative.poketube.fun/" rel="noopener">initiative.poketube.fun</a> does not collect personal information.
For hosting-related processing, the <strong>Codeberg</strong> privacy policy applies:
<a href="https://codeberg.org/Codeberg/org/src/branch/main/PrivacyPolicy.md" target="_blank" rel="noopener">codeberg.org/Codeberg/org/src/branch/main/PrivacyPolicy.md</a>.
</p>
</section>
<!-- What we collect -->
<section id="what-we-collect" aria-labelledby="collect-heading">
<h2 id="collect-heading" class="section">What We Do/Dont Collect</h2>
<details class="block" open>
<summary>We collect <em>nothing</em> about you</summary>
<p>
We dont store IP addresses, user-agent fingerprints, unique identifiers, emails, names—none of it. Theres no telemetry or “anonymous crash reports.”
</p>
</details>
<details class="block">
<summary>What exists briefly so the internet works</summary>
<p>
Your browser and our server exchange data to deliver pages (thats how HTTP works). That info is handled <em>transiently</em> and not logged in a way that identifies you on our primary instance.
</p>
</details>
<details class="block">
<summary>Poke Account</summary>
<p>
If you make a Poke account, we dont require an email or personal details.
</p>
</details>
</section>
<!-- Cookies & storage -->
<section id="cookies" aria-labelledby="cookies-heading">
<h2 id="cookies-heading" class="section">Cookies &amp; Local Storage</h2>
<ul>
<li><strong>No cookies :D!</strong></li>
<li><strong>Local storage only for preferences</strong> (e.g., theme, layout). This stays on your device.</li>
</ul><br>
<p class="small">
To remove data stored in your browser, you can use your browsers cookie/site-data controls: <br>
<a href="https://support.google.com/chrome/answer/2392709" rel="noopener" target="_blank">Chrome</a> <br>·
<a href="https://support.mozilla.org/kb/clear-cookies-and-site-data-firefox" rel="noopener" target="_blank">Firefox</a> <br> ·
<a href="https://support.apple.com/HT201265" rel="noopener" target="_blank">Safari (iOS)</a> <br> ·
<a href="https://support.apple.com/guide/safari/manage-cookies-and-website-data-sfri11471/mac" rel="noopener" target="_blank"> <br> Safari (macOS)</a> <br>·
<a href="https://support.microsoft.com/en-us/windows/manage-cookies-in-microsoft-edge-view-allow-block-delete-and-use-168dab11-0753-043d-7c16-ede5947fc64d" rel="noopener" target="_blank">Edge</a> <br>·
<a href="https://support.brave.app/hc/en-us/articles/360048833872-How-Do-I-Clear-Cookies-And-Site-Data-In-Brave" rel="noopener" target="_blank">Brave</a>
</p>
</section>
<!-- OpenStreetMap -->
<section id="openstreetmap" aria-labelledby="osm-heading">
<h2 id="osm-heading" class="section">OpenStreetMap</h2>
<p>
Poke Maps uses <a href="https://www.openstreetmap.org/" target="_blank" rel="noopener">OpenStreetMap</a> data. That means when you explore maps at <a href="/map">/map</a>, we embed OSM via an <strong>iframe</strong> directly into the Poke site. The tiles and geographic info are delivered from OSM contributors servers.
While Poke itself doesnt collect any of your data, OpenStreetMaps tile servers have their own
<a href="https://wiki.osmfoundation.org/wiki/Privacy_Policy" target="_blank" rel="noopener">privacy policy</a>.
</p>
</section>
<!-- Weather -->
<section id="weather" aria-labelledby="weather-heading">
<h2 id="weather-heading" class="section">Weather Pages &amp; Services</h2>
<p>
Pokes weather pages use third-party, privacy-respecting services to resolve places and fetch forecasts:
</p>
<ul>
<li>
<strong>Geocoding / place lookup:</strong>
<a href="https://nominatim.openstreetmap.org/" rel="noopener" target="_blank">nominatim.openstreetmap.org</a>
(OpenStreetMap Nominatim).
Privacy: <a href="https://osmfoundation.org/wiki/Privacy_Policy" rel="noopener" target="_blank">OSMF Privacy Policy</a>.
</li>
<li>
<strong>Forecast data:</strong>
<a href="https://open-meteo.com/" rel="noopener" target="_blank">open-meteo.com</a>.
Privacy: <a href="https://open-meteo.com/en/terms#privacy" rel="noopener" target="_blank">Open-Meteo Terms &amp; Privacy</a>.
</li>
</ul>
<p class="callout">
Poke does not add trackers to these requests. However, when these services are contacted, their respective privacy policies apply to those specific requests.
</p>
</section>
<!-- Translate -->
<section id="translate" aria-labelledby="translate-heading">
<h2 id="translate-heading" class="section">Translate Page (SimplyTranslate)</h2>
<p>
Our translate page does <strong>not</strong> send data to Google. We use the community-run
<a href="https://simplytranslate.org/" rel="noopener" target="_blank">SimplyTranslate</a> service (a privacy-friendly translation front-end).
SimplyTranslate is a <strong>free software</strong> project: source code at
<a href="https://codeberg.org/ManeraKai/simplytranslate" rel="noopener" target="_blank">codeberg.org/ManeraKai/simplytranslate</a> and its
<a href="https://codeberg.org/ManeraKai/simplytranslate/raw/branch/main/legal_notice.txt" rel="noopener" target="_blank">legal notice</a>.
</p>
<p>
We dont know whether the text you translate contains personal information or not—thats up to you. Please avoid submitting sensitive personal data to any translation service.
</p>
</section>
<!-- Third parties -->
<section id="third-parties" aria-labelledby="third-heading">
<h2 id="third-heading" class="section">Third-Party Requests &amp; Proxy</h2>
<p>
When Poke needs assets (videos, thumbnails, etc.), we fetch them through our proxy (e.g., <span class="mono">p.poketube.fun</span>).
</p>
<p>
Fonts and other assets are shipped locally where possible. If a third-party endpoint is necessary, we keep it behind the proxy and strip identifying headers.
Components or ideas from the <strong>Invidious</strong> project may also be used:
<a href="https://github.com/iv-org/invidious" rel="noopener" target="_blank">github.com/iv-org/invidious</a>.
</p>
</section>
<!-- API Logs Policy -->
<section id="api-logs" aria-labelledby="api-logs-heading">
<h2 id="api-logs-heading" class="section">API Logs Policy</h2>
<p>
When you request any resource from the poke api (for example: thumbnails, API endpoint) information about the request may be logged.
</p>
<p>Information about a request is limited to:</p>
<ul>
<li>the time the request was made</li>
<li>the status code of the response</li>
<li>the method of the request</li>
<li>the requested URL</li>
<li>how long it took to complete the request.</li>
</ul>
<p>
<strong>No identifying information is logged</strong>, such as the visitors cookie, user-agent, or IP address. Here are a couple lines to serve as an example:
</p>
<pre class="small" style="white-space:pre-wrap;margin:8px 0;">
2019-01-19 16:37:47 +00:00 200 GET /api/v1/comments/xrlETJYzH-c?format=html&amp;hl=en-US 1345.88ms
2019-01-19 16:37:53 +00:00 200 GET /vi/r5P-f5arPXE/maxres.jpg 1085.41ms
2019-01-19 16:37:54 +00:00 200 GET /watch 7.04ms
</pre>
<p>
This website does not store the visitors user-agent or IP address and does not use fingerprinting, advertisements, or tracking of any form.
</p>
</section>
<!-- Legal bases -->
<section id="legal-bases" aria-labelledby="gdpr-heading">
<h2 id="gdpr-heading" class="section">Legal Bases for Processing (GDPR)</h2>
<ul>
<li><strong>Legitimate interests:</strong> Running Poke smoothly while collecting exactly zero personal data.</li>
<li><strong>Consent:</strong> If we ever invent an optional feature that needs info, well ask. But right now? Theres nothing to consent to.</li>
<li><strong>Legal obligation:</strong> Even if someone waves a fancy piece of paper at us, we literally have nothing personal to hand over. Empty pockets.</li>
</ul>
</section>
<!-- Your rights -->
<section id="your-rights" aria-labelledby="rights-heading">
<h2 id="rights-heading" class="section">Your Privacy Rights</h2>
<p>
Since Poke doesnt collect or store personal data, theres basically nothing for us to give, sell, or lose about you.
You dont have to worry about “export my data” or “delete my profile” requests because we dont have anything on you in the first place.
</p>
<p>
Poke Accounts dont require an email, name, or any other identifying info — and theres no way to add that kind of data even if you wanted to.
</p>
</section>
<!-- Data Retention -->
<section id="retention" aria-labelledby="retention-heading">
<h2 id="retention-heading" class="section">Data Retention</h2>
<ul>
<li><strong>Server logs:</strong> No personal identifiers on our main instance.</li>
<li><strong>Telemetry/analytics:</strong> Not enabled here.</li>
</ul>
</section>
<!-- JavaScript & No-JS -->
<section id="javascript" aria-labelledby="javascript-heading">
<h2 id="javascript-heading" class="section">JavaScript &amp; No-JS</h2>
<p>
JavaScript is <strong>optional</strong> on Pokes websites. Core features—including search—work without JavaScript.
</p>
</section>
<!-- Self-host -->
<section id="self-host" aria-labelledby="selfhost-heading">
<h2 id="selfhost-heading" class="section">Self-Hosting</h2>
<p>
Poke is free software under the <strong>GNU GPL v3.0 or later</strong>. you can self-host it yourself! <a href="https://codeberg.org/ashley/poke/#hosting-poke"> see here </a>
</p>
</section>
<!-- Changes -->
<section id="changes" aria-labelledby="changes-heading">
<h2 id="changes-heading" class="section">Changes to this Policy</h2>
<p>
If we ever change how privacy works here, well update the date at the top and announce major changes. Spoiler: changes would not include adding two bananas. this isnt minions LOL :3
</p>
</section>
<!-- Document History -->
<section id="history" aria-labelledby="history-heading">
<h2 id="history-heading" class="section">Document History</h2>
<p>
You can view the full edit history for this policy at:
<a href="https://codeberg.org/ashley/poke/commits/branch/main/html/priv.ejs" target="_blank" rel="noopener">codeberg.org/ashley/poke/commits/branch/main/html/priv.ejs</a>.
</p>
</section>
<!-- Warranty Disclaimer -->
<section id="warranty" aria-labelledby="warranty-heading">
<h2 id="warranty-heading" class="section">Warranty Disclaimer</h2>
<pre class="small" style="white-space:pre-wrap;margin:8px 0;">
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER,
OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM
(E.G., LOSS OF DATA, DATA BEING RENDERED INACCURATE, OR FAILURES OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
</pre>
</section>
<!-- Contact -->
<section id="contact" aria-labelledby="contact-heading">
<h2 id="contact-heading" class="section">Contact</h2>
<p>
Questions or concerns? Open an issue on our project tracker :D
</p>
<ul>
<li>Project: <span class="mono">codeberg.org/Ashley/poke</span></li>
<li>Initiative: <a href="https://initiative.poketube.fun/" rel="noopener">initiative.poketube.fun</a></li>
</ul>
</section>
<!-- License -->
<section id="license" aria-labelledby="license-heading">
<h2 id="license-heading" class="section">Policy License</h2>
<p class="small">
© 20212025 Poke (Poke Project). This policy is licensed under the
<strong>Creative Commons AttributionShareAlike 4.0 International</strong> (CC BY-SA 4.0).
</p>
</section>
<footer class="site small" aria-label="Document footer">
<p><a href="#top">Return to Top</a></p>
</footer>
</article>
</div>
<div class="search-fab" aria-live="polite">
<button type="button" id="openSearch" aria-expanded="false" aria-controls="policySearchPanel" title="Search Poke">
🔎 Search
</button>
</div>
<div id="policySearchPanel" class="search-panel" role="dialog" aria-modal="false" aria-label="Search">
<form class="search-row" id="policySearchForm" action="/search" method="GET">
<input type="search" name="query" id="policySearchInput" placeholder="Search…"
aria-label="Search Poke" autocomplete="off" />
<button type="submit">Go</button>
<button type="button" id="closeSearch">Close</button>
</form>
</div>
<script>
(function () {
const openBtn = document.getElementById('openSearch');
const panel = document.getElementById('policySearchPanel');
const input = document.getElementById('policySearchInput');
const closeBtn = document.getElementById('closeSearch');
const form = document.getElementById('policySearchForm');
function openPanel() {
panel.classList.add('active');
openBtn.setAttribute('aria-expanded', 'true');
setTimeout(() => input && input.focus(), 0);
}
function closePanel() {
panel.classList.remove('active');
openBtn.setAttribute('aria-expanded', 'false');
openBtn.focus();
}
openBtn.addEventListener('click', () => {
if (panel.classList.contains('active')) closePanel(); else openPanel();
});
closeBtn.addEventListener('click', closePanel);
window.addEventListener('keydown', (e) => {
if (e.key === '/' && !e.metaKey && !e.ctrlKey && !e.altKey) {
e.preventDefault();
if (!panel.classList.contains('active')) openPanel();
input && input.focus();
} else if (e.key === 'Escape' && panel.classList.contains('active')) {
closePanel();
}
});
form.addEventListener('submit', (e) => {
const q = input.value.trim();
if (!q) { e.preventDefault(); return; }
});
})();
</script>
</body>
</html>