All blogs / JavaScript / TypeScript
Human Who Codes
The Official Web Site of Nicholas C. Zakas
JavaScript / TypeScriptDev tools / editors / IDEsAI / MLSoftware / engineering practice
- Posts
- 632 from 13 May 2004 to 30 Sep 2026
- Posting
- monthly (16 in the last year)
- Kind
- personal blog
- Feed
- https://humanwhocodes.com/feeds/blog.xml
2026 16
- Introducing PR Comment Inbox
- Five software engineering roles for working with AI
- Use WatermelonDB with Expo 56+
- A gentle introduction to Git worktrees
- Testing Android apps with Expo on physical devices
- GitHub Copilot's pricing gamble
- Use cloudflared for SSH and close port 20
- Creating a VS Code agent hook to respond to file changes
- Wiring auxiliary Cloudflare workers into an Astro 6 application
- Improving developer velocity with GitHub merge queue
- Proxying fetch requests in server-side JavaScript
- The importance of artifacts in AI-assisted programming
- Using your own Supabase signing keys
- From Coder to Orchestrator: The future of software engineering with AI
- 2026
- How GitHub could secure npm
2025 7
2024 8
- Present technical information using a storytelling framework
- How someone temporarily took over my subdomain
- Backing up my life with a Synology NAS
- Managing your to-do-list as a staff+ engineer
- What's the difference between JavaScript engines and JavaScript runtimes?
- Publishing to JSR using release-please
- 2024
- Introducing humanfs (formerly fsx): A modern filesystem API for JavaScript
2023 11
- How to setup a known_hosts file for a Jenkins pipeline job
- JavaScript WTF: Why does every() return true for empty arrays?
- Managing your interrupt rate as a tech lead, part 3: Office hours and appointment blocks
- Managing your interrupt rate as a tech lead, part 2: Time blocking
- Managing your interrupt rate as a tech lead, part 1: You get more of what you reward
- Disabling paste in textboxes is not a security feature
- Automating tweets with Twitter API v2
- Creating a Jekyll-style blog post URL in Astro
- 2023
- Creating a Jekyll-style blog post year archive in Astro
- Mimicking __dirname and __filename in ESM modules in Node.js
2022 3
2021 9
- Making your open source project sponsor-ready, Part 3: Accepting sponsorships
- Making your open source project sponsor-ready, Part 2: Project hygiene
- Making your open source project sponsor-ready, Part 1: Companies and trust
- How to talk to your company about sponsoring an open source project
- The lazy-loading property pattern in JavaScript
- Two approaches to win an argument as a software engineer
- Introducing Env: a better way to read environment variables in JavaScript
- 2021
- Creating a JavaScript promise from scratch, Part 7: Unhandled rejection tracking
2020 9
- Creating a JavaScript promise from scratch, Part 6: Promise.all() and Promise.allSettled()
- Creating a JavaScript promise from scratch, Part 5: Promise.race() and Promise.any()
- Creating a JavaScript promise from scratch, Part 4: Promise.resolve() and Promise.reject()
- Creating a JavaScript promise from scratch, Part 3: then(), catch(), and finally()
- Creating a JavaScript promise from scratch, Part 2: Resolving to a promise
- Creating a JavaScript promise from scratch, Part 1: Constructor
- How to safely use GitHub Actions in organizations
- 2020
- How I think about solving problems
2019 8
- Scheduling Jekyll posts with Netlify and GitHub Actions
- Securing persistent environment variables using Vercel (formerly Vercel)
- Outputting Markdown from Jekyll using hooks
- Computer science in JavaScript: Circular Doubly-linked lists
- Computer science in JavaScript: Doubly linked lists
- Why I've stopped exporting defaults from my JavaScript modules
- 2019
- Computer science in JavaScript: Linked list
2018 6
2016 6
2015 12
- Why I'm not using your open source project
- Hidden performance implications of Object.defineProperty()
- ECMAScript 6 destructuring gotcha
- Triggering Jenkins builds by URL
- My favorite interview question
- Is the web platform getting too big?
- From Wordpress to Jekyll: My new blog setup
- Announcing the NCZOnline Newsletter
- Why you're afraid of public speaking
- The bunny theory of code
- 2015
- Consensus-Driven Development
2014 16
- Generalists and specialists: thoughts on hiring
- My ECMAScript 7 wishlist
- An open letter to the FCC regarding net neutrality
- URLs are already dead
- Creating type-safe properties with ECMAScript 6 proxies
- Creating defensive objects with ES6 proxies
- The Value-Effort Matrix: A framework for thinking about work
- I have Lyme disease
- Announcing Understanding ECMAScript 6
- Leanpub: One year later
- Accessing Google Spreadsheets from Node.js
- Now shipping: Principles of Object-Oriented JavaScript
- Maintainable Node.js JavaScript: Avoid process.exit()
- Private instance members with weakmaps in JavaScript
- 2014
- How to be a mentor
2013 27
- On interviewing front-end engineers
- Now available: ESLint v0.1.0
- The problem with tech conference talks lately
- The best career advice I've received
- Node.js and the new web front-end
- Understanding ECMAScript 6 arrow functions
- That time the lights went out at Etsy
- Understanding how you provide value
- Introducing ESLint
- The case for setImmediate()
- Internet Explorer 11: “Don't call me IE”
- eval() isn't evil, just misunderstood
- On the politics, cargo-culting, and maintainability of JavaScript
- GitHub workflows inside of a company
- Blink and the end of vendor prefixes
- Getting the URL of an iframe's parent
- Making accessible icon buttons
- Internet Explorer 11′s user-agent string: What does it mean?
- What kind of a software engineer do you want to be known as?
- On joining Box
- Making an accessible dialog box
- What technical recruiters can learn from online dating
- You can't create a button
- What the NFL can teach us about diversity in technology
- Fixing “Skip to content” links
- 2013
- Advice for new and aspiring technical speakers
2012 49
- Being right doesn't matter
- Now available: Principles of Object-Oriented Programming in JavaScript (beta)
- Are your mixins ECMAScript 5 compatible?
- Adventures in pointerless computing
- Computer science in JavaScript: Quicksort
- The Front End Summit new speaker program
- JavaScript APIs you've never heard of (and some you have)
- ECMAScript 6 collections, Part 3: WeakMaps
- The “thank you” that changed my life
- Book review: Think Like a Programmer
- Does JavaScript need classes?
- ECMAScript 6 collections, Part 2: Maps
- Thoughts on TypeScript
- Computer science in JavaScript: Merge sort
- ECMAScript 6 collections, Part 1: Sets
- Computer science in JavaScript: Insertion sort
- Replacing Apache with nginx on Elastic Beanstalk
- CSS Lint v0.9.9 now available
- The innovations of Internet Explorer
- Setting up SSL on an Amazon Elastic Load Balancer
- Setting up Apache as a SSL front end for Play
- A critical review of ECMAScript 6 quasi-literals
- Thoughts on ECMAScript 6 and new syntax
- It's time to stop blaming Internet Explorer
- iOS has a :hover problem
- Book review: Adaptive Web Design
- What's a software engineer, anyway?
- Web developers are software engineers, too
- The care and feeding of software engineers (or, why engineers are grumpy)
- Working with files in JavaScript, Part 5: Blobs
- Working with files in JavaScript, Part 4: Object URLs
- Now available: Maintainable JavaScript
- Working with files in JavaScript, Part 3: Progress events and errors
- Working with files in JavaScript, Part 2: FileReader
- Working with files in JavaScript, Part 1: The Basics
- Book review: The Linux Command Line
- The performance of localStorage revisited
- How to install Apache Ant on Windows
- It's time to start using JavaScript strict mode
- In defense of localStorage
- Understanding technical debt
- Book review: The Art of Readable Code
- CSS media queries in JavaScript, Part 2
- Book review: The Tangled Web
- Now available: Professional JavaScript, 3rd Edition
- CSS Lint v0.9.2 now available
- Proposal: Scripting detection using CSS media queries
- 2012
- CSS media queries in JavaScript, Part 1
2011 30
- Introducing Props2Js
- Book review: HTML & CSS
- Timer resolution in browsers
- How content delivery networks (CDNs) work
- Book review: Closure: the Definitive Guide
- Setting up multi-user Apache on EC2
- Custom types (classes) using object literals in JavaScript
- Improving Rhino CLI utility performance
- CSS Lint v0.8.0 now available
- So you want to write JavaScript for a living? [repost]
- CSS Lint v0.7.0 released
- Simple, maintainable templating with JavaScript
- When web standards fail us
- Script yielding with setImmediate
- Experimenting with ECMAScript 6 proxies
- CSS Lint v0.6.0 now available
- CSS Lint updated to 0.5.0
- Introduction to the Page Visibility API
- Quick and dirty: Spinning up a new EC2 web server in five minutes
- Book review: Eloquent JavaScript
- Introducing CSS Lint
- On leaving Yahoo! and what's next
- Better JavaScript animations with requestAnimationFrame
- Lessons on @font-face from the F2E Summit
- Using HTML5 semantic elements today
- The importance of being versioned
- Separating JavaScript download and execution
- On UA sniffing, browser detection, and Alex's post
- 2011
- The sorry state of the CSS3 specifications
2010 34
- Thoughts on script loaders
- Response to John Resig's comments about YUI
- Mysterious arguments object assignments
- Wanted: Dynamic execution contexts in JavaScript
- Introduction to Server-Sent Events
- What's a web browser?
- Why is getElementsByTagName() faster than querySelectorAll()?
- Upcoming talks
- Learning from XAuth: Cross-domain localStorage
- The value of HTML validation
- What is a non-blocking script?
- Working with bidirectional (bidi) text and RTL languages on the web
- Determining if an object property exists
- Empty string URLs – browser update
- Data URIs make CSS sprites obsolete
- Cross-domain Ajax with Cross-Origin Resource Sharing
- Understanding IE8′s site compatibility view list
- The basics of web advertisement tracking
- Towards more secure client-side data storage
- iPad web development tips
- CSUN Conference 2010
- Empty-string URLs in HTML – A followup
- Custom events in JavaScript
- Maintainable JavaScript: Don't modify objects you don't own
- Answering Soshnikov's quiz
- My JavaScript quiz – answers
- My JavaScript quiz
- Announcing High Performance JavaScript
- How Internet Explorer 8 document mode affects JavaScript
- Answering Baranovskiy's JavaScript quiz
- Internet Explorer 8 document and browser modes
- History of the user-agent string
- 2010
- Interviewing the front-end engineer
2009 70
- Feature detection is not browser detection
- Protect IE from empty img src
- Writing maintainable code
- Computer science in JavaScript: Base64 encoding
- Empty image src can destroy your site
- What makes a good browser API?
- The curious case of JavaScript unit testing
- Introduction to web accessibility
- Automatic data URI embedding in CSS files
- YUI 3 IdleTimer now available on YUI Gallery
- Data URIs explained
- Book review: jQuery UI 1.6
- JavaScript sleuthing: Buggy native JSON
- FireUnit: Now with grouping
- Domain sharding for all
- Web definitions: DOM, Ajax, and more
- Moving the Web forward
- Introducing Combiner, a JavaScript/CSS concatenation tool
- Iframes, onload, and document.domain
- Computer science in JavaScript: Selection sort
- Computer science in JavaScript: Binary search
- Web workers: errors and debugging
- What makes a great software engineer?
- Experimenting with web workers
- Timed array processing in JavaScript
- Computer science in JavaScript: Credit card number validation
- The best way to load external JavaScript
- Safari doesn't properly display one-bit favicons
- Introduction to sessionStorage
- Common debugging mistakes
- Firefox 3.5/Firebug XMLHttpRequest and readystatechange bug
- JavaScript minification/compression and performance
- Event delegation in JavaScript
- Loading JavaScript without blocking
- Computer science in JavaScript: Binary search tree, Part 2
- Computer science in JavaScript: Binary search tree, Part 1
- Speed up your JavaScript: The talk
- Detecting if the user is idle with JavaScript and YUI 3
- Book review: Learning jQuery 1.3
- Computer science in JavaScript: Bubble sort
- JavaScript stack overflow error
- Cookies and security
- HTTP cookies explained
- Book review: Nonviolent Communication
- JavaScript error handling anti-pattern
- Computer science in JavaScript: Doubly-linked lists
- Computer science in JavaScript: Linked list
- XPath in JavaScript, Part 3
- Who's tweeting about you?
- Announcing Even Faster Web Sites
- XPath in JavaScript, Part 2
- XPath in JavaScript, Part 1
- The art of throwing JavaScript errors, Part 2
- First review of Professional JavaScript, 2nd Edition
- The art of throwing JavaScript errors
- Book review: The Art of War
- Mozilla JavaScript Extension: __count__
- Book review: Learning Ext JS
- Mozilla JavaScript extension: __noSuchMethod__
- Book review: Learning Dojo
- JavaScript variable performance
- New site design
- Speed up your JavaScript, Part 4
- Speed up your JavaScript, Part 3
- Speed up your JavaScript, Part 2
- Free excerpt from Professional JavaScript, 2nd Edition
- The YUI 3 revolution
- Speed up your JavaScript, Part 1
- 2009
- What determines that a script is long-running?
2008 74
- Now available: Professional JavaScript, Second Edition
- FireUnit extension for YUI Test
- JavaScript block-level variables
- Redesign my site contest
- What are web standards?
- Now on Twitter
- Books about social interaction
- Speaking at SF JavaScript Meetup
- Front Page and YUI 3 causes a stir
- Professional JavaScript, 2nd Edition available for pre-order
- The YUI Test world tour
- ECMAScript 3.1 static object methods prototype
- What happened to Firebug?
- Book review: The World is Flat
- Why software engineers fail
- Facebook: The transparent society
- The IE6 support problem
- Ajax Experience: The aftermath
- YUI 2.6.0 released
- Ajax Experience: Day 3
- Ajax Experience: Day 1
- Ajax Experience: Day 2
- Ajax Experience: Day 0
- New Yahoo! front page goes into testing
- Inside IE 8′s mutable DOM prototypes
- Chrome tames wild dialogs and popups
- Blog finally updated
- ECMAScript is dead; long live ECMAScript!
- Speaking schedule
- Naked JavaScript objects
- Mentioned in Microsoft whitepaper
- What to do with your money
- Teaching the children
- Congratulations, Jackie and Denis!
- And so the HTML 5 trouble begins
- Browser cookie restrictions
- Cross-domain XHR removed from Firefox 3
- Compress context menu item for Windows XP
- Wanted: Browser debug mode
- Get the JavaScript global
- The story of Professional JavaScript
- All sizzle and no substance?
- The Web could be heading for another dark age
- Big company or small company?
- Changes in Safari 3.1 for Windows
- Falling in love with the IE8 JavaScript debugger
- The great Safari keypress debacle
- YUI 2.5.1 released, including cookie fix
- The dreaded Operation Aborted error
- IE8 goodies and baddies
- Big day for the Web
- Does Safari's clipboardData actually work?
- Thoughts on HTML 5
- Book Review: Pro JavaScript Design Patterns
- Writing for how people read
- YUI 2.5.0: YUI Test reaches GA and more
- Top JavaScript books of all time
- More Opera weirdness
- Learning to program
- The mysterious Wii remote JavaScript API
- New site feeds – please update!
- Can text nodes receive events?
- PC Magazine: My Yahoo given 4/5
- How to markup blog comments?
- Torn between two lovers
- Getting element dimensions: A follow up
- Getting element dimensions
- Microsoft to buy Yahoo!?
- Book pre-release reviewers wanted
- The future of IE and the Web
- Introducing JSONLib
- getElementsByClassName() weirdness
- 2008
- Is JSON better than XML?
2007 78
- Site usability: What not to do
- IE8 passes Acid2: What does it mean?
- Internet Explorer 8 user-agent
- Don't forget navigator.platform
- IE: COM reers its ugly head
- What I'd like to see in HTML 5
- YUI 2.4.0 has been released
- The throttle() function
- Announcing the Yahoo! Juku
- Browsers too leniant with regular expressions
- JavaScript variable scoping trickery
- A plea to browser vendors
- The rise of Bebo Nation
- Gmail: Faster, better
- My first pipe: Earthquakes in Northern California
- ECMAScript 4: I hate it
- Why weren't you at the Ajax Experience?
- Learning something new about CSS and IE6
- The way JavaScript is handled: A call to action
- CSS sucks
- Good object-oriented design in JavaScript
- Internet Problem: Generic social networking is dead
- Keep JSON out of JavaScript
- Inconsistent array literals
- RWE 2007: All done
- RWE 2007: Day 2
- Why I don't like the Google Web Toolkit
- Internet Problem: Building a better search engine
- RWE personal scavenger hunt
- Are local variables faster? Part 2
- Are local variables faster?
- Come see me speak
- Internet Problem: The dating site dilemma
- My Yahoo! over iGoogle
- What makes a good front end engineer?
- My first YUI release
- The state of web syndication
- Professional JavaScript, 2nd Edition feedback wanted
- Some of my writings
- OpenOffice: Almost there
- Standards in Context
- Yahoo!'s best-kept secret
- ScriptDoc
- IE6 fix frees you of memory leaks
- Professional Ajax at Borders
- Safari 3 on Windows
- Bad security decisions
- Come see me talk
- What is up with recruiters?
- JavaScript variable names you shouldn't use
- Maintainable JavaScript talk
- First review for Professional Ajax, 2nd Edition
- The new My Yahoo! gets even better
- An open letter to Opera
- Safari lies
- Taking a little time
- Google using YUI grids
- Observers shouldn't observe themselves
- Surviving an interview with me
- Pain with inline-block (again)
- What do you love/hate about Professional JavaScript?
- .NET to be more like JavaScript
- The new My Yahoo! Beta has launched, and I helped
- Another Pro Ajax 2e excerpt
- Free excerpt from Professional Ajax, Second Edition
- A note on JavaScript performance
- getElementsMatching()
- What's Nicholas doing now?
- What's the deal with CSS query engines?
- Announcing Professional Ajax, Second Edition
- Event order of blur and change
- IE vs. PNG: The battle continues
- What CSS is missing
- Security vs. usability
- Feature detection != browser detection
- Spam insights
- 2007
- Opacity in IE6: alpha or PNG?
2006 75
- Interesting JavaScript string capability
- The JavaScript download gotcha
- Standards with sanity
- Professional Ajax – Amazon's #8 best tech book of 2006!
- Browser detection versus feature detection
- Minimizing closure usage
- Congratulations to YUI team
- Adobe open sources Flash JavaScript engine
- IE's innerHTML problem
- The absorb() method
- The absorb() function
- The case against Hungarian notation in JavaScript
- Update to zXml
- Avoiding plagiarism
- I love my job
- Debunking object()
- Pain with inline-block
- Writing again
- Small zXml Update
- Yahoo! Hack Day
- Closures considered harmful
- Don't allow overriden methods
- Safari Development Tools
- RSS and Syndication Roadblocks
- New Yahoo! Photos
- WebKit on a PC
- The Problem Of Photo Sharing
- Yahoo vs. Google
- Visual Studio Express Rocks!
- Mainstream Ajax
- IE7 Beta 3
- Back Button/Onload Mess
- Use Null Comparisons Sparingly
- Fun With Null And Undefined
- FireBug 0.4
- Global Variables Are Evil
- Eureka Suite – The Next Generation
- And Then There Were Three
- Google Web Toolkit
- Praise for Microsoft
- Design Patterns in JavaScript
- Eureka v0.2 – Now With Leak Detection!
- The Magic of Unit Testing
- CSS + JavaScript = Evil
- ActiveX Armageddon
- Google Maps API – No XHTML Support
- Yahoo! Connection Manager
- Alternate Ajax Techniques, Part 2
- DOM Tree Update
- What do you want to see in Pro JS, 2nd Edition?
- XMLHttp Requests For Ajax
- Adobe Jumps On The Ajax Bandwagon
- AIM SDK
- Firebug
- Firefox OnBeforeUnload Fun!
- IE OnBeforeUnload Fun
- CSS Is Complicated
- Introducing Eureka v0.1
- Ajax Shelflife
- Respect JavaScript
- Now That's Security!
- Yahoo! User Interface Blog
- First Professional Ajax Reviews Rolling In
- Alternate Ajax Techniques
- Javascript Para Desarrolladores Web
- IE 7 Beta 2 Preview Released
- Upload From a Link
- Now Available: Professional Ajax
- Using Semantics Correctly
- Firefox 1.5 Keypress Event Changes
- The ping Attribute
- Colored Bullets
- JavaScript 1.2 Must Die
- 2006
- Canvas in IE
2005 83
- Someone Else Gets It, Too
- Syndication Confusion
- RIP Web Trends of the 90s
- Comment Spam
- The Website Development Process
- Firefox 1.5 Released
- Want to Work With Me?
- Microsoft Doesn't Innovate
- Updated: zDragDrop 1.1
- Microsoft Invented Ajax
- The Death of IE CSS Hacks
- Professional Ajax Outline
- Ajax Using a Style Sheet?
- VistaPrint Goes Public
- Safari Recreates Proprietary Extensions
- Blame Netscape First
- IE7 Makes Developers Happy
- How Google Keeps Spammers Away
- Web Developer Extensions for Firefox…and what's this?
- Web Architecture: 2005
- Reviews Wanted!
- Microsoft was Right
- Force Landscape Printing (IE only)
- zArray Update
- Pre-Order Professional Ajax!
- The Power of Themes
- Latest Article
- Does JavaScript suck?
- Top 5 Web design mistakes
- Styled Form Controls
- E4X Lives
- Array extensions
- Another good review
- IE7 Beta 1 Released
- Ajax book coming along
- Favorable Review
- Google for Firefox
- Google AJAXSLT
- Developing with Google Maps
- Google Maps API
- The Atlas Project
- Mozilla's new Array methods
- Cajun Is Coming
- Updated Book Examples
- Examples Not Working
- Brendan Eich's Latest
- Open Source CMSs – What the?
- AIM Mail Debuts
- Java or JavaScript?
- JavaScript's Future: Cajun
- Last Autosuggest Article
- Where's the JavaScript?
- Announcing The First Co-author
- Netscape 8 Messes Up IE
- Popups Are Evil
- Anonymous Coward Returns
- Movin' On Up
- New Book Change = AJAX
- Netscape 8
- IE7 To Have Tabs
- On Amazon Reviews
- Why Typos?
- Another Kind Review
- Suggestions For New Book
- Initial C# Reactions
- A Stellar Review
- Working With JSON
- First Negative Review On Amazon
- Professional JavaScript Forum
- Looking For Some Good Reviewers
- Firefox 1.1 To Support SVG
- Safari Passes Acid2 Test
- IE7 User-Agent String Revealed
- Sites Release Updates
- .Net Impressions
- From The Editor
- PNG Alpha Support In IE7
- Web Developer Tools
- Opera CEO To Swim The Atlantic
- zColor 0.1
- IE7 Beta Details Announced
- Mozilla Adding Canvas Support
- 2005