Available for Hire — Enid, OK / Remote

I turn broken infrastructure into systems that never go down.

Network Engineer & Full-Stack Developer who worked every rung of the IT ladder — desktop support, field tech, helpdesk, and network engineering. I build tools that solve real problems — not just pass tests.

0 Career Chapters Desktop → Field → Helpdesk → Network
0% Uptime Target Self-hosted production apps
0+ Tools Built Django, .NET, Python
system_telemetry.sh
$ status --check
CONNECTING...
$ uptime
loading...
$ latency --ping
loading...
$ cpu_load
loading...
$ region
US-HOME-LAB-1 (Enid, OK)
FEDORA// DJANGO// .NET CORE// POSTGRES// PYTHON// NGINX// CISCO// LINUX// C#// SIGNALR// EF CORE// SNMP// ACTIVE DIRECTORY// SELENIUM// KEYRING//

:: Capabilities_at_a_Glance

Network Infrastructure

Cisco switching, fiber optics, SNMP monitoring, latency diagnostics. Physical-layer fluency most developers lack.

🛠

Full-Stack Development

Django + Python backend, .NET Core / C#, PostgreSQL. I build complete applications, not just frontends.

🐧

Linux & Self-Hosting

Fedora production servers, Nginx reverse proxies, CI/CD pipelines. My apps run on hardware I manage.

🧠

User-First Problem Solving

10 years across desktop support, field tech, helpdesk, and network engineering. "User error" is usually design error. I build for the human, not the spec sheet.

Most developers learned to code in a classroom.
I learned it reimaging lab PCs and fixing printers at 2 AM.

I started as a Desktop Technician at Northern Oklahoma College — setting up labs, troubleshooting hardware, managing AD accounts. That's where I first realized I liked building systems, not just maintaining them.

From there I moved into field work as a Printer Technician at Vereco, covering client sites across the region. Diagnosing hardware under pressure, with a customer watching, taught me something no bootcamp can: empathy is a technical skill.

Then came helpdesk at OUHealth — a large hospital system where I handled Tier 1–2 support, managed tickets against SLAs, and started doing root cause analysis on recurring problems instead of just closing tickets.

Now I'm a Network Technician at St. Mary's, managing Cisco infrastructure and building full-stack applications that solve the operational problems I see every day. I write code on Linux servers I manage myself, with the same attention to uptime that hospital networks demand.

"The best tool I use isn't a compiler — it's listening to the user to find the root cause."
2016 – 2018

Desktop Technician

Northern Oklahoma College — imaging, deployments, AD management, and campus-wide hardware support.

2018 – 2020

Printer / Field Technician

Vereco — on-site installation, repair, and preventive maintenance of commercial imaging equipment.

2020 – 2022

IT Helpdesk Analyst II

OUHealth — Tier 1–2 hospital support, SLA management, root cause analysis, and infrastructure maintenance.

2022 – PRESENT

Network Tech & Developer

St. Mary's Regional Medical Center — Cisco infrastructure, full-stack .NET & Django apps, healthcare automation.

Each project started with a real frustration. Here's the problem, my thinking, and the outcome.

PRODUCTION — HOSPITAL-WIDE

Security & Access Request (SAR)

THE PROBLEM

The hospital's security and access request system was a 15–20 year old Microsoft Access file. User onboarding was almost entirely manual — no audit trail, no role-based access, no compliance visibility. Nobody knew who had access to what, roles never expired, and there was zero insight into login patterns or suspicious activity. With SOX requirements tightening, the process was a liability.

MY APPROACH

Built a full .NET Core MVC application from scratch. A background service syncs users, groups, and manager chains from Active Directory across multiple OUs on a configurable schedule, with caching and zero-result abort protection. RBAC controls who can request, approve, and audit — with role expiration dates, automatic reversion to default roles, and separation-of-duty conflict detection. High-privilege role assignments auto-trigger access reviews.

A custom middleware tracks every login with IP, hostname, device type, and maps IPs to physical locations using database-driven network range rules. A Security Monitoring command center surfaces login history, access pattern alerts, and role assignments — all filterable, paginated, and exportable to CSV. Real-time notifications push via SignalR. Every change — role assignments, AD group modifications, user status — is audit-logged with full before/after history, filterable by date range and change type. All admin settings (SMTP, sync intervals, feature flags) are database-backed and configurable from the UI without redeployment.

THE OUTCOME

Replaced a decades-old Access file with a SOX-compliant web application. Automated user provisioning cut onboarding time dramatically. The admin dashboard surfaces KPIs (stale requests, orphaned users, disabled physicians) in real time. Security auditors can export full audit trails filtered by date, user, and action type. Role conflicts are detected automatically. The system runs as a hosted background service with no manual intervention required.

.NET Core MVCC#EF CoreActive DirectorySignalRMailKitSQL ServerMiddleware
PRODUCTION — 20+ HOSPITAL ENDPOINTS

Tracking Board Automation

THE PROBLEM

Nurses needed Cerner tracking boards visible 24/7 on dedicated screens, but the process required opening a browser, navigating a Citrix URL, and entering credentials — time they didn't have. The original automation script broke constantly on slow page loads, ran once with no recovery, stored passwords in plain text, and logged nothing for troubleshooting.

MY APPROACH

Rewrote the system from scratch. The script auto-detects the hostname from a config file (devices.ini) mapping 20+ hospital endpoints to their Citrix URLs and workflows. Added retry logic with exponential backoff (tenacity) so slow Citrix loads don't crash the process. Moved credentials to Windows Credential Manager (keyring) with a drag-and-drop setup tool non-technical staff can use. Added structured logging (structlog) so issues can be diagnosed remotely. Built a self-bootstrapping batch launcher that auto-creates Python venvs and installs dependencies.

THE OUTCOME

A zero-touch system: plug in the PC, it boots, auto-detects which tracking board to show, logs into Citrix, and goes fullscreen — no nurse interaction required. Handles three distinct workflows (SurgiNet, FirstNet/Lab TAT, FetaLink), recovers from failures automatically, and produces diagnosable logs. Deployed across surgery, ER, radiology, maternity, pharmacy, and ICU departments.

PythonSeleniumKeyringTenacityStructlogINI ConfigCitrix
LIVE

NetMon Dashboard

THE PROBLEM

Enterprise monitoring tools (Nagios, PRTG) are overkill and expensive for home labs and small networks. But flying blind isn't an option.

MY APPROACH

Custom SNMP & ICMP monitor built on Django. Real-time device status, historical uptime data, and alerting — all in a clean dashboard.

THE OUTCOME

Lightweight network monitoring that runs on minimal resources. Real-time visibility into every device on the network.

DjangoSNMPPostgreSQLNginx

This is a web recreation of my desktop Sports Ticker, pulling live scores from the same public scoreboard API my Python version uses. Toggle modes to see both views.

Fetching live scores...
desktop_ticker.py — Ticker Mode ⠿ Draggable on desktop

System Architecture

📡
data_fetcher.py
Polls scoreboard API
every 60 seconds
📄
scores.json
Shared data file
atomic writes
desktop_ticker.py
Scrolling ticker
desktop_pill.py
Compact widget
panel_ticker.py
XFCE panel
✓ Logo caching (MD5 hashed) ✓ Atomic file writes ✓ Auto-start on boot ✓ Click → opens game page ✓ Boss-mode hiding ✓ Multi-monitor aware
Security & Access Request — Architecture
ENTRY

Browser + Windows Auth

Negotiate/NTLM — zero-login SSO via Active Directory

MIDDLEWARE

Request Pipeline

WindowsIdentityMiddleware LoginTrackingMiddleware

Captures IP, hostname, device type, maps to physical location via DB rules

AUTH

AD Claims + RBAC Policies

RequireAdminGroup RequireManagerApproval RequireAccessGroup RequireUserGroup

Claims transformed from AD groups at login — policy-based access per controller

CONTROLLERS

MVC + API Endpoints

Dashboard Security Monitoring User Audit Requests Global Search
SERVICES

Business Logic Layer

CORE
UserService RequestService RoleManagementService
ACTIVE DIRECTORY
ActiveDirectoryService AdGroupsService WindowsImpersonation
SECURITY & AUDIT
AccessMonitoringService UserHistoryService SecretFetchService
INFRASTRUCTURE
EmailService (MailKit) NotificationService (SignalR) SettingsService ExportService (CSV)
DATA

PostgreSQL + EF Core

DbContextFactory, memory cache, Serilog

WORKERS

Background Services

UserSyncService LogCleanupService

Key engineering decisions

🔒
Role conflict detection

Separation-of-duty checks prevent approver + requestor overlap. High-privilege roles auto-trigger access reviews.

📍
IP-to-location mapping

Login middleware resolves IPs to physical hospital locations using cached DB-driven network range rules.

Role expiration

Temporary roles auto-revert to defaults on expiry. Supervisor and user are notified via email.

Zero-deploy config

All settings (SMTP, sync interval, feature flags) stored in DB with cache. Change from admin UI, no redeploy.

🛡
SOX audit trail

Every change logged with before/after values, filterable by date and type, exportable to CSV.

🔄
Smart AD sync

Background service syncs users from multiple OUs. Zero-result fetches abort to prevent data wipe. Manual sync available.

Don't just take my word for it.

"When a network issue had our entire floor offline, Crandall didn't just fix it — he documented the root cause and built a monitoring script so it wouldn't happen again. That's the kind of thinking you can't teach."

JD
— Colleague Network Operations

"Most people in IT just want to close the ticket. Crandall actually listens to understand what you're trying to accomplish, then finds the right solution — not just the fastest one."

SM
— End User Administrative Staff

* Replace these with real testimonials from colleagues and supervisors. Even 2-3 genuine quotes dramatically increase trust.