For PM hiring managers · A Product in Itself

This Portfolio

A portfolio treated as a product, decision trail included.

DecisionTreat case studies as content, not pages: one MDX file per study, so adding or correcting one is a one-file change.

Instead of hand-built pages for each case study.Cost: specs before code slowed every start, and the static v2 cost a full rewrite.

Status
Live
Ownership
Solo · product, content and build
Evidence
Tested: automated tests, no usage data
Checked
Last verified

Treated my own portfolio as a product: six versions between Jan 2026 and Sep 2026, from a single HTML file to a Next.js app with MDX case studies and CI quality gates.

Role
Product manager and builder
Timeline
Jan 2026 – Sep 2026
Team
Solo
My part
Everything: the spec, the success criteria, and the build. Solo.
Stack and tools6

Next.js · React · TypeScript · Three.js · MDX · Framer Motion

Portfolio home page: the headline about owning the problem, the spec, the trade-offs and the evidence, a contents list, and the first featured case studies.

TL;DR

Needed to show PM skills with a non-traditional path into product, not just claim them. I treated the portfolio itself as a product: specs before code, and six versions between Jan 2026 (v1, a single HTML file) and Sep 2026 (v6, case studies as product pages). The current build is a Next.js app with MDX case studies, dynamic OG images, hourly-revalidated GitHub data, and CI that runs lint, unit tests, the build, Playwright end-to-end and accessibility tests, and Lighthouse CI on every push and pull request to main.

6Versions (Jan to Sep 2026)
35Indexable URLs in the sitemap (2 Oct 2026)
4CI jobs on push to main
Chapters

Problem

Breaking into product management with a non-traditional background requires demonstrating PM skills, not just claiming them. A standard resume-style portfolio would not do that; the site needed to be proof of product thinking in itself.

The meta-challenge: the portfolio had to demonstrate the same skills it was showcasing, from research and spec writing to iteration and honest measurement.

Users

Recruiters and hiring managers who skim, and interviewers who read one case study deeply. Before building I reviewed a set of PM portfolios (self-reported: 20 or more) and what reviewers say they look for. The takeaway that shaped every version: depth beats breadth, and one well-documented case study outweighs five bullet points.

Decision

Trade-offs

  • Specs before code. Each version started from a written spec (constitution → spec → plan → tasks), which kept scope crisp at the cost of slower starts.
  • Static first, framework later. v2 was a multi-page static site before the move to Next.js. It taught architecture patterns but cost a rewrite; in hindsight I would have adopted the framework at v2.
  • Honest gates over headline scores. Lighthouse CI asserts thresholds (below), rather than the site quoting a best-case score from one run.

What shipped

VersionWhenArchitectureFocus
v1Jan 2026Single HTML fileContent-first draft
v2Jan–Apr 2026Multi-page static (14 HTML pages)Interaction design: Three.js, GSAP, command palette, dark mode
v3Jan–Apr 2026Next.js migrationApp Router, SSR, route-level organisation
v4Apr 2026 (repo started 18 Apr)Production rebuildMDX case studies, OG images, ISR, GitHub API, accessibility tests
v5Aug 2026Hiring-focused refinementSharper positioning, resume sync, stronger case-study writing
v6Sep 2026Case studies as product pagesDecision-first case studies, claim audit

v2 and v3 have no dated record, so they are placed only between v1 and the v4 repository's first commit. The release notes for the current site are on the changelog, the tools behind it on uses, and the thinking behind treating it as a product in Building a portfolio as a product.

The v2 build was run through the full spec workflow: 56 tasks across 8 phases (self-reported from the project notes at the time).

Under the hoodArchitecture and implementation

MDX for case studies. Each case study is a .mdx file with YAML frontmatter (metrics, navigation, stack) and a Markdown body. The build compiles them into React pages with prev/next navigation, breadcrumbs and SEO metadata.

---
slug: "desktasks"
title: "DeskTasks — The Task Widget That Stays Out of Your Way"
metrics:
  - label: "Failures at the 15 Sep 2026 release gate"
    displayValue: "0"
    kind: product
prevSlug: "aarchid"
nextSlug: "cohort-retention-studio"
---

## Problem
Content renders with full React component support...

Dynamic OG images at the edge. An /og/[...slug] route renders a branded card per page with next/og, on the edge runtime.

GitHub data with ISR. The Projects and About pages fetch repository data through GitHub's GraphQL API and revalidate hourly.

Reusable primitives. SectionLabel, MetricCounter, ScrollReveal and similar components keep the visual system consistent; a command palette reaches every page.

Quality gates. CI runs four jobs on every push and pull request to main:

# Job 1: lint + unit
npm run lint                             # ESLint
npm test                                 # Vitest unit tests
# Job 2: build
npm run build                            # Next.js production build (includes type checking)
# Job 3: Playwright e2e + a11y
npm run test:e2e                         # runs tests/e2e and tests/accessibility
npx playwright test tests/accessibility  # the axe-core checks on their own, locally
# Job 4: Lighthouse CI
npx @lhci/cli autorun                    # thresholds from lighthouserc.json

Validation

What the gates actually enforce, from lighthouserc.json: accessibility must score at least 0.9 and SEO at least 0.95 (failures), while performance and best practices at 0.9, plus FCP, LCP and CLS budgets, are warnings only. Accessibility is also checked with axe-core through Playwright. CI runs these on push and pull request.

Performance, measured 2 October 2026. On a local production build, Lighthouse 13.5.0 mobile tests with simulated throttling improved Home LCP from 4.30 s to 3.23 s and its performance score from 79 to 93 (median of three runs). Across five tested page types, final mobile LCP was 3.12–3.34 s and measured lab CLS was 0. The under-2-second target was not met. These are local lab results, not field Core Web Vitals or a guarantee for visitors.

Accessibility, checked 30 Sep 2026. axe-core reported zero violations at the WCAG 2.2 AA tags across 36 routes, in two themes and two viewports.

Colour contrast is partly machine-unverifiable where text sits on gradients; axe marks those nodes "needs review", and I checked them by pixel sampling instead. None of this replaces a screen-reader pass or a test on a physical phone; both are still open.

The live site at dhruvsinghal.codes returned HTTP 200 on 30 Sep 2026. There is no conversion data: I cannot attribute interviews to the site.

Limits and next

  • No outcome metric. Recruiter behaviour on the site is not measured, so the evidence is the build and its gates, not hiring outcomes.
  • Screenshots are dated. The header image and gallery show the October 2026 build; later changes will not be in them until they are recaptured.
  • What I'd change: jump to Next.js at v2 instead of building a static multi-page site first. The v2 to v3 migration required rewriting all the JavaScript orchestration.

Credits

Solo: spec, design and build. Source: github.com/atavisticrystal6888/Portfolio-v4.

  • Technical

    KiteEdge

    A personal portfolio-analytics desk for one Zerodha account.

    Decision: Analytics only: the tool reads the Kite account and never writes to it, so there is no order placement.

    Solo · personal tool, product and architecture

    PrivateEvidence: Built

    Analytics onlyNever places an order · synthetic data in tests

  • Technical

    TCS NQT Prep Hub

    Free, offline-capable TCS NQT prep with 404 practice questions.

    Decision: Offline-first before anything else: cache the app shell and question bank on first load so it works with the network off.

    Built the web app · question bank started by three other contributors

    LiveEvidence: Built

    404Practice questions (repo README)

  • AI

    Aarchid

    Photograph a sick plant, get a diagnosis you can act on.

    Decision: Require a source link on every recommendation, and judge prompt changes against a fixed golden set, not by feel.

    Co-built with Dilpreet Grover · product, eval, orchestration

    LiveEvidence: Self-reported

    SourcedA source link required on every recommendation · offline eval result withheld; field accuracy not measured