style(frontend): Prettier config + one-time repo-wide format pass

Prettier 3 (pinned), printWidth 100, double quotes — chosen to match the existing
hand-formatting and minimise reflow. This commit is ONLY the mechanical format pass
(`prettier --write`) plus the config/ignore/scripts, isolated so it never pollutes a
feature diff. Verified behaviour-neutral: typecheck, eslint (0 errors), and vitest
all green before and after. See .git-blame-ignore-revs — `git blame` skips this sha.
This commit is contained in:
2026-07-21 02:26:40 +02:00
parent 04ecd8b3a7
commit e257e2aca0
101 changed files with 4388 additions and 2641 deletions
+12 -4
View File
@@ -70,11 +70,19 @@ export default function LegalLayout({
<div className="space-y-5 text-sm leading-relaxed text-fg/90">{children}</div>
</div>
<footer className="mt-6 flex flex-wrap gap-x-4 gap-y-1 text-xs text-muted">
<a href="/" className="hover:text-fg transition">Home</a>
<a href="/privacy" className="hover:text-fg transition">Privacy Policy</a>
<a href="/terms" className="hover:text-fg transition">Terms of Service</a>
<a href="/" className="hover:text-fg transition">
Home
</a>
<a href="/privacy" className="hover:text-fg transition">
Privacy Policy
</a>
<a href="/terms" className="hover:text-fg transition">
Terms of Service
</a>
{contact && (
<a href={`mailto:${contact}`} className="hover:text-fg transition">Contact</a>
<a href={`mailto:${contact}`} className="hover:text-fg transition">
Contact
</a>
)}
</footer>
</div>
+27 -27
View File
@@ -4,19 +4,19 @@ export default function PrivacyPolicy() {
return (
<LegalLayout title="Privacy Policy">
<p>
Siftlode is a personal, non-commercial project operated by an individual in Hungary
("we", "us"). It lets you view and organize your own YouTube subscriptions as a
filterable feed. This policy explains what data Siftlode accesses, how it is used, and
the choices you have. By using Siftlode you agree to this policy.
Siftlode is a personal, non-commercial project operated by an individual in Hungary ("we",
"us"). It lets you view and organize your own YouTube subscriptions as a filterable feed.
This policy explains what data Siftlode accesses, how it is used, and the choices you have.
By using Siftlode you agree to this policy.
</p>
<H2>What we access</H2>
<p>Siftlode only accesses data you explicitly authorize, in two separate steps:</p>
<ul className="list-disc pl-5 space-y-1">
<li>
<span className="text-fg font-medium">Sign-in (always):</span> your basic Google
profile — name, email address, profile picture, and Google account identifier — used
solely to create and identify your account.
<span className="text-fg font-medium">Sign-in (always):</span> your basic Google profile —
name, email address, profile picture, and Google account identifier — used solely to
create and identify your account.
</li>
<li>
<span className="text-fg font-medium">YouTube read (optional, opt-in):</span> with the{" "}
@@ -25,9 +25,9 @@ export default function PrivacyPolicy() {
thumbnails, durations, view counts, publish dates), used to build your feed.
</li>
<li>
<span className="text-fg font-medium">YouTube manage (optional, opt-in):</span> with
the <code className="text-xs">youtube</code> scope, the ability to unsubscribe from a
channel on YouTube — performed only when you click to do so.
<span className="text-fg font-medium">YouTube manage (optional, opt-in):</span> with the{" "}
<code className="text-xs">youtube</code> scope, the ability to unsubscribe from a channel
on YouTube — performed only when you click to do so.
</li>
</ul>
<p>
@@ -37,30 +37,30 @@ export default function PrivacyPolicy() {
<H2>How we use it</H2>
<p>
Your data is used exclusively to provide Siftlode's features to you: building and
displaying your personalized subscription feed, and carrying out actions (such as
unsubscribing) that you initiate. We do not use it for advertising, profiling, or any
purpose unrelated to the app.
Your data is used exclusively to provide Siftlode's features to you: building and displaying
your personalized subscription feed, and carrying out actions (such as unsubscribing) that
you initiate. We do not use it for advertising, profiling, or any purpose unrelated to the
app.
</p>
<H2>Limited Use disclosure</H2>
<p>
Siftlode's use and transfer of information received from Google APIs to any other app
will adhere to the{" "}
Siftlode's use and transfer of information received from Google APIs to any other app will
adhere to the{" "}
<LegalLink href="https://developers.google.com/terms/api-services-user-data-policy">
Google API Services User Data Policy
</LegalLink>
, including the Limited Use requirements. We do not sell your data, do not transfer it
to third parties (except as needed to operate the app, e.g. the hosting infrastructure
we control), and do not use it for advertising.
, including the Limited Use requirements. We do not sell your data, do not transfer it to
third parties (except as needed to operate the app, e.g. the hosting infrastructure we
control), and do not use it for advertising.
</p>
<H2>Storage &amp; security</H2>
<p>
Data is stored in a private PostgreSQL database on a server we control, accessible only
to the operator. Google OAuth refresh tokens are encrypted at rest. Access is restricted
to the emails explicitly invited to the app. No system is perfectly secure, but we take
reasonable measures to protect your data.
Data is stored in a private PostgreSQL database on a server we control, accessible only to
the operator. Google OAuth refresh tokens are encrypted at rest. Access is restricted to the
emails explicitly invited to the app. No system is perfectly secure, but we take reasonable
measures to protect your data.
</p>
<H2>Retention &amp; deletion</H2>
@@ -70,8 +70,8 @@ export default function PrivacyPolicy() {
<LegalLink href="https://myaccount.google.com/permissions">
myaccount.google.com/permissions
</LegalLink>
; once revoked, the stored tokens can no longer be used. To have your account and
associated data deleted, contact <ContactEmail />.
; once revoked, the stored tokens can no longer be used. To have your account and associated
data deleted, contact <ContactEmail />.
</p>
<H2>Cookies</H2>
@@ -83,8 +83,8 @@ export default function PrivacyPolicy() {
<H2>YouTube &amp; Google</H2>
<p>
Siftlode uses YouTube API Services. By using Siftlode you also agree to the{" "}
<LegalLink href="https://www.youtube.com/t/terms">YouTube Terms of Service</LegalLink>,
and your use of Google data is subject to the{" "}
<LegalLink href="https://www.youtube.com/t/terms">YouTube Terms of Service</LegalLink>, and
your use of Google data is subject to the{" "}
<LegalLink href="https://policies.google.com/privacy">Google Privacy Policy</LegalLink>.
</p>
+17 -15
View File
@@ -11,41 +11,43 @@ export default function Terms() {
<H2>The service</H2>
<p>
Siftlode is offered on an invite-only basis, free of charge, and "as is", without
warranties of any kind. It is a hobby project: features may change, and the service may
be slowed, interrupted, or discontinued at any time without notice.
Siftlode is offered on an invite-only basis, free of charge, and "as is", without warranties
of any kind. It is a hobby project: features may change, and the service may be slowed,
interrupted, or discontinued at any time without notice.
</p>
<H2>Your account &amp; acceptable use</H2>
<p>
You sign in with your Google account and may only access Siftlode with an email that has
been invited. You agree to use the service lawfully, not to abuse, disrupt, probe, or
overload it, and not to attempt to access other users' data. We may suspend or revoke
access at our discretion, for example in case of misuse.
overload it, and not to attempt to access other users' data. We may suspend or revoke access
at our discretion, for example in case of misuse.
</p>
<H2>Third-party services</H2>
<p>
Siftlode uses YouTube API Services. By using Siftlode you agree to be bound by the{" "}
<LegalLink href="https://www.youtube.com/t/terms">YouTube Terms of Service</LegalLink>.
Your data is handled as described in our{" "}
<a href="/privacy" className="text-accent hover:underline">Privacy Policy</a> and, for
Google data, the{" "}
<LegalLink href="https://www.youtube.com/t/terms">YouTube Terms of Service</LegalLink>. Your
data is handled as described in our{" "}
<a href="/privacy" className="text-accent hover:underline">
Privacy Policy
</a>{" "}
and, for Google data, the{" "}
<LegalLink href="https://policies.google.com/privacy">Google Privacy Policy</LegalLink>.
</p>
<H2>No warranty &amp; limitation of liability</H2>
<p>
To the maximum extent permitted by law, the service is provided without warranty, and
the operator is not liable for any indirect, incidental, or consequential damages, or
for any loss of data, arising from your use of Siftlode. Your sole remedy if you are
dissatisfied is to stop using the service and revoke its access to your account.
To the maximum extent permitted by law, the service is provided without warranty, and the
operator is not liable for any indirect, incidental, or consequential damages, or for any
loss of data, arising from your use of Siftlode. Your sole remedy if you are dissatisfied is
to stop using the service and revoke its access to your account.
</p>
<H2>Governing law</H2>
<p>
These Terms are governed by the laws of Hungary and applicable European Union law,
without regard to conflict-of-law rules.
These Terms are governed by the laws of Hungary and applicable European Union law, without
regard to conflict-of-law rules.
</p>
<H2>Changes</H2>