Julian Reder Julian Reder is 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.

What I've built

Experiment script Runner / StateMachine aerpawlib v1 / v2 Vehicle, can_*, ZMQ MAVSDK + gRPC mavsdk_server MAVLink filter takeoff land goto yaw Cube Orange ArduPilot, LAM6/SAM4 Safety checker KML geofence, C-VM SITL tests Copter + Rover ZMQ proxy 5570 / 5571 JSON control plane, wait_for_peers
Experiment script → aerpawlib → MAVSDK → the testbed MAVLink filter → Cube Orange / ArduPilot.

aerpawlib

2025 - Present · AERPAW

Official vehicle-control library for AERPAW, NC State's NSF testbed for 5G/6G and autonomous aircraft.

Built

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.
PythonMAVSDK / MAVLinkArduPilotasyncio / gRPCZeroMQpytestSITL
RTL-SDR dump1090 AVR/Beast Engine merge, pyModeS Kinematics Kalman, ETA Geofence Shapely, KML Redis live tracker owns keys SQLite WAL flight history Portal, FastAPI + React WebSocket radar, Beast, webhooks
dump1090 → pyModeS / merge → kinematics → Shapely geofences → Redis live + SQLite history → FastAPI / React radar.

PyAerial

2024 - Present · AERPAW

Mode S / ADS-B tracker for AERPAW: dump1090 ingest, polygon geofences, Redis live state, SQLite history, React radar.

Built

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.'
PythonpyModeSShapelyRedisSQLiteFastAPIReactDockerRTL-SDRADS-B / Mode-S
AXIS Q-8615E site pose in YAML UAV now lat lon alt lead NEU velocity tilt = elevation pan = spherical bearing zoom = FOV(range, size) to 0-9999 camera north-offset wraps into AXIS +/-180 VAPIX ptz.cgi, record.cgi, export.mkv
Camera at a known site pose. UAV GPS/velocity in. Pan, tilt, and zoom are geometry before they are HTTP.

DroneTracker

2024 - Present · AERPAW

Aims AXIS Q-8615E PTZ cameras at AERPAW UAVs from Kafka GPS/velocity and records the flight over VAPIX.

Built

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.

PythonVAPIXKafkageopyDockerLinux/Unix
YAML config Pydantic forbid Validate AST, DAG, typos Planner batch FQL calls FactSet FPE snapshot / series Sandbox eval topo order, N/A Export Rich tables, Excel, JSON, FDT
Validate the config language, plan the FQL batches, then derive. No public repo — architecture only.

ML-Ticker

2026 · Merrill Lynch

FactSet FQL CLI with a restricted formula language and DAG-ordered metrics. Merrill Lynch internship; private repo.

Built

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.

PythonFactSet FQLPydanticpandasopenpyxlTyperDAGs
Discord thread slash, components Host lobby, session, routing play() live = replay = CLI Plugin GameContext Move log append-only, resume PostgreSQL 16 matches, players, live integrity
A Discord thread is just a view. play() is the same function for live, replay, and CLI.

Strife

2026 - Present · Discord Bots

Discord game platform: threaded matches, plugin games, Postgres history, crash-safe live resume. PlayCord rewrite.

Built

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.

Pythondiscord.pyPostgreSQLasyncpgPydanticDocker
site.toml essays, projects generator.py HTML pages + media GitHub Pages static index + essays Canvas engine, 12 modes molecules, orbits, life, aurora, flock
site.toml is the content. generator.py writes the homepage and the essay pages. The canvas is its own engine.

Portfolio Website (v3)

2026 - Present · Solo Projects

This site: TOML-driven static generator plus twelve background simulations you can grab and tune.

Built

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.

PythonJavaScriptCanvas
Open writeup View Project ↗

More builds

NCSU Parking

2026 · Solo Projects

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.

Amazon Music Discord RPC

2026 · Solo Projects

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-template

2025 - Present · Discord Bots

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.

Chess-Challenge

2023 · Collaborations

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.

Triggered

2023 - 2026 · Discord Bots

IFTTT-style Discord automation: compose trigger → action rules, persisted in MongoDB.

Notes

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.

finiteCraft

2024 · Collaborations

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.

airtime

2024 · Solo Projects

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.

Statify

2023 · Solo Projects

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.

Piranha

2023 · Discord Bots

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.

Molotov

2023 · Solo Projects

Screen-automation experiment for Bomb Party: pixel turn detection, scored dictionary, timed typing.

Notes

Personal automation: mss / pixel color for turn state, clipboard letter subset, rarity scoring, configurable typing delay. Fragile to UI changes. Not a product.

Molotov Discord embed: Molotov won the last round

Experience

May 2026 - August 2026
Worked on an internal calculations platform used for $500M+ in assets under management.
  • Created ML-Ticker, a Python CLI for querying FactSet FQL snapshot and historical data
  • Added a sandboxed formula engine with DAG-based dependency checks and Pydantic config validation
  • Exported results as colorized terminal tables and styled Excel workbooks
Summer 2023 - Present
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
Fall 2023 - Spring 2025
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
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.

Advanced

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.

Advanced

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.

Competent

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.

Competent

C# for Sebastian Lague's Chess Coding Challenge: iterative-deepening alpha-beta under a 1024-token budget.

Competent

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
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
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.

Advanced

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
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.

Advanced

I have designed machine-readable HTTP APIs with FastAPI (PyAerial's live discovery endpoint and WebSocket spec) and structured trigger/action schemas in Triggered.

Advanced

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.

Advanced

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.

Advanced

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.

Expert

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.

Advanced

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.

Elsewhere

Contact

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.