Business Systems Analyst at HeyMax, a loyalty and travel rewards platform in Singapore.
I build the systems that keep operations running and improving: docs-as-code platforms, workflow automation, and tooling that helps teams work with less friction.
At HeyMax, I own the operational backbone. In practice, that looks like:
- Docs-as-code platforms. CI/CD pipelines that sync documentation across Git, Notion, and our project management tools. Includes automated quality validation and knowledge graph analysis.
- Workflow automation. n8n orchestration, data pipelines, and process tooling. The goal is turning manual ops into repeatable, auditable systems.
- AI-assisted operations. Custom AI skills and integrations so the team can find and act on operational knowledge without digging through docs.
- calvin.sg — My personal landing page: who I am, what I'm working on now, and a live tracker for this year's cycling goal.
- cc-menubar — Why do Claude Code quota tools only show what you've already spent? A macOS menubar gauge that shows runway (time to reset) instead.
- mac-upkeep — Why do dev tools scatter caches and updates across macOS with no coordinated cleanup? A zero-config CLI that runs unified maintenance on boot and weekly via launchd.
- granola-to-minutes — Why should meeting AI summaries stay trapped in one vendor's cloud? A one-time migration CLI exporting Granola transcripts, summaries, and notes to Minutes-native markdown — with optional Claude-powered extraction of action items and decisions.
- homebrew-tap — Why ship install instructions when
brew installexists? A personal tap that turns every CLI above into a one-line install on macOS, auto-bumped by release-please dispatch. - template-python-cli — Why re-scaffold release plumbing for every new CLI? A Python starter with
uv,typer,hatchling, release-please, PyPI OIDC, and Homebrew tap dispatch wired in. - template-typescript-cli — Same painpoint, TypeScript side: commander, Biome, Vitest, release-please, and npm OIDC publish — cloned via
gh repo create --template.



