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 Taoyuan, Taiwan. 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.

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
MCP server in the official registry

RealPing: property data for people and agents →

A side product I built and run alone. It cleans Taiwan's property-transaction records into comparable prices per usable area (實坪), then serves them through a REST API and an MCP server that share one query core. API keys are stored hashed and usage is metered per account.

Found that idle MCP clients reconnecting every few minutes were burning quota and cloud cost, and fixed it by switching to stateless HTTP. 291 tests, CI that fails closed.

MCP FastAPI dbt-duckdb