EN 中文

John Tung · 童曉瑜

Data Lead · Principal Data Engineer.

Ten years building data platforms on GCP, AWS and Azure; two and a half of them leading a Data Team. Today I run the data function at a media group — the platform, the AI on top of it, and the people — and I still ship code. I pick tools to fit the problem, and I judge the work by whether non-engineers actually use it.

About

Based in Taipei. I lead the data function at a media group and built its platform from zero: cross-platform ingestion (Facebook, Instagram, Threads, YouTube, GA4) into BigQuery, dbt modelling, three production tools that executives, marketing leads and editors open daily, and generative AI running in production with real quality gates. Before that I led a four-person Data Team for two and a half years.

Across previous roles I've shipped on GCP, AWS, and Azure, orchestrating with Airflow and lightweight schedulers, and processed enough data with PySpark, dbt, and BigQuery to know that the right tool is the one that matches the actual requirement — including the team's ability to operate it.

I spend equal time on data modeling and on the boring infrastructure that keeps tokens fresh, jobs idempotent, and bills small.

What I care about most now is making AI trustworthy enough for a newsroom: grounded generation, evaluations that fail the job when quality slips, and agents that work inside explicit rules. It's really a return to the text mining and sentiment analysis I started out in.

Selected Work

Things I've shipped that made a measurable dent.

240+ posts auto-published

Content automation system (Distill)

A content line on a single Mac: picks topics from frontline sources daily, rewrites them in Traditional Chinese, fact-checks, auto-publishes to several social channels, then sediments them into an owned website. 3 channels, ~40k views/month, zero daily human ops.

Engineered for "reads human, never wrong" as a reliability problem — a fact-check gate, a four-layer publish defense, de-AI style rules, and an engagement feedback loop. This site is one of its outputs.

LLM Pipeline Automation Threads API
Gemini in prod with quality gates

Generative AI that stays inside the lines

Gemini runs inside BigQuery (AI.GENERATE) to classify comment sentiment and post topics and to write commentary grounded only in the current figures; Vertex embeddings + KMEANS turn negative comments into named themes. A comment RAG layer is gated by a weekly LLM-as-judge evaluation — when retrieval quality drops, the job fails instead of quietly degrading.

A four-tool newsroom agent is live: no free-form SQL, a mandatory self-check after every draft, hard cost caps, and a weekly replay eval. Shared caching keeps AI cost flat as usage grows.

BigQuery AI.GENERATE RAG + LLM-as-judge Agent guardrails
3 products used by non-engineers

Dashboards executives and editors actually open

A group digital-revenue dashboard for C-level, a social-performance dashboard for marketing leads and editors, and a tool that typesets monthly revenue tables into print-ready newspaper PDFs — all on Streamlit + Cloud Run with Google sign-in.

A three-tier ACL lets managers add and remove users themselves, with an audit trail and usage analytics, so nobody has to file a ticket to get access.

Streamlit OIDC + ACL Cloud Run
$300 → <$1 monthly cost

Inherited pipeline rewrite

Took over a Composer + Apps Script revenue pipeline and replaced it with BigQuery External Tables + Scheduled Queries. Same outputs, same freshness, ~300× cheaper to run each month.

The lesson I keep applying: most "pipelines" don't need an orchestrator — they need a query that runs on a schedule.

BigQuery Scheduled Queries Cost
34 jobs staggered, monitored

Cross-platform ingestion that fails loudly

Facebook, Instagram, Threads, YouTube and GA4 into BigQuery via 34 Cloud Run Jobs on staggered schedules, modelled in dbt with append-only history — every change preserved, not just the latest state.

dbt source freshness, account-level checks and Cloud Monitoring catch the worst class of failure: a job that succeeds but writes nothing.

Cloud Run Jobs dbt BigQuery
0 humans in the auth loop

OAuth without tickets

Dual-account Threads OAuth across 8 scopes, with a weekly Cloud Run Job that rotates the 60-day token through Secret Manager — nobody gets paged to re-authorise. For the editors, a pure-frontend helper on Cloudflare Pages walks them through granting API access themselves: static hosting, zero backend, near-zero ops.

OAuth 2.0 Secret Manager Cloudflare Pages

Currently

What's on the workbench.

  • Requirements as data

    A PoC that turns requirement interviews into a typed, traceable record store — every requirement points back to what the user actually said — audited by five checker agents on different models, with an A/B run against the previous approach.

  • Data governance that people can act on

    Closing the gaps found in a governance inventory — cost attribution, least-privilege access, access requests to IT — and writing each decision down so the team and its AI agents work from the same rules.