The Curious Engineer

All blogs / JavaScript / TypeScript

Thomas Hunter II

thomashunter.name

The personal website of Thomas Hunter II, Software Engineer.

JavaScript / TypeScriptLinux / UnixHardwareSecurity

Posts
321 from 1 Jul 2006 to 24 Apr 2026
Posting
monthly (11 in the last year)
Kind
personal blog
Feed
https://thomashunter.name/feed.rss

2026 6

  1. Server-Side JavaScript Arc Part 2: Oden, a Server-First JavaScript Runtime
  2. Server-Side JavaScript Arc Part 1: A Retrospective on the Golden Age of Node.js
  3. Capturing and Culling a Photo Journalist Scene
  4. Alpaka Elements Tech Case as a Camera Bag
  5. Fear and Loathing and LLMs
  6. Repairing a Bose SoundDock iPod Speaker

2025 10

  1. Timeline
  2. “Photographing Potrero Hill” is in local coffee shops
  3. Introducing RFC Hub
  4. A few months with htmx
  5. The scales are tipping in the Software Engineering industry
  6. The scales are tipping in the Software Engineering industry
  7. Notes on installing Linux on a 2008 Apple Intel iMac
  8. Post Apocalyptic Computing
  9. AI will change the world but not in the way you think
  10. Running Debian Bookworm on a 13" AMD Framework Laptop

2024 14

  1. Writing Multithreaded Node.js Applications: Is it worth it? at NodeConf EU
  2. Writing Multithreaded Node.js Applications: Is it worth it? at NodeConf EU
  3. The Ultimate Fujifilm X-E1 Camera Guide
  4. Using an iPod Classic Monochrome 4th Gen in 2024
  5. Discreet, Cheap, Film-Like EDC Street Photography Camera in 2024
  6. Map Buddy Product Retrospective
  7. My Photography is Featured at Philz Coffee in Potrero Hill
  8. Introducing GenAI in O’Reilly Answers
  9. My Photography is Featured at Ikon Coffee
  10. Photography is a Loss of Dimension, Senses, and Fidelity
  11. A Cheap and Pocketable Camera in 2024
  12. Enabling English on a Japanese Panasonic Lumix GX1
  13. After your first 10,000 Photographs
  14. Repairing a Minolta X-370 Light Leak

2023 9

  1. Getting into Photography on a Budget in 2023
  2. PS2 RPI4 Part IV: Conclusion
  3. Photos
  4. How to file a CCPA complaint against Reddit
  5. How to Delete your Reddit Account and All Data under GDPR/CCPA
  6. Welcome to your Chat Bot
  7. Emulating Windows XP on Linux in 2023
  8. How NOT to Measure Latency by Gil Tene
  9. mig: The Universal Database Migration Runner

2022 1

  1. Setting Open Graph Tags without Server Side Rendering

2021 10

  1. Detecting if a PWA/TWA is Installed
  2. Node.js Package Management at UtahJS
  3. Multithreaded JavaScript: Concurrency Beyond the Event Loop
  4. Multithreaded javascript
  5. Distributed Systems with Node.js: Humble Books Bundle
  6. GitHub Actions for Node.js Apps at DevOps.js
  7. The Death of a Node.js Process
  8. Logging, Metrics, and Tracing with Node.js at Node Congress
  9. Node.js Modules, Packages, and SemVer
  10. Zero-downtime deploys with DigitalOcean, GitHub, and Docker

2020 7

  1. Distributed systems with nodejs
  2. PS2 RPI4 Part III: Underway
  3. PS2 RPI4 Part II: Internals
  4. PS2 RPI4 Part I: Restoration
  5. Distributed Systems with Node.js: Building Enterprise-Ready Backend Services
  6. Go v1.15.8 vs Node v14.15.5 Microbenchmark
  7. Elpizia

2019 17

  1. Installing the Node.js Binary Archive on Linux
  2. The Apex Consumer
  3. Go v1.13.3 vs Node v12.12.0 Microbenchmark
  4. Cheap and Portable Writing Device in 2019
  5. Fixing the Massdrop AKG K7XX Squeak
  6. On using Service Workers with Static Content
  7. Nine Volt Daisy Chain
  8. Why should I use a Reverse Proxy if Node.js is Production-Ready?
  9. Cobalt Caliber
  10. JavaScript Symbols: But Why?
  11. Node.js Task Runners: Are they right for you?
  12. Introducing Package Diff
  13. Protecting your JavaScript APIs
  14. Treating OpenBox like a Tiling WindowManager
  15. The Increasing Need for Regulation of the Software Industry
  16. Removing gVim Right and Bottom Borders
  17. Common API mistakes and how to avoid them

2018 26

  1. On Migrating from Google Analytics
  2. Review of the iClever Foldable Bluetooth Keyboard
  3. Books I'm Reading to Become a Better Writer
  4. Compromised npm Package: event-stream
  5. 17 Pounds in 44 Days: My Adventure with Keto
  6. On Migrating from Wordpress to Static Markdown
  7. The Monster in the Basement
  8. Why you should avoid ORMs (with examples in Node.js)
  9. Essential Firefox Tweaks
  10. JavaScript Object Type Coercion
  11. JavaScript Object Property Descriptors, Proxies, and Preventing Extension
  12. Advice for Technical Public Speaking: Part 3
  13. Advice for Technical Public Speaking: Part 2
  14. Advice for Technical Public Speaking: Part 1
  15. Go v1.10.3 vs Node v10.6.0 Microbenchmark
  16. Recent Concerns about Node.js Security
  17. Node.js and Lambda Three Part Series
  18. Developing Cobalt Dungeon using Phaser and Cordova
  19. Cobalt Dungeon Dev 01: Creating a New Room
  20. Cobalt Dungeon for iOS is now available
  21. Cobalt Dungeon for Android is now available
  22. Cobalt Dungeon Dev 02: Creating a Bitmap Font for Phaser
  23. Cobalt Dungeon Dev 03: FL Studio Overview
  24. The Long Road to Async/Await in JavaScript at SF Node
  25. I'm working on a mobile game called Cobalt Dungeon
  26. Support me on Patreon

2017 24

  1. Twitter Plays Zork: @DemocraticZork
  2. Go v1.9.1 vs Node v8.9.0 Microbenchmark
  3. The Long Road to Async/Await in JavaScript at NodeConfAr17
  4. What have I been up to? Late 2017 Edition
  5. Is it time to replace REST with RPC?
  6. Enterprise Conversation Episode 14: OpenTable with Thomas Hunter
  7. Refactoring a Node.js codebase using Async/Await
  8. Random Meetup Attendee Bookmarklet
  9. 2017: A Central Europe Odyssey
  10. Redis and Node Part 4: Lua Scripting
  11. Redis and Node Part 3: Atomicity with MULTI
  12. Redis and Node Part 2: Shared State
  13. Redis and Node Part 1: The Basics
  14. Digital Nomad: Inventory Advice
  15. HTTP API Design Part 4: API Standards
  16. HTTP API Design Part 3: Bodies
  17. HTTP API Design Part 2: Responses
  18. HTTP API Design Part 1: Requests
  19. Advanced Microservices
  20. Node.js, Redis, and You! at RedisConf17
  21. Linux Mint Disable "Recently Used"
  22. Ubuntu 16.04 LTS Xen stuck on "Loading Initial Ramdisk"
  23. Service Discovery With Node.js and Consul at SF Node
  24. Online Colorscheme Configurator for i3, i3status, dmenu

2016 8

  1. A Holistic Approach to Microservices
  2. Running a Node.js process on Debian as a Systemd Service
  3. My Trip to Japan
  4. Enabling Yubikey U2F support in Linux
  5. The JavaScript Event Loop Presentation (2016 Edition)
  6. Installing Linux Mint on an XPS13 (9350)
  7. The only bad thing about ES7 Async/Await
  8. Upgrading to the XPS 13 (9350)

2015 10

  1. NextPlayer: A Node.js module for managing player turns
  2. HTML5 Mobile Apps, Part 5: Ecosystem Opinions
  3. HTML5 Mobile Apps, Part 4: Live Operations
  4. HTML5 Mobile Apps, Part 3: Distribution
  5. HTML5 Mobile Apps, Part 2: Performance
  6. HTML5 Mobile Apps, Part 1: Development and Debugging
  7. Strategic Game of Life: Mobile Edition
  8. Upgrading Linode II: Xen to KVM
  9. The long road to Async/Await in JavaScript
  10. Tips for Building Mobile Games in HTML5

2014 8

  1. Gridloche: Realtime Multiplayer Go-Like with RPG Elements
  2. Upgrading Linode
  3. Robot Onslaught: Multiplayer twin-stick 2D shooter using PubNub
  4. Arpad: An ELO Ranking System for Node.js
  5. Consumer Centric API Design
  6. Linux Kernel 3.15.3 on Linux Mint 17 (or other Debian-Based Distributions)
  7. Running a Node.js process on Debian as an init.d Service
  8. What have I been up to? Early 2014 Edition

2013 34

  1. Principles of good RESTful API Design
  2. Book Review: Debian 7: System Administration Best Practices
  3. JavaScript and Canvas version of Conway's Game of Life
  4. Letting PHP know that its connection behind NGINX is over HTTPS
  5. See which user accounts hackers try to access on your server the most
  6. Tips for assembling the O2 (Objective2) Headphone Amplifier Kit
  7. Only Push/Pull Current GIT Branch
  8. Remove OpenDNS from Linux Mint
  9. Enable Emoji fonts on Debian / Ubuntu / Mint Linux
  10. Border Patrol Saga
  11. Cheating at Cookie Clicker
  12. Recursively download website files using WGET
  13. Instant Backbone.js Application Development
  14. Book Review: Hands-on Testing with PHPUnit How-to
  15. Installing Redis on Debian as a Service
  16. Fixing Homebrew
  17. SSH into a machine with a dynamic IP
  18. Setting up a Security Camera for a Linux Webcam
  19. Track IP Address using DD-WRT + CRON + WGET
  20. Safely Parse Complex Objects and Arrays in PHP
  21. WordPress GET Variables with lighttpd
  22. The JavaScript Event Loop [Presentation]
  23. How to "Burn" an ISO to a USB drive in OS X
  24. Generate OAuth Consumer Key and Shared Secrets using PHP
  25. Set opendiff (FileMerge) as your git diff tool on OS X
  26. Lansing Startup Weekend February 2013: GeoMonsters Presentation
  27. Lansing Startup Weekend
  28. SleekMVC, my PHP Framework, gets Routing support
  29. Enable PHP Mail on OS X Mountain Lion
  30. GeoLocation based Communication with Node.js, Redis
  31. What WordPress 4.x Could Be
  32. I turned on a light
  33. Programmer Religious Wars and the Abstraction Gradient
  34. Node App Inspired by Daniel Suarez' Book Daemon

2012 82

  1. Wacom Bamboo Splash Review
  2. Subdomains and Google Apps with Gandi and Linode
  3. Client-Side Terrain Tile Representation Algorithm
  4. A Better Debian SSH Login Message
  5. Transitioning from MediaTemple to Linode
  6. Install Node.js on Debian 6
  7. Visual Git History Log in Terminal Window
  8. Using authbind with Node.js
  9. Fun Timing Game in Canvas
  10. Respond to JSON or XML requests from a Node.js API
  11. Drop Root Privileges in Node.js
  12. The Upcoming Parallel Digital Universe
  13. Could JavaScript support Parallelism like in Haskell?
  14. All Hands Active Board Member
  15. Configurable Object to XML Converter for Node.js
  16. MongoDB Node.js driver collection select doesn't require callback
  17. GitHub Connection Timed Out
  18. CouchDB and PHP Web Development
  19. Node.js Convert JSON to XML, Pluralize
  20. Backup External Music Collection using Rsync
  21. Fixing ApacheBench on OS X Lion
  22. Spaghetti Architecture and the Importance of Starting Over
  23. Review of OpenShift Node.js Support
  24. Step by Step guide to getting Cobalt Calibur running on OpenShift
  25. Raspberry Pi with Tons of Hardware
  26. Cobalt Calibur 3 Open Source
  27. Copying OpenIndiana Image onto USB in OS X
  28. My First Arduino Project
  29. Code School Review
  30. Series or Parallel Power-Source Switch
  31. Extended Pigpen Cipher to Include Numbers
  32. Auto Mount External Drives in Debian
  33. Per-User Password Hashing Algorithms
  34. Recursively Delete Files by Extension
  35. Recursively convert OGGs to MP3s
  36. Node.js GPS Module
  37. A Primer on Web Caching
  38. The Future of Augmented Reality
  39. PHP + Apache Stack vs Node.js
  40. OS X Wireless Control from the CLI
  41. Scan for Computers on Local Network with Nmap
  42. SSHing into Arch Linux Raspberry Pi
  43. Updating Pacman on the Raspberry Pi
  44. Linux CLI apps should have a --json flag
  45. Gracefully Kill Node.js App from Ctrl+C
  46. Move special OS X user folders to external drive
  47. Determine Wireless Encryption Type
  48. Express.js Pass-Through Directory
  49. Bad Mount Point Input/Output Error
  50. MacBook Pro with SSD and Hard Drive
  51. Git SSL Errors
  52. NPM SSL Errors
  53. Settling In to a New Mac
  54. Female Voice using eSpeak
  55. Know your Wireless Cards!
  56. Speech Synthesis and Bluetooth with Node.js
  57. Suppressing SSH MOTD Messages
  58. Re-Map Caps Lock key to Esc in OS X
  59. Why Android should switch to Go
  60. NERF Gun Laser Instructions
  61. Node.js Robotics Software Suite
  62. RedBubble Poor Product Quality
  63. Creating Self Executable PHP Scripts
  64. Open Sourcing Facebook App, Squirrelify
  65. Open Sourcing EVE Crawler
  66. Cobalt Calibur: Roadmap
  67. Ignore SSL Errors with NPM Node Package Manager
  68. Pitfalls when Renaming your GitHub Account
  69. Using .htaccess to Prevent www Subdomain
  70. Global gitignore vs repository gitignore
  71. Modded Laser NERF Gun
  72. Building a Really Simple Node.js Module
  73. Redirect all Pages from Old Domain to New Domain Using .htaccess
  74. Linux Force Dismount
  75. Moving Content to a new Domain and Keeping SEO
  76. Hiding Files and Folders in OS X Finder
  77. Open Source AJAX Game Engine
  78. Why Node.js is awesome: A short history of web applications
  79. Tracking Backbone.js "Page Views" with Mixpanel
  80. The Shark Fin Conjecture
  81. Why the MPAA and RIAA will soon be gone
  82. Cobalt Calibur 3.0: Node.js, MongoDB, Redis, Backbone.js

2011 19

  1. How to use javascript event bindings to make callbacks cleaner
  2. Xpath Expressions Explained
  3. Tech Startup Entrepreneur Books
  4. Force or Prevent WWW subdomain with lighttpd
  5. How to generate a Self Signed SSL Certificate for lighttpd
  6. Tumblr-like Template Syntax PHP Library
  7. Really simple SSH proxy (SOCKS5)
  8. GIT: Colored Output, Shortcut Commands, Autocompletion, and Bash Prompt
  9. Using Swipes in MacVIM in OS X
  10. Simple PHP Namespace Friendly Autoloader Class
  11. Scheduling a daily Cron task in Debian to check external IP
  12. Building Custom OS X Dashboard Widgets
  13. How to login via SSH Without a Password
  14. Delay command execution in X-Chat
  15. Submitting Multi-Dimensional Array Data to PHP
  16. lighttpd configuration to redirect subdomains
  17. MySQL REPLACE vs INSERT ON DUPLICATE KEY UPDATE
  18. Apache2 Outperforming lighttpd 1.5
  19. Installing lighttpd on Ubuntu 10.04

2010 7

  1. PHP / MySQL Web Application Migration Steps
  2. Time Differences between PHP and MySQL
  3. Dynamic Form Actions using Different Buttons
  4. Read GET URL variables using JavaScript
  5. Zend Certified Engineer (ZCE) Study Guide Links
  6. Accessing CodeIgniter Session Data using External Scripts
  7. PHP cURL cookies not saving on Windows

2009 23

  1. Convert ASCII to UTF-8 using VBA
  2. Web Spidering with PHP
  3. FL Studio Piano Roll Tutorial
  4. FL Studio Comprehensive Mixer Interface Overview
  5. Polymorphism, Abstract Classes, and Interfaces in PHP
  6. FL Studio Automations
  7. FL Studio Interface Overview
  8. Introduction to CSS: Selectors and Relationships Explained
  9. Preloading CSS Hover Images
  10. Simple AJAX
  11. Password Encryption, Hashing, Salting Explained
  12. Create Windows Vista like buttons using Photoshop
  13. Web Image Formats Size and Quality Comparison
  14. Creating Seamless Textures using Photoshop
  15. Introduction to Photoshop Blending Options
  16. CSS Image Button Rollovers
  17. CSS Box Model differences in Firefox and Internet Explorer
  18. Database Administration using phpMyAdmin
  19. Free Notepad++ Web Developers Theme
  20. Pagerank and higher search engine rankings explained
  21. Change PHP Timezones
  22. Setting up VHOSTS using XAMPP/Apache in Windows
  23. Changing MySQL Default Character Sets

2008 3

  1. Generating Password Protected ZIP Files using PHP
  2. MySQL Fulltext Search Ignored Words
  3. Data Hiding in a Word Document

2006 3

  1. PHP Navigation System using Single Entry Point
  2. Search Engine Friendly Exit Counter
  3. Clean user data using PHP and Regular Expressions