AI · Automation
AquaOps — n8n Ops Bot over the Live ERP
Problem
Stock and production state lived inside the ERP. A quick answer or a daily heads-up still meant opening the app and digging through screens.
What I built
An n8n automation pair on top of the live ERP database: a scheduled watcher that pushes critical-stock and production alerts to Telegram, and a Telegram assistant that answers free-form questions: an LLM (Gemini) classifies the request, then the flow queries Postgres through a dedicated read-only role (SELECT-only, explicit RLS policies). A third error-watchdog workflow reports failures of the other two.
The same stack now runs the sales side too. A lead-intel scanner sweeps public procurement data and the web for open tenders, competitor wins and sector news, scores each hit against the customer profile we actually sell to, and sends one filtered digest. Nothing new to report means no message — an earlier bot that pinged on every raw hit became noise nobody read.
Stack
n8nTelegram Bot API
Gemini (LLM classification)Supabase Postgres
read-only DB role / RLS
Data · Pipeline
Aquatronic CRM Master Database — Lead Consolidation & Scoring
Problem
Years of trade-fair contacts were scattered across inconsistent sources (exports, spreadsheets, notes) with duplicates, fabricated entries, and no way to prioritize follow-up. Effectively unusable for sales.
What I built
I consolidated thousands of trade-fair contacts into one master database, then designed a HOT / HIGH / MEDIUM / LOW priority-scoring system. I ran a structured, multi-pass data-quality cleanup (deduplication, field validation, systematic removal of fabricated records) as a repeatable process, not a one-off.
Stack
Python data pipelineRule-based lead scoring
Spreadsheet integration
Web · Outbound
Company Website Rebuild — aquatronic.com.tr
Problem
The old site was slow, dated and impossible to update. Every cold email we sent pointed at it, which meant the first thing a prospect saw undid the pitch.
What I built
A rewrite in Astro on Cloudflare Pages: the full product catalogue generated from data rather than hand-written pages, project references by country, and lead capture forms that drop straight into the sales inbox. I ran the DNS and mail migration behind it as well, DKIM and DMARC included, so outbound mail actually lands.
Stack
AstroTailwind
Cloudflare PagesD3
DNS / DKIM / DMARC
Automation · CAD
Electrical Control-Panel CAD Automation Engine
Problem
Every fountain project needs its own electrical control-panel schematics (DWG). Drawing them by hand is repetitive, slow, inconsistent across projects, and easy to get subtly wrong.
What I built
A Python automation engine that generates manufacturing-ready schematics from a structured component netlist: modelling components, nets, and the BOM, running electrical-rule checks (ERC), and emitting deterministic DWG/DXF. Built AI-first: LLM agents generate the code against 800+ automated tests, 20+ golden reference projects, and a lint gate that blocks invalid drawings. Headless via ezdxf, with AutoCAD for conversion.
Stack
PythonezdxfAutoCAD / accoreconsole
DXF / DWGnetlist / ERC / BOM
TDD (pytest)Git
Simulation · WebGL
Show Studio — Fountain Show Preview Engine
Problem
In this industry customers buy from drawings and contracts, then wait months to see their fountain for the first time. Commercial show-design suites can render it beautifully, but they cost thousands, need a serious GPU, and are aimed at the programming phase — not the moment you are trying to win the job.
What I built
A browser-based preview engine for the quoting stage. Import the customer's real site plan (DXF or PNG, parsed in a streaming Web Worker so 2 MB+ files never freeze the tab), place catalogue hardware by click, generate choreography from an audio track (FFT beat grid, band split, section detection), play the show back in 3D and export a branded video. Devices are modelled from real hardware behaviour — jet ballistics from flow and nozzle diameter, under-nozzle ring LEDs that light the water column from inside and cast a caustic pool, RGBW mixing where the white channel screens over the hue instead of washing it out.
Stack
three.jsWebGL2GLSL
Web WorkersWeb Audio / FFT
DXF parsingMediaRecorder
no framework, no CDN
AI · Microservice
AI Microservice Stack — Tool-Use, RAG & Evals
Problem
Wanted a single, coherent stack demonstrating the core building blocks of a production AI service, rather than four disconnected demos.
What I built
A containerized FastAPI service with two endpoints: an LLM tool-calling agent loop that turns a free-text spec into a structured bill of materials, and a RAG endpoint that answers questions from a Postgres/pgvector store with cited sources (or an honest "not in context" instead of guessing). Provider-agnostic through the OpenAI SDK against OpenAI or Gemini's OpenAI-compatible endpoint. An LLM eval harness scores both endpoints against golden test cases and gates CI on regressions. Every path is mock-testable offline with zero API key or database.
Stack
FastAPIDocker Compose
Postgres / pgvectorOpenAI SDK
LLM evalsn8n
Web · Open source
AquaTronic Stock Manager — Inventory & Production Web App
Problem
Inventory and production were tracked manually: no shared, searchable, photo-aware system, and no easy way to keep data in sync across devices.
What I built
A single-file web app with cloud sync via a lightweight JSON store, no heavy backend. Inventory/production tracking, photo embedding for parts, Turkish-aware bilingual search, and semi-automated stock deduction driven by production activity.
Stack
HTML / CSS / JSSingle-file SPA
npoint.io (JSON store)GitHub Pages
Outcome
In daily production use at Aquatronic, replacing manual tracking, and since grown into a multi-user ERP (inventory, production orders, BOM consumption, CRM) on Supabase Postgres with row-level security, used daily by 8 people including management. The full ERP source is public, sanitized end to end: real business data replaced with synthetic samples, git history included.
Automation · OCR
Business-Card / Fair-Notebook OCR Scanner
Problem
Staff return from trade fairs with handwritten notebooks and stacks of business cards. Re-typing all of it into the CRM by hand is slow and error-prone.
What I built
A Flask web tool that ingests scanned pages and PDFs, extracts text with pdfplumber, runs Tesseract OCR on images and handwritten notes, and outputs structured contact data ready to feed the CRM pipeline.
Stack
PythonFlask
pdfplumberTesseract OCR
Native · Protocols
AquaCONFIG v2 — Native DMX/RDM Device Address Manager
Problem
Commissioning lighting and fountain installs means discovering, addressing, and configuring DMX/RDM fixtures in the field, and off-the-shelf tools couldn't expose everything the team needed.
What I built
A dependency-free native Windows desktop app implementing the full ANSI E1.20 (RDM) stack on DMX512: device discovery, standard GET/SET messages, and custom manufacturer-specific PIDs. While testing against real hardware I root-caused a fault in a PowerBox repeater that was silently blocking RDM traffic.
Stack
C++Win32 APIGDI
DMX512ANSI E1.20 RDMCustom PIDs
USB-to-DMX serial