Software developer
Nathaniel Black
I’m a computer science student at the University of Delaware. I write embedded flight software in C for a NASA-selected CubeSat, and most of what’s below started with me wanting to know how something worked and taking it apart to find out.
Selected work
10 projects- 01
neo-pad
Personal projectA Rust driver that turns a Hall-effect keyboard into an analog gamepad. It polls per-key travel depth off the board’s QMK raw-HID channel and maps W/A/S/D depth onto a virtual stick, so a light press walks and a hard press runs. I worked the board’s undocumented depth protocol out from live captures, then shipped two output backends behind a shared HID core, Linux uinput and Windows ViGEm, and confirmed on real hardware that the axis values the OS reports back match what the driver emits.
- Rust
- HID
- uinput
- ViGEm
- egui
- 02
Reinforcement Learning Discovers Bunnyhopping
Personal projectI ported Quake III’s bg_pmove.c movement physics to Python from the C source, reproducing the projection-based acceleration rule that makes the exploit possible, and wrapped it as a Gymnasium environment. A PPO agent rewarded only on horizontal speed rediscovered bunnyhopping on its own, holding around 650 units per second and peaking near 970 against the engine’s 320 cap. To show the speed came from the ported physics rather than an artifact of the network, I reproduced the same exploit with hand-written inputs. 91 pytest cases cover the physics, the environment API, and the demo codec that replays trained runs inside the real game.
- Python
- Gymnasium
- Stable-Baselines3
- NumPy
- pytest
- 03
Severe Weather Event Classifier
CISC 484, 3-person teamMulti-class classification on 145,394 NOAA Storm Events records from 2023 and 2024, predicting the ten event types that cover 81% of the database. Tuned XGBoost beat a swept TabNet at 0.900 against 0.851 macro-F1, and I confirmed the gap with a paired bootstrap and a McNemar test rather than leaving it at one number. The result I found most interesting was a calibration audit: TabNet’s lower expected calibration error turned out to come from underconfidence, not accuracy, and one-parameter temperature scaling cut XGBoost’s ECE from 0.025 to 0.007 without changing a single prediction.
- Python
- XGBoost
- TabNet
- pandas
- scikit-learn
- 04
Drafter Drafter
CISC 275, 3-person Agile teamA website planning tool built across bi-weekly sprints. We decomposed 25 user stories into eight epics on a GitHub Projects backlog and closed 11 of 11 committed stories in Sprint 1, running the full Scrum cycle around it. I owned the project management epic and designed the data-access layer behind it, routing all persistence through an async service API so components never touch storage directly and swapping in a real backend changes one module.
- TypeScript
- React
- Vite
- Jest
- GitHub Actions
- 05
CPMA Config Tool
Personal project, 2-person teamA desktop configuration editor and game launcher for Quake III CPMA, with active users in the competitive community. It reads existing config files, converts console commands into typed in-memory settings, and regenerates valid Quake III output on save, which replaces editing those files by hand. First-run setup downloads and unpacks the game assets or links an existing install, and the whole thing ships as a standalone PyInstaller executable so it installs in one click on Windows without Python.
- Python
- Tkinter
- PyInstaller
- 06
CUDA Neural Network Accelerator
CISC 372, 2-person teamPorted a two-hidden-layer MNIST network from serial C to CUDA, cutting a five-epoch training run from roughly 390 seconds on CPU to 2.2 seconds on an NVIDIA V100 while holding classification accuracy. I wrote the non-GEMM kernels by hand, including batched bias-add with fused ReLU and a per-row softmax with shared-memory reductions, and handed the three matmul-shaped operations to cuBLAS instead of hand-rolling them. Built and run on the university’s DARWIN cluster through Slurm.
- C
- CUDA
- cuBLAS
- Slurm
- 07
UDelaWhere??
HenHacks 2025, 4-person teamA 360-degree campus exploration game for incoming UD students. You get a panorama, then drop a pin on a Leaflet map where you think it was taken, with a Supabase-backed real-time leaderboard holding persistent scores and round history. I captured and processed the 50+ panoramic images myself with a 360-degree camera, owning that pipeline alongside the frontend and backend work.
- TypeScript
- React
- Three.js
- Node.js
- Supabase
- Leaflet
- 08
deepdive
Personal projectA CLI research system that replaces one-shot LLM summarization with explicit depth controls, pluggable search backends, and a fixed scoring rubric, so two runs are actually comparable. Candidate generation is separated from evaluation, and branches run in parallel across subagents that return structured mini-results for the orchestrator to merge, which buys breadth without collapsing onto the first plausible answer. A persistent evidence store keeps every claim’s source link, so a score can be re-checked later instead of regenerated from scratch.
- Python
- LLM agents
- pytest
- 09
Houzz Pro Scraper
Personal project, published Apify actorAn Apify actor that turns the Houzz professional directory into a clean lead dataset, using a two-tier crawl that reads structured JSON-LD for base records and optionally enriches each profile with ratings, reviews, and licensing. Deduplication keys on the stable Houzz profile id, dropping 546 overlapping and sponsored duplicates to reach 500 unique records with no collisions. Rather than claim coverage, I measured per-field fill rates over that real run, documented 98% phone capture, and kept nulls as signal.
- Python
- Apify
- BeautifulSoup
- pytest
- 10
K-Means Image Segmentation
CourseworkImage segmentation by k-means, implemented three ways, from a naive loop up to a vectorized NumPy version benchmarked against scikit-learn. Running all three on the same images was the point: it puts a number on what unvectorized Python actually costs.
- Python
- NumPy
- scikit-learn
Experience
-
Undergraduate Researcher, Software Team
May 2026 – PresentDAPPEr, University of Delaware
I write embedded flight software in C for DAPPEr, a student-built 3U CubeSat selected by NASA’s CubeSat Launch Initiative, targeting the onboard hardware that flies on the spacecraft. It deploys from the ISS to 425 km, where twin Langmuir probes measure electron density and temperature in the F2 ionosphere. It will be the first orbital spacecraft built and operated in Delaware. I’m on the 7-person software team, which meets weekly and coordinates with the electrical, mechanical, and science subteams on the interfaces between the flight software and the hardware it runs on. I also write the Python tooling we use around the flight code.
-
Founder
May 2026 – PresentBlackweb Studio, Sussex County, DE
I build websites and AI lead-capture tools for local businesses, and I own the whole cycle, from researching a prospect through the build and the delivery. The internal half is a Python CLI that imports business seed lists, scores each prospect against a rubric, audits their existing web presence, and drafts outreach for me to review by hand before anything goes out.
About
I like the part of a problem where you have to go read the source.
I work across the stack, but the projects I keep coming back to are the ones that sit close to the machine: a movement system ported out of C, an undocumented HID protocol read off live captures, a training loop moved onto a GPU. When I make a claim about one of them, I try to have the measurement to back it.
I’m at the University of Delaware for a B.S. in Computer Science with a concentration in Artificial Intelligence and Robotics, expected May 2027, with a 3.78 GPA. Right now I’m looking for a software engineering internship.
Get in touch
Email is the best way to reach me. I read everything myself and usually write back within a day.