Writing

All Articles

Build Command Line Tools in TypeScript: A Step-by-Step Guide
TypeScript·

Build Command Line Tools in TypeScript: A Step-by-Step Guide

From an empty folder to a published npx command. Learn the structure I use for my own CLIs: citty for commands, clack for prompts, rc9 and zod for config, and Vite+ for linting, testing and bundling.

climail: The Email Client for Your Agent
AI·

climail: The Email Client for Your Agent

A clanker-friendly command line email client. Read, write, and organize your inbox from the terminal, with clean JSON that any AI agent can pick up.

Advanced Agentic Workflows With Stacked Skills
AI·

Advanced Agentic Workflows With Stacked Skills

A single skill removes one repetitive task. Stacking skills, letting one call another, turns a backlog into a workflow your agent can run end to end.

Skills: I Know Kung Fu!
AI·

Skills: I Know Kung Fu!

If you keep giving your agent the same instructions over and over, write them down once as a skill and let it do the repetitive bits.

Did Webmasters Go Extinct?
AI·

Did Webmasters Go Extinct?

AI is everywhere, and so is the question hiding underneath it: will it take my job? Here's what I think.

Building a Platformer Game with Vue and PixiJS
Vue·

Building a Platformer Game with Vue and PixiJS

Can I build a platformer game using Vue? Can my Vue skills help me in my game dev journey? Luckily, the answer to both questions is yes.

Vue Vapor: Goodbye, Virtual DOM
Vue·

Vue Vapor: Goodbye, Virtual DOM

Vue Vapor is a new compilation mode that ditches the Virtual DOM entirely. It's faster, lighter, and you can enable it with a single keyword — no refactoring needed.

Real-Time Vue Apps, Part 3: WebRTC and PeerJS
Vue·

Real-Time Vue Apps, Part 3: WebRTC and PeerJS

Direct, peer-to-peer connections with WebRTC: a friendly tour of SDP, ICE, STUN, and TURN, plus how PeerJS makes building chats and video calls actually fun.

Real-Time Vue Apps, Part 2: WebSockets and Real-Time Databases
Vue·

Real-Time Vue Apps, Part 2: WebSockets and Real-Time Databases

Bidirectional real-time with WebSockets, built right into Nuxt thanks to Nitro. Plus a tour of real-time databases like Firebase and Supabase, and how they use WebSockets under the hood.

Real-Time Vue Apps, Part 1: Polling and Server-Sent Events
Vue·

Real-Time Vue Apps, Part 1: Polling and Server-Sent Events

A series on adding real-time features to your Vue and Nuxt apps. We kick things off with the bad old days of polling, and then move on to Server-Sent Events, the simplest way to push from server to client.

Run Multiple Node.js Apps on One Server with PM2
DevOps·

Run Multiple Node.js Apps on One Server with PM2

Learn how to use PM2 to run, monitor, and manage multiple Node.js applications on your own server.

Automatically Deploy Your Nuxt Static Site to DigitalOcean with GitHub Actions
DevOps·

Automatically Deploy Your Nuxt Static Site to DigitalOcean with GitHub Actions

Auto-deploy is one of the great features of Netlify and Vercel. Whenever you push to main... done! Your site builds automatically. I love that, but I prefer to manage my own server.

A Step-by-Step Guide to Setting Up Permissions on Your Linux Web Server
DevOps·

A Step-by-Step Guide to Setting Up Permissions on Your Linux Web Server

Web server permissions: setting them right can be challenging, but setting them wrong can be disastrous. Of course, we don't want to grant a third party access to private files and folders or allow the execution of malicious code.