Software Developer

Riley Gramlich

I build web apps, automation systems, and useful tools.

I like turning messy processes into simple workflows and experimenting with the systems that make software feel effortless to use.

  • Automation-first workflows
  • Full-stack prototyping
  • Linux and Docker experiments

Right now

What I'm working on

Active projects, experiments, and systems I am building or testing right now.

AI + automation lab

OpenClaw

Exploring practical workflows that connect LLMs with real tasks, not just chat interfaces.

Low-friction integrations

n8n automations

Building repeatable automations that move data between tools and keep small systems in sync.

Human-in-the-loop systems

AI-assisted workflows

Testing where AI can speed up research, drafting, and ops without losing control of the outcome.

Server-side tinkering

Linux + Docker experiments

Running personal services, containers, and small deployments to stay sharp on infra basics.

UI + backend delivery

Web apps + internal tools

Shipping small web apps that are fast to maintain and focused on a single job.

Real-world systems

Client work (learning-focused)

Working on scoped projects when they teach me something about reliability, deployment, or UX.

Selected work

Projects

Technical notes on what I built, why it exists, and what I learned.

The AI receptionist site, showing a call transcript

Case study · live product

AI receptionist for small businesses

What it does
Answers a small business's phone and texts around the clock. It picks up on the first ring, asks the intake questions that trade actually needs, checks live calendar availability before offering a time so it cannot double-book, books the appointment mid-call, and texts a confirmation to the caller plus a summary to the owner.
Why it was built
A missed call is usually a missed customer, and a human receptionist in Calgary runs $2,800–$4,500 a month. This answers every call for a fraction of that, including evenings and weekends.
Tech stack
Node.js, Twilio ConversationRelay, WebSockets, Google Calendar API, Docker Compose, Caddy, SMS + WhatsApp
Technical decisions
Multi-tenant from the start, so onboarding a client is a config file and a restart rather than a rebuild. The site and the voice server are separate compose projects, so deploying the marketing site can never interrupt a live call.
What I learned
How much of a reliable phone agent is operational rather than conversational — deployment, tenancy, and never dropping a call matter more than the model.

Open source · merged upstream

God's Eye View — Open Calgary camera pack

What it does
Adds Calgary's public traffic cameras — roughly 214 of them — as a live layer on God's Eye View, an open-source 3D globe that plots real open-data feeds onto a photorealistic Earth.
Why it was built
The project already carried camera packs for other cities. Calgary publishes its catalogue through Socrata with no API key, so the layer could be added without asking every user of a global project to register for a key.
Tech stack
JavaScript, Vite, Socrata open-data API, Node server providers
Technical decisions
Keyless data sources only, so the feature costs downstream users nothing. The catalogue fetch is bounded and pinned, the response released on every refusal path, and cameras are labelled by intersection rather than by opaque ID.
What I learned
How to contribute to a genuinely fast-moving upstream. 214 commits landed in a single working day, including a restructure that moved the entire dev server out of the Vite config — so the branch had to be re-ported onto a new architecture, not simply rebased.

Submitted as #438, which the maintainer superseded with #514 — rebased onto the current component layout with review fixes, merged with co-author credit.

InternshipRadar dashboard

Case study

InternshipRadar

What it does
An AI-assisted internship discovery and application tracker with relevance scoring, alerts, and a status dashboard.
Why it was built
Built to centralize scattered internship postings and reduce the manual effort of tracking applications.
Tech stack
Next.js, Node.js, Supabase (PostgreSQL), n8n, Discord Webhooks
Technical decisions
Used a layered MVC approach with event-driven workflows to keep scraping, scoring, and notifications asynchronous.
What I learned
How to balance real-time discovery with a clean UI and keep job data deduplicated and searchable.

Team project · Atari ST

Geometry Dash for the Atari ST

What it does
A side-scrolling Geometry Dash clone that runs on Atari ST hardware: a square called Geo auto-scrolls through a course of spikes, blocks and lava, and the player controls nothing but the jump.
Why it was built
The term project for COMP 2659 at Mount Royal University — systems-level graphics and audio with no operating system, no engine, and no libraries underneath you.
Tech stack
C, Motorola 68000 assembly, Make, YM2149 PSG audio, STEEM emulator
My contributions
A four-person team; my eight commits covered the raster library cleanup and its tests, triangle rasterisation in all directions, the block sprite styling, the PSG music engine and three songs written for it, and replacing physbase/setscreen with direct control of the video base.
What I learned
What it feels like to write pixels straight into a framebuffer and compose music for a three-channel square-wave chip, with no abstraction to hide behind.
BlockTime weekly planner

Case study

BlockTime

What it does
A scheduling and workload planner that turns scattered school tasks into a single weekly planning flow.
Why it was built
Built to make assignment planning less chaotic and keep deadlines visible at a glance.
Tech stack
React, JavaScript, GitHub Pages
Technical decisions
Kept the data model small and focused the UI on weekly planning over feature depth.
What I learned
How small UI changes improve planning behavior and how to keep state updates fast.
Scribist document editor

Case study

Scribist

What it does
A MERN writing platform with a distraction-free editor, live collaborative documents, and a "Berserk mode" that starts deleting your words if you stop typing.
Why it was built
Built to support focused writing sessions while still enabling collaboration.
Tech stack
React, Node.js, Express, MongoDB, Socket.IO
Technical decisions
Kept the editor surface central and separated content state from layout state.
What I learned
Tradeoffs between collaboration features and keeping performance predictable.
Glossa Galore flashcard view

Case study

Glossa Galore

What it does
A language-learning web app that builds vocabulary through flashcards, with a feed where learners post using the words they just picked up.
Why it was built
Built to make consistent practice easier by giving learners a lightweight community layer.
Tech stack
Node.js, Express, EJS, MongoDB, DeepL API
Technical decisions
Used a simple content structure so the social layer stayed clear instead of noisy.
What I learned
How to balance social features with a focused learning path.
The Tommy Games shelf: Wizard, Quiddler, Euchre, Cribbage and more

Case study

Tommy Games — ten games in a browser

What it does
A shelf of ten classic card and board games — Wizard, Quiddler, Euchre, Cribbage, Sequence, Backgammon, Coup, Mastermind, Reversi and Yahtzee — each playable solo against bots, pass-and-play on one device, or online with friends.
Why it was built
The games people actually play around a table are mostly missing from the browser, or buried under accounts and adverts.
Tech stack
Svelte, JavaScript, WebSockets, Node.js
Technical decisions
Phone-first throughout: no horizontal scrolling at 360px, boards sized in viewport units, 40px tap targets, and overlays that behave like native sheets. Rules engines, a solver and a full online game are covered by tests, because ten rule sets are ten chances to be subtly wrong.
What I learned
Encoding ten different rule sets cleanly enough that one shared engine can drive bots, local play and networked play without forking per game.

Case study · developer tool

Vault Gate — Obsidian plugin for AI assistants

What it does
Lets an AI assistant read, search and write notes in an Obsidian vault without anything leaving the machine. Ask it what you wrote last week, search every note for a topic, or have it save something back.
Why it was built
Connecting an assistant to a vault previously meant a terminal, a Node install and a vault path in a config file — enough friction that most people never did it.
Tech stack
TypeScript, Obsidian Plugin API, Model Context Protocol
Technical decisions
The server runs inside Obsidian itself, so setup is enabling a plugin and clicking Connect. Reading and search are on by default and writing is off, so the cautious setting is the one you get without choosing it.
What I learned
Designing permissions people will actually leave switched on — the default has to be the safe one, not the convenient one.
Contraction Counter, showing duration and frequency tiles

Case study

Contraction Counter

What it does
Times contractions during labour, recording each one's length and the gap since the last so the pattern is readable at a glance.
Why it was built
The moment you need this is the worst possible moment to be fighting an interface.
Tech stack
React, TypeScript, Vite, Tailwind CSS, Firebase
Technical decisions
Mobile-first and backed by Firebase, so a session survives a closed tab or a swap to a partner's phone rather than living only in local state.
What I learned
Designing for one-handed use under stress, where every extra tap is a real cost.

Beyond personal projects

Work for organizations

Websites and systems I build and maintain for teams in Calgary and Alberta.

UrbanTec website

UrbanTec Property Management

The work: A full website redesign, and the ongoing running of the site since: hosting and site management, DNS, caching, SEO and page-speed work.

What it involves: Rebuilding the content structure and conversion flow with the marketing team, then keeping it healthy — DNS and domain records, cache configuration, technical SEO, and keeping page loads fast as content grows.

Result: A modern site that loads quickly, is straightforward for the team to run campaigns against, and has someone accountable for it after launch rather than only up to it.

Prairie College website

Prairie College

The work: Building and maintaining pages across the college website in WordPress and Elementor Pro, since November 2023.

What it involves: New page builds to brand guidelines and accessibility standards, ongoing asset and template optimisation for speed, and working with designers and content staff on how each page is laid out.

Result: A steadily modernised site that loads quickly across devices and is straightforward for the marketing team to run campaigns against.

Who you are hiring

About me

I am Riley Gramlich, a Calgary-based software developer who likes building systems that are simple, reliable, and easy to evolve. I care about thoughtful interfaces, clear data flow, and workflows that remove friction.

I am happiest when I am debugging a tricky edge case, tightening up a workflow, or turning a messy process into a tool that feels obvious to use.

Work with me
Riley Gramlich

How I work

  • Start with the workflow and map the data first
  • Prefer small, composable systems over large rewrites
  • Automate the annoying parts before adding features
  • Write code that is easy to revisit months later
  • Ship in small steps and learn from real usage

Tooling

Tech stack

Tools and platforms I reach for when building and shipping.

Frontend

  • JavaScript
  • TypeScript
  • React
  • HTML/CSS
  • Component-driven UI
  • Accessibility basics

Backend

  • Node.js
  • Express
  • REST APIs
  • PostgreSQL
  • MongoDB
  • Auth + sessions

Automation + AI

  • n8n
  • Python scripts
  • LLM workflows
  • Webhooks
  • Prompt tooling
  • Data ingestion

Systems

  • Linux
  • Docker
  • Git
  • CI/CD basics
  • Nginx
  • VPS deployments

Learning

Notes

A quick snapshot of what I am learning and experimenting with.

Automation-first systems

Building workflows that remove repetitive manual steps before they become busywork.

AI-assisted workflows

Testing where LLMs help with research and drafting without breaking human oversight.

Linux + Docker experiments

Running small services and containers to keep my systems knowledge fresh.

Thirty minutes, no pitch

Say hello

If you want to chat about a project, collaboration, or ideas worth testing, send a note.