1<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"/><meta name="theme-color" content="#7A8EBF"/><meta name="mobile-web-app-capable" content="yes"/><meta name="application-name" content="ShieldCart"/><meta name="apple-mobile-web-app-capable" content="yes"/><meta name="apple-mobile-web-app-title" content="ShieldCart"/><meta name="apple-mobile-web-app-status-bar-style" content="default"/><meta name="shieldcart-skip-detector" content="true"/><meta name="robots" content="max-snippet:0"/><link rel="modulepreload" href="/assets/index-BX-fLFOm.js"/><link rel="modulepreload" href="/assets/c-CKbh-u_4.js"/><link rel="modulepreload" href="/assets/c-CiIhwhEI.js"/><link rel="modulepreload" href="/assets/c-C56hNT99.js"/><link rel="modulepreload" href="/assets/c-CrZmcM36.js"/><link rel="manifest" href="/manifest.json"/><link rel="preconnect" href="https://fonts.googleapis.com"/><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin="anonymous"/><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Geist:wght@300;400;500;600;700;800&family=Geist+Mono:wght@400;500&display=swap" precedence="default"/><link rel="stylesheet" href="/assets/index-DgKmXdOO.css" type="text/css" precedence="default"/><link rel="apple-touch-icon" href="/icon-192.png"/><link rel="icon" type="image/png" href="/favicon.png"/>
1<script> 2 (function () { 3 var KEY = '__sc_chunk_reload'; 4 function recover() { 5 try { 6 var last = +sessionStorage.getItem(KEY) || 0; 7 if (Date.now() - last < 15000) return false; 8 sessionStorage.setItem(KEY, String(Date.now())); 9 } catch (e) { /* private mode: reload anyway */ } 10 window.location.reload(); 11 return true; 12 } 13 // Vite fires this on any failed dynamic import() (its preload helper). 14 window.addEventListener('vite:preloadError', function (e) { 15 if (recover()) { try { e.preventDefault(); } catch (_) {} } 16 }); 17 // Fallback for browsers/paths where vite:preloadError doesn't fire. 18 window.addEventListener('unhandledrejection', function (e) { 19 var m = String((e && e.reason && (e.reason.message || e.reason)) || ''); 20 if (/Failed to fetch dynamically imported module|error loading dynamically imported module|Importing a module script failed/i.test(m)) { 21 recover(); 22 } 23 }); 24 })(); 25 </script>
25<script> 26 window.sentryOnLoad = function () { 27 var isProd = window.location.hostname === "shieldcart.app"; 28 Sentry.init({ 29 // Tag events by where they came from, and â critically â drop 30 // everything that isn't the real production site. The SDK is 31 // present in local dev + the Electron shell too, and without 32 // this it captured Nikki's own localhost coding errors 33 // (transient "X is not defined" on uncommitted code) and 34 // mislabelled them production, flooding the inbox. Only real 35 // shieldcart.app errors are actionable. (2026-07-24) 36 environment: isProd ? "production" : "development", 37 beforeSend: function (event, hint) { 38 // Only the real production site is actionable (see the 39 // environment note above) â drop everything else. 40 if (window.location.hostname !== "shieldcart.app") return null; 41 42 // Error 1 (Sentry JAVASCRIPT-6) â stale-chunk recovery, 43 // catch-all path. The inline <head> script above already 44 // reloads on vite:preloadError and on an UNHANDLED 45 // rejection, but when a lazy-route dynamic import 404s after 46 // a deploy, TanStack Router HANDLES the rejection and 47 // reports it here instead â so those window listeners never 48 // fire and the guardian dead-ends on the router error 49 // screen. Whenever a dynamic-import failure reaches Sentry, 50 // reload once (sharing the inline script's 15s throttle key 51 // so the two can't double-reload) and drop the event: it's 52 // non-actionable noise the reload self-heals. 53 var msg = ""; 54 try { 55 var ex = hint && hint.originalException; 56 msg = String((ex && (ex.message || ex)) || event.message || ""); 57 } catch (e) { msg = String(event.message || ""); } 58 if (/Failed to fetch dynamically imported module|error loading dynamically imported module|Importing a module script failed/i.test(msg)) { 59 try { 60 var last = +sessionStorage.getItem('__sc_chunk_reload') || 0; 61 if (Date.now() - last >= 15000) { 62 sessionStorage.setItem('__sc_chunk_reload', String(Date.now())); 63 window.location.reload(); 64 } 65 } catch (e) { window.location.reload(); } 66 return null; 67 } 68 69 return event; 70 }, 71 ignoreErrors: [ 72 // React SSR hydration mismatch. React silently re-renders 73 // on the client and the guardian/shopper sees nothing 74 // wrong. This was the bulk of the email flood. 75 /hydrat/i, 76 "Text content does not match server-rendered HTML", 77 "The server could not finish this Suspense boundary", 78 // Production builds ship minified React error CODES, not 79 // text. These codes are the hydration/Suspense family: 80 // 418,419,421,422,423,425,426. 81 /Minified React error #(418|419|421|422|423|425|426)/, 82 // Benign layout-callback churn â never actionable. 83 "ResizeObserver loop limit exceeded", 84 "ResizeObserver loop completed with undelivered notifications", 85 // Injected/extension scripts rejecting on our page. 86 "Non-Error promise rejection captured", 87 // TanStack Router's own internal invariant() (no custom 88 // message, just throws "Invariant failed") â fires from 89 // its Match/useMatch internals when a route match goes 90 // stale mid-render (a fast nav interrupting an in-flight 91 // one). Same self-recovering family as the hydration 92 // errors above: the next render succeeds, nothing is 93 // visibly broken. (2026-07-21) 94 "Invariant failed", 95 ], 96 denyUrls: [ 97 // Errors thrown by browser extensions, not our code. 98 /^chrome-extension:\/\//i, 99 /^moz-extension:\/\//i, 100 /^chrome:\/\//i,
101 ], 102 // Error 2 (Sentry JAVASCRIPT-D) â first-party filter. Errors 103 // whose stack has NO shieldcart.app frame come from another 104 // person's extension or an injected page script (e.g. the 105 // "ntsp_user_level is not defined" / initQuilter noise), not 106 // our code â and a false alarm here could misdirect a real 107 // investigation later. allowUrls is the robust form of "deny 108 // non-first-party frames": Sentry keeps an event only if at 109 // least one stack frame is first-party. Events with no 110 // stack/URL at all are still kept, so genuine message-only 111 // errors aren't lost. denyUrls above still short-circuits the 112 // extension protocols explicitly. 113 allowUrls: [ 114 /https?:\/\/([a-z0-9-]+\.)*shieldcart\.app/i, 115 ], 116 }); 117 }; 118 </script>
118<script src="https://js.sentry-cdn.com/5305e3caf66299271c131d855c80cf63.min.js" crossorigin="anonymous" async=""></script>
118</head><body><!--$--><div class="min-h-full bg-white"><header class="sticky top-0 z-10 border-b border-ink-100 bg-white"><div class="relative mx-auto flex max-w-2xl justify-center px-5 py-3"><a href="/" class="inline-flex w-fit"><img src="/shieldcart-wordmark.png" alt="ShieldCart â Shop with Care, Protect with Dignity" class="h-12 w-auto"/></a></div></header><main class="container-narrow py-6"><div class="mx-auto max-w-2xl space-y-6 py-6"><button type="button" class="text-sm text-ink-500 hover:underline">â Back</button><header class="space-y-1"><p class="text-xs font-semibold uppercase tracking-wide text-ink-500">ShieldCart</p><h1 class="text-2xl font-semibold tracking-tight text-ink-900">Terms of service</h1><p class="text-sm text-ink-500">Last updated August 2026.</p></header><article class="space-y-8 text-[15px] leading-relaxed text-ink-800"><section class="space-y-3"><h2 class="text-lg font-semibold text-ink-900">ShieldCart is designed as a dynamic safety layer</h2><p>While our engine captures and verifies the vast majority of checkouts, site structures occasionally change. To ensure complete clarity, prices shown on the dashboard are extracted directly at checkout, and every logged order includes a full screenshot for verification.</p><p>Please note that ShieldCart is an automated monitoring tool, and guardians remain fully responsible for account activity and purchases.</p><p>If you spot an unflagged site or a price discrepancy, report it directly from your dashboard so we can update our detection systems.</p></section><section class="space-y-3"><h2 class="text-lg font-semibold text-ink-900">Where ShieldCart works</h2><p>ShieldCart runs as a Chrome extension on the protected computer's desktop. It does not run on mobile devices, tablets, or unapproved browsers.</p><p>Each protected computer requires the extension to be installed and actively paired with this dashboard. Orders placed on other devices, unmonitored browsers, or outside the extension'
118s environment are beyond our monitoring capabilities.</p><p>When online merchants update their checkout systems, we deploy corresponding system updatesâtypically within 24 hours. During these brief transition periods, a checkout on an updated store may occasionally slip past detection.</p></section><section class="space-y-3"><h2 class="text-lg font-semibold text-ink-900">Consent and intended use</h2><p>By using ShieldCart, you confirm that you have explicit consent from your family memberâor hold legally appointed Power of Attorneyâto monitor and assist with their online purchases.</p><p>ShieldCart is designed exclusively to safeguard your family member's financial well-being, not to restrict purchases they genuinely intend and are fully capable of making. Monitoring any individual without their explicit authorization is strictly prohibited.</p></section><section class="space-y-3"><h2 class="text-lg font-semibold text-ink-900">Data collection and privacy</h2><p>We log essential order summaries (merchant name, order total, and item count), checkout page screenshots, and standard browser environment telemetry. We do not collect passwords, full credit card details, or sensitive payment credentials beyond the final four digits when explicitly provided. Refer to our<!-- --> <a href="/privacy" class="font-medium text-brand-600 hover:underline">Privacy Policy</a> <!-- -->for full details.</p></section><section class="space-y-3"><h2 class="text-lg font-semibold text-ink-900">Disclaimer and liability</h2><p>ShieldCart is provided on an âas-isâ and âas-availableâ basis. While we maintain a high standard of interception reliability, we do not guarantee that 100% of checkouts will be flagged or intercepted. Primary responsibility for account activity and authorized purchases remains with the user and their designated guardian.</p></section><section class="space-y-3"><h2 class="text-lg font-semibold text-ink-900">Updates to terms</h2><p>We reserve the right to modify these terms as our platform evolves. Continued use of ShieldCart following any updates constitutes acceptance of the revised terms.</p></section></article><div class="border-t border-ink-100 pt-4 text-sm text-ink-500">Questions?<!-- --> <a href="mailto:[email protected]" class="font-medium text-brand-600 hover:underline">[email protected]</a></div></div></main></div><!--/$-->
118<script class="$tsr" id="$tsr-stream-barrier">(self.$R=self.$R||{})["tsr"]=[];self.$_TSR={h(){this.hydrated=!0,this.c()},e(){this.streamEnded=!0,this.c()},c(){this.hydrated&&this.streamEnded&&(delete self.$_TSR,delete self.$R.tsr)},p(e){this.initialized?e():this.buffer.push(e)},buffer:[]};$_TSR.router=($R=>$R[0]={manifest:$R[1]={routes:$R[2]={__root__:$R[3]={preloads:$R[4]=["/assets/index-BX-fLFOm.js"],assets:$R[5]=[$R[6]={tag:"link",attrs:$R[7]={rel:"stylesheet",href:"/assets/index-DgKmXdOO.css",type:"text/css"}},$R[8]={tag:"script",attrs:$R[9]={type:"module",async:!0},children:"import(\"/assets/index-BX-fLFOm.js\")"}]},"/terms":$R[10]={preloads:$R[11]=["/assets/c-CKbh-u_4.js","/assets/c-CiIhwhEI.js","/assets/c-C56hNT99.js","/assets/c-CrZmcM36.js"]}}},matches:$R[12]=[$R[13]={i:"__root__�",u:1790903693851,s:"success",ssr:!0},$R[14]={i:"�terms�terms",u:1790903693851,s:"success",ssr:!0}],lastMatchId:"�terms�terms"})($R["tsr"]);$_TSR.e();document.currentScript.remove()</script>
118<script type="module" async="">import("/assets/index-BX-fLFOm.js")</script>
118<script type="module" src="https://static.cloudflareinsights.com/beacon.min.js/v31edd6df95cf4e85bb4c19e7a9bdbcba1788362987495" integrity="sha512-iIg7k2xntmwu6/uSb5tpc/hySgZc4eoL31yB29W6tJFo2akwjPWcEqnCEdJvGexCL0KEQwVYv5BlowfhVz26hg==" data-cf-beacon='{"version":"2024.11.0","token":"fee2e88177af4f4ebc624976cd25a8b0","r":1,"spa":2}' crossorigin="anonymous"></script>
118 119</body></html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.