1<!doctype html> 2<html lang="en"> 3 <head> 4 <meta charset="UTF-8" /> 5
5<script> 6 if (window.location.protocol === 'http:' && window.location.hostname !== 'localhost' && window.location.hostname !== '127.0.0.1') { 7 window.location.replace('https://' + window.location.host + window.location.pathname + window.location.search + window.location.hash); 8 } 9 </script>
9 10 <meta name="viewport" content="width=device-width, initial-scale=1.0" /> 11 <title>BasitQ | AI Solutions Architect â Voice Agents, n8n Workflow Systems & Custom Nodes</title> 12 <!-- 13 data-rh="true" marks these as react-helmet-async-owned. Without it Helmet 14 treats them as foreign markup and *appends* its own copies instead of 15 replacing them, so every route shipped two <meta name="description">, two 16 og:title, etc. They stay in the static HTML because social crawlers 17 (LinkedIn, Slack, Twitter) do not execute JS and would otherwise see none. 18 Every tag below is also emitted by src/components/SEO.tsx â if you add one 19 here that SEO.tsx does not emit, Helmet will DELETE it on mount. 20 --> 21 <meta data-rh="true" name="description" content="AI solutions architect building voice agents, production workflow systems, custom n8n nodes, and the platforms underneath them. One person, the whole path."> 22 <meta name="author" content="BasitQ" /> 23 <link rel="icon" type="image/x-icon" href="/favicon.ico" /> 24 <link rel="icon" type="image/png" sizes="32x32" href="/favicon.png" /> 25 <link rel="apple-touch-icon" sizes="180x180" href="/favicon.png" /> 26 <meta name="google-site-verification" content="mCw0l2sH5q86V5Wcv4Ck1Ku7AOYUWAcOCjuNKwUuTJQ" /> 27 28 <!-- #EFEBE3 is --tm-bg. Without this, mobile Chrome and Safari paint their 29 own chrome and the pre-paint canvas white, which flashes against the 30 cream page on every navigation. --> 31 <meta name="theme-color" content="#EFEBE3" /> 32 33 <meta data-rh="true" property="og:type" content="website" /> 34 <meta data-rh="true" property="og:url" content="https://basitq.cloud/" /> 35 <meta data-rh="true" property="og:title" content="BasitQ | AI Solutions Architect â Voice Agents, n8n Workflow Systems & Custom Nodes"> 36 <meta data-rh="true" property="og:description" content="AI solutions architect building voice agents, production workflow systems, custom n8n nodes, and the platforms underneath them. One person, the whole path."> 37 <meta data-rh="true" property="og:image" content="https://basitq.cloud/og/default.png"> 38 39 <!-- twitter:site removed â it read "@Lovable", attributing every share of 40 this site to the platform vendor. Restore it only with Basit's handle. --> 41 <meta data-rh="true" name="twitter:card" content="summary_large_image" /> 42 <meta data-rh="true" name="twitter:title" content="BasitQ | AI Solutions Architect â Voice Agents, n8n Workflow Systems & Custom Nodes"> 43 <meta data-rh="true" name="twitter:description" content="AI solutions architect building voice agents, production workflow systems, custom n8n nodes, and the platforms underneath them. One person, the whole path."> 44 <meta data-rh="true" name="twitter:image" content="https://basitq.cloud/og/default.png"> 45 46 <!-- 47 Fallback entity for crawlers that never run JS. src/pages/Index.tsx emits a 48 richer linked graph at runtime using the SAME @id, so the two merge rather 49 than competing. `name` must stay "Basit Qureshi" in both places and in 50 ContentPage's Article author â three spellings would split the entity. 51 --> 52
52<script type="application/ld+json"> 53 {"@context":"https://schema.org","@type":"Person","@id":"https://basitq.cloud/#basit","name":"Basit Qureshi","alternateName":"BasitQ","url":"https://basitq.cloud/","jobTitle":"AI Solutions Architect","email":"mailto:[email protected]","sameAs":["https://community.n8n.io/u/zynate/summary","https://github.com/qureshi-basit","https://www.youtube.com/@Millionaze"]} 54 </script>
54 55 56 <!-- 57 The <n8n-demo> web component scripts used to load here. They are now 58 injected on demand by src/lib/n8nDemoLoader.ts, because only 59 /workflows/:slug renders a canvas â every other route was paying for two 60 CDN handshakes and a ~200 kB module parse in the critical path for 61 nothing. Do not move them back into <head>. 62 63 preconnect keeps the win without the cost: it warms the jsdelivr socket 64 during idle time so the on-demand fetch is not starting from cold DNS. 65 --> 66 <link rel="preconnect" href="https://cdn.jsdelivr.net" crossorigin /> 67 68 <!-- 69 Fonts live here, not in src/index.css. The @import there sat below the 70 @tailwind directives; CSS requires @import to precede every other 71 statement, so Vite warned and then dropped it from the production bundle â 72 Inter, Inter Tight and JetBrains Mono never loaded on the live site even 73 though tailwind.config.ts and the terminal theme both ask for them. 74 75 A <link> in <head> is also faster than an @import: the preload scanner 76 sees it immediately, instead of waiting for the stylesheet to parse before 77 it can even discover the font request. 78 79 Loaded async, not render-blocking. Measured against the live site this 80 stylesheet was the slowest request on every route and every run â 456-629 ms, 81 warm or cold â and a plain <link rel="stylesheet"> to a third-party origin 82 holds up first paint for its full duration. The media="print" / onload swap 83 is the standard workaround: the browser still fetches it, but does not treat 84 it as blocking, then onload flips it to media="all" and it applies. 85 <noscript> covers the no-JS case, including crawlers. 86 87 display=swap was already here and still matters â it is what lets text paint 88 in system-ui and swap to Inter rather than sitting invisible. The tradeoff of 89 going async is that the swap is more visible on a cold cache. That is 90 deliberate: a brief font swap beats a blank screen. 91 92 Weights are trimmed to what the codebase actually renders. Inter 300/800/900 93 were being requested but nothing uses font-light, font-extrabold or 94 font-black â the only weight classes anywhere in src are normal(400), 95 medium(500), semibold(600) and bold(700). JetBrains Mono stays at 400/500/600: 96 two call sites pair font-mono with font-bold and get a synthesized bold, which 97 is the existing behaviour and not worth a fourth weight file to fix. 98 --> 99 <link rel="preconnect" href="https://fonts.googleapis.com" /> 100 <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin /> 101 <link 102 rel="stylesheet" 103 href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Inter+Tight:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500;600&display=swap" 104 media="print" 105 onload="this.media='all'; this.onload=null;" 106 /> 107 <noscript> 108 <link 109 rel="stylesheet" 110 href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Inter+Tight:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500;600&display=swap" 111 /> 112 </noscript> 113
113<script type="module" crossorigin src="/assets/index-VVKdn61F.js"></script>
113 114 <link rel="modulepreload" crossorigin href="/assets/vendor-react-BR_v4Ont.js"> 115 <link rel="modulepreload" crossorigin href="/assets/vendor-motion-CfBPC-kS.js"> 116 <link rel="modulepreload" crossorigin href="/assets/vendor-supabase-BSd6ADfF.js"> 117 <link rel="stylesheet" crossorigin href="/assets/index-DP2s4ozp.css">
118<script defer src="/~flock.js" data-proxy-url="/~api/analytics"></script>
118</head> 119 120 <body> 121 <div id="root"></div> 122 </body> 123</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.