A large set of interactive sites each carried its own repository and deployment configuration, so every new site required a pipeline to be configured manually. The documented setup ran to nine steps before a site could publish, ending with a manual copy of the build output into place.
A shared model was designed instead. One build project serves the estate, output is routed by convention, and the CDN is invalidated on publish. A new interactive now requires four steps, all concerning the content itself, and the deployment configuration is shared rather than recreated each time. The model was proven across the full build and publish path on a reference site, then documented so that the rest could adopt it without individual configuration.
2026MediacorpGitHub Actions, CodeBuild, S3, CloudFront, IAM
Approval gate for infrastructure changes
plan→saved artifact→approval gate→apply saved plan
Infrastructure changes previously ran from plan straight to apply, so a destructive change or an unintended permissions edit could reach production without review. A gate was built between the two stages. The pipeline runs the plan, publishes it as an artifact, and stops. A reviewer is notified by email, examines the plan and an impact summary in a web UI, and approves or rejects it. On approval, the pipeline applies that exact saved plan rather than planning again, so that the plan reviewed is the plan applied.
The approval service is written in Python. Because gates of this kind are typically resented by the teams subject to them, the approval model was developed with the product team that would operate under it rather than imposed on them, and it has run in production for that team since. A second version is scoped to add approval expiry and backup approvers.
Lumora is a guided goal-setting web app that turns free text into a personalised vision board, designed and built independently across design, frontend, backend and deployment. The frontend is framework-free JavaScript, comprising a five stage flow on a small state machine and an SVG scene in which one value between 0 and 1 drives the sky, palette and landscape across the whole experience. Generation runs server side on Cloudflare Pages Functions, with one endpoint covering five structured tasks against the Claude API, and prompts and keys never leave the server.
The welcome screen and the five stage walk.
The more demanding half lay around the model call. A content check runs before generation, with a crisis support path on the client. Every call carries a timeout, schema validation, one retry on a parse failure and a client side fallback, so that a slow or faulty response never breaks the flow. Rate limiting sits in middleware on Cloudflare KV, per IP and with a daily ceiling, because the endpoint is public and unauthenticated. The board exports to PNG on canvas using a two pass layout that measures before it draws.
The app was tested in public at a booth at Ideasfest in Singapore, where the public were observed using it unassisted on a tablet alongside an open-ended drawing activity serving the same purpose. The hypothesis was that a guided, tap-based flow would outperform a blank canvas, and this was borne out; people consistently chose the guided vision board. Eighteen people progressed far enough to leave an email, and fourteen joined the waitlist.
The production CI servers used by every product team were migrated onto new infrastructure, and the old hosts were retired at the end. A 43GB state transfer was verified before cutover. The version upgrades ran inside declared one-hour windows, and both windows were met. To remain within the window, the local copy of the backup was deliberately dropped in favour of the infrastructure snapshot, and the tradeoff was recorded at the time.
2026MediacorpJenkins, Linux, systemd, DNS
Enterprise SSO rollout
Single sign on for an engineering organisation, validated through sandbox testing and a four-user pilot on the main organisation, with participants chosen to cover both corporate and non-corporate identities. Provisioning assigns identities organisation-wide in advance rather than per invitation.
2026MediacorpSSO, SAML, identity federation
Code security programme
This work covers ownership of code security tooling and reporting across an engineering organisation. The weekly report was restructured so that the portion a lead needed to act on was separable from the rest, and it named which repositories belonged to which owners. Owners subsequently began recording their own conclusions in the tracker rather than routing them centrally, and at least one lead responded to the report with a scoping decision rather than a question. The work also covers prevention gates to prevent issues from being introduced rather than catching them later, and vendor evaluations tested against real team workloads rather than vendor demos.
2025 to 2026MediacorpSAST, SCA, secret scanning, CVE triage
National news platforms
Features were delivered across CNA, Berita and Seithi, Mediacorp's English, Malay and Tamil news platforms, including MyFeed personalisation, text to speech and LiveBlog. Solution design and code review covered standalone interactive CNA Lifestyle products built in React.
2021 to 2024MediacorpReact, Vue, Drupal, TypeScript
Earlier work
Union Private Limited 2020 to 2021
Primary developer on Craft CMS builds for enterprise clients, including City Developments Limited and My Animal Buddy for Singapore Zoo. Work covered design through deployment and ongoing maintenance.
Fitness and Lifestyle Group 2017 to 2019
Frontend and CMS development on Umbraco and Sitecore for in-house sites and web applications, delivered remotely from the Philippines for the Australian market.
7th Media Digital Studios 2015 to 2017
Responsive WordPress sites built in PHP for a United States retainer client, with requirements gathered directly from the client and features added to existing sites after launch.
2015 to 2021Craft CMS, Umbraco, Sitecore, WordPress, PHP, JavaScript