[object Object]

← back to AsSeenInMovies

asseeninmovies: GET /privacy + /terms — minimal legal pages (no-collect privacy notice, public-data terms, imagery + liability). Linked from footer + sitemap. Closes the production-readiness gap on legal pages.

210edd95de073feb9990ab65c2c38721b04c20fa · 2026-05-12 19:37:31 -0700 · SteveStudio2

Files touched

Diff

commit 210edd95de073feb9990ab65c2c38721b04c20fa
Author: SteveStudio2 <stevestudio2@SteveStacStudio.lan>
Date:   Tue May 12 19:37:31 2026 -0700

    asseeninmovies: GET /privacy + /terms — minimal legal pages (no-collect privacy notice, public-data terms, imagery + liability). Linked from footer + sitemap. Closes the production-readiness gap on legal pages.
---
 server.js | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 55 insertions(+), 2 deletions(-)

diff --git a/server.js b/server.js
index e172631..faac3e7 100644
--- a/server.js
+++ b/server.js
@@ -955,7 +955,7 @@ ${headExtras}
 </header>
 <main>${body}</main>
 <footer class="site">
-  AsSeenInMovies · public-data only · &copy; Designer Wallcoverings · <a href="/about">About</a><br>
+  AsSeenInMovies · public-data only · &copy; Designer Wallcoverings · <a href="/about">About</a> · <a href="/privacy">Privacy</a> · <a href="/terms">Terms</a><br>
   Movie metadata via <a href="https://www.themoviedb.org/">TMDB</a> — this product uses the TMDB API but is not endorsed or certified by TMDB.<br>
   Posters and headshots that aren't rights-cleared use a <span class="ai-pill">made with AI</span> placeholder. Never sourced from IMDb.
 </footer>
@@ -1634,7 +1634,7 @@ app.get('/', async (_req, res) => {
   </div>
 </main>
 <footer>
-  AsSeenInMovies · public-data only · &copy; Designer Wallcoverings<br>
+  AsSeenInMovies · public-data only · &copy; Designer Wallcoverings · <a href="/about" style="color:var(--gold)">About</a><br>
   <span style="font-size:10px;letter-spacing:0.1em;text-transform:uppercase;color:var(--muted)">
     Movie metadata via <a href="https://www.themoviedb.org/" target="_blank" rel="noopener" style="color:var(--gold)">TMDB</a> — this product uses the TMDB API but is not endorsed or certified by TMDB.
   </span>
@@ -1668,6 +1668,8 @@ app.get('/sitemap.xml', async (_req, res) => {
       ['/spotted/submit', '0.4', 'monthly'],
       ['/search',         '0.5', 'weekly'],
       ['/about',          '0.5', 'monthly'],
+      ['/privacy',        '0.3', 'yearly'],
+      ['/terms',          '0.3', 'yearly'],
     ];
     const [moviesR, peopleR, spottedR] = await Promise.all([
       pool.query(`SELECT id FROM asim_movies WHERE poster_url IS NOT NULL ORDER BY popularity DESC NULLS LAST, id DESC LIMIT 10000`),
@@ -1732,6 +1734,57 @@ app.get('/about', (_req, res) => {
   res.type('html').send(htmlShell('About', body, '', 'https://asseeninmovies.com/about', 'AsSeenInMovies is an open IMDb-class film + TV reference built on public data, run by Designer Wallcoverings, featuring verified SPOTTED set-decor placements.'));
 });
 
+// /privacy — minimal privacy notice. Site does not collect PII; the only
+// optional input is submitter email on /spotted/submit (used only to credit
+// the submitter when a placement is verified, never displayed publicly).
+app.get('/privacy', (_req, res) => {
+  const body = `
+    <div style="max-width:720px;margin:40px auto">
+      <h1 class="title" style="font-size:40px">Privacy</h1>
+      <p class="meta-line">Last updated 2026-05-12.</p>
+      <section style="margin-top:32px">
+        <h2 style="font-family:var(--serif);font-weight:400;font-size:20px;margin-bottom:10px;color:var(--gold)">What we collect</h2>
+        <p style="color:var(--ink-soft);font-size:15px;line-height:1.7">AsSeenInMovies does not require an account, does not store cookies for identification, and does not collect personal data beyond what server logs naturally record (IP address, user-agent, request path) for security and abuse mitigation. The only optional user input is on the <a href="/spotted/submit" style="color:var(--gold)">submit a placement</a> form, where you may provide your name + email to be credited when your submission is verified.</p>
+      </section>
+      <section style="margin-top:28px">
+        <h2 style="font-family:var(--serif);font-weight:400;font-size:20px;margin-bottom:10px;color:var(--gold)">Third-party services</h2>
+        <p style="color:var(--ink-soft);font-size:15px;line-height:1.7">Movie metadata via the <a href="https://www.themoviedb.org/" style="color:var(--gold)">TMDB</a> API. Anonymous usage analytics may be collected (page paths and aggregate counts only, no individual user tracking).</p>
+      </section>
+      <section style="margin-top:28px">
+        <h2 style="font-family:var(--serif);font-weight:400;font-size:20px;margin-bottom:10px;color:var(--gold)">Contact</h2>
+        <p style="color:var(--ink-soft);font-size:15px;line-height:1.7">Questions about data, takedown requests, or to remove your submitted email: <a href="mailto:info@asseeninmovies.com" style="color:var(--gold)">info@asseeninmovies.com</a>.</p>
+      </section>
+    </div>`;
+  res.type('html').send(htmlShell('Privacy', body, '', 'https://asseeninmovies.com/privacy', 'AsSeenInMovies privacy notice — what we collect (almost nothing), third-party services, contact.'));
+});
+
+// /terms — minimal terms / use policy. Public-data, public-submission, no
+// guarantee of accuracy, claim-yours-back available.
+app.get('/terms', (_req, res) => {
+  const body = `
+    <div style="max-width:720px;margin:40px auto">
+      <h1 class="title" style="font-size:40px">Terms of use</h1>
+      <p class="meta-line">Last updated 2026-05-12.</p>
+      <section style="margin-top:32px">
+        <h2 style="font-family:var(--serif);font-weight:400;font-size:20px;margin-bottom:10px;color:var(--gold)">Public data</h2>
+        <p style="color:var(--ink-soft);font-size:15px;line-height:1.7">Movie + person metadata is sourced from public-domain or rights-cleared datasets (TMDB, Wikidata, OMDb, MovieLens, union directories). We make no warranty as to accuracy or completeness. If you find an error, <a href="mailto:info@asseeninmovies.com" style="color:var(--gold)">tell us</a>.</p>
+      </section>
+      <section style="margin-top:28px">
+        <h2 style="font-family:var(--serif);font-weight:400;font-size:20px;margin-bottom:10px;color:var(--gold)">Submitting content</h2>
+        <p style="color:var(--ink-soft);font-size:15px;line-height:1.7">By submitting a SPOTTED placement, you confirm the information is accurate to the best of your knowledge and that you have the right to share it. We reserve the right to edit, decline, or remove any submission. All submissions go through moderation before going live, and you may request removal of your contribution at any time.</p>
+      </section>
+      <section style="margin-top:28px">
+        <h2 style="font-family:var(--serif);font-weight:400;font-size:20px;margin-bottom:10px;color:var(--gold)">Imagery</h2>
+        <p style="color:var(--ink-soft);font-size:15px;line-height:1.7">Posters and headshots are either rights-cleared (PD / CC0 / CC-BY) or replaced with a <span class="ai-pill">made with AI</span> placeholder. We never source visual assets from IMDb. If you hold rights to an image displayed here in error, contact us for immediate removal.</p>
+      </section>
+      <section style="margin-top:28px">
+        <h2 style="font-family:var(--serif);font-weight:400;font-size:20px;margin-bottom:10px;color:var(--gold)">Liability</h2>
+        <p style="color:var(--ink-soft);font-size:15px;line-height:1.7">The site is provided as-is. No commercial transaction takes place here. Shop links are affiliate or vendor references; you transact with the vendor directly under their terms.</p>
+      </section>
+    </div>`;
+  res.type('html').send(htmlShell('Terms', body, '', 'https://asseeninmovies.com/terms', 'AsSeenInMovies terms of use — public data, user submissions, imagery policy, liability.'));
+});
+
 // /random/movie + /random/person — pick a random visually-rich row and 302
 // to its detail page. Useful for "I'm feeling lucky" exploration. Limits
 // scope to the partial idx_*_has_poster / has_headshot indexes so the

← b7aaa6e asseeninmovies: GET /about — editorial explainer page (what  ·  back to AsSeenInMovies  ·  asseeninmovies: smoke test harness — test/smoke.js (zero dep 2d5ec29 →