claude-skills/skills/engineering/codebase-onboarding/index.html
2026-03-10 01:08:58 +01:00

7271 lines
No EOL
152 KiB
HTML

<!doctype html>
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="description" content="Codebase Onboarding - Claude Code skill from the Engineering - POWERFUL domain.">
<meta name="author" content="Alireza Rezvani">
<link rel="canonical" href="https://alirezarezvani.github.io/claude-skills/skills/engineering/codebase-onboarding/">
<link rel="prev" href="../ci-cd-pipeline-builder/">
<link rel="next" href="../database-designer/">
<link rel="icon" href="../../../assets/images/favicon.png">
<meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.4">
<title>Codebase Onboarding - Claude Code Skills & Plugins</title>
<link rel="stylesheet" href="../../../assets/stylesheets/main.484c7ddc.min.css">
<link rel="stylesheet" href="../../../assets/stylesheets/palette.ab4e12ef.min.css">
<style>:root{--md-annotation-icon:url('data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20viewBox%3D%220%200%2024%2024%22%3E%3Cpath%20d%3D%22M22%2012a10%2010%200%200%201-10%2010A10%2010%200%200%201%202%2012%2010%2010%200%200%201%2012%202a10%2010%200%200%201%2010%2010m-12%206%206-6-6-6-1.4%201.4%204.6%204.6-4.6%204.6z%22/%3E%3C/svg%3E');}</style>
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Inter:300,300i,400,400i,700,700i%7CJetBrains+Mono:400,400i,700,700i&display=fallback">
<style>:root{--md-text-font:"Inter";--md-code-font:"JetBrains Mono"}</style>
<link rel="stylesheet" href="../../../stylesheets/extra.css">
<script>__md_scope=new URL("../../..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
<!-- Google tag (gtag.js) -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-VHRY2VKY9K"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'G-VHRY2VKY9K');
</script>
</head>
<body dir="ltr" data-md-color-scheme="slate" data-md-color-primary="deep-purple" data-md-color-accent="deep-purple">
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
<label class="md-overlay" for="__drawer"></label>
<div data-md-component="skip">
<a href="#codebase-onboarding" class="md-skip">
Skip to content
</a>
</div>
<div data-md-component="announce">
</div>
<header class="md-header md-header--shadow md-header--lifted" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="Header">
<a href="../../.." title="Claude Code Skills &amp; Plugins" class="md-header__button md-logo" aria-label="Claude Code Skills & Plugins" data-md-component="logo">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54"/></svg>
</a>
<label class="md-header__button md-icon" for="__drawer">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
</label>
<div class="md-header__title" data-md-component="header-title">
<div class="md-header__ellipsis">
<div class="md-header__topic">
<span class="md-ellipsis">
Claude Code Skills & Plugins
</span>
</div>
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
Codebase Onboarding
</span>
</div>
</div>
</div>
<form class="md-header__option" data-md-component="palette">
<input class="md-option" data-md-color-media="(prefers-color-scheme)" data-md-color-scheme="slate" data-md-color-primary="deep-purple" data-md-color-accent="deep-purple" aria-label="Switch to light mode" type="radio" name="__palette" id="__palette_0">
<label class="md-header__button md-icon" title="Switch to light mode" for="__palette_1" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 18c-.89 0-1.74-.2-2.5-.55C11.56 16.5 13 14.42 13 12s-1.44-4.5-3.5-5.45C10.26 6.2 11.11 6 12 6a6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg>
</label>
<input class="md-option" data-md-color-media="(prefers-color-scheme: light)" data-md-color-scheme="default" data-md-color-primary="deep-purple" data-md-color-accent="deep-purple" aria-label="Switch to dark mode" type="radio" name="__palette" id="__palette_1">
<label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_0" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a4 4 0 0 0-4 4 4 4 0 0 0 4 4 4 4 0 0 0 4-4 4 4 0 0 0-4-4m0 10a6 6 0 0 1-6-6 6 6 0 0 1 6-6 6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg>
</label>
</form>
<script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script>
<label class="md-header__button md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
</label>
<div class="md-search" data-md-component="search" role="dialog">
<label class="md-search__overlay" for="__search"></label>
<div class="md-search__inner" role="search">
<form class="md-search__form" name="search">
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
<label class="md-search__icon md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
</label>
<nav class="md-search__options" aria-label="Search">
<a href="javascript:void(0)" class="md-search__icon md-icon" title="Share" aria-label="Share" data-clipboard data-clipboard-text="" data-md-component="search-share" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M18 16.08c-.76 0-1.44.3-1.96.77L8.91 12.7c.05-.23.09-.46.09-.7s-.04-.47-.09-.7l7.05-4.11c.54.5 1.25.81 2.04.81a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3c0 .24.04.47.09.7L8.04 9.81C7.5 9.31 6.79 9 6 9a3 3 0 0 0-3 3 3 3 0 0 0 3 3c.79 0 1.5-.31 2.04-.81l7.12 4.15c-.05.21-.08.43-.08.66 0 1.61 1.31 2.91 2.92 2.91s2.92-1.3 2.92-2.91A2.92 2.92 0 0 0 18 16.08"/></svg>
</a>
<button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
</button>
</nav>
<div class="md-search__suggest" data-md-component="search-suggest"></div>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
<div class="md-search-result" data-md-component="search-result">
<div class="md-search-result__meta">
Initializing search
</div>
<ol class="md-search-result__list" role="presentation"></ol>
</div>
</div>
</div>
</div>
</div>
<div class="md-header__source">
<a href="https://github.com/alirezarezvani/claude-skills" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg>
</div>
<div class="md-source__repository">
alirezarezvani/claude-skills
</div>
</a>
</div>
</nav>
<nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
<div class="md-grid">
<ul class="md-tabs__list">
<li class="md-tabs__item">
<a href="../../.." class="md-tabs__link">
Home
</a>
</li>
<li class="md-tabs__item">
<a href="../../../getting-started/" class="md-tabs__link">
Getting Started
</a>
</li>
<li class="md-tabs__item md-tabs__item--active">
<a href="../../engineering-team/" class="md-tabs__link">
Skills
</a>
</li>
</ul>
</div>
</nav>
</header>
<div class="md-container" data-md-component="container">
<main class="md-main" data-md-component="main">
<div class="md-main__inner md-grid">
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0">
<label class="md-nav__title" for="__drawer">
<a href="../../.." title="Claude Code Skills &amp; Plugins" class="md-nav__button md-logo" aria-label="Claude Code Skills & Plugins" data-md-component="logo">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54"/></svg>
</a>
Claude Code Skills & Plugins
</label>
<div class="md-nav__source">
<a href="https://github.com/alirezarezvani/claude-skills" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg>
</div>
<div class="md-source__repository">
alirezarezvani/claude-skills
</div>
</a>
</div>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../.." class="md-nav__link">
<span class="md-ellipsis">
Home
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../getting-started/" class="md-nav__link">
<span class="md-ellipsis">
Getting Started
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3" checked>
<label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex="">
<span class="md-ellipsis">
Skills
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="true">
<label class="md-nav__title" for="__nav_3">
<span class="md-nav__icon md-icon"></span>
Skills
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_3_1" >
<div class="md-nav__link md-nav__container">
<a href="../../engineering-team/" class="md-nav__link ">
<span class="md-ellipsis">
Engineering - Core
</span>
</a>
<label class="md-nav__link " for="__nav_3_1" id="__nav_3_1_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_3_1_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_3_1">
<span class="md-nav__icon md-icon"></span>
Engineering - Core
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../engineering-team/aws-solution-architect/" class="md-nav__link">
<span class="md-ellipsis">
AWS Solution Architect
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../engineering-team/code-reviewer/" class="md-nav__link">
<span class="md-ellipsis">
Code Reviewer
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../engineering-team/email-template-builder/" class="md-nav__link">
<span class="md-ellipsis">
Email Template Builder
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../engineering-team/incident-commander/" class="md-nav__link">
<span class="md-ellipsis">
Incident Commander
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../engineering-team/ms365-tenant-manager/" class="md-nav__link">
<span class="md-ellipsis">
Microsoft 365 Tenant Manager
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_3_1_7" >
<label class="md-nav__link" for="__nav_3_1_7" id="__nav_3_1_7_label" tabindex="0">
<span class="md-ellipsis">
Playwright Pro
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="3" aria-labelledby="__nav_3_1_7_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_3_1_7">
<span class="md-nav__icon md-icon"></span>
Playwright Pro
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../engineering-team/playwright-pro/" class="md-nav__link">
<span class="md-ellipsis">
Playwright Pro
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../engineering-team/playwright-pro-browserstack/" class="md-nav__link">
<span class="md-ellipsis">
BrowserStack Integration
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../engineering-team/playwright-pro-coverage/" class="md-nav__link">
<span class="md-ellipsis">
Coverage Analysis
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../engineering-team/playwright-pro-fix/" class="md-nav__link">
<span class="md-ellipsis">
Fix Flaky Tests
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../engineering-team/playwright-pro-generate/" class="md-nav__link">
<span class="md-ellipsis">
Generate Tests
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../engineering-team/playwright-pro-init/" class="md-nav__link">
<span class="md-ellipsis">
Initialize Project
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../engineering-team/playwright-pro-migrate/" class="md-nav__link">
<span class="md-ellipsis">
Migrate to Playwright
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../engineering-team/playwright-pro-report/" class="md-nav__link">
<span class="md-ellipsis">
Smart Reporting
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../engineering-team/playwright-pro-review/" class="md-nav__link">
<span class="md-ellipsis">
Review Tests
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../engineering-team/playwright-pro-testrail/" class="md-nav__link">
<span class="md-ellipsis">
TestRail Integration
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_3_1_8" >
<label class="md-nav__link" for="__nav_3_1_8" id="__nav_3_1_8_label" tabindex="0">
<span class="md-ellipsis">
Self-Improving Agent
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="3" aria-labelledby="__nav_3_1_8_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_3_1_8">
<span class="md-nav__icon md-icon"></span>
Self-Improving Agent
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../engineering-team/self-improving-agent/" class="md-nav__link">
<span class="md-ellipsis">
Self-Improving Agent
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../engineering-team/self-improving-agent-extract/" class="md-nav__link">
<span class="md-ellipsis">
Extract Skills
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../engineering-team/self-improving-agent-promote/" class="md-nav__link">
<span class="md-ellipsis">
Promote Learnings
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../engineering-team/self-improving-agent-remember/" class="md-nav__link">
<span class="md-ellipsis">
Remember Knowledge
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../engineering-team/self-improving-agent-review/" class="md-nav__link">
<span class="md-ellipsis">
Review Memory
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../engineering-team/self-improving-agent-status/" class="md-nav__link">
<span class="md-ellipsis">
Memory Status
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../../engineering-team/senior-architect/" class="md-nav__link">
<span class="md-ellipsis">
Senior Architect
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../engineering-team/senior-backend/" class="md-nav__link">
<span class="md-ellipsis">
Senior Backend Engineer
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../engineering-team/senior-computer-vision/" class="md-nav__link">
<span class="md-ellipsis">
Senior Computer Vision Engineer
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../engineering-team/senior-data-engineer/" class="md-nav__link">
<span class="md-ellipsis">
Senior Data Engineer
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../engineering-team/senior-data-scientist/" class="md-nav__link">
<span class="md-ellipsis">
Senior Data Scientist
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../engineering-team/senior-devops/" class="md-nav__link">
<span class="md-ellipsis">
Senior DevOps
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../engineering-team/senior-frontend/" class="md-nav__link">
<span class="md-ellipsis">
Senior Frontend
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../engineering-team/senior-fullstack/" class="md-nav__link">
<span class="md-ellipsis">
Senior Fullstack
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../engineering-team/senior-ml-engineer/" class="md-nav__link">
<span class="md-ellipsis">
Senior ML Engineer
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../engineering-team/senior-prompt-engineer/" class="md-nav__link">
<span class="md-ellipsis">
Senior Prompt Engineer
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../engineering-team/senior-qa/" class="md-nav__link">
<span class="md-ellipsis">
Senior QA Engineer
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../engineering-team/senior-secops/" class="md-nav__link">
<span class="md-ellipsis">
Senior SecOps Engineer
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../engineering-team/senior-security/" class="md-nav__link">
<span class="md-ellipsis">
Senior Security Engineer
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../engineering-team/stripe-integration-expert/" class="md-nav__link">
<span class="md-ellipsis">
Stripe Integration Expert
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../engineering-team/tdd-guide/" class="md-nav__link">
<span class="md-ellipsis">
TDD Guide
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../engineering-team/tech-stack-evaluator/" class="md-nav__link">
<span class="md-ellipsis">
Tech Stack Evaluator
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3_2" checked>
<div class="md-nav__link md-nav__container">
<a href="../" class="md-nav__link ">
<span class="md-ellipsis">
Engineering - POWERFUL
</span>
</a>
<label class="md-nav__link " for="__nav_3_2" id="__nav_3_2_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_3_2_label" aria-expanded="true">
<label class="md-nav__title" for="__nav_3_2">
<span class="md-nav__icon md-icon"></span>
Engineering - POWERFUL
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../agent-designer/" class="md-nav__link">
<span class="md-ellipsis">
Agent Designer
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../agent-workflow-designer/" class="md-nav__link">
<span class="md-ellipsis">
Agent Workflow Designer
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../api-design-reviewer/" class="md-nav__link">
<span class="md-ellipsis">
API Design Reviewer
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../api-test-suite-builder/" class="md-nav__link">
<span class="md-ellipsis">
API Test Suite Builder
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../changelog-generator/" class="md-nav__link">
<span class="md-ellipsis">
Changelog Generator
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../ci-cd-pipeline-builder/" class="md-nav__link">
<span class="md-ellipsis">
CI/CD Pipeline Builder
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--active">
<input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
<a href="./" class="md-nav__link md-nav__link--active">
<span class="md-ellipsis">
Codebase Onboarding
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../database-designer/" class="md-nav__link">
<span class="md-ellipsis">
Database Designer
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../database-schema-designer/" class="md-nav__link">
<span class="md-ellipsis">
Database Schema Designer
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../dependency-auditor/" class="md-nav__link">
<span class="md-ellipsis">
Dependency Auditor
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../env-secrets-manager/" class="md-nav__link">
<span class="md-ellipsis">
Env & Secrets Manager
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../git-worktree-manager/" class="md-nav__link">
<span class="md-ellipsis">
Git Worktree Manager
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../interview-system-designer/" class="md-nav__link">
<span class="md-ellipsis">
Interview System Designer
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../mcp-server-builder/" class="md-nav__link">
<span class="md-ellipsis">
MCP Server Builder
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../migration-architect/" class="md-nav__link">
<span class="md-ellipsis">
Migration Architect
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../monorepo-navigator/" class="md-nav__link">
<span class="md-ellipsis">
Monorepo Navigator
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../observability-designer/" class="md-nav__link">
<span class="md-ellipsis">
Observability Designer
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../performance-profiler/" class="md-nav__link">
<span class="md-ellipsis">
Performance Profiler
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../pr-review-expert/" class="md-nav__link">
<span class="md-ellipsis">
PR Review Expert
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../rag-architect/" class="md-nav__link">
<span class="md-ellipsis">
RAG Architect
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../release-manager/" class="md-nav__link">
<span class="md-ellipsis">
Release Manager
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../runbook-generator/" class="md-nav__link">
<span class="md-ellipsis">
Runbook Generator
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../skill-security-auditor/" class="md-nav__link">
<span class="md-ellipsis">
Skill Security Auditor
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../skill-tester/" class="md-nav__link">
<span class="md-ellipsis">
Skill Tester
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../tech-debt-tracker/" class="md-nav__link">
<span class="md-ellipsis">
Tech Debt Tracker
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_3_3" >
<div class="md-nav__link md-nav__container">
<a href="../../product-team/" class="md-nav__link ">
<span class="md-ellipsis">
Product
</span>
</a>
<label class="md-nav__link " for="__nav_3_3" id="__nav_3_3_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_3_3_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_3_3">
<span class="md-nav__icon md-icon"></span>
Product
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../product-team/agile-product-owner/" class="md-nav__link">
<span class="md-ellipsis">
Agile Product Owner
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../product-team/competitive-teardown/" class="md-nav__link">
<span class="md-ellipsis">
Competitive Teardown
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../product-team/landing-page-generator/" class="md-nav__link">
<span class="md-ellipsis">
Landing Page Generator
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../product-team/product-manager-toolkit/" class="md-nav__link">
<span class="md-ellipsis">
Product Manager Toolkit
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../product-team/product-strategist/" class="md-nav__link">
<span class="md-ellipsis">
Product Strategist
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../product-team/saas-scaffolder/" class="md-nav__link">
<span class="md-ellipsis">
SaaS Scaffolder
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../product-team/ui-design-system/" class="md-nav__link">
<span class="md-ellipsis">
UI Design System
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../product-team/ux-researcher-designer/" class="md-nav__link">
<span class="md-ellipsis">
UX Researcher & Designer
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_3_4" >
<div class="md-nav__link md-nav__container">
<a href="../../marketing-skill/" class="md-nav__link ">
<span class="md-ellipsis">
Marketing
</span>
</a>
<label class="md-nav__link " for="__nav_3_4" id="__nav_3_4_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_3_4_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_3_4">
<span class="md-nav__icon md-icon"></span>
Marketing
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../marketing-skill/ab-test-setup/" class="md-nav__link">
<span class="md-ellipsis">
A/B Test Setup
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../marketing-skill/ad-creative/" class="md-nav__link">
<span class="md-ellipsis">
Ad Creative
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../marketing-skill/ai-seo/" class="md-nav__link">
<span class="md-ellipsis">
AI SEO
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../marketing-skill/analytics-tracking/" class="md-nav__link">
<span class="md-ellipsis">
Analytics Tracking
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../marketing-skill/app-store-optimization/" class="md-nav__link">
<span class="md-ellipsis">
App Store Optimization
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../marketing-skill/brand-guidelines/" class="md-nav__link">
<span class="md-ellipsis">
Brand Guidelines
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../marketing-skill/campaign-analytics/" class="md-nav__link">
<span class="md-ellipsis">
Campaign Analytics
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../marketing-skill/churn-prevention/" class="md-nav__link">
<span class="md-ellipsis">
Churn Prevention
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../marketing-skill/cold-email/" class="md-nav__link">
<span class="md-ellipsis">
Cold Email Outreach
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../marketing-skill/competitor-alternatives/" class="md-nav__link">
<span class="md-ellipsis">
Competitor Alternatives
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../marketing-skill/content-creator/" class="md-nav__link">
<span class="md-ellipsis">
Content Creator
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../marketing-skill/content-humanizer/" class="md-nav__link">
<span class="md-ellipsis">
Content Humanizer
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../marketing-skill/content-production/" class="md-nav__link">
<span class="md-ellipsis">
Content Production
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../marketing-skill/content-strategy/" class="md-nav__link">
<span class="md-ellipsis">
Content Strategy
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../marketing-skill/copy-editing/" class="md-nav__link">
<span class="md-ellipsis">
Copy Editing
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../marketing-skill/copywriting/" class="md-nav__link">
<span class="md-ellipsis">
Copywriting
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../marketing-skill/email-sequence/" class="md-nav__link">
<span class="md-ellipsis">
Email Sequence Design
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../marketing-skill/form-cro/" class="md-nav__link">
<span class="md-ellipsis">
Form CRO
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../marketing-skill/free-tool-strategy/" class="md-nav__link">
<span class="md-ellipsis">
Free Tool Strategy
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../marketing-skill/launch-strategy/" class="md-nav__link">
<span class="md-ellipsis">
Launch Strategy
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../marketing-skill/marketing-context/" class="md-nav__link">
<span class="md-ellipsis">
Marketing Context
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../marketing-skill/marketing-demand-acquisition/" class="md-nav__link">
<span class="md-ellipsis">
Marketing Demand & Acquisition
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../marketing-skill/marketing-ideas/" class="md-nav__link">
<span class="md-ellipsis">
Marketing Ideas
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../marketing-skill/marketing-ops/" class="md-nav__link">
<span class="md-ellipsis">
Marketing Ops
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../marketing-skill/marketing-psychology/" class="md-nav__link">
<span class="md-ellipsis">
Marketing Psychology
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../marketing-skill/marketing-skill/" class="md-nav__link">
<span class="md-ellipsis">
Marketing Division
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../marketing-skill/marketing-strategy-pmm/" class="md-nav__link">
<span class="md-ellipsis">
Marketing Strategy & PMM
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../marketing-skill/onboarding-cro/" class="md-nav__link">
<span class="md-ellipsis">
Onboarding CRO
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../marketing-skill/page-cro/" class="md-nav__link">
<span class="md-ellipsis">
Page CRO
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../marketing-skill/paid-ads/" class="md-nav__link">
<span class="md-ellipsis">
Paid Ads
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../marketing-skill/paywall-upgrade-cro/" class="md-nav__link">
<span class="md-ellipsis">
Paywall CRO
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../marketing-skill/popup-cro/" class="md-nav__link">
<span class="md-ellipsis">
Popup CRO
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../marketing-skill/pricing-strategy/" class="md-nav__link">
<span class="md-ellipsis">
Pricing Strategy
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../marketing-skill/programmatic-seo/" class="md-nav__link">
<span class="md-ellipsis">
Programmatic SEO
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../marketing-skill/prompt-engineer-toolkit/" class="md-nav__link">
<span class="md-ellipsis">
Prompt Engineer Toolkit
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../marketing-skill/referral-program/" class="md-nav__link">
<span class="md-ellipsis">
Referral Program
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../marketing-skill/schema-markup/" class="md-nav__link">
<span class="md-ellipsis">
Schema Markup
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../marketing-skill/seo-audit/" class="md-nav__link">
<span class="md-ellipsis">
SEO Audit
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../marketing-skill/signup-flow-cro/" class="md-nav__link">
<span class="md-ellipsis">
Signup Flow CRO
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../marketing-skill/site-architecture/" class="md-nav__link">
<span class="md-ellipsis">
Site Architecture
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../marketing-skill/social-content/" class="md-nav__link">
<span class="md-ellipsis">
Social Content
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../marketing-skill/social-media-analyzer/" class="md-nav__link">
<span class="md-ellipsis">
Social Media Analyzer
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../marketing-skill/social-media-manager/" class="md-nav__link">
<span class="md-ellipsis">
Social Media Manager
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_3_5" >
<div class="md-nav__link md-nav__container">
<a href="../../project-management/" class="md-nav__link ">
<span class="md-ellipsis">
Project Management
</span>
</a>
<label class="md-nav__link " for="__nav_3_5" id="__nav_3_5_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_3_5_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_3_5">
<span class="md-nav__icon md-icon"></span>
Project Management
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../project-management/atlassian-admin/" class="md-nav__link">
<span class="md-ellipsis">
Atlassian Admin
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../project-management/atlassian-templates/" class="md-nav__link">
<span class="md-ellipsis">
Atlassian Templates
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../project-management/confluence-expert/" class="md-nav__link">
<span class="md-ellipsis">
Confluence Expert
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../project-management/jira-expert/" class="md-nav__link">
<span class="md-ellipsis">
Jira Expert
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../project-management/scrum-master/" class="md-nav__link">
<span class="md-ellipsis">
Scrum Master
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../project-management/senior-pm/" class="md-nav__link">
<span class="md-ellipsis">
Senior PM
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_3_6" >
<div class="md-nav__link md-nav__container">
<a href="../../c-level-advisor/" class="md-nav__link ">
<span class="md-ellipsis">
C-Level Advisory
</span>
</a>
<label class="md-nav__link " for="__nav_3_6" id="__nav_3_6_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_3_6_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_3_6">
<span class="md-nav__icon md-icon"></span>
C-Level Advisory
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../c-level-advisor/agent-protocol/" class="md-nav__link">
<span class="md-ellipsis">
Agent Protocol
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../c-level-advisor/board-deck-builder/" class="md-nav__link">
<span class="md-ellipsis">
Board Deck Builder
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../c-level-advisor/board-meeting/" class="md-nav__link">
<span class="md-ellipsis">
Board Meeting
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../c-level-advisor/c-level-advisor/" class="md-nav__link">
<span class="md-ellipsis">
C-Level Ecosystem
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../c-level-advisor/ceo-advisor/" class="md-nav__link">
<span class="md-ellipsis">
CEO Advisor
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../c-level-advisor/cfo-advisor/" class="md-nav__link">
<span class="md-ellipsis">
CFO Advisor
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../c-level-advisor/change-management/" class="md-nav__link">
<span class="md-ellipsis">
Change Management
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../c-level-advisor/chief-of-staff/" class="md-nav__link">
<span class="md-ellipsis">
Chief of Staff
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../c-level-advisor/chro-advisor/" class="md-nav__link">
<span class="md-ellipsis">
CHRO Advisor
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../c-level-advisor/ciso-advisor/" class="md-nav__link">
<span class="md-ellipsis">
CISO Advisor
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../c-level-advisor/cmo-advisor/" class="md-nav__link">
<span class="md-ellipsis">
CMO Advisor
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../c-level-advisor/company-os/" class="md-nav__link">
<span class="md-ellipsis">
Company OS
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../c-level-advisor/competitive-intel/" class="md-nav__link">
<span class="md-ellipsis">
Competitive Intel
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../c-level-advisor/context-engine/" class="md-nav__link">
<span class="md-ellipsis">
Context Engine
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../c-level-advisor/coo-advisor/" class="md-nav__link">
<span class="md-ellipsis">
COO Advisor
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../c-level-advisor/cpo-advisor/" class="md-nav__link">
<span class="md-ellipsis">
CPO Advisor
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../c-level-advisor/cro-advisor/" class="md-nav__link">
<span class="md-ellipsis">
CRO Advisor
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../c-level-advisor/cs-onboard/" class="md-nav__link">
<span class="md-ellipsis">
C-Suite Onboarding
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../c-level-advisor/cto-advisor/" class="md-nav__link">
<span class="md-ellipsis">
CTO Advisor
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../c-level-advisor/culture-architect/" class="md-nav__link">
<span class="md-ellipsis">
Culture Architect
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../c-level-advisor/decision-logger/" class="md-nav__link">
<span class="md-ellipsis">
Decision Logger
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_3_6_23" >
<label class="md-nav__link" for="__nav_3_6_23" id="__nav_3_6_23_label" tabindex="0">
<span class="md-ellipsis">
Executive Mentor
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="3" aria-labelledby="__nav_3_6_23_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_3_6_23">
<span class="md-nav__icon md-icon"></span>
Executive Mentor
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../c-level-advisor/executive-mentor/" class="md-nav__link">
<span class="md-ellipsis">
Executive Mentor
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../c-level-advisor/executive-mentor-board-prep/" class="md-nav__link">
<span class="md-ellipsis">
Board Prep
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../c-level-advisor/executive-mentor-challenge/" class="md-nav__link">
<span class="md-ellipsis">
Challenge
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../c-level-advisor/executive-mentor-hard-call/" class="md-nav__link">
<span class="md-ellipsis">
Hard Call
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../c-level-advisor/executive-mentor-postmortem/" class="md-nav__link">
<span class="md-ellipsis">
Postmortem
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../c-level-advisor/executive-mentor-stress-test/" class="md-nav__link">
<span class="md-ellipsis">
Stress Test
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../../c-level-advisor/founder-coach/" class="md-nav__link">
<span class="md-ellipsis">
Founder Coach
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../c-level-advisor/internal-narrative/" class="md-nav__link">
<span class="md-ellipsis">
Internal Narrative
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../c-level-advisor/intl-expansion/" class="md-nav__link">
<span class="md-ellipsis">
International Expansion
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../c-level-advisor/ma-playbook/" class="md-nav__link">
<span class="md-ellipsis">
M&A Playbook
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../c-level-advisor/org-health-diagnostic/" class="md-nav__link">
<span class="md-ellipsis">
Org Health Diagnostic
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../c-level-advisor/scenario-war-room/" class="md-nav__link">
<span class="md-ellipsis">
Scenario War Room
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../c-level-advisor/strategic-alignment/" class="md-nav__link">
<span class="md-ellipsis">
Strategic Alignment
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_3_7" >
<div class="md-nav__link md-nav__container">
<a href="../../ra-qm-team/" class="md-nav__link ">
<span class="md-ellipsis">
Regulatory & Quality
</span>
</a>
<label class="md-nav__link " for="__nav_3_7" id="__nav_3_7_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_3_7_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_3_7">
<span class="md-nav__icon md-icon"></span>
Regulatory & Quality
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../ra-qm-team/capa-officer/" class="md-nav__link">
<span class="md-ellipsis">
CAPA Officer
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../ra-qm-team/fda-consultant-specialist/" class="md-nav__link">
<span class="md-ellipsis">
FDA Consultant
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../ra-qm-team/gdpr-dsgvo-expert/" class="md-nav__link">
<span class="md-ellipsis">
GDPR/DSGVO Expert
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../ra-qm-team/information-security-manager-iso27001/" class="md-nav__link">
<span class="md-ellipsis">
ISO 27001 Security Manager
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../ra-qm-team/isms-audit-expert/" class="md-nav__link">
<span class="md-ellipsis">
ISMS Audit Expert
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../ra-qm-team/mdr-745-specialist/" class="md-nav__link">
<span class="md-ellipsis">
MDR 2017/745 Specialist
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../ra-qm-team/qms-audit-expert/" class="md-nav__link">
<span class="md-ellipsis">
QMS Audit Expert
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../ra-qm-team/quality-documentation-manager/" class="md-nav__link">
<span class="md-ellipsis">
Quality Documentation Manager
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../ra-qm-team/quality-manager-qmr/" class="md-nav__link">
<span class="md-ellipsis">
Quality Manager (QMR)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../ra-qm-team/quality-manager-qms-iso13485/" class="md-nav__link">
<span class="md-ellipsis">
Quality Manager - ISO 13485
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../ra-qm-team/regulatory-affairs-head/" class="md-nav__link">
<span class="md-ellipsis">
Regulatory Affairs Head
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../ra-qm-team/risk-management-specialist/" class="md-nav__link">
<span class="md-ellipsis">
Risk Management Specialist
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_3_8" >
<div class="md-nav__link md-nav__container">
<a href="../../business-growth/" class="md-nav__link ">
<span class="md-ellipsis">
Business & Growth
</span>
</a>
<label class="md-nav__link " for="__nav_3_8" id="__nav_3_8_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_3_8_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_3_8">
<span class="md-nav__icon md-icon"></span>
Business & Growth
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../business-growth/contract-and-proposal-writer/" class="md-nav__link">
<span class="md-ellipsis">
Contract & Proposal Writer
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../business-growth/customer-success-manager/" class="md-nav__link">
<span class="md-ellipsis">
Customer Success Manager
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../business-growth/revenue-operations/" class="md-nav__link">
<span class="md-ellipsis">
Revenue Operations
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../business-growth/sales-engineer/" class="md-nav__link">
<span class="md-ellipsis">
Sales Engineer
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_3_9" >
<div class="md-nav__link md-nav__container">
<a href="../../finance/" class="md-nav__link ">
<span class="md-ellipsis">
Finance
</span>
</a>
<label class="md-nav__link " for="__nav_3_9" id="__nav_3_9_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_3_9_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_3_9">
<span class="md-nav__icon md-icon"></span>
Finance
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../finance/financial-analyst/" class="md-nav__link">
<span class="md-ellipsis">
Financial Analyst
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
</nav>
</div>
</div>
</div>
<div class="md-content" data-md-component="content">
<nav class="md-path" aria-label="Navigation" >
<ol class="md-path__list">
<li class="md-path__item">
<a href="../../.." class="md-path__link">
<span class="md-ellipsis">
Home
</span>
</a>
</li>
<li class="md-path__item">
<a href="../../engineering-team/" class="md-path__link">
<span class="md-ellipsis">
Skills
</span>
</a>
</li>
<li class="md-path__item">
<a href="../" class="md-path__link">
<span class="md-ellipsis">
Engineering - POWERFUL
</span>
</a>
</li>
</ol>
</nav>
<article class="md-content__inner md-typeset">
<a href="https://github.com/alirezarezvani/claude-skills/edit/main/skills/engineering/codebase-onboarding.md" title="Edit this page" class="md-content__button md-icon" rel="edit">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M10 20H6V4h7v5h5v3.1l2-2V8l-6-6H6c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h4zm10.2-7c.1 0 .3.1.4.2l1.3 1.3c.2.2.2.6 0 .8l-1 1-2.1-2.1 1-1c.1-.1.2-.2.4-.2m0 3.9L14.1 23H12v-2.1l6.1-6.1z"/></svg>
</a>
<h1 id="codebase-onboarding">Codebase Onboarding<a class="headerlink" href="#codebase-onboarding" title="Link to this section">&para;</a></h1>
<p><strong>Domain:</strong> Engineering - POWERFUL | <strong>Skill:</strong> <code>codebase-onboarding</code> | <strong>Source:</strong> <a href="https://github.com/alirezarezvani/claude-skills/tree/main/engineering/codebase-onboarding/SKILL.md"><code>engineering/codebase-onboarding/SKILL.md</code></a></p>
<hr />
<h1 id="codebase-onboarding_1">Codebase Onboarding<a class="headerlink" href="#codebase-onboarding_1" title="Link to this section">&para;</a></h1>
<p><strong>Tier:</strong> POWERFUL<br />
<strong>Category:</strong> Engineering<br />
<strong>Domain:</strong> Documentation / Developer Experience </p>
<hr />
<h2 id="overview">Overview<a class="headerlink" href="#overview" title="Link to this section">&para;</a></h2>
<p>Analyze a codebase and generate comprehensive onboarding documentation tailored to your audience. Produces architecture overviews, key file maps, local setup guides, common task runbooks, debugging guides, and contribution guidelines. Outputs to Markdown, Notion, or Confluence.</p>
<h2 id="core-capabilities">Core Capabilities<a class="headerlink" href="#core-capabilities" title="Link to this section">&para;</a></h2>
<ul>
<li><strong>Architecture overview</strong> — tech stack, system boundaries, data flow diagrams</li>
<li><strong>Key file map</strong> — what's important and why, with annotations</li>
<li><strong>Local setup guide</strong> — step-by-step from clone to running tests</li>
<li><strong>Common developer tasks</strong> — how to add a route, run migrations, create a component</li>
<li><strong>Debugging guide</strong> — common errors, log locations, useful queries</li>
<li><strong>Contribution guidelines</strong> — branch strategy, PR process, code style</li>
<li><strong>Audience-aware output</strong> — junior, senior, or contractor mode</li>
</ul>
<hr />
<h2 id="when-to-use">When to Use<a class="headerlink" href="#when-to-use" title="Link to this section">&para;</a></h2>
<ul>
<li>Onboarding a new team member or contractor</li>
<li>After a major refactor that made existing docs stale</li>
<li>Before open-sourcing a project</li>
<li>Creating a team wiki page for a service</li>
<li>Self-documenting before a long vacation</li>
</ul>
<hr />
<h2 id="codebase-analysis-commands">Codebase Analysis Commands<a class="headerlink" href="#codebase-analysis-commands" title="Link to this section">&para;</a></h2>
<p>Run these before generating docs to gather facts:</p>
<div class="language-bash highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="c1"># Project overview</span>
</span><span id="__span-0-2"><a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a>cat<span class="w"> </span>package.json<span class="w"> </span><span class="p">|</span><span class="w"> </span>jq<span class="w"> </span><span class="s1">&#39;{name, version, scripts, dependencies: (.dependencies | keys), devDependencies: (.devDependencies | keys)}&#39;</span>
</span><span id="__span-0-3"><a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a>
</span><span id="__span-0-4"><a id="__codelineno-0-4" name="__codelineno-0-4" href="#__codelineno-0-4"></a><span class="c1"># Directory structure (top 2 levels)</span>
</span><span id="__span-0-5"><a id="__codelineno-0-5" name="__codelineno-0-5" href="#__codelineno-0-5"></a>find<span class="w"> </span>.<span class="w"> </span>-maxdepth<span class="w"> </span><span class="m">2</span><span class="w"> </span>-not<span class="w"> </span>-path<span class="w"> </span><span class="s1">&#39;*/node_modules/*&#39;</span><span class="w"> </span>-not<span class="w"> </span>-path<span class="w"> </span><span class="s1">&#39;*/.git/*&#39;</span><span class="w"> </span>-not<span class="w"> </span>-path<span class="w"> </span><span class="s1">&#39;*/.next/*&#39;</span><span class="w"> </span><span class="p">|</span><span class="w"> </span>sort<span class="w"> </span><span class="p">|</span><span class="w"> </span>head<span class="w"> </span>-60
</span><span id="__span-0-6"><a id="__codelineno-0-6" name="__codelineno-0-6" href="#__codelineno-0-6"></a>
</span><span id="__span-0-7"><a id="__codelineno-0-7" name="__codelineno-0-7" href="#__codelineno-0-7"></a><span class="c1"># Largest files (often core modules)</span>
</span><span id="__span-0-8"><a id="__codelineno-0-8" name="__codelineno-0-8" href="#__codelineno-0-8"></a>find<span class="w"> </span>src/<span class="w"> </span>-name<span class="w"> </span><span class="s2">&quot;*.ts&quot;</span><span class="w"> </span>-not<span class="w"> </span>-path<span class="w"> </span><span class="s2">&quot;*/test*&quot;</span><span class="w"> </span>-exec<span class="w"> </span>wc<span class="w"> </span>-l<span class="w"> </span><span class="o">{}</span><span class="w"> </span>+<span class="w"> </span><span class="p">|</span><span class="w"> </span>sort<span class="w"> </span>-rn<span class="w"> </span><span class="p">|</span><span class="w"> </span>head<span class="w"> </span>-20
</span><span id="__span-0-9"><a id="__codelineno-0-9" name="__codelineno-0-9" href="#__codelineno-0-9"></a>
</span><span id="__span-0-10"><a id="__codelineno-0-10" name="__codelineno-0-10" href="#__codelineno-0-10"></a><span class="c1"># All routes (Next.js App Router)</span>
</span><span id="__span-0-11"><a id="__codelineno-0-11" name="__codelineno-0-11" href="#__codelineno-0-11"></a>find<span class="w"> </span>app/<span class="w"> </span>-name<span class="w"> </span><span class="s2">&quot;route.ts&quot;</span><span class="w"> </span>-o<span class="w"> </span>-name<span class="w"> </span><span class="s2">&quot;page.tsx&quot;</span><span class="w"> </span><span class="p">|</span><span class="w"> </span>sort
</span><span id="__span-0-12"><a id="__codelineno-0-12" name="__codelineno-0-12" href="#__codelineno-0-12"></a>
</span><span id="__span-0-13"><a id="__codelineno-0-13" name="__codelineno-0-13" href="#__codelineno-0-13"></a><span class="c1"># All routes (Express)</span>
</span><span id="__span-0-14"><a id="__codelineno-0-14" name="__codelineno-0-14" href="#__codelineno-0-14"></a>grep<span class="w"> </span>-rn<span class="w"> </span><span class="s2">&quot;router\.\(get\|post\|put\|patch\|delete\)&quot;</span><span class="w"> </span>src/routes/<span class="w"> </span>--include<span class="o">=</span><span class="s2">&quot;*.ts&quot;</span>
</span><span id="__span-0-15"><a id="__codelineno-0-15" name="__codelineno-0-15" href="#__codelineno-0-15"></a>
</span><span id="__span-0-16"><a id="__codelineno-0-16" name="__codelineno-0-16" href="#__codelineno-0-16"></a><span class="c1"># Recent major changes</span>
</span><span id="__span-0-17"><a id="__codelineno-0-17" name="__codelineno-0-17" href="#__codelineno-0-17"></a>git<span class="w"> </span>log<span class="w"> </span>--oneline<span class="w"> </span>--since<span class="o">=</span><span class="s2">&quot;90 days ago&quot;</span><span class="w"> </span><span class="p">|</span><span class="w"> </span>grep<span class="w"> </span>-E<span class="w"> </span><span class="s2">&quot;feat|refactor|breaking&quot;</span>
</span><span id="__span-0-18"><a id="__codelineno-0-18" name="__codelineno-0-18" href="#__codelineno-0-18"></a>
</span><span id="__span-0-19"><a id="__codelineno-0-19" name="__codelineno-0-19" href="#__codelineno-0-19"></a><span class="c1"># Top contributors</span>
</span><span id="__span-0-20"><a id="__codelineno-0-20" name="__codelineno-0-20" href="#__codelineno-0-20"></a>git<span class="w"> </span>shortlog<span class="w"> </span>-sn<span class="w"> </span>--no-merges<span class="w"> </span><span class="p">|</span><span class="w"> </span>head<span class="w"> </span>-10
</span><span id="__span-0-21"><a id="__codelineno-0-21" name="__codelineno-0-21" href="#__codelineno-0-21"></a>
</span><span id="__span-0-22"><a id="__codelineno-0-22" name="__codelineno-0-22" href="#__codelineno-0-22"></a><span class="c1"># Test coverage summary</span>
</span><span id="__span-0-23"><a id="__codelineno-0-23" name="__codelineno-0-23" href="#__codelineno-0-23"></a>pnpm<span class="w"> </span>test:ci<span class="w"> </span>--coverage<span class="w"> </span><span class="m">2</span>&gt;<span class="p">&amp;</span><span class="m">1</span><span class="w"> </span><span class="p">|</span><span class="w"> </span>tail<span class="w"> </span>-20
</span></code></pre></div>
<hr />
<h2 id="generated-documentation-template">Generated Documentation Template<a class="headerlink" href="#generated-documentation-template" title="Link to this section">&para;</a></h2>
<h3 id="readmemd-full-template">README.md — Full Template<a class="headerlink" href="#readmemd-full-template" title="Link to this section">&para;</a></h3>
<div class="language-markdown highlight"><pre><span></span><code><span id="__span-1-1"><a id="__codelineno-1-1" name="__codelineno-1-1" href="#__codelineno-1-1"></a><span class="gh"># [Project Name]</span>
</span><span id="__span-1-2"><a id="__codelineno-1-2" name="__codelineno-1-2" href="#__codelineno-1-2"></a>
</span><span id="__span-1-3"><a id="__codelineno-1-3" name="__codelineno-1-3" href="#__codelineno-1-3"></a><span class="k">&gt; </span><span class="ge">One-sentence description of what this does and who uses it.</span>
</span><span id="__span-1-4"><a id="__codelineno-1-4" name="__codelineno-1-4" href="#__codelineno-1-4"></a>
</span><span id="__span-1-5"><a id="__codelineno-1-5" name="__codelineno-1-5" href="#__codelineno-1-5"></a>[<span class="nt">![CI</span>](<span class="na">https://github.com/org/repo/actions/workflows/ci.yml/badge.svg</span>)](https://github.com/org/repo/actions/workflows/ci.yml)
</span><span id="__span-1-6"><a id="__codelineno-1-6" name="__codelineno-1-6" href="#__codelineno-1-6"></a>[<span class="nt">![Coverage</span>](<span class="na">https://codecov.io/gh/org/repo/branch/main/graph/badge.svg</span>)](https://codecov.io/gh/org/repo)
</span><span id="__span-1-7"><a id="__codelineno-1-7" name="__codelineno-1-7" href="#__codelineno-1-7"></a>
</span><span id="__span-1-8"><a id="__codelineno-1-8" name="__codelineno-1-8" href="#__codelineno-1-8"></a><span class="gu">## What is this?</span>
</span><span id="__span-1-9"><a id="__codelineno-1-9" name="__codelineno-1-9" href="#__codelineno-1-9"></a>
</span><span id="__span-1-10"><a id="__codelineno-1-10" name="__codelineno-1-10" href="#__codelineno-1-10"></a>[2-3 sentences: problem it solves, who uses it, current state]
</span><span id="__span-1-11"><a id="__codelineno-1-11" name="__codelineno-1-11" href="#__codelineno-1-11"></a>
</span><span id="__span-1-12"><a id="__codelineno-1-12" name="__codelineno-1-12" href="#__codelineno-1-12"></a><span class="gs">**Live:**</span> https://myapp.com
</span><span id="__span-1-13"><a id="__codelineno-1-13" name="__codelineno-1-13" href="#__codelineno-1-13"></a><span class="gs">**Staging:**</span> https://staging.myapp.com
</span><span id="__span-1-14"><a id="__codelineno-1-14" name="__codelineno-1-14" href="#__codelineno-1-14"></a><span class="gs">**Docs:**</span> https://docs.myapp.com
</span><span id="__span-1-15"><a id="__codelineno-1-15" name="__codelineno-1-15" href="#__codelineno-1-15"></a>
</span><span id="__span-1-16"><a id="__codelineno-1-16" name="__codelineno-1-16" href="#__codelineno-1-16"></a>---
</span><span id="__span-1-17"><a id="__codelineno-1-17" name="__codelineno-1-17" href="#__codelineno-1-17"></a>
</span><span id="__span-1-18"><a id="__codelineno-1-18" name="__codelineno-1-18" href="#__codelineno-1-18"></a><span class="gu">## Quick Start</span>
</span><span id="__span-1-19"><a id="__codelineno-1-19" name="__codelineno-1-19" href="#__codelineno-1-19"></a>
</span><span id="__span-1-20"><a id="__codelineno-1-20" name="__codelineno-1-20" href="#__codelineno-1-20"></a><span class="gu">### Prerequisites</span>
</span><span id="__span-1-21"><a id="__codelineno-1-21" name="__codelineno-1-21" href="#__codelineno-1-21"></a>
</span><span id="__span-1-22"><a id="__codelineno-1-22" name="__codelineno-1-22" href="#__codelineno-1-22"></a>| Tool | Version | Install |
</span><span id="__span-1-23"><a id="__codelineno-1-23" name="__codelineno-1-23" href="#__codelineno-1-23"></a>|------|---------|---------|
</span><span id="__span-1-24"><a id="__codelineno-1-24" name="__codelineno-1-24" href="#__codelineno-1-24"></a>| Node.js | 20+ | <span class="sb">`nvm install 20`</span> |
</span><span id="__span-1-25"><a id="__codelineno-1-25" name="__codelineno-1-25" href="#__codelineno-1-25"></a>| pnpm | 8+ | <span class="sb">`npm i -g pnpm`</span> |
</span><span id="__span-1-26"><a id="__codelineno-1-26" name="__codelineno-1-26" href="#__codelineno-1-26"></a>| Docker | 24+ | [<span class="nt">docker.com</span>](<span class="na">https://docker.com</span>) |
</span><span id="__span-1-27"><a id="__codelineno-1-27" name="__codelineno-1-27" href="#__codelineno-1-27"></a>| PostgreSQL | 16+ | via Docker (see below) |
</span><span id="__span-1-28"><a id="__codelineno-1-28" name="__codelineno-1-28" href="#__codelineno-1-28"></a>
</span><span id="__span-1-29"><a id="__codelineno-1-29" name="__codelineno-1-29" href="#__codelineno-1-29"></a><span class="gu">### Setup (5 minutes)</span>
</span><span id="__span-1-30"><a id="__codelineno-1-30" name="__codelineno-1-30" href="#__codelineno-1-30"></a>
</span><span id="__span-1-31"><a id="__codelineno-1-31" name="__codelineno-1-31" href="#__codelineno-1-31"></a>```bash
</span><span id="__span-1-32"><a id="__codelineno-1-32" name="__codelineno-1-32" href="#__codelineno-1-32"></a><span class="gh"># 1. Clone</span>
</span><span id="__span-1-33"><a id="__codelineno-1-33" name="__codelineno-1-33" href="#__codelineno-1-33"></a>git clone https://github.com/org/repo
</span><span id="__span-1-34"><a id="__codelineno-1-34" name="__codelineno-1-34" href="#__codelineno-1-34"></a>cd repo
</span><span id="__span-1-35"><a id="__codelineno-1-35" name="__codelineno-1-35" href="#__codelineno-1-35"></a>
</span><span id="__span-1-36"><a id="__codelineno-1-36" name="__codelineno-1-36" href="#__codelineno-1-36"></a><span class="gh"># 2. Install dependencies</span>
</span><span id="__span-1-37"><a id="__codelineno-1-37" name="__codelineno-1-37" href="#__codelineno-1-37"></a>pnpm install
</span><span id="__span-1-38"><a id="__codelineno-1-38" name="__codelineno-1-38" href="#__codelineno-1-38"></a>
</span><span id="__span-1-39"><a id="__codelineno-1-39" name="__codelineno-1-39" href="#__codelineno-1-39"></a><span class="gh"># 3. Start infrastructure</span>
</span><span id="__span-1-40"><a id="__codelineno-1-40" name="__codelineno-1-40" href="#__codelineno-1-40"></a>docker compose up -d # Starts Postgres, Redis
</span><span id="__span-1-41"><a id="__codelineno-1-41" name="__codelineno-1-41" href="#__codelineno-1-41"></a>
</span><span id="__span-1-42"><a id="__codelineno-1-42" name="__codelineno-1-42" href="#__codelineno-1-42"></a><span class="gh"># 4. Environment</span>
</span><span id="__span-1-43"><a id="__codelineno-1-43" name="__codelineno-1-43" href="#__codelineno-1-43"></a>cp .env.example .env
</span><span id="__span-1-44"><a id="__codelineno-1-44" name="__codelineno-1-44" href="#__codelineno-1-44"></a><span class="gh"># Edit .env — ask a teammate for real values or see Vault</span>
</span><span id="__span-1-45"><a id="__codelineno-1-45" name="__codelineno-1-45" href="#__codelineno-1-45"></a>
</span><span id="__span-1-46"><a id="__codelineno-1-46" name="__codelineno-1-46" href="#__codelineno-1-46"></a><span class="gh"># 5. Database setup</span>
</span><span id="__span-1-47"><a id="__codelineno-1-47" name="__codelineno-1-47" href="#__codelineno-1-47"></a>pnpm db:migrate # Run migrations
</span><span id="__span-1-48"><a id="__codelineno-1-48" name="__codelineno-1-48" href="#__codelineno-1-48"></a>pnpm db:seed # Optional: load test data
</span><span id="__span-1-49"><a id="__codelineno-1-49" name="__codelineno-1-49" href="#__codelineno-1-49"></a>
</span><span id="__span-1-50"><a id="__codelineno-1-50" name="__codelineno-1-50" href="#__codelineno-1-50"></a><span class="gh"># 6. Start dev server</span>
</span><span id="__span-1-51"><a id="__codelineno-1-51" name="__codelineno-1-51" href="#__codelineno-1-51"></a>pnpm dev # → http://localhost:3000
</span><span id="__span-1-52"><a id="__codelineno-1-52" name="__codelineno-1-52" href="#__codelineno-1-52"></a>
</span><span id="__span-1-53"><a id="__codelineno-1-53" name="__codelineno-1-53" href="#__codelineno-1-53"></a><span class="gh"># 7. Verify</span>
</span><span id="__span-1-54"><a id="__codelineno-1-54" name="__codelineno-1-54" href="#__codelineno-1-54"></a>pnpm test # Should be all green
</span></code></pre></div>
<h3 id="verify-it-works">Verify it works<a class="headerlink" href="#verify-it-works" title="Link to this section">&para;</a></h3>
<ul class="task-list">
<li class="task-list-item"><label class="task-list-control"><input type="checkbox" disabled/><span class="task-list-indicator"></span></label> <code>http://localhost:3000</code> loads the app</li>
<li class="task-list-item"><label class="task-list-control"><input type="checkbox" disabled/><span class="task-list-indicator"></span></label> <code>http://localhost:3000/api/health</code> returns <code>{"status":"ok"}</code></li>
<li class="task-list-item"><label class="task-list-control"><input type="checkbox" disabled/><span class="task-list-indicator"></span></label> <code>pnpm test</code> passes</li>
</ul>
<hr />
<h2 id="architecture">Architecture<a class="headerlink" href="#architecture" title="Link to this section">&para;</a></h2>
<h3 id="system-overview">System Overview<a class="headerlink" href="#system-overview" title="Link to this section">&para;</a></h3>
<div class="language-text highlight"><pre><span></span><code><span id="__span-2-1"><a id="__codelineno-2-1" name="__codelineno-2-1" href="#__codelineno-2-1"></a>Browser / Mobile
</span><span id="__span-2-2"><a id="__codelineno-2-2" name="__codelineno-2-2" href="#__codelineno-2-2"></a> │
</span><span id="__span-2-3"><a id="__codelineno-2-3" name="__codelineno-2-3" href="#__codelineno-2-3"></a> ▼
</span><span id="__span-2-4"><a id="__codelineno-2-4" name="__codelineno-2-4" href="#__codelineno-2-4"></a>[Next.js App] ←──── [Auth: NextAuth]
</span><span id="__span-2-5"><a id="__codelineno-2-5" name="__codelineno-2-5" href="#__codelineno-2-5"></a> │
</span><span id="__span-2-6"><a id="__codelineno-2-6" name="__codelineno-2-6" href="#__codelineno-2-6"></a> ├──→ [PostgreSQL] (primary data store)
</span><span id="__span-2-7"><a id="__codelineno-2-7" name="__codelineno-2-7" href="#__codelineno-2-7"></a> ├──→ [Redis] (sessions, job queue)
</span><span id="__span-2-8"><a id="__codelineno-2-8" name="__codelineno-2-8" href="#__codelineno-2-8"></a> └──→ [S3] (file uploads)
</span><span id="__span-2-9"><a id="__codelineno-2-9" name="__codelineno-2-9" href="#__codelineno-2-9"></a>
</span><span id="__span-2-10"><a id="__codelineno-2-10" name="__codelineno-2-10" href="#__codelineno-2-10"></a>Background:
</span><span id="__span-2-11"><a id="__codelineno-2-11" name="__codelineno-2-11" href="#__codelineno-2-11"></a>[BullMQ workers] ←── Redis queue
</span><span id="__span-2-12"><a id="__codelineno-2-12" name="__codelineno-2-12" href="#__codelineno-2-12"></a> └──→ [External APIs: Stripe, SendGrid]
</span></code></pre></div>
<h3 id="tech-stack">Tech Stack<a class="headerlink" href="#tech-stack" title="Link to this section">&para;</a></h3>
<table>
<thead>
<tr>
<th>Layer</th>
<th>Technology</th>
<th>Why</th>
</tr>
</thead>
<tbody>
<tr>
<td>Frontend</td>
<td>Next.js 14 (App Router)</td>
<td>SSR, file-based routing</td>
</tr>
<tr>
<td>Styling</td>
<td>Tailwind CSS + shadcn/ui</td>
<td>Rapid UI development</td>
</tr>
<tr>
<td>API</td>
<td>Next.js Route Handlers</td>
<td>Co-located with frontend</td>
</tr>
<tr>
<td>Database</td>
<td>PostgreSQL 16</td>
<td>Relational, RLS for multi-tenancy</td>
</tr>
<tr>
<td>ORM</td>
<td>Drizzle ORM</td>
<td>Type-safe, lightweight</td>
</tr>
<tr>
<td>Auth</td>
<td>NextAuth v5</td>
<td>OAuth + email/password</td>
</tr>
<tr>
<td>Queue</td>
<td>BullMQ + Redis</td>
<td>Background jobs</td>
</tr>
<tr>
<td>Storage</td>
<td>AWS S3</td>
<td>File uploads</td>
</tr>
<tr>
<td>Email</td>
<td>SendGrid</td>
<td>Transactional email</td>
</tr>
<tr>
<td>Payments</td>
<td>Stripe</td>
<td>Subscriptions</td>
</tr>
<tr>
<td>Deployment</td>
<td>Vercel (app) + Railway (workers)</td>
<td></td>
</tr>
<tr>
<td>Monitoring</td>
<td>Sentry + Datadog</td>
<td></td>
</tr>
</tbody>
</table>
<hr />
<h2 id="key-files">Key Files<a class="headerlink" href="#key-files" title="Link to this section">&para;</a></h2>
<table>
<thead>
<tr>
<th>Path</th>
<th>Purpose</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>app/</code></td>
<td>Next.js App Router — pages and API routes</td>
</tr>
<tr>
<td><code>app/api/</code></td>
<td>API route handlers</td>
</tr>
<tr>
<td><code>app/(auth)/</code></td>
<td>Auth pages (login, register, reset)</td>
</tr>
<tr>
<td><code>app/(app)/</code></td>
<td>Protected app pages</td>
</tr>
<tr>
<td><code>src/db/</code></td>
<td>Database schema, migrations, client</td>
</tr>
<tr>
<td><code>src/db/schema.ts</code></td>
<td><strong>Drizzle schema — single source of truth</strong></td>
</tr>
<tr>
<td><code>src/lib/</code></td>
<td>Shared utilities (auth, email, stripe)</td>
</tr>
<tr>
<td><code>src/lib/auth.ts</code></td>
<td><strong>Auth configuration — read this first</strong></td>
</tr>
<tr>
<td><code>src/components/</code></td>
<td>Reusable React components</td>
</tr>
<tr>
<td><code>src/hooks/</code></td>
<td>Custom React hooks</td>
</tr>
<tr>
<td><code>src/types/</code></td>
<td>Shared TypeScript types</td>
</tr>
<tr>
<td><code>workers/</code></td>
<td>BullMQ background job processors</td>
</tr>
<tr>
<td><code>emails/</code></td>
<td>React Email templates</td>
</tr>
<tr>
<td><code>tests/</code></td>
<td>Test helpers, factories, integration tests</td>
</tr>
<tr>
<td><code>.env.example</code></td>
<td>All env vars with descriptions</td>
</tr>
<tr>
<td><code>docker-compose.yml</code></td>
<td>Local infrastructure</td>
</tr>
</tbody>
</table>
<hr />
<h2 id="common-developer-tasks">Common Developer Tasks<a class="headerlink" href="#common-developer-tasks" title="Link to this section">&para;</a></h2>
<h3 id="add-a-new-api-endpoint">Add a new API endpoint<a class="headerlink" href="#add-a-new-api-endpoint" title="Link to this section">&para;</a></h3>
<div class="language-bash highlight"><pre><span></span><code><span id="__span-3-1"><a id="__codelineno-3-1" name="__codelineno-3-1" href="#__codelineno-3-1"></a><span class="c1"># 1. Create route handler</span>
</span><span id="__span-3-2"><a id="__codelineno-3-2" name="__codelineno-3-2" href="#__codelineno-3-2"></a>touch<span class="w"> </span>app/api/my-resource/route.ts
</span></code></pre></div>
<div class="language-typescript highlight"><pre><span></span><code><span id="__span-4-1"><a id="__codelineno-4-1" name="__codelineno-4-1" href="#__codelineno-4-1"></a><span class="c1">// app/api/my-resource/route.ts</span>
</span><span id="__span-4-2"><a id="__codelineno-4-2" name="__codelineno-4-2" href="#__codelineno-4-2"></a><span class="k">import</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nx">NextRequest</span><span class="p">,</span><span class="w"> </span><span class="nx">NextResponse</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="kr">from</span><span class="w"> </span><span class="s1">&#39;next/server&#39;</span>
</span><span id="__span-4-3"><a id="__codelineno-4-3" name="__codelineno-4-3" href="#__codelineno-4-3"></a><span class="k">import</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nx">auth</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="kr">from</span><span class="w"> </span><span class="s1">&#39;@/lib/auth&#39;</span>
</span><span id="__span-4-4"><a id="__codelineno-4-4" name="__codelineno-4-4" href="#__codelineno-4-4"></a><span class="k">import</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nx">db</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="kr">from</span><span class="w"> </span><span class="s1">&#39;@/db/client&#39;</span>
</span><span id="__span-4-5"><a id="__codelineno-4-5" name="__codelineno-4-5" href="#__codelineno-4-5"></a>
</span><span id="__span-4-6"><a id="__codelineno-4-6" name="__codelineno-4-6" href="#__codelineno-4-6"></a><span class="k">export</span><span class="w"> </span><span class="k">async</span><span class="w"> </span><span class="kd">function</span><span class="w"> </span><span class="nx">GET</span><span class="p">(</span><span class="nx">req</span><span class="o">:</span><span class="w"> </span><span class="kt">NextRequest</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
</span><span id="__span-4-7"><a id="__codelineno-4-7" name="__codelineno-4-7" href="#__codelineno-4-7"></a><span class="w"> </span><span class="kd">const</span><span class="w"> </span><span class="nx">session</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">await</span><span class="w"> </span><span class="nx">auth</span><span class="p">()</span>
</span><span id="__span-4-8"><a id="__codelineno-4-8" name="__codelineno-4-8" href="#__codelineno-4-8"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="nx">session</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
</span><span id="__span-4-9"><a id="__codelineno-4-9" name="__codelineno-4-9" href="#__codelineno-4-9"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="nx">NextResponse</span><span class="p">.</span><span class="nx">json</span><span class="p">({</span><span class="w"> </span><span class="nx">error</span><span class="o">:</span><span class="w"> </span><span class="s1">&#39;Unauthorized&#39;</span><span class="w"> </span><span class="p">},</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nx">status</span><span class="o">:</span><span class="w"> </span><span class="kt">401</span><span class="w"> </span><span class="p">})</span>
</span><span id="__span-4-10"><a id="__codelineno-4-10" name="__codelineno-4-10" href="#__codelineno-4-10"></a><span class="w"> </span><span class="p">}</span>
</span><span id="__span-4-11"><a id="__codelineno-4-11" name="__codelineno-4-11" href="#__codelineno-4-11"></a>
</span><span id="__span-4-12"><a id="__codelineno-4-12" name="__codelineno-4-12" href="#__codelineno-4-12"></a><span class="w"> </span><span class="kd">const</span><span class="w"> </span><span class="nx">data</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">await</span><span class="w"> </span><span class="nx">db</span><span class="p">.</span><span class="nx">query</span><span class="p">.</span><span class="nx">myResource</span><span class="p">.</span><span class="nx">findMany</span><span class="p">({</span>
</span><span id="__span-4-13"><a id="__codelineno-4-13" name="__codelineno-4-13" href="#__codelineno-4-13"></a><span class="w"> </span><span class="nx">where</span><span class="o">:</span><span class="w"> </span><span class="p">(</span><span class="nx">r</span><span class="p">,</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nx">eq</span><span class="w"> </span><span class="p">})</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"> </span><span class="nx">eq</span><span class="p">(</span><span class="nx">r</span><span class="p">.</span><span class="nx">userId</span><span class="p">,</span><span class="w"> </span><span class="nx">session</span><span class="p">.</span><span class="nx">user</span><span class="p">.</span><span class="nx">id</span><span class="p">),</span>
</span><span id="__span-4-14"><a id="__codelineno-4-14" name="__codelineno-4-14" href="#__codelineno-4-14"></a><span class="w"> </span><span class="p">})</span>
</span><span id="__span-4-15"><a id="__codelineno-4-15" name="__codelineno-4-15" href="#__codelineno-4-15"></a>
</span><span id="__span-4-16"><a id="__codelineno-4-16" name="__codelineno-4-16" href="#__codelineno-4-16"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="nx">NextResponse</span><span class="p">.</span><span class="nx">json</span><span class="p">({</span><span class="w"> </span><span class="nx">data</span><span class="w"> </span><span class="p">})</span>
</span><span id="__span-4-17"><a id="__codelineno-4-17" name="__codelineno-4-17" href="#__codelineno-4-17"></a><span class="p">}</span>
</span></code></pre></div>
<div class="language-bash highlight"><pre><span></span><code><span id="__span-5-1"><a id="__codelineno-5-1" name="__codelineno-5-1" href="#__codelineno-5-1"></a><span class="c1"># 2. Add tests</span>
</span><span id="__span-5-2"><a id="__codelineno-5-2" name="__codelineno-5-2" href="#__codelineno-5-2"></a>touch<span class="w"> </span>tests/api/my-resource.test.ts
</span><span id="__span-5-3"><a id="__codelineno-5-3" name="__codelineno-5-3" href="#__codelineno-5-3"></a>
</span><span id="__span-5-4"><a id="__codelineno-5-4" name="__codelineno-5-4" href="#__codelineno-5-4"></a><span class="c1"># 3. Add to OpenAPI spec (if applicable)</span>
</span><span id="__span-5-5"><a id="__codelineno-5-5" name="__codelineno-5-5" href="#__codelineno-5-5"></a>pnpm<span class="w"> </span>generate:openapi
</span></code></pre></div>
<h3 id="run-a-database-migration">Run a database migration<a class="headerlink" href="#run-a-database-migration" title="Link to this section">&para;</a></h3>
<div class="language-bash highlight"><pre><span></span><code><span id="__span-6-1"><a id="__codelineno-6-1" name="__codelineno-6-1" href="#__codelineno-6-1"></a><span class="c1"># Create migration</span>
</span><span id="__span-6-2"><a id="__codelineno-6-2" name="__codelineno-6-2" href="#__codelineno-6-2"></a>pnpm<span class="w"> </span>db:generate<span class="w"> </span><span class="c1"># Generates SQL from schema changes</span>
</span><span id="__span-6-3"><a id="__codelineno-6-3" name="__codelineno-6-3" href="#__codelineno-6-3"></a>
</span><span id="__span-6-4"><a id="__codelineno-6-4" name="__codelineno-6-4" href="#__codelineno-6-4"></a><span class="c1"># Review the generated SQL</span>
</span><span id="__span-6-5"><a id="__codelineno-6-5" name="__codelineno-6-5" href="#__codelineno-6-5"></a>cat<span class="w"> </span>drizzle/migrations/0001_my_change.sql
</span><span id="__span-6-6"><a id="__codelineno-6-6" name="__codelineno-6-6" href="#__codelineno-6-6"></a>
</span><span id="__span-6-7"><a id="__codelineno-6-7" name="__codelineno-6-7" href="#__codelineno-6-7"></a><span class="c1"># Apply</span>
</span><span id="__span-6-8"><a id="__codelineno-6-8" name="__codelineno-6-8" href="#__codelineno-6-8"></a>pnpm<span class="w"> </span>db:migrate
</span><span id="__span-6-9"><a id="__codelineno-6-9" name="__codelineno-6-9" href="#__codelineno-6-9"></a>
</span><span id="__span-6-10"><a id="__codelineno-6-10" name="__codelineno-6-10" href="#__codelineno-6-10"></a><span class="c1"># Roll back (manual — inspect generated SQL and revert)</span>
</span><span id="__span-6-11"><a id="__codelineno-6-11" name="__codelineno-6-11" href="#__codelineno-6-11"></a>psql<span class="w"> </span><span class="nv">$DATABASE_URL</span><span class="w"> </span>-f<span class="w"> </span>scripts/rollback_0001.sql
</span></code></pre></div>
<h3 id="add-a-new-email-template">Add a new email template<a class="headerlink" href="#add-a-new-email-template" title="Link to this section">&para;</a></h3>
<div class="language-bash highlight"><pre><span></span><code><span id="__span-7-1"><a id="__codelineno-7-1" name="__codelineno-7-1" href="#__codelineno-7-1"></a><span class="c1"># 1. Create template</span>
</span><span id="__span-7-2"><a id="__codelineno-7-2" name="__codelineno-7-2" href="#__codelineno-7-2"></a>touch<span class="w"> </span>emails/my-email.tsx
</span><span id="__span-7-3"><a id="__codelineno-7-3" name="__codelineno-7-3" href="#__codelineno-7-3"></a>
</span><span id="__span-7-4"><a id="__codelineno-7-4" name="__codelineno-7-4" href="#__codelineno-7-4"></a><span class="c1"># 2. Preview in browser</span>
</span><span id="__span-7-5"><a id="__codelineno-7-5" name="__codelineno-7-5" href="#__codelineno-7-5"></a>pnpm<span class="w"> </span>email:preview
</span><span id="__span-7-6"><a id="__codelineno-7-6" name="__codelineno-7-6" href="#__codelineno-7-6"></a>
</span><span id="__span-7-7"><a id="__codelineno-7-7" name="__codelineno-7-7" href="#__codelineno-7-7"></a><span class="c1"># 3. Send in code</span>
</span><span id="__span-7-8"><a id="__codelineno-7-8" name="__codelineno-7-8" href="#__codelineno-7-8"></a>import<span class="w"> </span><span class="o">{</span><span class="w"> </span>sendEmail<span class="w"> </span><span class="o">}</span><span class="w"> </span>from<span class="w"> </span><span class="s1">&#39;@/lib/email&#39;</span>
</span><span id="__span-7-9"><a id="__codelineno-7-9" name="__codelineno-7-9" href="#__codelineno-7-9"></a>await<span class="w"> </span>sendEmail<span class="o">({</span>
</span><span id="__span-7-10"><a id="__codelineno-7-10" name="__codelineno-7-10" href="#__codelineno-7-10"></a><span class="w"> </span>to:<span class="w"> </span>user.email,
</span><span id="__span-7-11"><a id="__codelineno-7-11" name="__codelineno-7-11" href="#__codelineno-7-11"></a><span class="w"> </span>subject:<span class="w"> </span><span class="s1">&#39;Subject line&#39;</span>,
</span><span id="__span-7-12"><a id="__codelineno-7-12" name="__codelineno-7-12" href="#__codelineno-7-12"></a><span class="w"> </span>template:<span class="w"> </span><span class="s1">&#39;my-email&#39;</span>,
</span><span id="__span-7-13"><a id="__codelineno-7-13" name="__codelineno-7-13" href="#__codelineno-7-13"></a><span class="w"> </span>props:<span class="w"> </span><span class="o">{</span><span class="w"> </span>name:<span class="w"> </span><span class="s2">&quot;username&quot;</span>
</span><span id="__span-7-14"><a id="__codelineno-7-14" name="__codelineno-7-14" href="#__codelineno-7-14"></a><span class="o">})</span>
</span></code></pre></div>
<h3 id="add-a-background-job">Add a background job<a class="headerlink" href="#add-a-background-job" title="Link to this section">&para;</a></h3>
<div class="language-typescript highlight"><pre><span></span><code><span id="__span-8-1"><a id="__codelineno-8-1" name="__codelineno-8-1" href="#__codelineno-8-1"></a><span class="c1">// 1. Define job in workers/jobs/my-job.ts</span>
</span><span id="__span-8-2"><a id="__codelineno-8-2" name="__codelineno-8-2" href="#__codelineno-8-2"></a><span class="k">import</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nx">Queue</span><span class="p">,</span><span class="w"> </span><span class="nx">Worker</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="kr">from</span><span class="w"> </span><span class="s1">&#39;bullmq&#39;</span>
</span><span id="__span-8-3"><a id="__codelineno-8-3" name="__codelineno-8-3" href="#__codelineno-8-3"></a><span class="k">import</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nx">redis</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="kr">from</span><span class="w"> </span><span class="s1">&#39;@/lib/redis&#39;</span>
</span><span id="__span-8-4"><a id="__codelineno-8-4" name="__codelineno-8-4" href="#__codelineno-8-4"></a>
</span><span id="__span-8-5"><a id="__codelineno-8-5" name="__codelineno-8-5" href="#__codelineno-8-5"></a><span class="k">export</span><span class="w"> </span><span class="kd">const</span><span class="w"> </span><span class="nx">myJobQueue</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="ow">new</span><span class="w"> </span><span class="nx">Queue</span><span class="p">(</span><span class="s1">&#39;my-job&#39;</span><span class="p">,</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nx">connection</span><span class="o">:</span><span class="w"> </span><span class="kt">redis</span><span class="w"> </span><span class="p">})</span>
</span><span id="__span-8-6"><a id="__codelineno-8-6" name="__codelineno-8-6" href="#__codelineno-8-6"></a>
</span><span id="__span-8-7"><a id="__codelineno-8-7" name="__codelineno-8-7" href="#__codelineno-8-7"></a><span class="k">export</span><span class="w"> </span><span class="kd">const</span><span class="w"> </span><span class="nx">myJobWorker</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="ow">new</span><span class="w"> </span><span class="nx">Worker</span><span class="p">(</span><span class="s1">&#39;my-job&#39;</span><span class="p">,</span><span class="w"> </span><span class="k">async</span><span class="w"> </span><span class="p">(</span><span class="nx">job</span><span class="p">)</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"> </span><span class="p">{</span>
</span><span id="__span-8-8"><a id="__codelineno-8-8" name="__codelineno-8-8" href="#__codelineno-8-8"></a><span class="w"> </span><span class="kd">const</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nx">userId</span><span class="p">,</span><span class="w"> </span><span class="nx">data</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">job</span><span class="p">.</span><span class="nx">data</span>
</span><span id="__span-8-9"><a id="__codelineno-8-9" name="__codelineno-8-9" href="#__codelineno-8-9"></a><span class="w"> </span><span class="c1">// do work</span>
</span><span id="__span-8-10"><a id="__codelineno-8-10" name="__codelineno-8-10" href="#__codelineno-8-10"></a><span class="p">},</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nx">connection</span><span class="o">:</span><span class="w"> </span><span class="kt">redis</span><span class="w"> </span><span class="p">})</span>
</span><span id="__span-8-11"><a id="__codelineno-8-11" name="__codelineno-8-11" href="#__codelineno-8-11"></a>
</span><span id="__span-8-12"><a id="__codelineno-8-12" name="__codelineno-8-12" href="#__codelineno-8-12"></a><span class="c1">// 2. Enqueue</span>
</span><span id="__span-8-13"><a id="__codelineno-8-13" name="__codelineno-8-13" href="#__codelineno-8-13"></a><span class="k">await</span><span class="w"> </span><span class="nx">myJobQueue</span><span class="p">.</span><span class="nx">add</span><span class="p">(</span><span class="s1">&#39;process&#39;</span><span class="p">,</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nx">userId</span><span class="p">,</span><span class="w"> </span><span class="nx">data</span><span class="w"> </span><span class="p">},</span><span class="w"> </span><span class="p">{</span>
</span><span id="__span-8-14"><a id="__codelineno-8-14" name="__codelineno-8-14" href="#__codelineno-8-14"></a><span class="w"> </span><span class="nx">attempts</span><span class="o">:</span><span class="w"> </span><span class="kt">3</span><span class="p">,</span>
</span><span id="__span-8-15"><a id="__codelineno-8-15" name="__codelineno-8-15" href="#__codelineno-8-15"></a><span class="w"> </span><span class="nx">backoff</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="kr">type</span><span class="o">:</span><span class="w"> </span><span class="s1">&#39;exponential&#39;</span><span class="p">,</span><span class="w"> </span><span class="nx">delay</span><span class="o">:</span><span class="w"> </span><span class="kt">1000</span><span class="w"> </span><span class="p">},</span>
</span><span id="__span-8-16"><a id="__codelineno-8-16" name="__codelineno-8-16" href="#__codelineno-8-16"></a><span class="p">})</span>
</span></code></pre></div>
<hr />
<h2 id="debugging-guide">Debugging Guide<a class="headerlink" href="#debugging-guide" title="Link to this section">&para;</a></h2>
<h3 id="common-errors">Common Errors<a class="headerlink" href="#common-errors" title="Link to this section">&para;</a></h3>
<p><strong><code>Error: DATABASE_URL is not set</code></strong>
<div class="language-bash highlight"><pre><span></span><code><span id="__span-9-1"><a id="__codelineno-9-1" name="__codelineno-9-1" href="#__codelineno-9-1"></a><span class="c1"># Check your .env file exists and has the var</span>
</span><span id="__span-9-2"><a id="__codelineno-9-2" name="__codelineno-9-2" href="#__codelineno-9-2"></a>cat<span class="w"> </span>.env<span class="w"> </span><span class="p">|</span><span class="w"> </span>grep<span class="w"> </span>DATABASE_URL
</span><span id="__span-9-3"><a id="__codelineno-9-3" name="__codelineno-9-3" href="#__codelineno-9-3"></a>
</span><span id="__span-9-4"><a id="__codelineno-9-4" name="__codelineno-9-4" href="#__codelineno-9-4"></a><span class="c1"># Start Postgres if not running</span>
</span><span id="__span-9-5"><a id="__codelineno-9-5" name="__codelineno-9-5" href="#__codelineno-9-5"></a>docker<span class="w"> </span>compose<span class="w"> </span>up<span class="w"> </span>-d<span class="w"> </span>postgres
</span></code></pre></div></p>
<p><strong><code>PrismaClientKnownRequestError: P2002 Unique constraint failed</code></strong>
<div class="language-text highlight"><pre><span></span><code><span id="__span-10-1"><a id="__codelineno-10-1" name="__codelineno-10-1" href="#__codelineno-10-1"></a>User already exists with that email. Check: is this a duplicate registration?
</span><span id="__span-10-2"><a id="__codelineno-10-2" name="__codelineno-10-2" href="#__codelineno-10-2"></a>Run: SELECT * FROM users WHERE email = &#39;test@example.com&#39;;
</span></code></pre></div></p>
<p><strong><code>Error: JWT expired</code></strong>
<div class="language-bash highlight"><pre><span></span><code><span id="__span-11-1"><a id="__codelineno-11-1" name="__codelineno-11-1" href="#__codelineno-11-1"></a><span class="c1"># Dev: extend token TTL in .env</span>
</span><span id="__span-11-2"><a id="__codelineno-11-2" name="__codelineno-11-2" href="#__codelineno-11-2"></a><span class="nv">JWT_EXPIRES_IN</span><span class="o">=</span>30d
</span><span id="__span-11-3"><a id="__codelineno-11-3" name="__codelineno-11-3" href="#__codelineno-11-3"></a>
</span><span id="__span-11-4"><a id="__codelineno-11-4" name="__codelineno-11-4" href="#__codelineno-11-4"></a><span class="c1"># Check clock skew between server and client</span>
</span><span id="__span-11-5"><a id="__codelineno-11-5" name="__codelineno-11-5" href="#__codelineno-11-5"></a>date<span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span>docker<span class="w"> </span><span class="nb">exec</span><span class="w"> </span>postgres<span class="w"> </span>date
</span></code></pre></div></p>
<p><strong><code>500 on /api/*</code> in local dev</strong>
<div class="language-bash highlight"><pre><span></span><code><span id="__span-12-1"><a id="__codelineno-12-1" name="__codelineno-12-1" href="#__codelineno-12-1"></a><span class="c1"># 1. Check terminal for stack trace</span>
</span><span id="__span-12-2"><a id="__codelineno-12-2" name="__codelineno-12-2" href="#__codelineno-12-2"></a><span class="c1"># 2. Check database connectivity</span>
</span><span id="__span-12-3"><a id="__codelineno-12-3" name="__codelineno-12-3" href="#__codelineno-12-3"></a>psql<span class="w"> </span><span class="nv">$DATABASE_URL</span><span class="w"> </span>-c<span class="w"> </span><span class="s2">&quot;SELECT 1&quot;</span>
</span><span id="__span-12-4"><a id="__codelineno-12-4" name="__codelineno-12-4" href="#__codelineno-12-4"></a><span class="c1"># 3. Check Redis</span>
</span><span id="__span-12-5"><a id="__codelineno-12-5" name="__codelineno-12-5" href="#__codelineno-12-5"></a>redis-cli<span class="w"> </span>ping
</span><span id="__span-12-6"><a id="__codelineno-12-6" name="__codelineno-12-6" href="#__codelineno-12-6"></a><span class="c1"># 4. Check logs</span>
</span><span id="__span-12-7"><a id="__codelineno-12-7" name="__codelineno-12-7" href="#__codelineno-12-7"></a>pnpm<span class="w"> </span>dev<span class="w"> </span><span class="m">2</span>&gt;<span class="p">&amp;</span><span class="m">1</span><span class="w"> </span><span class="p">|</span><span class="w"> </span>grep<span class="w"> </span>-E<span class="w"> </span><span class="s2">&quot;error|Error|ERROR&quot;</span>
</span></code></pre></div></p>
<h3 id="useful-sql-queries">Useful SQL Queries<a class="headerlink" href="#useful-sql-queries" title="Link to this section">&para;</a></h3>
<div class="language-sql highlight"><pre><span></span><code><span id="__span-13-1"><a id="__codelineno-13-1" name="__codelineno-13-1" href="#__codelineno-13-1"></a><span class="c1">-- Find slow queries (requires pg_stat_statements)</span>
</span><span id="__span-13-2"><a id="__codelineno-13-2" name="__codelineno-13-2" href="#__codelineno-13-2"></a><span class="k">SELECT</span><span class="w"> </span><span class="n">query</span><span class="p">,</span><span class="w"> </span><span class="n">mean_exec_time</span><span class="p">,</span><span class="w"> </span><span class="n">calls</span><span class="p">,</span><span class="w"> </span><span class="n">total_exec_time</span>
</span><span id="__span-13-3"><a id="__codelineno-13-3" name="__codelineno-13-3" href="#__codelineno-13-3"></a><span class="k">FROM</span><span class="w"> </span><span class="n">pg_stat_statements</span>
</span><span id="__span-13-4"><a id="__codelineno-13-4" name="__codelineno-13-4" href="#__codelineno-13-4"></a><span class="k">ORDER</span><span class="w"> </span><span class="k">BY</span><span class="w"> </span><span class="n">mean_exec_time</span><span class="w"> </span><span class="k">DESC</span>
</span><span id="__span-13-5"><a id="__codelineno-13-5" name="__codelineno-13-5" href="#__codelineno-13-5"></a><span class="k">LIMIT</span><span class="w"> </span><span class="mi">20</span><span class="p">;</span>
</span><span id="__span-13-6"><a id="__codelineno-13-6" name="__codelineno-13-6" href="#__codelineno-13-6"></a>
</span><span id="__span-13-7"><a id="__codelineno-13-7" name="__codelineno-13-7" href="#__codelineno-13-7"></a><span class="c1">-- Check active connections</span>
</span><span id="__span-13-8"><a id="__codelineno-13-8" name="__codelineno-13-8" href="#__codelineno-13-8"></a><span class="k">SELECT</span><span class="w"> </span><span class="k">count</span><span class="p">(</span><span class="o">*</span><span class="p">),</span><span class="w"> </span><span class="k">state</span><span class="w"> </span><span class="k">FROM</span><span class="w"> </span><span class="n">pg_stat_activity</span><span class="w"> </span><span class="k">GROUP</span><span class="w"> </span><span class="k">BY</span><span class="w"> </span><span class="k">state</span><span class="p">;</span>
</span><span id="__span-13-9"><a id="__codelineno-13-9" name="__codelineno-13-9" href="#__codelineno-13-9"></a>
</span><span id="__span-13-10"><a id="__codelineno-13-10" name="__codelineno-13-10" href="#__codelineno-13-10"></a><span class="c1">-- Find bloated tables</span>
</span><span id="__span-13-11"><a id="__codelineno-13-11" name="__codelineno-13-11" href="#__codelineno-13-11"></a><span class="k">SELECT</span><span class="w"> </span><span class="n">relname</span><span class="p">,</span><span class="w"> </span><span class="n">n_dead_tup</span><span class="p">,</span><span class="w"> </span><span class="n">n_live_tup</span><span class="p">,</span>
</span><span id="__span-13-12"><a id="__codelineno-13-12" name="__codelineno-13-12" href="#__codelineno-13-12"></a><span class="w"> </span><span class="n">round</span><span class="p">(</span><span class="n">n_dead_tup</span><span class="p">::</span><span class="nb">numeric</span><span class="o">/</span><span class="k">nullif</span><span class="p">(</span><span class="n">n_live_tup</span><span class="p">,</span><span class="mi">0</span><span class="p">)</span><span class="o">*</span><span class="mi">100</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p">)</span><span class="w"> </span><span class="k">AS</span><span class="w"> </span><span class="n">dead_pct</span>
</span><span id="__span-13-13"><a id="__codelineno-13-13" name="__codelineno-13-13" href="#__codelineno-13-13"></a><span class="k">FROM</span><span class="w"> </span><span class="n">pg_stat_user_tables</span>
</span><span id="__span-13-14"><a id="__codelineno-13-14" name="__codelineno-13-14" href="#__codelineno-13-14"></a><span class="k">ORDER</span><span class="w"> </span><span class="k">BY</span><span class="w"> </span><span class="n">n_dead_tup</span><span class="w"> </span><span class="k">DESC</span><span class="p">;</span>
</span></code></pre></div>
<h3 id="debug-authentication">Debug Authentication<a class="headerlink" href="#debug-authentication" title="Link to this section">&para;</a></h3>
<div class="language-bash highlight"><pre><span></span><code><span id="__span-14-1"><a id="__codelineno-14-1" name="__codelineno-14-1" href="#__codelineno-14-1"></a><span class="c1"># Decode a JWT (no secret needed for header/payload)</span>
</span><span id="__span-14-2"><a id="__codelineno-14-2" name="__codelineno-14-2" href="#__codelineno-14-2"></a><span class="nb">echo</span><span class="w"> </span><span class="s2">&quot;YOUR_JWT&quot;</span><span class="w"> </span><span class="p">|</span><span class="w"> </span>cut<span class="w"> </span>-d.<span class="w"> </span>-f2<span class="w"> </span><span class="p">|</span><span class="w"> </span>base64<span class="w"> </span>-d<span class="w"> </span><span class="p">|</span><span class="w"> </span>jq<span class="w"> </span>.
</span><span id="__span-14-3"><a id="__codelineno-14-3" name="__codelineno-14-3" href="#__codelineno-14-3"></a>
</span><span id="__span-14-4"><a id="__codelineno-14-4" name="__codelineno-14-4" href="#__codelineno-14-4"></a><span class="c1"># Check session in DB</span>
</span><span id="__span-14-5"><a id="__codelineno-14-5" name="__codelineno-14-5" href="#__codelineno-14-5"></a>psql<span class="w"> </span><span class="nv">$DATABASE_URL</span><span class="w"> </span>-c<span class="w"> </span><span class="s2">&quot;SELECT * FROM sessions WHERE user_id = &#39;usr_...&#39; ORDER BY expires_at DESC LIMIT 5;&quot;</span>
</span></code></pre></div>
<h3 id="log-locations">Log Locations<a class="headerlink" href="#log-locations" title="Link to this section">&para;</a></h3>
<table>
<thead>
<tr>
<th>Environment</th>
<th>Logs</th>
</tr>
</thead>
<tbody>
<tr>
<td>Local dev</td>
<td>Terminal running <code>pnpm dev</code></td>
</tr>
<tr>
<td>Vercel production</td>
<td>Vercel dashboard → Logs</td>
</tr>
<tr>
<td>Workers (Railway)</td>
<td>Railway dashboard → Deployments → Logs</td>
</tr>
<tr>
<td>Database</td>
<td><code>docker logs postgres</code> (local)</td>
</tr>
<tr>
<td>Background jobs</td>
<td><code>pnpm worker:dev</code> terminal</td>
</tr>
</tbody>
</table>
<hr />
<h2 id="contribution-guidelines">Contribution Guidelines<a class="headerlink" href="#contribution-guidelines" title="Link to this section">&para;</a></h2>
<h3 id="branch-strategy">Branch Strategy<a class="headerlink" href="#branch-strategy" title="Link to this section">&para;</a></h3>
<div class="language-text highlight"><pre><span></span><code><span id="__span-15-1"><a id="__codelineno-15-1" name="__codelineno-15-1" href="#__codelineno-15-1"></a>main → production (protected, requires PR + CI)
</span><span id="__span-15-2"><a id="__codelineno-15-2" name="__codelineno-15-2" href="#__codelineno-15-2"></a> └── feature/PROJ-123-short-desc
</span><span id="__span-15-3"><a id="__codelineno-15-3" name="__codelineno-15-3" href="#__codelineno-15-3"></a> └── fix/PROJ-456-bug-description
</span><span id="__span-15-4"><a id="__codelineno-15-4" name="__codelineno-15-4" href="#__codelineno-15-4"></a> └── chore/update-dependencies
</span></code></pre></div>
<h3 id="pr-requirements">PR Requirements<a class="headerlink" href="#pr-requirements" title="Link to this section">&para;</a></h3>
<ul class="task-list">
<li class="task-list-item"><label class="task-list-control"><input type="checkbox" disabled/><span class="task-list-indicator"></span></label> Branch name includes ticket ID (e.g., <code>feature/PROJ-123-...</code>)</li>
<li class="task-list-item"><label class="task-list-control"><input type="checkbox" disabled/><span class="task-list-indicator"></span></label> PR description explains the why</li>
<li class="task-list-item"><label class="task-list-control"><input type="checkbox" disabled/><span class="task-list-indicator"></span></label> All CI checks pass</li>
<li class="task-list-item"><label class="task-list-control"><input type="checkbox" disabled/><span class="task-list-indicator"></span></label> Test coverage doesn't decrease</li>
<li class="task-list-item"><label class="task-list-control"><input type="checkbox" disabled/><span class="task-list-indicator"></span></label> Self-reviewed (read your own diff before requesting review)</li>
<li class="task-list-item"><label class="task-list-control"><input type="checkbox" disabled/><span class="task-list-indicator"></span></label> Screenshots/video for UI changes</li>
</ul>
<h3 id="commit-convention">Commit Convention<a class="headerlink" href="#commit-convention" title="Link to this section">&para;</a></h3>
<div class="language-text highlight"><pre><span></span><code><span id="__span-16-1"><a id="__codelineno-16-1" name="__codelineno-16-1" href="#__codelineno-16-1"></a>feat(scope): short description → new feature
</span><span id="__span-16-2"><a id="__codelineno-16-2" name="__codelineno-16-2" href="#__codelineno-16-2"></a>fix(scope): short description → bug fix
</span><span id="__span-16-3"><a id="__codelineno-16-3" name="__codelineno-16-3" href="#__codelineno-16-3"></a>chore: update dependencies → maintenance
</span><span id="__span-16-4"><a id="__codelineno-16-4" name="__codelineno-16-4" href="#__codelineno-16-4"></a>docs: update API reference → documentation
</span></code></pre></div>
<h3 id="code-style">Code Style<a class="headerlink" href="#code-style" title="Link to this section">&para;</a></h3>
<div class="language-bash highlight"><pre><span></span><code><span id="__span-17-1"><a id="__codelineno-17-1" name="__codelineno-17-1" href="#__codelineno-17-1"></a><span class="c1"># Lint + format</span>
</span><span id="__span-17-2"><a id="__codelineno-17-2" name="__codelineno-17-2" href="#__codelineno-17-2"></a>pnpm<span class="w"> </span>lint
</span><span id="__span-17-3"><a id="__codelineno-17-3" name="__codelineno-17-3" href="#__codelineno-17-3"></a>pnpm<span class="w"> </span>format
</span><span id="__span-17-4"><a id="__codelineno-17-4" name="__codelineno-17-4" href="#__codelineno-17-4"></a>
</span><span id="__span-17-5"><a id="__codelineno-17-5" name="__codelineno-17-5" href="#__codelineno-17-5"></a><span class="c1"># Type check</span>
</span><span id="__span-17-6"><a id="__codelineno-17-6" name="__codelineno-17-6" href="#__codelineno-17-6"></a>pnpm<span class="w"> </span>typecheck
</span><span id="__span-17-7"><a id="__codelineno-17-7" name="__codelineno-17-7" href="#__codelineno-17-7"></a>
</span><span id="__span-17-8"><a id="__codelineno-17-8" name="__codelineno-17-8" href="#__codelineno-17-8"></a><span class="c1"># All checks (run before pushing)</span>
</span><span id="__span-17-9"><a id="__codelineno-17-9" name="__codelineno-17-9" href="#__codelineno-17-9"></a>pnpm<span class="w"> </span>validate
</span></code></pre></div>
<hr />
<h2 id="audience-specific-notes">Audience-Specific Notes<a class="headerlink" href="#audience-specific-notes" title="Link to this section">&para;</a></h2>
<h3 id="for-junior-developers">For Junior Developers<a class="headerlink" href="#for-junior-developers" title="Link to this section">&para;</a></h3>
<ul>
<li>Start with <code>src/lib/auth.ts</code> to understand authentication</li>
<li>Read existing tests in <code>tests/api/</code> — they document expected behavior</li>
<li>Ask before touching anything in <code>src/db/schema.ts</code> — schema changes affect everyone</li>
<li>Use <code>pnpm db:seed</code> to get realistic local data</li>
</ul>
<h3 id="for-senior-engineers-tech-leads">For Senior Engineers / Tech Leads<a class="headerlink" href="#for-senior-engineers-tech-leads" title="Link to this section">&para;</a></h3>
<ul>
<li>Architecture decisions are documented in <code>docs/adr/</code> (Architecture Decision Records)</li>
<li>Performance benchmarks: <code>pnpm bench</code> — baseline is in <code>tests/benchmarks/baseline.json</code></li>
<li>Security model: RLS policies in <code>src/db/rls.sql</code>, enforced at DB level</li>
<li>Scaling notes: <code>docs/scaling.md</code></li>
</ul>
<h3 id="for-contractors">For Contractors<a class="headerlink" href="#for-contractors" title="Link to this section">&para;</a></h3>
<ul>
<li>Scope is limited to <code>src/features/[your-feature]/</code> unless discussed</li>
<li>Never push directly to <code>main</code></li>
<li>All external API calls go through <code>src/lib/</code> wrappers (for mocking in tests)</li>
<li>Time estimates: log in Linear ticket comments daily</li>
</ul>
<hr />
<h2 id="output-formats">Output Formats<a class="headerlink" href="#output-formats" title="Link to this section">&para;</a></h2>
<p>→ See references/output-format-templates.md for details</p>
<h2 id="common-pitfalls">Common Pitfalls<a class="headerlink" href="#common-pitfalls" title="Link to this section">&para;</a></h2>
<ul>
<li><strong>Docs written once, never updated</strong> — add doc updates to PR checklist</li>
<li><strong>Missing local setup step</strong> — test setup instructions on a fresh machine quarterly</li>
<li><strong>No error troubleshooting</strong> — debugging section is the most valuable part for new hires</li>
<li><strong>Too much detail for contractors</strong> — they need task-specific, not architecture-deep docs</li>
<li><strong>No screenshots</strong> — UI flows need screenshots; they go stale but are still valuable</li>
<li><strong>Skipping the "why"</strong> — document why decisions were made, not just what was decided</li>
</ul>
<hr />
<h2 id="best-practices">Best Practices<a class="headerlink" href="#best-practices" title="Link to this section">&para;</a></h2>
<ol>
<li><strong>Keep setup under 10 minutes</strong> — if it takes longer, fix the setup, not the docs</li>
<li><strong>Test the docs</strong> — have a new hire follow them literally, fix every gap they hit</li>
<li><strong>Link, don't repeat</strong> — link to ADRs, issues, and external docs instead of duplicating</li>
<li><strong>Update in the same PR</strong> — docs changes alongside code changes</li>
<li><strong>Version-specific notes</strong> — call out things that changed in recent versions</li>
<li><strong>Runbooks over theory</strong> — "run this command" beats "the system uses Redis for..."</li>
</ol>
</article>
</div>
<script>var tabs=__md_get("__tabs");if(Array.isArray(tabs))e:for(var set of document.querySelectorAll(".tabbed-set")){var labels=set.querySelector(".tabbed-labels");for(var tab of tabs)for(var label of labels.getElementsByTagName("label"))if(label.innerText.trim()===tab){var input=document.getElementById(label.htmlFor);input.checked=!0;continue e}}</script>
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
</div>
<button type="button" class="md-top md-icon" data-md-component="top" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8z"/></svg>
Back to top
</button>
</main>
<footer class="md-footer">
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-copyright">
<div class="md-copyright__highlight">
Built by Alireza Rezvani
</div>
</div>
<div class="md-social">
<a href="https://github.com/alirezarezvani/claude-skills" target="_blank" rel="noopener" title="GitHub" class="md-social__link">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg>
</a>
<a href="https://twitter.com/nginitycloud" target="_blank" rel="noopener" title="Twitter" class="md-social__link">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M357.2 48h70.6L273.6 224.2 455 464H313L201.7 318.6 74.5 464H3.8l164.9-188.5L-5.2 48h145.6l100.5 132.9zm-24.8 373.8h39.1L119.1 88h-42z"/></svg>
</a>
<a href="https://alirezarezvani.medium.com" target="_blank" rel="noopener" title="Medium" class="md-social__link">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M369.4 32c43.4 0 78.6 35.2 78.6 78.6v83.8c-1.9-.1-3.8-.2-5.7-.2h-.4c-10 0-22.3 2.4-31.1 6.8-10 4.6-18.7 11.5-26 20.6-11.8 14.6-18.9 34.3-20.6 56.4-.1.7-.1 1.3-.2 2s-.1 1.2-.1 1.9c-.1 1.2-.1 2.4-.1 3.6 0 1.9-.1 3.8 0 5.8 1.2 50.1 28.2 90.2 76.3 90.2 2.7 0 5.3-.1 7.9-.4v20.4c0 43.4-35.2 78.6-78.6 78.6L78.6 480C35.2 480 0 444.8 0 401.4V110.6C0 67.2 35.2 32 78.6 32zM82.3 138.9l.3.1c13.2 3 19.8 7.4 19.8 23.4v187.2c0 16-6.7 20.4-19.9 23.4l-.3.1v2.8H135v-2.8l-.3-.1c-13.2-3-19.9-7.4-19.9-23.4V173.3l86.1 202.5h4.9l88.6-208.2v186.6c-1.1 12.6-7.8 16.5-19.7 19.2l-.3.1v2.7h91.9v-2.7l-.3-.1c-11.9-2.7-18.7-6.6-19.9-19.2l-.1-191.8h.1c0-16 6.7-20.4 19.9-23.4l.3-.1v-2.7h-72.2l-67 157.4-67-157.4H82.3zM448 340.3c-25.1-7.4-43-35.1-41.2-67.8h41.1v67.8zm-6.4-135.6c2.3 0 4.4.3 6.4.9V263h-40.2c1.5-33.6 13.6-57.9 33.8-58.3"/></svg>
</a>
</div>
</div>
</div>
</footer>
</div>
<div class="md-dialog" data-md-component="dialog">
<div class="md-dialog__inner md-typeset"></div>
</div>
<div class="md-progress" data-md-component="progress" role="progressbar"></div>
<script id="__config" type="application/json">{"annotate": null, "base": "../../..", "features": ["navigation.instant", "navigation.instant.progress", "navigation.tracking", "navigation.tabs", "navigation.tabs.sticky", "navigation.sections", "navigation.expand", "navigation.path", "navigation.top", "navigation.indexes", "search.suggest", "search.highlight", "search.share", "content.code.copy", "content.code.annotate", "content.action.edit", "content.tabs.link", "header.autohide", "toc.follow", "announce.dismiss"], "search": "../../../assets/javascripts/workers/search.2c215733.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
<script src="../../../assets/javascripts/bundle.79ae519e.min.js"></script>
</body>
</html>