Revamp workspace archive handling with async support, input validation improvements and better session management
CI / check (22) (push) Failing after 4m49s
CI / check (24) (push) Failing after 4m55s

This commit is contained in:
2026-10-13 18:19:20 +02:00
parent 068843beda
commit d5d886ac5f
9 changed files with 1266 additions and 1113 deletions
+254 -191
View File
@@ -12,203 +12,266 @@
<link rel="stylesheet" href="/css/shell.css?v=20260923-legal">
<link rel="stylesheet" href="/css/legal.css?v=20260923-legal">
<link
href="https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@400;500;700&family=Manrope:wght@400;500;600;700;800&display=swap"
rel="stylesheet">
href="https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@400;500;700&family=Manrope:wght@400;500;600;700;800&display=swap"
rel="stylesheet">
</head>
<body class="site-page legal-page">
<!-- site-header -->
<main id="main" class="legal-shell">
<header class="legal-hero">
<p class="eyebrow">Your data, explained</p>
<h1>Privacy Policy</h1>
<p class="legal-summary">This policy explains what personal data Elsewhere handles, why it is needed, where
it goes and the choices available to you.</p>
<p class="legal-updated">Effective and last updated <time datetime="2026-09-23">23 September 2026</time></p>
</header>
<!-- site-header -->
<main id="main" class="legal-shell">
<header class="legal-hero">
<p class="eyebrow">Your data, explained</p>
<h1>Privacy Policy</h1>
<p class="legal-summary">This policy explains what personal data Elsewhere handles, why it is needed, where
it goes and the choices available to you.</p>
<p class="legal-updated">Effective and last updated
<time datetime="2026-09-23">23 September 2026</time>
</p>
</header>
<aside class="legal-callout" aria-label="Privacy summary">
<div><strong>No advertising</strong><span>We do not sell personal data or use it for targeted ads.</span></div>
<div><strong>You stay in control</strong><span>Export your workspace or delete your account in Settings.</span></div>
<div><strong>Features are optional</strong><span>Web search, image uploads and public publishing are choices you make.</span></div>
</aside>
<div class="legal-layout">
<nav class="legal-toc" aria-label="On this page">
<p>On this page</p>
<ol>
<li><a href="#controller">Who is responsible</a></li>
<li><a href="#data">Data we handle</a></li>
<li><a href="#use">How and why we use it</a></li>
<li><a href="#providers">AI, images and search</a></li>
<li><a href="#public">Public features</a></li>
<li><a href="#sharing">Sharing</a></li>
<li><a href="#cookies">Cookies</a></li>
<li><a href="#retention">Retention</a></li>
<li><a href="#transfers">International transfers</a></li>
<li><a href="#security">Security</a></li>
<li><a href="#rights">Your rights</a></li>
<li><a href="#changes">Changes and contact</a></li>
</ol>
</nav>
<article class="legal-content">
<section id="controller">
<h2><span>01</span> Who is responsible</h2>
<p>Kristian Cerni is the controller responsible for Elsewhere. This policy applies to the Elsewhere
website, account area, chats, persona market and related features.</p>
<dl class="legal-details">
<div><dt>Service</dt><dd>Elsewhere</dd></div>
<div><dt>Privacy contact</dt><dd><a href="mailto:kriscerni@gmail.com">kriscerni@gmail.com</a></dd></div>
<div><dt>Project contact</dt><dd><a href="https://github.com/KrisHD1337" rel="external noopener">github.com/KrisHD1337</a></dd></div>
</dl>
</section>
<section id="data">
<h2><span>02</span> Personal data we handle</h2>
<p>We collect data you provide and technical data generated while you use the service:</p>
<ul>
<li><strong>Account data:</strong> username, password hash and session records. Elsewhere does not
ask for an email address during registration.</li>
<li><strong>Workspace content:</strong> chats, AI responses, conversation titles, personas, prompt
templates, settings, memories, model choices, retry history and roleplay state.</li>
<li><strong>Uploaded images:</strong> image files plus filename, type, size, dimensions, ownership,
storage key, timestamps and cached analysis associated with your question.</li>
<li><strong>Persona market activity:</strong> published personas and creator username, collections,
favourites, ratings, reports and moderation records.</li>
<li><strong>Web-search data:</strong> the search query derived from your current message, selected
result links and snippets when you turn on web search.</li>
<li><strong>Technical and security data:</strong> session identifiers, request identifiers, routes,
response status and timing, account username for signed-in requests, and IP-based rate-limit
information held temporarily in memory.</li>
</ul>
<p>Please avoid putting sensitive personal data into chats or images unless it is genuinely necessary
for your use of the service.</p>
</section>
<section id="use">
<h2><span>03</span> How and why we use data</h2>
<div class="legal-table-wrap">
<table>
<thead><tr><th>Purpose</th><th>Data used</th><th>Basis where the GDPR applies</th></tr></thead>
<tbody>
<tr><td>Create and secure your account</td><td>Account, session and security data</td><td>Performance of our contract; legitimate interests in security</td></tr>
<tr><td>Provide chats, personas, uploads, exports and settings</td><td>Account and workspace content</td><td>Performance of our contract</td></tr>
<tr><td>Run optional AI, image and search features</td><td>Your selected message, relevant context, images or query</td><td>Performance of our contract at your request</td></tr>
<tr><td>Operate and moderate the persona market</td><td>Published content, username and market activity</td><td>Performance of our contract; legitimate interests in a safe public space</td></tr>
<tr><td>Prevent abuse, diagnose faults and maintain reliability</td><td>Technical, account and limited content data where necessary</td><td>Legitimate interests in security and service operation</td></tr>
<tr><td>Meet legal obligations and defend claims</td><td>Relevant records</td><td>Legal obligation or legitimate interests</td></tr>
</tbody>
</table>
</div>
<p>We do not use your data for targeted advertising and do not sell it. Elsewhere does not make
decisions about you that produce legal or similarly significant effects solely by automated means.</p>
</section>
<section id="providers">
<h2><span>04</span> AI models, image analysis and web search</h2>
<p>To generate a reply, Elsewhere sends your current message and relevant conversation context to the
configured model backend. Depending on your settings, this may also include persona instructions,
conversation summaries, stored memories, selected web results and analysis derived from images.
The final chat model does not receive image files directly; a separate configured vision model
receives the image and your question to produce an analysis.</p>
<p>If you enable web search, Elsewhere sends a query based on your current message to the configured
SearXNG service. The service may pass that query to search engines enabled by its operator. It does
not receive your full conversation, account password or persona profile from Elsewhere.</p>
<p>The deployment operator chooses and hosts or configures these services. Their location and
sub-processors can therefore vary by deployment. Contact us if you need current information about
the providers used by this instance.</p>
</section>
<section id="public">
<h2><span>05</span> Public persona features</h2>
<p>Your chats, uploads and private personas are not public by default. If you publish a persona, its
profile fields and your username become visible in the public market along with aggregate usage,
favourite and rating information. Reports are available to administrators for moderation.</p>
<p>You can unpublish a persona. A private copy previously collected by another user is separate and
is not automatically removed when the original is unpublished or your account is deleted.</p>
</section>
<section id="sharing">
<h2><span>06</span> When data is shared</h2>
<p>We disclose personal data only as needed:</p>
<ul>
<li>to the configured model and search services when you use those features;</li>
<li>to infrastructure providers that host or support the application under appropriate safeguards;</li>
<li>to other users when you intentionally publish a persona;</li>
<li>when required by law, a valid legal process or to protect rights, safety and service security; or</li>
<li>as part of a service reorganisation, with notice and appropriate protection where required.</li>
</ul>
</section>
<section id="cookies">
<h2><span>07</span> Cookies and local storage</h2>
<p>Elsewhere uses an essential, HTTP-only session cookie to keep you signed in. It expires after the
configured session period or when invalidated. The browser also stores appearance and interface
preferences locally on your device. These technologies are used for service functionality, not
advertising or cross-site tracking.</p>
</section>
<section id="retention">
<h2><span>08</span> How long data is kept</h2>
<ul>
<li><strong>Account and workspace data</strong> remain until you delete individual items or your account.</li>
<li><strong>Temporary, unattached uploads</strong> are scheduled for deletion after 24 hours. Images attached to a message remain with that conversation.</li>
<li><strong>Session records</strong> expire according to the configured session lifetime and can be invalidated from Settings.</li>
<li><strong>Operational logs and in-memory rate-limit records</strong> are kept only as long as reasonably needed for security, diagnosis and operation.</li>
</ul>
<p>Deleting your account removes its workspace, attached files and published market entries from the
active service. Deletion from backups or queued file cleanup may take additional time. We may keep
limited records longer where required by law or necessary to establish, exercise or defend legal claims.</p>
</section>
<section id="transfers">
<h2><span>09</span> International transfers</h2>
<p>Data may be processed outside your country when infrastructure, model or search providers are
located elsewhere. Where required, we rely on a legally recognised transfer mechanism, such as an
adequacy decision or appropriate contractual safeguards. Contact us for details relevant to the
current deployment.</p>
</section>
<section id="security">
<h2><span>10</span> Security</h2>
<p>We use reasonable technical and organisational measures designed to protect personal data,
including hashed passwords, HTTP-only same-site session cookies, same-origin request protection,
access checks for chats and attachments, upload validation and rate limiting. No system is
completely secure, so please use a unique password and do not share it.</p>
</section>
<section id="rights">
<h2><span>11</span> Your choices and rights</h2>
<p>Depending on the law that applies to you, you may have the right to request access, correction,
deletion, restriction, portability or an objection to certain processing. You may also withdraw
consent where processing relies on consent, without affecting earlier lawful processing.</p>
<p>You can export your workspace and delete your account directly in Settings. For other requests,
email <a href="mailto:kriscerni@gmail.com">kriscerni@gmail.com</a>. We may need to verify your
identity before completing a request.</p>
<p>You may lodge a complaint with the Swiss Federal Data Protection and Information Commissioner
(FDPIC) or, where the GDPR applies, your local data protection authority. We encourage you to
contact us first so we can try to resolve the concern.</p>
</section>
<section id="changes">
<h2><span>12</span> Changes and contact</h2>
<p>We may update this policy when the service, providers or applicable requirements change. We will
post the new version here, change the date above and provide additional notice for material
changes where appropriate.</p>
<p>Questions or requests can be sent to <a
href="mailto:kriscerni@gmail.com">kriscerni@gmail.com</a>.</p>
</section>
</article>
<aside class="legal-callout" aria-label="Privacy summary">
<div><strong>No advertising</strong><span>We do not sell personal data or use it for targeted ads.</span></div>
<div><strong>You stay in control</strong><span>Export your workspace or delete your account in Settings.</span>
</div>
</main>
<div><strong>Features are optional</strong><span>Web search, image uploads and public publishing are choices you make.</span>
</div>
</aside>
<footer class="legal-footer">
<span>Elsewhere</span>
<a href="/tos.html">Terms of Service</a>
<a href="/">Back to Elsewhere</a>
</footer>
<script type="module" src="/js/workspaceNavigation.js?v=20260923-legal"></script>
<div class="legal-layout">
<nav class="legal-toc" aria-label="On this page">
<p>On this page</p>
<ol>
<li><a href="#controller">Who is responsible</a></li>
<li><a href="#data">Data we handle</a></li>
<li><a href="#use">How and why we use it</a></li>
<li><a href="#providers">AI, images and search</a></li>
<li><a href="#public">Public features</a></li>
<li><a href="#sharing">Sharing</a></li>
<li><a href="#cookies">Cookies</a></li>
<li><a href="#retention">Retention</a></li>
<li><a href="#transfers">International transfers</a></li>
<li><a href="#security">Security</a></li>
<li><a href="#rights">Your rights</a></li>
<li><a href="#changes">Changes and contact</a></li>
</ol>
</nav>
<article class="legal-content">
<section id="controller">
<h2><span>01</span> Who is responsible</h2>
<p>Kristian Cerni is the controller responsible for Elsewhere. This policy applies to the Elsewhere
website, account area, chats, persona market and related features.</p>
<dl class="legal-details">
<div>
<dt>Service</dt>
<dd>Elsewhere</dd>
</div>
<div>
<dt>Privacy contact</dt>
<dd><a href="mailto:kriscerni@gmail.com">kriscerni@gmail.com</a></dd>
</div>
<div>
<dt>Project contact</dt>
<dd><a href="https://github.com/KrisHD1337" rel="external noopener">github.com/KrisHD1337</a>
</dd>
</div>
</dl>
</section>
<section id="data">
<h2><span>02</span> Personal data we handle</h2>
<p>We collect data you provide and technical data generated while you use the service:</p>
<ul>
<li><strong>Account data:</strong> username, password hash and session records. Elsewhere does not
ask for an email address during registration.
</li>
<li><strong>Workspace content:</strong> chats, AI responses, conversation titles, personas, prompt
templates, settings, memories, model choices, retry history and roleplay state.
</li>
<li><strong>Uploaded images:</strong> image files plus filename, type, size, dimensions, ownership,
storage key, timestamps and cached analysis associated with your question.
</li>
<li><strong>Persona market activity:</strong> published personas and creator username, collections,
favourites, ratings, reports and moderation records.
</li>
<li><strong>Web-search data:</strong> the search query derived from your current message, selected
result links and snippets when you turn on web search.
</li>
<li><strong>Technical and security data:</strong> session identifiers, request identifiers, routes,
response status and timing, account username for signed-in requests, and IP-based rate-limit
information held temporarily in memory.
</li>
</ul>
<p>Please avoid putting sensitive personal data into chats or images unless it is genuinely necessary
for your use of the service.</p>
</section>
<section id="use">
<h2><span>03</span> How and why we use data</h2>
<div class="legal-table-wrap">
<table>
<thead>
<tr>
<th>Purpose</th>
<th>Data used</th>
<th>Basis where the GDPR applies</th>
</tr>
</thead>
<tbody>
<tr>
<td>Create and secure your account</td>
<td>Account, session and security data</td>
<td>Performance of our contract; legitimate interests in security</td>
</tr>
<tr>
<td>Provide chats, personas, uploads, exports and settings</td>
<td>Account and workspace content</td>
<td>Performance of our contract</td>
</tr>
<tr>
<td>Run optional AI, image and search features</td>
<td>Your selected message, relevant context, images or query</td>
<td>Performance of our contract at your request</td>
</tr>
<tr>
<td>Operate and moderate the persona market</td>
<td>Published content, username and market activity</td>
<td>Performance of our contract; legitimate interests in a safe public space</td>
</tr>
<tr>
<td>Prevent abuse, diagnose faults and maintain reliability</td>
<td>Technical, account and limited content data where necessary</td>
<td>Legitimate interests in security and service operation</td>
</tr>
<tr>
<td>Meet legal obligations and defend claims</td>
<td>Relevant records</td>
<td>Legal obligation or legitimate interests</td>
</tr>
</tbody>
</table>
</div>
<p>We do not use your data for targeted advertising and do not sell it. Elsewhere does not make
decisions about you that produce legal or similarly significant effects solely by automated
means.</p>
</section>
<section id="providers">
<h2><span>04</span> AI models, image analysis and web search</h2>
<p>To generate a reply, Elsewhere sends your current message and relevant conversation context to the
configured model backend. Depending on your settings, this may also include persona instructions,
conversation summaries, stored memories, selected web results and analysis derived from images.
The final chat model does not receive image files directly; a separate configured vision model
receives the image and your question to produce an analysis.</p>
<p>If you enable web search, Elsewhere sends a query based on your current message to the configured
SearXNG service. The service may pass that query to search engines enabled by its operator. It does
not receive your full conversation, account password or persona profile from Elsewhere.</p>
<p>The deployment operator chooses and hosts or configures these services. Their location and
sub-processors can therefore vary by deployment. Contact us if you need current information about
the providers used by this instance.</p>
</section>
<section id="public">
<h2><span>05</span> Public persona features</h2>
<p>Your chats, uploads and private personas are not public by default. If you publish a persona, its
profile fields and your username become visible in the public market along with aggregate usage,
favourite and rating information. Reports are available to administrators for moderation.</p>
<p>You can unpublish a persona. A private copy previously collected by another user is separate and
is not automatically removed when the original is unpublished or your account is deleted.</p>
</section>
<section id="sharing">
<h2><span>06</span> When data is shared</h2>
<p>We disclose personal data only as needed:</p>
<ul>
<li>to the configured model and search services when you use those features;</li>
<li>to infrastructure providers that host or support the application under appropriate safeguards;
</li>
<li>to other users when you intentionally publish a persona;</li>
<li>when required by law, a valid legal process or to protect rights, safety and service security;
or
</li>
<li>as part of a service reorganisation, with notice and appropriate protection where required.</li>
</ul>
</section>
<section id="cookies">
<h2><span>07</span> Cookies and local storage</h2>
<p>Elsewhere uses an essential, HTTP-only session cookie to keep you signed in. It expires after the
configured session period or when invalidated. The browser also stores appearance and interface
preferences locally on your device. These technologies are used for service functionality, not
advertising or cross-site tracking.</p>
</section>
<section id="retention">
<h2><span>08</span> How long data is kept</h2>
<ul>
<li><strong>Account and workspace data</strong> remain until you delete individual items or your
account.
</li>
<li><strong>Temporary, unattached uploads</strong> are scheduled for deletion after 24 hours. Images
attached to a message remain with that conversation.
</li>
<li><strong>Session records</strong> expire according to the configured session lifetime and can be
invalidated from Settings.
</li>
<li><strong>Operational logs and in-memory rate-limit records</strong> are kept only as long as
reasonably needed for security, diagnosis and operation.
</li>
</ul>
<p>Deleting your account removes its workspace, attached files and published market entries from the
active service. Deletion from backups or queued file cleanup may take additional time. We may keep
limited records longer where required by law or necessary to establish, exercise or defend legal
claims.</p>
</section>
<section id="transfers">
<h2><span>09</span> International transfers</h2>
<p>Data may be processed outside your country when infrastructure, model or search providers are
located elsewhere. Where required, we rely on a legally recognised transfer mechanism, such as an
adequacy decision or appropriate contractual safeguards. Contact us for details relevant to the
current deployment.</p>
</section>
<section id="security">
<h2><span>10</span> Security</h2>
<p>We use reasonable technical and organisational measures designed to protect personal data,
including hashed passwords, HTTP-only same-site session cookies, same-origin request protection,
access checks for chats and attachments, upload validation and rate limiting. No system is
completely secure, so please use a unique password and do not share it.</p>
</section>
<section id="rights">
<h2><span>11</span> Your choices and rights</h2>
<p>Depending on the law that applies to you, you may have the right to request access, correction,
deletion, restriction, portability or an objection to certain processing. You may also withdraw
consent where processing relies on consent, without affecting earlier lawful processing.</p>
<p>You can export your workspace and delete your account directly in Settings. For other requests,
email <a href="mailto:kriscerni@gmail.com">kriscerni@gmail.com</a>. We may need to verify your
identity before completing a request.</p>
<p>You may lodge a complaint with the Swiss Federal Data Protection and Information Commissioner
(FDPIC) or, where the GDPR applies, your local data protection authority. We encourage you to
contact us first so we can try to resolve the concern.</p>
</section>
<section id="changes">
<h2><span>12</span> Changes and contact</h2>
<p>We may update this policy when the service, providers or applicable requirements change. We will
post the new version here, change the date above and provide additional notice for material
changes where appropriate.</p>
<p>Questions or requests can be sent to <a
href="mailto:kriscerni@gmail.com">kriscerni@gmail.com</a>.</p>
</section>
</article>
</div>
</main>
<footer class="legal-footer">
<span>Elsewhere</span>
<a href="/tos.html">Terms of Service</a>
<a href="/">Back to Elsewhere</a>
</footer>
<script type="module" src="/js/workspaceNavigation.js?v=20260923-legal"></script>
</body>
</html>