Case archive

Projects that show systems thinking in practice

Seven deliveries where the value is more than the surface: booking logic, data pipelines, content flows, deployment, and interfaces people can use.

01

multi-tenant booking / Laravel / live app

VenueFlow

Read case
Problem

A business-facing booking product needs to handle guests, resources, times, staff roles, and conflicts without creating friction for the user.

Solution

I built a Laravel platform with public booking without accounts, admin and staff views, RBAC, tenant isolation, and transaction-safe booking conflict checks.

What it shows

Shows that I can build systems where business rules, data model, and daily workflows need to hold together, not just a polished frontend shell.

Details
Tenant isolationRole-based accessConflict checksVisual floor planNeon + Render
Tech
Laravel 11PHP 8.3Neon PostgreSQLBladeTailwindAlpine.jsRender
02

data pipeline / TypeScript / static delivery

FX Monitor

Read case
Problem

Exchange rates need comparison over time with KPIs, charts, and risk indicators without heavy backend operations.

Solution

I built a monorepo with a React/TypeScript frontend and Python pipeline that fetches ECB data, publishes static JSON files, and updates daily through GitHub Actions.

What it shows

Shows that I can connect data, CI, performance, and interactive UX into a solution that is easy to operate and reason about.

Details
Daily CI updateStatic data filesKPI calculationComparison modeBilingual UI
Tech
ReactTypeScriptVitestPythonpytestruffChart.jsGitHub Actions
03

public site + admin panel / React / JWT API

Lördagsgolf

Read case
Problem

Visitors need to understand the course, setup, and results quickly, while the organizers need a secure way to register players, rounds, and courses without touching the database directly.

Solution

I built a React/Vite frontend that talks to a purpose-built ASP.NET Core backend: public season and player pages, an admin panel behind JWT login for managing players, rounds, and courses, and an adapter layer that normalizes the API's varying response shapes.

What it shows

Shows that I can build and wire a frontend to a self-authored authenticated backend across two repos, with adapters and a resilient API client that keep the UI decoupled from the backend's exact response shape.

Details
JWT-protected admin panelCRUD for players/rounds/coursesAdapter layer over the API contractAPI client with timeout/retryPer-season player stats
Tech
React 19ViteReact RouterTailwindASP.NET CoreJWTRender
04

golf scorecard / Next.js / Claude API

Fairway

Read case
Problem

Tracking a round on paper gives you no data to improve from. Golfers need a way to log rounds hole by hole and get concrete feedback on what actually cost strokes.

Solution

I built a full-stack Next.js app with a hole-by-hole scorecard, localStorage persistence, statistics charts, screenshot import via AI vision, and Claude-powered coaching analysis per round.

What it shows

Shows end-to-end product thinking: secure server-side AI integration, structured data from unstructured input, and a UI that stays usable during a round.

Details
Server-side AIScreenshot importlocalStorageHole-by-hole statsCoaching report
Tech
Next.js 16TypeScriptTailwind v4Anthropic SDKZodRender
05

hyperlocal data hub / Next.js / Claude API

Kommunfotbollen

Read case
Problem

Local football coverage is scattered across sources and local newspapers. No single place aggregates standings, matches, and goal scorers for a town's teams, kept automatically up to date.

Solution

I built a Next.js app that pulls leagues, matches, and standings from an external sports data source, and lets Claude read local newspaper match reports to judge relevance and extract goal scorers from unstructured text.

What it shows

Shows that I can build a source-agnostic ingest architecture and apply AI to structured extraction from text, running on a scheduled, cost-free operational setup.

Details
Source-agnostic ingestAI-driven relevance filteringGoal-scorer extraction from textCron via GitHub ActionsSupabase Postgres
Tech
Next.js 16TypeScriptDrizzle ORMSupabaseZodTailwind v4Anthropic SDKGitHub ActionsRender
06

shared expense app / Laravel / Vue 3

Kvitt

Read case
Problem

Splitting expenses in a group (a trip, a shared cabin, a dinner club) quickly turns into a tangle of small debts crossing between everyone, and nobody's quite sure who owes whom.

Solution

I built a Laravel + Inertia + Vue app with groups, split expenses, and a greedy debt-simplification algorithm that computes the minimum number of transactions needed to settle the whole group, plus reminders with an atomically-protected cooldown.

What it shows

Shows I can solve a real algorithmic problem, not just build CRUD, and handle race conditions correctly with atomic database operations.

Details
Debt-simplification algorithmGroups & split expensesAtomic reminder cooldownPush & email notificationsScheduled reminders
Tech
Laravel 13PHP 8.3Inertia.jsVue 3PostgreSQLPestLarastanTailwind v4Render
07

feature-flag platform / Laravel / RBAC

FlagForge

Read case
Problem

Turning features on and off in production without control over who approves it, traceability for what changed, or a fast rollback path is dangerous once multiple environments and multiple people are involved.

Solution

I built a Laravel-based feature-flag control plane in the style of LaunchDarkly: project-scoped API keys, deterministic rollout hashing, a draft/publish workflow per environment with two-person approval for critical flags, a break-glass emergency override, and an immutable audit log with a checksum chain.

What it shows

Shows I can design governance and permissions for a tool other developers trust in production, not just build features — governance, traceability, and race-condition safety are first-class citizens, not afterthoughts.

Details
Per-project RBACTwo-person approvalImmutable audit chainDeterministic rollout hashingBreak-glass override
Tech
Laravel 12PHP 8.3PostgreSQLPHPUnitPintGitHub ActionsRender

Want to see how your project would be broken down?

Send the current state, goal, and what is unclear. I will respond with a concrete first step and what should be built first.