1<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="icon" type="image/svg+xml" href="/favicon.svg"/><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="modulepreload" href="/assets/entry.client-zDRVL4Si.js"/><link rel="modulepreload" href="/assets/dist-BJAFxcYu.js"/><link rel="modulepreload" href="/assets/jsx-runtime-DOhyBulg.js"/><link rel="modulepreload" href="/assets/root-Ba3xVD5v.js"/><link rel="modulepreload" href="/assets/store-Cwy2aUvL.js"/><link rel="modulepreload" href="/assets/terms-BvCtXZG5.js"/><link rel="stylesheet" href="/assets/root-Ch7H8VqF.css"/><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap"/>
1<script> 2 (function() { 3 try { 4 var theme = localStorage.getItem('theme'); 5 var supportDarkMode = window.matchMedia('(prefers-color-scheme: dark)').matches === true; 6 if (theme === 'dark' || (!theme && supportDarkMode)) { 7 document.documentElement.classList.add('dark'); 8 } else { 9 document.documentElement.classList.remove('dark'); 10 } 11 } catch (e) {} 12 })(); 13 </script>
13</head><body class="antialiased"><header class="sticky top-0 z-50 bg-white/80 dark:bg-slate-900/80 backdrop-blur-md border-b border-slate-200 dark:border-slate-800 transition-colors duration-300"><nav class="max-w-4xl mx-auto px-4 h-16 flex items-center justify-between"><a class="text-xl font-extrabold tracking-tighter text-blue-600" href="/" data-discover="true">RankingRun</a><div class="flex gap-2 items-center font-medium text-sm"><button class="p-2 rounded-full bg-slate-100 text-slate-600 hover:bg-slate-200 transition-colors dark:bg-slate-800 dark:text-slate-300 dark:hover:bg-slate-700 flex items-center justify-center" aria-label="Toggle Dark Mode">âï¸</button><button class="p-2 rounded-full bg-slate-100 text-slate-600 hover:bg-slate-200 hover:rotate-180 transition-all duration-500 dark:bg-slate-800 dark:text-slate-300 dark:hover:bg-slate-700 flex items-center justify-center group" aria-label="Refresh ranking"><svg xmlns="http://www.w3.org/2000/svg" class="w-5 h-5 group-active:scale-90 transition-transform" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2.5" d="M4 4v5h5M20 20v-5h-5M4 13a8.1 8.1 0 0015.5 2m.5-5a8.1 8.1 0 00-15.5-2"></path></svg></button></div></nav></header><main class="min-h-[calc(100vh-160px)]"><div class="max-w-3xl mx-auto px-4 py-12"><h1 class="text-4xl font-black text-slate-900 dark:text-white mb-8 tracking-tighter">Terms of Service</h1><div class="prose prose-slate dark:prose-invert max-w-none space-y-6 text-slate-600 dark:text-slate-400"><section><h2 class="text-xl font-bold text-slate-800 dark:text-slate-200">1. Acceptance of Terms</h2><p>By using RankingRun, you agree to be bound by these Terms of Service. This platform provides AI-driven analysis and global leaderboards based on athletic data.</p></section><section><h2 class="text-xl font-bold text-slate-800 dark:text-slate-200">2. User Responsibilities and Prohibitions</h2><p>Users must not engage in the following activities:</p><ul class="list-disc pl-5 space-y-2"><li>Uploading manipulated athletic data (FIT files).</li><li>Impersonating others or registering false information.</li><li>System hacking, unauthorized data collection, or disrupting services.</li><li>Posting illegal or harmful content.</li></ul></section><section><h2 class="text-xl font-bold text-slate-800 dark:text-slate-200">3. AI Analysis and Limitations</h2><p>AI scores and feedback are results of automated data analysis and are not a substitute for professional medical or coaching advice. Inaccurate data input will lead to distorted analysis results.</p></section><section><h2 class="text-xl font-bold text-slate-800 dark:text-slate-200">4. Service Modifications</h2><p>We reserve the right to perform maintenance or modify/suspend parts of the service as necessary for optimal performance.</p></section><section><h2 class="text-xl font-bold text-slate-800 dark:text-slate-200">5. Limitation of Liability</h2><p>RankingRun is not liable for athletic injuries, data loss, or any damages occurring during the use of the service. All physical activities should be performed safely at the user's own risk.</p></section><div class="pt-8 border-t border-slate-200 dark:border-slate-800"><p class="text-sm">Last updated: May 6, 2026</p><a class="inline-block mt-4 text-blue-600 font-bold hover:underline" href="/" data-discover="true">Back to Home</a></div></div></div></main><footer class="bg-slate-50 dark:bg-slate-900/50 border-t border-slate-200 dark:border-slate-800 py-12 transition-colors duration-300"><div class="max-w-4xl mx-auto px-4"><div class="flex flex-col md:flex-row justify-between items-center gap-6"><div class="text-center md:text-left"><h2 class="text-lg font-black text-blue-600 tracking-tighter">RankingRun</h2><p class="text-xs text-slate-400 dark:text-slate-500 mt-1 font-medium">© 2026 RankingRun. All rights reserved.</p></div><div class="flex gap-6 text-sm font-bold text-slate-500 dark:text-slate-400"><a aria-current="page" class="hover:text-blue-600 transition-colors active" href="/terms" data-discover="true">Terms</a><a class="hover:text-blue-600 transition-colors" href="/privacy" data-discover="true">Privacy</a></div></div><div class="mt-8 text-[10px] text-slate-400 dark:text-slate-600 text-center uppercase tracking-widest font-black">Global Compliance: GDPR & CCPA Ready</div></div></footer>
13<script>((c, u) => { 14 if (!window.history.state || !window.history.state.key) { 15 let d = Math.random().toString(32).slice(2); 16 window.history.replaceState({ key: d }, ""); 17 } 18 try { 19 let h = JSON.parse(sessionStorage.getItem(c) || "{}")[u || window.history.state.key]; 20 typeof h == "number" && window.scrollTo(0, h); 21 } catch (d) { 22 console.error(d), sessionStorage.removeItem(c); 23 } 24 })("react-router-scroll-positions", null)</script>
24<script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_passThroughRequests":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"unstable_previewServerPrerendering":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"lazy","manifestPath":"/__manifest"},"ssr":true,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamController = controller;}}).pipeThrough(new TextEncoderStream());</script>
24<script type="module" async="">; 25import * as route0 from "/assets/root-Ba3xVD5v.js"; 26import * as route1 from "/assets/terms-BvCtXZG5.js"; 27 window.__reactRouterManifest = { 28 "entry": { 29 "module": "/assets/entry.client-zDRVL4Si.js", 30 "imports": [ 31 "/assets/dist-BJAFxcYu.js", 32 "/assets/jsx-runtime-DOhyBulg.js" 33 ], 34 "css": [] 35 }, 36 "routes": { 37 "root": { 38 "id": "root", 39 "path": "", 40 "hasAction": false, 41 "hasLoader": false, 42 "hasClientAction": false, 43 "hasClientLoader": false, 44 "hasClientMiddleware": false, 45 "hasDefaultExport": true, 46 "hasErrorBoundary": true, 47 "module": "/assets/root-Ba3xVD5v.js", 48 "imports": [ 49 "/assets/dist-BJAFxcYu.js", 50 "/assets/jsx-runtime-DOhyBulg.js", 51 "/assets/store-Cwy2aUvL.js" 52 ], 53 "css": [ 54 "/assets/root-Ch7H8VqF.css" 55 ] 56 }, 57 "routes/terms": { 58 "id": "routes/terms", 59 "parentId": "root", 60 "path": "terms", 61 "hasAction": false, 62 "hasLoader": false, 63 "hasClientAction": false, 64 "hasClientLoader": false, 65 "hasClientMiddleware": false, 66 "hasDefaultExport": true, 67 "hasErrorBoundary": false, 68 "module": "/assets/terms-BvCtXZG5.js", 69 "imports": [ 70 "/assets/dist-BJAFxcYu.js", 71 "/assets/jsx-runtime-DOhyBulg.js" 72 ], 73 "css": [] 74 }, 75 "routes/ranking": { 76 "id": "routes/ranking", 77 "parentId": "root", 78 "index": true, 79 "hasAction": false, 80 "hasLoader": false, 81 "hasClientAction": false, 82 "hasClientLoader": false, 83 "hasClientMiddleware": false, 84 "hasDefaultExport": true, 85 "hasErrorBoundary": false, 86 "module": "/assets/ranking-BSeUxMpU.js", 87 "imports": [ 88 "/assets/dist-BJAFxcYu.js", 89 "/assets/jsx-runtime-DOhyBulg.js", 90 "/assets/store-Cwy2aUvL.js" 91 ], 92 "css": [] 93 } 94 }, 95 "url": "/assets/manifest-e3a52046.js", 96 "version": "e3a52046" 97}; 98 window.__reactRouterRouteModules = {"root":route0,"routes/terms":route1}; 99 100import("/assets/entry.client-zDRVL4Si.js");</script>
100<script> 101 window.__LOGGING_APP_NAME__ = "rankingrun"; 102 window.__LOGGING_ENV__ = "production"; 103 window.__LOGGING_COLLECTOR_URL__ = "https://payment.cloudj.workers.dev/api/v1/logs"; 104 window.__LOGGING_API_KEY__ = "bot123"; 105 </script>
105<script src="https://payment.cloudj.workers.dev/js/logger.js" defer=""></script>
105<!--$-->
105<script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_3\":-5,\"_4\":-5},\"loaderData\",{},\"actionData\",\"errors\"]\n");</script>
105<!--$-->
105<script>window.__reactRouterContext.streamController.close();</script>
105<!--/$--><!--/$--></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.