Kuan Yu

Projects

The curated catalogue — 33 public things I've built, sorted by what they are.

Click any project for its workflow and the interesting AI bits. Client work anonymized.

SaaS / product

Shipped products with real users. · 1

Client delivery

Forward-deployed builds for clients (anonymized). · 3

Workflow / automation

Messy human workflows turned into systems with a human gate. · 1

Growth tooling

Distribution and research tooling I built for my own campaigns. · 2

Infra / harness

Agent harnesses, pipelines, and the plumbing under the builds. · 3

Tools / utilities

Small sharp tools that do one thing. · 11

Content / research

Research, writing, and knowledge work. · 7

Experiments / learning

Prototypes and learning repos — built to find out. · 5

AI Tax Singapore

SaaS / product self ai-core
what it is AI Tax Singapore (aitax.sg) is a human-in-the-loop AI platform that turns a Singapore company's raw financial documents into a draft corporate-tax computation and IRAS Form C-S Lite submission pack for Year of Assessment 2025. An LLM engine extracts figures from PDFs/statements, classifies every expense against the Income Tax Act 1947 (Section 15 prohibited first, then Section 14 deductibles, then 200%/250% enhancements and special caps), computes the tax, and flags anything below 80% confidence — but nothing is filed until a tax professional reviews and approves it
role Architect / full-stack AI engineer for the customer-facing AITax.sg platform.
outcome A genuinely production-shaped regulated-AI build: deployed full stack (Next.js + FastAPI + Postgres + queue + Claude Agent SDK worker on DigitalOcean Singapore), a documented YA2025 tax-computation skill that cites ITA sections and emits five auditable artifacts per job (tax_computation.md, extracted_data.md, review_notes.md, tax_data.json, form_cs_lite_output.json), and an enforced human-review gate before any filing. Conservative on results: no confirmed paying customers (customers: 0 in config), accuracy figures in the README (~97%, >95% target) are internal targets not independently audited, and the public endpoint has had availability gaps. The durable win is the FDE pattern and the engineering — rule-table + LLM split kept auditable, confidence-gated escalation, and a clean separation of deterministic arithmetic from model judgment — proven out across an unusually deep experiment lineage.
status shipped
started 2025-07-15

Workflow · input → AI → gate → output

SOURCE
Client documents financial statements, PDFs, ledgers, IR8A/forms
Job submission S3 signed URL + HMAC, dropped on a JSON queue
AI PROCESSING
Extract LLM parses figures from statements/PDFs
Classify ITA rule-table + ripgrep over knowledge/, S15→S14→enhancements
Compute + flag deterministic tax engine; <80% confidence escalated
HUMAN GATE
Tax pro reviews reads review_notes.md + citations, approves or edits
Nothing auto-files professional sign-off required
OUTPUT
Computation + Form C-S Lite tax_computation.md + form_cs_lite_output.json
Audit trail ITA-cited, confidence-scored, source-linked

The interesting AI bits · not the framework

Structured extraction + classification, not free-form chat The LLM parses unstructured financials into typed line items, then classifies each against the Income Tax Act in a fixed precedence (Section 15 prohibited FIRST, then Section 14 deductibles, then 200%/250% enhancements, then special caps). Every classification carries an ITA section citation, search reasoning, and a confidence score.
Deterministic compute / LLM split for auditability The model does judgment (extract, classify, cite); the actual tax arithmetic is deterministic code. This rule-table + LLM split is the core design choice that keeps a regulated output auditable — a tax pro can trace every figure to a rule and a source, and OpenTax SG makes this boundary explicit (GPT extraction, deterministic YA2025 compute).
Grep-based retrieval over a curated ITA knowledge base (not vector RAG) Tax-law context is retrieved by ripgrep over a maintained markdown wiki of ITA sections, treatments, rates, and Form C-S Lite mappings (e.g. rg "Section 14D", rg "S-plated|Q-plated"). It is exact-match, citable, inspectable retrieval — chosen over embeddings precisely because regulated answers must be traceable to a named source page.
Accountant-review gate as a first-class system component The human gate is architected in, not bolted on: a dedicated review_notes.md, confidence flagging below 80%, and a hard rule that nothing is filed without professional approval. The portfolio framing makes this the focal point — the gate is what makes a regulated build safe to ship.
Confidence-gated escalation + model tiering Items under 80% confidence or with conflicting rules are escalated for review or deeper reasoning (think hard / think harder), and cheaper models (Haiku) handle bulk grunt work like >20-page PDF scanning and CSV parsing while higher-tier reasoning handles ambiguous classification — an explicit cost/quality routing strategy.
Multi-agent decomposition of regulated work Across the lineage the regulated workflow was decomposed into specialized agents/roles (claude-agents-tax-formc, the 8-agent tax-compute-mvp pipeline) — ingestion, classification, knowledge lookup, computation, verification — rather than a single monolithic prompt.
Eval/verification discipline tax-compute-mvp shipped with archived expected outputs and an eval harness plus a hard "99% of the time you should NEVER run the full pipeline" guardrail; OpenTax SG ships 30 passing tests, a validator that returns requires_review, and fixture mode so reviewers can tell when cached vs live model data was used.

Incentive Proposal Assistant

Client delivery client generic
what it is Proposal-drafting workflow prototype: company context, deck sections, and credential data assembled for human review before a draft leaves the workflow.
role Forward-deployed builder — embedded with a Big-4-trained tax incentives consultant (Incentive/Bro pilot); scoped the real proposal workflow and shipped the first production-shaped tool.
outcome Working local-first prototype that turns company context, master-deck PowerPoint sections, a credential workbook, selected incentives, and fee/rate conventions into near-sendable proposal drafts with human review gates. Validation call completed; surfaced a pivot toward professional training/CPE distribution plus MVP-sprint upsells.
status active
started 2026-05-04

Workflow · input → AI → gate → output

SOURCE
Consultant inputs Company context, tax facts, selected incentives, fee/FX conventions
Master deck + workbook Incentive master PPTX (section-tagged) + credential workbook xlsx
RULES PROCESSING
Deterministic fit scoring Local rules engine flags missing facts and scores incentive fit (no LLM call)
Modular deck assembly Keeps consultant-selected sections, deletes the rest via PowerPoint COM
Placeholder fill Templated replace of {{CLIENT_NAME}}, rate-card, credential, fee placeholders
HUMAN GATE
Tax professional review Consultant keeps final control of the recommendation before send
OUTPUT
Near-sendable proposal Phase 1/2 PPTX draft with credentials, fee wording, validation flags

The interesting AI bits · not the framework

Genuinely non-AI tool (honest note) No LLM anywhere: zero openai/anthropic deps, no model API calls. The 'AI second opinion' label in src/lib/analysis.ts is just a deterministic rule-score band. Value is the forward-deployed workflow capture + reliable document automation (rules-based incentive fit, manifest-driven PPTX section assembly via Windows PowerPoint COM, placeholder substitution), not model intelligence.

OpenTax SG

Workflow / automation self ai-core
what it is Codex/GPT-native, local-first public demo/runtime port of the AITax Singapore corporate-tax computation pipeline.
role Builder — AI Engineer Hackathon (2026-05) build.
outcome AI Engineer Hackathon (2026-05) build: local CLI, a hand-built Obsidian tax-law knowledge graph (ITA sections + concepts + treatments + a generated graph), structured GPT extraction/classification, deterministic YA2025 compute, static workbench, 30 passing tests, and a post-hackathon accountant-review gate.
status shipped
started 2026-05-09

Workflow · input → AI → gate → output

SOURCE
Company doc folder Local financial statement, GL CSV, fixed-asset & donation schedules (md/csv/json)
AITax wiki pack Curated SG corporate-tax wiki: ITA sections, treatments, YA2025 notes, Form C-S Lite mapping
AI PROCESSING
Structured GPT extraction Pulls net profit, revenue, donations, CA candidates into JSON with source refs
Retrieval + classification Queries wiki for compact cited treatment context; GPT classifies only rule-engine leftovers
Deterministic compute Rule engine + YA2025 rates do addbacks, exemptions, CIT rebate — math never from prose
AUTO + HUMAN GATE
Review flags + validation Tags LOW/MED confidence, missing citation, provider-vs-rule items; opentax validate must pass
Accountant review Pack is draft_only; explicitly not a final filing decision without professional review
OUTPUT
Filing pack Canonical filing_pack.json + accountant-readable tax_computation.md + demo.html workbench

The interesting AI bits · not the framework

Cited retrieval over a hand-built Obsidian tax-law second brain The agent's tax knowledge isn't a vector dump or a prompt stuffed with pasted law — it's a curated, wikilinked Obsidian knowledge graph: ITA section pages (s10 through s14P), concept pages (capital-vs-revenue, wholly-and-exclusively, the machinery-or-plant test), treatment pages, filing playbooks, and a generated graph.json. WikiClient.query_context(topics, ya) pulls only the per-topic classification_hint + ITA citation + source_refs it needs, so every classification is grounded in an inspectable, hand-maintained source the author can edit — not the model's memory.
Rules-first, LLM-for-the-gaps classification Deterministic rule engine (depreciation→addback S15(1)(c), S-plated car S15(1)(e), fines S15(1)(h)) resolves what it can; GPT only classifies unresolved line items. Keeps the tax math deterministic and auditable instead of trusting the model end-to-end.
Structured-output extraction & classification GPT must return JSON-only tags (treatment, ITA citation, confidence, reason) — 'do not let prose become the computation source.' Provider explicitly forbidden from computing final tax.
Self-consistency voting --vote 1|3 flag runs multiple classification passes for higher-stakes ambiguous items.
Provenance-tagged confidence + review gate Every item carries confidence and an item-classified-by-provider-vs-rule flag; review_flags surface LOW/MED confidence, missing citations, and high-impact ambiguity for human sign-off.
Fixture/cached fallback for eval reliability Deterministic fixture provider + cached wiki context make runs reproducible offline; fixture path is intentionally visible in output JSON/HTML so reviewers know when synthetic data was used. 30 passing pytest tests.

PM requirements agent with live codebase evidence (consumer-health client)

Client delivery client ai-core
what it is Same-day delivery for a consumer-dental company whose dev is outsourced: a Custom GPT running the client PM's requirements skill with a GET-only Bitbucket Action (scoped read-only token), so any employee can paste a vague stakeholder request and get an evidence-backed classification — 'already supported, here is the file' vs 'new feature, here is the PRD' — before a ticket reaches the metered dev vendor.
role Forward-deployed — same-day design, research, build, and verification of a company-shared Custom GPT wired read-only into the client's Bitbucket codebase.
outcome Paid same-day forward-deployed delivery for a consumer-health company with outsourced development: a company-shared Custom GPT that checks the live codebase (read-only) before classifying stakeholder requests, preventing duplicate feature tickets to the dev vendor. End-to-end verified with a 3-probe suite; champion handoff and sponsor demo script included (client anonymized).
status shipped

Workflow · input → AI → gate → output

SOURCE
Vague stakeholder request Slack/meeting ask pasted by any employee, any device
AI PROCESSING
Infer context PM skill instructions — roles, pain, workflows, assumptions labeled
Search the codebase Bitbucket Action, GET-only, scoped read-only token
Read real files size-gated src reads (format=meta first, 100k-char cap)
HUMAN GATE
Evidence honesty + PM review every capability claim needs a cited file path; PM reviews ticket before it reaches the dev vendor
OUTPUT
Classified ticket + PRD Already supported / config-only / near match / new feature — with citations

The interesting AI bits · not the framework

Evidence before classification The agent must call the codebase Action before claiming a capability exists or is missing; honesty rules force confidence downgrades when a read fails ('indexed-code evidence, not full-file read') — live-observed in testing.
Read-only by construction, at three layers Scoped API token (repository read only) + GET-only OpenAPI schema + instruction-level refusal. The live write-request probe was refused with a dev-ready PR plan offered instead.
Platform-constraint engineering ChatGPT's 100k-char Action response cap handled via pagelen/fields/format=meta gating; the 8k-char Instructions limit handled by a condensed deploy prompt with the full skill in Knowledge; Bitbucket search-API expiry (Nov 2026) isolated behind one swappable operation.

SEA Fertility Genomics

Content / research self ai-assisted
what it is Open research into preimplantation genetic testing for polygenic conditions (PGT-P) availability in Southeast Asia — which IVF clinics can coordinate with overseas genomics labs. Live at genomics.kuanyu.dev.
role Builder / researcher.
outcome Open research mapping IVF clinics across Southeast Asia that can coordinate PGT-P with overseas genomics labs; live at genomics.kuanyu.dev.
status shipped
started 2026-02-27

Workflow · input → AI → gate → output

SOURCE
Open-ended question Where can a SE Asia patient access PGT-P?
Public web sources Clinic sites, regulators, lab providers
AI PROCESSING
Claude web research Iterative broad-to-specific search + cross-source synthesis
Spec + structure gen Generates outreach spec, clinic tiers, email template, CSV schema
HUMAN GATE
Human verification Confirm clinic emails, scope, regulatory nuance, ancestry caveats
OUTPUT
Source-traceable site Static clinic map + tables live at genomics.kuanyu.dev
Reproducible prompt log Every Claude prompt recorded for transparency

The interesting AI bits · not the framework

LLM as the research engine Claude (web search + synthesis) does the discovery — mapping ~56 IVF clinics across 6 countries, providers, costs, and regulation — but the shipped site itself is static with no runtime LLM, so AI is in the process, not the product.
Reproducible prompt-trail logging research-log.md records every prompt verbatim plus what the model did, separating what AI handled from what needed human judgment — an explicit provenance/transparency practice.
Broad-to-specific research scaffolding Deliberate iterative prompting (landscape, then deep dive, then access, then cost, then regional) used to converge on a non-obvious answer in a low-information domain.
AI-generated structure as data contract Model output was shaped into a tiering system and CSV schema (tier, ships_overseas, services) that became the human-maintained source of truth feeding the live data viewer.

PAI Skills

Infra / harness self ai-assisted
what it is A curated collection of Claude Code plugins for learning, content creation, and development workflows.
role Builder — public plugin collection.
outcome Curated collection of Claude Code plugins for learning, content creation, and development workflows.
status shipped
started 2026-03-05

Workflow · input → AI → gate → output

SOURCE
User intent slash command or natural phrasing inside Claude Code
Plugin marketplace /plugin marketplace add phuaky/pai-skills, install per plugin
AI PROCESSING
Skill-routed workflow each plugin packages a prompt/workflow Claude executes (naval-explain, balaji-slides, x-poster, hormozi, spec-driven)
Multi-model fan-out naval-explain queries several models in parallel to pick the clearest explanation
HUMAN GATE
Interactive drill-down user says what didn't click; workflow retries with a new angle / diagram
Spec before code spec-driven interviews for gaps before any code is written
OUTPUT
Work artifact Mermaid diagrams, scored X posts, slide decks, verifiable specs

The interesting AI bits · not the framework

Packaging repeatable AI workflows as installable skills The product is a marketplace of Claude Code plugins (naval-explain, balaji-slides, x-poster, hormozi, spec-driven, email-verifier) — each one a self-activating prompt/workflow unit installable via /plugin install. The AI-engineering is in how the workflows are authored, not in bespoke model code.
Multi-model parallel querying for best explanation naval-explain fans a concept out to multiple AI models in parallel and selects the clearest explanation, then renders it as Mermaid/ASCII/analogy — an ensemble-style 'best of N models' pattern rather than a single call.
Interactive drill-down loop naval-explain treats explanation as iterative: the user signals what didn't land ('I don't get X') and the workflow re-attacks with a fresh diagram/angle — a human-in-the-loop refinement loop baked into the prompt design.
Spec-driven, interview-before-code workflow spec-driven captures intent, interviews the user for gaps, and produces a verifiable spec before any code is written — encoding a prompting discipline (clarify-then-act) as a reusable plugin.
Scoring/quality-gate prompting x-poster optimizes X posts with a quality-scoring step, encoding an LLM-as-judge style evaluation into the workflow rather than just generating text.

NS Rideshare

Tools / utilities self ai-assisted
what it is Community rideshare billboard for the Network School community — 500+ users.
role Builder — community platform.
outcome 500+ users; community-run rideshare billboard (not a SaaS product).
status shipped
started 2026-02-21

Workflow · input → AI → gate → output

SOURCE
Commuter intent natural-language request in Claude Code, or web UI form
Ride/driver data NeonDB Postgres: rides, drivers, bookings
AI / TOOL LAYER
MCP server exposes find_rides / create_ride / join_ride / book_driver as tools to an LLM agent
Hono API on Workers deterministic CRUD; the tools just wrap typed endpoints
AUTO GATE
Auth + validation JWT httpOnly cookies; server-side checks before any write
OUTPUT
Booked ride ride created/joined, driver assigned, persisted
Live platform React/Vite UI at ns-rideshare.com, 400+ users per repo

The interesting AI bits · not the framework

MCP tool-use as the primary interface (chat-as-UI) The standout AI choice is shipping a Model Context Protocol server so the whole product can be driven from Claude Code with no UI — six typed tools (find_rides, create_ride, join_ride, my_rides, book_driver, list_drivers) wrap the REST API so an LLM agent does the booking. Otherwise this is a conventional full-stack CRUD app (React + Hono on Cloudflare Workers + NeonDB); there is no model in the core request path, so AI is an access layer, not the product.

X-rAI

Tools / utilities self ai-core
what it is Chrome extension to filter noise from X/Twitter feed using local AI
role Builder — local-AI extension.
outcome Chrome extension that filters noise from the X/Twitter feed using local AI; live at snratio.xyz.
status shipped
started 2025-12-19

Workflow · input → AI → gate → output

SOURCE
Rendered tweet content script reads tweets already in YOUR DOM; never calls X's API
Content memory cache so you never see the same tweet twice across sessions
AI PROCESSING
Cheap-filter cascade reply check → keyword safelist → regex spam/entertainment prefilter before any model call
Local Ollama classify phi4-mini / gemma2:2b, up to 5 concurrent, rate-limited; everything on-device
AUTO GATE
5-dim score threshold relevant/novelty/specificity/density/actionable; RELEVANT=0 ⇒ noise; 4-5=signal, 0-3=noise
Confidence + fallback errors fall back to noise; cache applied on hit
OUTPUT
Noise hidden instantly subtract, don't add — no sidebars, no verdict cards
Copy-paste replies reply suggestions in your voice, manually pasted; zero auto-posting

The interesting AI bits · not the framework

Local LLM classification as the entire product Every tweet is classified signal vs noise by a local Ollama model (phi4-mini ~92% / gemma2:2b ~88% on a 89-tweet benchmark) — no cloud, no API keys, no accounts. The classifier IS the feature, which makes this genuinely AI-core.
Structured-JSON 5-dimension scoring prompt The system prompt forces strict JSON {prediction, confidence} and scores 5 binary dimensions (RELEVANT, NOVELTY, SPECIFICITY, DENSITY, ACTIONABLE) with a hard rule: RELEVANT=0 ⇒ noise regardless of the rest; 4-5 = signal, 0-3 = noise. Persona-anchored ('classify for an AI engineer and entrepreneur') to bias the boundary.
Cost-saving filter cascade before the model Most tweets never reach the LLM: reply-detection, a tech/AI keyword safelist, instant regex spam/bait rejection, and an entertainment/video prefilter run first, with a per-content cache applied on hit. The expensive model call is the last resort, with concurrency caps (5) and a 100-calls/min rate limiter.
Graceful degradation to a safe default Malformed JSON triggers a regex sniff for 'signal', and any error or timeout falls back to {prediction:'noise', confidence:0.5} — the system fails toward hiding rather than leaking noise, plus a batch /api/chat path for multi-tweet classification.
Voice-matched reply generation, human-gated A separate REPLY_SYSTEM prompt emits a JSON array of short (5-15 word, <80 char, no-hashtag) reply options in distinct styles (curious/insight/connect) — but the user copy-pastes manually. Generation is AI; posting is deliberately never automated to avoid bot behavior.

Claude Code Infrastructure Showcase

Infra / harness self generic
what it is A curated reference library of production-tested Claude Code infrastructure.
role Curator.
outcome Curated reference library of production-tested Claude Code infrastructure patterns.
status shipped
started 2025-10-30

Workflow · input → AI → gate → output

Input
Your project + Claude Code src
skill-rules.json triggers config
Activation
UserPromptSubmit hook scans prompt + file context hook
Progressive-disclosure skill load (500-line rule) skill
Review gate
Dev split: copy only the 2 essential hooks, skip monorepo-specific ones human
Output
Auto-suggested skills + 10 agents + 3 commands in your repo out

The interesting AI bits · not the framework

Hook-driven skill auto-activation UserPromptSubmit hook (skill-activation-prompt.ts/.sh) parses every prompt against skill-rules.json trigger patterns so skills self-suggest instead of sitting dormant — the repo's headline pattern.
Progressive disclosure / 500-line rule Each skill is split into a <500-line SKILL.md plus resources/*.md (backend has 12, frontend 11) so the agent loads navigation first and deep-dive files only on demand, dodging context limits.
Dev-docs context-survival pattern Three-file structure ([task]-plan / -context / -tasks) generated via /dev-docs slash command to preserve project knowledge across context resets.
Specialized sub-agent library 10 standalone agent definitions (code-architecture-reviewer, refactor-planner, frontend-error-fixer, auth-route-tester, etc.) packaged as copy-paste markdown for delegating complex tasks.
Honest non-AI-runtime note This is a curated reference library of markdown/config — no model is invoked at runtime. It is infrastructure that shapes how OTHER agents behave, not an AI application; hence generic intensity.

AI fitness-program workflow (private client)

Client delivery client ai-core
what it is Paid client engagement: an AI fitness-programming workflow with a source corpus, authority registry, and review gates before any program is used.
role Forward-deployed — client AI-workflow build via AI Workflow School.
outcome Active client engagement.
status active

Workflow · input → AI → gate → output

Intake & Corpus
Smart Intake input
14h StrongFirst + Blueprint transcripts input
Source Corpus + Authority Registry process
AI Program Generation
Program Generator prompt over corpus ai
Three-Layer Verification
L1 deterministic checks ai
L2 Codex<->Claude adversarial ai
L3 expert (human) review gate
Two-View Output
expert-view.md output
user-view.md + daily delivery output

The interesting AI bits · not the framework

Forward-deployed corpus grounding Sat with the client, ingested 14h of StrongFirst/Blueprint transcripts into a source corpus + authority.registry.yaml so the generator cites trusted material instead of free-styling.
Prompt-as-product generator program-generator.prompt.md turns intake.schema.yaml + corpus into a personalized training program; the prompt itself is the deliverable the client keeps and re-runs.
Adversarial cross-model verification L2 layer pits Codex against Claude to catch each other's errors before any output reaches the human, an explicit two-model check rather than single-model self-grading.
Tiered human-in-the-loop gate L1 deterministic -> L2 adversarial -> L3 expert review pipeline; only L3-passed programs are split into expert-view vs user-view for delivery.
Self-eval loop spec Feature files (A1b workflow-map) encode machine-checkable CONDITION-MET probes (grep tokens, file existence, ARCHITECTURE.md consistency) so Claude Code can self-verify build steps via /loop.

Yesterday Miner

Growth tooling self ai-core
what it is Codex-backed harness for safe autonomous content and outreach operations.
role Builder — autonomous-ops harness.
outcome Public autonomous-ops harness.
status active
started 2026-05-17

Workflow · input → AI → gate → output

SOURCE
Yesterday's signals mines configured X + community context for useful moments
Private product spec 8-section product.md (kept local/ignored) defines what matters
AI PROCESSING
Score against spec Codex-backed scoring of mined moments vs the private product spec
Draft in your voice post ideas + manual Scout DM copy, using a voice/profile built from X history
HUMAN GATE
Telegram approval inbox drafts routed to Telegram; approval is the ONLY path to publishX
Safety gates DRY_RUN, KILL_SWITCH, DAILY_POST_CAP, GRACE_PERIOD STOP window, content filter
OUTPUT
Approved X post published only after approval + pre-publish checks + daily cap
Manual Scout DMs prospect DM copy stays manual-only; harness never cold-DMs

The interesting AI bits · not the framework

Codex-backed autonomous mining-and-drafting agent A 'ralph'-style loop mines yesterday's X/community context for useful moments, scores them against a private product spec, and drafts both post ideas and manual outreach copy — the agentic loop is the product, hence AI-core.
Voice cloning from the operator's own X history 'bun run ingest:voice' builds an ignored voice/profile.md from the configured X history, so drafted posts and DM copy match the operator's actual voice rather than generic LLM tone — a retrieval-into-style-conditioning step.
Spec-as-judge scoring loop Mined moments are scored against an 8-section private product spec (Goal → Done → Observe → Think → Plan → Execute → Verify → Reflect), using the spec as the rubric for what counts as a useful signal — an LLM-as-evaluator pattern grounded in a structured contract.
Human-in-the-loop approval as the only publish path No live action happens without explicit Telegram approval; Scout prospect DMs are routed as manual copy and never auto-sent. The agent can think and draft autonomously but cannot act externally on its own.
Defense-in-depth safety harness Live publishing is dangerous-by-default: DRY_RUN blocks live posts, KILL_SWITCH halts before work, DAILY_POST_CAP throttles, GRACE_PERIOD_SECONDS gives a post-approval STOP window, plus content filtering and pre-publish checks. A verifier statically checks that private state is ignored, gates are intact, and evidence is redacted.
Public-harness / private-payload separation The reusable system stays public while product.md, prospects, drafts, credentials, caches, and runtime evidence are git-ignored and local — a clean architectural boundary so the agent infra can be open-sourced without leaking operational data.

NanoDoc OSINT

Content / research self ai-core
what it is Open-source-intelligence document analysis tool.
role AI Engineer / AI Data Engineer (per kuanyu.dev role tags).
outcome Live at nanodoc-osint.pages.dev.
status shipped

Token Daddy

Content / research self generic
what it is An investment thesis on compute power as the new scarcity.
role Author.
outcome Investment thesis on compute power as the new scarcity.
status shipped
started 2026-04-06

Phuaky Gatsby Blog

Content / research self generic
what it is This site. A Gatsby blog with a default-deny publishing gate. Started from Nick Ang's open-source blog — credit where due.
role Builder.
outcome Gatsby personal blog (phuaky.com).
status active
started 2023-12-27

Toastagents

Infra / harness self ai-assisted
what it is Power users only. The format does the filtering.
role Builder.
outcome Power-user agent format/tooling experiment ('the format does the filtering').
status archived
started 2026-04-16

Table Tennis

Content / research self generic
what it is Personal table tennis knowledge base - blade configurations, rubber science, playing style analysis, and equipment selection frameworks.
role Author.
outcome Personal table-tennis knowledge base — blade configs, rubber science, playing-style and equipment frameworks.
status active
started 2026-04-06

Cmdv

Tools / utilities self generic
what it is Paste formatter for AI output. Converts Claude CLI / markdown output into clean, copy-ready text for WhatsApp, Discord, and X.
role Builder.
outcome Paste formatter that converts Claude CLI / markdown output into clean copy-ready text for WhatsApp, Discord, and X.
status shipped
started 2026-03-12

X Poster

Tools / utilities self ai-core
what it is X (Twitter) posting plugin for Claude Code. Transform raw ideas into engagement-optimized posts with quality scoring.
role Builder — content automation skill/plugin.
outcome Claude Code skill/plugin that transforms raw ideas into engagement-optimized X posts; includes a daily posting-automation variant. Built across 3 working copies.
status shipped
started 2026-02-11

Viet Listener

Tools / utilities self ai-assisted
what it is Learning Vietnamese the way it's actually spoken — not the Duolingo way.
role Builder.
outcome Vietnamese listening tool — learning the language the way it's actually spoken.
status archived
started 2026-02-19

PongRank

Experiments / learning self generic
what it is ELO-based ping pong leaderboard with Google Sheets backend
role Builder.
outcome ELO-based ping-pong leaderboard with a Google Sheets backend.
status shipped
started 2026-01-08

Tet Talk

Tools / utilities self ai-core
what it is Real-time Vietnamese translation and learning tool for communicating with Vietnamese in-laws during family gatherings.
role Builder — hackathon submission.
outcome Real-time Vietnamese translation/learning tool for communicating with Vietnamese in-laws; Gemini 3 Singapore Hackathon work (Jan 2026). Built across multiple working copies.
status active
started 2026-01-10

Hyrox Race Analyzer

Tools / utilities self generic
what it is Hyrox race analyzer and pacing simulator.
role Builder — fitness tool.
outcome Personal fitness analysis tool.
status active
started 2025-11-29

NS Nutrition Planner

Tools / utilities self generic
what it is Network School nutrition/macro planner (lean and jacked).
role Builder — nutrition/macro planner.
outcome NS nutrition planning tool.
status active
started 2025-06-09

Grok History Deleter

Tools / utilities self generic
what it is Browser script to bulk-delete Grok chat history.
role Builder — browser utility.
outcome Small browser utility.
status active
started 2025-02-19

X Cheapest-Country Subscription Finder

Tools / utilities self generic
what it is Finds the cheapest country for an X/Twitter subscription.
role Builder — utility.
outcome Small utility.
status active
started 2024-09-17

Shopee Shop Revenue Calculator

Tools / utilities self generic
what it is Chrome extension estimating Shopee shop revenue.
role Builder — Chrome extension.
outcome Small Chrome extension.
status active
started 2023-12-05

Email Verifier

Growth tooling self generic
what it is Email verification utility.
role Builder — small utility.
outcome Small public utility.
status active
started 2026-02-21

Workflow · input → AI → gate → output

Input
Email list (JSON array) input
Layer 1 — MX Check
Parallel DNS MX lookup process
Drop dead domains gate
Layer 2 — SMTP Check
Catch-all probe (fake RCPT) gate
RCPT TO per mailbox (250/550) process
Output
Verified list (EXISTS/CATCH_ALL/UNKNOWN) output

The interesting AI bits · not the framework

No AI — pure protocol engineering Genuinely generic utility with zero AI/LLM involvement. Verified by reading both source files (verify_mx.js, verify_smtp.js): no model calls, no embeddings, no inference. Uses only Node.js built-ins (dns, net, fs) with zero npm dependencies. The 'intelligence' is network protocol behavior, not ML.
Two-layer fail-fast verification pipeline Cheap-test-first architecture: Layer 1 does parallel DNS MX lookups (<2s for 100+ domains) to instantly cull dead domains before the expensive Layer 2 SMTP step (~1s/domain). Output of Layer 1 feeds Layer 2, so per-mailbox socket cost is only paid for domains that survive the cheap gate.
RCPT TO probing without sending mail Speaks raw SMTP over a TCP socket and reads response codes (250 = exists, 550 = dead, 450/451 = temp-fail kept on benefit-of-doubt), disconnecting after RCPT TO so no message is ever delivered. This is the same mailbox-existence technique paid services (ZeroBounce, NeverBounce) charge for.
Catch-all detection to avoid false positives Before per-mailbox checks, sends a deliberately fake address; if the server accepts it, the domain is flagged CATCH_ALL and individual verification is correctly treated as unreliable rather than reporting every address as valid — a classic source of bad data in naive verifiers.
Conservative classification under uncertainty Ambiguous signals (greylisting, temp failures, catch-all) resolve to UNKNOWN/CATCH_ALL and are KEPT rather than dropped — biasing toward false-negatives-on-removal so legitimate addresses aren't silently purged. Tunable via EHLO_DOMAIN and SMTP_TIMEOUT env vars; aware of port-25 egress blocking on AWS/GCP.

Keep or Replace

Content / research self generic
what it is Singapore COE-expiry decision deck — keep the Lexus or replace with a used EV.
role Builder.
outcome Live decision report at keep-replace.kuanyu.dev.
status shipped

NS Referral

Experiments / learning self generic
what it is Referral system for Network State memberships.
role Builder.
outcome Live at ns-referral.pages.dev.
status shipped

CC Install Party

Experiments / learning self generic
what it is Claude Code install-party event page.
role Builder / event host.
outcome Live event page at cc-install-party.pages.dev.
status shipped

Carousell Deals

Content / research self generic
what it is Deal tracking and price alerts for Carousell listings.
role Builder.
outcome Live at carousell-deals.pages.dev (paired with the Carousell MCP).
status shipped

Meeting Prep AI

Experiments / learning self
what it is Voice-triggered AI assistant that researches who you're meeting and briefs you before calls. Built at Google Gemini Hackathon 2026.
status published
started 2026-01-11

B2B Sales Outreach System - From Scraping to Autonomous Agents

Experiments / learning self
what it is Complete B2B sales infrastructure with automated lead scraping, 18-stage folder-based pipeline, and 24/7 AI-powered prospect research running on a VPS. Built for AITax.sg, designed to be generalizable.
status active
started 2025-09-22