Dialler rule engine
Query compilationCampaign and contact-list management for contact-centre tenants. An operator writes conditions over the live columns, either in a visual builder or as a SQL WHERE clause, previews the matching set, and then applies bulk actions to it: priority, urgency, agent assignment, disabling contacts. Every run is audited per contact, and a rule can run on a schedule instead of by hand.
The condition tree is compiled into the platform's own filter parameters, and only the leaves of a top-level AND chain are pushed down, so a wrong push can never widen the set the action runs against; the remainder is evaluated locally. Which parameters are supported was not assumed: the API ignores unknown parameters silently, so one counts as supported only after a deliberately non-matching value is shown to shrink the result count.
Next.js · TypeScript · Postgres · Drizzle · OAuth2 + PKCE · On-device LLM
Agentic Report Studio
Second place, AI hackathonReporting product for tenants whose requirements fall outside the platform's standard reports. Users describe what they need and get a governed query against the warehouse. Second place at the AloTech AI Hackathon, July 2026, and in production afterwards with real tenants.
No generated query executes until it passes a dry-run cost estimate against configured limits, so an expensive mistake is refused rather than billed. 67 ordered migrations, with separate unit, API, end-to-end and security suites.
Next.js · TypeScript · BigQuery · Postgres · Tool-calling agent
Reporting client for iOS and Android
Mobile deliveryPhone client for the reporting product, built to match the web app screen for screen rather than offer a reduced version of it: conversational reporting with streamed answers, saved reports, and dashboards with cross-filtering and drill-down. Routes are deep-linkable and mirror the web paths, and the interface ships in Turkish and English.
Sign-in reuses the platform's existing OAuth flow inside an in-app web view and lifts the resulting session cookie into the native cookie store, so the phone client talks to the same backend with no second authentication path to keep in step. The 2,122 interface strings were taken from the web app verbatim rather than translated again, which is what keeps the two clients saying the same thing.
Flutter · Dart · Riverpod · go_router · Material 3
Curyy
A product owned end to endNative Android product I build and run myself, aimed at the Philippines: it logs what you eat and gives allergy, calorie and budget guidance in a floating overlay. With per-app consent it reads the screens of allow-listed food delivery apps as text, so an order becomes a logged meal without anyone typing it in. It writes nutrition back to the phone's health platform, tracks spending against a budget, and exposes its own MCP server so an assistant can read the diary and log a meal.
Text, never screenshots, and only from apps the user has allow-listed one at a time — a tool that reads your screen has to be narrower than it is capable of being, or nobody should install it. The screen classifier has a parity test so the on-device path and the reference path cannot drift apart, and MCP tokens are read-only unless a write scope is granted explicitly.
Kotlin · Android · Jetpack Compose · Health Connect · MCP · Postgres
CRM to contact-centre bridge
Integration middlewareLets a sales team push leads and deals out of their CRM straight into a dialling campaign, with their own field mapping, triggered from a workflow action, a button on the record, or automatically when the record changes. One codebase with the CRM side and the contact-centre side both behind provider interfaces, so a second CRM or a second platform is an implementation rather than a fork.
A CRM app cannot hold a secret. It is configuration, interface extensions running in the vendor's sandbox, and HTTP callbacks the vendor posts to, and the CRM never talks to the contact-centre platform directly. This backend is the part that can be trusted with credentials: it brokers the OAuth, holds each customer's platform credentials encrypted, receives the callbacks and makes the calls. Getting that boundary right was the design decision.
TypeScript · Turborepo · Next.js · Postgres · OAuth2 · HubSpot
May reklamo
A product shipped end to endPublic complaint platform for Philippine brands, government offices and public authorities, in English and Tagalog. Complaints and replies are written in a rich-text editor, supporting files are attached as screenshots or documents, and sign-in is with Google. Built and run outside work, on my own.
Bilingual throughout rather than translated at the edges, because a complaint written in Tagalog has to read as the primary version and not as a secondary copy of an English one.
Next.js · TypeScript · Postgres · Prisma · Vercel Blob · TipTap
Call search and bulk recording export
Multi-tenant product deliveryMulti-tenant tool for finding calls with the full filter set an operations team actually uses, then downloading the recordings — one at a time or an entire result set — or delivering them to an FTP, FTPS or SFTP target. Any tenant onboards itself: type the tenant address and the branding switches to match; sign in with the tenant's own single sign-on, then add your own API credentials.
Nobody's credentials are shared and none are held centrally. Each person brings their own, so what they can see is exactly what their credential allows, and there is no account in the middle that would quietly hold more access than the person using it. Sign-in is the tenant's own OAuth authorization code flow with PKCE, so the session key never reaches the browser.
Next.js · TypeScript · Postgres · OAuth2 + PKCE · SFTP
Softphone shell for Android
Native and web integrationAndroid application that hosts the browser softphone agents already use, so a phone can be the working device. The call session stays alive in the background, the microphone is wired through, incoming calls raise native notifications, and dialling a number from another app hands off into the softphone.
The shell implements no telephony at all. Anything that would need a new native release every time the web softphone changes belongs in the web app, so the native side stays a policy-driven host and call events cross one documented message bridge.
Flutter · Dart · Android · WebView · WebRTC
Demo builder
Pre-sales toolingTool for showing a click-to-connect feature in context. A partner names the page they want it on; the tool takes a static copy of that public homepage, injects the script, and publishes it under a demo URL with a banner linking back to the original site, so a conversation can happen over the partner's own page instead of a generic sandbox.
Only public homepages are copied and every published page carries the banner and the link back, so a demo cannot be mistaken for the real site.
Next.js · TypeScript · Postgres · NextAuth
Browser test platform
Test automationTest platform for an ordering integration. Scenarios are stored and edited centrally rather than checked in as scripts, run in real browsers on demand, watched live while they run, and their artefacts filed automatically. Access is by role, and a new account has to be approved before it can run anything.
Run output is streamed to whoever is watching, and each run keeps its own artefacts, so a failure stays diagnosable after the fact instead of only being reproducible.
Next.js · Playwright · Postgres · Google OAuth · Server-Sent Events
API Explorer
Reverse engineering, as a toolBrowser extension that watches the requests a web application makes while you use it and turns them into a searchable collection: every endpoint, its payloads and its headers, with any of them replayable. Published on the Chrome Web Store. It can hand a captured endpoint to an AI provider for analysis, using a key you supply yourself.
This is the method I use, turned into a tool: rather than reading a system's documentation and hoping it is current, watch what it actually does and keep the record. The AI step takes your own key on purpose — a developer tool that captures live traffic has no business also shipping a service that sees it.
TypeScript · Chrome MV3 · DevTools protocol
Workflow-as-code toolkit
Infrastructure as codeCommand-line tooling for the automation platform, so workflows are created, listed, renamed, audited and cleaned up from a script instead of by hand in the editor. Executions can be pulled back down for inspection when something failed overnight.
140 workflows is past the point where the editor is the right interface. Renaming them to a convention, finding the archived ones and reading an execution's actual payload are all things you want to do to the whole set at once, which means the platform's API rather than its UI.
TypeScript · Node.js · n8n REST API
On-call schedule and alerts
Operations toolingApplication that puts the on-call rota and the open alerts behind the same sign-in the platform already uses, so whoever is on shift can see who is on call and what is firing without a second account and a second tool.
Sign-in is the platform's own OAuth authorization code flow with PKCE, so no separate credential is created for the tool and access follows the account that already exists.
Next.js · TypeScript · OAuth2 + PKCE · Opsgenie API
Call flow documentation and build automation
Configuration as codeA written reference for every one of the 52 step types a call flow can contain — what each does, which fields it requires and which are optional — and scripts that build and export flows against it instead of clicking them together in the console.
The field list came from working through each step type deliberately rather than from documentation, because a step that silently accepts a missing optional field is the kind of thing that only shows up in production. Once the reference existed, building flows from it was the easy part.
Node.js · JSON Schema · Markdown
Model Context Tool Inspector
Agent tooling at the edge of the platformBrowser extension for inspecting, monitoring and running the tools a page exposes to an agent through Chrome's experimental in-page tool API. Published on the Chrome Web Store. It needs a flag turned on because the API it targets is not shipped yet.
Built against a browser API still behind a flag, which means the interface can move under it. That is the reason for building it: when this becomes the way pages talk to agents, the useful thing to have is the tool that shows you what a page is actually offering.
TypeScript · Chrome MV3 · WebMCP
Self-hosted automation platform
Workflow automationTwo n8n instances, development and production, carrying 140 workflows with 62 running: bridges between the contact-centre platform and CRMs, scheduled reconciliation, warehouse reporting, and 106 webhook endpoints other systems call into.
272 of the 929 nodes are hand-written code, which is the honest measure of this platform's limit: the triggers, the branching and the scheduling are worth having, and the shaping in between usually has no node that does it. Development and production are separate instances so a half-finished flow cannot answer a live webhook.
n8n · Docker Compose · Postgres
RAG Lab
Explaining a system by building itTeaching tool that walks through a retrieval pipeline one stage at a time — ingestion, chunking, embeddings, sparse index, retrieval, reranking, context packing, generation, validation — and puts BM25, vector, hybrid and hybrid-with-reranker side by side so the difference is visible. Explanations come in a beginner and a technical register.
The embeddings and scores are deterministic mocks and the tool says so on the page. A teaching simulator that quietly used real model output would be unrepeatable between two people looking at it, and someone would eventually cite its numbers as a benchmark.
TypeScript · Next.js · KaTeX
Digital business card
Front-end deliveryA single page that hands over contact details, with a QR code for the certification list. Written by hand with no framework and no build step.
Three files served as they are. Anything that needs a build to show a phone number is over-built.
HTML · CSS · JavaScript