Building Scout

From zero to production SaaS in 17 days — with Claude Code.

24k Lines of code
323 Commits
17 PRs merged
17 Active days

About

Scout is a developer productivity analytics SaaS for small dev teams. Connect GitLab or GitHub, get actionable insights — cycle time, review bottlenecks, team balance — in minutes. Built as a SvelteKit monolith with SSR, API routes, and a sync worker.

Timeline

Jul 2 — Post-launch
Draft-aware cycle time
Cycle time and pickup time now start when a merge request is marked ready for review, not when the draft was first opened — so teams that open drafts early (to preview the diff against target or to park work-in-progress) no longer see inflated review times. Draft MRs are also consistently excluded from WIP / open-MR counts across the dashboard, team list, delivery, personal actions and CSV exports. The real ready-for-review moment is captured from the GitHub timeline / GitLab system notes, and existing history was backfilled so past metrics are corrected too.
Quality 2,520 MRs backfilled
May 12 — Day 17
Data Export
CSV data export for the Pro plan (issue #7) — download team and project metrics for spreadsheets and BI tools. Export respects every visibility rule: masked authors stay masked, hidden data stays hidden, and the project endpoint is admin-gated to match the UI. Security hardening on the export path: CSV injection protection, hidden-author leak fixes, and metric-drift correction so exported numbers match what's on screen. Covered by new E2E tests for both the PRO export flow and the FREE-plan paywall.
Feature Quality PR #40–45
May 10 — Day 16
Exclude repos from stats
Finer-grained control over which repos feed aggregate metrics. New per-project flag excludedFromStats, independent from active — excluded repos keep syncing and stay accessible from their detail page, but drop out of the dashboard, team, actions, delivery, drill-down, and AI Impact aggregations. Useful for sandbox repos, legacy/archived projects, or boilerplate repos whose activity would skew throughput and lead time. Toggle exposed on the admin Projects page with a clear "Excluded from stats" badge. 5 new integration tests covering default value, the dashboard-style query, flag flipping, downstream commit filtering, and admin-page visibility.
Feature Quality +1 migration
Apr 8 — Day 15
Metric Drill-Down
Every metric is now clickable — drill down to see the raw Git data behind it (issue #38): the exact commits, MRs, and reviews that feed each number, so the figures are auditable rather than opaque. Sync reliability hardened in the same pass: commits are now ingested from all branches (not just the default one), deduplicated by SHA to prevent unique-constraint violations, and merge commits are filtered by parent count to avoid false ownership attribution.
Feature Quality issue #38
Apr 6 — Day 14
AI Impact Tracking
Full AI adoption tracking — admins declare tool rollouts with method/workflow context, Scout compares Git metrics before and after. New AI Impact page with 5 KPIs (throughput, cycle time, MR size, pickup time, review comments), colored deltas, data quality warnings, and pedagogy section. Contributors can self-declare their AI tools in Account. Dashboard card shows active rollouts. Key design decision: track the method (CLAUDE.md, TDD with AI), not just the tool — same tool with different workflows produces very different results. 18 unit tests + 7 E2E tests.
Feature Quality +1,600 lines
Apr 3 — Day 13
Scoring Fairness & Account Redesign
Data consistency audit on commit/MR attribution for fair scoring. Fixed reviewer assignments lost during author merge (MergeRequestReviewer cascade delete). Reviews now count both comments and reviewer assignments (deduplicated by MR) — approvals without comments get proper collaboration credit. Draft MRs excluded from team page metrics. Account page redesigned: workspace list with role badges, human-readable session info (browser + OS parsing), reordered sections. Fixed invite form stuck open on error (try/finally). Resolved production 502s caused by nginx proxy buffer overflow on large SSR headers.
Fix Quality Infra +8 commits
Mar 29 — Day 12
Multi-Workspace & Onboarding
Full multi-workspace routing — all app routes under /{slug}/. Two-level layout: parent handles auth, [slug] layout resolves workspace + membership. Workspace switcher in sidebar (conditional: only visible with 2+ workspaces). Cookie-based redirect to last visited workspace. Security audit found and fixed critical workspace scoping bugs in all form actions. Onboarding lobby for new users (create vs invited). Editable slug with auto-suffix on collision. Workspace creation limit (1 per user) with discrete link in Account. 85 E2E + 270 unit tests, zero failures.
Feature Quality +13 commits
Mar 28 — Day 11
Audit Trail & Usage
Append-only audit log with centralized logAudit() helper — 15 critical actions instrumented (auth, roles, settings, integrations, data operations). Admin UI at /audit-log with cursor pagination and filters by actor/action. Ticket prefix allowlist in Settings — admin selects real project prefixes, false positives (GPL-3, UTF-8) hidden from Delivery. User last seen tracking with throttled updates. 265 unit tests.
Feature Quality +14 commits
Mar 27 — Day 10
Visibility & Cleanup
Enforce team profile access control — SELF/GROUP/ALL visibility checks on individual pages. Redirect SELF users from dashboard to actions. Uniform page widths (max-w-4xl standard, max-w-5xl for data-heavy pages). Fix all 31 svelte-check warnings. Update nodemailer for security patch. Docker Hub credentials in CI. 23k+ lines of code, zero warnings.
Feature Quality DevOps +4 commits
Mar 23–26 — Day 9
Delivery Tracking
Parse ticket keys (Jira/Linear) from branch names, commits, and MR titles via regex. New Delivery page with ticket list, Git activity per ticket, WIP/delivered status. Dashboard KPIs: features delivered, features in progress, average lead time. Draft MRs excluded from all metrics. Shared Avatar component with pastel fallback colors. Collapsible settings cards. Rename to Scout, new domain tryscout.tech.
Feature Polish +24 commits
Mar 22 — Day 8
Identity & Onboarding
Invite non-contributor users (CEO, PM) by email with role. Welcome flow — 2-step onboarding customized by role. Role-based landing page (CEO → dashboard, Dev → actions). Design system: dark sidebar, Epilogue font, indigo primary, branded color palette. Login redesign with glassmorphism. Separate E2E test database. Hydration fix for Playwright. 69 E2E tests, 68 integration, 247 unit.
Feature Polish Quality +47 commits
Mar 21 — Day 7
Refinement
KPI cards rework — hero/secondary tiers aligned with DORA and SPACE frameworks. Release notes drawer. Zero-downtime deploy with PM2 cluster mode and atomic build swap. Metrics research. E2E test fixes.
Polish DevOps
Mar 18 — Day 6
Enterprise
Role-based access control — 7 roles (Admin, CEO, CTO, Tech Lead, Lead Dev, Dev, Member). Users management page. Configurable visibility per role (SELF / GROUP / ALL). Sidebar adapts dynamically: My Stats, My Squad, or Team.
Feature PR #23 · +2,880 lines
Mar 17 — Day 5
Monetization
Lemon Squeezy integration for self-serve PRO upgrade. In-app feedback widget with email notifications. Show/hide score setting per workspace.
Feature PR #18, #19
Mar 12 — Day 4
Growth
GitHub provider support alongside GitLab. FREE plan paywall — 5 contributors, 3 months history. Activity score algorithm with 5 dimensions and radar chart.
Feature PR #17 · +882 lines
Mar 10 — Day 3
Polishing
Landing page design. Auth UI redesign with shared AuthPanel component. "Copy for AI" button on every metrics card. Contributor groups filter for team views.
Polish
Mar 8 — Day 2
Hardening
Unit tests with coverage, E2E Playwright tests. ESLint, Prettier, Husky pre-commit hooks. GitHub Actions CI pipeline with PostgreSQL service. Database indexes. Forge deployment config. First documented PR.
Quality DevOps PR #1
Mar 7 — Day 1
Foundation
SvelteKit app, Prisma schema, magic link auth, GitLab provider, sync worker. Dashboard, Team, Projects, Actions pages. Auto-sync scheduler, settings tabs, rate limiting, AES-256 token encryption. The entire architecture in a single day.
Core ~35 commits

By the numbers

24,000+

Lines of code

200+ Svelte & TypeScript files. Full-stack monolith with SSR, API routes, sync workers.

3 layers

Testing

270 unit tests (Vitest), 86 E2E (Playwright). Separate test DB, hydration-aware helpers.

0s

Downtime deploys

PM2 cluster mode, atomic build swap, health checks. GitHub Actions CI/CD pipeline.

3-5x

Faster with AI

Built with Claude Code. Developer focuses on product decisions, AI handles code and cross-file consistency.

How it was built

Plan
Implement
Review
Test
Deploy
Each feature was developed in a conversation: describe the goal, Claude writes the code, review together, iterate, ship. The loop is tight — often under an hour per feature.

The biggest accelerator isn't code generation speed — it's cross-file consistency. Adding a new role to RBAC means updating the Prisma schema, server auth, sidebar logic, settings page, and E2E tests. Claude does all of that in one pass. The developer's job shifts from writing code to making product decisions.