Om
Back to Projects

Portfolio Website

MY DIGITAL GARDEN & SHOWCASE.

Share this

Role

Solo Developer

Timeline

Jan 2024 - Present

Portfolio Website screenshot 1
Portfolio Website screenshot 2
Portfolio Website screenshot 3
Portfolio Website screenshot 4
Portfolio Website screenshot 5
Portfolio Website screenshot 6

The Vision

This website isn't just a portfolio; it's a 'digital garden'. A place where ideas grow, projects are showcased with depth, and my engineering philosophy is put into practice. It moves away from standard 'link-tree' style portfolios to offer a rich, narrative-driven experience.

The Problem

Most developer portfolios are just grids of project cards with a GitHub link. They show what you built but skip everything interesting. The decisions you made, why you picked one approach over another, the stuff that went wrong and how you fixed it. I wanted a place where I could actually explain my work instead of just displaying it. I also needed something flexible. Long articles, code examples, screenshots, maybe embedded demos. A traditional CMS would lock me into their structure. I wanted full control over how things look and work.

Who This Is For

Recruiters trying to understand how I think. Other engineers who want to see real implementation details. Anyone who cares about the craft, the process, the reasoning behind the work.

Engineering Strategy

The technical reasoning behind the implementation.

Why Next.js App Router

The App Router uses React Server Components by default. That means pages that are just text and images get sent as plain HTML with basically zero JavaScript. For a content site, that's huge. Everything loads fast because browsers have less work to do. The project detail pages get built ahead of time using generateStaticParams. Next.js looks at my project data, generates every /project/[slug] page during the build, and serves them as static files from a CDN. Someone clicks a link, they get instant HTML. No server processing, no loading states, just the page. I also like that data fetching happens right in the component file. The project page fetches its own content from my config files directly. Everything lives together instead of being scattered across API routes and useEffect hooks.

Why MDX

MDX lets me write in Markdown but use React components when I need them. Most of the time I'm just writing paragraphs and lists like normal. But if I want to show how a button works, I can import the actual component and drop it right in the text. People see the real thing instead of a screenshot. I set up a system that splits each MDX file into two parts. The frontmatter at the top (title, date, tags) becomes metadata I can query. The content body gets compiled separately. So I can do things like "find all projects from 2024 that use TypeScript" while still writing everything in regular Markdown files. It's like a database but the source files are just text I can edit in any editor. All the MDX compilation happens during the build. When someone visits the site, the processing is already done. They get the final HTML immediately.

Why Tailwind CSS

Tailwind keeps me moving. I write a component and style it right there in the same file. No jumping between JavaScript and CSS files, no thinking up class names, no wondering if changing one style will break something else. I defined all my colors and spacing values in the Tailwind config once. Things like bg-background and text-foreground instead of specific hex codes. When I wanted to switch to the monochrome look, I just updated those definitions. Every component using those tokens updated automatically. The brutalist borders and shadows are just utility classes like border-2 and shadow-lg. If I ever want to redesign, I change the config file and everything flows through. I'm styling with a system instead of fighting individual CSS rules.

Why TypeScript

TypeScript catches mistakes before they become problems. I defined what a project object looks like: it needs a title, slug, tech stack, image gallery. If I add a new project and forget the description field, the build breaks immediately and tells me exactly what's missing. This saved me when I reorganized how the tech deep dive sections work. I changed the data structure, and TypeScript showed me every single place in the UI that needed updating. Without it, I would've shipped broken pages and found out through 404 errors or weird layouts. It also makes adding features easier. I know exactly what data I have access to at any point. The autocomplete shows me valid fields. I spend less time checking documentation and more time building.

Technologies

Framework
Next.js 14 for Server Components and SSG.
Styling
Tailwind CSS v4 for zero-runtime styling.
Content
MDX for mixing content with code.
Type Safety
TypeScript for robust data modeling.

Core Features

  • MDX Content EngineWrite content in Markdown, embed interactive React components directly in the flow.
  • Bento Grid LayoutA modern, responsive grid system for showcasing key stats and links.
  • Code HighlightingCustom-built code block styling within project narratives.
  • Dynamic Project DataCentralized data source feeding the homepage, listing, and detail pages.
  • Dark Mode DefaultA developer-centric aesthetic with high contrast and focus.