John Tung童曉瑜 · Hsiao-Yu Tung
I've run production on GCP, AWS, and Azure, and shipped real workloads on Airflow — but most of what I do lately is taking something built too heavy and turning it back into a query that runs on a schedule. I pick tools to fit the problem. My background is Chinese text mining and public-opinion analysis; I led a Data Team for 2.5 years — coding throughout — then chose to step back from management to a Principal IC role.
Inherited pipeline rewrite
Took over a revenue pipeline running on Composer + Apps Script and replaced the whole thing with BigQuery External Tables + Scheduled Queries. Same outputs, same SLAs, monthly spend down to ~1/300 of the original. The lesson I keep applying: most "pipelines" don't need an orchestrator — they need a query that runs on a schedule.
Multi-platform social ingestion
Facebook, Instagram, Threads, and YouTube ingested into BigQuery — 15+ Cloud Run Jobs on staggered schedules, with GA4 site/app traffic added on top. Raw data is append-only, so every fetch's full history is kept (not just the latest state); dbt then shapes it into clean, query-ready tables. Powers the dashboards editorial and marketing open every morning.
Two production operating dashboards
Built two Streamlit dashboards on Cloud Run with Google login — one for group-wide digital revenue, one for social-media performance. A self-serve permission system — 3-tier roles plus a change audit log — lets managers add and remove members themselves, no redeploy and no engineer in the loop; event tracking feeds product- and feature-adoption analysis.
Threads OAuth 2.0, fully automated
Dual-account OAuth across 8 permission scopes, with a weekly Cloud Run Job that rotates the 60-day token through Secret Manager. Upgraded the old "alert on-call when the token's about to expire, then ask someone to re-authorize by hand" into something fully unattended.
Self-serve OAuth for non-engineers
A pure-frontend authorization tool on Cloudflare Pages. Social-team editors run the whole API authorization flow themselves — no ticket, no pinging an engineer. Static hosting, no backend, near-zero maintenance.
LLM-augmented data pipelines
Gemini 2.5 Flash called in-warehouse via BigQuery (AI.GENERATE) — no separate inference service to run. Two things: first, ~33k comments and ~3.2k posts auto-classified by sentiment and topic into two query-ready tables, computing only new rows (old ones aren't re-run, keeping cost down); topic labels match the newsroom's own section taxonomy rather than one generic "finance" bucket (which would swallow 70% of everything), with a cleanup pass to absorb model noise. Second, on-dashboard "AI insights" that read only the current period's numbers to draft a sentiment summary, flag negative hotspots, and suggest an editorial next step — tied to the real data by a strict no-fabrication rule. Both share a cache, so the AI calls stay cheap and flat no matter how many people use it.
Semantic clustering + RAG retrieval foundation
Vertex embeddings (768-dim multilingual) plus KMEANS group the negative comments, and an LLM names each theme — turning "20% negative" into "here's what they're actually angry about." On top of that, a comment retrieval layer with a weekly LLM-as-judge eval: two-tier quality thresholds, and the job fails if retrieval quality drops, so a code change or a model/data drift can't quietly degrade it. The embedding + retrieval half of RAG, shipped and guarded — the editorial semantic-search archive is the next layer.
GA4 web-analytics ingestion
Pulling the group's site and app traffic into the platform through the GA4 Data API — 4 Cloud Run Jobs plus a story-traffic ranking table. The Viewer grant non-engineers approve also runs through a self-serve page on Cloudflare Pages — no engineer in the loop.
Competitor benchmarking + cross-BU analysis
Competitor data pulled via official public APIs (YouTube + Instagram) for topic share-of-voice. External factors — the stock-market index and the national business-cycle signal — are joined to revenue and run through Mann-Kendall trend tests, Sen's slope, seasonal decomposition, and lead-lag correlation. So a number isn't just "up" — it's "up with the tailwind," "up against the trend" (the part that's actually us), or "dragged by the macro."
Newspaper-layout PDF generator
A Streamlit + ReportLab tool that parses stock-market data files and auto-typesets them into a print-ready monthly-revenue newspaper page (the actual layout), replacing what used to be done by hand.
Silent failure detection
Data-freshness monitoring (dbt source freshness — warn at 25h stale, error at 49h) plus Cloud Monitoring alerts that scan job-failure logs — so a broken upstream API or a crashed job can't sit unnoticed for days.
openclaw gateway deadlock fixOSS · 2026-05
Tracked down a deadlock (between a SIGUSR1 listener and a dynamic import) that left the gateway unable to restart after a package upgrade — it had failed silently for six days. Confirmed it with production logs and a live reproduction, then sent a surgical one-line fix (PR #84890, merged).