Selected work/

I direct AI-assisted systems that do real work. Agents do much of the implementation. I set the brief and the constraints, review the result and approve it. Every number below is measured, and every limit is stated.

Measure before adoptingIf a component doesn’t improve results, it stays off.
Humans approve productionAgents draft and propose. A person approves what goes live.
Know when not to generateGenerative AI for creative work, exact processing for products.
01

Agent platforms
multi-user, self-hosted

A multi-user agent setup, running since the early days of OpenClaw

I started running OpenClaw close to its launch, when agentic assistants were still new, and have operated it daily since. It now spans two servers, my own VPS and a GPU workstation at work, with several people, agents and channels sharing one carefully scoped setup.

Multi-user and multi-agent. A main assistant works alongside specialist agents for web engineering and imagery. Colleagues use the same tools from their own clients and from team chat. Each agent has its own workspace and memory, and a colleague holds the same approval authority I do.

Knowledge that outlives a chat. A self-hosted Outline wiki is the human-facing handbook and single source of truth. Agents keep decisions in their own memory, and document search lives in a separate vector store. Keeping those apart stopped the assistant mixing up its own history with product facts.

Operated like infrastructure. Private access over Tailscale, models served by Ollama on the GPU host, scheduled jobs, uptime monitoring and weekly offsite backups. Upgrades go through rollback points. I have repaired failed migrations and a corrupted session database, and I keep runbooks for everything that broke.

What I learned: the hard part isn’t the model. It’s permissions, memory boundaries, recovery, and knowing which jobs belong in a workflow tool and which belong with an agent.

OpenClaw · Claude · Ollama · Outline · Tailscale · Docker · n8n · Uptime Kuma · MCP

03

Internal platform
infrastructure, local inference

A local AI server built around 32 GB of VRAM

I wrote the build plan for an RTX 5090 workstation. The goal was a working environment, not a model demo: local LLMs, document knowledge, creative generation, internal apps, website staging and agent orchestration.

The design starts from the real constraint, which is GPU memory. One large chat model and one embedder stay resident, and creative jobs are queued and unload the chat model when they need the GPU. The system uses retrieval rather than fine-tuning. Mismatched context sizes forced models to reload, so we aligned them. Hot data is kept on NVMe and archives on a separate SMR disk.

Diagnosis is organised in four layers: private network and TLS, Windows-native processes, WSL/Ubuntu services, and two separate Docker engines. Something can work in its container and still fail from Windows, or appear missing because the wrong engine was queried. Startup sequencing and a WSL keep-alive were tested with cold starts.

Ollama · Open WebUI · Qdrant · PostgreSQL · Redis · Docling · n8n · Caddy · OpenClaw agents · Tailscale

04

Internal tool
creative, computer vision

A creative studio that knows when not to generate

The studio puts local image and video generation behind a product interface (React, FastAPI and ComfyUI), so nobody has to edit node graphs.

FLUX.2 Klein handles image creation and editing. LTX handles video: image-to-video, restyle, continue a shot, follow motion, and grab a frame as a reference. Seeds and settings can be locked, so results can be reproduced.

The product-image page is deliberately non-generative. Distributor photos are framed on consistent square canvases with a set object footprint, normalised white backgrounds, and Real-ESRGAN upscaling only for small sources. A generative model can redraw packaging text, so it isn’t used where the product has to be shown exactly.

Boundaries: Rendering and source media stay local, but assistant messages go to a cloud provider. One video model was archived without being used because its license excluded our region.

05

Internal tooling
MCP, e-commerce, SEO

AI tools for two shops, with a human approving production changes

Assistants get typed MCP tools for the catalogue, content, taxonomy, analytics and webmaster work. They do not get general access to the stores.

  • One store server per shop. The only service that can read both shops is read-only by construction.
  • Page tools write drafts. Editing a live page creates a linked draft for review, and product-feed changes go through an approval page.
  • OpenSEO was adopted rather than rebuilt. Agents use its 52-tool API alongside Search Console and GA4.
  • Bing Webmaster has 16 tools, and the only writes it allows are recrawl submissions. In its first review we found one URL that was really missing and redirected it, then submitted 48 URLs.

Code is built on dev mirrors and checked with Playwright on desktop and narrow phones before anyone approves it for live.

06

Internal, in daily use
product, reliability

From asset library to marketing workbench

An in-house DAM (Node and Express) took on uploads, previews, folders, ad sizes, a booking calendar, delivery reminders and expiring partner links.

8.0 → 2.7 s
per-PDF thumbnail render
228 ✓ / 10 skip
regression suite on the UI refresh

Large upload queues broke on a per-request file cap. The client now splits the queue into server-sized batches and shows one combined progress bar. A separate state shows server-side processing after the upload finishes. Concurrent writes were reworked to read fresh state before committing. Filenames keep Icelandic characters on display and are transliterated for URLs.

07

Local-business site live · B2B catalogue in development
WordPress, editorial systems

Editable WordPress without visual regressions

A B2B parts catalogue (industrial supplier) has 3,049 products and 468 categories in development. A hand-built front page was converted into custom server-rendered blocks, with zero changed pixels at seven viewport widths. Search runs on a site-specific Meilisearch integration with an accessible combobox. Ties in ordering were made deterministic, so visual tests stay stable.

A local auto-service website went from my brief and logo to a live site. The front page is built from real editable blocks rather than freeform markup. It was tested at desktop, tablet and 390 px. The mobile call button was then designed down to 320 px. Afterwards we closed the project out with an archive, a git bundle and restore notes.

08

Analytics
judgement

A traffic spike that wasn’t growth

After a tagging and consent change, GA4 showed a sharp rise in traffic. We compared it with Search Console and commerce data and called it what it was: a change in measurement, not more visitors. The same data later fed a homepage brief covering mobile share, search behaviour and top categories.

09

Own products
and operations

My own products and servers

Poddið ↗

Every Icelandic podcast in one place. About 47,000 episodes have their own indexable pages with PodcastEpisode structured data and chunked sitemaps.

Voddið ↗

TV companion built with Next.js, Prisma and TMDB. It has 1,206 sitemap URLs and sends transactional email through Amazon SES.

Self-hosted fleet

One VPS running 26 containers. The whole fleet moved off end-of-life runtimes in a day (Node 24, PHP 8.4). Uptime monitoring and alerting are in place, and backups go weekly to an offsite store.

Agent platform slimdown

The agent install went from 1.8 GB to 456 MB, and gateway restarts dropped from about 5.5 minutes to about 30 seconds.

Need something like this/

Document search, local AI tooling, editable WordPress, analytics you can trust. I scope small, measurable projects and show the evidence as I go.

Start a conversation