A digital garden where I drop technical thoughts, raw automation scripts, and full-stack architectural patterns. Unpolished, pure signal.
Optimizing Canvas Animations in React
ReactPerformanceCanvas
When building complex UI animations like particle systems or generative art, ditch React state for frame updates. Use a mutable `ref` to store your coordinates and update the canvas directly inside a `requestAnimationFrame` loop. This avoids the React render cycle entirely and keeps your CPU idle at 0%.
The Case for Brutalist Web Design
UI/UXDesign Systems
We've reached peak homogeneity in SaaS design (rounded corners, soft shadows, Inter font). Brutalism—sharp edges, high contrast, monochrome palettes, and raw typography—cuts through the noise. It signals confidence. Your interface isn't trying to coddle the user; it's giving them the tools to get work done.
Zero-Downtime Next.js Deployments with Vercel
Next.jsCI/CD
When pushing to production, always ensure your Next.js cache is properly invalidated. I use a custom webhook triggered post-build to selectively revalidate paths using the App Router's `revalidatePath` function. This avoids the dreaded stale data issue on high-traffic pages.
Playwright Stealth Mode for B2B Scraping
PythonPlaywrightWeb Scraping
Vanilla Playwright gets blocked fast. Always use `playwright-stealth` and rotate your User-Agents dynamically. Additionally, injecting random mouse movements using `page.mouse.move()` along bezier curves drastically reduces bot detection on strict targets like LinkedIn.
PostgreSQL Row Level Security (RLS) in Supabase
SupabasePostgreSQLSecurity
Never trust the client. Your Supabase RLS policies should explicitly check `auth.uid() = user_id`. For complex multi-tenant apps, I use a security definer function to check tenant roles before allowing mutations. This keeps the frontend stupid and the database Fort Knox.
React Server Components vs Client Components
ReactNext.jsArchitecture
Stop using 'use client' everywhere. If a component doesn't need interactivity (useState, hooks, event listeners), it should be a Server Component. You get zero JS bundle size, direct backend access, and massive performance gains. Only push interactivity to the leaves of your component tree.
Tailwind CSS: The Good, The Bad, The Ugly
CSSTailwindFrontend
Tailwind is amazing for velocity, but it can lead to unreadable markup if not managed. Use tools like `tailwind-merge` and `clsx` to conditionally join classes without conflicts. For complex, repeated UI components, don't be afraid to extract them using `@apply` in your CSS to keep your JSX clean.