1<!DOCTYPE html> 2<html lang="en"> 3 <head> 4 <meta charset="UTF-8" /> 5 <meta name="viewport" content="width=device-width, initial-scale=1.0" /> 6 <meta name="robots" content="noindex, nofollow" /> 7 <link rel="icon" type="image/svg+xml" href="/favicon.svg" /> 8 <!-- 9 Apple touch icon - 180x180 PNG required by iOS home-screen install. 10 TODO: generate /apple-touch-icon.png (180x180) from /favicon.svg. 11 Suggested commands (run on a host with ImageMagick or rsvg-convert): 12 rsvg-convert -w 180 -h 180 frontend/public/favicon.svg -o frontend/public/apple-touch-icon.png 13 # or: 14 magick -background "#001F3F" -resize 180x180 frontend/public/favicon.svg frontend/public/apple-touch-icon.png 15 iOS will fall back gracefully if missing; the link tag is still valid. 16 --> 17 <link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png" /> 18 19 <!-- PWA manifest + theme color --> 20 <link rel="manifest" href="/manifest.webmanifest" /> 21 <meta name="theme-color" content="#00D8C0" /> 22 23 <!-- 24 Open Graph + Twitter Card. og:image was an SVG, which Facebook, 25 LinkedIn, Slack and iMessage do not reliably render for link 26 previews -- most either show nothing or a broken-image icon. Same 27 1200x675 PNG shared across rainmojo.com, app.rainmojo.com and 28 dev.rainmojo.com, so a link shared from any of them carries the same 29 card. 30 31 Filename carries a version suffix on purpose: nginx serves this path 32 with Cache-Control: immutable, max-age=31536000, and Cloudflare 33 honors that at the edge. The first image (no suffix) got stuck stale 34 on dev.rainmojo.com after a content change with no way to purge it 35 (no Cloudflare API access in this environment) -- reusing the same 36 filename for different bytes is exactly what "immutable" tells the 37 cache never to expect. Bump the suffix (-v3, -v4, ...) on every 38 future change instead of editing the file in place. 39 --> 40 <meta property="og:title" content="Rainmojo - Search Optimization Intelligence" /> 41 <meta property="og:description" content="AI-powered SEO + AI Visibility tracking platform" /> 42 <meta property="og:image" content="https://app.rainmojo.com/rainmojo-featured-1200x675-v2.png" /> 43 <meta property="og:image:width" content="1200" /> 44 <meta property="og:image:height" content="675" /> 45 <meta property="og:url" content="https://app.rainmojo.com" /> 46 <meta property="og:type" content="website" /> 47 <meta name="twitter:card" content="summary_large_image" /> 48 <meta name="twitter:title" content="Rainmojo" /> 49 <meta name="twitter:description" content="AI-powered SEO + AI Visibility tracking platform" /> 50 <meta name="twitter:image" content="https://app.rainmojo.com/rainmojo-featured-1200x675-v2.png" /> 51 52 <title>Rainmojo</title> 53 <link rel="preload" href="/fonts/GoogleSans-Latin-Thai.woff2" as="font" type="font/woff2" crossorigin> 54
54<script type="module" crossorigin src="/assets/customer-BqEJ01U2.js"></script>
54 55 <link rel="modulepreload" crossorigin href="/assets/rolldown-runtime-hePW80VL.js"> 56 <link rel="modulepreload" crossorigin href="/assets/chart-vendor-ViDPe8tH.js"> 57 <link rel="modulepreload" crossorigin href="/assets/query-vendor-B-vyF1sJ.js"> 58 <link rel="modulepreload" crossorigin href="/assets/icon-vendor-DjVHoif1.js"> 59 <link rel="modulepreload" crossorigin href="/assets/applyTheme-Lenl0dzP.js"> 60 <link rel="modulepreload" crossorigin href="/assets/src-Cf-M33fR.js"> 61 <link rel="modulepreload" crossorigin href="/assets/react-vendor-BLbn2AUR.js"> 62 <link rel="modulepreload" crossorigin href="/assets/preload-helper-i0dwxIsm.js"> 63 <link rel="modulepreload" crossorigin href="/assets/axios-CyXjGKE7.js"> 64 <link rel="modulepreload" crossorigin href="/assets/api-BBIuh2Sg.js"> 65 <link rel="modulepreload" crossorigin href="/assets/ui-7QC1OPsj.js"> 66 <link rel="modulepreload" crossorigin href="/assets/usePageTitle-DxGXN0lB.js"> 67 <link rel="modulepreload" crossorigin href="/assets/errorHandler-D4WUIGW0.js"> 68 <link rel="modulepreload" crossorigin href="/assets/formatDate-C2A1_cI5.js"> 69 <link rel="modulepreload" crossorigin href="/assets/preferencesStore-DoGZaYzq.js"> 70 <link rel="modulepreload" crossorigin href="/assets/useUrlState-xGjnKet6.js"> 71 <link rel="modulepreload" crossorigin href="/assets/UpgradeModal-0YSYT42P.js"> 72 <link rel="stylesheet" crossorigin href="/assets/src-DqpQciCc.css"> 73 <link rel="stylesheet" crossorigin href="/assets/customer-CR5_vFco.css"> 74 </head> 75 <body> 76 <div id="root"></div> 77
77<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":"11d1e96dc9514ec1b15d41e759df7af3","r":1,"spa":2}' crossorigin="anonymous"></script>
vendor: 1 bytes, line 77
77
78<script>(function(){function c(){var b=a.contentDocument||(a.contentWindow&&a.contentWindow.document);if(b){var d=b.createElement('script');d.innerHTML="window.__CF$cv$params={r:'a444969b8d8eabd3',t:'MTc5MDk1MzM0OA=='};var a=document.createElement('script');a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagName('head')[0].appendChild(a);";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&&(document.onreadystatechange=e,c())}}}})();</script>
78</body> 79</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.