Work

Six systems, each one real and running. I designed them and ran the projects. AI agents did much of the implementation, working inside rules I wrote and against checks I set. I say that plainly because directing that work well is the skill.

How to read these. Problem is what I needed. Built is what exists now. Stack is the tools. Result is what changed, with the numbers my own logs record. Every diagram is inline SVG drawn for this page.

Home media server

A self-maintaining library for movies, TV and music that plays at home and on the road.

Problem

I wanted one library that fills itself, cleans up after itself, and plays on every screen I own, including my phone away from home and the Xbox on the living room Wi-Fi. Managing files by hand was never going to happen.

Built

  • Jellyfin is the front end. Radarr, Sonarr and Lidarr manage movies, TV and music, Prowlarr handles indexing and Bazarr handles subtitles. Downloads run through qBittorrent inside a VPN container. A Soulseek client with soularr upgrades lossy albums to FLAC.
  • Scheduled tasks do the housekeeping: a nightly search for missing titles (Radarr and Sonarr never re-search on their own), a sync every 15 minutes so anything deleted in Jellyfin does not come back, and a daily sweep that retires lossy files once a lossless copy lands.
  • Music got its own pipeline. Exports from four streaming services are matched against the library every morning to rebuild playlists, and each unique album is looked up and monitored in Lidarr so the collection fills in over time.
  • Remote access runs over a private mesh VPN with HTTPS, because the phone refuses plain HTTP.

Stack

  • Jellyfin
  • Radarr
  • Sonarr
  • Lidarr
  • Prowlarr
  • Bazarr
  • qBittorrent
  • gluetun
  • slskd
  • soularr
  • Docker Compose
  • Tailscale
  • PowerShell
  • Python
  • Task Scheduler

Result

  • One music root: 10,197 files organized by tag into artist and album folders (69 GB), with 645 artists and 1,249 albums identified for lossless upgrades.
  • 545 DJ sets pulled as audio only into a second music library so they stay out of the artist list.
  • Playlists rebuilt daily. The YouTube set list matched 523 of 524 on the first run.
  • Lesson logged: hardlinks fail for the download managers on Windows because they run as a service account, so real copies won.
System diagram
System diagram of the media serverProwlarr feeds Radarr, Sonarr and Lidarr, which send downloads through qBittorrent in a VPN container or slskd for lossless music. Files land in one library that Jellyfin serves to the TV, phone and Xbox. Scheduled tasks handle missing searches, deletions, lossy sweeps and playlists.ProwlarrindexersRadarr / SonarrLidarr, BazarrqBittorrentinside a VPNslskd + soularrlossless upgradesLibraryone rootJellyfinserverTV, phone, Xboxat home or on the roadScheduled housekeepingmissing search, sync deletions, lossy sweep, playlistsStreaming exportsmatched to library

Local AI lab

A private assistant on my own GPU, with web search, reachable from my phone.

Problem

I wanted a model I could talk to about anything without it living on someone else's server, with web search when I need it, and with enough context that it does not fall over on a long question. A first attempt in June jammed a 32B model against the VRAM ceiling at 8K context, and the first web search overflowed it.

Built

  • Ollama serves one 27B model (a Qwen build, Q4_K_M, about 17 GB) with a 32K context window. Sampling defaults and a direct-answer system prompt are baked into a Modelfile so every client gets the same behavior.
  • Preset modes are separate Modelfiles that share the same weights, so they cost no extra disk: a study tutor for my security coursework, a plain-answers mode, and a few more for specific jobs.
  • Open WebUI in Docker is the chat front end. A SearXNG container gives it web search, capped at three results per query so a search can never overflow the context again.
  • The GPU is pinned by device ID so the model never loads onto the integrated graphics, which was the cause of a 1 to 2 tokens per second bug. The server starts windowless at logon.

Stack

  • Ollama
  • Qwen 27B (Q4_K_M)
  • Open WebUI
  • SearXNG
  • Docker
  • CUDA
  • Tailscale
  • Modelfiles
  • Windows startup scripts

Result

  • 100% GPU residency with 32K context and about 5 GB of VRAM to spare.
  • Web search answers cite their sources in the UI, with the result count capped so context never overflows.
  • Retired cleanly when it was replaced: the old app was removed along with its models and its tasks, then rebuilt with one owner per job.
System diagram
System diagram of the local AI labA phone or PC reaches Open WebUI over a private VPN. Open WebUI talks to Ollama, which runs a 27B model with 32K context on the GPU, and to SearXNG for capped web search. Preset modes are Modelfiles that share the same weights. Everything starts windowless at logon.Phone or PCover a private VPNOpen WebUIDockerOllama27B, 32K contextGPUpinned by IDSearXNG3 results maxWebPreset modesModelfiles, shared weightsLogon startupwindowless

Art and print pipeline

Original art from a prompt to a 13 by 19 print without touching a GUI.

Problem

Screenshots of the ComfyUI interface come back blank on my machine, and stealing focus breaks whatever else is running. I needed image generation that an agent can drive end to end, judge on its own, and take all the way to paper at true print resolution.

Built

  • ComfyUI runs as a local service and is driven through its HTTP API by a self-contained runner: it queues a graph, waits, downloads the PNG and prints the path. One call does the whole job, so a dropped connection cannot leave a half-finished batch.
  • A quality ladder: base generation at about one megapixel, a detail pass where faces or fine lines need it, then a model upscale to 3900 by 5700 pixels, which is 13 by 19 inches at 300 DPI.
  • A second track makes art with no model at all. A NumPy renderer computes pieces directly at 4680 by 6840 pixels (13 by 19 at the printer's native 360 DPI): domain-warped noise for a nebula, a particle flow field, and a Julia set with orbit traps.
  • Print prep tiles master files onto sheets and drives the EcoTank from a script, including the paper tray fix that ended a run of failed prints.

Stack

  • ComfyUI
  • SDXL (Illustrious, Juggernaut)
  • FLUX
  • UltimateSDUpscale
  • 4x-UltraSharp
  • NumPy
  • Pillow
  • Python
  • Epson ET-8550

Result

  • Printed box panels and cards for festival trading, plus a three-piece wall series, all from this pipeline.
  • The hero image on this site came out of it: a FLUX generation, a 2x model upscale, shipped as AVIF and WebP with a JPEG fallback.
  • Rule I keep: pick the winner and finish. Review loops are where art projects die.
System diagram
System diagram of the art and print pipelineA job file goes to a Python runner that drives the ComfyUI API on the GPU and returns a PNG. The PNG gets a detail pass and an upscale, then layout onto 13 by 19 sheets and the printer. A NumPy renderer produces other pieces directly at print size. Web copies ship as AVIF and WebP.Job JSONprompt, size, seedRunnerPython, one callComfyUI APIGPU graphPNGjudged by meDetail + upscaleto 3900 x 5700NumPy renderernoise, particles, Julia set at 4680 x 6840Layout13 x 19 sheetsPrintertray 261WebAVIF, WebP

Nightveil display automation

Four screens that go red at sunset, restore themselves after a wake, and never fight the other tools.

Problem

A laptop OLED plus three USB panels, a night-time red overlay, Windows Night Light, brightness and the system theme all had different owners. Wakes, cable blips and a brightness utility kept undoing each other, and the USB panels' driver crash-looped when commands hit them the moment they appeared.

Built

  • One PowerShell service, registered as a per-user scheduled task with no elevation, owns every display setting. Sunset and sunrise flip the red overlay, Night Light, brightness and the theme in a single tick. Ctrl+Alt+S and Ctrl+Alt+R are the manual overrides.
  • Anything I set by hand stays. After a wake or a cable blip the script restores my values, never the schedule's target.
  • An idle blackout after 20 minutes that the first input clears, with click-through restored before the slow DDC/CI calls so the veil never eats a click.
  • A 30-second settle rule: no DDC/CI to a USB panel until the display layout has been still that long. That came from reading the driver's crash dumps with the vendor's symbols.
  • A rules harness with 43 rules and a set of mutants that must all fail it, plus a guard task that rewrites any scheduled job that would pop a console window.

Stack

  • PowerShell 5.1
  • Task Scheduler
  • DDC/CI
  • Windows Night Light
  • Win32 overlay window
  • WDF crash dump analysis
  • Twinkle Tray (coexistence)

Result

  • Verified over a real night: blackout at 01:55 after 20 idle minutes, restore at 05:39 on the first input, with the saved values back.
  • The crash loop stopped once the settle rule shipped.
  • The brightness utility and the script coexist: auto-apply off on one side, 45-second restore delays on the other, one owner per setting.
System diagram
System diagram of the nightveil display automationTriggers on the left: sunset and sunrise, wake or cable blip, twenty idle minutes, and the two hotkeys. They feed one PowerShell service with a state file, a 30 second settle rule and a 43 rule harness. Outputs on the right: the red overlay, Night Light, DDC/CI brightness on four panels, and the theme. A guard task keeps other jobs from popping windows.Sunset / sunriseone tickWake / cable bliprestore my valuesIdle 20 minblackoutCtrl+Alt+S / Rmanual overridenightveilPowerShell service, state file, 30 s settle rule, 43-rule harnessRed overlayclick-throughNight LightBrightnessDDC/CI, four panelsThemedark / lightConsole window guardrewrites noisy tasks

AI-run life admin

A scheduled agent that reads the mail, chases the threads and reports only what needs me.

Problem

Vendor threads and paperwork stall when they wait on me to open a computer. I wanted the inbox to hold only what needs a decision, everything else filed and findable, and an agent doing the chasing.

Built

  • A daily steward: a scheduled Claude task that reads the mail, checks the open case threads, and sends one message with only what needs me. It re-schedules itself.
  • Routing rules on all six mail accounts to one spec: family and one-time codes reach the inbox, records file to a searchable folder marked read, bulk mail is never seen. Text messages forward from the phone into a mail label so the same agent reads them.
  • Rules for the agents themselves: a machine rules file kept under 200 lines, a dated changelog, a validator with 13 regression checks that fails on any drift, and an AI-tell scanner that anything I share has to pass.
  • Machine hygiene the agents follow: nothing is deleted, it is staged with a manifest and purged after 30 days. Background jobs start through a launcher that never shows a window. Every replaced thing is retired in the same session.

Stack

  • Claude scheduled tasks
  • Claude Code
  • MCP servers
  • Mail APIs
  • Outlook COM automation
  • PowerShell
  • Python
  • Task Scheduler

Result

  • The inbox holds family and to-dos. Records are one search away.
  • Every change to the machine is logged, and the validator catches the regressions that shipped once.
  • Vendor emails get drafted so the whole thing is answerable in one reply, with numbered questions, because that is the only format I answer fast.
System diagram
System diagram of the AI-run life adminSix mail accounts with routing rules, forwarded texts and open case threads feed a daily steward, a scheduled agent that re-schedules itself and works under a rules file, a validator and an AI-tell scanner. It sends one message with what needs a decision, files records, and writes a dated changelog entry.Six mail accountsrouting rulesTextsforwarded to a labelOpen case threadsvendors, warrantyDaily stewardscheduled agent, re-schedules itselfRules + validator200-line rules file, 13 checks, AI-tell scannerOne message to meonly what needs a decisionRecords filedsearchable, marked readChangelog entryevery change, dated

DMACC AI coursework

An A.A.S. in Artificial Intelligence, in progress, on top of an MBA and an ag systems degree.

Problem

I already knew systems and business. I wanted the computer science underneath the tools I was using, from data prep to models to the code that glues them together.

Built

  • Data-Centric AI: feature engineering in notebooks against real datasets, including one module with a 49,628-file image set.
  • Natural Language Processing: module work in notebooks, run locally and in Colab.
  • Python: log-processing programs built around comprehensions, generators, function pipelines and dispatch tables, kept close to the instructor's examples on purpose.
  • Also in the program: an intro to computer vision, a capstone, and security coursework alongside.

Stack

  • Python
  • Jupyter notebooks
  • Google Colab
  • Canvas

Result

  • Graduation May 2027.
  • The habit that carried over: read the rubric first, match the house style, run the code before calling it done.
  • Summaries only here. No assignments or answers are published.
System diagram
Course map for the DMACC AI programAn ag systems degree and an MBA lead into the A.A.S. in Artificial Intelligence at DMACC, finishing May 2027. Courses: Data-Centric AI, Natural Language Processing, Python, plus computer vision and a capstone. It points at agtech and operations work.B.S. Ag Systems TechIowa StateMBADrakeA.A.S. Artificial IntelligenceDMACC, May 2027Data-Centric AIfeatures, notebooks, datasetsNatural Language Processingmodule work, local and ColabPythonpipelines, generators, dispatchComputer vision, capstonein the programAgtech and operationswhere it points

Skills

What I reach for, grouped the way I use it.

Systems and automation

  • PowerShell: services, scheduled tasks, registry, UI Automation
  • Docker and Docker Compose: media stack, LLM stack, VPN container
  • REST APIs: Jellyfin, Lidarr, ComfyUI, Ollama, Netlify
  • Windows administration: no-elevation design, task guards, crash dump reading
  • Networking: Tailscale, Caddy, Cloudflare DNS, HTTPS everywhere

AI and agents

  • Directing AI agents: rules files, changelogs, validators, one owner per job
  • Claude Code and MCP servers: Desktop Commander, browser automation, scheduled tasks
  • Local LLM serving: Ollama, Modelfiles, context sizing, GPU pinning
  • Image generation: ComfyUI API, SDXL, FLUX, upscaling, print prep
  • Python: NumPy, Pillow, notebooks, log pipelines

Business and operations

  • Operations analytics: measure first, then automate the boring half
  • Business systems: requirements, implementation, handoff docs
  • Agricultural systems: B.S. background, equipment and field operations
  • MBA: finance, strategy, decision framing
  • Writing: plain, first person, numbered questions people answer

Education