Skip to content
View kevin9327's full-sized avatar

Block or report kevin9327

Block user

Prevent this user from interacting with your repositories and sending you notifications. Learn more about blocking users.

You must be logged in to block users.

Content in all repositories owned by your account will be closed.
Maximum 250 characters. Please don’t include any personal information such as legal names or email addresses. Markdown is supported. This note will only be visible to you.
Report abuse

Contact GitHub support about this user’s behavior. Learn more about reporting abuse.

Report abuse
kevin9327/README.md
Kevin — rendered in Blender: copper lettering, a spinning crosshair and a skyline of commits Typing SVG



stack



pull requests merged upstream   in review right now

Live counts, straight from GitHub search. Only other people's repositories are counted.

Play something first

Gunslash Arena: a third-person wall-running sword-and-gun arena, running in the browser

▶ Gunslash Arena — wall-run, double jump, dash, slash, shoot. Eight bots that fight each other too. It starts the moment the page opens.

A third-person arena built from scratch in three.js, no engine, no install. The mansion, the textures, the effects and every sound are generated in code; the fighters and their animations are Kay Lousberg's CC0 KayKit Adventurers. Source. Keyboard and mouse.

A loop that never terminates

A staircase of 24 blocks that ascends on every step and still closes on itself. A spark runs it forever. Then the camera moves, and the loop comes apart: it only closed from one angle.

Not a drawing. A real solid of 24 blocks that never intersect, every step up, and the walk really ends 11.3 treads away from where it began — along the view axis, so it lands exactly on its own start. The impossibility belongs to the viewer. That is what a production-only bug is. One 85 KB SVG, pure SMIL, no JavaScript, no video — every pose, the painter's order and the seam are computed and asserted by one Python file.

Cut. Rewind. Fix.

The arena's knight takes a two-handed slice at the word BUG, built from glowing blocks; the blocks explode as rigid bodies in slow motion, the debris gathers itself into the word FIX, the knight cheers, and the tape rewinds.

The knight from the arena, same CC0 rig, takes a two-handed slice at a BUG built from 53 glowing blocks. The blocks are rigid bodies — the blast, the tumbling and every bounce are Blender's physics, run at half speed — and then the debris gathers itself into FIX (42 blocks, the same blast played backwards) before the tape rewinds. Rendered with Cycles on the same machine as the header, in three passes sequenced by a script. A 1 MB WebP, so it plays at full speed on anything — scripts/render_smash.py · assemble_smash.py.

Boss fight

The arena's knight faces the PRODUCTION BUG, a giant beetle of glowing armour plates. It slams the floor where the knight stood; the knight jumps clear, runs in and lands a three-hit combo, the blade trailing light and every hit throwing sparks; on the critical last hit the boss bursts into hundreds of plates in slow motion. BUG SLAIN.

The knight against the PRODUCTION BUG: a glowing core under 430 armour plates, six legs, mandibles. It rears and slams the floor where the knight stood; the knight jumps clear, runs in and lands a three-hit combo — slice, chop, spin — the blade trailing a ribbon of light, every hit throwing sparks that are rigid bodies themselves. The hit frames are not guessed: the script tracks the blade tip and takes, in each swing, the frame it reaches furthest into the boss. On the critical third hit all 430 plates let go at once, in slow motion, and the core goes out. Modelled, animated and rendered by one Blender script on the same machine as the header; the HUD is drawn on top by a second. A 1.9 MB WebP, full speed on anything — scripts/render_boss.py · assemble_boss.py.

What I actually do

I hunt the bugs that survive code review and only detonate in production — the ones a second replica exposes, the ones a policy engine quietly hides, the ones that spin forever without ever throwing. Then I prove them.

+ Read the codebase until the failure mode is obvious
+ Write the test that FAILS on main
+ Fix it in the smallest diff the maintainers would have written themselves
+ Watch that same test PASS
- No padding. No drive-by nitpicks. No "looks good to me" reviews.

Rendered in Blender: beetles crawl a circuit board, the crosshair locks on, the laser lands

Rendered in Blender with Cycles, like the header. Every motion completes a whole number of cycles per loop, so it never seams.

Bugs I hunted down

ProjectStatusThe bug
CopilotKit/OpenBot
AI coworker platform


#2 of 25 · top outside contributor
A snapshot cache living in process memory meant element refs silently stopped resolving the moment a second replica existed — moved it into Postgres. A credential filter that blocked api-key and let x-api-key straight through. 1e999 is valid JSON, so a scroll delta arrived as Infinity, was erased by the transport, and the browser scrolled its own default distance while answering 200. A key pasted with a line break reported as an agent that could not be reached — one that was never dialled. Take the wheel, type a password, press Enter: nothing happened, and nothing said so. Quit with the app installed anywhere but the default path and five containers stayed up.
edwardkim/rhwp
Rust document engine

#4 of 58 · 960+ commits
Rendering fidelity against ground-truth documents, the CLI & agent surface, a privately reported path escape in font embedding, and a long campaign of static-analysis panic & DoS fixes.
openai/codex-security
OpenAI's security scanner for coding agents


#10 of 32 contributors
A diff scan of a commit touching only .cjs, .cts or .mts files reviewed nothing and reported no skips — those extensions were missing from the inventory's allowlist. When Git's own listing failed, the scanner treated it as "no such files" and still exited 0, so a repository with a broken index scanned a silently shortened file list. import --csv refused an escaping location path; --json accepted it, and --dry-run called it valid. A guard that owned plugins was bypassed by moving the key one table deeper.
n8n-io/n8n
Workflow automation, 204k ★
The same expression gave two different answers and neither raised an error: {{ $json.url.extractUrlPath() }} on a URL with a non-ASCII path previewed as /wiki/K%C3%A4se in the editor and executed as /wiki/Käse. The editor has no isolate, so it uses the platform's new URL(); the server's default engine uses a hand-rolled parser that never learned dot-segment removal, percent-encoding, backslash separators or %2e. The regression test is an oracle — 38 URLs asserted against new URL() itself, so the expectations cannot drift from the API they replace.
microsoft/markitdown
Document → Markdown, 182k ★


#10 of 123 contributors
A file whose encoding could not be sniffed was converted to the literal string None. A byte order mark made the notebook parser fail, the error was swallowed, and the .ipynb came back as its own JSON source with no error at all. A .docx written by anything but Word lost every equation, silently — one optional child element, one KeyError, one blanket except. Blank-line normalisation ran inside fenced code blocks, so the code in the Markdown was not the code in the source.
opencv/opencv
Computer vision, 82k ★
Any JPEG 2000 narrower or shorter than 32 pixels silently failed to write. setupEncoderParameters() never set numresolution, so OpenJPEG kept its default of 6 and its own validator rejected every tile below 25 — thumbnails, tiles, icons, sprite cells. imwrite returned false and printed nothing.
uber-go/zap
Uber's structured logger for Go, 25k ★
A Config missing level created the log file and leaked its descriptorBuild returns an error and no closer, so a service that retries it runs out of descriptors over a typo. A multi-sink WriteSyncer reported a full write when one sink wrote nothing: a closed or full file returns (0, err), the normal short-write signal, and n came back from whichever sink was listed later — so io.Copy accounts for bytes that never landed. And WithGroup(""), which slog defines as returning the receiver, nested every later attribute under an empty key.
Netflix/metaflow
ML pipelines at Netflix
to_pod() turned None into the string "None", so a plain @resources(cpu=2, memory=8192) was recorded as "gpu": "None" — truthy — and anything reading the run's graph back concludes a GPU was requested. When a local metadata write failed, the path you cannot write to was replaced by UnboundLocalError: cannot access local variable 'f'. And a @trigger returning the wrong type raised TypeError: unhashable type: 'list' because the message that would have explained it could not be built.
huggingface/lerobot
Hugging Face's robot-learning stack
Fine-tune from a checkpoint with a YAML config and every list-valued field beside policy.path is dropped without a word — crop_shape: [76, 76] runs at the checkpoint's (84, 84) while the scalar next to it applies. Everything beside reward_model.path is discarded the same way, and the policy branch not doing it is what makes the asymmetry invisible. Turn streaming on and your depth maps change unit: depth_output_unit is validated, then never passed to the streaming dataset. Plus two test guards that had never actually guarded anything.
zalando/skipper
Zalando's HTTP router and proxy
modResponseHeader deleted cookies. Rewriting the cookie domain of a backend that sets two cookies delivered one — the filter read through the single-value accessor and wrote a single value back. dropRequestHeaderRegexp silently did nothing unless the header name in the route was already canonical, and where it half-worked it left an empty string where the value had been. eskip also serialized large numbers in exponent notation, which its own parser will not read back.
roboflow/supervision
Roboflow's computer-vision toolkit
sv.tint_image tinted the image you passed in, not just the one it returned — so the standard before/after hstack came out tinted on both halves — and only for NumPy input, because a Pillow argument was shielded by a conversion, making one call alias differently by input type. A LineZone's triggering anchors came from a generator, so it stopped counting crossings after the first frame. And a single non-finite keypoint crashed the annotators instead of being skipped.
leookun/cursor-byok
Local Cursor backend


#2 of 26 · top outside contributor
A tool-call id reused across rounds wedged the run forever, with no timeout on that path. Result truncation that spun at 100% CPU, then underflowed a usize. One unreadable proxy row that bricked every request. Empty tool arguments that killed the entire run with EOF while parsing a value. Also: the repo's first pull-request CI, so main stops drifting red.
crmne/fastpotify
Native Spotify client in Rust


#4 of 27 contributors
A skin colour with a multi-byte character panicked the parser, and release builds abort on panic, so the app just closed. On Windows the locale is empty, so every Japanese, Korean and Traditional-Chinese user got three mismatched fallback fonts — the Han region now comes from the Windows display language, and full-width punctuation folds onto the skin font's own cells instead of a fallback's. A byte order mark, the thing Notepad writes, silently threw away every colour in a skin.
lightningpixel/modly
Image to 3D desktop app

Headless runs wrote their results into an unindexed folder the app could never see. The "free the GPU" step ran only on the rare max-iterations exit — dead code on the path that mattered. A tool that reported a failed model unload as success.
pacifio/atlas
Source control for agents

A CI matrix that had quietly skipped one crate while its clippy denies turned every push red. A midnight-boundary fixture pinned to UTC that failed in every other timezone. In review: a PATH patch that split on :, so every agent server on Windows inherited a corrupted PATH, and a dependency that cannot compile under MSVC at all.
sonorahq/sonora
Native music client, Rust + GPUI

The local library scanner stored no "date added" at all, so the column sat empty and sorting by it did nothing — now filled from the file's modification time. The toolchain file left out clippy, so the lint command the contributing guide asks for failed on every fresh checkout.
xevrion/breakscale
Distributed-systems failure simulator

Every knob a shared link can carry, measured against the range the inspector itself declares — six of them accepted values the UI never allows. The instance count landed first: Math.max(1, NaN) is still NaN, so the simulator tried to allocate a billion-slot array and died on its first snapshot. In review: the fleet counts the data components read, a broker's partition count, the transcoder's rendition ladder, a region switch, an autoscaler.
shy3130/tick-stock-panel
A-share quant workbench


#2 of 27 · 30 commits
A forced-exit signal evaporated under pandas copy-on-write — chained assignment, dropped without a warning. Nine straight sessions where high equals low make 0/0, which is NaN, not null, so the guard missed it and KDJ never came back for that symbol. The previous trading day was looked up in calendar days, so across the Spring Festival the limit-up ladder came up empty. An index change already in percent was multiplied by 100 again, and the AI report said the market rose 123%. A placeholder limit price of 0 marked every stock limit-up. A manual refresh on a weekend divided by one elapsed minute and inflated volume ratios 240×, firing surge alerts across the board.
akitaonrails/ai-memory
Long-term memory for agent CLIs
A packaging test that could never pass on Windows — found by running the suite where CI does not.
cactus-compute/needle
14 MB on-device tool-calling model
The engine moved its cache into a versioned folder and the test harness kept looking at the old path, so every engine test skipped silently even with the engine installed. The playground reset the wrong engine, so "clear conversation" kept the previous turns. Extraction dropped the system facts the docs say it needs to resolve "yesterday".
ZSeven-W/openpencil
AI-native vector design tool
Five Windows fixes for the agent layer: executables probed without their .exe/.cmd extensions, environment allowlists that miss natively-cased Windows variables, restored blobs addressed with the wrong path separator.
dmtrKovalenko/fff
Terminal file finder, Rust
One return where a continue belonged, inside a parallel chunk closure: the first binary file in a 256-file chunk removed every file behind it from the content index, and those files never matched a plain search again. String::truncate counts bytes, so shortening a path with any non-ASCII directory name panicked. A git status constant of 0 made "is it clean?" vacuously true, so a conflicted file reported clean. On Windows the first colon of C:\…\file.rs:12 is the drive separator, and the line number was dropped.
every-app/open-seo
Open-source SEO audit suite
Backlink history parsed date-only strings as UTC midnight and then rendered them in the reader's own timezone, so every reader west of UTC saw each link first seen a day early — and on the 1st, the month axis a whole month early. The crawler asks for XHTML in its own Accept header and then gated on text/html, so an XHTML site yielded no links and the crawl never left the start URL. robots.txt was consulted with no user-agent, so a group naming this crawler by name was dead text in both directions. rel was compared case-sensitively, so rel="Canonical" was dropped — and a page with no canonical is treated as duplicate-eligible, so it came back flagged as duplicate.
NVIDIA/SkillSpector
Security scanner for agent skills
A Windows path with an 8.3 short name in it failed the handle-path safety check, so on any account with a space in its name, %TEMP% is short-form and every URL scan broke by default. Then five contract tests that had never actually run: failure was injected into a primitive only the POSIX branch calls, symlink and FIFO cases died in setup rather than skipping, and fixtures written with the platform's newline were asserted against LF. Windows failures 23 → 9.

Also in review: huggingface/skills (a cost estimator that read 7B out of Qwen2.5-72B because it matched the shortest size string first, and a dataset inspector that reported a row count the endpoint it asked never returns) · labring/FastGPT (a whitespace regex that ate ]] out of ordinary prose, an HTML table whose header row lost its columns on the way to Markdown, and a select-all that cleared the pages you were not looking at).

Things I built

Rust

A deterministic document runtime for agents. DOCX, ODT, Markdown, HTML, PDF/A — plus Korean HWP, HWPX and HML. One integer layout engine, so the same fonts give the same PDF/A bytes every time. Agents call Command::Convert, not a GUI.

Python

Ask patent questions in plain language. Get answers with the measurement shown, not asserted. No API key, no install — stdlib only. Its agent sibling: patent-scout-agent.

JavaScript

A local-first browser workbench for Korean HWPX and HWP documents: open, inspect, repair, edit and convert, with no Hancom install. Live demo.

Python

A live treemap of exactly what your AI coding agent is doing to your disk. One file, no dependencies, read-only.

TypeScript

A Ring household that checks in on itself — it knocks with a chime before it alarms the family, and any sign of life counts as an answer. Demo · Devpost.

JavaScript

Cats, dogs and pigs in a real-time .io arena, live on Google Play and in the browser. Bots keep every room full, so it is always playable.

Python

Ask out loud which public funding you can actually apply for. A self-hosted MCP server over grants.gov that refuses to guess.

JavaScript

After the agent says it is done — prove the work actually happened. Fails closed.

JavaScript

Try a financial product before you sign it: the contract split into clauses, risk flags, and early-exit, fee and rate scenarios in your own numbers. A 2026 Financial AI Challenge entry.

JavaScript

Payout dates, net income and a 30-day balance forecast for people paid by platforms. Runs entirely in the browser, nothing leaves it.

Also on the shelf: jangteo-story (three photos and one sentence from a market stall, turned into a 30-second story and a QR code on the stall) · balju-radar (a weekly lead report on public tenders) · github-trending-daily (GitHub Trending, snapshotted daily by Playwright on Actions) · hackathon prototypes protocol-sift-sentinel, zipcode-cloud-relay and shortsflow-ops-agent.

By the numbers

stats



The year as a city

Rendered in Blender from my real contribution calendar: every day of the year is a tower, the camera orbits, a light sweeps across the year

Every tower is one real day from my contribution calendar, rendered in Blender with Cycles. Click it to fly through the live WebGL version — drag to orbit, hover a tower for the day.



…and the graph that redraws itself every day

3D contribution graph, with a wave rolling across the bars

The snake

contribution snake

…and Pac-Man

pac-man contribution graph

How I work with maintainers

A maintainer closed one of my pull requests with: "Closing this as already landed, but you found a real bug and got there independently."

The fix had shipped inside someone else's PR — after I left a review pointing at the exact failure mode.

That is the job. Not the badge on the pull request — the bug being gone.


The reviews I leave are the ones I would stake my name on. Silence otherwise.

The loops here are rendered in Blender (bpy + Cycles) from scripts in this repo; the staircase is a Python script's arithmetic that your browser draws live; the arena is the real game, captured frame by frame in headless Chromium; the graphs are redrawn by GitHub Actions from live data. No JavaScript runs here — the WebGL version lives next door.

Pinned Loading

  1. ai-disktracker ai-disktracker Public

    Watch AI coding agents eat your disk - live folder treemap of what's growing right now and what they left behind

    Python

  2. opportunity-radar opportunity-radar Public

    Ask out loud what public funding you can actually apply for. Self-hosted MCP server (Streamable HTTP) over live grants.gov data, with honesty gates that refuse to guess. Built for the Amazon Develo…

    Python

  3. patent-intel patent-intel Public

    Ask patent questions in plain language, get measured answers — Claude Code skill + zero-key CLI for patent landscapes, leaderboards, and trends

    Python

  4. pawpaw-arena pawpaw-arena Public

    Cats, dogs and pigs brawl in a tiny real-time .io arena. Browser + Android, bots keep every room full, one RevenueCat IAP. RevenueCat Shipaton 2026 entry.

    JavaScript

  5. still-here still-here Public

    The house checks in, so family doesn't have to — a Ring Partner API caretaking app that knocks with the chime before it alarms the family.

    TypeScript

  6. workproof workproof Public

    After the agent finishes, prove the work actually happened.

    JavaScript