1<!DOCTYPE html> 2<html lang="en"> 3 <head> 4 <!-- Google Analytics / Ads is NOT loaded here. 5 6 It used to be: a gtag.js
6<script src> plus an inline gtag() bootstrap, 7 both running on every route for every visitor. Two problems, one fix. 8 9 1. Consent. AnalyticsContext gates analytics behind a stored consent 10 choice, but a tag in the entry document runs before any of that, 11 so GA was measuring people who had not opted in. 12 2. CSP. An inline block and a third-party executable origin are the 13 two things `script-src 'self'` exists to stop, and confidential 14 (/eln, /notebook) and native surfaces must not load them at all. 15 16 Loading now happens in initAnalytics() (src/utils/analytics.ts), which 17 AnalyticsContext calls only after consent and never on a confidential 18 or native surface. Every gtag() call site in src/ was already guarded 19 with `typeof gtag !== "function"` / `?.`, so nothing breaks while the 20 tag is absent. See docs/chemillusion_csp_web_lti_native_app_prd.md FR-4. --> 21
21<script type="application/ld+json"> 22 { 23 "@context": "https://schema.org", 24 "@graph": [ 25 { 26 "@type": "Organization", 27 "name": "ChemIllusion", 28 "url": "https://chemillusion.com", 29 "logo": "https://chemillusion.com/android-chrome-512x512.png", 30 "description": "AI-powered platform for generating artistic images from chemical compounds and molecules.", 31 "sameAs": ["https://twitter.com/chemillusion"] 32 }, 33 { 34 "@type": "WebSite", 35 "name": "ChemIllusion", 36 "url": "https://chemillusion.com", 37 "potentialAction": { 38 "@type": "SearchAction", 39 "target": { 40 "@type": "EntryPoint", 41 "urlTemplate": "https://chemillusion.com/gallery?search={search_term_string}" 42 }, 43 "query-input": "required name=search_term_string" 44 } 45 }, 46 { 47 "@type": "Product", 48 "name": "CourseForge by ChemIllusion", 49 "description": "ChemIllusion's CourseForge turns expert concept maps â or an author's own manuscript â into complete interactive course ecosystems: readers, online homework with grading, question banks, AI tutors, decks, and labs.", 50 "url": "https://chemillusion.com/course-forge", 51 "brand": { 52 "@type": "Brand", 53 "name": "ChemIllusion" 54 }, 55 "offers": { 56 "@type": "AggregateOffer", 57 "priceCurrency": "USD", 58 "availability": "https://schema.org/PreOrder", 59 "description": "Fall pilot pricing coming soon. Two paths: one-time downloadable static assets, or interactive license for live drawing and LMS embed." 60 }, 61 "audience": { 62 "@type": "EducationalAudience", 63 "educationalRole": "teacher" 64 } 65 } 66 ] 67 } 68 </script>
68 69 <meta charset="UTF-8" /> 70 <!-- Canonical favicon assets live under `/favicon_io/`; keep a root `/favicon.ico` fallback for browser heuristics and stale production caches. --> 71 <link rel="apple-touch-icon" sizes="180x180" href="/favicon_io/apple-touch-icon.png" /> 72 <link rel="icon" type="image/png" sizes="32x32" href="/favicon_io/favicon-32x32.png" /> 73 <link rel="icon" type="image/png" sizes="16x16" href="/favicon_io/favicon-16x16.png" /> 74 <link rel="shortcut icon" href="/favicon.ico" /> 75 <link rel="icon" href="/favicon.ico" /> 76 <meta name="theme-color" content="#1a202c" /> 77 <meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover" /> 78 <!-- Mobile browser chrome polish only â deliberately NO web-app manifest or 79 service worker (site-wide PWA was rolled back; public/sw.js is a 80 kill-switch, see docs/superpowers/specs/2026-06-02-chemillusion-pwa-reader-design.md) --> 81 <meta name="mobile-web-app-capable" content="yes" /> 82 <meta name="apple-mobile-web-app-capable" content="yes" /> 83 <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" /> 84 <meta name="apple-mobile-web-app-title" content="ChemIllusion" /> 85 <link integrity="sha384-hbOWllRBPOa0RdEwaL5r6UTexha/lvLCDUTxtf32SQeKP3f2sKwTuiPi1sX424GS" crossorigin="anonymous" href="/fonts/app-fonts.css" rel="stylesheet" /> 86 <!-- Hide skip link until focused; must be inline so it applies before the JS bundle loads. --> 87 <style> 88 .skip-link { 89 position: absolute; 90 left: -999px; 91 top: auto; 92 width: 1px; 93 height: 1px; 94 overflow: hidden; 95 } 96 .skip-link:focus { 97 left: 0; 98 top: 0; 99 width: auto; 100 height: auto; 101 padding: 0.5rem 1rem; 102 /* blue.600: 5.5:1 with white text (blue.500 was 4.0:1). */ 103 background: #2b6cb0; 104 color: white; 105 /* Above the generator's fixed header (z-index 1400), so the focused 106 link is never covered (WCAG 2.4.11). */ 107 z-index: 2000; 108 } 109 </style> 110<!-- Pre-React bootstrap: Node globals, colour mode, scroll restoration. 111 Externalised so `script-src 'self'` can be enforced; a classic (not 112 module) script because all three must run before first paint. --> 113
113<script type="module" src="/bootstrap.js" integrity="sha384-KA5D5i3qgPjXeCFqgq4hl+14wX/+kK7WOmdxjqCLDIes5jHszinXvR0uVa/tLHJb" crossorigin="anonymous"></script>
113 114
114<script type="module" src="/assets/index-DN2b6gf5.js" integrity="sha384-oJgc1XP2uwVSUXVdPa7OXrn+Jh3e4XuByDfxEwkw6poNxkB8goVYs8hJZW4cLSHR" crossorigin="anonymous"></script>
114 115 <link rel="modulepreload" crossorigin href="/assets/react-vendor-DRshJiK8.js"> 116 <link integrity="sha384-DBRTqORyfLxxSGaAza5FrDQFaCY2ZTJt6mHhZe1DX2LU4vRJQrnb8LSfbm7Y4IYM" crossorigin="anonymous" rel="stylesheet" crossorigin href="/assets/index-o94X5qU7.css"> 117 <title data-rh="true">ChemIllusion â The best way to learn chemistry</title> 118 <meta data-rh="true" name="description" content="The best way to learn chemistry â and tools for every chemist. Adopt our organic chemistry course, build slides and full courses, or draw and create with Chem Assistant in one browser workspace." /> 119 <link data-rh="true" rel="canonical" href="https://chemillusion.com/" /> 120 <meta data-rh="true" name="robots" content="index, follow" /> 121 <meta data-rh="true" property="og:title" content="ChemIllusion â The best way to learn chemistry" /> 122 <meta data-rh="true" property="og:description" content="The best way to learn chemistry â and tools for every chemist. Adopt our organic chemistry course, build slides and full courses, or draw and create with Chem Assistant in one browser workspace." /> 123 <meta data-rh="true" property="og:url" content="https://chemillusion.com/" /> 124 <meta data-rh="true" property="og:type" content="website" /> 125 <meta data-rh="true" property="og:site_name" content="ChemIllusion" /> 126 <meta data-rh="true" property="og:image" content="https://chemillusion.com/og/logo.png" /> 127 <meta data-rh="true" name="twitter:card" content="summary_large_image" /> 128 <meta data-rh="true" name="twitter:title" content="ChemIllusion â The best way to learn chemistry" /> 129 <meta data-rh="true" name="twitter:description" content="The best way to learn chemistry â and tools for every chemist. Adopt our organic chemistry course, build slides and full courses, or draw and create with Chem Assistant in one browser workspace." /> 130 <meta data-rh="true" name="twitter:image" content="https://chemillusion.com/og/logo.png" /> 131 <link data-rh="true" rel="alternate" hreflang="en" href="https://chemillusion.com/" /> 132 <link data-rh="true" rel="alternate" hreflang="es" href="https://chemillusion.com/es/inicio" /> 133 <link data-rh="true" rel="alternate" hreflang="de" href="https://chemillusion.com/de/startseite" /> 134 <link data-rh="true" rel="alternate" hreflang="x-default" href="https://chemillusion.com/" /> 135
135<script data-rh="true" type="application/ld+json">{"@context":"https://schema.org","@type":"WebPage","headline":"ChemIllusion â The best way to learn chemistry","description":"The best way to learn chemistry â and tools for every chemist. Adopt our organic chemistry course, build slides and full courses, or draw and create with Chem Assistant in one browser workspace.","url":"https://chemillusion.com/"}</script>
135 136 <style data-prerender-fallback-style>[data-prerender-fallback]{display:none !important}</style> 137 </head> 138 <body> 139 <a href="#main-content" class="skip-link">Skip to main content</a> 140 <div id="root"><div data-prerender-fallback><main data-search-fallback="true"> 141 <h1>ChemIllusion â The best way to learn chemistry</h1> 142 <p>The best way to learn chemistry â and tools for every chemist. Adopt our organic chemistry course, build slides and full courses, or draw and create with Chem Assistant in one browser workspace.</p> 143 <nav aria-label="Related ChemIllusion pages"> 144 <ul> 145 <li><a href="/">ChemIllusion home</a></li> 146 <li><a href="/generator">generator</a></li> 147 <li><a href="/gallery">gallery</a></li> 148 <li><a href="/pricing/roles">pricing roles</a></li> 149 <li><a href="https://coursehouse.org/">https: coursehouse.org </a></li> 150 </ul> 151 </nav> 152</main></div></div> 153 </body> 154</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.