The Curious Engineer

All blogs / JavaScript / TypeScript

Jake Worth

jakeworth.com

Recent content on Jake Worth

JavaScript / TypeScriptDev tools / editors / IDEsSoftware / engineering practice

’05’10’15’20’25
Posts
489 from 1 Jan 2001 to 29 Oct 2026
Posting
weekly (134 in the last year)
Kind
personal blog
Feed
https://www.jakeworth.com/index.xml

2026 116

  1. Dash for Pairing
  2. Make Videos Play at Any Speed
  3. Disabling Paste Doesn't Prevent Text Entry
  4. Gradle Test Continuous
  5. Dropping Images into Keynote
  6. Thoughts on Microsoft Teams
  7. Sudo is "Superuser Do"
  8. Reloading Zsh
  9. Inspect Node Scripts With npm run
  10. Node Evaluate String
  11. The Black Box Resists Expertise
  12. Comma Operator Return in JavaScript
  13. Recovering from a Software Engineering Mistake
  14. Writing Math.max in JavaScript
  15. On "Invisible" Software Engineers
  16. JavaScripting on main()
  17. AI Policy
  18. Enable Markdown Syntax Highlighting in Fenced Code Blocks
  19. What blog posts influenced your thinking the most?
  20. How To Get an Interview When You Don't Know Anybody
  21. Simplified Technical English in my Writing
  22. toString can be set in JavaScript
  23. Read Node's Process Versions
  24. JavaScript Reflection Preserves Comments
  25. Call a Git Hook on Demand
  26. Building a Pitchfork-Style Loading Skeleton
  27. Link to Local Package With npm link
  28. tsc watch script
  29. Read lpr Configuration
  30. Hugo Markdown-Reading Shortcode
  31. Don't Use npm init on an Existing Project
  32. Favorite TypeScript Learnings from TypeNotes
  33. Open Source Icons via Lucite
  34. Open Vim Readonly
  35. If/Else in CSS
  36. Modular CSS Classes and Elements
  37. The Power of One Test
  38. Inspecting Symlink with readlink
  39. Remembering the Percent as Wildcard
  40. Ripgrep files with matches
  41. Vim view all your maps
  42. Saving TSX's Evaluated Commands to File
  43. Writing Prose with Vale
  44. tsx, a REPL for TypeScript
  45. Enumerate on promise resolved
  46. Opaque IDs, editable titles in TIL URLs
  47. 4321 is Astro
  48. Node's Timeout _destroyed Private Method
  49. Uncheck Buttons With JavaScript
  50. JavaScript Reflection with toString
  51. Focus a JS Test
  52. JSDoc Deprecations in TypeScript
  53. Unknown Value in Brackets
  54. NPM List Packages
  55. Rust Erroring Code Visual Aid
  56. Resized Images in Hugo Markdown
  57. Unalias an Alias
  58. Vim Scriptout and Scriptin
  59. Concatenate Non-Printing Characters
  60. Vite Hot Module Replacement
  61. Prettier in Fenced Code Blocks
  62. TypeScript Type-Only Imports and Exports
  63. Non-Null With Root Import
  64. Genuinely Care
  65. 5173 is Vite
  66. Cursor on Current Directory
  67. The Outbox Pattern
  68. Leave a Trace
  69. Node REPL, No Preview
  70. NVM Install and Use Latest LTS
  71. You Learn a Codebase by Changing It
  72. Avoid Hasty Caching
  73. Law of Demeter Origin Story
  74. Filled Emoji With CSS
  75. JavaScript Wraparound Index
  76. JavaScript String Concatenation
  77. JavaScript Spread a String Into An Array
  78. JavaScript Array Join Comma Default Separator
  79. JavaScript Bitwise AND
  80. Become a Product-First Software Engineer
  81. Vim :Tutor Command
  82. On commenting and approving pull requests
  83. Incremental Dependency Upgrades
  84. Dependencies Go Forward
  85. Catastrophic Mistakes Are a Team Failure
  86. CI/CD and Engineer Morale
  87. Validate a Container With Docker Ls
  88. Tradeoffs of Permanently Forking a Library
  89. How to Get Better at Guitar
  90. A Missing README Isn't a Missing README
  91. Ease Into CI Rigor With Globs
  92. Overwrite vs. Append
  93. Better Developer Experience With Friday Reboots
  94. How I Run a Fully-Remote Software Engineering Standup
  95. Git Apply Diff
  96. How I Read 44 Books Last Year
  97. Docker Service Healthy
  98. Docker Compose Override
  99. Favorite Ideas from "It Doesn't Have to Be Crazy at Work"
  100. Installing Vim on a Remote Server
  101. Initialize With npm init
  102. "What's Wrong With This Idea?"
  103. Gibibyte is Not a Gigabyte
  104. MySQL Binlogs
  105. Recognizing ASCII
  106. Who Owns This Program?
  107. Things I Check Before Opening a PR
  108. Why sleep Is Risky in Production Code
  109. How to Unabstract an Abstraction
  110. Writing the DOM with fs
  111. Git Porcelain and Plumbing 🚽
  112. Building with MCP, for Real
  113. Learning to Program in 2026
  114. Things I Don't Know, As of 2026
  115. Calculating With Bc
  116. Getting It Right the First Time

2025 60

  1. Rebuilds on Write With Nodemon
  2. MCP Stdio and Stdout
  3. tsc watch
  4. Observable Exceptions That Don't Crash
  5. npmrc "engine-strict"
  6. Hello World from MCP!
  7. Input Redirection Operator
  8. Tmux Toggle Sessions
  9. Disable DRF Browsable API
  10. Import React and React 17 JSX Transform
  11. Running Great Refinement Meetings
  12. Docker Build No Cache
  13. Timestamped Branch
  14. Why Keep Binaries Out of Version Control
  15. Set -euo pipefail
  16. User Manual
  17. Django Routing 101
  18. Tail Docker Logs
  19. MySQL Vertical Result
  20. Prioritization for Engineers: Rank Every Work List
  21. Acceptance Criteria That Actually Work
  22. Get Better at Debugging by Making Predictions
  23. Docker Compose Watch
  24. Raise the "I'm Stuck" Flag
  25. Debugging Is a Story
  26. Learning JavaScript Promises the Feynman Way
  27. "Don't Stay Stuck" Digital Guide Launch
  28. A Talk on Twelve Factors
  29. Git Apply a Commit in Reverse
  30. Origin of the Term Cherry MX
  31. Origin of ActiveRecord
  32. Editing in Nodes REPL Editor
  33. Vim Mappings Verbose
  34. Example.com in Your Data
  35. Har Files in Chrome
  36. A Kaizen for Knowledge Work
  37. Generate the Data. Worry Later.
  38. Custom Ipsum for Real-World Testing
  39. Banishing "Random" for Better Software Communication
  40. Why I'm Writing to You
  41. Unpacking MessagePack
  42. Directories Ending in .d
  43. Four Things I've Changed My Mind About in Engineering
  44. Python String Interpolation
  45. Light Bulb Series Encoding
  46. Vim Jump to Previous Occurrence
  47. Print Python Function Definition With Getsource
  48. Python REPL Help
  49. How I Approach Feature Requests
  50. How to Start a Standup in Jira
  51. Don't Guess
  52. Your Software Is Confusing
  53. Why I'm "All In" on TypeScript
  54. Kill MacOS Processes by Name
  55. pbcopy, no cat
  56. Pause Script Execution in Chrome
  57. Two-Follow-Up Rule for Closing Support and Internal Tickets
  58. It's Tradeoffs All the Way Down
  59. "I Don't Understand" Debugging
  60. Lessons from Running a Tech Meetup for 10 Years

2024 33

  1. My Annual Review 2024
  2. Hard-Won Software Development Habits
  3. Ship Earlier to Learn What Matters
  4. Being the Third Engineer
  5. Getting Comfortable With Discomfort in Software Engineering
  6. Decoupling Design From Engineering
  7. The Secret to Being a 10x Engineer
  8. Either/Or Props in TypeScript
  9. Encoding Plus Signs in URLS
  10. Load a Dependency in the Node REPL
  11. Filtering By Identity
  12. Find Every Debugging Trail Marker
  13. How I Review Code, Part 2
  14. Show How A File Is Ignored In Git
  15. Block a URL in Chrome DevTools
  16. Reading a Button's Value on Submit
  17. Read Zsh Builtin Manual Pages
  18. Autofocus a Form Field
  19. RDS Breaks My Radio Clock
  20. Understanding Scrollbar Visibility
  21. Re-render Child Component By Changing Key
  22. Inferred Controller Parameters
  23. Assert About Response Body in RSpec Controller Tests
  24. Conditional Props
  25. Join React Components With Comma
  26. Append to a Write-Protected File
  27. Ignore Whitespace in a GitHub Pull Request
  28. Link to Headers in GitHub READMEs
  29. Filter Network Requests By Status Code in DevTools
  30. How to Deliver Code Every Day
  31. XCode Run Hotkey
  32. Practical Ways to 'Learn in Public' Now
  33. Reflections on Ten Years Professionally Programming

2023 32

  1. My Annual Review 2023
  2. Link Externally With React Router's Link
  3. Create a File With `cat`
  4. TypeScript Union Type From Array
  5. Master the Fundamentals First
  6. Change Timezone in Chrome DevTools
  7. "What Would Finishing This Today Look Like?"
  8. Absence Of Color Is Better Than the Wrong Color
  9. Product Technique: Asking 'What's the Why?'
  10. Write Boring Code
  11. Take the Big Project
  12. Thinking of Bugs in Classes
  13. Why Great PRs Are Great: Pull Requests Templates
  14. Don't Ask for Advice; Ask for a Code Review
  15. From Booleans to Strings in Frontend State
  16. The Case Against "Try This" Debugging
  17. Absolute Imports in TypeScript and React: A Practical Guide
  18. My Daily Programming Routine as a Senior Software Engineer
  19. Install SVGO With Reasonable Defaults, Part Two
  20. Variable Name Antipatterns Named and Explained
  21. Cold Water for Your Code Coverage
  22. Making Sense of Code Coverage
  23. Does ChatGPT Mean Software Engineering Is Over?
  24. Apply a Conditional Border Without Moving Element
  25. Apply a Patch in Reverse
  26. Install SVGO With Reasonable Defaults
  27. One-Sentence Summaries of Popular Technology Books
  28. How to Run an Agile Retrospective for Leaders
  29. Override Autojump's Directory Rankings
  30. Type Your TypeScript Library Functions
  31. Sorting Numbers with JavaScript's sort Function
  32. The Power of CRUD Operations Explained with SQL

2022 93

  1. How to Create a Timer or Polling in React with setInterval
  2. Build a Sentence from a JavaScript Array
  3. Zoom and Scroll in Figma
  4. My Feature Writing Template: Given/When/Then
  5. Button, Link, or Neither? Three Principles for Clarity and Accessibility
  6. All My Best Tips For Expertly Reviewing Your Own Code
  7. Deliver a Great Standup Report as an Engineer
  8. How to Write a Resume for Transitioning to Programming
  9. Solving Exercism's Resistor Color Trio in TypeScript
  10. Vim Scratchpad Part 2
  11. Buy the Best Hardware You Can
  12. Solving Exercism's Resistor Color Duo in TypeScript
  13. Print Last Exit Code
  14. You Can't Change Nothing
  15. Read the Docs
  16. The Factory Pattern, Explained in Ruby
  17. Default to Programming Convention
  18. Recommended Reading
  19. How to Introduce New Ideas
  20. Computers Can Be Understood
  21. Source Tmux Config
  22. Tmux Copy Mode
  23. Vim Scratchpad
  24. Improve Your API Documentation Workflow with Dash
  25. Prefer Real Data For Software Development
  26. How Luck Played a Role in my Career
  27. All My Best Debugging Tips
  28. Preserve Whitespace in CSS
  29. Tmux Application Startup Script
  30. Recognizing and Repairing a Broken Mental Model
  31. Retros Need Action Items
  32. Better Than 'foo'
  33. Database Migration Checklist
  34. Logging an Object in JavaScript
  35. Why Ruby?
  36. What Are the Tradeoffs of Passing Objects as React Props?
  37. Naive Implementation: The Art of Artless Programming
  38. Validate CircleCI Configuration Locally
  39. Force ASDF Reshim
  40. Authentication vs. Authorization
  41. Spell Checking with Vim: Tutorial and Best Practices
  42. Select First Spell Suggestion
  43. Hide Bookmarks Bar in Chrome
  44. How to Write a Perfect Bug Report (With Template)
  45. Make a Prediction
  46. Desire Paths in Software
  47. Spend More Time Thinking Hard
  48. PostgreSQL Polymorphism
  49. Goodbye Shared Dotfiles
  50. Organizing React Components
  51. On Starting Over
  52. How to Identify the Breaking Commit With Git Bisect
  53. Commit Part of a File in Git
  54. You Have to Get Fast to Get Good at Programming
  55. Only One Way Out of a Function
  56. Am I Too Old to Become a Programmer?
  57. It's Harder to Read Code Than Write It
  58. The Problems With Code Screenshots
  59. Hash Fetch Instead of If/Else
  60. First Get It Working, Then Make it Look Good
  61. My psql Config
  62. Solved! How to Exit Vim "Ex" Mode
  63. How to Read a Stack Trace
  64. RSpec.describe vs. describe: Which Should I Use?
  65. Your Demo Doesn't Need Auth
  66. How Urgent Is This Bug?
  67. Debugging Tip: Learning From Bugs
  68. How to Make Renames Easy
  69. How to Read Postgres Docs
  70. Ctags Dotfiles
  71. Stop Studying, Start Building
  72. Which Operating System Is the Best for Programming?
  73. Autoformat Your Code
  74. How I Review Code
  75. How I Make Sure I Understand a Feature Before Building
  76. Don't Stay Stuck
  77. Why Vim
  78. On Disabling Tests
  79. Before You Abort, Count to Ten
  80. Avoid Similar Variable Names
  81. Refining Your Terminal Aliases
  82. Ruby's Frozen String Literal Comment: YAGNI
  83. Why I Don't Point Agile Bug Tickets
  84. Weekly Summary Technique for Software Engineers
  85. Opt Into Beta
  86. How to Find a Programming Mentor
  87. Use a Dev Email
  88. How to Answer Questions on Stack Overflow
  89. Want Better Automated Tests? Hard-Code Your Expectations
  90. Presence is Boolean
  91. Jump to N Percent of a File
  92. Be a Better Technical Consultant by Saying "I Think That..."
  93. Bug Reports Are Gold

2021 50

  1. Find Stale Gems
  2. Save Size Change to iTerm Profile
  3. Man pages in Vim
  4. Why Is It Called PostgreSQL?
  5. Ignore Rubocop Block Length Lint in RSpec
  6. Object ID
  7. Autojump and Open
  8. Force with Lease
  9. `group_by` with default
  10. Jira Actions Menu
  11. Why Getting Good Solves Most Career Problems
  12. Turn off Autoformatter for New Features
  13. App Store Delays
  14. Clear iOS Mobile Dependencies
  15. Clear React Router's Location State
  16. How to Organize JavaScript Imports
  17. Write Better Code by Knowing When Not To Refactor
  18. Scroll on XCode Simulator
  19. Highlighted Routes Searching
  20. The Tutorial Anti-Pattern
  21. React Native Shake
  22. TestFlight Downloads Latest Build
  23. fields_for exclude ID
  24. Use Display None
  25. Consultancy Cycles
  26. Edit in Pry
  27. Command Line Subshell
  28. Hash Equality
  29. Show Proc Source Location
  30. Chrome SameSite Updates
  31. Chrome Flags
  32. Date Input Tag
  33. Override Vim's Filetype
  34. Steps Within Steps
  35. Directional Commands
  36. Finding Getters
  37. MD5 File Signatures
  38. Printing with lpr
  39. Reverse a String
  40. Run Previous Command
  41. Screen Flashing in OSX
  42. Send Processes to the Background
  43. Start Postgres.app from the Command Line
  44. Watch That Program
  45. ExtractRSpecLet
  46. Upgrade Rubygems
  47. Reset a Gem
  48. What is the Sub Claim of a JSON Web Token?
  49. Augmenting an Object With the Proxy Pattern
  50. Do the Hard Things First

2020 8

  1. Exercism Raindrops in Python
  2. Programming Resources for Beginners
  3. My Annotated Vim Configuration File
  4. Essays on Programming I Think About a Lot
  5. My Development Roadmap
  6. You Have New Mail
  7. Duplicate your Development Branch for QA
  8. How I Clean Up JavaScript Dependencies

2019 5

  1. My Annual Review 2019
  2. Technologist Reading List
  3. A Short Introduction to Test-Driven-Development (TDD)
  4. Pangram in TypeScript
  5. Semicolon Breaks Everything

2018 5

  1. Ignore Ripgrep Ignore
  2. Pipe to pbcopy
  3. JavaScript Equality
  4. A Git Workflow to Keep Branches Current and PRs Clean
  5. Comprehensive Instructions

2017 8

  1. The Universal Programming Language
  2. How I Talk: My Guide to Tech Public Speaking
  3. "It's done"
  4. Don't Build Every Feature
  5. Work Small
  6. What We Learned Porting a Rails App to Phoenix
  7. You Should Blog
  8. Reset an Ecto Heroku Postgres Database

2016 27

  1. Open Every Site in a Chrome Bookmarks Folder
  2. Vim Nonrecursive Mappings
  3. Porting TIL from Rails to Phoenix: Initial Commits
  4. Vim Regex Word Boundaries
  5. Learn to Test
  6. Why Elixir?
  7. Writing Elixir Sigils
  8. How and Why to Squash Your Pull Request
  9. Recreating Elixir's Enum.sum
  10. Server Side Sorting in Ruby
  11. Keyword, Match, and Region in VimScript
  12. Delete Remote Git Tags
  13. From One End to the Other in Ruby
  14. Vim Buffer Problem
  15. Git Log With Authors
  16. Count Links in a Markdown File
  17. Query the Size of Postgres Array
  18. PostgreSQL Empty Array as Default Value
  19. Variable Hoisting in Ruby
  20. Get help with Pathogen
  21. Generate a Rails Secret Key
  22. Show Model and Grep with Pry-rails
  23. Set a Default Scope
  24. Change Inner Tag Block
  25. Succeed, Precede, and Surround in Haml
  26. Increment and Decrement Numbers
  27. Expect a Case-Insensitive Match

2015 46

  1. Testing Edit Forms
  2. Delete a Line From Another Line
  3. Ruby's Kernel::abort
  4. Cleanup PostgreSQL Databases
  5. Accessor Performance Gap
  6. The Alpha Commit
  7. Rails restore_attributes
  8. Explore Buffers with BufExplorer
  9. Rails destroy
  10. Git Log since
  11. Fetch Your Environmental Variables
  12. Seeding Golang's Rand
  13. Build URLs with Window Location
  14. Postgres Unlogged
  15. Go iota
  16. Ruby Regex Literal
  17. Building a Markov-Chain MVP in Ruby
  18. Prepare / Execute
  19. Psql Connect
  20. Terminate Database Connections
  21. Keyword Precedence
  22. Skid Keywords
  23. Change Column Null
  24. Classify and Constantize
  25. Find Or Create By With Block
  26. Edit the Current File Always
  27. Multipurpose Environmental Variables
  28. Puts Multiple Lines
  29. Truthy Strings
  30. Find and Replace Across Files
  31. Minmax
  32. Call a Vimscript Method in Vim
  33. Case Insensitive Matchers
  34. Current Value of a Setting
  35. Jump to the First Non-Blank Character
  36. Redirect a Path
  37. Bypass Basic Auth
  38. Git Snapshot
  39. Close a File
  40. Sort Alphabetically
  41. Parameters Filtering
  42. Modify Attribute on Set
  43. Undo a Git Mistake
  44. Delete Comments
  45. Less Help
  46. The N + 1 Problem

2014 3

  1. How Rails Action Name Works
  2. Ruby Symbol#to_proc
  3. The Case for One Computer Monitor

2001 3

  1. Consulting
  2. Projects & Talks
  3. Talks