first commit

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
michilis
2026-08-20 22:41:25 +02:00
co-authored by Cursor
commit aa1771ea20
136 changed files with 27069 additions and 0 deletions
+111
View File
@@ -0,0 +1,111 @@
---
/**
* Privacy. The honest version is short and unusually good, so it is stated plainly
* rather than padded into a policy.
*
* Anything that depends on how the site is deployed (what the web server logs and for
* how long) is written conditionally and marked, because this repo cannot know the
* operator's nginx and logrotate settings. See NOTES-PAGES.md.
*/
import Base from '../../layouts/Base.astro';
import { localePath, useI18n, type Locale } from '../../i18n';
import { localePaths } from '../../i18n/paths';
/** One page per locale: `/privacy`, `/es/privacy`, `/nl/privacy`. */
export const getStaticPaths = localePaths;
interface Props {
locale: Locale;
}
const { locale } = Astro.props;
const t = useI18n(locale);
const GITHUB = 'https://github.com/Azzamo-net/cashumints.space';
/** Bump `disclaimer.updated` in every catalog when the text changes. */
const updated = t('disclaimer.updated');
const description = t('privacy.description');
/*
* Three list items that open with a bold lead, and two sentences with a link. Each is
* one catalog string with a placeholder, so the lead and the link can sit wherever the
* language puts them rather than always first.
*/
const bold = (value: string): string => `<b>${value}</b>`;
const operatorNote =
bold(t('privacy.logs.operatorLabel')) + ' ' + t('privacy.logs.operator');
const thirdPartyLi1 = t('privacy.thirdParties.li1', {
strong: bold(t('privacy.thirdParties.li1Label')),
link: `<a href="${localePath('/about', locale)}#relays">${t('privacy.thirdParties.li1Link')}</a>`,
});
const thirdPartyLi2 = t('privacy.thirdParties.li2', {
strong: bold(t('privacy.thirdParties.li2Label')),
});
const contactP1 = t('privacy.contact.p1', {
github: `<a href="${GITHUB}" rel="noopener">GitHub</a>`,
});
---
<Base title={t('privacy.title')} description={description}>
<div class="page">
<div class="prose">
<h1>{t('privacy.heading')}</h1>
<p class="lede">{t('privacy.lede', { date: updated })}</p>
<h2 id="no-accounts">{t('privacy.noAccounts.title')}</h2>
<p>{t('privacy.noAccounts.p1')}</p>
<h2 id="no-tracking">{t('privacy.noTracking.title')}</h2>
<p>{t('privacy.noTracking.p1')}</p>
<h2 id="logs">{t('privacy.logs.title')}</h2>
<p>{t('privacy.logs.p1')}</p>
<p class="operator-note" set:html={operatorNote} />
<h2 id="local-storage">{t('privacy.storage.title')}</h2>
<p>{t('privacy.storage.p1')}</p>
<ul>
<li>{t('privacy.storage.li1')}</li>
<li>{t('privacy.storage.li2')}</li>
</ul>
<p>{t('privacy.storage.p2')}</p>
<h2 id="third-parties">{t('privacy.thirdParties.title')}</h2>
<p>{t('privacy.thirdParties.p1')}</p>
<ul>
<li set:html={thirdPartyLi1} />
<li set:html={thirdPartyLi2} />
</ul>
<h2 id="publishing">{t('privacy.publishing.title')}</h2>
<p>{t('privacy.publishing.p1')}</p>
<h2 id="permanent">{t('privacy.permanent.title')}</h2>
<p>{t('privacy.permanent.p1')}</p>
<ul>
<li>{t('privacy.permanent.li1')}</li>
<li>{t('privacy.permanent.li2')}</li>
<li>{t('privacy.permanent.li3')}</li>
<li>{t('privacy.permanent.li4')}</li>
</ul>
<p>{t('privacy.permanent.p2')}</p>
<h2 id="contact">{t('privacy.contact.title')}</h2>
<p set:html={contactP1} />
</div>
</div>
</Base>
<style>
/* A note addressed to whoever deploys this, not to the reader. Marked as such so it
is obvious it is placeholder text until the operator confirms the real number. */
.operator-note {
border: 1px solid var(--line); border-left: 3px solid var(--amber-dim);
border-radius: 10px; background: var(--card);
padding: 14px 16px; font-size: 13.5px;
}
.operator-note b { color: var(--text); }
</style>