Julian Rederis a Computer Engineering and Statistics student @ NCSU
About
I'm Julian Reder, a Computer Engineering and Statistics student at NC State. I write research software for AERPAW — the NSF PAWR testbed for 5G/6G and autonomous aircraft — and I just finished a technical internship at Merrill Lynch on a calculations platform used against $500M+ AUM.
I like making systems agree with each other: radios and flight stacks, cameras and telemetry, configs and APIs. Contact is at the bottom. Click Background in the header if you want to play with the simulations.
I maintain AERPAW/aerpawlib — the Python API experimenters use to fly LAM6/SAM4 UAVs and the rover. I moved it from DroneKit onto MAVSDK, kept the v1 Runner/StateMachine surface, and added a v2 async API. Current release is 1.4.11.
Hard parts
Testbed MAVLink filter only allows takeoff, land, goto, and yaw (20–100 m takeoff, land within 5 m of home).
SET_MODE is blocked; GUIDED has to be held with MAV_CMD_DO_SET_MODE. LOITER drops the E-VM link.
Safety checker belongs on the C-VM, not localhost or the OEO console.
Timed set_velocity was killing newer commands; bearings ignored latitude (~51° vs 45° at 35.7°N).
Multi-vehicle ZMQ dropped transitions until JSON + ACK + wait_for_peers.
Learned
The filter defines the API as much as the SDK does.
SITL is necessary and not sufficient.
A compat layer plus a second API beats a flag-day rewrite.
I wrote PyAerial as the successor to airstrik.py. It decodes ADS-B with pyModeS, evaluates Shapely geofences, and splits tracking (pyaerial run) from a read-only portal (pyaerial web). airstrik used circular filters, MongoDB, and Kafka; this stack is Redis + SQLite + webhooks.
Hard parts
CPR decode needs a home reference that is not the geofence, plus 0.5° jump rejection.
Multi-receiver merge on RSSI and Hamming distance; heading ranges wrap.
Curved ETA can miss a fence when the turn circle blows up — take min(curved, straight).
Dwell/hysteresis so brief constraint matches do not spam.
Portal is read-only; the tracker claims Redis with a heartbeat.
Learned
ADS-B is a wire-format problem before it is a map problem.
Live vs history wants two stores, not one database doing both.
Geofence rules should be explicit (alt, speed, ETA) — not implicit 'inside the polygon.'
Dockerized field service: Kafka position/velocity in, VAPIX pan/tilt/zoom out, recordings to the camera SD card as Matroska. Stock sensecam-control had PTZ but not record, so I forked sensecam-control-record for start/stop/export. YAML holds site pose, FOV scale, and drone size; dry-run works without a camera.
Hard parts
Pan is a spherical bearing; tilt is elevation; zoom maps a Q-8615E FOV model into 0–9999 steps.
Camera north-offset has to wrap into AXIS ±180° pan.
Optional velocity lead: NEU vs a possible NED convention (sign-flip on vz).
Minimum pan/zoom steps so the PTZ is not spammed; stale telemetry parks the camera.
Learned
Closing a telemetry bus onto a physical PTZ is as much field ops as math: Digest-auth CGI, host-network Docker, and a library that can actually start a recording.
Python CLI for equity research: FactSet FQL snapshots or timeseries, YAML/Pydantic configs, a sandboxed formula engine, and Rich/Excel export. A planner batches FQL calls, then Python metrics run in topological order. FDT mode scores a name against peers into Bull/Base/Bear multiples.
Hard parts
Formulas needed to be useful without becoming a code-execution hole (AST denylist + allowlisted builtins).
Interdependent metrics: DAG, cycle path, typo suggestions — before any FactSet call.
Missing FQL values become typed N/As instead of poisoning a sheet.
Holdings vs timeseries needed different config models; some formulas need a second-pass fetch.
Runs only inside FactSet's Programmatic Environment.
Learned
Treat research tooling as a product: validate the config language first, then plan → fetch → derive → export.
Slash lobbies, matches in threads, and a plugin API so the same play() runs live, in replay, and on a CLI. Postgres 16 holds guilds, matches, the move log, and live-match integrity. Games are in-process plugins — fault isolation, not a security sandbox. Builtins: Tic-Tac-Toe, Connect Four, Chess (incl. Chess960), Coup, Mafia, Spyfall, Liar's Dice.
Hard parts
Live matches resume after a restart by replaying the move log; abandon if the plugin build changed.
Lobby/thread timeouts and signed msgpack custom_id routing were the long tail.
Hang caps and a thread pool keep a stuck play() off the event loop.
Public invite exists; the bot is not hosted yet.
Learned
A game host is a durability problem: deterministic simulation, an append-only log, and 'live' as a first-class match state.
Content lives in site.toml, templates render it, GitHub Pages serves it. The background is its own engine — twelve modes with pointer interaction and a live parameter panel.
Hard parts
Keep the sim smooth behind a frosted column.
Honor reduced motion; persist mode and params.
Do not steal pointer events from the page.
Learned
A portfolio is more convincing when the page itself is something you can operate.
Campus parking forecast: public occupancy + events into Postgres, a strong seasonal baseline, and per-lot XGBoost only when it beats that baseline.
Notes
A personal forecasting stack for NC State lots. A collector polls the public occupancy API (delta snapshots) and campus events into Postgres; features include 5-minute grids, lags, rolling stats, haversine event radii, and academic-calendar flags. An hour-of-week median is always fit; per-lot XGBoost is kept only if it beats that baseline on validation MAE, across eight horizons from 15 minutes to 24 hours. Training is a separate file-based job so the Streamlit app never loads XGBoost. Private repository — architecture only.
Browser extension plus a Rust native-messaging host that publishes Amazon Music playback as Discord Rich Presence.
Notes
The extension reads Media Session and first-party Amazon metadata instead of scraping the DOM. A small Rust host speaks Chromium/Firefox native messaging and Discord IPC, with coalesce + rate limits (5 / 20s) and reconnect. Private repository.
discord.py 2.x scaffold: YAML config, cog hot-reload with rollback, structured logging, plus an Emoticon analytics cog.
Notes
A starter I actually use: centralized YAML, owner management commands, cog reload that rolls back if the new module fails, per-crash error logs, and a Tortoise/SQLite Emoticon cog for emoji usage analytics.
SebLague Chess Coding Challenge entry: iterative-deepening alpha-beta under a 1024-token budget.
Notes
Fork of Sebastian Lague's C# challenge (max 1024 tokens). The real bots live on feature branches: iterative deepening, alpha-beta, quiescence, and on the strongest branch a transposition table, null-move pruning, killer moves, and compressed piece-square tables. I am not publishing an ELO — those numbers were never in the repo.
Users compose when/then rules across messages, reactions, voice, roles, and schedules. Triggers and dos load from a JSON registry; slash UX handles validation and autocomplete; permissions are scoped per server. Docker Compose + pytest; the hosted instance is personal, not a product.
Collaborative Infinite Craft scraper and recipe-tree search. Deprecated. Grew out of InfiniteScrape.
Notes
I built the scraping half: threaded workers, ranked proxies, batched crafts, MongoDB recipe storage. A collaborator added Arborist tree search. Deprecated; interesting as a concurrency/rate-limit story, not as a current system.
Arduino Uno quadcopter controller attempt — archived after the IMU/DMP stack exhausted the Uno's 2 KB SRAM.
Notes
From-scratch sketches for nRF24 radio, MPU6050 (including MotionApps DMP), BMP180, GPS, and ESC mixing. It does not fly. The DMP firmware path alone is a known Uno RAM problem, and the later sketches are not in a compiling state. Kept as an honest embedded-systems dead end.
Spigot plugin: server-wide Minecraft stats with a small expression language for custom queries.
Notes
First plugin. Aggregates player stats JSON and evaluates nested formulas with a hand-rolled parser (+ − * / ^, a few functions). Useful as a Java/Spigot artifact, not as production plugin work.
Early Discord chess bot wrapping Stockfish and a local board-image service. Private; superseded by Strife's chess plugin.
Notes
Single-script bot: Stockfish for play, an aiohttp + CairoSVG PNG board server, challenge/move/forfeit, JSON-backed records. Process and timer orchestration in one file. Private repository.
Personal automation: mss / pixel color for turn state, clipboard letter subset, rarity scoring, configurable typing delay. Fragile to UI changes. Not a product.
Developer on AERPAW (Aerial Experimentation and Research Platform for Advanced Wireless), NC State's NSF PAWR testbed for programmable radios and autonomous UAVs/UGVs, working with Dr. Mihail Sichitiu on flight software, telemetry, and airspace awareness.
Primary maintainer of aerpawlib, AERPAW's official Python vehicle-control library — migrated the stack from DroneKit onto MAVSDK and keep it aligned with the testbed MAVLink filter
Built PyAerial, a Mode S / ADS-B tracker with polygon geofences, Redis live state, and a FastAPI / React radar UI (successor to airstrik.py)
Built DroneTracker, which aims AXIS Q-8615E PTZ cameras from live UAV GPS/velocity over Kafka and records field video over VAPIX
Associate in Science. Multiple semesters on the Dean's List and membership in the Beta Alpha chapter of Phi Theta Kappa (GPA: 3.8).
Skills
Languages
Pythonover 5 years
Expert
Since starting to program seriously, Python has been my primary language. I have used it for APIs, automation, hardware control, and data processing in almost every major project I have worked on.
I use C and C++ for microcontroller work and anything that needs to sit close to hardware. airtime was an Arduino Uno flight-controller attempt that died on SRAM; I have also written small Python extensions when a hot path needed it.
I use JavaScript for this site's UI (theme, simulations panel, deep links) and for a Media Session–based browser extension that drives Discord Rich Presence.
I have not used Java much outside of class. My main project with it is Statify, a SpigotMC plugin that exposes Minecraft statistics to the server and players.
I use Bash for automation and developer setup. Most of my scripts bootstrap local environments, manage Docker deployments, or wait for databases to start before other services run.
All projectsDocker setup scripts
Technologies
Linux/Unixover 5 years
Expert
Linux has been my main operating system for development and hosting since I started programming seriously. I have experience managing VPS servers, systemd services, file permissions, environment variables, and debugging network issues with tools like netstat and tcpdump.
Server ManagementAll Projects
Dockerover 3 years
Expert
I use Docker to run multi-service applications in development and production. I have experience writing Compose files, multi-stage builds, and network isolation for projects such as PyAerial, Strife, and discord.py-template.
Since starting to program seriously, Git has been my version control software of choice. I have significant experience using a good majority of the features it provides.
All Projects
Selenium / Web Scrapingover 2 years
Advanced
I have used Selenium and Playwright to automate browsers and scrape websites. In finiteCraft I ran headless Chromium workers to discover Infinite Craft recipes and used rotating proxies to stay under rate limits.
I have designed machine-readable HTTP APIs with FastAPI (PyAerial's live discovery endpoint and WebSocket spec) and structured trigger/action schemas in Triggered.
PostgreSQL is what I reach for when the schema matters: Strife's match/move/live-integrity migrations, and the NCSU parking collector. SQLite shows up in PyAerial history and smaller tools.
MongoDB was the first database I learned. I used it in airstrik.py for flight history, in Triggered for automation rules, and in finiteCraft for recipe graphs.
I have used Kafka as the field bus for AERPAW camera operations. DroneTracker consumes UAV position/velocity on a data topic, takes on/off commands from a control topic, and publishes acknowledgements and recording transfers.
I have used discord.py to write several Discord bots and a reusable bot template. I have significant experience with cogs, interaction routing, and building larger bot architectures.
I have used ADS-B and Mode-S to parse aircraft radio signals and track flight coordinates. At AERPAW I worked with this protocol at the hardware level, using RTL-SDR receivers to capture 1090 MHz transponder packets for PyAerial.
I am looking for internships and research roles in embedded systems, backend infrastructure, and wireless/autonomy software. Use the form below, or reach me on GitHub, LinkedIn, or Discord.
Amazon Music Discord RPC
The extension reads Media Session and first-party Amazon metadata instead of scraping the DOM. A small Rust host speaks Chromium/Firefox native messaging and Discord IPC, with coalesce + rate limits (5 / 20s) and reconnect. Private repository.
Molotov
Personal automation: mss / pixel color for turn state, clipboard letter subset, rarity scoring, configurable typing delay. Fragile to UI changes. Not a product.