Blog.

Notes on software, tools, productivity, and the small operational hazards of trying to make useful things.

All Posts

Browse Posts

Sections

Code topics

How to make a scroll-driven video animation with FFMPEG, WebP frames, and canvas

How to make a scroll-driven video animation with FFMPEG, WebP frames, and canvas

How I turned a short video into a scroll-controlled WebP frame animation using FFMPEG, canvas, an...

JavaScript Jekyll Apr 26
Set up a Buttondown newsletter with Jekyll and a custom signup form

Set up a Buttondown newsletter with Jekyll and a custom signup form

How to add a custom Buttondown signup form to a Jekyll blog without exposing API keys or building...

Jekyll Apr 26
Making short AI videos without losing the plot completely

Making short AI videos without losing the plot completely

A quick overview of this past weekend's workflow for making short AI-generated videos with Gemini...

AI Tools Apr 26
The increasing AI-content consumption fatigue

The increasing AI-content consumption fatigue

Why AI-generated content can feel exhausting, and what that means for reading, writing, and atten...

AI Mindfulness Apr 19
Are we amusing ourselves to death?

Are we amusing ourselves to death?

Reflections on McLuhan, Postman, and why the medium still has a habit of quietly eating the message.

Books Jan 06
🍍 Pinia Stores - Manage Vue State With Ease

🍍 Pinia Stores - Manage Vue State With Ease

How Pinia simplifies Vue state management for location and language settings compared with manual...

Vue Mar 13
Firestore + Firebase Hosting with Nuxt 3

Firestore + Firebase Hosting with Nuxt 3

How to deploy a Nuxt 3 frontend with Firebase Hosting and Firestore-backed data.

Firebase Nuxt Feb 14
Styled code blocks

Styled code blocks

How to style Jekyll code blocks with Rouge instead of leaving snippets to fend for themselves.

Jekyll Feb 12
Vue pagination component

Vue pagination component

How to build a reusable pagination component in Vue for cleaner list navigation.

Vue Feb 11
Firebase Emulator Suit

Firebase Emulator Suit

How to test Firebase Cloud Functions locally with the Firebase emulator suite.

Firebase Feb 03
Nuxt + Tailwind

Nuxt + Tailwind

A quick setup guide for using Tailwind in a Nuxt project.

Nuxt Tailwind Jan 10
DaisyUI ❤️ Tailwind

DaisyUI ❤️ Tailwind

A quick look at using DaisyUI with Tailwind to move faster without hand-rolling every component.

Tailwind Jan 10
Tailwind Safelist

Tailwind Safelist

Why Tailwind can drop dynamic classes and how to use a safelist when generated class names disapp...

Tailwind Jan 08
Stay Resort

Stay Resort

A practical review of Stay Resort in Phuket, covering the fitness setup, location, price, and whe...

Travel Dec 04
Deploy Nuxt on Vercel

Deploy Nuxt on Vercel

How to deploy a Nuxt app on Vercel, including preview builds and common dependency issues.

Nuxt Deployment Oct 03
Nuxt cookies and server middleware

Nuxt cookies and server middleware

How to use cookies and server middleware in Nuxt for lightweight API route guards.

Nuxt Sep 23
Getting The Thai Driver License

Getting The Thai Driver License

Notes from getting a Thai driver license, including the process, requirements, and practical gotc...

Thailand Sep 11
Chasing Peace

Chasing Peace

A personal reflection on chasing calm in a society that keeps handing you more inputs.

Mindfulness Aug 01
Migrate from Vue CLI to Vite

Migrate from Vue CLI to Vite

A short migration note on moving a Vue project from Vue CLI to Vite for faster local development.

Vue Jun 28
Reset Firebase user passwords

Reset Firebase user passwords

How to reset Firebase user passwords with the Firebase SDK and a small admin workflow.

Vue Firebase Jun 13
Influencer - Location Scouting!

Influencer - Location Scouting!

A location-scouting note on Thailand, tourism, and the strange geography of influencer culture.

Movies Thailand Jun 10
Persist user settings with localStorage

Persist user settings with localStorage

How to persist Vue user settings with localStorage and keep the interface in sync.

JavaScript Vue Jun 01
Generate QR codes on demand

Generate QR codes on demand

How to generate QR codes in a Vue app using JavaScript libraries and reusable components.

JavaScript Vue May 29
Breathwork

Breathwork

A short note on breathwork as a simple habit for regulating stress and attention.

Mindfulness May 25
OpenAI - Integrate to Vue front-end

OpenAI - Integrate to Vue front-end

How to call OpenAI from a Vue frontend through a cloud function instead of exposing secrets in th...

Vue AI Tools May 24
Excel Exports - Vue + Firebase solution

Excel Exports - Vue + Firebase solution

How to generate CSV exports from Vue and Firebase using a cloud function.

Vue Firebase May 22
Equality of Sets

Equality of Sets

A Dart note on why set equality may not behave the way you expect.

Dart May 19
Sets And Duplicates

Sets And Duplicates

A small Dart trick for removing duplicates from collections with sets.

Dart May 17
50 days of meditation

50 days of meditation

Notes from building a 50-day meditation habit and what changed once the novelty wore off.

Mindfulness Jul 05
E-reader or physical books?

E-reader or physical books?

A comparison of e-readers and physical books, with notes on convenience, focus, and reading habits.

Books Jul 01
Essential Hotkeys

Essential Hotkeys

A practical list of keyboard shortcuts that save time once they become muscle memory.

Productivity Jun 28
Dynamic map with Mapbox and Google Sheets

Dynamic map with Mapbox and Google Sheets

How to render Google Sheets data on a Mapbox map using a cached backend flow to avoid CORS and ru...

JavaScript Jun 24
3 Books for Productivity

3 Books for Productivity

Three productivity books that were actually useful, plus what stuck after reading them.

Productivity Books Jun 21
Digital Minimalism - Part 2: Desktop

Digital Minimalism - Part 2: Desktop

Desktop rules and habits that helped me keep files, browser tabs, and visual clutter under control.

Digital minimalism Jun 17
Primitive Risk Analysis

Primitive Risk Analysis

A simple risk-analysis method for making decisions under uncertainty.

Productivity Jun 14
My Portable Office Setup

My Portable Office Setup

The portable work setup I use to stay productive without carrying half an electronics store.

Productivity Digital minimalism Jun 10
Staying motivated while learning to code

Staying motivated while learning to code

Tools and habits that helped me stay consistent while learning to code, without pretending motiva...

Motivation Jun 07
JAMstack forms with Netlify

JAMstack forms with Netlify

How to add a small form to a static site using Netlify Forms without building a backend.

Deployment Jun 03
Digital minimalism - Part 1: Images

Digital minimalism - Part 1: Images

How I organized an image library to reduce clutter and make old photos easier to find.

Digital minimalism May 31
VSCode Extensions: Visuals

VSCode Extensions: Visuals

Visual VSCode extensions that make the editor easier to use without turning it into a casino.

Productivity May 27
Hosting a Jekyll site on Netlify

Hosting a Jekyll site on Netlify

How to deploy a Jekyll blog with GitHub and Netlify for a simple automated static-site workflow.

Jekyll Deployment May 24
Getting started with Jekyll

Getting started with Jekyll

A beginner-friendly walkthrough for creating a static blog with Jekyll, Liquid, Markdown, and sim...

Jekyll May 20