···11---
22import BaseLayout from '../layouts/StaticLayout.astro';
33+44+const lastUpdated = 'April 27, 2026';
55+const effectiveDate = 'May 1, 2026';
66+77+const sections = [
88+ { id: 'overview', title: 'Overview' },
99+ { id: 'data-collected', title: 'Data we collect' },
1010+ { id: 'purposes', title: 'Purposes and legal bases' },
1111+ { id: 'recipients', title: 'Recipients and transfers' },
1212+ { id: 'retention', title: 'Retention' },
1313+ { id: 'extension', title: 'Browser extension' },
1414+ { id: 'cookies', title: 'Cookies' },
1515+ { id: 'public-content', title: 'Public content' },
1616+ { id: 'rights', title: 'Your rights' },
1717+ { id: 'children', title: 'Children' },
1818+ { id: 'contact', title: 'Contact' },
1919+];
320---
421522<BaseLayout title="Privacy Policy - Margin" description="Margin Privacy Policy">
66- <div class="max-w-3xl mx-auto py-12 px-4">
77- <a href="/home" class="inline-flex items-center gap-2 text-sm font-medium text-surface-500 hover:text-surface-900 dark:hover:text-white transition-colors mb-8">
88- <svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m12 19-7-7 7-7"/><path d="M19 12H5"/></svg>
99- <span>Home</span>
1010- </a>
2323+ <div class="min-h-screen bg-surface-100 dark:bg-surface-900">
2424+ <div class="max-w-7xl mx-auto px-4 sm:px-6 pt-10 md:pt-14 pb-20">
2525+ <a href="/home" class="inline-flex items-center gap-1.5 text-sm font-medium text-surface-500 dark:text-surface-400 hover:text-surface-900 dark:hover:text-white transition-colors mb-8">
2626+ <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m12 19-7-7 7-7"/><path d="M19 12H5"/></svg>
2727+ Back
2828+ </a>
11291212- <div class="prose prose-surface dark:prose-invert max-w-none">
1313- <h1 class="font-display font-bold text-3xl mb-2 text-surface-900 dark:text-white">Privacy Policy</h1>
1414- <p class="text-surface-500 dark:text-surface-400 mb-8">Last updated: April 14, 2026</p>
3030+ <div class="lg:grid lg:grid-cols-[minmax(0,1fr)_200px] lg:gap-12">
3131+ <div class="bg-white dark:bg-surface-800 rounded-2xl px-5 sm:px-8 lg:px-12 py-10 md:py-14 lg:min-w-0">
3232+ <header class="mb-12">
3333+ <p class="text-xs font-semibold text-surface-500 dark:text-surface-400 uppercase tracking-wider mb-3">Legal</p>
3434+ <h1 class="font-display font-bold text-3xl md:text-4xl text-surface-900 dark:text-white tracking-tight mb-2">Privacy Policy</h1>
3535+ <p class="text-sm text-surface-500 dark:text-surface-400">Effective {effectiveDate} · Last updated {lastUpdated}</p>
3636+ </header>
15371616- <section class="mb-8">
1717- <h2 class="text-xl font-bold text-surface-900 dark:text-white mb-4">Overview</h2>
1818- <p class="text-surface-700 dark:text-surface-300 leading-relaxed">
1919- Margin is a web annotation tool built on the AT Protocol, operated by <strong>Padding Labs LLC</strong> ("we", "our", or "us"). It lets you highlight, take notes, and bookmark any webpage. Because Margin is built on the AT Protocol, your notes are stored as records in your Personal Data Server (PDS) — you own your content and can take it with you. You must be at least 13 years old to use Margin.
2020- </p>
2121- </section>
3838+ <details class="lg:hidden mb-10 rounded-xl border border-surface-200 dark:border-surface-700/60 overflow-hidden">
3939+ <summary class="cursor-pointer px-4 py-3 text-xs font-semibold text-surface-500 dark:text-surface-400 uppercase tracking-wider bg-surface-50 dark:bg-surface-900/40">On this page</summary>
4040+ <ol class="px-4 py-3 space-y-0.5 text-sm">
4141+ {sections.map((s) => (
4242+ <li><a href={`#${s.id}`} class="block py-1 text-surface-600 dark:text-surface-400">{s.title}</a></li>
4343+ ))}
4444+ </ol>
4545+ </details>
22462323- <section class="mb-8">
2424- <h2 class="text-xl font-bold text-surface-900 dark:text-white mb-4">Data We Collect</h2>
4747+ <div class="space-y-12 max-w-2xl">
4848+ <section id="overview" data-toc-section class="scroll-mt-6">
4949+ <h2 class="font-display font-bold text-xl text-surface-900 dark:text-white tracking-tight mb-2">Overview</h2>
5050+ <p class="text-sm italic text-surface-500 dark:text-surface-400 mb-4">Padding Labs LLC is the controller. We process the minimum needed to run Margin and do not sell your data.</p>
5151+ <p class="text-[15px] text-surface-700 dark:text-surface-300 leading-relaxed">This Privacy Policy describes how Padding Labs LLC ("we", "us", "our") processes personal data in connection with Margin and the Margin Personal Data Server at margin.cafe (together, the "Service"). For purposes of the EU and UK General Data Protection Regulations, we are the controller of personal data we process to operate the Service.</p>
5252+ </section>
25532626- <h3 class="text-lg font-semibold text-surface-900 dark:text-white mb-2">Account Information</h3>
2727- <p class="text-surface-700 dark:text-surface-300 mb-4">
2828- When you log in with your AT Protocol account (e.g. Bluesky), we access your:
2929- </p>
3030- <ul class="list-disc pl-5 mb-4 text-surface-700 dark:text-surface-300 space-y-1">
3131- <li>Decentralized Identifier (DID)</li>
3232- <li>Handle (username)</li>
3333- <li>Display name, avatar, bio, and website (for showing your profile)</li>
3434- </ul>
5454+ <section id="data-collected" data-toc-section class="scroll-mt-6">
5555+ <h2 class="font-display font-bold text-xl text-surface-900 dark:text-white tracking-tight mb-2">Data we collect</h2>
5656+ <p class="text-sm italic text-surface-500 dark:text-surface-400 mb-4">Identity from your AT Protocol account, the content you publish, and basic usage data.</p>
5757+ <div class="space-y-3 text-[15px] text-surface-700 dark:text-surface-300 leading-relaxed">
5858+ <p>We process the following categories of personal data:</p>
5959+ <ul class="list-disc pl-5 space-y-1.5 marker:text-surface-400 dark:marker:text-surface-600">
6060+ <li>Account identifiers obtained from your AT Protocol identity provider, including your decentralised identifier (DID), handle, display name, avatar, biography, and website.</li>
6161+ <li>OAuth access tokens, refresh tokens, and DPoP proof keys, used to maintain your authenticated session.</li>
6262+ <li>User Content, including the URL and title of pages you annotate, the text you select, surrounding context, your note text, tags, highlight colours, replies, likes, collections, and edit history.</li>
6363+ <li>Vector embeddings of your User Content and of public AT Protocol records, and an interest profile derived from those embeddings, used to generate recommendations on the Discover page.</li>
6464+ <li>Usage data, including IP address, browser type, operating system, extension version, and product analytics events such as page views and feature interactions.</li>
6565+ <li>For accounts on margin.cafe: your email address, used for account recovery and security notices, and a salted hash of your password. We do not store passwords in plain text.</li>
6666+ <li>Any correspondence you send to <a href="mailto:hello@margin.at" class="text-primary-600 dark:text-primary-400 hover:underline font-medium">hello@margin.at</a>.</li>
6767+ </ul>
6868+ <p>We do not knowingly process special categories of personal data (such as health, biometric, or government identification data), and ask that you do not include such information in your User Content.</p>
6969+ </div>
7070+ </section>
35713636- <h3 class="text-lg font-semibold text-surface-900 dark:text-white mb-2">Notes & Content</h3>
3737- <p class="text-surface-700 dark:text-surface-300 mb-4">When you create a note, we store:</p>
3838- <ul class="list-disc pl-5 mb-4 text-surface-700 dark:text-surface-300 space-y-1">
3939- <li>The full URL of the page you noted on</li>
4040- <li>The page title at the time of the note</li>
4141- <li>The text you selected (up to 5,000 characters)</li>
4242- <li>Surrounding context around your selection (up to 500 characters before and after), used to re-locate the note on the page</li>
4343- <li>Any text you write as part of the note</li>
4444- <li>Tags you apply</li>
4545- <li>Highlight color (if set)</li>
4646- <li>Replies and likes on notes</li>
4747- <li>Collections you create, and which notes belong to them</li>
4848- <li>An edit history of any changes you make to your notes</li>
4949- </ul>
7272+ <section id="purposes" data-toc-section class="scroll-mt-6">
7373+ <h2 class="font-display font-bold text-xl text-surface-900 dark:text-white tracking-tight mb-2">Purposes and legal bases</h2>
7474+ <p class="text-sm italic text-surface-500 dark:text-surface-400 mb-4">Performance of contract for the core Service. Legitimate interests for analytics, recommendations, and security.</p>
7575+ <div class="space-y-3 text-[15px] text-surface-700 dark:text-surface-300 leading-relaxed">
7676+ <p>Where the GDPR or UK GDPR applies, we rely on the following legal bases under Article 6(1):</p>
7777+ <ul class="list-disc pl-5 space-y-1.5 marker:text-surface-400 dark:marker:text-surface-600">
7878+ <li><strong>Performance of contract:</strong> authenticating you, storing and synchronising your User Content, and providing the core features of the Service.</li>
7979+ <li><strong>Legitimate interests:</strong> maintaining a server-side index of public AT Protocol records, generating recommendations, conducting product analytics, preventing abuse, and improving the Service.</li>
8080+ <li><strong>Consent:</strong> for analytics cookies in jurisdictions such as the EEA and the United Kingdom. You may withdraw consent at any time.</li>
8181+ <li><strong>Legal obligation:</strong> to comply with applicable law or valid legal process.</li>
8282+ </ul>
8383+ <p>We do not sell personal data, and we do not share personal data for cross-context behavioural advertising.</p>
8484+ </div>
8585+ </section>
50865151- <h3 class="text-lg font-semibold text-surface-900 dark:text-white mb-2">Overlay Lookups (Browser Extension)</h3>
5252- <p class="text-surface-700 dark:text-surface-300 mb-4">
5353- When you browse the web with the extension enabled, it checks each page for existing notes. For these lookups, the extension computes a SHA-256 hash of the page URL locally and sends only that hash to our server — <strong>the raw URL is not sent for lookups.</strong> A hash cannot be reversed to recover the original URL. You can disable overlay lookups entirely by turning off page overlays in the extension settings.
5454- </p>
5555- <p class="text-surface-700 dark:text-surface-300 mb-4">
5656- Note: when you <em>create</em> a note, the full URL is included as part of the record stored on your PDS.
5757- </p>
8787+ <section id="recipients" data-toc-section class="scroll-mt-6">
8888+ <h2 class="font-display font-bold text-xl text-surface-900 dark:text-white tracking-tight mb-2">Recipients and transfers</h2>
8989+ <p class="text-sm italic text-surface-500 dark:text-surface-400 mb-4">Two sub-processors. Both are based in the United States.</p>
9090+ <div class="space-y-3 text-[15px] text-surface-700 dark:text-surface-300 leading-relaxed">
9191+ <p>We engage the following sub-processors:</p>
9292+ <ul class="list-disc pl-5 space-y-1.5 marker:text-surface-400 dark:marker:text-surface-600">
9393+ <li><strong>OpenAI</strong> generates vector embeddings of User Content and of public AT Protocol records under its API data usage policy. OpenAI does not use API inputs to train its models.</li>
9494+ <li><strong>PostHog</strong> provides product analytics. We identify users to PostHog by DID, handle, and display name.</li>
9595+ </ul>
9696+ <p>Where personal data is transferred from the European Economic Area, the United Kingdom, or Switzerland to a country without an adequacy decision, we rely on the European Commission's Standard Contractual Clauses (Decision 2021/914), supplemented by the UK International Data Transfer Addendum or the Swiss equivalent, as applicable.</p>
9797+ <p>We may also disclose personal data where required by law, to enforce these Terms, to protect users, or in connection with a merger, acquisition, or sale, subject to commitments at least as protective as this Policy.</p>
9898+ </div>
9999+ </section>
581005959- <h3 class="text-lg font-semibold text-surface-900 dark:text-white mb-2">Recommendations</h3>
6060- <p class="text-surface-700 dark:text-surface-300 mb-4">
6161- To power the Discover page, we generate vector embeddings of your notes and public documents on the AT Protocol network. These embeddings are used to build an interest profile and surface relevant content. Your interest profile is stored on our server and is not shared with other users.
6262- </p>
6363- <p class="text-surface-700 dark:text-surface-300 mb-4">
6464- Embeddings are generated via the <strong>OpenAI</strong> API. The text content of your notes and public AT Protocol documents is sent to OpenAI for this purpose. OpenAI does not use API inputs to train their models — see their <a href="https://openai.com/policies/usage-policies/" class="text-primary-600 dark:text-primary-400 hover:text-primary-700 dark:hover:text-primary-300 hover:underline" target="_blank" rel="noopener noreferrer">API data usage policy</a>. Recommendations are only generated if you have used Margin to annotate content.
6565- </p>
101101+ <section id="retention" data-toc-section class="scroll-mt-6">
102102+ <h2 class="font-display font-bold text-xl text-surface-900 dark:text-white tracking-tight mb-2">Retention</h2>
103103+ <p class="text-sm italic text-surface-500 dark:text-surface-400 mb-4">Only as long as necessary, with short tails for backups, logs, and analytics.</p>
104104+ <div class="space-y-3 text-[15px] text-surface-700 dark:text-surface-300 leading-relaxed">
105105+ <ul class="list-disc pl-5 space-y-1.5 marker:text-surface-400 dark:marker:text-surface-600">
106106+ <li>Index of User Content: while the underlying record exists on the AT Protocol. Deletions propagate within 7 days, with up to 30 days in routine backups.</li>
107107+ <li>OAuth sessions: until expiry, revocation, or 90 days of inactivity.</li>
108108+ <li>Embeddings and recommendation profile: deleted within 30 days of account deletion.</li>
109109+ <li>Product analytics events: up to 12 months.</li>
110110+ <li>Server and security logs: up to 90 days.</li>
111111+ <li>margin.cafe account data: for the life of the account, deleted within 30 days of a verified deletion request, subject to any legal retention obligations.</li>
112112+ </ul>
113113+ <p>Once a record has federated to the wider AT Protocol, third parties may retain copies outside our control even after deletion from your Personal Data Server.</p>
114114+ </div>
115115+ </section>
661166767- <h3 class="text-lg font-semibold text-surface-900 dark:text-white mb-2">Analytics</h3>
6868- <p class="text-surface-700 dark:text-surface-300 mb-4">
6969- We use <strong>PostHog</strong> for product analytics to understand how Margin is used and improve the product. Analytics events — such as page views, note creation, and feature interactions — are collected on the Margin website and server. These events may include the URL of the page being noted on, your browser type, and extension version. PostHog may set cookies for this purpose. We do not use analytics to track you across other websites or share analytics data with advertisers. See PostHog's <a href="https://posthog.com/privacy" class="text-primary-600 dark:text-primary-400 hover:text-primary-700 dark:hover:text-primary-300 hover:underline" target="_blank" rel="noopener noreferrer">privacy policy</a>.
7070- </p>
117117+ <section id="extension" data-toc-section class="scroll-mt-6">
118118+ <h2 class="font-display font-bold text-xl text-surface-900 dark:text-white tracking-tight mb-2">Browser extension</h2>
119119+ <p class="text-sm italic text-surface-500 dark:text-surface-400 mb-4">URLs are hashed locally before lookup. Hashing reduces, but does not eliminate, what we can infer.</p>
120120+ <div class="space-y-3 text-[15px] text-surface-700 dark:text-surface-300 leading-relaxed">
121121+ <p>The Margin browser extension requests the following permissions: <code class="text-[13px] px-1 py-0.5 rounded bg-surface-100 dark:bg-surface-900 font-mono">storage</code>, <code class="text-[13px] px-1 py-0.5 rounded bg-surface-100 dark:bg-surface-900 font-mono">tabs</code>, <code class="text-[13px] px-1 py-0.5 rounded bg-surface-100 dark:bg-surface-900 font-mono">cookies</code>, <code class="text-[13px] px-1 py-0.5 rounded bg-surface-100 dark:bg-surface-900 font-mono">contextMenus</code>, <code class="text-[13px] px-1 py-0.5 rounded bg-surface-100 dark:bg-surface-900 font-mono">activeTab</code>, <code class="text-[13px] px-1 py-0.5 rounded bg-surface-100 dark:bg-surface-900 font-mono">scripting</code>, and on Chrome <code class="text-[13px] px-1 py-0.5 rounded bg-surface-100 dark:bg-surface-900 font-mono">sidePanel</code>. Host access is requested for all URLs so that notes can be displayed on any page.</p>
122122+ <p>To check whether a page contains annotations, the extension normalises the URL, computes a SHA-256 hash locally, and transmits only that hash to our server. We do not receive the underlying URL during this lookup. We note for transparency that SHA-256 is a one-way function but the URL space is enumerable: a party with a list of candidate URLs can match hashes back to URLs. Hashing therefore reduces, without fully eliminating, what we can infer about your browsing. We treat URL hashes as personal data. You may disable overlays in the extension settings.</p>
123123+ <p>When you create a note, the full URL is included in the record stored on your Personal Data Server, because the URL is the subject of the annotation.</p>
124124+ </div>
125125+ </section>
711267272- <h3 class="text-lg font-semibold text-surface-900 dark:text-white mb-2">Authentication</h3>
7373- <p class="text-surface-700 dark:text-surface-300 mb-4">
7474- We store your OAuth session tokens (access token, refresh token, and DPoP proof key) in our database to keep you logged in. These are used solely for authenticating requests to the AT Protocol on your behalf and expire when your session ends.
7575- </p>
7676- </section>
127127+ <section id="cookies" data-toc-section class="scroll-mt-6">
128128+ <h2 class="font-display font-bold text-xl text-surface-900 dark:text-white tracking-tight mb-2">Cookies</h2>
129129+ <p class="text-sm italic text-surface-500 dark:text-surface-400 mb-4">Strictly necessary cookies for sign-in. Analytics cookies require consent in the EEA and UK.</p>
130130+ <p class="text-[15px] text-surface-700 dark:text-surface-300 leading-relaxed">We use a session cookie to maintain your authenticated session. PostHog sets analytics cookies. In the EEA, the United Kingdom, and other jurisdictions where prior consent is required, analytics cookies load only after you opt in. You may withdraw consent at any time through the cookie controls.</p>
131131+ </section>
771327878- <section class="mb-8">
7979- <h2 class="text-xl font-bold text-surface-900 dark:text-white mb-4">How We Use Your Data</h2>
8080- <p class="text-surface-700 dark:text-surface-300 mb-4">Your data is used to:</p>
8181- <ul class="list-disc pl-5 mb-4 text-surface-700 dark:text-surface-300 space-y-1">
8282- <li>Display your notes on webpages via the browser extension</li>
8383- <li>Sync your content across devices</li>
8484- <li>Show your public notes to other users on the same page</li>
8585- <li>Enable social features like replies and likes</li>
8686- <li>Generate personalized content recommendations on the Discover page</li>
8787- <li>Understand product usage and improve the service</li>
8888- </ul>
8989- <p class="text-surface-700 dark:text-surface-300">
9090- <strong>We do not sell your data.</strong> We do not share your data with third parties for advertising or marketing purposes.
9191- </p>
9292- </section>
133133+ <section id="public-content" data-toc-section class="scroll-mt-6">
134134+ <h2 class="font-display font-bold text-xl text-surface-900 dark:text-white tracking-tight mb-2">Public content</h2>
135135+ <p class="text-sm italic text-surface-500 dark:text-surface-400 mb-4">Notes federate publicly. Federated copies may persist after you delete.</p>
136136+ <p class="text-[15px] text-surface-700 dark:text-surface-300 leading-relaxed">Notes published through the AT Protocol are broadcast on the public firehose and may be retrieved, copied, indexed, or cached by any third party subscribing to the network. Do not include in a note any information you do not wish to be public.</p>
137137+ </section>
931389494- <section class="mb-8">
9595- <h2 class="text-xl font-bold text-surface-900 dark:text-white mb-4">The AT Protocol & Data Portability</h2>
9696- <p class="text-surface-700 dark:text-surface-300 mb-4">
9797- Margin is built on the AT Protocol. Your notes, collections, and profile are stored as records in your Personal Data Server (PDS). This means:
9898- </p>
9999- <ul class="list-disc pl-5 mb-4 text-surface-700 dark:text-surface-300 space-y-1">
100100- <li>You own your content</li>
101101- <li>You can export your full data repository from your PDS at any time</li>
102102- <li>Your data is portable — you can use it with other AT Protocol-compatible services</li>
103103- <li>You can migrate your account to a different PDS without losing your content</li>
104104- </ul>
105105- <p class="text-surface-700 dark:text-surface-300 mb-4">
106106- We also maintain a server-side index of public notes to power features like search, discovery, and the extension overlay. This index is derived from the public AT Protocol firehose and is used solely to operate the service.
107107- </p>
139139+ <section id="rights" data-toc-section class="scroll-mt-6">
140140+ <h2 class="font-display font-bold text-xl text-surface-900 dark:text-white tracking-tight mb-2">Your rights</h2>
141141+ <p class="text-sm italic text-surface-500 dark:text-surface-400 mb-4">Access, rectification, erasure, restriction, portability, objection, and withdrawal of consent.</p>
142142+ <div class="space-y-3 text-[15px] text-surface-700 dark:text-surface-300 leading-relaxed">
143143+ <p>Subject to applicable law, you may exercise the following rights in respect of personal data we hold about you: access, rectification, erasure, restriction of processing, portability, objection to processing based on our legitimate interests (including profiling), and withdrawal of consent where processing is based on consent. You may also lodge a complaint with your competent supervisory authority. Your AT Protocol repository remains independently exportable from your Personal Data Server at any time.</p>
144144+ <p>To exercise these rights, contact <a href="mailto:hello@margin.at" class="text-primary-600 dark:text-primary-400 hover:underline font-medium">hello@margin.at</a>. We will respond within the timeframes required by applicable law (one month under the GDPR, extendable by a further two months for complex requests). We may need to verify your identity. We will not discriminate against you for exercising your rights.</p>
145145+ <p>If you reside in California, the CCPA and CPRA grant additional rights, including the right to know, delete, correct, and limit the use of sensitive personal information. We do not sell or share personal information for cross-context behavioural advertising.</p>
146146+ </div>
147147+ </section>
108148109109- <h3 class="text-lg font-semibold text-surface-900 dark:text-white mb-2">Margin PDS (margin.cafe)</h3>
110110- <p class="text-surface-700 dark:text-surface-300 mb-4">
111111- We operate an optional Personal Data Server at <strong>margin.cafe</strong>. If you create an account there, we additionally store:
112112- </p>
113113- <ul class="list-disc pl-5 mb-4 text-surface-700 dark:text-surface-300 space-y-1">
114114- <li>Your account credentials (password is hashed and never stored in plain text)</li>
115115- <li>Your email address (for account recovery)</li>
116116- <li>All AT Protocol data repositories you create on this server</li>
117117- </ul>
118118- <p class="text-surface-700 dark:text-surface-300">
119119- Using margin.cafe is entirely optional — Margin works with any AT Protocol PDS. You can migrate your account to a different PDS at any time using standard AT Protocol account migration.
120120- </p>
121121- </section>
122122-123123- <section class="mb-8">
124124- <h2 class="text-xl font-bold text-surface-900 dark:text-white mb-4">Public Content</h2>
125125- <p class="text-surface-700 dark:text-surface-300 mb-4">
126126- Notes you create are public by default on the AT Protocol network. This means they may be visible to:
127127- </p>
128128- <ul class="list-disc pl-5 mb-4 text-surface-700 dark:text-surface-300 space-y-1">
129129- <li>Other Margin users viewing the same webpage</li>
130130- <li>Anyone on the AT Protocol network who subscribes to public records</li>
131131- </ul>
132132- </section>
133133-134134- <section class="mb-8">
135135- <h2 class="text-xl font-bold text-surface-900 dark:text-white mb-4">Browser Extension Permissions</h2>
136136- <p class="text-surface-700 dark:text-surface-300 mb-4">The Margin browser extension requires the following permissions:</p>
137137- <ul class="list-disc pl-5 mb-4 text-surface-700 dark:text-surface-300 space-y-1">
138138- <li><strong>All URLs:</strong> To display and create notes on any webpage. Overlay lookups use a local SHA-256 hash of the URL — the raw URL is only sent when you actively create a note.</li>
139139- <li><strong>Storage:</strong> To save your preferences and session locally</li>
140140- <li><strong>Cookies:</strong> To maintain your logged-in session</li>
141141- <li><strong>Tabs:</strong> To know which page you're currently viewing</li>
142142- </ul>
143143- </section>
149149+ <section id="children" data-toc-section class="scroll-mt-6">
150150+ <h2 class="font-display font-bold text-xl text-surface-900 dark:text-white tracking-tight mb-2">Children</h2>
151151+ <p class="text-sm italic text-surface-500 dark:text-surface-400 mb-4">Not directed to children under 13, or under 16 in the EEA and UK.</p>
152152+ <p class="text-[15px] text-surface-700 dark:text-surface-300 leading-relaxed">The Service is not directed to children under 13 years of age, or under 16 in the European Economic Area, the United Kingdom, or other jurisdictions with a higher age of digital consent. We do not knowingly collect personal data from such children. If you believe a child has provided us with personal data, please contact <a href="mailto:hello@margin.at" class="text-primary-600 dark:text-primary-400 hover:underline font-medium">hello@margin.at</a> and we will take appropriate steps to delete it.</p>
153153+ </section>
144154145145- <section class="mb-8">
146146- <h2 class="text-xl font-bold text-surface-900 dark:text-white mb-4">Your Rights</h2>
147147- <p class="text-surface-700 dark:text-surface-300 mb-4">You can:</p>
148148- <ul class="list-disc pl-5 mb-4 text-surface-700 dark:text-surface-300 space-y-1">
149149- <li>Delete any note or reply you've created</li>
150150- <li>Delete your collections</li>
151151- <li>Export your full data repository from your PDS</li>
152152- <li>Revoke Margin's OAuth access to your account at any time</li>
153153- <li>Request deletion of your margin.cafe account by contacting us — deletion of AT Protocol data on your PDS is governed by your PDS provider</li>
154154- </ul>
155155- <p class="text-surface-700 dark:text-surface-300">
156156- To exercise any of these rights, email us at <a href="mailto:hello@margin.at" class="text-primary-600 dark:text-primary-400 hover:text-primary-700 dark:hover:text-primary-300 hover:underline">hello@margin.at</a>.
157157- </p>
158158- </section>
155155+ <section id="contact" data-toc-section class="scroll-mt-6">
156156+ <h2 class="font-display font-bold text-xl text-surface-900 dark:text-white tracking-tight mb-2">Contact</h2>
157157+ <address class="not-italic text-[15px] text-surface-700 dark:text-surface-300 leading-relaxed">
158158+ <strong class="text-surface-900 dark:text-white">Padding Labs LLC</strong><br />
159159+ <a href="mailto:hello@margin.at" class="text-primary-600 dark:text-primary-400 hover:underline font-medium">hello@margin.at</a>
160160+ </address>
161161+ <p class="text-[13px] text-surface-500 dark:text-surface-400 mt-4">We may amend this Policy from time to time. The "Last updated" date reflects the most recent revision. For material changes we will provide reasonable advance notice.</p>
162162+ </section>
163163+ </div>
164164+ </div>
159165160160- <section class="mb-8">
161161- <h2 class="text-xl font-bold text-surface-900 dark:text-white mb-4">Contact</h2>
162162- <p class="text-surface-700 dark:text-surface-300">
163163- For privacy questions or concerns, contact us at <a href="mailto:hello@margin.at" class="text-primary-600 dark:text-primary-400 hover:text-primary-700 dark:hover:text-primary-300 hover:underline">hello@margin.at</a>
164164- </p>
165165- </section>
166166+ <aside class="hidden lg:block">
167167+ <details class="sticky top-6 group" open>
168168+ <summary class="cursor-pointer list-none flex items-center gap-1.5 py-2 text-[11px] font-semibold text-surface-400 dark:text-surface-500 uppercase tracking-[0.12em] hover:text-surface-700 dark:hover:text-surface-200 transition-colors">
169169+ <svg xmlns="http://www.w3.org/2000/svg" width="11" height="11" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="transition-transform group-open:rotate-90"><path d="m9 18 6-6-6-6"/></svg>
170170+ On this page
171171+ </summary>
172172+ <ol class="mt-3 space-y-0.5 text-[13px]">
173173+ {sections.map((s) => (
174174+ <li>
175175+ <a href={`#${s.id}`} data-toc-link={s.id} class="toc-link block py-1 text-surface-500 dark:text-surface-500 hover:text-surface-900 dark:hover:text-white transition-colors leading-snug">{s.title}</a>
176176+ </li>
177177+ ))}
178178+ </ol>
179179+ </details>
180180+ </aside>
181181+ </div>
166182 </div>
167183 </div>
184184+185185+ <script>
186186+ const links = document.querySelectorAll<HTMLAnchorElement>('[data-toc-link]');
187187+ const sections = document.querySelectorAll<HTMLElement>('[data-toc-section]');
188188+ if (links.length && sections.length) {
189189+ const setActive = (id: string) => {
190190+ links.forEach((l) => {
191191+ if (l.dataset.tocLink === id) {
192192+ l.classList.add('text-primary-600', 'dark:text-primary-400', 'font-medium');
193193+ l.classList.remove('text-surface-500', 'dark:text-surface-500');
194194+ } else {
195195+ l.classList.remove('text-primary-600', 'dark:text-primary-400', 'font-medium');
196196+ l.classList.add('text-surface-500', 'dark:text-surface-500');
197197+ }
198198+ });
199199+ };
200200+ let current = sections[0].id;
201201+ setActive(current);
202202+ const obs = new IntersectionObserver(
203203+ (entries) => {
204204+ const visible = entries
205205+ .filter((e) => e.isIntersecting)
206206+ .sort((a, b) => (a.target as HTMLElement).offsetTop - (b.target as HTMLElement).offsetTop);
207207+ if (visible.length > 0) {
208208+ current = visible[0].target.id;
209209+ setActive(current);
210210+ }
211211+ },
212212+ { rootMargin: '-15% 0px -70% 0px', threshold: 0 }
213213+ );
214214+ sections.forEach((s) => obs.observe(s));
215215+ }
216216+ </script>
168217</BaseLayout>
+162-85
web/src/pages/terms.astro
···11---
22import BaseLayout from '../layouts/StaticLayout.astro';
33+44+const lastUpdated = 'April 27, 2026';
55+const effectiveDate = 'May 1, 2026';
66+77+const sections = [
88+ { id: 'agreement', title: 'Agreement' },
99+ { id: 'eligibility', title: 'Eligibility' },
1010+ { id: 'your-content', title: 'Your content' },
1111+ { id: 'acceptable-use', title: 'Acceptable use' },
1212+ { id: 'suspension', title: 'Suspension and termination' },
1313+ { id: 'copyright', title: 'Copyright (DMCA)' },
1414+ { id: 'disclaimers', title: 'Disclaimers and liability' },
1515+ { id: 'indemnity', title: 'Indemnity' },
1616+ { id: 'governing-law', title: 'Governing law and changes' },
1717+ { id: 'contact', title: 'Contact' },
1818+];
319---
420521<BaseLayout title="Terms of Service - Margin" description="Margin Terms of Service">
66- <div class="max-w-3xl mx-auto py-12 px-4">
77- <a href="/home" class="inline-flex items-center gap-2 text-sm font-medium text-surface-500 hover:text-surface-900 dark:hover:text-white transition-colors mb-8">
88- <svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m12 19-7-7 7-7"/><path d="M19 12H5"/></svg>
99- <span>Home</span>
1010- </a>
2222+ <div class="min-h-screen bg-surface-100 dark:bg-surface-900">
2323+ <div class="max-w-7xl mx-auto px-4 sm:px-6 pt-10 md:pt-14 pb-20">
2424+ <a href="/home" class="inline-flex items-center gap-1.5 text-sm font-medium text-surface-500 dark:text-surface-400 hover:text-surface-900 dark:hover:text-white transition-colors mb-8">
2525+ <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m12 19-7-7 7-7"/><path d="M19 12H5"/></svg>
2626+ Back
2727+ </a>
11281212- <div class="prose prose-surface dark:prose-invert max-w-none">
1313- <h1 class="font-display font-bold text-3xl mb-2 text-surface-900 dark:text-white">Terms of Service</h1>
1414- <p class="text-surface-500 dark:text-surface-400 mb-8">Last updated: April 14, 2026</p>
2929+ <div class="lg:grid lg:grid-cols-[minmax(0,1fr)_200px] lg:gap-12">
3030+ <div class="bg-white dark:bg-surface-800 rounded-2xl px-5 sm:px-8 lg:px-12 py-10 md:py-14 lg:min-w-0">
3131+ <header class="mb-12">
3232+ <p class="text-xs font-semibold text-surface-500 dark:text-surface-400 uppercase tracking-wider mb-3">Legal</p>
3333+ <h1 class="font-display font-bold text-3xl md:text-4xl text-surface-900 dark:text-white tracking-tight mb-2">Terms of Service</h1>
3434+ <p class="text-sm text-surface-500 dark:text-surface-400">Effective {effectiveDate} · Last updated {lastUpdated}</p>
3535+ </header>
15361616- <section class="mb-8">
1717- <h2 class="text-xl font-bold text-surface-900 dark:text-white mb-4">Overview</h2>
1818- <p class="text-surface-700 dark:text-surface-300 leading-relaxed">
1919- Margin is a web annotation tool built on the AT Protocol, operated by Padding Labs LLC ("we", "our", or "us"). By using Margin (the "Service"), you agree to these Terms. If you do not agree, please do not use the Service. You must be at least 13 years old to use Margin.
2020- </p>
2121- </section>
3737+ <details class="lg:hidden mb-10 rounded-xl border border-surface-200 dark:border-surface-700/60 overflow-hidden">
3838+ <summary class="cursor-pointer px-4 py-3 text-xs font-semibold text-surface-500 dark:text-surface-400 uppercase tracking-wider bg-surface-50 dark:bg-surface-900/40">On this page</summary>
3939+ <ol class="px-4 py-3 space-y-0.5 text-sm">
4040+ {sections.map((s) => (
4141+ <li><a href={`#${s.id}`} class="block py-1 text-surface-600 dark:text-surface-400">{s.title}</a></li>
4242+ ))}
4343+ </ol>
4444+ </details>
22452323- <section class="mb-8">
2424- <h2 class="text-xl font-bold text-surface-900 dark:text-white mb-4">Open Source</h2>
2525- <p class="text-surface-700 dark:text-surface-300 leading-relaxed">
2626- Margin is open source software. The source code is publicly available and provided "as is", without warranty of any kind, express or implied. These Terms govern your use of the hosted service at margin.at, not the source code itself.
2727- </p>
2828- </section>
4646+ <div class="space-y-12 max-w-2xl">
4747+ <section id="agreement" data-toc-section class="scroll-mt-6">
4848+ <h2 class="font-display font-bold text-xl text-surface-900 dark:text-white tracking-tight mb-2">Agreement</h2>
4949+ <p class="text-sm italic text-surface-500 dark:text-surface-400 mb-4">These Terms govern your use of Margin. Using it means you accept them.</p>
5050+ <p class="text-[15px] text-surface-700 dark:text-surface-300 leading-relaxed">These Terms of Service govern your access to and use of Margin, an open-source web annotation tool built on the AT Protocol, and the Margin Personal Data Server at margin.cafe (together, the "Service"), provided by Padding Labs LLC ("we", "us", "our"). By accessing or using the Service you agree to be bound by these Terms and by our <a href="/privacy" class="text-primary-600 dark:text-primary-400 hover:underline font-medium">Privacy Policy</a>. If you do not agree, you must not use the Service.</p>
5151+ </section>
29523030- <section class="mb-8">
3131- <h2 class="text-xl font-bold text-surface-900 dark:text-white mb-4">Your Content</h2>
3232- <p class="text-surface-700 dark:text-surface-300 mb-4">
3333- You retain full ownership of all notes and other content you create ("Your Content"). By using the Service, you grant Padding Labs LLC a limited, non-exclusive, royalty-free license to store, index, display, and sync Your Content solely as needed to operate and improve the Service.
3434- </p>
3535- <p class="text-surface-700 dark:text-surface-300">
3636- Because Margin is built on the AT Protocol, Your Content is stored as records on your Personal Data Server (PDS). It is portable and exportable at any time — we do not lock you in.
3737- </p>
3838- </section>
5353+ <section id="eligibility" data-toc-section class="scroll-mt-6">
5454+ <h2 class="font-display font-bold text-xl text-surface-900 dark:text-white tracking-tight mb-2">Eligibility</h2>
5555+ <p class="text-sm italic text-surface-500 dark:text-surface-400 mb-4">Be 13 or older (16 in the EEA and UK), legally able to agree, and not on a sanctions list.</p>
5656+ <p class="text-[15px] text-surface-700 dark:text-surface-300 leading-relaxed">You must be at least 13 years of age to use the Service, or 16 if you reside in the European Economic Area, the United Kingdom, or another jurisdiction with a higher age of digital consent. You must have the legal capacity to enter into a binding agreement. You represent that you are not located in a country subject to comprehensive United States sanctions and that you are not on a U.S. government list of restricted parties.</p>
5757+ </section>
39584040- <section class="mb-8">
4141- <h2 class="text-xl font-bold text-surface-900 dark:text-white mb-4">Public Notes</h2>
4242- <p class="text-surface-700 dark:text-surface-300 leading-relaxed">
4343- Notes you create are public by default on the AT Protocol network and may be visible to other users and services that interact with the network. Do not include sensitive or private information in your notes if you do not want it to be publicly visible.
4444- </p>
4545- </section>
5959+ <section id="your-content" data-toc-section class="scroll-mt-6">
6060+ <h2 class="font-display font-bold text-xl text-surface-900 dark:text-white tracking-tight mb-2">Your content</h2>
6161+ <p class="text-sm italic text-surface-500 dark:text-surface-400 mb-4">You own your content. Notes are public by default and we cannot recall federated copies.</p>
6262+ <div class="space-y-3 text-[15px] text-surface-700 dark:text-surface-300 leading-relaxed">
6363+ <p>You retain all ownership rights in the content you submit through the Service ("User Content"). You grant us a worldwide, non-exclusive, royalty-free licence to host, store, reproduce, transmit, index, generate vector representations of, and display User Content as necessary to operate the Service. This licence terminates when you remove the relevant User Content, save for retention required by law, retention in routine backups for a reasonable period, and copies already disseminated to third parties via the AT Protocol that are outside our control.</p>
6464+ <p>Records you publish through the AT Protocol are public by default and may be retrieved, copied, indexed, and re-displayed by any third party. Removal from your Personal Data Server does not guarantee removal from such third parties. You are solely responsible for User Content and represent that you hold all rights necessary to publish it.</p>
6565+ </div>
6666+ </section>
46674747- <section class="mb-8">
4848- <h2 class="text-xl font-bold text-surface-900 dark:text-white mb-4">User Conduct</h2>
4949- <p class="text-surface-700 dark:text-surface-300 mb-4">
5050- You are responsible for your use of the Service and for any content you provide, including compliance with applicable laws, rules, and regulations.
5151- </p>
5252- <p class="text-surface-700 dark:text-surface-300 mb-4">
5353- We reserve the right to remove content or suspend access for violations of these Terms, including but not limited to:
5454- </p>
5555- <ul class="list-disc pl-5 mb-4 text-surface-700 dark:text-surface-300 space-y-1">
5656- <li>Illegal content</li>
5757- <li>Harassment or hate speech</li>
5858- <li>Spam or malicious content</li>
5959- </ul>
6060- </section>
6868+ <section id="acceptable-use" data-toc-section class="scroll-mt-6">
6969+ <h2 class="font-display font-bold text-xl text-surface-900 dark:text-white tracking-tight mb-2">Acceptable use</h2>
7070+ <p class="text-sm italic text-surface-500 dark:text-surface-400 mb-4">Do not break the law or harm other users.</p>
7171+ <div class="space-y-3 text-[15px] text-surface-700 dark:text-surface-300 leading-relaxed">
7272+ <p>You agree not to use the Service to:</p>
7373+ <ul class="list-disc pl-5 space-y-1.5 marker:text-surface-400 dark:marker:text-surface-600">
7474+ <li>violate applicable law or any third-party right;</li>
7575+ <li>post unlawful material, child sexual abuse material, terrorist content, non-consensual intimate imagery, or content that infringes intellectual property;</li>
7676+ <li>harass, threaten, dox, or impersonate any person;</li>
7777+ <li>transmit spam, phishing, fraud, or malware;</li>
7878+ <li>attack, disrupt, or probe the Service, or circumvent rate limits, access controls, or other technical measures; or</li>
7979+ <li>scrape or harvest data outside our public APIs, or train machine-learning models on User Content other than your own.</li>
8080+ </ul>
8181+ </div>
8282+ </section>
8383+8484+ <section id="suspension" data-toc-section class="scroll-mt-6">
8585+ <h2 class="font-display font-bold text-xl text-surface-900 dark:text-white tracking-tight mb-2">Suspension and termination</h2>
8686+ <p class="text-sm italic text-surface-500 dark:text-surface-400 mb-4">We may remove content or accounts for violations. You may appeal.</p>
8787+ <p class="text-[15px] text-surface-700 dark:text-surface-300 leading-relaxed">You may discontinue use of the Service at any time. We may suspend or terminate your access, or remove specific User Content, where we reasonably determine that you have breached these Terms, the law requires us to do so, or such action is necessary to protect users or third parties. Where we take such action, and unless prohibited by law, we will provide a statement of reasons. You may appeal by replying to the relevant notice or by writing to <a href="mailto:hello@margin.at" class="text-primary-600 dark:text-primary-400 hover:underline font-medium">hello@margin.at</a> within six months.</p>
8888+ </section>
61896262- <section class="mb-8">
6363- <h2 class="text-xl font-bold text-surface-900 dark:text-white mb-4">The AT Protocol</h2>
6464- <p class="text-surface-700 dark:text-surface-300 leading-relaxed">
6565- Margin interacts with the AT Protocol network. We do not control the network itself, other services on the network, or the data stored on your Personal Data Server. Your PDS provider's own terms govern data stored there. Content published to the AT Protocol is public and may be indexed by other services beyond Margin's control.
6666- </p>
6767- </section>
9090+ <section id="copyright" data-toc-section class="scroll-mt-6">
9191+ <h2 class="font-display font-bold text-xl text-surface-900 dark:text-white tracking-tight mb-2">Copyright (DMCA)</h2>
9292+ <p class="text-sm italic text-surface-500 dark:text-surface-400 mb-4">Send a properly-formed DMCA notice if your copyright is infringed.</p>
9393+ <p class="text-[15px] text-surface-700 dark:text-surface-300 leading-relaxed">We respond to notices that comply with the U.S. Digital Millennium Copyright Act. If you believe content on the Service infringes your copyright, send a notice containing the elements required by 17 U.S.C. § 512(c)(3) to <a href="mailto:hello@margin.at" class="text-primary-600 dark:text-primary-400 hover:underline font-medium">hello@margin.at</a> with the subject line "DMCA Notice". Knowingly false notices may give rise to liability under § 512(f). We terminate the accounts of repeat infringers.</p>
9494+ </section>
68956969- <section class="mb-8">
7070- <h2 class="text-xl font-bold text-surface-900 dark:text-white mb-4">Disclaimer of Warranties</h2>
7171- <p class="text-surface-700 dark:text-surface-300 leading-relaxed">
7272- The Service is provided "as is" and "as available" without warranties of any kind, either express or implied, including but not limited to implied warranties of merchantability, fitness for a particular purpose, or non-infringement. We do not warrant that the Service will be uninterrupted, error-free, or free of harmful components.
7373- </p>
7474- </section>
9696+ <section id="disclaimers" data-toc-section class="scroll-mt-6">
9797+ <h2 class="font-display font-bold text-xl text-surface-900 dark:text-white tracking-tight mb-2">Disclaimers and liability</h2>
9898+ <p class="text-sm italic text-surface-500 dark:text-surface-400 mb-4">Provided "as is". Aggregate liability capped at US$50. Mandatory protections still apply.</p>
9999+ <div class="space-y-3 text-[15px] text-surface-700 dark:text-surface-300 leading-relaxed">
100100+ <p>To the maximum extent permitted by law, the Service is provided <strong>"as is" and "as available"</strong>, without warranties of any kind, express or implied, including merchantability, fitness for a particular purpose, and non-infringement. We do not warrant that the Service will be uninterrupted, secure, or free from defects.</p>
101101+ <p>To the maximum extent permitted by law, we shall not be liable for any indirect, incidental, special, consequential, or punitive damages, or for loss of profits, revenue, goodwill, or data. Our aggregate liability arising out of or relating to the Service shall not exceed the greater of fifty United States dollars (US$50) or the amount you paid us during the twelve months preceding the event giving rise to the claim.</p>
102102+ <p>Nothing in these Terms excludes or limits liability that cannot be excluded or limited under applicable law, including liability for fraud, gross negligence, wilful misconduct, or death or personal injury caused by negligence.</p>
103103+ </div>
104104+ </section>
751057676- <section class="mb-8">
7777- <h2 class="text-xl font-bold text-surface-900 dark:text-white mb-4">Limitation of Liability</h2>
7878- <p class="text-surface-700 dark:text-surface-300 leading-relaxed">
7979- To the fullest extent permitted by law, Padding Labs LLC shall not be liable for any indirect, incidental, special, consequential, or punitive damages arising out of or related to your use of the Service. Because Margin is provided free of charge, our total aggregate liability to you shall not exceed $0.
8080- </p>
8181- </section>
106106+ <section id="indemnity" data-toc-section class="scroll-mt-6">
107107+ <h2 class="font-display font-bold text-xl text-surface-900 dark:text-white tracking-tight mb-2">Indemnity</h2>
108108+ <p class="text-sm italic text-surface-500 dark:text-surface-400 mb-4">If your conduct or content gives rise to a claim against us, you cover our costs.</p>
109109+ <p class="text-[15px] text-surface-700 dark:text-surface-300 leading-relaxed">To the extent permitted by law, you shall indemnify, defend, and hold us harmless from any third-party claim, demand, or proceeding arising out of your User Content, your use of the Service, or your breach of these Terms or applicable law. This obligation does not apply where prohibited by mandatory consumer-protection law.</p>
110110+ </section>
821118383- <section class="mb-8">
8484- <h2 class="text-xl font-bold text-surface-900 dark:text-white mb-4">Governing Law</h2>
8585- <p class="text-surface-700 dark:text-surface-300 leading-relaxed">
8686- These Terms are governed by the laws of the State of Wyoming, without regard to its conflict of law provisions.
8787- </p>
8888- </section>
112112+ <section id="governing-law" data-toc-section class="scroll-mt-6">
113113+ <h2 class="font-display font-bold text-xl text-surface-900 dark:text-white tracking-tight mb-2">Governing law and changes</h2>
114114+ <p class="text-sm italic text-surface-500 dark:text-surface-400 mb-4">Wyoming law applies. We give notice of material changes.</p>
115115+ <div class="space-y-3 text-[15px] text-surface-700 dark:text-surface-300 leading-relaxed">
116116+ <p>These Terms are governed by the laws of the State of Wyoming, without regard to its conflict-of-laws rules. The state and federal courts located in Sheridan County, Wyoming shall have exclusive jurisdiction over any dispute, save where mandatory consumer-protection law in your country of residence provides otherwise. Before commencing any claim, you agree to contact us at <a href="mailto:hello@margin.at" class="text-primary-600 dark:text-primary-400 hover:underline font-medium">hello@margin.at</a> and to attempt to resolve the matter informally for a period of sixty days.</p>
117117+ <p>We may amend these Terms from time to time. We will provide at least thirty days' notice of any material change by in-product notice or, where applicable, by email. If any provision is held unenforceable, the remainder of these Terms shall continue in full force and effect. We may assign these Terms in connection with a merger, acquisition, reorganisation, or sale.</p>
118118+ </div>
119119+ </section>
891209090- <section class="mb-8">
9191- <h2 class="text-xl font-bold text-surface-900 dark:text-white mb-4">Changes to These Terms</h2>
9292- <p class="text-surface-700 dark:text-surface-300 leading-relaxed">
9393- We may update these Terms from time to time. We will note the date of the last update at the top of this page. Continued use of the Service after changes constitutes acceptance of the updated Terms.
9494- </p>
9595- </section>
121121+ <section id="contact" data-toc-section class="scroll-mt-6">
122122+ <h2 class="font-display font-bold text-xl text-surface-900 dark:text-white tracking-tight mb-2">Contact</h2>
123123+ <address class="not-italic text-[15px] text-surface-700 dark:text-surface-300 leading-relaxed">
124124+ <strong class="text-surface-900 dark:text-white">Padding Labs LLC</strong><br />
125125+ <a href="mailto:hello@margin.at" class="text-primary-600 dark:text-primary-400 hover:underline font-medium">hello@margin.at</a>
126126+ </address>
127127+ </section>
128128+ </div>
129129+ </div>
961309797- <section class="mb-8">
9898- <h2 class="text-xl font-bold text-surface-900 dark:text-white mb-4">Contact</h2>
9999- <p class="text-surface-700 dark:text-surface-300">
100100- For questions about these Terms, contact us at <a href="mailto:hello@margin.at" class="text-primary-600 dark:text-primary-400 hover:text-primary-700 dark:hover:text-primary-300 hover:underline">hello@margin.at</a>
101101- </p>
102102- </section>
131131+ <aside class="hidden lg:block">
132132+ <details class="sticky top-6 group" open>
133133+ <summary class="cursor-pointer list-none flex items-center gap-1.5 py-2 text-[11px] font-semibold text-surface-400 dark:text-surface-500 uppercase tracking-[0.12em] hover:text-surface-700 dark:hover:text-surface-200 transition-colors">
134134+ <svg xmlns="http://www.w3.org/2000/svg" width="11" height="11" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="transition-transform group-open:rotate-90"><path d="m9 18 6-6-6-6"/></svg>
135135+ On this page
136136+ </summary>
137137+ <ol class="mt-3 space-y-0.5 text-[13px]">
138138+ {sections.map((s) => (
139139+ <li>
140140+ <a href={`#${s.id}`} data-toc-link={s.id} class="toc-link block py-1 text-surface-500 dark:text-surface-500 hover:text-surface-900 dark:hover:text-white transition-colors leading-snug">{s.title}</a>
141141+ </li>
142142+ ))}
143143+ </ol>
144144+ </details>
145145+ </aside>
146146+ </div>
103147 </div>
104148 </div>
149149+150150+ <script>
151151+ const links = document.querySelectorAll<HTMLAnchorElement>('[data-toc-link]');
152152+ const sections = document.querySelectorAll<HTMLElement>('[data-toc-section]');
153153+ if (links.length && sections.length) {
154154+ const setActive = (id: string) => {
155155+ links.forEach((l) => {
156156+ if (l.dataset.tocLink === id) {
157157+ l.classList.add('text-primary-600', 'dark:text-primary-400', 'font-medium');
158158+ l.classList.remove('text-surface-500', 'dark:text-surface-500');
159159+ } else {
160160+ l.classList.remove('text-primary-600', 'dark:text-primary-400', 'font-medium');
161161+ l.classList.add('text-surface-500', 'dark:text-surface-500');
162162+ }
163163+ });
164164+ };
165165+ let current = sections[0].id;
166166+ setActive(current);
167167+ const obs = new IntersectionObserver(
168168+ (entries) => {
169169+ const visible = entries
170170+ .filter((e) => e.isIntersecting)
171171+ .sort((a, b) => (a.target as HTMLElement).offsetTop - (b.target as HTMLElement).offsetTop);
172172+ if (visible.length > 0) {
173173+ current = visible[0].target.id;
174174+ setActive(current);
175175+ }
176176+ },
177177+ { rootMargin: '-15% 0px -70% 0px', threshold: 0 }
178178+ );
179179+ sections.forEach((s) => obs.observe(s));
180180+ }
181181+ </script>
105182</BaseLayout>