PORTFOLIO

Projects that solve real problems.

From AI-powered applications to enterprise dashboards, here's a selection of projects showcasing modern development practices and practical AI integration.

AI & MACHINE LEARNING

AI-Powered Projects

CIA, Competitive Intelligence Agent screenshot
developmentAI

CIA, Competitive Intelligence Agent

Local-first competitive intel with git-versioned briefs

TL;DR

Challenge: Competitive intel tools are bloated SaaS that hoard your data and never quite answer the question you asked.

Solution: Local-first pipeline: ingest → LLM classify → summarize → brief. Durable storage on Turso, cron on Railway, briefs committed to git.

Win: Briefs I actually trust, fully owned data, model-swappable via OpenRouter. Open-sourcing once the README is honest.

TursoRailwayOpenRoutern8nTypeScriptgit-as-database
Apsolut Cortex screenshot
liveAI

Apsolut Cortex

Memory-ish layer for Claude Code, npm i -g apsolut-cortex

TL;DR

Challenge: Every Claude Code session started the same way, re-explaining the same decisions, re-correcting the same mistakes, re-pasting last week's context.

Solution: A persistent memory layer Claude reads at session start. Corrections, decisions, and patterns saved to disk so context survives past the conversation window.

Win: Shipped to npm (npm i -g apsolut-cortex), drives my daily AI workflow, and stops Claude from forgetting what we agreed on last Tuesday.

Node.jsTypeScriptnpmClaude Code
Brand Intelligence screenshotDemo data shown
developmentAI

Brand Intelligence

SEO for AI answers, brand visibility tracking across ChatGPT, Claude, Gemini, Perplexity

TL;DR

Challenge: Buyers ask LLMs for category recommendations and brands either get named or they don't. No incumbent tool actually answers frequency × position × sentiment × citation source, across providers, over time, at a sane price.

Solution: Multi-provider scan engine (one OpenRouter key, all platforms) → temporal mention extraction → sentiment & competitor radar → content-gap brief generator. 24-table schema, auth, scan dispatch, OpenRouter adapter all wired.

Win: Marketing teams see exactly where they stand in AI answers, frequency, position, sentiment, sources, competitor delta, and get the content brief that closes each gap. Without enterprise pricing.

Next.js 16Drizzle ORMTursoOpenRouterNextAuthQdrantTypeScript
Prompt Stash screenshot
liveAI

Prompt Stash

Personal prompt vault, built so I'd stop digging prompts out of old Slack threads

TL;DR

Challenge: Useful prompts scatter across Slack DMs, Notion pages, and old browser tabs. By the time you find the right one, you've already retyped a worse version.

Solution: Personal prompt vault, categorized snippets with multi-field copy, search, one click to clipboard. Lightweight, fast, runs in the browser. Next.js + Turso.

Win: Three seconds to the right prompt instead of three minutes hunting through last quarter's Slack archive. Open it every day.

Next.jsTypeScriptTailwind CSSTurso

LAB

Weekend builds & API explorations

Smaller-scope builds, usually a weekend, sometimes an afternoon. Useful utilities and public API tests, posted on LinkedIn to show velocity, not to productize.

SheetBuddy screenshot
live

SheetBuddy

Compare Excel files in the browser, your data never leaves the machine

Next.js 14TypeScriptZustandIndexedDB (Dexie)PapaParseSheetJS
PasteKit screenshot
live

PasteKit

Clipboard snippet manager for the paste-this-twelve-times workflow

React 19Tailwind CSSRadix UIdnd-kit
City Scene Generator screenshot
liveAI

City Scene Generator

Vibe-coded Gemini app, end-to-end in a weekend

Gemini APINext.jsTypeScript
Santa's Video Workshop screenshot
liveAI

Santa's Video Workshop

VEO 3.1 video generation app

VEO 3.1 APINext.js

LET'S TALK

Hiring? Or stuck mid-build?

Open to senior in-house roles with conversational AI / voice agent / AI-native DXP teams. Available for select Toptal engagements. I reply within 24 hours with something concrete, not a calendar link to a discovery deck.

→ Hiring conversations: tell me about the role and the stack

→ Project work: tell me the bottleneck, not the requirements doc

→ Either way, I'll come back with a take, not a pitch