1"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[220],{2168:(e,t,r)=>{r.d(t,{w7:()=>o,zv:()=>n});let n=[{name:"ShipItBot",displayName:"ShipItBot",slug:"shipitbot",shortDescription:"Turn ideas into something you (yes you) can build with AI.",description:"Turn ideas into something you (yes you) can build with AI.",contentPath:"/content/projects/shipitbot.md",status:"In progress",teamSize:"1",role:["Engineer","Designer"],link:"https://shipitbot.com",linkText:"Try ShipItBot",font:"",hoverColor:"emerald-500",tags:["Automation","AI","Product","Tool"],image:"/images/works/shipitbot-preview.jpeg"},{name:"Plause",displayName:"Plause",slug:"plause",shortDescription:"Turn presentation feedback into results students can use.",description:"A classroom feedback tool that turns peer review into team results, class patterns, and AI-assisted takeaways.",contentPath:"/content/projects/plause.md",status:"Available Now",techStack:["Next.js","React","PostgreSQL","Tailwind","OpenAI","Vercel"],teamSize:"1",role:["Creator","Designer","Engineer"],link:"https://www.plause.app",linkText:"Try Plause",font:"",hoverColor:"cyan-500",tags:["Education","AI","Product","Tool"],image:"/images/works/plause-preview.jpeg"},{name:"Byline",displayName:"Byline",slug:"byline",shortDescription:"Collaborative writing with clear authorship.",description:"The writing platform built for AI in education.",contentPath:"/content/projects/byline.md",status:"What I'm working on",techStack:["Next.js","React","Supabase","Tailwind","Vercel","Stripe"],teamSize:"1 + advisors",role:["Founder"],link:"https://bylinedocs.com",linkText:"Get started free",font:"font-newsreader",hoverColor:"blue-500",tags:["AI","Writing","Education","Product","Web"]},{name:"Driver",displayName:"Driver",slug:"driver",shortDescription:"AI workspace and docs for your codebase.",description:"An AI-powered workspace for your codebases, with autogenerated docs and an intelligent, Notion-like editor.",contentPath:"/content/projects/driver.md",status:"Previously was building",techStack:["Next.js","React","TipTap","Monaco Editor","TypeScript","GraphQL","Tailwind","Redux","Zustand","Auth0","OpenAI API","Vercel"],teamSize:"4 â 15",role:["Frontend Engineer","Head of Product","UX Designer"],link:"https://driver.ai",linkText:"See Driver",font:"",hoverColor:"neutral-500",tags:["AI","Product","Frontend","Web","Design"]},{name:"Vroom Queue",displayName:"Vroom Queue",slug:"vroom-queue",shortDescription:"Race to set the order for anything.",description:"A playful, racing-inspired app to quickly decide the order of participants for meetings, games, drafts, or events.",contentPath:"/content/projects/vroom-queue.md",status:"Available Now",techStack:["Next.js","React","Tailwind","Vercel"],teamSize:"1",role:["Designer","Engineer"],link:"https://vroomq.com",linkText:"Try it",font:"",hoverColor:"red-500",tags:["Web","Tool","Fun","Design"]},{name:"BeatHatch",displayName:"\xdfeatHatch",slug:"beathatch",shortDe
1scription:"Learn rhythm through beat creation.",description:"Learn rhythm and tones while creating beats in a simple, fun application.",contentPath:"/content/projects/beathatch.md",status:"Available Now",techStack:["Next.js","React","Tone.js","Tailwind","Vercel"],teamSize:"1",role:["Frontend Engineer","UX Designer"],link:"https://beathatch.app",linkText:"Try it",font:"font-major-mono",hoverColor:"orange-500",tags:["Software","Frontend","Web","Design"]},{name:"AI Powered Search",displayName:"AI Powered Search",slug:"ai-powered-search",shortDescription:"AI search with curated quality sources.",description:"AI search engine that curated high-quality sources. Built pre-Perplexity, post-Google.",contentPath:"/content/projects/ai-powered-search.md",status:"Available Now",techStack:["React","Python","FastAPI","PostgreSQL"],teamSize:"5",role:["Frontend Engineer","Product Designer"],link:"",linkText:"See it",font:"",hoverColor:"purple-500",tags:["AI","Product","Frontend","Backend"]},{name:"LiteLight",displayName:"âiteâight",slug:"litelight",shortDescription:"Visualize AI energy costs in real-time.",description:"See the real energy cost of your AI use in a powerful, visual experience.",contentPath:"/content/projects/litelight.md",status:"Available Now",techStack:["Swift","SwiftUI","Python","Arduino","React"],teamSize:"1",role:["iOS Developer","Hardware Engineer","Frontend Engineer"],link:"https://litelight.app",linkText:"Try LiteLight",font:"font-cormorant",hoverColor:"yellow-500",tags:["Software","Hardware","Product","Design"]}],o={twitter:"https://twitter.com/quarterpixel",github:"https://github.com/quarterpixel",linkedin:"https://www.linkedin.com/in/rjbolick"}},3464:(e,t,r)=>{r.d(t,{F:()=>x});var n=r(5155),o=r(2619),a=r.n(o),i=r(2115);let s={resources:-125,teaching:-125,contact:80};function l(e,t){let r=document.getElementById(t);if(r){var n;e.preventDefault();let o=null!=(n=s[t])?n:60,a=r.getBoundingClientRect().top+window.scrollY-o;window.scrollTo({top:a,behavior:"smooth"})}}let c=["â ","â","â","â²"],u=["var(--font-geist-pixel-line)","var(--font-geist-pixel-circle)","var(--font-geist-pixel-triangle)","var(--font-geist-pixel-grid)"],d=["#f87171","#fb923c","#facc15","#4ade80","#38bdf8","#818cf8","#c084fc","#f472b6"],h=[14,11,8,5,3],p=[24,20,16,13,10],f=[16,13,10,8,5],m=[.14,.1,.07,.04,.02];function g(e){return e[Math.floor(Math.random()*e.length)]}function v(e){let{className:t}=e,r=(0,i.useRef)(null),o=(0,i.useRef)([]),a=(0,i.useRef)(null),s=(0,i.useRef)(0),[l,v]=(0,i.useState)([]),x=(0,i.useRef)(0),y=(0,i.useCallback)(()=>{let e=r.current;if(!e)return;let t=e.offsetWidth,n=[],o=0;for(let e=0;e<5;e++){let r=Math.max(1,Math.floor(t/p[e]));n.push({cols:r,chars:Array.from({length:r},()=>g(c))}),o+=r}x.current=o,v(n)},[]);(0,i.useEffect)(()=>{y();let e=new ResizeObserver(y);return r.current&&e.observe(r.current),()=>e.disconnect()},[y]),(0,i.useEffect)(()=>{let e=r.current;if(e)return e.addEventListener("mousemove",t),e.addEventListener("mouseleave",n),()=>{e.removeEventListener("mousemove",t),e.removeEventListener("mouseleave",n)};function t(t){let r=e.getBoundingClientRect();a.current={x:t.clientX-r.left,y:t.clientY-r.top}}function n(){a.current=null}},[]),(0,i.useEffect)(()=>{if(0!==l.length)return s.current=requestAnimationFrame(function e(){let t=a.current,r=0,n=0;for(let e=0;e<l.length;e++){let a=f[e],i=p[e];for(let s=0;s<l[e].cols;s++){let e=o.current[r];if(r++,!e)continue;if(!t){e.dataset.active&&(e.style.fontFamily="",e.style.transform="",e.style.color="",e.style.opacity="",delete e.dataset.active);continue}let l=s*i+i/2,c=n+a/2,h=t.x-l,p=t.y-c;if(90>Math.sqrt(h*h+p*p)){if(!e.dataset.active){e.style.fontFamily=g(u);let t=((Math.random()-.5)*6).toFixed(1),r=((Math.random()-.5)*6).toFixed(1);e.style.transform="translate(".concat(t,"px, ").concat(r,"px)"),.45>Math.random()?(e.style.color=g(d),e.style.opacity="0.7"):e.style.opacity="0.35",e.dataset.active="1"}}else e.dataset.active&&(e.style.fontFamily="",e.style.transform="",e.style.color="",e.style.opacity="",delete e.dataset.active)}n+=a}s.current=requestAnimationFrame(e)}),()=>cancelAnimationFrame(s.current)},[l]);let w=0;return(0,n.jsx)("div",{ref:r,className:"overflow-hidden select-none ".concat(t||""),children:l.map((e,t)=>(0,n.jsx)("div",{className:"flex font-geist-pixel-square leading-none",style:{width:e.cols*p[t],height:f[t],fontSize:h[t],color:"hsl(var(--muted-foreground) / ".concat(m[t],")")},children:e.chars.map((e,r)=>{let a=w++;return(0,n.jsx)("span",{ref:e=>{o.current[a]=e},className:"inline-block text-center transition-[transform,color,opacity] duration-200 ease-out",style:{width:p[t],lineHeight:"".concat(f[t],"px")},children:e},r)})},t))})}function x(e){let{scrolled:t,className:r,alwaysVisible:o}=e;return(0,n.jsxs)("nav",{className:"w-full z-50 bg-background/80 border-b border-border backdrop-blur-md transition-all duration-500 ".concat(o?"sticky top-0":"fixed top-0"," ").concat(o||t?"opacity-100 translate-y-0":"opacity-0 pointer-events-none -translate-y-full"," ").concat(r||""),children:[(0,n.jsx)(v,{className:"absolute inset-0"}),(0,n.jsx)("div",{className:"relative z-10 mx-auto max-w-6xl px-6 pointer-events-none",children:(0,n.jsxs)("div",{className:"flex items-center justify-between h-12 pt-1",children:[(0,n.jsx)(a(),{href:"/",className:"font-geist-pixel-square text-base uppercase tracking-[0.2em] pointer-events-auto px-2 py-1 rounded hover:bg-foreground
1/10 transition-colors",children:"Ryan Bolick"}),(0,n.jsxs)("div",{className:"flex items-center gap-1 text-xs uppercase tracking-[0.2em] font-geist-pixel-grid text-foreground pointer-events-auto",children:[(0,n.jsx)("a",{href:"/#resources",onClick:e=>l(e,"resources"),className:"hover:text-foreground hover:font-geist-pixel hover:bg-foreground/10 px-3 py-1.5 rounded transition-colors hidden md:block",children:"Resources"}),(0,n.jsx)("a",{href:"/#teaching",onClick:e=>l(e,"teaching"),className:"hover:text-foreground hover:font-geist-pixel hover:bg-foreground/10 px-3 py-1.5 rounded transition-colors hidden md:block",children:"Teaching"}),(0,n.jsx)("a",{href:"/#contact",onClick:e=>l(e,"contact"),className:"hover:text-foreground hover:font-geist-pixel hover:bg-foreground/10 px-3 py-1.5 rounded transition-colors",children:"Get in touch"})]})]})})]})}},5016:(e,t,r)=>{r.d(t,{cn:()=>a});var n=r(2821),o=r(5889);function a(){for(var e=arguments.length,t=Array(e),r=0;r<e;r++)t[r]=arguments[r];return(0,o.QP)((0,n.$)(t))}},9456:(e,t,r)=>{r.d(t,{w:()=>h});var n=r(5155),o=r(2115),a=r(3664);let i=["â ","â","â","â²"],s=["var(--font-geist-pixel-line)","var(--font-geist-pixel-circle)","var(--font-geist-pixel-triangle)","var(--font-geist-pixel-grid)"],l=["#f87171","#fb923c","#facc15","#4ade80","#38bdf8","#818cf8","#c084fc","#f472b6"];function c(e){let{className:t,parentRef:r}=e,a=(0,o.useRef)([]),c=(0,o.useRef)(null),u=(0,o.useRef)(0),[d,h]=(0,o.useState)([]),[p,f]=(0,o.useState)(0);return(0,o.useEffect)(()=>{function e(){let e=r.current;if(!e)return;let t=e.getBoundingClientRect(),n=Math.max(1,Math.floor(t.width/28)),o=Math.max(1,Math.floor(t.height/32));f(n),h(Array.from({length:n*o},()=>i[Math.floor(Math.random()*i.length)]))}e();let t=new ResizeObserver(e);return r.current&&t.observe(r.current),()=>t.disconnect()},[r]),(0,o.useEffect)(()=>{let e=r.current;if(e)return e.addEventListener("mousemove",t),e.addEventListener("mouseleave",n),()=>{e.removeEventListener("mousemove",t),e.removeEventListener("mouseleave",n)};function t(t){let r=e.getBoundingClientRect();c.current={x:t.clientX-r.left,y:t.clientY-r.top}}function n(){c.current=null}},[r]),(0,o.useEffect)(()=>{if(0!==d.length)return u.current=requestAnimationFrame(function e(){let t=c.current,r=a.current;for(let e=0;e<r.length;e++){let n=r[e];if(!n)continue;if(!t){n.dataset.active&&(n.style.fontFamily="",n.style.transform="",n.style.color="",n.style.opacity="",delete n.dataset.active);continue}let o=e%p*28+14,a=32*Math.floor(e/p)+16,i=t.x-o,c=t.y-a;120>Math.sqrt(i*i+c*c)?n.dataset.active||(n.style.fontFamily=s[Math.floor(Math.random()*s.length)],n.style.transform=function(){let e=(Math.random()-.5)*8,t=(Math.random()-.5)*8;return"translate(".concat(e.toFixed(1),"px, ").concat(t.toFixed(1),"px)")}(),.4>Math.random()?(n.style.color=l[Math.floor(Math.random()*l.length)],n.style.opacity="0.6"):n.style.opacity="0.25",n.dataset.active="1"):n.dataset.active&&(n.style.fontFamily="",n.style.transform="",n.style.color="",n.style.opacity="",delete n.dataset.active)}u.current=requestAnimationFrame(e)}),()=>cancelAnimationFrame(u.current)},[d,p]),(0,n.jsx)("div",{className:"overflow-hidden select-none pointer-events-none ".concat(t||""),children:(0,n.jsx)("div",{className:"flex flex-wrap leading-[32px] font-geist-pixel-square text-sm text-muted-foreground/10",style:{width:28*p},children:d.map((e,t)=>(0,n.jsx)("span",{ref:e=>{a.current[t]=e},className:"inline-block w-[28px] text-center transition-[transform,color,opacity] duration-200 ease-out",children:e},t))})})}var u=r(2168);function d(e){let{className:t}=e;return(0,n.jsx)("svg",{viewBox:"0 0 24 24",fill:"currentColor",className:t,children:(0,n.jsx)("path",{d:"M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433a2.062 2.062 0 0 1-2.063-2.065 2.064 2.064 0 1 1 2.063 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z"})})}function h(e){let{onVisibilityChange:t,className:r}=e,i=(0,o.useRef)(null);return(0,o.useEffect)(()=>{let e=new IntersectionObserver(e=>{let[r]=e;t(r.isIntersecting)},{threshold:.1});return i.current&&e.observe(i.current),()=>{i.current&&e.unobserve(i.current)}},[t]),(0,n.jsxs)("footer",{ref:i,className:"relative ".concat(r||""),children:[(0,n.jsx)(c,{className:"absolute inset-0",parentRef:i}),(0,n.jsx)("div",{className:"relative z-10 py-20",children:(0,n.jsxs)("div",{className:"mx-auto max-w-6xl px-6 space-y-5",children:[(0,n.jsx)("h2",{className:"text-2xl md:text-3xl font-geist-pixel-square uppercase tracking-[0.2em]",children:"Ryan Bolick"}),(0,n.jsx)("p",{className:"text-base text-muted-foreground max-w-md text-balance",children:"I build AI-native products and teach people how to ship them."}),(0,n.jsxs)("div",{className:"flex items-center gap-4 pt-2",children:[(0,n.jsx)("a",{href:u.w7.linkedin,target:"_blank",rel:"noopener noreferrer",className:"text-muted-foreground hover:text-foreground transition-colors","aria-label":"LinkedIn",children:(0,n.jsx)(d,{className:"h-4 w-4 hover:scale-125 transition-all duration-100"})}),(0,n.jsx)("a",{href:"mailto:[email protected]",className:"text-muted-foreground hover:text-foreground transition-colors","aria-label":"Email",children:(0,n.jsx)(a.A,{className:"w-[1.2rem] h-[1.2rem] hover:scale-125 transition-all duration-100"})})]}),(0,n.jsx)("div",{className:"pt-6",children:(0,n.jsxs)("span",{className:"text-xs font-geist-pixel-line uppercase tracking-[0.25em] text-muted-foreground",children:["\xa9 ",new Date().getFullYear()]})})]})})]})}}}]);
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.