1<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" href="/_next/static/media/e4af272ccee01ff0-s.p.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="stylesheet" href="/_next/static/css/25559e6006b75667.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-520348485c6dee32.js"/>
1<script src="/_next/static/chunks/4bd1b696-22b78220ee4efc9a.js" async=""></script>
1<script src="/_next/static/chunks/684-6c7cbfc9f66761c8.js" async=""></script>
1<script src="/_next/static/chunks/main-app-03caa1dfe3138e77.js" async=""></script>
1<script src="/_next/static/chunks/96-da43806ca2d32575.js" async=""></script>
1<script src="/_next/static/chunks/app/layout-6be709a51d5803dd.js" async=""></script>
1<script src="/_next/static/chunks/874-b958fa7b8a752553.js" async=""></script>
1<script src="/_next/static/chunks/app/%5Bslug%5D/page-83ca68faa02136ea.js" async=""></script>
1<meta name="next-size-adjust" content=""/><link rel="preload" as="image" href="/dino-sprite.png"/>
1<script>(function(){var p=location.pathname;if(p==='/'||p===''){document.documentElement.style.overflowY='hidden';}})();</script>
1<title>Doris Lam</title><meta name="description" content="Software engineer building accessible and impactful solutions"/><link rel="icon" href="/icon.png"/>
1<script>document.querySelectorAll('body link[rel="icon"], body link[rel="apple-touch-icon"]').forEach(el => document.head.appendChild(el))</script>
1<script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script>
1</head><body class="__variable_f367f3 antialiased"><div hidden=""><!--$--><!--/$--></div>
1<script>((e,t,r,n,i,o,a,s)=>{let u=document.documentElement,l=["light","dark"];function c(t){var r;(Array.isArray(e)?e:[e]).forEach(e=>{let r="class"===e,n=r&&o?i.map(e=>o[e]||e):i;r?(u.classList.remove(...n),u.classList.add(o&&o[t]?o[t]:t)):u.setAttribute(e,t)}),r=t,s&&l.includes(r)&&(u.style.colorScheme=r)}if(n)c(n);else try{let e=localStorage.getItem(t)||r,n=a&&"system"===e?window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light":e;c(n)}catch(e){}})("class","theme","system",null,["light","dark"],null,true,true)</script>
1<div class="min-h-screen bg-[#f7f4ee] text-stone-900 dark:bg-stone-950 dark:text-stone-100 transition-colors duration-300"><div class="flex flex-col min-h-screen"><div class="w-full px-6 sm:px-8 md:px-12 pt-10 md:pt-14"><div class="w-full max-w-5xl mx-auto flex justify-end"><div class="flex items-center gap-2" role="group" aria-label="Colour theme"><button aria-label="Light mode" aria-pressed="false" class="text-[13px] leading-none transition-colors text-stone-400 dark:text-stone-600 hover:text-stone-700 dark:hover:text-stone-300">æ¥</button><span class="text-[13px] leading-none text-stone-300 dark:text-stone-700">/</span><button aria-label="Dark mode" aria-pressed="false" class="text-[13px] leading-none transition-colors text-stone-400 dark:text-stone-600 hover:text-stone-700 dark:hover:text-stone-300">æ</button></div></div></div><div class="flex-1 pt-6 md:pt-8"><div style="opacity:0;transform:translateY(8px)"><main class="w-full px-6 sm:px-8 md:px-12 pt-8 md:pt-12 pb-12"><div class="w-full max-w-3xl mx-auto space-y-6"><a class="inline-flex items-center gap-2 text-[11px] uppercase tracking-[0.2em] text-stone-500 dark:text-stone-500 hover:text-stone-900 dark:hover:text-stone-100 transition-colors" href="/"><span>â</span><span>back home</span></a><div><div class="relative flex items-center justify-center mb-8"><div class="w-full aspect-video max-w-4xl"><iframe src="https://www.youtube.com/embed/s_eNUOBTzi8" title="AI Coding Mentor" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowFullScreen="" class="w-full h-full rounded-md"></iframe></div></div><div class="space-y-6"><div class="flex items-start justify-between gap-3 sm:gap-4"><div><h2 class="font-sans text-3xl sm:text-4xl md:text-5xl text-stone-900 dark:text-stone-100 tracking-tight leading-[1.05]">AI Coding Mentor</h2><p class="text-[10px] sm:text-[11px] text-stone-500 dark:text-stone-500 mt-2 uppercase tracking-[0.18em]">NOVEMBER 2025 - JANUARY 2026<!-- --> · <!-- -->completed</p></div><div class="flex gap-1 flex-shrink-0"><a href="https://youtu.be/s_eNUOBTzi8" target="_blank" rel="noopener noreferrer" class="p-1.5 rounded-md text-stone-500 dark:text-stone-500 hover:text-stone-900 dark:hover:text-stone-100 hover:bg-stone-100 dark:hover:bg-stone-800/50 transition-colors" aria-label="View Project"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-external-link h-4 w-4" aria-hidden="true"><path d="M15 3h6v6"></path><path d="M10 14 21 3"></path><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path></svg></a><a href="https://github.com/Doris-Lam/My-AI-Mentor" target="_blank" rel="noopener noreferrer" class="p-1.5 rounded-md text-stone-500 dark:text-stone-500 hover:text-stone-900 dark:hover:text-stone-100 hover:bg-stone-100 dark:hover:bg-stone-800/50 transition-colors" aria-label="View on GitHub"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-github h-4 w-4" aria-hidden="true"><path d="M15 22v-4a4.8 4.8 0 0 0-1-3.5c3 0 6-2 6-5.5.08-1.25-.27-2.48-1-3.5.28-1.15.28-2.35 0-3.5 0 0-1 0-3 1.5-2.64-.5-5.36-.5-8 0C6 2 5 2 5 2c-.3 1.15-.3 2.35 0 3.5A5.403 5.403 0 0 0 4 9c0 3.5 3 5.5 6 5.5-.39.49-.68 1.05-.85 1.65-.17.6-.22 1.23-.15 1.85v4"></path><path d="M9 18c-4.51 2-5-2-7-2"></path></svg></a></div></div><div class="prose prose-stone dark:prose-invert max-w-none">
1<p class="text-sm md:text-base text-stone-600 dark:text-stone-400 leading-relaxed mb-4">Grammarly, but for code. I liked how Grammarly explains why something is wrong instead of just silently fixing it, and wanted to bring that idea to programming.</p><p class="text-sm md:text-base text-stone-600 dark:text-stone-400 leading-relaxed mb-4">It analyzes your code as you type and color-codes issues inline: red for errors, yellow for warnings, and blue for suggestions. Clicking on one shows you why itâs wrong and how to fix it. Code runs in a sandbox across nine languages.</p><p class="text-sm md:text-base text-stone-600 dark:text-stone-400 leading-relaxed mb-4">Frontend with React and Monaco, with FastAPI and Gemini on the backend and Postgres for storing history. The hardest part was keeping the AI analysis running constantly without making the editor feel slow or laggy.</p></div><div class="border-t border-stone-200 dark:border-stone-800 pt-6 mt-8"><h3 class="text-[11px] uppercase tracking-[0.22em] text-stone-500 dark:text-stone-500 mb-4 flex items-baseline gap-3"><span>technologies</span></h3><div class="flex flex-wrap gap-x-3 gap-y-1 text-[11px] uppercase tracking-[0.16em] text-stone-500 dark:text-stone-500"><span>React</span><span>TypeScript</span><span>Monaco Editor</span><span>FastAPI</span><span>Python</span><span>Google Gemini AI</span><span>PostgreSQL</span><span>Recharts</span></div></div></div></div></div></main><!--$--><!--/$--></div></div><footer class="w-full py-6"><div class="w-full max-w-5xl mx-auto px-6 sm:px-8 md:px-12 flex items-center justify-between text-xs text-stone-500 dark:text-stone-500"></div></footer><div aria-hidden="true" class="relative w-full select-none pointer-events-none transition-opacity duration-500 opacity-0" style="height:190px"><canvas class="block w-full dark:invert" style="height:190px;image-rendering:pixelated"></canvas></div></div></div>
1<script src="/_next/static/chunks/webpack-520348485c6dee32.js" async=""></script>
1<script>(self.__next_f=self.__next_f||[]).push([0])</script>
1<script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[1362,[\"96\",\"static/chunks/96-da43806ca2d32575.js\",\"177\",\"static/chunks/app/layout-6be709a51d5803dd.js\"],\"ThemeProvider\"]\n3:I[7971,[\"96\",\"static/chunks/96-da43806ca2d32575.js\",\"177\",\"static/chunks/app/layout-6be709a51d5803dd.js\"],\"ThemeToggle\"]\n4:I[5818,[\"96\",\"static/chunks/96-da43806ca2d32575.js\",\"177\",\"static/chunks/app/layout-6be709a51d5803dd.js\"],\"PageTransition\"]\n5:I[7555,[],\"\"]\n6:I[1295,[],\"\"]\n7:I[1674,[\"96\",\"static/chunks/96-da43806ca2d32575.js\",\"177\",\"static/chunks/app/layout-6be709a51d5803dd.js\"],\"DinoGame\"]\n8:I[7747,[\"96\",\"static/chunks/96-da43806ca2d32575.js\",\"177\",\"static/chunks/app/layout-6be709a51d5803dd.js\"],\"ClickSound\"]\na:I[9665,[],\"OutletBoundary\"]\nd:I[4911,[],\"AsyncMetadataOutlet\"]\nf:I[9665,[],\"ViewportBoundary\"]\n11:I[9665,[],\"MetadataBoundary\"]\n13:I[6614,[],\"\"]\n:HL[\"/_next/static/media/e4af272ccee01ff0-s.p.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/css/25559e6006b75667.css\",\"style\"]\n"])</script>
1<script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"SRf1-p_0YRobtiNQarUBe\",\"p\":\"\",\"c\":[\"\",\"ai-coding-mentor\",\"\"],\"i\":false,\"f\":[[[\"\",{\"children\":[[\"slug\",\"ai-coding-mentor\",\"d\"],{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],[\"\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/25559e6006b75667.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"suppressHydrationWarning\":true,\"children\":[[\"$\",\"head\",null,{\"children\":[[\"$\",\"link\",null,{\"rel\":\"preload\",\"as\":\"image\",\"href\":\"/dino-sprite.png\"}],[\"$\",\"script\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"(function(){var p=location.pathname;if(p==='/'||p===''){document.documentElement.style.overflowY='hidden';}})();\"}}]]}],[\"$\",\"body\",null,{\"className\":\"__variable_f367f3 antialiased\",\"suppressHydrationWarning\":true,\"children\":[\"$\",\"$L2\",null,{\"attribute\":\"class\",\"defaultTheme\":\"system\",\"enableSystem\":true,\"children\":[\"$\",\"div\",null,{\"className\":\"min-h-screen bg-[#f7f4ee] text-stone-900 dark:bg-stone-950 dark:text-stone-100 transition-colors duration-300\",\"children\":[\"$\",\"div\",null,{\"className\":\"flex flex-col min-h-screen\",\"children\":[[\"$\",\"div\",null,{\"className\":\"w-full px-6 sm:px-8 md:px-12 pt-10 md:pt-14\",\"children\":[\"$\",\"div\",null,{\"className\":\"w-full max-w-5xl mx-auto flex justify-end\",\"children\":[\"$\",\"$L3\",null,{}]}]}],[\"$\",\"div\",null,{\"className\":\"flex-1 pt-6 md:pt-8\",\"children\":[\"$\",\"$L4\",null,{\"children\":[\"$\",\"$L5\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L6\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]}],[\"$\",\"footer\",null,{\"className\":\"w-full py-6\",\"children\":[\"$\",\"div\",null,{\"className\":\"w-full max-w-5xl mx-auto px-6 sm:px-8 md:px-12 flex items-center justify-between text-xs text-stone-500 dark:text-stone-500\"}]}],[\"$\",\"$L7\",null,{}],[\"$\",\"$L8\",null,{}]]}]}]}]}]]}]]}],{\"children\":[[\"slug\",\"ai-coding-mentor\",\"d\"],[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L5\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L6\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[\"__PAGE__\",[\"$\",\"$1\",\"c\",{\"children\":[\"$L9\",null,[\"$\",\"$La\",null,{\"children\":[\"$Lb\",\"$Lc\",[\"$\",\"$Ld\",null,{\"promise\":\"$@e\"}]]}]]}],{}
1,null,false]},null,false]},null,false],[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$1\",\"G-aY6C76HAW14AGMpjBuvv\",{\"children\":[[\"$\",\"$Lf\",null,{\"children\":\"$L10\"}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}],[\"$\",\"$L11\",null,{\"children\":\"$L12\"}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$13\",\"$undefined\"],\"s\":false,\"S\":true}\n"])</script>
1<script>self.__next_f.push([1,"14:\"$Sreact.suspense\"\n15:I[4911,[],\"AsyncMetadata\"]\n17:I[6874,[\"874\",\"static/chunks/874-b958fa7b8a752553.js\",\"182\",\"static/chunks/app/%5Bslug%5D/page-83ca68faa02136ea.js\"],\"\"]\n12:[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$14\",null,{\"fallback\":null,\"children\":[\"$\",\"$L15\",null,{\"promise\":\"$@16\"}]}]}]\n"])</script>
1<script>self.__next_f.push([1,"9:[\"$\",\"main\",null,{\"className\":\"w-full px-6 sm:px-8 md:px-12 pt-8 md:pt-12 pb-12\",\"children\":[\"$\",\"div\",null,{\"className\":\"w-full max-w-3xl mx-auto space-y-6\",\"children\":[[\"$\",\"$L17\",null,{\"href\":\"/\",\"className\":\"inline-flex items-center gap-2 text-[11px] uppercase tracking-[0.2em] text-stone-500 dark:text-stone-500 hover:text-stone-900 dark:hover:text-stone-100 transition-colors\",\"children\":[[\"$\",\"span\",null,{\"children\":\"â\"}],[\"$\",\"span\",null,{\"children\":\"back home\"}]]}],[\"$\",\"div\",null,{\"children\":[[\"$\",\"div\",null,{\"className\":\"relative flex items-center justify-center mb-8\",\"children\":[\"$\",\"div\",null,{\"className\":\"w-full aspect-video max-w-4xl\",\"children\":[\"$\",\"iframe\",null,{\"src\":\"https://www.youtube.com/embed/s_eNUOBTzi8\",\"title\":\"AI Coding Mentor\",\"allow\":\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\",\"allowFullScreen\":true,\"className\":\"w-full h-full rounded-md\"}]}]}],[\"$\",\"div\",null,{\"className\":\"space-y-6\",\"children\":[[\"$\",\"div\",null,{\"className\":\"flex items-start justify-between gap-3 sm:gap-4\",\"children\":[[\"$\",\"div\",null,{\"children\":[[\"$\",\"h2\",null,{\"className\":\"font-sans text-3xl sm:text-4xl md:text-5xl text-stone-900 dark:text-stone-100 tracking-tight leading-[1.05]\",\"children\":\"AI Coding Mentor\"}],[\"$\",\"p\",null,{\"className\":\"text-[10px] sm:text-[11px] text-stone-500 dark:text-stone-500 mt-2 uppercase tracking-[0.18em]\",\"children\":[\"NOVEMBER 2025 - JANUARY 2026\",\" · \",\"completed\"]}]]}],[\"$\",\"div\",null,{\"className\":\"flex gap-1 flex-shrink-0\",\"children\":[[\"$\",\"a\",null,{\"href\":\"https://youtu.be/s_eNUOBTzi8\",\"target\":\"_blank\",\"rel\":\"noopener noreferrer\",\"className\":\"p-1.5 rounded-md text-stone-500 dark:text-stone-500 hover:text-stone-900 dark:hover:text-stone-100 hover:bg-stone-100 dark:hover:bg-stone-800/50 transition-colors\",\"aria-label\":\"View Project\",\"children\":[\"$\",\"svg\",null,{\"ref\":\"$undefined\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":24,\"height\":24,\"viewBox\":\"0 0 24 24\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"strokeWidth\":2,\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"className\":\"lucide lucide-external-link h-4 w-4\",\"aria-hidden\":\"true\",\"children\":[[\"$\",\"path\",\"1q9fwt\",{\"d\":\"M15 3h6v6\"}],[\"$\",\"path\",\"gplh6r\",{\"d\":\"M10 14 21 3\"}],[\"$\",\"path\",\"a6xqqp\",{\"d\":\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"}],\"$undefined\"]}]}],[\"$\",\"a\",null,{\"href\":\"https://github.com/Doris-Lam/My-AI-Mentor\",\"target\":\"_blank\",\"rel\":\"noopener noreferrer\",\"className\":\"p-1.5 rounded-md text-stone-500 dark:text-stone-500 hover:text-stone-900 dark:hover:text-stone-100 hover:bg-stone-100 dark:hover:bg-stone-800/50 transition-colors\",\"aria-label\":\"View on GitHub\",\"children\":[\"$\",\"svg\",null,{\"ref\":\"$undefined\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":24,\"height\":24,\"viewBox\":\"0 0 24 24\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"strokeWidth\":2,\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"className\":\"lucide lucide-github h-4 w-4\",\"aria-hidden\":\"true\",\"children\":[[\"$\",\"path\",\"tonef\",{\"d\":\"M15 22v-4a4.8 4.8 0 0 0-1-3.5c3 0 6-2 6-5.5.08-1.25-.27-2.48-1-3.5.28-1.15.28-2.35 0-3.5 0 0-1 0-3 1.5-2.64-.5-5.36-.5-8 0C6 2 5 2 5 2c-.3 1.15-.3 2.35 0 3.5A5.403 5.403 0 0 0 4 9c0 3.5 3 5.5 6 5.5-.39.49-.68 1.05-.85 1.65-.17.6-.22 1.23-.15 1.85v4\"}],[\"$\",\"path\",\"9comsn\",{\"d\":\"M9 18c-4.51 2-5-2-7-2\"}],\"$undefined\"]}]}]]}]]}],[\"$\",\"div\",null,{\"className\":\"prose prose-stone dark:prose-invert max-w-none\",\"children\":[[\"$\",\"p\",\"0\",{\"className\":\"text-sm md:text-base text-stone-600 dar
1k:text-stone-400 leading-relaxed mb-4\",\"children\":[\"Grammarly, but for code. I liked how Grammarly explains why something is wrong instead of just silently fixing it, and wanted to bring that idea to programming.\"]}],[\"$\",\"p\",\"1\",{\"className\":\"text-sm md:text-base text-stone-600 dark:text-stone-400 leading-relaxed mb-4\",\"children\":[\"It analyzes your code as you type and color-codes issues inline: red for errors, yellow for warnings, and blue for suggestions. Clicking on one shows you why itâs wrong and how to fix it. Code runs in a sandbox across nine languages.\"]}],[\"$\",\"p\",\"2\",{\"className\":\"text-sm md:text-base text-stone-600 dark:text-stone-400 leading-relaxed mb-4\",\"children\":[\"Frontend with React and Monaco, with FastAPI and Gemini on the backend and Postgres for storing history. The hardest part was keeping the AI analysis running constantly without making the editor feel slow or laggy.\"]}]]}],[\"$\",\"div\",null,{\"className\":\"border-t border-stone-200 dark:border-stone-800 pt-6 mt-8\",\"children\":[[\"$\",\"h3\",null,{\"className\":\"text-[11px] uppercase tracking-[0.22em] text-stone-500 dark:text-stone-500 mb-4 flex items-baseline gap-3\",\"children\":[\"$\",\"span\",null,{\"children\":\"technologies\"}]}],[\"$\",\"div\",null,{\"className\":\"flex flex-wrap gap-x-3 gap-y-1 text-[11px] uppercase tracking-[0.16em] text-stone-500 dark:text-stone-500\",\"children\":[[\"$\",\"span\",\"0\",{\"children\":\"React\"}],[\"$\",\"span\",\"1\",{\"children\":\"TypeScript\"}],[\"$\",\"span\",\"2\",{\"children\":\"Monaco Editor\"}],[\"$\",\"span\",\"3\",{\"children\":\"FastAPI\"}],[\"$\",\"span\",\"4\",{\"children\":\"Python\"}],[\"$\",\"span\",\"5\",{\"children\":\"Google Gemini AI\"}],[\"$\",\"span\",\"6\",{\"children\":\"PostgreSQL\"}],[\"$\",\"span\",\"7\",{\"children\":\"Recharts\"}]]}]]}]]}]]}]]}]}]\n"])</script>
1<script>self.__next_f.push([1,"c:null\n"])</script>
1<script>self.__next_f.push([1,"10:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\nb:null\n"])</script>
1<script>self.__next_f.push([1,"e:{\"metadata\":[[\"$\",\"title\",\"0\",{\"children\":\"Doris Lam\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Software engineer building accessible and impactful solutions\"}],[\"$\",\"link\",\"2\",{\"rel\":\"icon\",\"href\":\"/icon.png\"}]],\"error\":null,\"digest\":\"$undefined\"}\n16:{\"metadata\":\"$e:metadata\",\"error\":null,\"digest\":\"$undefined\"}\n"])</script>
1</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.