← Portfolio
sergiomonsalve.com
2026-05-01active

sergiomonsalve.com

Full Stack Developer

The problem

A personal portfolio needs to be two things at once: a professional showcase that communicates technical judgment, and a genuinely personal space that reflects who you are beyond the code. Most developer portfolios fall into one of two extremes — either a static CV with a list of projects, or a design experiment that prioritizes form over content.

The challenge was to build something that demonstrated real technical depth not just in what it shows, but in how it's built: solid architecture, clean code, non-trivial features — without losing the site's personal voice.

The solution

sergiomonsalve.com is a site with multiple layers of depth: on the surface, a portfolio and blog; underneath, a complete system with authentication, a database, internationalization, and an admin panel built from scratch.

The main sections:

  • Blog — technical articles with admin-moderated comments
  • Portfolio — MDX case studies with architecture details and technical decisions
  • Recipes — a personal recipe collection (because cooking is part of who I am)
  • Library — Audible CLI integration to track books I'm reading, with notes, highlights, and personal reviews. Supports adding physical books via Google Books and Open Library search
  • Guestbook — visitor book with OAuth (GitHub and Google)
  • Admin panel — full interface for moderating comments, signatures, and managing the library from the browser

Technical decisions

Next.js 16 App Router — the most technically demanding choice because the App Router fundamentally changes the mental model: server components, async layouts, streaming. Using it correctly (not just as a React wrapper) requires understanding what renders where and why. The site mixes server components for data, client components for interactivity, and API routes for authenticated operations.

next-intl for i18n — full internationalization in Spanish and English with localized routes (/es, /en). All copy in locale-specific JSON files. Type-safe navigation imported from @/i18n/navigation instead of next/navigation.

Supabase as backend — magic link auth, database for comments, signatures, library books (manual_books, book_notes, library_books tables), and OAuth guestbook. API routes use createAdminClient() with service role for privileged operations, createClient() with cookie-based session for user operations.

MDX file-based content — blog, recipes, and portfolio are .mdx files in the filesystem. No CMS. Publishing new content means making a commit. The system uses gray-matter to parse frontmatter and next-mdx-remote to render content.

Audible CLI + unified library — an import script normalizes the JSON exported by audible-cli to the internal schema. Books are merged with manually-added ones (from any source) into a unified view via UnifiedBook, applying Supabase overrides for visibility and status.

Owner mode — when the admin is authenticated on the public site, the nav shows a green indicator and a dropdown with direct access to the admin panel. In the library, each card shows a button on hover to edit notes.

Results

This site is the most complete technical project I've built for real use — not as a technical assessment, but as a tool I use every day. Every feature exists for a reason: the admin panel because I don't want to open Supabase just to moderate a comment, the library because I want to track what I read without depending on Goodreads, the recipes because I cook with mushrooms and want a place to document what works.

The architecture is designed to grow: adding a new section means creating a directory in content/ and writing the corresponding lib. The pattern is already established.