1<!doctype html> 2<html lang="en"> 3 <head> 4 <meta charset="UTF-8" /> 5 <!-- 6 Static tags describe CreatorSense, which is what this shell actually ships 7 as: VITE_PRODUCT_BRAND=creatorsense on the only service that serves /app/. 8 9 They used to describe Orolith and get corrected by the script below, which 10 left a window before JS ran where the page was Orolith. On desktop that is 11 invisible. On a phone it is not: mobile browsers paint the address and 12 status bar from theme-color at first paint, so the chrome came up Orolith 13 navy (#2a4066) and then flipped, and the tab switcher, share sheet and 14 Add to Home Screen all read "Orolith". 15 16 An Orolith host is now the one that gets patched at runtime, which is the 17 arrangement CreatorSense had and tolerated. 18 --> 19 <link rel="icon" type="image/png" href="/app/branding/creatorsense/icon-32.png" /> 20 <link rel="icon" type="image/png" sizes="16x16" href="/app/branding/creatorsense/icon-32.png" /> 21 <link rel="icon" type="image/png" sizes="32x32" href="/app/branding/creatorsense/icon-32.png" /> 22 <meta 23 name="viewport" 24 content="width=device-width, initial-scale=1.0, viewport-fit=cover, interactive-widget=resizes-content" 25 /> 26 27 <!-- Primary Meta Tags --> 28 <title>CreatorSense â Trace & MCP for creators</title> 29 <meta name="title" content="CreatorSense â Trace & MCP for creators" /> 30 <meta 31 name="description" 32 content="CreatorSense Trace attributes digital leaks; CreatorSense MCP puts your creator data in Claude. Login and app tools â marketing lives on the public site." 33 /> 34 <meta 35 name="keywords"
36 content="creator analytics, content creator tools, revenue tracking, YouTube analytics, TikTok analytics, Instagram analytics, AI insights, creator economy, TaxWise, ORACLE forecasting" 37 /> 38 <meta name="author" content="CreatorSense" /> 39 <link rel="canonical" href="https://www.creatorsenseai.com/" /> 40 <!-- Allow indexing of the public login page; individual app routes handled by SPA router --> 41 <meta name="robots" content="index, follow" /> 42 43 <!-- Open Graph / Facebook --> 44 <meta property="og:type" content="website" /> 45 <meta property="og:url" content="https://www.creatorsenseai.com/" /> 46 <meta property="og:title" content="CreatorSense â Trace & MCP for creators" /> 47 <meta 48 property="og:description" 49 content="Trace attributes digital leaks; MCP puts your creator data in Claude." 50 /> 51 <meta property="og:image" content="/app/branding/creatorsense/og-card.png" /> 52 <meta property="og:image:width" content="1200" /> 53 <meta property="og:image:height" content="630" /> 54 55 <!-- Twitter --> 56 <meta property="twitter:card" content="summary_large_image" /> 57 <meta property="twitter:url" content="https://www.creatorsenseai.com/" /> 58 <meta property="twitter:title" content="CreatorSense â Trace & MCP for creators" /> 59 <meta 60 property="twitter:description" 61 content="Trace attributes digital leaks; MCP puts your creator data in Claude." 62 /> 63 <meta property="twitter:image" content="/branding/creatorsense/og-card.png" /> 64 65 <!-- PWA Meta Tags --> 66 <meta name="theme-color" content="#fbf8f6" /> 67 <meta name="apple-mobile-web-app-capable" content="yes" /> 68 <meta name="mobile-web-app-capable" content="yes" /> 69 <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" /> 70 <meta name="apple-mobile-web-app-title" content="CreatorSense" /> 71 <link rel="apple-touch-icon" href="/app/branding/creatorsense/icon-180.png" /> 72 <!-- Orolith host: brand meta before SPA boot. CreatorSense is the static default. --> 73
73<script> 74 ;(function () { 75 try { 76 var h = location.hostname || '' 77 // Anything on a CreatorSense host already matches the static tags. 78 if (/(^|\.)creatorsenseai\.com$/i.test(h)) return 79 // Only rebrand for a real Orolith host; localhost and preview builds 80 // keep the CreatorSense default rather than flipping unexpectedly. 81 if (!/(^|\.)orolith\.(io|com)$/i.test(h)) return 82 var prefix = location.origin + '/' 83 if (location.pathname.indexOf('/app') === 0) prefix = location.origin + '/app/' 84 document.querySelectorAll('link[rel="icon"]').forEach(function (el) { 85 el.href = prefix + 'branding/logos/orolith-logo-32.png' 86 }) 87 var touch = document.querySelector('link[rel="apple-touch-icon"]') 88 if (touch) touch.href = prefix + 'branding/logos/orolith-logo-256.png' 89 var appleTitle = document.querySelector('meta[name="apple-mobile-web-app-title"]') 90 if (appleTitle) appleTitle.setAttribute('content', 'Orolith') 91 var theme = document.querySelector('meta[name="theme-color"]') 92 if (theme) theme.setAttribute('content', '#2a4066') 93 document.title = 'Orolith - Analytics Platform for Content Creators' 94 var set = function (sel, attr, val) { 95 var el = document.querySelector(sel) 96 if (el) el.setAttribute(attr, val) 97 } 98 set('meta[name="title"]', 'content', document.title) 99 set( 100 'meta[name="description"]', 101 'content', 102 'AI-powered analytics platform for content creators. Track revenue, optimize content, and grow your audience with intelligent insights.' 103 ) 104 set('meta[name="author"]', 'content', 'Orolith') 105 set('link[rel="canonical"]', 'href', 'https://orolith.io/') 106 set('meta[property="og:title"]', 'content', document.title) 107 set('meta[property="og:url"]', 'content', 'https://orolith.io/') 108 set('meta[property="og:image"]', 'content', '/branding/banners/og-image-1200x630.png') 109 set('meta[property="twitter:title"]', 'content', document.title) 110 set('meta[property="twitter:url"]', 'content', 'https://orolith.io/') 111 set('meta[property="twitter:image"]', 'content', '/branding/banners/og-image-1200x630.png') 112 } catch (e) {} 113 })() 114 </script>
114 115 116 <!-- 117 Content-Security-Policy meta-tag fallback. 118 Primary CSP is enforced via Cloudflare Transform Rules / response headers. 119 This meta-tag is a secondary defence for environments without Cloudflare 120 (local dev, Railway preview, direct-to-origin requests). 121 It does NOT cover frame-ancestors or report-uri (header-only directives). 122 --> 123 <meta 124 http-equiv="Content-Security-Policy" 125 content="default-src 'self'; script-src 'self' 'unsafe-inline' https://challenges.cloudflare.com https://accounts.google.com https://apis.google.com https://cdn.jsdelivr.net; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com https://accounts.google.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: blob: https:; media-src 'self' blob: https://*.r2.cloudflarestorage.com https://b4dedf5f9febc4226344bbd0a4c5a4f7.r2.cloudflarestorage.com; connect-src 'self' https://*.up.railway.app https://api.creatorsenseai.com https://api.orolith.io https://*.r2.cloudflarestorage.com https://b4dedf5f9febc4226344bbd0a4c5a4f7.r2.cloudflarestorage.com https://sentry.io https://*.sentry.io wss://*.up.railway.app https://accounts.google.com https://oauth2.googleapis.com https://cdn.jsdelivr.net; frame-src 'self' https://accounts.google.com; object-src 'none'; base-uri 'self';" 126 /> 127 128 <!-- Google Fonts loads async so a slow CDN can never block first paint 129 (it was previously render-blocking; on a flaky connection the login 130 page sat blank waiting on fonts.googleapis.com). The preload â 131 rel=stylesheet swap applies it the moment it arrives; display=swap 132 renders text in fallback fonts meanwhile. --> 133 <link rel="preconnect" href="https://fonts.googleapis.com" crossorigin /> 134 <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin /> 135 136 <!-- Google Fonts (moved out of the bundled CSS @import, which hid it from 137 the preload scanner and blocked paint after app CSS arrived) --> 138 <link 139 rel="preload" 140 as="style" 141 href="https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;600&family=IBM+Plex+Sans:wght@400;500;600;700&family=Source+Serif+4:opsz,[email protected],600;8..60,700&display=swap" 142 onload=" 143 this.onload = null 144 this.rel = 'stylesheet' 145 " 146 /> 147 <noscript> 148 <link 149 rel="stylesheet" 150 href="https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;600&family=IBM+Plex+Sans:wght@400;500;600;700&family=Source+Serif+4:opsz,[email protected],600;8..60,700&display=swap" 151 /> 152 </noscript> 153 154 <!-- Font Awesome removed: the SPA now uses lucide exclusively, so the 155 render-blocking cdnjs stylesheet is gone entirely. --> 156 157 <!-- 158 No JSON-LD here. This shell is the signed-in app, which nginx serves with 159 X-Robots-Tag: noindex, nofollow, so schema on it earns nothing. The block 160 that used to sit here described "Orolith" at $29 and $79 tiers that no 161 longer exist, which is the kind of stale claim that only surfaces once 162 something accidentally indexes it. Structured data for the product lives 163 on the marketing site, where it is kept in step with pricing. 164 --> 165 166 <!-- Blocking theme script: applies dark/light class before first paint to prevent flash --> 167 168
168<script> 169 ;(function () { 170 try { 171 var stored = localStorage.getItem('orolith-theme') 172 var prefersDark = 173 window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches 174 var isDark = stored === 'dark' || (stored !== 'light' && prefersDark) 175 if (isDark) { 176 document.documentElement.classList.add('dark') 177 document.documentElement.style.backgroundColor = '#0f172a' 178 document.documentElement.style.colorScheme = 'dark' 179 } else { 180 document.documentElement.classList.add('light') 181 document.documentElement.style.backgroundColor = '#f8fafc' 182 } 183 } catch (e) {} 184 })() 185 </script>
185 186
186<script type="module" crossorigin src="/app/assets/index-BNPflmqD.js"></script>
186 187 <link rel="modulepreload" crossorigin href="/app/assets/vendor-misc-5pJBpqhN.js"> 188 <link rel="modulepreload" crossorigin href="/app/assets/vendor-vue-BIDZeepx.js"> 189 <link rel="modulepreload" crossorigin href="/app/assets/vendor-tanstack-B6ELLr_Q.js"> 190 <link rel="modulepreload" crossorigin href="/app/assets/vendor-sentry-84cD2ryj.js"> 191 <link rel="modulepreload" crossorigin href="/app/assets/vendor-utils-CxkvrZ9U.js"> 192 <link rel="stylesheet" crossorigin href="/app/assets/vendor-vue-C7FFelxn.css"> 193 <link rel="stylesheet" crossorigin href="/app/assets/index-CDUGBYcW.css"> 194 <link rel="manifest" href="/app/manifest.webmanifest">
194<script id="vite-plugin-pwa:register-sw" src="/app/registerSW.js"></script>
194</head> 195 196 <body> 197 <div id="app"></div> 198 </body> 199</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.