Here's the technology stack that makes me the most productive, allowing me to build scalable, high-performance applications efficiently. Over the years, I've refined my workflow with the best tools and frameworks that align with modern development practices, optimizing for both speed and maintainability.
Framework (Next.js and React)
I've been working with Next.js for years, and it remains my go-to framework for building web applications. Its hybrid rendering capabilities, including Server Components, Server Actions, and Static Generation, provide the flexibility I need for various use cases. React continues to be at the core of my development workflow, and I always start new projects with TypeScript for type safety and maintainability.
Other tools integrated into my Next.js applications include:
- Resend - For handling transactional emails efficiently, ensuring seamless email delivery for user notifications, verifications, and alerts.
- Stripe - For payment processing, making it easy to integrate secure, reliable transactions for eCommerce and subscription-based applications.
- Zod - Works seamlessly with React 19's form features like Server Actions and
useActionState
, providing strong runtime validation and type safety. - usehooks-ts - A collection of reusable hooks that streamline React development by providing well-optimized utilities for handling common use cases like debouncing, local storage, and event listeners.
- Motion - For creating smooth animations and transitions, enhancing the user experience with visually appealing effects and interactions.
This combination of tools enhances my development process, allowing me to build robust, scalable applications with ease.
Styling (Tailwind CSS)
Tailwind CSS remains my preferred styling framework due to its flexibility and efficiency. Its utility-first approach allows me to write styles directly in my components, eliminating the need for separate stylesheets while maintaining a clean and maintainable codebase.
The latest improvements bring built-in CSS variables, dynamic utility values, and a modernized color system, making it even easier to create responsive and visually appealing interfaces. Features like container queries and expanded gradient APIs enhance design possibilities without requiring additional dependencies.
With its seamless integration into modern workflows and minimal configuration requirements, Tailwind CSS enables me to build consistent and scalable designs faster than ever.
UI Components (shadcn/ui)
For building reusable UI components, I use shadcn/ui, which provides an extensive set of beautifully-designed, accessible and easy to customize components. This library pairs perfectly with Tailwind CSS, allowing me to create a cohesive, high-quality design system while ensuring a seamless development experience.
With built-in support for complex UI elements like modals, tooltips, and dropdowns, shadcn/ui helps me quickly create polished and accessible interfaces without unnecessary bloat.
Database (Postgres + Supabase + Drizzle)
For databases, I rely on Postgres, a powerful relational database known for its reliability, scalability, and advanced features. I use Supabase as my managed backend, which simplifies authentication, real-time subscriptions, and storage while providing an excellent developer experience.
To interact with Postgres efficiently, I use Drizzle ORM, which offers:
- Type-safe queries - Ensuring safer database interactions with full TypeScript support.
- Schema migrations - Managed through Drizzle Kit, making it easy to evolve the database schema without issues.
- Drizzle Studio - A lightweight tool for visualizing and managing data effortlessly.
Drizzle's simplicity and type safety make it a great alternative to traditional ORMs, allowing me to work with databases efficiently without unnecessary complexity. With Postgres handling structured data and Supabase providing additional backend services, my database layer is well-optimized for performance and scalability.
AI (Claude)
AI has become an essential part of my development workflow, and Claude is my primary AI assistant. It helps streamline my coding process by providing intelligent suggestions, debugging assistance, and automated refactoring. Its deep understanding of modern web technologies ensures that its suggestions align well with best practices.
Beyond coding, I also rely on Claude for brainstorming ideas, drafting technical documentation, and enhancing productivity. It assists with writing clear and structured blog posts, generating API documentation, and even providing insights into architectural decisions.
While AI isn't a replacement for problem-solving, having an intelligent assistant like Claude helps me focus on higher-level development work, reducing the time spent on repetitive tasks and improving overall efficiency.
Other Tools I Use Occasionally
While the above stack covers most of my daily work, I also use the following tools occasionally for specific tasks:
Node.js & Deno
I've extensively used Node.js for backend development, but I'm transitioning to Deno due to its built-in security, modern module system, and native TypeScript support. While I still rely on Node.js for existing projects and traditional server-side applications, I find Deno's streamlined developer experience and improved runtime features increasingly valuable for building new tools, APIs, and lightweight backend services.
Rust 🎓
I'm actively learning Rust and exploring its capabilities by building small projects. I'm particularly interested in its memory safety guarantees, strong type system, and concurrency model, which make it a compelling choice for performance-critical applications. As I dive deeper, I'm experimenting with low-level system programming, CLI tools, and optimized backend services to better understand Rust's potential.