<SYSTEM>This document contains comprehensive information about Anirudh Sriram's professional profile, portfolio, and blog content. It includes personal details, work experience, technical skills, projects, testimonials, and all published blog posts and work projects. This data is formatted for consumption by Large Language Models (LLMs) to provide accurate and up-to-date information about Anirudh Sriram's background, skills, and expertise.</SYSTEM>

# Anirudh Sriram

# About 
Route: https://www.techwithanirudh.com/about

Design engineer and full-stack developer who blends design and code to build beautiful, functional web experiences with Next.js, React, and TypeScript.

## Overview

I'm Anirudh (techwithanirudh), a design engineer and full-stack developer who builds beautiful, functional websites.

## Background

Hi, I'm Anirudh. I'm a self-taught software engineer and a student who loves building things with code. I grew up playing with computers, and now I'm passionate about learning new technologies and always improving my skills.

If you're curious, my journey began with Lego sets as a kid, building, breaking, and rebuilding anything I could imagine. That hands-on curiosity slowly turned into a love for making things with code. Over time, I moved from robots and gadgets to websites and apps, always chasing the next challenge. Since then, I've spent countless hours coding, brainstorming, and wrestling with bugs that taught me a lot more than any tutorial ever could.

## Personal Information

- Name: Anirudh Sriram
- Display Name: Anirudh Sriram
- Website: https://www.techwithanirudh.com/
- Resume: https://www.techwithanirudh.com/resume.pdf

## Social Links

- [GitHub](https://github.com/techwithanirudh) - Check out my open source projects and contributions
- [X](https://x.com/AnirudhWith) - Follow me for tech updates and project announcements
- [LinkedIn](https://linkedin.com/in/anirudhsriramb) - Connect with me professionally
- [YouTube](https://www.youtube.com/@techwithanirudh) - Subscribe for tech tutorials and project showcases
- [Email](mailto:hello@techwithanirudh.com) - Get in touch via email

## Recent GitHub Commits

### techwithanirudh/gorkie
- refactor: enhance typing status messages and improve sandbox tool management (36db9c4)
- fix: skip self-attribution when post_message DMs the requester (bdaa52a)

### techwithanirudh/gorkie
- feat: restore sandbox pause-on-turn-end, gorkie AgentMail identity, prompt narration (66a7098)
- fix: update API key placeholder in AgentMail examples to use a generic value (ed2b54f)
- refactor: remove outdated limitations and clarify user collaboration guidelines (27babaa)

### techwithanirudh/gorkie
- feat: refactor and enhance Slack agent capabilities (dc55a9d)
- feat: derive typing status from tool inputs, not just tool name (f355dc1)

### techwithanirudh/gorkie
- feat: restore code-review, grill-with-docs, and other agent skills (8ce9989)

### techwithanirudh/gorkie
- chore: install voice and wrangler skill deps in the e2b template (c11ef83)

### techwithanirudh/gorkie
- feat: restore taste-skill, voice, wrangler, mermaid-diagrams workspace skills (78d44bc)

### techwithanirudh/gorkie
- fix: restore gorkie identity, guardrails, and generate_image after rewrite (294b2c8)

### techwithanirudh/portfolio
- fix: add OIIA-related terms to cspell dictionary (15f703f)

### techwithanirudh/dotfiles
- Remove OpenCode installer (aba6487)

# Experience
Route: https://www.techwithanirudh.com/about

## Software Engineering Intern | Energent.ai

Duration: 09.2025 - 12.2025

Skills: TypeScript, React, Next.js, Node.js

Worked on the frontend and microservices of Energent.ai's AI data analysis platform.

## Full Stack Developer | MeetingBaaS

Duration: 10.2024 - 05.2025

Skills: TypeScript, React, Next.js, Python, Drizzle, MCP

Built [Transcript Seeker](/work/transcript_seeker) and [Speaking Meeting Bot](/work/speaking_meeting_bot), plus the AI chat and MCP tooling around the MeetingBaaS meeting APIs.

## Research Collaboration | Bosch

Duration: 04.2022 - 05.2022

Skills: Research, Autonomous Vehicles, Privacy Engineering

Co-authored a research paper on [privacy challenges for autonomous vehicles](https://osf.io/preprints/osf/mtfpy_v1).

## Full Stack Developer | Personal Projects

Duration: 2021 - Present

Skills: TypeScript, Next.js, React, Node.js, PostgreSQL

Built Coolify Tweaks, Shadcn SaaS Landing, and various open-source projects.

## Web / PowerApps Developer | Personal Projects

Duration: 2020 - 2021

Skills: PowerApps, JavaScript, React, SharePoint

Shipped a Product Hunt launch, built PowerApps solutions, and published Maskio on GitHub Game Jam.

## Python & AI Developer | Personal Projects

Duration: 2019 - 2020

Skills: Python, Keras, OpenCV, TensorFlow

Built early AI experiments with Keras, OpenCV, and TensorFlow.

## Robotics Programmer | Personal Projects

Duration: 2018 - 2019

Skills: Mindstorms, Lego Boost, Python

Created robotics experiments including Snake, Vernie, Humanoid Robot, and Gripper using Mindstorms / Lego Boost.


# Skills
Route: https://www.techwithanirudh.com/about

## Categories

### Web Development

Building modern web apps with Next.js, React, TypeScript, and UI frameworks.

### AI & Machine Learning

Exploring AI features with Python, OpenCV, and LLMs.

### Full Stack Development

Creating end-to-end solutions with Node.js, TypeScript, databases, and cloud technologies.

## Technologies

- TypeScript
- JavaScript
- Python
- React
- Next.js
- Tailwind CSS
- shadcn/ui
- Radix UI
- Motion
- TanStack
- Node.js
- Bun
- PostgreSQL
- Redis
- Git
- Docker
- Vercel
- Claude
- Cursor
- Codex
- PostHog
- Umami
- Figma
- Paper


# Testimonials
Route: https://www.techwithanirudh.com/about

## Exceptional 10x Developer

> Some say 10x developers do not exist. I have met several, of which Anirudh. [...] Not only did he work really fast and well, he foresaw limitations and implemented ingenious solutions. Most impressive was his ability to quickly master things he didn't know.

— **Lazare Rossilion**

## Professional and Polished Work

> Congratulations on creating a very professional looking utility. Great job! The attention to detail and quality of execution is outstanding.

— **Vivek Ganesan**

## Amazing Execution

> Hey! This is amazing! Demo looks awesome! The implementation is clean and the user experience is smooth. Looking forward to seeing more work.

— **Karuppiah N**


# Uses
Route: https://www.techwithanirudh.com/uses

## Hardware

- MacBook Air 15": M2 chip, 8GB RAM, 256GB SSD (https://support.apple.com/en-us/111346)
- Mac mini: M4 chip, 16GB RAM, 256GB SSD (https://support.apple.com/en-us/121555)
- ThinkCentre M70q: Intel i5, 32GB RAM, 1TB SSD, Proxmox VE (https://www.lenovo.com/in/en/p/desktops/thinkcentre/m-series-tiny/lenovo-thinkcentre-m70q-gen-5-tiny-intel/12tqcto1wwin1)
- Samsung M7 Smart Monitor: White, 32-inch, 4K UHD smart monitor (https://www.samsung.com/in/monitors/smart/smart-monitor-m7-32-inch-smart-tv-apps-4k-uhd-ls32fm700uwxxl/)
- Logitech MX Mechanical Mini: For Mac, Pale Gray, tactile quiet switches (https://www.logitech.com/products/keyboards/mx-mechanical-mini.html)
- Logitech Signature M650: Off-white wireless mouse (https://www.logitech.com/products/mice/signature-m650.html)
- Logitech Brio 300: Off-white USB webcam (https://www.logitech.com/products/webcams/brio-300-webcam.html)
- Marshall Major V: Black wireless on-ear headphones (https://www.marshall.com/us/en/product/major-v)
- iPhone 16 Pro: Desert Titanium, 256GB (https://support.apple.com/en-us/111840)
- iPad 10th Gen: Silver, 128GB, Wi-Fi + Cellular, Apple Pencil, Magic Keyboard Folio (https://support.apple.com/en-us/111833)
- Apple Watch Series 9: 45mm, Starlight, Sport Loop (https://support.apple.com/en-us/121031)
- IKEA Lighting: IKEA MITTLED, TRADFRI driver with RODRET button (https://www.ikea.com/us/en/p/mittled-led-kitchen-cntrtp-lighting-strip-dimmable-white-10455434/)

## Software

- 1Password: Password manager (https://1password.com)
- Alcove: Notch dock utility (https://tryalcove.com)
- Amphetamine: Keeps Mac awake (https://apps.apple.com/app/amphetamine/id937984704)
- Antinote: Quick notes (https://antinote.io)
- Bartender: Menu bar organizer (https://www.macbartender.com)
- Beeper: Unified messaging (https://www.beeper.com)
- BetterDisplay: Display management (https://betterdisplay.pro)
- CleanShot X: Screen capture and recording (https://cleanshot.com)
- Claude Code: AI coding assistant (https://www.anthropic.com/claude-code)
- Conductor: Utility app (https://conductor.build)
- Craft: Notes and documents (https://www.craft.do)
- Dia: Browser (https://diabrowser.com)
- Downie: Video downloader (https://software.charliemonroe.net/downie/)
- Dropover: Drag and drop shelf (https://dropoverapp.com)
- Ghostty: Terminal emulator (https://ghostty.org)
- Goodnotes: Digital notebook (https://www.goodnotes.com)
- IINA: Media player (https://iina.io)
- LookAway: Break reminders (https://lookaway.app)
- Loop: Window manager (https://github.com/MrKai77/Loop)
- Mole: Volume control per app (https://github.com/tw93/Mole)
- Notion: Notes and docs (https://www.notion.com)
- Notion Calendar: Calendar client (https://www.notion.com/product/calendar)
- OpenCode: Coding assistant (https://opencode.ai)
- OrbStack: Containers and Linux VMs (https://orbstack.dev)
- Paste: Clipboard manager (https://pasteapp.io)
- Pictogram: Utility app (https://pictogramapp.com)
- PixelSnap: Screen measuring tool (https://pixelsnap.com)
- Raindrop.io: Bookmark manager (https://raindrop.io)
- Raycast: Productivity launcher (https://raycast.com)
- Spark Mail: Email client (https://sparkmailapp.com)
- Spotify: Music streaming (https://spotify.com)
- Supercharge: Mac productivity utilities (https://sindresorhus.com/supercharge)
- Termius: SSH client (https://termius.com)
- Typefully: Writing and scheduling tool (https://typefully.com)
- UTM: Virtual machines (https://mac.getutm.app)
- Vesktop: Discord client (https://vesktop.dev)
- Visual Studio Code: Code editor (https://code.visualstudio.com)
- Warp: Terminal (https://warp.dev)
- Wispr Flow: Voice dictation (https://wisprflow.ai)
- Yaak: API client (https://yaak.app)


# Colophon
Route: https://www.techwithanirudh.com/colophon

## Technology

- Next.js: App Router foundation with server components and streaming. (https://nextjs.org)
- TypeScript: Strict typing for safer, more readable UI code. (https://www.typescriptlang.org)
- Tailwind CSS: Utility-first styling with custom design tokens. (https://tailwindcss.com)
- Fumadocs: Typed MDX content with a docs-friendly layout engine. (https://fumadocs.dev)
- Radix UI + shadcn/ui: Accessible primitives and customized UI building blocks. (https://ui.shadcn.com)
- PostgreSQL: Reliable relational database for data persistence. (https://www.postgresql.org)
- Drizzle ORM: Type-safe queries and schema management. (https://orm.drizzle.team)
- Motion: Subtle reveals and transitions for a calmer rhythm. (https://motion.dev)
- Bun: Fast all-in-one runtime, bundler, and package manager. (https://bun.sh)

## Typography

- Geist Regular
- Geist Medium
- Geist Semibold
- Geist Bold
- Geist Mono
- Geist Mono Italic

## Attribution

- Braydon Coyer (https://www.braydoncoyer.dev)
- Nelson Lai (https://nelsonlai.dev)
- Chanh Dai (https://chanhdai.com)
- Tailwind CSS (https://tailwindcss.com)
- Tiptap (https://tiptap.dev)
- Hexaa (https://hexaa.sh)
- Josh W. Comeau (https://www.joshwcomeau.com)
- Ingo (https://ingo.au)
- Eververse (https://www.eververse.ai)
- Shu Ding (https://shud.in)
- Emil Kowalski (https://emilkowal.ski)
- shadcn/ui (https://ui.shadcn.com)
- Steve (https://iamsteve.me)
- Visitors (https://visitors.now)
- Ephraim Duncan (https://ephraimduncan.com/)
- Suraj Gaud (https://www.surajgaud.com/)
- Kinfish (https://kinfish.farmui.com/)
- Enscribe (https://enscribe.dev/)
- Lean Rada (https://leanrada.com/)
- Victor Eke (https://victoreke.com/)
- Noah Dunnagan (https://noahdunnagan.com/)


## Work

## Mastra Slack Agent Template
URL: /work/mastra_slack_agent_template
Source: https://raw.githubusercontent.com/techwithanirudh/minimalistic-portfolio/refs/heads/main/content/work/mastra_slack_agent_template.mdx

A Slack agent template with tools, sandboxes, and GitHub access.



A starting point for building a Slack agent. It handles mentions, DMs, threads, files, workspace search, and streamed replies.

## How it works [#how-it-works]

Each thread gets its own E2B sandbox with files, shell access, and a browser. The agent can run commands without touching the host machine. Larger requests can be split between several smaller agents.

It also includes web research through Exa, image generation, scheduled tasks, and optional GitHub and AgentMail accounts. New features can be added as skills or MCP servers.

OpenRouter handles model access, and PostgreSQL stores memory and state. The [configuration guide](https://github.com/techwithanirudh/mastra-slack-agent-template/blob/main/docs/configuration.md) explains how to set up the services and Slack app.

## Stack [#stack]

* Mastra runtime on Bun, TypeScript, and the AI SDK.
* Slack via the Chat SDK adapter in Socket Mode.
* OpenRouter models, Exa search, E2B sandboxes.
* PostgreSQL memory and state, with local observability.


Last updated on August 3, 2026

## Portfolio
URL: /work/portfolio
Source: https://raw.githubusercontent.com/techwithanirudh/minimalistic-portfolio/refs/heads/main/content/work/portfolio.mdx

My personal site with a blog, work, guestbook, and AI chat.



Personal site for writing, sharing work, and collecting guestbook notes.

## How it works [#how-it-works]

Blog posts and project pages are MDX files, loaded and searched through Fumadocs. Drizzle and Better Auth handle the guestbook and comments. The AI chat uses the site's content to answer questions about my work. The site also generates social images, an RSS feed, and a contact form backed by React Email and Resend.

## Stack [#stack]

* Next.js, TypeScript, Tailwind, Radix UI.
* Fumadocs MDX + Shiki, Zod validators.
* Drizzle ORM, Better Auth, React Email + Resend.


Last updated on August 3, 2026

## Coolify Tweaks
URL: /work/coolify_tweaks
Source: https://raw.githubusercontent.com/techwithanirudh/minimalistic-portfolio/refs/heads/main/content/work/coolify_tweaks.mdx

A userstyle that changes the spacing, type, and layout in Coolify.



Coolify Tweaks is a userstyle for Coolify's self-hosting dashboard. It changes the spacing, typography, and layout without changing Coolify's code or requiring a fork.

## How it works [#how-it-works]

The userstyle adds CSS overrides on top of an existing Coolify dashboard. The rules work in light and dark mode and cover the main dashboard screens. A Nitro API serves the CSS. You can install it through Stylus, userstyles.world, or a proxy such as Traefik. The site shows the changes before you install them.

## Stack [#stack]

* TurboRepo, TypeScript, Changesets.
* Stylus userstyles + Nitro API.
* Docs app with Tailwind UI utilities.


Last updated on August 3, 2026

## Shadcn Portfolio
URL: /work/shadcn_portfolio
Source: https://raw.githubusercontent.com/techwithanirudh/minimalistic-portfolio/refs/heads/main/content/work/shadcn_portfolio.mdx

A Next.js portfolio template with a blog and shadcn/ui.



Shadcn Portfolio is a Next.js portfolio template with work sections, a blog, and shadcn/ui components. The content is written in MDX.

## How it works [#how-it-works]

Blog posts and work pages are MDX files, so adding one means adding a file. shadcn/ui provides the components, and Framer Motion handles the transitions. SEO metadata, sitemaps, and structured data are included. Turborepo manages the workspace tools.

## Stack [#stack]

* Next.js 15, TurboRepo, TypeScript.
* Tailwind + Radix via shadcn/ui.
* Framer Motion, dotenv, pnpm tooling.


Last updated on August 3, 2026

## Remotely
URL: /work/remotely
Source: https://raw.githubusercontent.com/techwithanirudh/minimalistic-portfolio/refs/heads/main/content/work/remotely.mdx

Use a TV remote as a mouse for a Mac connected to a TV.



Remotely lets you use a TV remote to control the pointer on a Mac connected to a TV. The arrows move the cursor, the centre button clicks, and nothing else needs to be bought or paired.

## How it works [#how-it-works]

Tapping an arrow moves the pointer a little. Holding it moves faster. Press Back twice to switch the arrows to scrolling. You can also rebind twenty actions, including keyboard shortcuts. Everything runs on the Mac with no account or network connection.

## Stack [#stack]

* Swift and SwiftUI, targeting macOS 15+.
* `RemotelyKit` core with no UI dependency, plus a menu bar app target.
* `CGEvent` input synthesis and Accessibility permissions.
* Swift Package Manager, with tests as a plain executable target.


Last updated on August 3, 2026

## Shadcn SaaS Landing
URL: /work/shadcn_saas_landing
Source: https://raw.githubusercontent.com/techwithanirudh/minimalistic-portfolio/refs/heads/main/content/work/shadcn_saas_landing.mdx

A SaaS landing page template with a blog.



Shadcn SaaS Landing is a template for a SaaS marketing site with a blog. It keeps the product site and its content in one project.

## How it works [#how-it-works]

The marketing site uses shadcn/ui and Tailwind. The blog uses Fumadocs and searchable MDX content. Drizzle and Better Auth handle app data and sign-in, while React Email and Resend handle email flows.

## Stack [#stack]

* Next.js 16, shadcn/ui, Tailwind, motion.
* Fumadocs MDX + Shiki + type tables.
* Drizzle ORM, Better Auth, React Email + Resend.


Last updated on August 3, 2026

## Discord AI Bot
URL: /work/discord_ai_bot
Source: https://raw.githubusercontent.com/techwithanirudh/minimalistic-portfolio/refs/heads/main/content/work/discord_ai_bot.mdx

A Discord bot that can chat, search the web, and talk in voice channels.



Discord AI Bot answers questions in text channels and can join voice channels to listen and talk.

## How it works [#how-it-works]

Slash commands handle text messages. The Vercel AI SDK connects the bot to OpenAI, Anthropic, OpenRouter, or Google. Voice uses a speech-to-text and text-to-speech pipeline. The bot also has web search and memory, while Upstash Redis handles rate limits.

## Stack [#stack]

* Bun, TypeScript, discord.js.
* OpenAI/Anthropic/OpenRouter/Google providers.
* Upstash Redis, Pino, ESLint/Prettier.


Last updated on August 3, 2026

## Speaking Meeting Bot
URL: /work/speaking_meeting_bot
Source: https://raw.githubusercontent.com/techwithanirudh/minimalistic-portfolio/refs/heads/main/content/work/speaking_meeting_bot.mdx

AI agents that join Google Meet and Teams calls and speak with different personalities.



Speaking Meeting Bot lets AI agents join Google Meet and Teams calls and speak with different personalities.

## How it works [#how-it-works]

Each agent's behavior, tone, and knowledge live in a Markdown file, so you can change the personality without changing code. FastAPI starts the bots, MeetingBaaS joins the calls, and Pipecat handles the audio. OpenAI handles the responses. ngrok is used during local development.

## Stack [#stack]

* FastAPI, Pipecat, Python 3.11.
* MeetingBaaS APIs + WebSocket transport.
* Cartesia TTS, Gladia/Deepgram STT, OpenAI.


Last updated on August 3, 2026

## Transcript Seeker
URL: /work/transcript_seeker
Source: https://raw.githubusercontent.com/techwithanirudh/minimalistic-portfolio/refs/heads/main/content/work/transcript_seeker.mdx

An app for recording meetings, reading transcripts, and asking questions about them.



Transcript Seeker records meetings from Zoom, Google Meet, and other platforms, or lets you upload an audio or video file. You can read the transcript and ask questions about it.

## How it works [#how-it-works]

The transcript follows the recording, so clicking a word jumps to that moment. MeetingBaaS bots can join and record meetings. AI chat and summaries help you search the transcript. PGLite stores data in the browser, with optional Turso/SQLite storage for calendar data.

## Stack [#stack]

* React + Vite, Tailwind, Radix UI.
* Nitro proxy, Drizzle ORM, PGLite/Turso.
* Turborepo + pnpm workspace tooling.


Last updated on August 3, 2026

## AI Tutor
URL: /work/ai_tutor
Source: https://raw.githubusercontent.com/techwithanirudh/minimalistic-portfolio/refs/heads/main/content/work/ai_tutor.mdx

A study app for chat, quizzes, flashcards, and voice sessions.



AI Tutor is a study app. Ask a question, get an explanation, and turn the same topic into a quiz or a set of flashcards. You can also study from documents or use a voice session.

## How it works [#how-it-works]

The chat workspace sits alongside editable, versioned documents. You can get suggestions on a document, then create a quiz or flashcards from the same topic without leaving the conversation. Voice sessions let you study out loud, with the transcript keeping track of the session.

NextAuth handles sign-in, and study history is saved so you can come back later. A model registry lets the app switch between different AI providers.

## Stack [#stack]

* Next.js 16 App Router, Tailwind, Radix UI.
* Drizzle ORM + Neon, NextAuth, React Email.
* AI SDK providers with a typed model registry.


Last updated on August 3, 2026

## AniKode Website Builder
URL: /work/anikode
Source: https://raw.githubusercontent.com/techwithanirudh/minimalistic-portfolio/refs/heads/main/content/work/anikode.mdx

A drag-and-drop website builder with HTML and JavaScript blocks.



AniKode is a drag-and-drop website builder. Start with simple HTML blocks, or add custom HTML and JavaScript when you need more control. You can add pages, move blocks around, and see the changes in the preview as you edit.

## How it works [#how-it-works]

GrapesJS powers the editor. Pages, blocks, and assets are managed in one place, and the preview updates as you edit. Projects are saved as JSON so the exported site matches the editor. Custom-code plugins let you add HTML or JavaScript when the built-in blocks are not enough.

NextAuth handles accounts and sign-in. The editor uses Next.js, Radix, and Tailwind.

## Stack [#stack]

* Next.js 14, Tailwind CSS, Radix UI, Framer Motion.
* Drizzle ORM + Postgres adapters, NextAuth sessions.
* React Hook Form + Zod, React Email + Resend.


Last updated on August 3, 2026

## AnirudhGPT
URL: /work/anirudh_gpt
Source: https://raw.githubusercontent.com/techwithanirudh/minimalistic-portfolio/refs/heads/main/content/work/anirudh_gpt.mdx

An AI chat app with sign-in and saved conversations.



AnirudhGPT is an AI chat app that uses the OpenAI API. You can sign in, save conversations, and come back to them later. It was an early project for learning how an AI chat app works from the UI to the database.

## How it works [#how-it-works]

The chat UI uses reusable message components. Firebase handles sign-in, and Firestore stores conversation history. The app also has a Firebase Admin setup for server-side operations. It uses both the Next.js `app` and `pages` directories because it was built before the move to the App Router.

## Stack [#stack]

* Next.js, TypeScript, Tailwind, PostCSS.
* Firebase SDKs + Firestore.


Last updated on August 3, 2026

## Classnotes Buddy
URL: /work/classnotes_buddy
Source: https://raw.githubusercontent.com/techwithanirudh/minimalistic-portfolio/refs/heads/main/content/work/classnotes_buddy.mdx

A site for uploading and sharing class notes.



Classnotes Buddy is a place to upload class notes and share them with a link. Your notes stay in sync when you open them on another device.

## How it works [#how-it-works]

Supabase handles email and OAuth sign-in and keeps profiles synced. Drizzle manages the Postgres database, and uploads sync across devices. The project is a Turborepo workspace based on create-t3-turbo, with a Next.js web app and an Expo mobile app in progress.

## Stack [#stack]

* Turborepo, pnpm workspaces, TypeScript.
* Supabase Auth + Postgres, Drizzle ORM.
* Next.js web client, with an Expo mobile app in progress.


Last updated on August 3, 2026

## Daily Diary
URL: /work/daily_diary
Source: https://raw.githubusercontent.com/techwithanirudh/minimalistic-portfolio/refs/heads/main/content/work/daily_diary.mdx

A journal app for writing daily entries.



Daily Diary is a journaling app for writing daily reflections. It uses prompts to help you get started.

## How it works [#how-it-works]

You can write, list, and review entries in a simple interface. It is a frontend-only project built with React and Bootstrap.

## Stack [#stack]

* React + Bootstrap.


Last updated on August 3, 2026

## Solving Autonomous Driving Privacy Challenges using AI
URL: /work/autonomous_driving
Source: https://raw.githubusercontent.com/techwithanirudh/minimalistic-portfolio/refs/heads/main/content/work/autonomous_driving.mdx

A research project that replaces faces in driving videos to protect privacy.



This research project replaces faces in self-driving car videos. The goal is to hide who was recorded while keeping the footage useful for training driving models.

## How it works [#how-it-works]

MediaPipe Face Mesh finds landmarks on the original and replacement faces. Those landmarks are split into triangles, and OpenCV warps each replacement triangle onto the original face. This keeps the pose and expression aligned. The project also supports a live webcam for testing.

## Stack [#stack]

* Python, OpenCV, MediaPipe, NumPy.
* Python scripts for capture and mesh tooling.


Last updated on August 3, 2026

## Maskio
URL: /work/maskio
Source: https://raw.githubusercontent.com/techwithanirudh/minimalistic-portfolio/refs/heads/main/content/work/maskio.mdx

A pixel-art platformer with levels, hazards, and coins.



Maskio is a pixel-art platformer. Jump across platforms, avoid spikes, and collect coins across multiple worlds.

## How it works [#how-it-works]

KaboomJS scenes define the levels and sprite collisions for platforms, hazards, and coins. The game supports keyboard controls on desktop and touch controls on mobile. esbuild builds it, and Express serves it in development and production.

## Stack [#stack]

* KaboomJS, Node.js, Express.
* esbuild, nodemon.


Last updated on August 3, 2026

## Blog

## How We Taught a Slack Bot to Run Code
URL: /blog/gorkie-sandboxes
Source: https://raw.githubusercontent.com/techwithanirudh/minimalistic-portfolio/refs/heads/main/content/blog/gorkie-sandboxes.mdx
Tags: ai, tech, infrastructure

Teaching a Slack bot to run code safely, by way of Vercel Sandboxes, E2B, and finally Daytona.



Gorkie was built by [Devarsh](https://github.com/imdevarsh). I led the sandbox and runtime work; Devarsh helped throughout with testing and feedback.

## Intro [#intro]

Gorkie started as a Slack assistant: answer questions, summarize threads, help with tasks. That worked until users started asking it to *do* things: run scripts, convert files, poke at repos. Text responses stopped being enough. The bot needed to actually execute.

That meant sandboxes. This post covers how we got there.

<Mermaid
  chart="flowchart LR
U[Slack user] --> G[Gorkie]
G --> A[Agent runtime]
A --> S[Sandbox]
S --> O[Commands / Files / Output]
O --> G --> U"
/>

Through every iteration, three things stayed constant:

* Syncing attachments into the sandbox
* Showing tool status so users see progress, not just "thinking..."
* Streaming updates back to Slack instead of one giant final blob

We also use **Slack's AI implementation** for the chat surface and interaction model, which lets us render interactive UI directly via [Block Kit](https://docs.slack.dev/reference/block-kit/blocks/plan-block/).

## Sandbox Providers [#sandbox-providers]

<Steps>
  <Step>
    ### Vercel Sandboxes [#vercel-sandboxes]

    We were already on the [AI SDK](https://ai-sdk.dev/), so [Vercel Sandboxes](https://vercel.com/docs/vercel-sandbox/) were the obvious first step. We gave Gorkie a sandbox tool that spawned a **ToolLoopAgent** to work inside it.

    <Mermaid
      chart="sequenceDiagram
participant G as Gorkie
participant A as Subagent
participant SB as Sandbox
participant S as Slack
G->>A: build task + context
A->>SB: create/attach sandbox
A->>SB: sync attachments
A->>SB: run commands
A-->>SB: write outputs
A->>S: upload files (showFile)
A-->>G: summary
G-->>G: final summary"
    />

    Per-thread persistence was get-or-create with snapshot restore and Redis TTLs, a workaround that held things together before we had a proper DB model. On shutdown we'd snapshot and save the ID with its own TTL:

    ```ts title="lib/ai/tools/execute-code/sandbox.ts"
    const live = await reconnect(ctxId);
    if (live) {
      return live;
    }

    const restored = await restoreFromSnapshot(ctxId);
    const instance =
      restored ??
      (await Sandbox.create({
        runtime: config.runtime,
        timeout: config.timeoutMs,
      }));

    await redis.set(redisKeys.sandbox(ctxId), instance.sandboxId);
    await redis.expire(redisKeys.sandbox(ctxId), config.sandboxTtlSeconds);
    ```

    ```ts title="lib/ai/tools/execute-code/sandbox.ts"
    const snap = await instance.snapshot().catch((error: unknown) => {
      logger.warn({ sandboxId, error, ctxId }, 'Snapshot failed');
      return null;
    });

    if (snap) {
      await redis.set(redisKeys.snapshot(ctxId), snap.snapshotId);
      await redis.expire(redisKeys.snapshot(ctxId), config.snapshotTtlSeconds);
    }
    ```

    It worked for short runs, but the cracks showed quickly: limited lifecycle controls, unreliable snapshots, easy-to-hit limits. Not the foundation we wanted.
  </Step>

  <Step>
    ### E2B [#e2b]

    We moved to &#x2A;*[E2B](https://e2b.dev/)**, built for AI agent execution, which felt like the right step up. Same architecture, just a better sandbox layer. We also made thread ownership explicit with a proper session table:

    ```ts title="db/schema.ts"
    export const sandboxSessions = pgTable('sandbox_sessions', {
      threadId: text('thread_id').primaryKey(),
      sandboxId: text('sandbox_id').notNull(),
      status: text('status').notNull().default('creating'),
      pausedAt: timestamp('paused_at', { withTimezone: true }),
      resumedAt: timestamp('resumed_at', { withTimezone: true }),
      destroyedAt: timestamp('destroyed_at', { withTimezone: true }),
    });
    ```

    As usage grew, we realized the provider wasn't the issue, our tool loop architecture was. It handled short tasks but fell apart under skills, MCP plumbing, orchestration, and stateful session handling. We were slowly building our own runtime by accident.

    E2B had its own friction too: persistence was beta and buggy, and the model leaned more toward "create and kill" than true long-lived sessions. We wanted persistence-first from the start.
  </Step>

  <Step>
    ### Daytona [#daytona]

    We switched to &#x2A;*[Daytona](https://www.daytona.io/)**. Each Slack thread owns a runtime, and that runtime persists across messages. The state model is straightforward: `threadId → sandboxId + sessionId`, with status transitions (`active`, `paused`, `resuming`, `destroyed`) and automatic reattach on the next message in the thread.

    Daytona's lifecycle settings handled cleanup without us touching it:

    * Auto-stop after **5 minutes** of inactivity
    * Auto-archive **2 hours** after stop
    * Auto-delete after **2 days**

    ```ts title="lib/sandbox/session.ts"
    const sandbox = await daytona.create({
      autoStopInterval: config.timeouts.stopMinutes,
      autoArchiveInterval: config.timeouts.archiveMinutes,
      autoDeleteInterval: config.timeouts.deleteMinutes,
      snapshot: SANDBOX_SNAPSHOT,
    });

    await upsert({
      threadId,
      sandboxId: sandbox.id,
      sessionId: session.id,
      status: 'active',
    });
    ```

    No custom janitor jobs. Cleanup moved from our cron logic into platform config.

    <Mermaid
      chart="flowchart LR
T[Slack Thread] --> D[Daytona Sandbox]
D -->|active| P[Persisted FS]
D -->|auto-stop 5 min| S[Stopped]
S -->|auto-archive 2 hours| A[Object Storage]
A -->|auto-delete 2 days| X[Deleted]"
    />
  </Step>
</Steps>

With the sandbox stable, the next question was what should run inside it.

## The Orchestration Trap [#the-orchestration-trap]

We tried [Sandbox Agent](https://sandboxagent.dev/) by [Rivet](https://rivet.dev&#x29; with &#x2A;*[OpenCode](https://opencode.ai/)** behind it. Sandbox Agent runs inside the sandbox, exposes an HTTP interface, and communicates over [ACP](https://zed.dev/acp). We had to boot, health-check, and restart it when needed.

<Mermaid
  chart="sequenceDiagram
participant G as Gorkie
participant T as Sandbox Tool
participant SA as Sandbox Agent (HTTP Server in Sandbox)
participant O as OpenCode
G->>T: delegate task
T->>SA: start sandbox-agent server
SA-->>T: return HTTP URL
T->>SA: health check + connect
T->>SA: start task + stream
SA->>O: run agent
O-->>SA: prompts + commands
SA-->>T: live updates + results
T-->>G: final summary"
/>

It offloaded orchestration, but added too many failure points: an HTTP server inside the sandbox, more moving parts. OpenCode was also over-engineered for our use case and used more tokens than we wanted.

We next tried &#x2A;*[Pi](https://pi.dev/)** with Sandbox Agent. Pi gave us skills, MCPs, and easy extensibility, but the core shape was still an HTTP server inside the sandbox. Crashes still happened. We wanted boring infrastructure.

## Pi over RPC [#pi-over-rpc]

The cleanest setup turned out to be **Pi in RPC mode**: no daemon, no internal HTTP listener, just a process. Gorkie attaches to the thread's Daytona sandbox, starts Pi in RPC mode inside a PTY, and sends it a prompt. Pi runs commands and edits files; events stream back as newline-delimited JSON and get forwarded to Slack as they arrive.

```ts title="lib/sandbox/rpc.ts"
const piCmd = sessionId
  ? `pi --mode rpc --session ${sessionId}`
  : 'pi --mode rpc';

await pty.sendInput(`stty -echo; exec ${piCmd}\n`);
await client.waitUntilReady();
```

One less server, one less failure point.

Pi also made tool integration cleaner. Before, with Sandbox Agent and OpenCode, we had to define a custom MCP server, run it in the sandbox, connect it to the coding agent, intercept the tool call, and route it. With Pi, we register handlers directly:

```ts title="lib/sandbox/config/extensions/tools.ts"
pi.registerTool({
  name: 'showFile',
  label: 'showFile',
  description:
    'Signal the host to upload a sandbox file to Slack once it is ready.',
  parameters: showFileParams,
  execute: (_toolCallId, params) => {
    const { path, title } = params as Static<typeof showFileParams>;
    if (!nodePath.isAbsolute(path)) {
      throw new Error('showFile.path must be absolute');
    }
    return Promise.resolve({
      content: [{ type: 'text' as const, text: `Queued upload for ${path}` }],
      details: { path, title: title ?? null },
    });
  },
});
```

## Current Architecture [#current-architecture]

<Mermaid
  chart="sequenceDiagram
participant U as Slack User
participant G as Gorkie
participant D as Daytona Sandbox
participant P as Pi (RPC)
U->>G: request in thread
G->>D: create/attach thread runtime
G->>P: start/resume pi rpc session
P->>D: run commands + edit files
P-->>G: structured events/output
G-->>U: stream updates + final result"
/>

## Demo [#demo]

<VideoPlayer className="max-w-[360px]" aspectRatio="9/16" src="https://vimeo.com/1168112844" />

Vercel recently launched a [Chat SDK](https://chat-sdk.dev/) that supports multiple runtimes. We might rewrite Gorkie on top of it.

## Code [#code]

<GithubRepo repo="{ owner: 'imdevarsh', repo: 'gorkie-slack', branch: 'feat/refactor-pi' }" />


Last updated on August 2, 2026

## my VSCode setup
URL: /blog/vscode-setup
Source: https://raw.githubusercontent.com/techwithanirudh/minimalistic-portfolio/refs/heads/main/content/blog/vscode-setup.mdx
Tags: setup, tools, learning

A custom UI-styled VS Code setup, with links to my real config.



i run a VS Code setup that is customized to feel cleaner and closer to zed.

this post is the exact setup, with links to the real config.

## setup at a glance [#setup-at-a-glance]

* editor: VS Code
* coding agent: [Codex](https://openai.com/codex/)
* primary font: [JetBrainsMono Nerd Font](https://github.com/ryanoasis/nerd-fonts/releases/latest/download/JetBrainsMono.zip)
* themes: [Cursor Light and Cursor Dark](https://marketplace.visualstudio.com/items?itemName=MohdZaid.vscode-cursor-theme)
* icon theme: [Quill Icons](https://marketplace.visualstudio.com/items?itemName=cdonohue.quill-icons)
* UI Tweaks: [Custom UI Style](https://marketplace.visualstudio.com/items?itemName=subframe7536.custom-ui-style) + custom stylesheet

## why this setup [#why-this-setup]

i like zed's UI, but i still want VS Code's ecosystem and remote workflow.

so instead of switching editors, i customized VS Code.

the biggest difference is the custom UI layer, not the extension count.

## how the custom ui started [#how-the-custom-ui-started]

while scrolling twitter, i found stumbled upon a [github discussion](https://github.com/drcika/apc-extension/issues/5#issuecomment-2183959305) with a lot of VS Code custom styles.

the original extension in that thread was deprecated, but i kept the ideas i liked and recreated the look using Custom UI Style.

## config [#config]

<GitHubCode url="https://github.com/techwithanirudh/dotfiles/blob/main/editors/vscode/settings.json" />

## screenshot [#screenshot]

<div className="overflow-hidden">
  <div className="dark:hidden">
    <FramedImage alt="My VS Code setup" height="720" src="/images/uses/vscode-light.png" width="1280" />
  </div>

  <div className="hidden dark:block">
    <FramedImage alt="My VS Code setup" height="720" src="/images/uses/vscode-dark.png" width="1280" />
  </div>
</div>

## extensions [#extensions]

this list is intentionally simple:

* [Auto Rename Tag](https://marketplace.visualstudio.com/items?itemName=formulahendry.auto-rename-tag)
* [Better Comments](https://marketplace.visualstudio.com/items?itemName=aaron-bond.better-comments)
* [Coder](https://marketplace.visualstudio.com/items?itemName=coder.coder-remote)
* [Codex](https://marketplace.visualstudio.com/items?itemName=openai.chatgpt)
* [Cursor Midnight Theme](https://marketplace.visualstudio.com/items?itemName=MohdZaid.vscode-cursor-theme)
* [Custom UI Style](https://marketplace.visualstudio.com/items?itemName=subframe7536.custom-ui-style)
* [ES7+ React/Redux/React-Native Snippets](https://marketplace.visualstudio.com/items?itemName=dsznajder.es7-react-js-snippets)
* [GitHub Pull Requests](https://marketplace.visualstudio.com/items?itemName=GitHub.vscode-pull-request-github)
* [GitLens](https://marketplace.visualstudio.com/items?itemName=eamodio.gitlens)
* [Live Share](https://marketplace.visualstudio.com/items?itemName=MS-vsliveshare.vsliveshare)
* [OpenCode](https://marketplace.visualstudio.com/items?itemName=sst-dev.opencode)
* [Pretty TypeScript Errors](https://marketplace.visualstudio.com/items?itemName=yoavbls.pretty-ts-errors)
* [Remote - SSH](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-ssh)
* [Tailwind CSS IntelliSense](https://marketplace.visualstudio.com/items?itemName=bradlc.vscode-tailwindcss)

thanks again for reading!


Last updated on August 2, 2026

## Hello World
URL: /blog/hello-world
Source: https://raw.githubusercontent.com/techwithanirudh/minimalistic-portfolio/refs/heads/main/content/blog/hello-world.mdx
Tags: intro, tech, learning

An introduction, and what I plan to write about here.



Welcome! I'm **Anirudh**. I like building web and AI projects.\
This site is my basecamp for sharing projects, experiments, and lessons from recent builds and ideas.

I'll keep posts informal behind-the-scenes builds, research notes, and demos from my latest work.

Have a look around, say hello if something sparks your interest, and check back soon for more updates. Glad you're here!


Last updated on August 2, 2026