Stack
Astro, TypeScript, PostgreSQL, PythonStephen Sawyer · dunamismax
I build the websites.
I run the systems.
I’m Stephen Sawyer: an Astro and TypeScript web developer and hands-on sysadmin. I build with Astro, TypeScript, and PostgreSQL, automate with Python, and operate the Ubuntu infrastructure behind my work.
From self-hosted RustDesk for my entire company to public websites, monitoring, and backups, I take responsibility for the code and the service people actually use.
- Astro / TypeScript
- PostgreSQL
- Python
- HTML
- CSS
- Ubuntu
- Caddy
- Docker
Web
Astro, strict TypeScript, prepared SQL, server-rendered semantic HTML, and hand-written CSS.
Remote support
Company-wide RustDesk hosting, customer downloads, and repeatable Windows client setup.
Scripting
Python, uv, and Ruff for automation, bots, and one-off tooling; Bash for deploy and server glue.
Operations
Ubuntu, Caddy, isolated Node services, systemd services, monitoring, and encrypted backups.
Selected work
Built, hosted, and maintained.
Practical work across company IT, public websites, and the automation that keeps them running.
RustDesk remote support
In serviceCompany IT · Deployment & operations
I self-host RustDesk for my entire company, with the server and relay running on Ubuntu in Docker. The customer-facing support site at xrayservice.net provides a preconfigured Windows client.
I maintain the download flow, scheduled installer updates with checksum and signature verification, monitoring, and daily service backups. Customers can get connected without manually entering server settings.
RustDeskDockerUbuntuCaddyWindowsDunamis Status
LiveMonitoring · Development & operations
A self-hosted operations dashboard for website health, services, incidents, deployments, and repository status.
A scheduled TypeScript collector records checks in PostgreSQL. The public website reads those snapshots through a separate, read-only account and identifies stale data instead of presenting it as current.
AstroTypeScriptPostgreSQLsystemdCaddyServer backup & recovery
ScheduledInfrastructure · Recovery planning
Daily backup automation for the Ubuntu server, alongside application and RustDesk backups.
The recovery workflow captures configuration, service inventory, and database exports, encrypts sensitive material with age, and maintains rebuild instructions. Recovery planning is part of operating the service.
UbuntuPostgreSQLagesystemdBashPrivate operational toolingGrace & Footnotes
LivePublishing · Development & hosting
My Christian writing website, built around a readable, accessible publishing experience and content I host myself.
Astro, TypeScript, and PostgreSQL support writing, scheduled publication, RSS, study dates, and downloadable resources. A shell-based publishing workflow keeps editing separate from the public website.
AstroTypeScriptPostgreSQLHTMLCSSJavaScriptImaging Services website
Hosted demoBusiness website · Development & deployment
A bespoke replacement for an existing WordPress website, covering company services, equipment, practice specialties, and contact information.
Twelve pages run on Astro, strict TypeScript, and PostgreSQL in a separate Ubuntu deployment for review. The replacement is at the demo stage; the company’s main website has not been cut over.
AstroTypeScriptPostgreSQLHTMLCSSNode.jsDemo under review · Private sourcedunamismax.com
LivePortfolio · Development & hosting
This portfolio and blog: Astro, strict TypeScript, PostgreSQL, semantic HTML, and hand-written CSS. No browser JavaScript.
Server-rendered pages, RSS, a read-only public database account, and versioned deployments behind Caddy keep the application small and inspectable.
AstroTypeScriptPostgreSQLHTMLCSSCaddyMTG Card Bot
In serviceCommunity tooling · Development & operations
A Discord bot that brings Magic: The Gathering card search, pricing, legality, and rulings into the conversation using Scryfall data.
Python, discord.py, and httpx handle card lookups and API requests. It runs as a systemd service on Ubuntu, with structured logging, duplicate suppression, and graceful shutdown.
Pythondiscord.pyhttpxsystemdDynamic DNS automation
ScheduledNetwork operations · Automation
A TypeScript command-line updater keeps selected Cloudflare DNS records aligned with the server’s public address.
A systemd timer runs every five minutes. An explicit record allowlist and a dry-run mode keep the scope clear and let changes be inspected before they are applied.
TypeScriptCloudflare APIsystemdPart of the support infrastructure
Get in touch
Let’s talk about the work.
Web development, self-hosted services, automation, or systems administration. Start with the problem you need to solve.