Stephen 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

Code lives on GitHub and mirrors to Codeberg.

Stack

Astro, TypeScript, PostgreSQL, Python

Portfolio

8 projects & services

Writing

0 published notes

Responsibility

Development through operations

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

Practical work across company IT, public websites, and the automation that keeps them running.

  • Dunamis Status

    Live

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

    AstroTypeScriptPostgreSQLsystemdCaddy
  • Server backup & recovery

    Scheduled

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

    UbuntuPostgreSQLagesystemdBash
    Private operational tooling
  • Grace & Footnotes

    Live

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

    AstroTypeScriptPostgreSQLHTMLCSSJavaScript
  • Imaging Services website

    Hosted demo

    Business 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.js
    Demo under review · Private source
  • dunamismax.com

    Live

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

    AstroTypeScriptPostgreSQLHTMLCSSCaddy
  • MTG Card Bot

    In service

    Community 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.pyhttpxsystemd
  • Dynamic DNS automation

    Scheduled

    Network 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 APIsystemd
    Part of the support infrastructure

Browse by area of work

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.