// full-stack python developer

Building tools that
actually work
for real people.

Niles McCrystal  ·  SystemCoder99

I build CLI tools, APIs, and backend systems with a focus on clarity, accessibility, and getting things right the first time.

Python FastAPI Typer Textual PostgreSQL UV
↓ Download CV

// about me

Who I am

I'm Niles McCrystal, a mid-level full-stack developer with a focus on Python — building everything from terminal applications and REST APIs to full cross-platform desktop apps. I specialise in tools that are clean to use, well-documented, and built to last.

One of the things I care most about is accessibility. I'm dyslexic and have auditory processing difficulties, which means I think carefully about how information is communicated — both in the software I build and in how I work with teams. I've developed tools specifically to improve accessibility in the workplace, and that perspective shapes everything I make.

Because of my auditory processing difficulties, I adopted spec-driven development as a core part of how I work. Rather than relying on back-and-forth verbal clarification, I make sure requirements are fully defined upfront — which means less rework, clearer pull requests, and better outcomes for everyone involved.

Approach

Spec-first, accessibility-minded, and pragmatic. I'd rather spend time getting requirements right than revisiting finished work.

Experience

Mid-level full-stack developer. Comfortable across the whole stack, with a strong preference for Python backends and CLI tooling.

What I Build

APIs, terminal apps, automation tools, and real-world software that solves genuine problems — often starting from personal need.

Working Style

I work best with clear written specs and async communication. I'm thorough, considered, and tend to think about edge cases early.

// things i've built

My Projects

A mix of professional work and personal tools — some finished, some growing.

// professional work

🏗️ Monorepo Build & Deploy Layer professional

A tool built on top of our internal build and deploy framework to add full monorepo support. Started as a solo project over 8 months before growing into a team effort as adoption expanded — a sign of how much it came to be relied upon.

PythonMonorepoBuild ToolingCI/CDParallelisationDependency Resolution

What It Does

  • Automatic change detection — only projects with changes are built and deployed
  • Dependency map — if a changed project is depended on by others, those are automatically rebuilt too
  • Correct build ordering — dependencies are always built before the projects that rely on them
  • Parallelised builds — independent projects build simultaneously to minimise pipeline time
  • Configurable build and deploy steps per project within the monorepo
  • Designed and built entirely from first principles — architecture, dependency resolution, and build ordering all self-designed before AI coding tools were part of my workflow
📦 UV Company Onboarding professional

Laid the groundwork to onboard UV as the company-wide standard for Python development — configuring the developer environment so that UV is automatically set up on first use, pointing to the internal package index rather than public PyPI.

UVPythonInternal ToolingPlatform EngineeringPackage Management

What I Did

  • Built the configuration groundwork to automatically set up UV for new and existing developers
  • Configured UV to use the internal package index by default, keeping dependencies off public PyPI
  • Opened a feature request upstream with the UV project for mTLS support to meet internal security requirements
  • UV is now the recommended Python tooling standard across the company
📋 Spec-Kit AI Skill & Jira Integration professional

Built a custom AI skill that bridges Spec-Kit (a spec-driven development tool by GitHub) with Jira — automatically transforming short ticket descriptions into fully-scoped feature request specs. I also advocate for spec-driven development as an accessibility practice, for both humans and AI agents alike.

AI SkillJira IntegrationSpec-Driven DevWorkflow Design

What I Built & Why

  • Built the AI skill that reads short ticket descriptions and outputs fully-detailed specs into Jira
  • Requestors write tickets the same way they always have — the skill does the heavy lifting
  • Advocates for spec-driven development as an accessibility practice — born from personal need, as auditory processing difficulties make verbal-only clarification unreliable
  • Benefits developers picking up tickets, AI coding agents acting on them, and reduces PR back-and-forth for everyone
🎨 Colour Screen Overlay professional

A workplace accessibility tool that applies coloured screen tints for users who benefit from them — particularly those with dyslexia or visual stress. Built after recognising that existing solutions were either expensive, clunky, or unavailable on managed systems.

PythonAccessibilityWorkplace Tool

// personal projects

🧩 Patchwork in development

A Progressive Web App for plural systems — groups of people who share a single body. Patchwork gives systems a private, local-first space to document their members, track fronting history, and stay connected with trusted friends. The backend is a self-hosted FastAPI server running on a Raspberry Pi 5, with a Neon PostgreSQL database and a cloudflared tunnel. Built with genuine care for the community it serves.

PythonFastAPIPostgreSQLPWAIndexedDBWeb PushAES-GCMLogto OIDCRaspberry Pi

Technical Highlights

  • AES-GCM end-to-end encryption — the server stores and routes encrypted blobs it cannot read
  • Self-hosted FastAPI backend on a Raspberry Pi 5 with Caddy reverse proxy, cloudflared tunnel, and GitHub Actions CD runners
  • Per-device Web Push notifications via VAPID — because your phone and your laptop are different devices
  • Local-first with IndexedDB — sensitive data lives on the user's device; the server is an encrypted relay
  • SimplyPlural import support for existing community users
↗ patchwork.work
🖥️ Patchwork Server Infrastructure self-hosted

The backend infrastructure for Patchwork — a self-hosted FastAPI server on a Raspberry Pi 5, with automated deployments, a reverse proxy, and a persistent tunnel to the public internet. Built and maintained entirely independently, from hardware upward.

FastAPIRaspberry PiCaddycloudflaredGitHub ActionsNeon PostgreSQLSelf-Hosting

What I Built

  • Migrated Patchwork from Railway PaaS to a self-hosted Raspberry Pi 5 — full infrastructure ownership
  • Caddy reverse proxy for HTTPS termination and routing
  • Cloudflared tunnel to expose the Pi to the public internet without port-forwarding
  • GitHub Actions self-hosted CD runners on the Pi for automatic zero-downtime deployments on push
  • Neon PostgreSQL as the managed database layer — serverless, scales to zero
🔮 SpellBreak in development

An Android screen break reminder app built using the Accessibility Service API and WindowManager overlay. SpellBreak interrupts active screen use with a configurable full-screen overlay — designed to work across all apps, not just when the user thinks to check a timer.

AndroidJavaAccessibility Service APIWindowManager

Technical Highlights

  • Accessibility Service API for reliable cross-app screen usage detection
  • WindowManager overlay — appears above all apps including games and video
  • Configurable break intervals and overlay dismissal behaviour
  • Signed APK build — installable as a standalone app
🥫 PanTry in development

A local-first PWA for tracking grocery and medication expiry dates. All data is encrypted client-side with AES-256-GCM before leaving the device — the FastAPI backend handles sync only, and cannot read user data. Works offline via IndexedDB with sync on reconnect.

PythonFastAPIPWAAES-256-GCMWeb Crypto APIIndexedDB

Technical Highlights

  • AES-256-GCM client-side encryption via the Web Crypto API — server receives only ciphertext
  • Local-first with IndexedDB — fully functional offline, syncs when a connection is available
  • FastAPI backend on Oracle Cloud free tier for lightweight sync
  • Tracks both groceries and medications with configurable expiry alerts
🤖 Discord Bots ongoing

Three Discord bots, each built to solve a specific real-world problem. Each one does its job well and stays in its lane — mostly.

PythonDiscord APIPostgreSQL

What They Do

  • LaceyBot — medication reminders, water reminders, and fully custom scheduled reminders
  • AngelBot — generates hex colour swatch images, reports current front status, and tracks last activity in any channel
  • Patches — the Patchwork support bot. Handles passphrase resets and support ticket creation with log parsing, bridging Discord and the Patchwork platform

// what i work with

Skills & Tools

Languages

Python 3.13SQLBash

Backend & APIs

FastAPIPydantic v2PostgreSQLSQLite

CLI & Terminal

TyperTextualRich

Frontend & PWA

PWAIndexedDBWeb Push (VAPID)Web Crypto API

Auth & Security

Logto OIDCDiscord OAuthAES-GCMVAPID / Web Push

Tooling

UVGitJira

Infrastructure

Raspberry PiCaddycloudflaredGitHub ActionsNeon PostgreSQL
Spec-Driven Development — I've built my workflow around writing clear, complete specifications before writing code. This came from personal necessity (auditory processing difficulties make verbal-only requirements unreliable), but the benefits are universal: fewer revisions, clearer PRs, and requirements that AI coding agents can actually act on.
Accessibility-First Thinking — As someone who is dyslexic, I've built accessibility features professionally (colour screen overlays, readable interfaces) and I bring that perspective to every project. Good software should work for the people using it, not just the people building it.

// get in touch

Let's Talk

I'm open to freelance work, contract roles, and interesting full-time opportunities — especially anything involving Python tooling, API development, or accessibility-focused software. Written communication works best for me.

A note: I work best with clear written briefs rather than calls or verbal-only discussions. If you're reaching out about a project, a short written summary of what you need goes a long way — and I'll always respond thoroughly in kind.