Built things

Everything shipped

All the projects I've built — what each one is, how it works, and why I made the choices I did.

LIVE DEMOPROJECT_01~/projects/chatbot-factory/widget.ts

Chatbot Factory Simplistic

A lightweight chatbot builder for creating embeddable AI assistants with a simple factory-style setup flow. It ships as a live app with a drop-in widget script, bot-specific configuration, and a clean interface for adding conversational AI to external sites.

#Next.js#AI Chatbot#Vercel#Widget#TypeScript
> Open the app

◆ KEY DECISIONS

Distribution
Drop-in widget script. Keeps integration simple for static sites and modern app frameworks.
Hosting
Vercel deployment. Fast previews and production deploys make it easy to test bots in real sites.
UX
Simplified setup flow. The factory pattern turns chatbot creation into a repeatable configuration task.
Reuse
Bot-specific ids. Multiple assistants can share the same widget runtime while loading their own configuration.

◆ PRODUCT FLOW

01
Paste Your Site

The user enters their website URL and Chatbot Factory starts from the public pages they already have.

02
Generate Preview

The app scans key pages, learns the business context, and builds a working chatbot preview before anything is installed.

03
Tune & Approve

The owner reviews the assistant, adjusts the setup, and confirms it is ready to answer real visitor questions.

04
Copy & Deploy

Chatbot Factory provides a small embed script that can be pasted into the site, taking the chatbot from preview to live widget in minutes.

Need an embeddable AI assistant? I build chatbot products that can be configured once, embedded quickly, and reused across customer-facing websites.

> get_in_touch
PRIVATE REPOPROJECT_02~/projects/raw-photo-editor/index.ts

RAW Photo Editor

A non-destructive RAW photo editor that runs in the browser and as an Electron desktop app — LibRaw compiled to WASM for decoding, a WebGPU pipeline written in WGSL for true-HDR preview, and gain-map (Ultra HDR) JPEG export. Every feature is driveable programmatically by an AI agent; the GUI is a thin layer over that same API.

#WebGPU#WGSL#WASM#Electron#TypeScript#HDR

◆ KEY DECISIONS

Agent-first
The API is the product. Every feature works headlessly; Playwright drives the same surface for agent-driven end-to-end tests, and the GUI is a client of it.
Compute
WebGPU over canvas filters. Real colour-managed HDR processing needs GPU compute — WGSL shaders give per-pixel control the 2D canvas can't.
Portability
One codebase, two shells. The Chromium browser build and the Electron desktop build share the pipeline; desktop adds filesystem access, nothing else forks.
Decode
LibRaw → WASM in a worker. Battle-tested native decoding without a server round-trip — files never leave the machine.

◆ PIPELINE

01
Decode

LibRaw compiled to WebAssembly decodes any supported camera RAW in a Web Worker — validated end-to-end on a Sony A7RII corpus — keeping the UI thread free.

02
Adjust

A Lightroom-style non-destructive adjustment set. Edits are a recipe over the original file, never baked in, so every change can be revisited.

03
Render

A WebGPU pipeline written in WGSL renders the working image with a true-HDR canvas preview on displays that support it.

04
Export

Gain-map ("Ultra HDR") JPEG export: one file that renders HDR on capable screens and degrades gracefully to SDR everywhere else.

Working on browser-based imaging? I build GPU-accelerated, local-first media tools where the hard parts — decoding, colour, HDR — run client-side.

> get_in_touch
LIVE DEMOPROJECT_03~/projects/data-insight-advisor/index.ts

Data Insight Advisor

A privacy-first web app for understanding tabular data and choosing the right ML model — entirely in the browser. Upload a CSV, Excel or JSON file; DuckDB-WASM profiles it in a Web Worker, the app visualises it with plain-language insights, and a pure-TypeScript engine recommends model families with fully explainable 0–100 suitability scores. No data ever leaves the tab, and there is no AI model at runtime — every recommendation traces back to a statistic and a rule.

#DuckDB-WASM#TypeScript#explainability#client-side ML#data profiling
> Try it live

◆ KEY DECISIONS

Privacy
100% client-side. DuckDB-WASM plus a pure-TypeScript engine means the tool works on confidential data by construction, not by policy.
Trust
Rules, not a model. There is no AI at runtime. Each recommendation decomposes into a base score and named rules grounded in the user's own statistics.
Honesty
Says when data is weak. If no column meaningfully predicts the target, it reports that instead of inventing confidence.
Quality
Tested like a product. Vitest unit suite, Playwright end-to-end runs, and schema validation over the entire model encyclopedia.

◆ FLOW

01
Upload

CSV, Excel or JSON lands in DuckDB-WASM inside a Web Worker — with type detection and correction. No backend, no accounts, nothing uploaded.

02
Explore

Automatic profiling and charts with plain-language insights about distributions, missingness, and relationships in the data.

03
Recommend

The user picks a goal; a rule engine scores 20 model families and 44 variants against the actual dataset, 0–100, with every adjusting rule shown.

04
Learn

A 64-entry model encyclopedia, schema-validated in CI, browsable on its own — each entry scored live against the uploaded data.

Drowning in tabular data? I build explainable analysis tools that meet data where it lives — including when it isn't allowed to leave the building.

> get_in_touch
LIVE DEMOPROJECT_04~/projects/councilmate/app.py
Screenshot of CouncilMate AI

CouncilMate AI

A RAG-powered AI assistant that helps Melbourne residents navigate city council services — from waste management and parking permits to pet registration and community events. Scrapes and processes real council data, then answers questions with grounded, cited responses.

#Python#RAG#FastAPI#ChromaDB#Next.js#Scrapy
> Try the demo

◆ KEY DECISIONS

LLM
Claude API. High-quality reasoning for nuanced council policy questions.
Vector Store
ChromaDB. Lightweight and embeddable — ideal for document-scale council data.
Backend
FastAPI + Pydantic. Async API with typed request/response models for reliability.
Data Pipeline
Scrapy + Playwright. Handles both static pages and JS-rendered council content for comprehensive coverage.

◆ ARCHITECTURE

01
Scrape

Scrapy + Playwright crawl City of Melbourne pages and PDFs, extracting structured content.

02
Process & Index

Documents are chunked, embedded, and stored in ChromaDB with metadata for fast retrieval.

03
Route & Retrieve

User queries are routed to the right domain. Top-k relevant chunks are retrieved from the vector store.

04
Generate

Retrieved context is injected into the prompt. The LLM produces a grounded answer scoped to council services.

Need a domain-specific AI assistant? I design and build RAG systems that turn messy real-world data into reliable, grounded answers.

> get_in_touch
PRIVATE REPOPROJECT_05~/projects/sakura/main.py
Screenshot of Sakura — Autonomous ML Agent

Sakura — Autonomous ML Agent

A local-first, multi-agent AI system that autonomously completes the full ML lifecycle — from data ingestion and exploratory analysis through feature engineering, model training, evaluation, and artifact delivery. 10 specialist agents coordinate through an orchestrator, with sandboxed code execution and support for 11 LLM providers.

#Python#Multi-Agent AI#Streamlit#SQLite#Ollama
> View on GitHub

◆ KEY DECISIONS

Agents
10 specialist agents. Each handles a distinct ML lifecycle phase, coordinated by the Orchestrator.
LLM Routing
11 provider adapters. Ollama (local), Anthropic, OpenAI, Google, Mistral, and more with automatic fallback.
Sandbox
Secure code execution. Agent-generated scripts run in an isolated sandbox with memory and time limits.
Development
16 iterative phases. From bootstrapping through security hardening, each phase tested before proceeding.

◆ AGENT WORKFLOW

01
Ingest & Profile

Upload raw data with a business goal. The Data Analyst agent profiles types, distributions, and quality issues.

02
Research & Engineer

Web Researcher gathers domain context. Preprocessor cleans data. Feature Engineer creates and selects features.

03
Design & Train

Model Architect selects algorithms. Trainer runs training loops with hyperparameter tuning in a sandboxed environment.

04
Evaluate & Deliver

Evaluator runs cross-validation and metrics. Explainer generates SHAP analysis, model cards, and a final delivery report.

Want to automate ML workflows? I build multi-agent systems that handle the full data science lifecycle autonomously.

> get_in_touch
SELF-HOSTED · CASE STUDYPROJECT_06~/projects/workflow/server.py
Screenshot of AI Workflow Automation Platform

AI Workflow Automation Platform

A self-hosted, multi-tenant platform that connects to business systems — email, CRM, helpdesk, accounting — and processes inbound events through configurable AI pipelines. Features a visual drag-and-drop workflow builder, 10 preset templates, and triple-provider LLM architecture with automatic fallback.

#Python#FastAPI#React#Celery#PostgreSQL#Docker
> View on GitHub

◆ KEY DECISIONS

Stack
FastAPI + Celery + PostgreSQL. Async API with distributed task queue for reliable workflow execution at scale.
LLM Strategy
Triple-provider with fallback. Ollama (local), Anthropic, and OpenAI — supports air-gapped deployments.
Builder
React Flow visual canvas. Drag-and-drop DAG builder with live validation and one-click deployment.
Multi-tenancy
YAML-configured per tenant. No code changes per client — connectors, workflows, and branding all configurable.

◆ ARCHITECTURE

01
Ingest

Events arrive from 10 built-in connectors — Gmail, Slack, Zendesk, Xero, and more — normalised into a universal WorkItem model.

02
Classify & Retrieve

AI classifies intent, urgency, and category. Hybrid RAG retrieves relevant context from knowledge bases via semantic + keyword search.

03
Reason & Safeguard

LLM drafts a response using classification and retrieved context. Guardrails check for PII, prohibited content, and bias.

04
Route & Act

Confidence-based routing: high-confidence items auto-resolve, uncertain ones go to human review. Replies sent, tickets updated, full audit trail logged.

Need intelligent workflow automation? I build AI-powered platforms that replace manual triage, classification, and routing across entire business operations.

> get_in_touch