Skip to content

Aanish Bhirud.

I test Unreal Engine at Epic Games.

On the Scenegraph team I write C++ tests that catch a Fortnite match falling out of sync, and I look after the tests that check the engine on PC and consoles with no one at the controls. I've also taught engineers across Epic how to work with AI agents.

I'm looking for my next role in QA, test automation, or AI harness engineering.

Current role
QA Engineer, Unreal Engine Scenegraph team at Epic Games
Experience
4 years at Epic Games, promoted from Tester 1 to QA Engineer in 18 months
Skills
C++, C#, Python, TypeScript, Playwright, Unreal Engine 5, CI/CD, and AI agents
Education
B.S. Computer Science, NC State University, 2022
Based in
Raleigh, North Carolina
Off the clock
F1, 3D printing, and games

About

I've been in QA at Epic Games for 4 years. I started on the Web Frameworks team, bringing Playwright visual tests to Epic's websites, and moved to the Unreal Engine Scenegraph team in 2025. Most of my work there is automated testing for Fortnite multiplayer and for headless runs on PC and consoles.

I've used GitHub Copilot since it only did tab completions, and these days AI agents do a lot of the building on my side projects. Outside work I make tools for that setup and mods for the flight game Nuclear Option, and I design 3D prints for MakerWorld.

The rest of the time I'm playing games, watching anime, or cheering for Leclerc and Ferrari.

Experience

I've worked in QA at Epic Games since December 2022. Before that I was a backend developer at Healiom, a healthcare software company.

I went from Tester 1 to QA Engineer in 18 months, then joined the Unreal Engine Scenegraph team.

  1. Tester 1

    Web FrameworksDec 2022

  2. Tester 2

    Web FrameworksJun 2023

  3. QA Engineer

    Web FrameworksJun 2024

  4. QA Engineer

    UE ScenegraphSince Jan 2025

  1. Epic GamesCary, NC

    Dec 2022 – Present
    1. Jan 2025 – Present

      QA Engineer · UE Scenegraph

      I write C++ tests that run several Fortnite clients at once and compare what each one sees, so a desync fails a test instead of a match. I look after the team's headless tests on PC and consoles and the remote calls that drive them, which let the engine be tested on every platform unattended. I turned a visual regression prototype into a framework the team can maintain. When reorganizations left us with a stack of inherited test frameworks, I went through them and kept two, one for integration tests and one for lower-level ones. Now a new test has an obvious place to go. I've also run a training session for engineers across Epic on working with AI agents.

    2. Jun 2024 – Jan 2025

      QA Engineer · Web Frameworks

      I built a pilot framework in Python and pytest that health-checks internal backend services, so an outage shows up in a test run before it shows up in a bug report. I also brought our visual regression suite to the teams behind the Unreal Engine, games, and esports sites, and ran its CI.

    3. Jun 2023 – Jun 2024

      Tester 2 · Web Frameworks

      I shipped the first version of our Playwright visual regression suite and grew it across more of Epic's web projects. From then on, a page that rendered wrong failed a test before it went live.

    4. Dec 2022 – Jun 2023

      Tester 1 · Web Frameworks

      The web test suite didn't check what pages looked like. I pushed to add automated visual testing and built it with Playwright.

  2. HealiomSan Mateo, CA · Remote

    1. Aug 2022 – Dec 2022

      Software Development Engineer 1

      I built an audio pipeline that transcribed Zoom calls while they were still going, by feeding their sound to speech-to-text in real time. I also wrote a parser that read scanned insurance cards straight into database fields, so nobody had to type them in.

    2. May 2021 – Jul 2021

      Back End Developer Intern

      I wrote Python APIs in FastAPI for healthcare data, and a pipeline that reshaped incoming records so they could be searched in Elasticsearch.

Education

B.S. Computer Science

NC State University · May 2022

  • NCSU Rainbow Six Siege esports team
  • Algorithms, Game AI, Game Engine Foundations, Interactive Game Design, Computer Graphics

Skills

Languages
C++, C#, Python, TypeScript, JavaScript, Rust, SQL
Test automation
Playwright, Visual regression, LLM-based image comparison, Multi-client network replication testing, Integration testing, Headless RPC-driven test harnesses, pytest, Cross-platform coverage on PC and consoles
Game and engine
Unreal Engine 5 (Blueprints, PCG, cinematics), Unity (URP, Shader Graph, VFX Graph), Client-server game networking
Systems
FFmpeg, Multithreading, Text parsing with state machines and regex, Compression codecs
AI systems
Agent orchestration, LLM integration, MCP, Embeddings and retrieval, Multi-provider model routing, Reusable agent skills, LLM harness evaluation
Web and backend
React, Next.js, Node.js, Astro, FastAPI, Flask, REST APIs, SQLite, Elastic Stack
Infra and CI
CI/CD pipelines, GitHub Actions, Docker, Docker Compose, Git, Cloudflare Pages, Linux, Proxmox / LXC

Work

Things I build on my own time, plus pull requests I've landed in other people's projects.

Agents & developer tools

Tools I've built for my own AI agent setup, plus a few Windows and Rust utilities.

  • Agent Render (opens in a new tab)

    A viewer for the Markdown, code, diffs, and tables my agents produce. It turns their output into a link I can open, edit, and pass on. The content lives in the URL fragment, so the host never sees it, and a compressor I wrote keeps the links short.

    TypeScript · React · Next.js · Cloudflare Pages

  • Mnemosyne

    A memory service for my agents, so a new session can pick up what earlier ones worked out, whichever machine or tool they ran on. It mixes embeddings, keyword search, and a reranker, which ranks results far better than keyword search alone. The repo is private while I clean it up.

    Python · SQLite · Embeddings · BM25

  • Hydra CLI (opens in a new tab)

    Give it a research question and several AI agents with different personas argue it out, so the one answer it hands back has already survived some disagreement.

    TypeScript · Node.js · Multi-model

  • QuickRunner (opens in a new tab)

    A Rust CLI for jumping between project folders and keeping an eye on long-running commands. When I can't remember how an old project works, qr do asks a small, fast model to write the command and shows it to me before it runs.

    Rust · CLI · SQLite

  • Dispatch (opens in a new tab)

    Lets one AI agent hand subtasks to others, so each piece runs on whichever model and tool suits it, on my machine or another one over SSH. It's an early alpha, written in plain Python with no dependencies.

    Python · CLI · SSH

  • Synthetic Search CLI & MCP (opens in a new tab)

    A CLI and MCP server that gives my agents web search with citations through synthetic.new and exa.ai, without the search provider keeping the data.

    TypeScript · MCP · CLI

  • Local Audiobook Pipeline

    Turns ebooks into audiobooks with text-to-speech on my own GPU. A speech recognition pass listens back so I don't have to, and flags any audio that came out garbled.

    Text-to-speech · Speech recognition

  • Livestream Summarizer

    Turns a livestream into a feed that reads like someone live-tweeting it. It pulls the stream down in chunks with yt-dlp, and MiMo-V2.6 watches each chunk and writes a short update.

    yt-dlp · MiMo-V2.6

  • Cyclops (opens in a new tab)

    Windows Hello cameras have an infrared sensor that ordinary apps can't open. Cyclops turns it into a regular camera with a live preview and a switch for the IR light, and shares it with other apps as a virtual webcam. Under the hood it's a COM media source that outputs NV12, which keeps older DirectShow apps from hanging.

    C++ · Qt 6 · Media Foundation · COM

  • PPM Converter (opens in a new tab)

    Converts the .ppm files from Peter Shirley's "Ray Tracing in One Weekend" to .tiff. GPT-3 wrote the whole script and README, back when that was new.

    Python · OpenCV

Nuclear Option mods

Mods, aircraft, weapons, and tools I made for the flight game Nuclear Option. Their GitHub releases have 15,074 downloads.

  • MRB-100 Centurion (opens in a new tab)

    A heavy bomber and AWACS aircraft with a telescoping wing. It's still a prerelease, and I haven't finished testing it in multiplayer.

    The first version came from an AI agent working on its own for about a week, including the art, animations, and sound. I took it from there until it was something players want to fly.

    6,512 downloads · C# · Blueprinter

  • F-204 Icarus II (opens in a new tab)

    An interceptor based on a modernized F-104 Starfighter, with its own cockpit and carrier operations. It's an early prerelease, and multiplayer testing isn't done.

    I built it with the same agent process as the Centurion, but stayed in the loop this time and art-directed it.

    6,336 downloads · C# · Blueprinter

  • NO Map Overhaul (opens in a new tab)

    Adds what you need to line up a landing and plan a mission: runway numbers, approach lines, and a runway callout on the HUD, plus range circles, bearing arrows, and waypoint routes on the map. Map drawings sync over Steam networking, so a team can plan together. The game's developers signed off on how that works, and it held up when players went looking for exploits.

    1,054 downloads · C# · BepInEx

  • Nuclear Option Detents (opens in a new tab)

    Stops the throttle at idle and at full dry thrust, so letting go of a key a moment late doesn't pop the airbrake or light the afterburner. Each aircraft gets its own profile, and the HUD shows when it's holding.

    806 downloads · C# · BepInEx

  • NO Missile Indicators (opens in a new tab)

    Shows arrows pointing at incoming missiles you can't see. It only uses what the game's own missile warning already knows, so it reveals nothing the game is hiding. It's off by default in PvP.

    331 downloads · C# · BepInEx

  • Nuclear Option Armory (opens in a new tab)

    A weapon pack with three new weapons, including a passive recon missile and a small interceptor for cruise-missile salvos. It's experimental, and I haven't tested it in multiplayer.

    35 downloads · C# · Blueprinter

  • Critz OS Mod Loader (opens in a new tab)

    A Windows app that switches the game between a clean install and a few saved mod setups, so I can jump between them without reinstalling.

    C# · Windows

  • NOMM MP List (opens in a new tab)

    Sorts Nuclear Option mods by whether they're safe in multiplayer: client-side, risky, needs the other player to have it too, or single-player only. AI agents rebuild it every week from the mod manifests. The repo is private, but the list is public.

    TypeScript · Lakebed

Graphics, games & earlier work

Ray tracers, a networked 2D game engine, and Unreal and Unity projects.

  • Ray Tracing Renderer

    I built a ray tracer in Rust from "Ray Tracing in One Weekend", then rewrote it test-first from "The Ray Tracer Challenge". Profiling it and spreading the work across threads took renders from hours down to minutes.

    Rust · Multi-threading

  • 2D Networked Game Engine

    A 2D multiplayer game engine I wrote from scratch in C++ for a class at NC State, with its own physics, its own renderer, and a server that has the final say on game state.

    C++ · Networking · Game Engine

  • Reaction Impact

    A documentation site for Genshin Impact's mechanics, built with Astro. I've rebuilt it a few times.

    Astro · TypeScript

  • F1 Strategy Tool

    Reads live telemetry from the Codemasters F1 games and suggests when to pit, based on how fast the tires wore in practice.

    Python

  • Level Design (UE5)

    An opening cutscene for a custom Unreal Engine 5 level, covering cinematics, lighting, and level scripting.

    Unreal Engine 5 · Blueprints

  • PCG Forest Scene (UE5)

    A forest built with Unreal Engine 5's procedural tools and Quixel Megascans, with plants placed by biome rules.

    Unreal Engine 5 · PCG · Quixel Megascans

  • Unity Fog System & Sparks

    A volumetric fog system for Unity URP and a spark effect, both made with a team.

    Unity · URP · Shader Graph · VFX Graph

Open source contributions

Pull requests to other people's projects, all merged upstream.

Visual tests

A visual test compares a fresh screenshot with one you know is right. The hard part is deciding what counts as different.

Rendering isn't perfectly repeatable. Draw the same scene twice and an edge can anti-alias a little differently, or a soft shadow can land a pixel off, depending on the GPU and the driver. A pixel-by-pixel comparison flags every one of those changes, so the test either fails on noise or gets loosened until it misses real bugs.

An LLM compares the two images more like a person would. It still catches a missing shadow or a broken material, but it doesn't trip over an edge that moved by a fraction of a pixel, so a test can stay strict without failing good builds. Our framework sends the flakiest renders to one, and I helped tune how it prompts the model.

What changed
How it's compared
Expected
Actual
Diff

3D printing

Models I design and publish on MakerWorld: desk and printer parts, F1 pieces, and game props.

Other people have printed my 9 models and 15 print profiles 4,751 times, for about 68,370 hours of printing.

0.0 mm

My F1 2023 Halo Remix in its Ferrari colours, sliced from the model's painted file and MakerWorld print settings.

Full profile on MakerWorld (opens in a new tab)

Get in touch

I'm looking for my next role in QA, test automation, or AI harness engineering. I'm also happy to talk about AI tools, F1 strategy, or 3D printing.