1<!DOCTYPE html><html lang="en" class="no-js" data-astro-cid-ju4pidww><head><meta name="astro-view-transitions-enabled" content="true"><meta name="astro-view-transitions-fallback" content="animate">
1<script type="module" src="/_astro/ClientRouter.astro_astro_type_script_index_0_lang.XvdBj9Ef.js"></script>
1<meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><!-- Theme init: applies before paint to avoid a flash of the wrong theme. 2 Runs on first load, on every View Transition swap, and on OS theme change. -->
2<script> 3 (() => { 4 const STORAGE_KEY = "theme"; 5 const applyTheme = () => { 6 const stored = localStorage.getItem(STORAGE_KEY); 7 const prefersDark = window.matchMedia( 8 "(prefers-color-scheme: dark)", 9 ).matches; 10 // Default (no stored choice) is light; only follow the OS when the 11 // visitor has explicitly picked "system". 12 const isDark = 13 stored === "dark" || (stored === "system" && prefersDark); 14 document.documentElement.classList.toggle("dark", isDark); 15 document 16 .querySelector('meta[name="theme-color"]') 17 ?.setAttribute("content", isDark ? "#0a0a0a" : "#ffffff"); 18 }; 19 applyTheme(); 20 // Re-apply after Astro swaps the DOM on client-side navigation. 21 document.addEventListener("astro:after-swap", applyTheme); 22 // Live-update while following the OS (no explicit preference stored). 23 window 24 .matchMedia("(prefers-color-scheme: dark)") 25 .addEventListener("change", () => { 26 if (localStorage.getItem(STORAGE_KEY) === "system") applyTheme(); 27 }); 28 })(); 29 </script>
29<link rel="icon" type="image/svg+xml" href="/favicon.svg"><link rel="alternate icon" type="image/png" href="/favicon.ico"><meta name="generator" content="Astro v7.0.6"><title>Contact Kishan Kumar | Product Engineer</title><meta name="description" content="Contact Kishan Kumar to discuss AI agent systems, developer tools, native apps, or full-stack product engineering."><link rel="canonical" href="https://www.kishans.in/contact/"><!-- Open Graph / Facebook --><meta property="og:type" content="website"><meta property="og:url" content="https://www.kishans.in/contact/"><meta property="og:title" content="Contact Kishan Kumar | Product Engineer"><meta property="og:description" content="Contact Kishan Kumar to discuss AI agent systems, developer tools, native apps, or full-stack product engineering."><meta property="og:image" content="https://www.kishans.in/assets/kishans-og-banner.png"><meta property="og:site_name" content="Kishan Kumar - Product Engineer"><!-- Twitter --><meta name="twitter:card" content="summary_large_image"><meta name="twitter:url" content="https://www.kishans.in/contact/"><meta name="twitter:title" content="Contact Kishan Kumar | Product Engineer"><meta name="twitter:description" content="Contact Kishan Kumar to discuss AI agent systems, developer tools, native apps, or full-stack product engineering."><meta name="twitter:image" content="https://www.kishans.in/assets/kishans-og-banner.png"><meta name="twitter:creator" content="@jst_kishan"><!-- Additional SEO tags --><meta name="author" content="Kishan Kumar"><meta name="robots" content="index, follow"><meta name="keywords" content="product engineer, AI agents, AI tools, web development, native macOS apps, performance optimization, Plivo"><!-- Theme Color --><meta name="theme-color" content="#ffffff">
29<script type="module">document.documentElement.classList.remove(`no-js`);</script>
29<link rel="stylesheet" href="/_astro/global.B9Cu81FO.css"><style>.astro-route-announcer{clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap;width:1px;height:1px;position:absolute;top:0;left:0;overflow:hidden}html.dark{background-color:hsl(var(--background));color:hsl(var(--foreground))}html{scroll-behavior:smooth}html.no-js #homepage[data-astro-cid-ju4pidww]{opacity:1!important} 30</style>
30<script type="module" src="/_astro/page.BNgT0lHs.js"></script>
30<script>window.va = window.va || function () { (window.vaq = window.vaq || []).push(arguments); }; 31 var script = document.createElement('script'); 32 script.defer = true; 33 script.src = '/_vercel/insights/script.js'; 34 var head = document.querySelector('head'); 35 head.appendChild(script); 36 </script>
36</head><body data-astro-cid-ju4pidww><nav class="flex flex-col sm:flex-row justify-between items-center container my-8 sm:my-12"><a href="/" class="font-semibold mb-4 sm:mb-0 font-mono">KK</a><div class="flex gap-4 sm:gap-5 text-sm font-semibold font-mono"><a data-astro-prefetch="viewport" href="/#projects">Projects</a><a data-astro-prefetch="viewport" href="/blogs">Writings</a><a data-astro-prefetch="viewport" href="/contact">Contact</a></div></nav><div class="mb-12 sm:mb-20 min-h-screen"><div class="container mb-8 sm:mb-12"><h1 class="text-3xl sm:text-4xl font-bold text-foreground">Contact</h1><p class="text-lg sm:text-xl text-foreground/80 mt-3">Book a slot with me to discuss your project or just to say hi.</p></div><div class="min-h-[570px]"><!-- Cal inline embed code begins --><div style="width:100%;height:570px;overflow:scroll" id="my-cal-inline"></div>
36<script> 37 (function () { 38 var themeObserver; 39 40 // Mirror the site theme (the .dark class on <html>) rather than the OS, 41 // so the widget follows the in-app switcher, not just prefers-color-scheme. 42 function currentTheme() { 43 return document.documentElement.classList.contains("dark") 44 ? "dark" 45 : "light"; 46 } 47 48 function applyCalTheme() { 49 if (!window.Cal || !Cal.ns || !Cal.ns["15min"]) return; 50 var theme = currentTheme(); 51 Cal.ns["15min"]("ui", { 52 theme: theme, 53 styles: { 54 branding: { brandColor: theme === "dark" ? "#ffffff" : "#000000" }, 55 }, 56 hideEventTypeDetails: false, 57 layout: "month_view", 58 }); 59 } 60 61 function initCal() { 62 var container = document.getElementById("my-cal-inline"); 63 if (!container) return; 64 65 window.Cal = undefined; 66 var scripts = document.querySelectorAll( 67 'script[src*="cal.com/embed/embed.js"]' 68 ); 69 for (var i = 0; i < scripts.length; i++) { 70 scripts[i].remove(); 71 } 72 73 (function (C, A, L) { 74 var p = function (a, ar) { 75 a.q.push(ar); 76 }; 77 var d = C.document; 78 C.Cal = 79 C.Cal || 80 function () { 81 var cal = C.Cal; 82 var ar = arguments; 83 if (!cal.loaded) { 84 cal.ns = {}; 85 cal.q = cal.q || []; 86 d.head.appendChild(d.createElement("script")).src = A; 87 cal.loaded = true; 88 } 89 if (ar[0] === L) { 90 function api() { 91 p(api, arguments); 92 } 93 var namespace = ar[1]; 94 api.q = api.q || []; 95 if (typeof namespace === "string") { 96 cal.ns[namespace] = cal.ns[namespace] || api; 97 p(cal.ns[namespace], ar); 98 p(cal, ["initNamespace", namespace]); 99 } else p(cal, ar); 100 return; 101 } 102 p(cal, ar); 103 }; 104 })(window, "https://app.cal.com/embed/embed.js", "init"); 105 106 var theme = currentTheme(); 107 Cal("init", "15min", { origin: "https://cal.com" }); 108 Cal.ns["15min"]("inline", { 109 elementOrSelector: "#my-cal-inline", 110 config: { layout: "month_view", theme: theme }, 111 calLink: "jst-kishan/15min", 112 }); 113 applyCalTheme(); 114 115 // Re-theme the widget whenever the site theme toggles. 116 if (themeObserver) themeObserver.disconnect(); 117 themeObserver = new MutationObserver(applyCalTheme); 118 themeObserver.observe(document.documentElement, { 119 attributes: true, 120 attributeFilter: ["class"], 121 }); 122 } 123 124 document.addEventListener("astro:page-load", initCal); 125 })(); 126</script>
126<!-- Cal inline embed code ends --></div><div class="container"><p class="text-lg sm:text-xl text-foreground/80">Or, you can reach me using one of these.</p><div class="grid grid-cols-1 sm:grid-cols-2 my-6 sm:my-8 gap-4 sm:gap-6"><a href="mailto:[email protected][email protected]&subject=Hey%20Kishan%2C%20we%20have%20some%20exciting%20opportunity%20for%20you" class="text-base sm:text-lg text-foreground/80"><div><h2 class="text-xl sm:text-2xl font-bold text-foreground">Email</h2>[email protected]</div></a><a href="https://twitter.com/jst_kishan" target="_blank"><div><h2 class="text-xl sm:text-2xl font-bold text-foreground">Twitter</h2><p class="text-foreground/80">@jst_kishan</p></div></a><a href="https://github.com/kishanhitk" target="_blank"><div><h2 class="text-xl sm:text-2xl font-bold text-foreground">Github</h2><p class="text-foreground/80">git/kishanhitk</p></div></a><a href="https://www.linkedin.com/in/kishanju/" target="_blank"><div><h2 class="text-xl sm:text-2xl font-bold text-foreground">LinkedIn</h2><p class="text-foreground/80">in/kishanju</p></div></a></div></div></div><footer class="container my-5 text-sm text-muted-foreground"><div class="flex flex-col gap-3 border-t border-border/60 py-5 sm:flex-row sm:items-center sm:justify-between"><p>Request an AI summary of Kishan's work</p><div class="flex items-center gap-3"><a class="rounded-md p-1 transition-opacity hover:opacity-60 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring" href="https://chatgpt.com/?q=Summarize%20Kishan%20Kumar's%20portfolio%20(https%3A%2F%2Fwww.kishans.in)%20for%20a%20first-time%20visitor.%20Explain%20his%20background%2C%20strongest%20technical%20areas%2C%20selected%20projects%2C%20writing%2C%20and%20how%20to%20contact%20him.%20Include%20Suniye%20(https%3A%2F%2Fsuniye.app)%20and%20explain%20what%20it%20does.%20Use%20only%20information%20from%20the%20provided%20sites%20and%20their%20linked%20pages.%20Clearly%20distinguish%20stated%20facts%20from%20reasonable%20inferences.%20Keep%20it%20concise." rel="noopener noreferrer" target="_blank" aria-label="Request an AI summary of Kishan's work with ChatGPT"><img src="https://static.levels.fyi/ai/openai.svg" alt="ChatGPT" class="h-6 w-6 object-contain dark:invert" loading="lazy" decoding="async"></a><a class="rounded-md p-1 transition-opacity hover:opacity-60 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring" href="https://claude.ai/new?q=Summarize%20Kishan%20Kumar's%20portfolio%20(https%3A%2F%2Fwww.kishans.in)%20for%20a%20first-time%20visitor.%20Explain%20his%20background%2C%20strongest%20technical%20areas%2C%20selected%20projects%2C%20writing%2C%20and%20how%20to%20contact%20him.%20Include%20Suniye%20(https%3A%2F%2Fsuniye.app)%20and%20explain%20what%20it%20does.%20Use%20only%20information%20from%20the%20provided%20sites%20and%20their%20linked%20pages.%20Clearly%20distinguish%20stated%20facts%20from%20reasonable%20inferences.%20Keep%20it%20concise." rel="noopener noreferrer" target="_blank" aria-label="Request an AI summary of Kishan's work with Claude"><img src="https://static.levels.fyi/ai/claude.svg" alt="Claude" class="h-6 w-6 object-contain dark:invert" loading="lazy" decoding="async"></a><a class="rounded-md p-1 transition-opacity hover:opacity-60 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring" href="https://www.google.com/search?udm=50&source=searchlabs&q=Summarize%20Kishan%20Kumar's%20portfolio%20(https%3A%2F%2Fwww.kishans.in)%20for%20a%20first-time%20visitor.%20Explain%20his%20background%2C%20strongest%20technical%20areas%2C%20selected%20projects%2C%20writing%2C%20and%20how%20to%20contact%20him.%20Include%20Suniye%20(https%3A%2F%2Fsuniye.app)%20and%20explain%20what%20it%20does.%20Use%20only%20information%20from%20the%20provided%20sites%20and%20their%20linked%20pages.%20Clearly%20distinguish%20stated%20facts%20from%20reasonable%20inferences.%20Keep%20it%20concise." rel="noopener noreferrer" target="_blank" aria-label="Request an AI summary of Kishan's work with Gemini"><img src="https://static.levels.fyi/ai/gemini.svg" alt="Gemini" class="h-6 w-6 object-contain dark:invert" loading="lazy" decoding="async"></a><a class="rounded-md p-1 transition-opacity hover:opacity-60 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring" href="https://grok.com/?q=Summarize%20Kishan%20Kumar's%20portfolio%20(https%3A%2F%2Fwww.kishans.in)%20for%20a%20first-time%20visitor.%20Explain%20his%20background%2C%20strongest%20technical%20areas%2C%20selected%20projects%2C%20writing%2C%20and%20how%20to%20contact%20him.%20Include%20Suniye%20(https%3A%2F%2Fsuniye.app)%20and%20explain%20what%20it%20does.%20Use%20only%20information%20from%20the%20prov
126ided%20sites%20and%20their%20linked%20pages.%20Clearly%20distinguish%20stated%20facts%20from%20reasonable%20inferences.%20Keep%20it%20concise." rel="noopener noreferrer" target="_blank" aria-label="Request an AI summary of Kishan's work with Grok"><img src="https://static.levels.fyi/ai/grok.svg" alt="Grok" class="h-6 w-6 object-contain dark:invert" loading="lazy" decoding="async"></a><a class="rounded-md p-1 transition-opacity hover:opacity-60 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring" href="https://www.perplexity.ai/?q=Summarize%20Kishan%20Kumar's%20portfolio%20(https%3A%2F%2Fwww.kishans.in)%20for%20a%20first-time%20visitor.%20Explain%20his%20background%2C%20strongest%20technical%20areas%2C%20selected%20projects%2C%20writing%2C%20and%20how%20to%20contact%20him.%20Include%20Suniye%20(https%3A%2F%2Fsuniye.app)%20and%20explain%20what%20it%20does.%20Use%20only%20information%20from%20the%20provided%20sites%20and%20their%20linked%20pages.%20Clearly%20distinguish%20stated%20facts%20from%20reasonable%20inferences.%20Keep%20it%20concise." rel="noopener noreferrer" target="_blank" aria-label="Request an AI summary of Kishan's work with Perplexity"><img src="https://static.levels.fyi/ai/perplexity.svg" alt="Perplexity" class="h-6 w-6 object-contain dark:invert" loading="lazy" decoding="async"></a></div></div><div class="flex flex-col gap-4 border-t border-border/60 pt-5 sm:flex-row sm:items-center sm:justify-between"><p>© 2026 Kishan</p><div class="flex items-center gap-4 sm:gap-5"><a class="transition-colors hover:text-foreground" rel="noopener noreferrer" target="_blank" href="https://github.com/kishanhitk/kishans.in">View Source</a><style>astro-island,astro-slot,astro-static-slot{display:contents}</style>
126<script>(()=>{var e=async t=>{await(await t())()};(self.Astro||(self.Astro={})).load=e;window.dispatchEvent(new Event("astro:load"));})();</script>
126<script>(()=>{var g=Object.defineProperty;var w=(c,s,d)=>s in c?g(c,s,{enumerable:!0,configurable:!0,writable:!0,value:d}):c[s]=d;var l=(c,s,d)=>w(c,typeof s!="symbol"?s+"":s,d);var E=new Set(["__proto__","constructor","prototype"]);{let c={0:t=>y(t),1:t=>d(t),2:t=>new RegExp(t),3:t=>new Date(t),4:t=>new Map(d(t)),5:t=>new Set(d(t)),6:t=>BigInt(t),7:t=>new URL(t),8:t=>new Uint8Array(t),9:t=>new Uint16Array(t),10:t=>new Uint32Array(t),11:t=>Number.POSITIVE_INFINITY*t},s=t=>{let[p,e]=t;return p in c?c[p](e):void 0},d=t=>t.map(s),y=t=>typeof t!="object"||t===null?t:Object.fromEntries(Object.entries(t).map(([p,e])=>[p,s(e)]));class f extends HTMLElement{constructor(){super(...arguments);l(this,"Component");l(this,"hydrator");l(this,"hydrate",async()=>{var b;if(!this.hydrator||!this.isConnected)return;let e=(b=this.parentElement)==null?void 0:b.closest("astro-island[ssr]");if(e){e.addEventListener("astro:hydrate",this.hydrate,{once:!0});return}let n=this.querySelectorAll("astro-slot"),r={},i=this.querySelectorAll("template[data-astro-template]");for(let o of i){let a=o.closest(this.tagName);a!=null&&a.isSameNode(this)&&(r[o.getAttribute("data-astro-template")||"default"]=o.innerHTML,o.remove())}for(let o of n){let a=o.closest(this.tagName);a!=null&&a.isSameNode(this)&&(r[o.getAttribute("name")||"default"]=o.innerHTML)}let u;try{u=this.hasAttribute("props")?y(JSON.parse(this.getAttribute("props"))):{}}catch(o){let a=this.getAttribute("component-url")||"<unknown>",v=this.getAttribute("component-export");throw v&&(a+=` (export ${v})`),console.error(`[hydrate] Error parsing props for component ${a}`,this.getAttribute("props"),o),o}let h;await this.hydrator(this)(this.Component,u,r,{client:this.getAttribute("client")}),this.removeAttribute("ssr"),this.dispatchEvent(new CustomEvent("astro:hydrate"))});l(this,"unmount",()=>{this.isConnected||this.dispatchEvent(new CustomEvent("astro:unmount"))})}disconnectedCallback(){document.removeEventListener("astro:after-swap",this.unmount),document.addEventListener("astro:after-swap",this.unmount,{once:!0})}connectedCallback(){if(!this.hasAttribute("await-children")||document.readyState==="interactive"||document.readyState==="complete")this.childrenConnectedCallback();else{let e=()=>{document.removeEventListener("DOMContentLoaded",e),n.disconnect(),this.childrenConnectedCallback()},n=new MutationObserver(()=>{var r;((r=this.lastChild)==null?void 0:r.nodeType)===Node.COMMENT_NODE&&this.lastChild.nodeValue==="astro:end"&&(this.lastChild.remove(),e())});n.observe(this,{childList:!0}),document.addEventListener("DOMContentLoaded",e)}}async childrenConnectedCallback(){let e=this.getAttribute("before-hydration-url");e&&await import(e),this.start()}getRetryImportUrl(e){let n=new URL(e,document.baseURI),r=`astro-retry=${Date.now()}`,i=n.hash.replace(/^#/,"");return n.hash=i?`${i}&${r}`:r,n.toString()}async importWithRetry(e){try{return await import(e)}catch(n){return await new Promise(r=>setTimeout(r,1e3)),import(this.getRetryImportUrl(e))}}handleHydrationError(e){let n=this.getAttribute("component-url"),r=new CustomEvent("astro:hydration-error",{cancelable:!0,bubbles:!0,composed:!0,detail:{error:e,componentUrl:n}});this.dispatchEvent(r)&&console.error(`[astro-island] Error hydrating ${n}`,e)}async start(){let e=JSON.parse(this.getAttribute("opts")),n=this.getAttribute("client");if(Astro[n]===void 0){window.addEventListener(`astro:${n}`,()=>this.start(),{once:!0});return}try{await Astro[n](async()=>{let r=this.getAttribute("renderer-url");try{let[i,{default:u}]=await Promise.all([this.importWithRetry(this.getAttribute("component-url")),r?this.importWithRetry(r):Promise.resolve({default:()=>()=>{}})]),h=this.getAttribute("component-export")||"default";if(h.includes(".")){this.Component=i;for(let m of h.split(".")){if(E.has(m)||!this.Component||typeof this.Component!="object"&&typeof this.Component!="function"||!Object.hasOwn(this.Component,m))throw new Error(`Invalid component export path: ${h}`);this.Component=this.Component[m]}}else{if(E.has(h))throw new Error(`Invalid component export path: ${h}`);this.Component=i[h]}return this.hydrator=u,this.hydrate}catch(i){return this.handleHydrationError(i),()=>{}}},e,this)}catch(r){this.handleHydrationError(r)}}attributeChangedCallback(){this.hydrate()}}l(f,"observedAttributes",["props"]),customElements.get("astro-island")||customElements.define("astro-island",f)}})();</script>
126<astro-island uid="Z1i6bhO" prefix="r1" component-url="/_astro/ThemeSwitcher.DOrp8TA4.js" component-export="default" renderer-url="/_astro/client.Bv3O21T9.js" props="{}" ssr client="load" opts="{"name":"ThemeSwitcher","value":true}" await-children><div role="radiogroup" aria-label="Theme" class="inline-flex items-center gap-0.5 rounded-full border border-border p-0.5"><button type="button" role="radio" aria-checked="false" aria-label="System theme" title="System theme" class="flex h-7 w-7 items-center justify-center rounded-full transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring text-muted-foreground hover:text-foreground"><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-monitor h-4 w-4" aria-hidden="true"><rect width="20" height="14" x="2" y="3" rx="2"></rect><line x1="8" x2="16" y1="21" y2="21"></line><line x1="12" x2="12" y1="17" y2="21"></line></svg></button><button type="button" role="radio" aria-checked="true" aria-label="Light theme" title="Light theme" class="flex h-7 w-7 items-center justify-center rounded-full transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring bg-secondary text-foreground"><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-sun h-4 w-4" aria-hidden="true"><circle cx="12" cy="12" r="4"></circle><path d="M12 2v2"></path><path d="M12 20v2"></path><path d="m4.93 4.93 1.41 1.41"></path><path d="m17.66 17.66 1.41 1.41"></path><path d="M2 12h2"></path><path d="M20 12h2"></path><path d="m6.34 17.66-1.41 1.41"></path><path d="m19.07 4.93-1.41 1.41"></path></svg></button><button type="button" role="radio" aria-checked="false" aria-label="Dark theme" title="Dark theme" class="flex h-7 w-7 items-center justify-center rounded-full transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring text-muted-foreground hover:text-foreground"><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-moon h-4 w-4" aria-hidden="true"><path d="M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401"></path></svg></button></div><!--astro:end--></astro-island></div></div></footer></body></html>
126<script> 127 document.addEventListener("astro:after-swap", () => { 128 const homepage = document.getElementById("homepage"); 129 homepage?.classList.remove("opacity-0"); 130 }); 131</script>
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.