Here are my recent writings:
- 2024-11-19: Extracting text from image in macOS from the CLI
- 2024-10-30: Request and response logging in Elysia
- 2024-10-29: อัพเดตโปรเจควงแหวนเว็บ, integrate กับ Bluesky
- 2024-10-17: Enabling gzip/zstd compression in Caddy
- 2024-10-10: Using Elysia in Deno
- 2024-10-07: Running Internet Explorer 5 on Windows 98 in your browser, with internet and LAN access
- 2024-10-05: How I initialize my Bun projects
- 2024-09-29: Generating a random hex password and hashing it with Bcrypt
- 2024-09-27: Building a quick and dirty endpoint with Bun
- 2024-09-25: Major scale practice trainer
- 2024-09-17: All the fonts from CU Writer
- 2024-09-15: My notes on
.env
files - 2024-09-11: Paste image to decode QR code
- 2024-09-01: Using Elysia in Node.js
- 2024-08-31: Reverse-engineering Insta360 Link Controller WebSockets protocol
- 2024-08-28: How I structure Playwright page objects
- 2024-08-26: Reading data from OBZ Barcode Reader on the web using Web Serial API
- 2024-07-15: Configuring Open WebUI and LiteLLM with Docker Compose to talk to OpenAI, Anthropic, and Gemini APIs
- 2024-06-30: LLM กับข้อสอบ O-NET ม.6
- 2024-04-21: Drawing low resolution monochrome text with freetype-wasm
- 2024-04-20: Getting Tailwind CSS 4 (alpha 14) to run in the browser
- 2024-01-30: Auto-merging dependabot PRs
- 2024-01-29: Modifying the alpha channel of a color using CSS
- 2024-01-17: Faster PostgreSQL during development
- 2024-01-16: A data dictionary that describes itself
- 2023-09-10: A URL to a blank file on IPFS
- 2023-09-09: How to retag a Docker image on a remote registry without pulling the image to local machine
- 2023-09-08: Moving data from one PostgreSQL database to another
- 2023-08-21: Getting a long-lived access token for a Facebook page
- 2023-08-20: How to launch Chrome for Testing
- 2023-08-19: OKLCH Color Scale Plotter
- 2023-07-10: Accessing user ID in NextAuth.js with JWT session
- 2023-07-02: Making Caddy use a self-signed SSL certificate
- 2023-07-02: Setting up CORS in Caddy
- 2023-07-01: Backing up a Linux cloud server with Restic
- 2023-06-23: MongoDB in Docker: ‘Authentication Failed’ when logging in to a non-default database name
- 2023-06-18: HDR QR Code
- 2023-06-10: Using Google Cloud Service Accounts to authenticate between your own services
- 2023-05-20: ข้อความภาษาไทยใน Discord ยาวเท่าไหร่ วรรณยุกต์ถึงไม่หาย
- 2023-04-20: npm checkmark
- 2023-04-05: Port number randomizer
- 2023-04-04: Building Firebase Realtime Database Security Rules with GPT-4
- 2023-03-20: Béance tubaire volontaire
- 2023-03-20: The HustleGPT challenge
- 2023-03-10: Disappearing combining marks in Discord (ปัญหาสระกับวรรณยุกต์หาย)
- 2023-03-04: VS Code REST Client snippets
- 2023-02-27: GitOps in weird places (talk)
- 2023-02-21: Local talk internationalization
- 2023-02-21: When Maths Strike Back: Behind the 3D QR code effect in ppqr.app
- 2023-01-28:
Array.from({ length: 5 }, (_, x) => x)
- 2023-01-24: Configuring tRPC error logging in T3 apps
- 2023-01-23: StableLib snippets
- 2023-01-17: How I memorize the morse code (without deliberate practice)
- 2023-01-09: UDP hole punching in Jamulus
- 2023-01-03: อัพเดตโปรเจควงแหวนเว็บ, เปิดเพจ Facebook, Mastodon
- 2022-12-15: Adding OpenTelemetry tracing to a Next.js app with Output File Tracing enabled
- 2022-12-13: Analyzing Next.js bundle size
- 2022-12-12: Analyzing and optimizing Vite bundle size
- 2022-12-12: Adding a QR code scanner to a web app
- 2022-12-12: A logger module based on pino
- 2022-12-09: Creating encrypted directories with gocryptfs
- 2022-11-30: Runtime environment variables in Next.js
- 2022-10-29: Combining audio and video using ffmpeg
- 2022-10-11: My VS Code snippets keyboard shortcuts (keybindings)
- 2022-10-15: Adding a Desktop environment to a Debian/Ubuntu server
- 2022-10-03: Server-side source maps in Next.js
- 2022-10-02: Building CLI apps using @rushstack/ts-command-line library
- 2022-09-29: Setting up Semgrep in GitHub Actions
- 2022-09-25: Discord text chat in voice channels notifications behavior
- 2022-09-25: Minio JavaScript library snippets
- 2022-09-23: A snippet to install Docker on a Linux machine
- 2022-09-18: Making a Next.js app a PWA
- 2022-09-17: Setting default Next.js development server port
- 2022-09-14: Client-side-only components in Next.js
- 2022-09-10: A survey of JWT storage locations in client-side app SDKs
- 2022-09-09: Running Node.js app in a Docker container without building the image
- 2022-09-07: Adding Bootstrap CSS to Next.js application
- 2022-08-28: util.parseArgs snippets
- 2022-08-28: Using Google APIs in Node.js with a service account
- 2022-08-23: Docker (Colima) audio encoding CPU performance on M1 Macs
- 2022-08-23: Audio encoding benchmark with FFmpeg
- 2022-08-22: Replacing Docker Desktop on Mac with Colima
- 2022-08-18: Setting up packlets
- 2022-08-17: Google APIs frustration diagram of the day
- 2022-08-12: Setting up Flutter and Android in macOS using Homebrew
- 2022-08-10: Installing cloudflared in Codespaces
- 2022-07-28: Authenticating as a GitHub App in Octokit.js
- 2022-07-27: Observations from using Node.js worker_threads with ESM
- 2022-07-27: Fastify-in-Express
- 2022-07-27: Cloning private GitHub projects onto a new worker Linux box.
- 2022-07-19: Run an X11 display server and noVNC on Codespaces
- 2022-07-18: Installing Google Chrome on Codespaces (and also chromedriver)
- 2022-07-16: Fixing SvelteKit problem not able to require pure-ES module packages
- 2022-07-14: Codespaces-like development container setup
- 2022-07-10: Example Firebase ID Tokens
- 2022-07-07: Projecting 2D elements onto a photo using matrix3d, 2022 edition
- 2022-07-06: Verifying Firebase ID tokens in Node.js without Firebase Admin SDK
- 2022-07-04: GitHub Actions: Push commit as GitHub App
- 2022-06-21: Testing that PWAs work offline using Playwright
- 2022-06-18: Bitwise operations ในภาษา javascript
- 2022-06-18: ตัดคำภาษาไทยใน Node.js (หรือใน Browser)
- 2022-06-17: Quickly publish a Markdown page without build tool
- 2022-06-10: BarCamp Bangkhen Blog Coverage
- 2022-06-06: Watching livestreams together in a synchronized manner
- 2022-06-06: Pointer events tester
- 2022-06-06: Hacking Surface Pen’s eraser support into Excalidraw
- 2022-06-05: GitHub Actions workflow to save files to Linode Object Storage
- 2022-05-25: How to make authenticated API calls to Google Cloud Function (2nd generation) or Google Cloud Run services from Cloudflare Workers (or other non-Node.js JavaScipt runtimes)
- 2022-05-24: Creating types and values with the same name in TypeScript
- 2022-04-28: Simple front-end feature flags
- 2022-04-15: CircleCI dummy (no-op) config
- 2022-04-06: Short-lived mutability
- 2022-04-04: Yarn PnP set up
- 2022-04-02: Using yargs in ESM Node.js scripts
- 2022-04-01: Setting up Jest in ESM projects
- 2022-03-31: jose (JWT) in Node.js cookbook
- 2022-02-24: Music I use to concentrate
- 2022-02-15: Disabling an App Engine service without also disabling Firestore
- 2022-02-04: TIL: pgrep and pkill
- 2022-02-01: Running smoke tests on Vercel deployments using GitHub Actions
- 2022-01-30: อัพเดตโปรเจควงแหวนเว็บ, เพิ่ม RSS feed
- 2022-01-26: Notes about React 18 RC.0
- 2022-01-13: เจอโปรเจค microCOVID บน GitHub
- 2021-12-24: Advent of Code 2021: Day 24
- 2021-12-06: Book Review: Bridging the Communication Gap: Specification by Example and Agile Acceptance Testing
- 2021-12-06: A GitHub Actions workflow to generate Git patches for auto-fixable issues
- 2021-11-11: Reloading content script without reloading the extension when developing Chrome extensions
- 2021-11-07: PlanetScale เป็นบริการ MySQL-compatible serverless database
- 2021-09-20: Proof-of-concept: Web based Jamulus client
- 2021-09-19: Jamulus protocol study notes
- 2021-07-06: Dealing with TypeScript’s strictness
- 2021-05-30: ปริภูมิสี LCH (color space)
- 2021-02-05: Time to buy a new Mac?
- 2021-01-22: Using async functions with chrome.runtime.onMessage
- 2021-01-20: Copy to Clipboard (pbcopy) for Windows and WSL
- 2021-01-09: A local file storage for the web and interopearability layer for web-based apps
- 2021-01-06: Freshly-baked apps every midnight
- 2021-01-03: Using macOS's dashes and smart quotes shortcuts in Windows
- 2021-01-01: ว่าด้วยเรื่องการทำ Side-project ให้เสร็จ
- 2020-12-29: Let’s deploy the simplest URL redirection service to Netlify!
- 2020-12-26: Ruby code-golfing tricks
- 2020-12-22: Solving problems by adding code from left to right in Ruby
- 2020-12-22: Counters in Ruby
- 2020-12-18: Solving problems by adding code from left to right in Ruby
- 2020-12-13: Do not cache faulty responses in your service worker
- 2020-12-11: Adding some interactivity to my notes
- 2020-12-08: Flickergate
- 2020-11-25: JavaScript powered by TypeScript (project Salsa)
- 2020-11-21: Setting up a reverse proxy using Caddy
- 2020-11-17: Capturing screenshots of translucent windows with shadows in Windows
- 2020-11-14: Interactive footnotes
- 2020-11-12: Vanity Ed25519 SSH public keys
- 2020-11-08: VS Code as a Markdown-based note-taking platform?
- 2020-11-04: On state management tools in React
- 2020-11-02: Quickly protecting an Express HTTP server with GitHub authentication via Auth0
- 2020-10-30: Generating SAS for Azure Blob Storage
- 2020-10-15: EdDSA JWT Ed25519 Node.js
- 2020-10-14: Building a personal but multi-tenant web page screenshotting service with Puppeteer and Vercel
- 2020-10-14: Array#filter type narrowing
- 2020-10-13: Apparently perfumed alcohol sprays are a thing…
- 2020-10-03: On learning GitHub Actions
- 2020-09-20: The
<blurhash-image>
Web Component - 2020-06-12: Ways to render Markdown in React
- 2020-06-12: Context provider pattern in React
- 2020-06-09: Using multiple refs in React
- 2020-05-02: การเลือกใช้ระหว่าง Vue กับ React (May 2020)
- 2020-04-11: Test infrastructure ของโครงการ TypeScript
- 2019-08-03: ว่าด้วยเรื่องการใช้โจทย์อัลกอริธึมในการสัมภาษณ์งาน
- 2018-12-28: “มีมาตรวัดอะไรที่บอกว่าโปรแกรมเมอร์คนไหน ‘โค้ดได้’ หรือ ‘โค้ดเป็น’”
- 2018-08-28: Gitthereum