Digital Cookbook
A full-stack recipe management platform with structured recipe authoring, publishing workflows, and cooking-focused interactions.

Overview
Built a digital cookbook experience focused on preserving and managing recipes through structured content workflows. The application includes a responsive recipe experience, protected administration, drag-and-drop editing, image management, and serving-size scaling. It combines Nuxt, Vue, TypeScript, PostgreSQL, and Prisma to deliver a complete full-stack product.
A private family recipe vault for preserving and publishing tried-and-tested recipes through structured authoring and cooking-focused interactions.
Category browsing that survives a refresh
The public recipe list supports both category filtering and search, applied together. Category selection is reflected in the URL, so a filtered view is shareable and restores correctly after a page refresh.
- Search text is currently local to the page rather than URL-synced — a deliberate scope line for this MVP rather than an oversight.

Serving-size scaling without changing the source recipe
Recipe quantities scale live in the reading view at ½×, 1×, 2×, or 3× — recalculated for display only, with nothing written back to the stored recipe.
- Common cooking units (cups, tablespoons, teaspoons) are formatted as friendly fractions; other units fall back to decimals, which is a known trade-off rather than a full unit-conversion system — grams don't convert to kilograms, for instance.
- 'To taste' ingredients and quantities embedded in free text are intentionally left unscaled, since they can't be reliably recalculated.


Recipes as structured content, not blocks of text
Ingredients and steps aren't stored as flat text — each ingredient is a structured object with quantity, unit, name, and category, and each step can be grouped and broken into sub-steps. The admin editor supports drag-and-drop reordering both within a category and between categories.
- Structured data is what makes the recipe page's grouped ingredient lists, multi-part methods, and serving-size scaling possible without parsing formatted text.

A clear boundary between editing and publishing
Every recipe carries an explicit draft or published status, enforced on both public endpoints: the list query filters by status directly, while the detail endpoint returns a 404 for anything that isn't published.
- Admin authentication is fully separate from the public browsing experience, so drafts are never exposed by simply guessing a URL.


