Skip to main content

Projects

There's no résumé on this site, by design. These are the projects that are public, and the site you're reading.

Open Source

My day-to-day engineering is proprietary, so this is the work I can show: Apache projects, where every commit, review and release vote is public.

Apache Daffodil™ Extension for Visual Studio Code

Apache Daffodil PMC member · 2025–2026

Apache Daffodil parses and unparses data described by DFDL schemas, an open standard for describing binary, text and legacy data formats. The extension is where those schemas get written: DFDL syntax highlighting and IntelliSense, a debugger that steps through a parse while showing the infoset and the position in the data, tooling for TDML test cases, and a data editor for large binary files built on Ωedit. The extension is TypeScript and Svelte; the debugger backend is Scala.

Since early 2025 I have landed 40+ commits across the whole extension:

  • Data editor. Settings precedence between settings.json and launch.json, replace operations no longer forced on invalid input, seeking past end-of-file, duplicate panel disposal, the data profiler's output and layout, and several Ωedit upgrades.
  • TDML workflow. Running test cases from the launch wizard — prompting for a case name and description, picking a case from a TDML file — plus fixes for relative paths when copying or appending cases, config handling, and execution on Ubuntu.
  • IntelliSense. Attribute completion no longer suggests attributes an element already has, dfdl:defineEscapeScheme inserts correctly, and the completion, hover and close-element providers are documented for the next contributor.
  • Debugger and test tooling. Fixed yarn test hanging on the Daffodil debugger, moved the Svelte test runner from ts-node to tsx so the suite passes on Node 22, and upgraded the extension to Daffodil 3.10.0.
  • Project upkeep. The 1.5.0 version bump, PR and issue templates with confirmation and regression-testing sections, contributor docs consolidated into Development.md, and the README's move to the current ASF branding.
TypeScript
Svelte
Scala
VS Code Extension API
DFDL
Apache

Ωedit

Contributor · 2025

The open-source editing library behind the extension's data editor, built for files too large to hold in memory. My changes were on the Windows side: launching the server with javaw so no console window flashes up, and making it start when its install path contains spaces, with tests that pin that down.

Windows
Build tooling
Testing

Apache Daffodil website

Committer · 2025–2026

The project's documentation site. I restructured the VS Code extension's docs so each release carries only the user documentation for that version, linked the extension's wiki, and kept the docs workflow's pandoc current.

Documentation
GitHub Actions

This Site

jeremyyao.dev is a project in its own right: a small surface, built carefully. The source is private, so this walkthrough stands in for it.

jeremyyao.dev

Design, build and deployment · 2022–present

I built the first version by hand in July 2022, without AI, to teach myself React, TypeScript and MUI — skills I then used at work. It has been rebuilt several times since, most recently in 2026 with AI assistance.

Today it is a handful of pages in React 19, TypeScript and MUI, built with Vite and deployed on Cloudflare Pages, with one Pages Function behind the contact form. The interesting parts are the ones a visitor never notices:

  • Prerendered, then hydrated. Every page is rendered to HTML at build time with React 19's prerender API and hydrated in the browser. Content shows before any JavaScript runs, crawlers and link previews see the real page, and the color scheme is resolved before first paint, so dark-mode visitors never get a white flash.
  • A strict Content-Security-Policy. No unsafe-inline for scripts. The one inline script the site needs, the pre-paint color-scheme setup, is allowed by a SHA-256 hash the build computes and writes into the headers file, so editing the script can't leave a stale hash behind. HSTS, frame-ancestors 'none', nosniff and a strict referrer policy round it out.
  • A contact form with no address to harvest. No mailto link. The form clears a Cloudflare Turnstile challenge, then a Pages Function checks the request origin, re-validates every field with the same rules the browser used, verifies the Turnstile token server-side and sends the mail through Resend.
  • CI that says no. Every push runs Prettier, ESLint with zero warnings allowed, strict TypeScript, knip for dead code, and a dependency audit that fails on high severity. Dependabot keeps the dependencies current.
  • The small things. A real 404 status for unknown URLs, cookie-free analytics, reduced-motion support, a skip-to-content link, and content-hashed assets cached for a year.
  • AI-assisted since 2026. The 2026 work was done with Claude Code and with privacy-focused platforms, Okara.ai and Venice.ai, running open-weight models (GLM 5, Kimi K2.5 and K2 Thinking, Qwen3-Coder) chosen from benchmarks and leaderboards such as Humanity's Last Exam and Artificial Analysis. Every change still has to clear the CI above.

See for yourself: open the page source on any page and the content is right there in the HTML, not rendered by JavaScript. The source is private, but I'm happy to walk through it.

React 19
TypeScript
MUI
Vite
Cloudflare Pages
Turnstile
Resend
GitHub Actions

Playwright tests for jeremyyao.dev

Learning project · 2026–present

End-to-end tests for this site, in a public repository of their own since the site's source is private. I'm using them to learn Playwright.

    Playwright
    TypeScript
    End-to-end testing

    Coursework

    Older and public: a university team project, kept as a snapshot of what we handed in.

    Peer Evaluation Tool

    CSE 3901, The Ohio State University · one of four developers · Autumn 2021

    The final project for CSE 3901 (Project: Web Application Design, Development, and Documentation) at The Ohio State University: a Ruby on Rails app for peer evaluations in a team-based course. Instructors create courses and teams and open evaluation rounds; students enroll, see their teams and projects, and submit evaluations that move from not started to pending to completed, with role-based access so students can't reach instructor pages.

    My side of it was mostly teams and projects: the controllers, views and model tests for both, the student and instructor views of a team, adding and removing instructors from a team, the per-project “needs evaluation” flag with its migration and seed data, and the clean-up rules that remove a project's or a deleted user's evaluations. I also merged a good share of the team's pull requests.

    The commits were made under a different email from this GitHub account, so they show as “Jeremy Yao” rather than linking to my profile.

    Ruby on Rails
    Ruby
    Team project