All blogs / JavaScript / TypeScript
Jake Worth
Recent content on Jake Worth
JavaScript / TypeScriptDev tools / editors / IDEsSoftware / engineering practice
- 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
- Dash for Pairing
- Make Videos Play at Any Speed
- Disabling Paste Doesn't Prevent Text Entry
- Gradle Test Continuous
- Dropping Images into Keynote
- Thoughts on Microsoft Teams
- Sudo is "Superuser Do"
- Reloading Zsh
- Inspect Node Scripts With npm run
- Node Evaluate String
- The Black Box Resists Expertise
- Comma Operator Return in JavaScript
- Recovering from a Software Engineering Mistake
- Writing Math.max in JavaScript
- On "Invisible" Software Engineers
- JavaScripting on main()
- AI Policy
- Enable Markdown Syntax Highlighting in Fenced Code Blocks
- What blog posts influenced your thinking the most?
- How To Get an Interview When You Don't Know Anybody
- Simplified Technical English in my Writing
- toString can be set in JavaScript
- Read Node's Process Versions
- JavaScript Reflection Preserves Comments
- Call a Git Hook on Demand
- Building a Pitchfork-Style Loading Skeleton
- Link to Local Package With npm link
- tsc watch script
- Read lpr Configuration
- Hugo Markdown-Reading Shortcode
- Don't Use npm init on an Existing Project
- Favorite TypeScript Learnings from TypeNotes
- Open Source Icons via Lucite
- Open Vim Readonly
- If/Else in CSS
- Modular CSS Classes and Elements
- The Power of One Test
- Inspecting Symlink with readlink
- Remembering the Percent as Wildcard
- Ripgrep files with matches
- Vim view all your maps
- Saving TSX's Evaluated Commands to File
- Writing Prose with Vale
- tsx, a REPL for TypeScript
- Enumerate on promise resolved
- Opaque IDs, editable titles in TIL URLs
- 4321 is Astro
- Node's Timeout _destroyed Private Method
- Uncheck Buttons With JavaScript
- JavaScript Reflection with toString
- Focus a JS Test
- JSDoc Deprecations in TypeScript
- Unknown Value in Brackets
- NPM List Packages
- Rust Erroring Code Visual Aid
- Resized Images in Hugo Markdown
- Unalias an Alias
- Vim Scriptout and Scriptin
- Concatenate Non-Printing Characters
- Vite Hot Module Replacement
- Prettier in Fenced Code Blocks
- TypeScript Type-Only Imports and Exports
- Non-Null With Root Import
- Genuinely Care
- 5173 is Vite
- Cursor on Current Directory
- The Outbox Pattern
- Leave a Trace
- Node REPL, No Preview
- NVM Install and Use Latest LTS
- You Learn a Codebase by Changing It
- Avoid Hasty Caching
- Law of Demeter Origin Story
- Filled Emoji With CSS
- JavaScript Wraparound Index
- JavaScript String Concatenation
- JavaScript Spread a String Into An Array
- JavaScript Array Join Comma Default Separator
- JavaScript Bitwise AND
- Become a Product-First Software Engineer
- Vim :Tutor Command
- On commenting and approving pull requests
- Incremental Dependency Upgrades
- Dependencies Go Forward
- Catastrophic Mistakes Are a Team Failure
- CI/CD and Engineer Morale
- Validate a Container With Docker Ls
- Tradeoffs of Permanently Forking a Library
- How to Get Better at Guitar
- A Missing README Isn't a Missing README
- Ease Into CI Rigor With Globs
- Overwrite vs. Append
- Better Developer Experience With Friday Reboots
- How I Run a Fully-Remote Software Engineering Standup
- Git Apply Diff
- How I Read 44 Books Last Year
- Docker Service Healthy
- Docker Compose Override
- Favorite Ideas from "It Doesn't Have to Be Crazy at Work"
- Installing Vim on a Remote Server
- Initialize With npm init
- "What's Wrong With This Idea?"
- Gibibyte is Not a Gigabyte
- MySQL Binlogs
- Recognizing ASCII
- Who Owns This Program?
- Things I Check Before Opening a PR
- Why sleep Is Risky in Production Code
- How to Unabstract an Abstraction
- Writing the DOM with fs
- Git Porcelain and Plumbing 🚽
- Building with MCP, for Real
- Learning to Program in 2026
- Things I Don't Know, As of 2026
- Calculating With Bc
- Getting It Right the First Time
2025 60
- Rebuilds on Write With Nodemon
- MCP Stdio and Stdout
- tsc watch
- Observable Exceptions That Don't Crash
- npmrc "engine-strict"
- Hello World from MCP!
- Input Redirection Operator
- Tmux Toggle Sessions
- Disable DRF Browsable API
- Import React and React 17 JSX Transform
- Running Great Refinement Meetings
- Docker Build No Cache
- Timestamped Branch
- Why Keep Binaries Out of Version Control
- Set -euo pipefail
- User Manual
- Django Routing 101
- Tail Docker Logs
- MySQL Vertical Result
- Prioritization for Engineers: Rank Every Work List
- Acceptance Criteria That Actually Work
- Get Better at Debugging by Making Predictions
- Docker Compose Watch
- Raise the "I'm Stuck" Flag
- Debugging Is a Story
- Learning JavaScript Promises the Feynman Way
- "Don't Stay Stuck" Digital Guide Launch
- A Talk on Twelve Factors
- Git Apply a Commit in Reverse
- Origin of the Term Cherry MX
- Origin of ActiveRecord
- Editing in Nodes REPL Editor
- Vim Mappings Verbose
- Example.com in Your Data
- Har Files in Chrome
- A Kaizen for Knowledge Work
- Generate the Data. Worry Later.
- Custom Ipsum for Real-World Testing
- Banishing "Random" for Better Software Communication
- Why I'm Writing to You
- Unpacking MessagePack
- Directories Ending in .d
- Four Things I've Changed My Mind About in Engineering
- Python String Interpolation
- Light Bulb Series Encoding
- Vim Jump to Previous Occurrence
- Print Python Function Definition With Getsource
- Python REPL Help
- How I Approach Feature Requests
- How to Start a Standup in Jira
- Don't Guess
- Your Software Is Confusing
- Why I'm "All In" on TypeScript
- Kill MacOS Processes by Name
- pbcopy, no cat
- Pause Script Execution in Chrome
- Two-Follow-Up Rule for Closing Support and Internal Tickets
- It's Tradeoffs All the Way Down
- "I Don't Understand" Debugging
- Lessons from Running a Tech Meetup for 10 Years
2024 33
- My Annual Review 2024
- Hard-Won Software Development Habits
- Ship Earlier to Learn What Matters
- Being the Third Engineer
- Getting Comfortable With Discomfort in Software Engineering
- Decoupling Design From Engineering
- The Secret to Being a 10x Engineer
- Either/Or Props in TypeScript
- Encoding Plus Signs in URLS
- Load a Dependency in the Node REPL
- Filtering By Identity
- Find Every Debugging Trail Marker
- How I Review Code, Part 2
- Show How A File Is Ignored In Git
- Block a URL in Chrome DevTools
- Reading a Button's Value on Submit
- Read Zsh Builtin Manual Pages
- Autofocus a Form Field
- RDS Breaks My Radio Clock
- Understanding Scrollbar Visibility
- Re-render Child Component By Changing Key
- Inferred Controller Parameters
- Assert About Response Body in RSpec Controller Tests
- Conditional Props
- Join React Components With Comma
- Append to a Write-Protected File
- Ignore Whitespace in a GitHub Pull Request
- Link to Headers in GitHub READMEs
- Filter Network Requests By Status Code in DevTools
- How to Deliver Code Every Day
- XCode Run Hotkey
- Practical Ways to 'Learn in Public' Now
- Reflections on Ten Years Professionally Programming
2023 32
- My Annual Review 2023
- Link Externally With React Router's Link
- Create a File With `cat`
- TypeScript Union Type From Array
- Master the Fundamentals First
- Change Timezone in Chrome DevTools
- "What Would Finishing This Today Look Like?"
- Absence Of Color Is Better Than the Wrong Color
- Product Technique: Asking 'What's the Why?'
- Write Boring Code
- Take the Big Project
- Thinking of Bugs in Classes
- Why Great PRs Are Great: Pull Requests Templates
- Don't Ask for Advice; Ask for a Code Review
- From Booleans to Strings in Frontend State
- The Case Against "Try This" Debugging
- Absolute Imports in TypeScript and React: A Practical Guide
- My Daily Programming Routine as a Senior Software Engineer
- Install SVGO With Reasonable Defaults, Part Two
- Variable Name Antipatterns Named and Explained
- Cold Water for Your Code Coverage
- Making Sense of Code Coverage
- Does ChatGPT Mean Software Engineering Is Over?
- Apply a Conditional Border Without Moving Element
- Apply a Patch in Reverse
- Install SVGO With Reasonable Defaults
- One-Sentence Summaries of Popular Technology Books
- How to Run an Agile Retrospective for Leaders
- Override Autojump's Directory Rankings
- Type Your TypeScript Library Functions
- Sorting Numbers with JavaScript's sort Function
- The Power of CRUD Operations Explained with SQL
2022 93
- How to Create a Timer or Polling in React with setInterval
- Build a Sentence from a JavaScript Array
- Zoom and Scroll in Figma
- My Feature Writing Template: Given/When/Then
- Button, Link, or Neither? Three Principles for Clarity and Accessibility
- All My Best Tips For Expertly Reviewing Your Own Code
- Deliver a Great Standup Report as an Engineer
- How to Write a Resume for Transitioning to Programming
- Solving Exercism's Resistor Color Trio in TypeScript
- Vim Scratchpad Part 2
- Buy the Best Hardware You Can
- Solving Exercism's Resistor Color Duo in TypeScript
- Print Last Exit Code
- You Can't Change Nothing
- Read the Docs
- The Factory Pattern, Explained in Ruby
- Default to Programming Convention
- Recommended Reading
- How to Introduce New Ideas
- Computers Can Be Understood
- Source Tmux Config
- Tmux Copy Mode
- Vim Scratchpad
- Improve Your API Documentation Workflow with Dash
- Prefer Real Data For Software Development
- How Luck Played a Role in my Career
- All My Best Debugging Tips
- Preserve Whitespace in CSS
- Tmux Application Startup Script
- Recognizing and Repairing a Broken Mental Model
- Retros Need Action Items
- Better Than 'foo'
- Database Migration Checklist
- Logging an Object in JavaScript
- Why Ruby?
- What Are the Tradeoffs of Passing Objects as React Props?
- Naive Implementation: The Art of Artless Programming
- Validate CircleCI Configuration Locally
- Force ASDF Reshim
- Authentication vs. Authorization
- Spell Checking with Vim: Tutorial and Best Practices
- Select First Spell Suggestion
- Hide Bookmarks Bar in Chrome
- How to Write a Perfect Bug Report (With Template)
- Make a Prediction
- Desire Paths in Software
- Spend More Time Thinking Hard
- PostgreSQL Polymorphism
- Goodbye Shared Dotfiles
- Organizing React Components
- On Starting Over
- How to Identify the Breaking Commit With Git Bisect
- Commit Part of a File in Git
- You Have to Get Fast to Get Good at Programming
- Only One Way Out of a Function
- Am I Too Old to Become a Programmer?
- It's Harder to Read Code Than Write It
- The Problems With Code Screenshots
- Hash Fetch Instead of If/Else
- First Get It Working, Then Make it Look Good
- My psql Config
- Solved! How to Exit Vim "Ex" Mode
- How to Read a Stack Trace
- RSpec.describe vs. describe: Which Should I Use?
- Your Demo Doesn't Need Auth
- How Urgent Is This Bug?
- Debugging Tip: Learning From Bugs
- How to Make Renames Easy
- How to Read Postgres Docs
- Ctags Dotfiles
- Stop Studying, Start Building
- Which Operating System Is the Best for Programming?
- Autoformat Your Code
- How I Review Code
- How I Make Sure I Understand a Feature Before Building
- Don't Stay Stuck
- Why Vim
- On Disabling Tests
- Before You Abort, Count to Ten
- Avoid Similar Variable Names
- Refining Your Terminal Aliases
- Ruby's Frozen String Literal Comment: YAGNI
- Why I Don't Point Agile Bug Tickets
- Weekly Summary Technique for Software Engineers
- Opt Into Beta
- How to Find a Programming Mentor
- Use a Dev Email
- How to Answer Questions on Stack Overflow
- Want Better Automated Tests? Hard-Code Your Expectations
- Presence is Boolean
- Jump to N Percent of a File
- Be a Better Technical Consultant by Saying "I Think That..."
- Bug Reports Are Gold
2021 50
- Find Stale Gems
- Save Size Change to iTerm Profile
- Man pages in Vim
- Why Is It Called PostgreSQL?
- Ignore Rubocop Block Length Lint in RSpec
- Object ID
- Autojump and Open
- Force with Lease
- `group_by` with default
- Jira Actions Menu
- Why Getting Good Solves Most Career Problems
- Turn off Autoformatter for New Features
- App Store Delays
- Clear iOS Mobile Dependencies
- Clear React Router's Location State
- How to Organize JavaScript Imports
- Write Better Code by Knowing When Not To Refactor
- Scroll on XCode Simulator
- Highlighted Routes Searching
- The Tutorial Anti-Pattern
- React Native Shake
- TestFlight Downloads Latest Build
- fields_for exclude ID
- Use Display None
- Consultancy Cycles
- Edit in Pry
- Command Line Subshell
- Hash Equality
- Show Proc Source Location
- Chrome SameSite Updates
- Chrome Flags
- Date Input Tag
- Override Vim's Filetype
- Steps Within Steps
- Directional Commands
- Finding Getters
- MD5 File Signatures
- Printing with lpr
- Reverse a String
- Run Previous Command
- Screen Flashing in OSX
- Send Processes to the Background
- Start Postgres.app from the Command Line
- Watch That Program
- ExtractRSpecLet
- Upgrade Rubygems
- Reset a Gem
- What is the Sub Claim of a JSON Web Token?
- Augmenting an Object With the Proxy Pattern
- Do the Hard Things First
2020 8
2019 5
2018 5
2017 8
2016 27
- Open Every Site in a Chrome Bookmarks Folder
- Vim Nonrecursive Mappings
- Porting TIL from Rails to Phoenix: Initial Commits
- Vim Regex Word Boundaries
- Learn to Test
- Why Elixir?
- Writing Elixir Sigils
- How and Why to Squash Your Pull Request
- Recreating Elixir's Enum.sum
- Server Side Sorting in Ruby
- Keyword, Match, and Region in VimScript
- Delete Remote Git Tags
- From One End to the Other in Ruby
- Vim Buffer Problem
- Git Log With Authors
- Count Links in a Markdown File
- Query the Size of Postgres Array
- PostgreSQL Empty Array as Default Value
- Variable Hoisting in Ruby
- Get help with Pathogen
- Generate a Rails Secret Key
- Show Model and Grep with Pry-rails
- Set a Default Scope
- Change Inner Tag Block
- Succeed, Precede, and Surround in Haml
- Increment and Decrement Numbers
- Expect a Case-Insensitive Match
2015 46
- Testing Edit Forms
- Delete a Line From Another Line
- Ruby's Kernel::abort
- Cleanup PostgreSQL Databases
- Accessor Performance Gap
- The Alpha Commit
- Rails restore_attributes
- Explore Buffers with BufExplorer
- Rails destroy
- Git Log since
- Fetch Your Environmental Variables
- Seeding Golang's Rand
- Build URLs with Window Location
- Postgres Unlogged
- Go iota
- Ruby Regex Literal
- Building a Markov-Chain MVP in Ruby
- Prepare / Execute
- Psql Connect
- Terminate Database Connections
- Keyword Precedence
- Skid Keywords
- Change Column Null
- Classify and Constantize
- Find Or Create By With Block
- Edit the Current File Always
- Multipurpose Environmental Variables
- Puts Multiple Lines
- Truthy Strings
- Find and Replace Across Files
- Minmax
- Call a Vimscript Method in Vim
- Case Insensitive Matchers
- Current Value of a Setting
- Jump to the First Non-Blank Character
- Redirect a Path
- Bypass Basic Auth
- Git Snapshot
- Close a File
- Sort Alphabetically
- Parameters Filtering
- Modify Attribute on Set
- Undo a Git Mistake
- Delete Comments
- Less Help
- The N + 1 Problem