1<!DOCTYPE html> 2<html lang="en"> 3 <head> 4 <meta charset="utf-8"/> 5 <meta content="width=device-width, initial-scale=1.0" name="viewport"/> 6 <!-- GA4 owns page views: one initial config hit plus Enhanced Measurement 7 history events for React Router navigation (push/replace/back/forward). 8 Keep "Page changes based on browser history events" enabled for this 9 stream. Do not add a second manual React page_view tracker. --> 10
10<script> 11 (function () { 12 // Keep editor/preview visits out of the production stream. 13 if (!['mandarinmonkey.com', 'www.mandarinmonkey.com'].includes(window.location.hostname)) return; 14 if (window.__mandarinMonkeyGa4Loaded) return; 15 window.__mandarinMonkeyGa4Loaded = true; 16 window.dataLayer = window.dataLayer || []; 17 window.gtag = window.gtag || function () { window.dataLayer.push(arguments); }; 18 window.gtag('js', new Date()); 19 window.gtag('config', 'G-NL6S63BGZ2'); 20 var tag = document.createElement('script'); 21 tag.async = true; 22 tag.src = 'https://www.googletagmanager.com/gtag/js?id=G-NL6S63BGZ2'; 23 document.head.appendChild(tag); 24 })(); 25 </script>
25 26 <title> 27 Mandarin Monkey 28 </title> 29 <meta content="Your premier online academy for mastering Mandarin. Connect with expert native teachers for personalized 1-on-1 lessons, from casual conversation to business fluency. Enjoy flexible scheduling, a free trial lesson, and convenient online booking." name="description"/> 30 <meta content="index,follow,max-image-preview:large,max-snippet:-1,max-video-preview:-1" name="robots"/> 31 <meta content="index,follow,max-image-preview:large,max-snippet:-1,max-video-preview:-1" name="googlebot"/> 32 <link href="https://qtrypzzcjebvfcihiynt.supabase.co/storage/v1/object/public/base44-prod/public/2ced6e720_Artboard2.png" rel="icon" type="image/png"/> 33 <link href="/manifest.json" rel="manifest"/> 34 <meta content="Mandarin Monkey" property="og:site_name"/> 35 <meta content="website" property="og:type"/> 36 <meta content="Mandarin Monkey" property="og:title"/> 37 <meta content="Your premier online academy for mastering Mandarin. Connect with expert native teachers for personalized 1-on-1 lessons, from casual conversation to business fluency. Enjoy flexible scheduling, a free trial lesson, and convenient online booking." property="og:description"/> 38 <meta content="https://mandarinmonkey.com" property="og:url"/> 39 <meta content="https://media.base44.com/images/public/68aee747b9a60c284c81b286/ff1fdf7f1_MandarinMonkeyLogo.png/v1/fill/w_1200,h_630/ff1fdf7f1_MandarinMonkeyLogo.png" property="og:image"/> 40 <meta content="summary_large_image" name="twitter:card"/> 41 <meta content="Mandarin Monkey" name="twitter:title"/> 42 <meta content="Your premier online academy for mastering Mandarin. Connect with expert native teachers for personalized 1-on-1 lessons, from casual conversation to business fluency. Enjoy flexible scheduling, a free trial lesson, and convenient online booking." name="twitter:description"/> 43 <meta content="https://media.base44.com/images/public/68aee747b9a60c284c81b286/ff1fdf7f1_MandarinMonkeyLogo.png/v1/fill/w_1200,h_630/ff1fdf7f1_MandarinMonkeyLogo.png" name="twitter:image"/> 44
44<script type="application/ld+json"> 45 { 46 "@context": "https://schema.org", 47 "@graph": [ 48 { 49 "@type": "Organization", 50 "@id": "https://www.mandarinmonkey.com/#organization", 51 "name": "Mandarin Monkey", 52 "url": "https://www.mandarinmonkey.com/", 53 "email": "[email protected]", 54 "description": "Online Mandarin language academy focused on practical conversation and real-life Mandarin." 55 }, 56 { 57 "@type": "WebSite", 58 "@id": "https://www.mandarinmonkey.com/#website", 59 "url": "https://www.mandarinmonkey.com/", 60 "name": "Mandarin Monkey", 61 "publisher": { "@id": "https://www.mandarinmonkey.com/#organization" }, 62 "inLanguage": "en" 63 } 64 ] 65 } 66 </script>
66 67
67<script crossorigin="" src="/assets/index-CrpPsQa6.js" type="module"> 68 </script>
68 69 <link crossorigin="" href="/assets/index-YuEQZCvM.css" rel="stylesheet"/> 70
70<script type="module"> 71 if (window.self === window.top) { 72 let lastPath = ""; 73 function getPageNameFromPath(path) { 74 const segments = path.split("/").filter(Boolean); 75 return segments[0] || null; 76 } 77 function trackPageView() { 78 const path = window.location.pathname; 79 if (path === lastPath) return; 80 lastPath = path; 81 const pageName = getPageNameFromPath(path) || "home"; 82 const appId = "68aee747b9a60c284c81b286"; 83 if (!appId) return; 84 fetch(`/api/app-logs/${appId}/log-user-in-app/${pageName}`, { 85 method: "POST", 86 }).catch(() => {}); 87 } 88 const originalPushState = history.pushState.bind(history); 89 history.pushState = function (...args) { 90 originalPushState(...args); 91 trackPageView(); 92 }; 93 const originalReplaceState = history.replaceState.bind(history); 94 history.replaceState = function (...args) { 95 originalReplaceState(...args); 96 trackPageView(); 97 }; 98 window.addEventListener("popstate", trackPageView); 99 trackPageView(); 100} 101 </script>
101 102 <meta content="https://mandarinmonkey.com" name="twitter:url"/> 103
103<script> 104 (function () { 105 var titles = {"/": "Mandarin Monkey", "/teachers": "Teachers | Mandarin Monkey", "/hangouts": "Hangouts | Mandarin Monkey", "/group-lessons": "Group Lessons | Mandarin Monkey", "/grouplessons": "Group Lessons | Mandarin Monkey", "/podcast": "Podcast | Mandarin Monkey", "/find-my-path": "Find My Path | Mandarin Monkey", "/update-name": "Update Name | Mandarin Monkey", "/learn": "Learn | Mandarin Monkey", "/referral": "Referral Claim | Mandarin Monkey", "/contact": "Contact | Mandarin Monkey", "/pricing": "Pricing | Mandarin Monkey", "/privacy-policy": "Privacy Policy | Mandarin Monkey", "/terms-of-service": "Terms Of Service | Mandarin Monkey", "/email-preferences": "Email Preferences | Mandarin Monkey", "/lessons": "Pricing | Mandarin Monkey", "/memberships": "Pricing | Mandarin Monkey", "/intensive-course": "Pricing | Mandarin Monkey", "/yt": "Yt | Mandarin Monkey", "/ig": "Ig | Mandarin Monkey", "/tt": "Tt | Mandarin Monkey", "/reddit": "Reddit | Mandarin Monkey", "/fb": "Fb | Mandarin Monkey", "/dashboard": "Role Redirect | Mandarin Monkey", "/admin-dashboard": "Admin Dashboard | Mandarin Monkey", "/admindashboard": "Admin Dashboard | Mandarin Monkey", "/teacher-dashboard": "Teacher Dashboard | Mandarin Monkey", "/teacherdashboard": "Teacher Dashboard | Mandarin Monkey", "/student-dashboard": "Student Dashboard | Mandarin Monkey", "/studentdashboard": "Student Dashboard | Mandarin Monkey", "/progresstracker": "Progress Tracker | Mandarin Monkey", "/progress-tracker": "Progress Tracker | Mandarin Monkey", "/booklesson": "Book Lesson | Mandarin Monkey", "/book-lesson": "Book Lesson | Mandarin Monkey", "/challengewall": "Challenge Wall | Mandarin Monkey", "/challenge-wall": "Challenge Wall | Mandarin Monkey", "/oauth/google-calendar-complete": "O Auth Google Calendar Complete | Mandarin Monkey", "/home": "Mandarin Monkey"}; 106 // PascalCase boundaries -> "-", mirroring _PASCAL_BOUNDARY_RE without lookbehind 107 // (old Safari fails to PARSE a lookbehind, taking the whole script down). 108 var dashed = function (s) { 109 return s.replace(/([a-z0-9])([A-Z])/g, "$1-$2").replace(/([A-Z])([A-Z][a-z])/g, "$1-$2"); 110 }; 111 var decode = function (s) { 112 // A %2F inside ONE segment must not become a structural separator: /blog/foo%2Fbar is a 113 // dynamic slug, and letting it split would match a static /blog/foo/bar and write ITS title. 114 try { var d = decodeURIComponent(s); return d.indexOf("/") < 0 ? d : s; } catch (e) { return s; } 115 }; 116 var segments = function (path) { return path.split("/").filter(Boolean).map(decode); }; 117 var norm = function (path) { 118 var parts = segments(path).map(function (s) { return dashed(s).toLowerCase(); }); 119 return parts.length ? "/" + parts.join("/") : "/"; 120 }; 121 var lastPath = location.pathname, written = document.title, on = true; 122 var sync = function () { 123 // Path only: a hash/query change is the same page, and the SDK strips its own auth 124 // params with replaceState -- neither must clobber a server-rendered title in place. 125 if (!on || location.pathname === lastPath) return; 126 lastPath = location.pathname; 127 if (document.title !== written) { on = false; return; } 128 // Write ONLY a title the map proves. An unmapped path is a dynamic route (/blog/:slug) the 129 // map cannot carry, and writing a placeholder there is destructive, not merely vague: the 130 // prerender worker runs no setUserAgent, so its capture browser reads as human and executes 131 // this script, and coordinator.js's settle wait explicitly tolerates a full navigation -- 132 // a redirect landing on an unmapped path would bake the placeholder into the stored 133 // snapshot. Leaving the title alone degrades to today's behavior instead. 134 // Exact lookup only. A dash-stripped retry here would let a genuinely different /set-up 135 // claim /setup: the map carries a dash-free key only where a PascalCase boundary put the 136 // dashes there, and the client cannot tell the two apart. The map emits every reachable 137 // shape per segment instead (_client_url_variants). 138 var title = titles[norm(location.pathname)]; 139 if (title === undefined) return; 140 document.title = title; 141 // Re-read: the setter stores verbatim but the getter strips and collapses whitespace, so 142 // keeping the assigned string would make the next sync() read our own write as the app's. 143 written = document.title; 144 }; 145 var wrap = function (fn) { 146 // The history entry is already pushed by the time sync() runs, so a throw here would 147 // surface inside the host app's router and break navigation. This is injected into apps 148 // we cannot test, so it swallows rather than trusting the trace. 149 return function () { 150 var r = fn.apply(this, arguments);
151 try { sync(); } catch (e) {} 152 return r; 153 }; 154 }; 155 history.pushState = wrap(history.pushState); 156 history.replaceState = wrap(history.replaceState); 157 window.addEventListener("popstate", sync); 158})(); 159 </script>
159 160 <meta content="yes" name="mobile-web-app-capable"/> 161 <meta content="black" name="apple-mobile-web-app-status-bar-style"/> 162 <meta content="Mandarin Monkey" name="apple-mobile-web-app-title"/> 163 <link href="https://mandarinmonkey.com" rel="canonical"/> 164
164<script data-seo-source="builder" type="application/ld+json"> 165 {"name": "Mandarin Monkey", "@context": "https://schema.org", "@type": "WebSite", "url": "https://mandarinmonkey.com"} 166 </script>
166 167
167<script data-seo-source="builder" type="application/ld+json"> 168 {"name": "Mandarin Monkey", "logo": "https://qtrypzzcjebvfcihiynt.supabase.co/storage/v1/object/public/base44-prod/public/b1aff9ed1_logo.png", "@context": "https://schema.org", "@type": "Organization", "url": "https://mandarinmonkey.com"} 169 </script>
169 170 </head> 171 <body> 172 <div id="root"> 173 <div data-seo-source="builder" id="seo-snapshot" style="position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0;"> 174 <main> 175 <header> 176 <h1> 177 Mandarin Monkey 178 </h1> 179 <p> 180 Your premier online academy for mastering Mandarin. Connect with expert native teachers for personalized 1-on-1 lessons, from casual conversation to business fluency. Enjoy flexible scheduling, a free trial lesson, and convenient online booking. 181 </p> 182 </header> 183 <nav aria-label="Pages"> 184 <h2> 185 Pages 186 </h2> 187 <ul> 188 <li> 189 <a href="/Teachers"> 190 Teachers 191 </a> 192 â Teachers on Mandarin Monkey. Your premier online academy for mastering Mandarin. 193 </li> 194 <li> 195 <a href="/Hangouts"> 196 Hangouts 197 </a> 198 â Hangouts on Mandarin Monkey. Your premier online academy for mastering Mandarin. 199 </li> 200 <li> 201 <a href="/GroupLessons"> 202 Group Lessons 203 </a> 204 â Group Lessons on Mandarin Monkey. Your premier online academy for mastering Mandarin. 205 </li> 206 <li> 207 <a href="/podcast"> 208 Podcast 209 </a> 210 â Podcast on Mandarin Monkey. Your premier online academy for mastering Mandarin. 211 </li> 212 <li> 213 <a href="/find-my-path"> 214 Find My Path 215 </a> 216 â Find My Path on Mandarin Monkey. Your premier online academy for mastering Mandarin. 217 </li> 218 <li> 219 <a href="/update-name"> 220 Update Name 221 </a> 222 â Update Name on Mandarin Monkey. Your premier online academy for mastering Mandarin. 223 </li> 224 <li> 225 <a href="/learn"> 226 Learn 227 </a> 228 â Learn on Mandarin Monkey. Your premier online academy for mastering Mandarin. 229 </li> 230 <li> 231 <a href="/referral"> 232 Referral Claim 233 </a> 234 â Referral Claim on Mandarin Monkey. Your premier online academy for mastering Mandarin. 235 </li> 236 <li> 237 <a href="/Contact"> 238 Contact 239 </a> 240 â Contact on Mandarin Monkey. Your premier online academy for mastering Mandarin. 241 </li> 242 <li> 243 <a href="/Pricing"> 244 Pricing 245 </a> 246 â Pricing on Mandarin Monkey. Your premier online academy for mastering Mandarin. 247 </li> 248 <li> 249 <a href="/privacy-policy"> 250 Privacy Policy 251 </a> 252 â Privacy Policy on Mandarin Monkey. Your premier online academy for mastering Mandarin. 253 </li> 254 <li> 255 <a href="/terms-of-service"> 256 Terms Of Service 257 </a> 258 â Terms Of Service on Mandarin Monkey. Your premier online academy for mastering Mandarin. 259 </li> 260 <li> 261 <a href="/email-preferences"> 262 Email Preferences 263 </a> 264 â Email Preferences on Mandarin Monkey. Your premier online academy for mastering Mandarin. 265 </li> 266 <li> 267 <a href="/yt"> 268 Vanity Free Lesson Redirect 269 </a> 270 </li> 271 <li> 272 <a href="/dashboard"> 273 Role Redirect 274 </a> 275 â Role Redirect on Mandarin Monkey. Your premier online academy for mastering Mandarin. 276 </li> 277 <li> 278 <a href="/AdminDashboard"> 279 Admin Dashboard 280 </a> 281 â Admin Dashboard on Mandarin Monkey. Your premier online academy for mastering Mandarin. 282 </li> 283 <li> 284 <a href="/TeacherDashboard"> 285 Teacher Dashboard 286 </a> 287 â Teacher Dashboard on Mandarin Monkey. Your premier online academy for mastering Mandarin. 288 </li> 289 <li> 290 <a href="/StudentDashboard"> 291 Student Dashboard 292 </a> 293 â Student Dashboard on Mandarin Monkey. Your premier online academy for mastering Mandarin. 294 </li> 295 <li> 296 <a href="/ProgressTracker"> 297 Progress Tracker 298 </a> 299 â Progress Tracker on Mandarin Monkey. Your premier online academy for mastering Mandarin. 300 </li> 301 <li> 302 <a href="/BookLesson"> 303 Book Lesson 304 </a> 305 â Book Lesson on Mandarin Monkey. Your premier online academy for mastering Mandarin. 306 </li> 307 <li> 308 <a href="/ChallengeWall"> 309 Challenge Wall 310 </a> 311 â Challenge Wall on Mandarin Monkey. Your premier online academy for mastering Mandarin. 312 </li> 313 <li> 314 <a href="/oauth/google-calendar-complete"> 315 O Auth Google Calendar Complete 316 </a> 317 â O Auth Google Calendar Complete on Mandarin Monkey. Your premier online academy for mastering Mandarin. 318 </li> 319 </ul> 320 </nav> 321 </main> 322 </div> 323 </div> 324 </body> 325</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.