Evert's Dugout
My name is Evert Pot, and this is my blog!
I'm a veteran Web Developer from The Netherlands, now living in Toronto. I currently work as a CTO at Sprout Family. I have a passion for Open Source and Web standards, and have been writing about related topics here since 2006.
My open source projects have collectively been downloaded roughly
While I'm currently not actively looking, you can find my resume here.
On the web
- Mastodon : @evertp@indieweb.social
- Github : evert
- Subscribe to my blog
About this blog
This blog is built with Jekyll, and hosted by Github Pages. All the content and code is open source.
Want to take a look, or suggest changes? Check out or fork the Github project.
Blog archive
I've been writing blog-posts on and off since 2006. Below you'll find the full archive. Don't scroll too far though, quality degrades as you go backwards in time.
2024
- In the future using top-level await might be cause a backwards compatibility break in Node
- Discovering features using HTTP OPTIONS
- New Structured Fields RFC out, and so is my Javascript package
- Hello World, meet Kian
- Creating a fake download counter with Web Components
- Moving on from Mocha, Chai and nyc.
- OAuth2 client updates
2023
- Using JSX on the server as a template engine
- Why aren't there more 80% jobs?
- Does OAuth2 have a usability problem? (yes!)
- Switching to Fedora from Ubuntu
- Supporting CommonJS and ESM with Typescript and Node
- Winding down Bad Gateway
- Building a simple CLI tool with modern Node.js
- Knex (with MySQL) had a very scary SQL injection
- I wish JSON5 was more popular
2022
- Neko - A brief history and porting to Javascript
- Taking a look at Mastodon
- Porting Curveball to Bun
- Ubuntu bungled the Firefox Snap package transition
- On syntactic sugar
- A new OAuth2 client for Javascript
- Reasons why abolishing DST in the US will be worse for users and developers
- Log4j, Faker and Black Swan Events
- Request bodies in GET requests
- Hello 2022!
2021
- 15 years of blogging
- JWT should not be your default for sessions
- Ketting 7 released
- Ketting support for deprecation warnings
2020
- HTTP/2 Push is dead
- Ketting v6: Using Hypermedia APIs with React
- Video: Building a Promise from scratch!
- ECMAScript 4: The missing version
- A generic middleware pattern in Typescript
- Common no-cors misconceptions
- Curveball - March updates
- Curveball - A typescript microframework
- Typescript is changing how I write code
- Implementing an opaque type in typescript
- Use a:visited in your CSS stylesheet
- Performance testing HTTP/1.1 vs HTTP/2 vs HTTP/2 + Server Push for REST APIs
2019
- Reinventing the wheel when encoding links in JSON
- Ketting v5 released
- Building awaitable and fluent interfaces in Javascript
- Better typing with Ketting
- Structured headers NPM package: new version
- Authentication relation types
- Typescript definitions for HAL and Link Hints
- The end of the HTTP series
- 511 Network Authentication Required
- 510 Not Extended
- 508 Loop Detected
- 507 Insufficient Storage
- 506 Variant Also Negotiates
- 505 HTTP Version Not Supported
- 504 Gateway Timeout
- 503 Service Unavailable
- 502 Bad Gateway
- 501 Not Implemented
- 500 Internal Server Error
- 451 Unavailable For Legal Reasons
- 431 Request Header Fields Too Large
- Blog archive in space
- Browser tabs are probably the wrong metaphor
- 430 Would Block
- 429 Too Many Requests
- 428 Precondition Required
- Firefox gets BigInt, and bigint-money gets 1.0 release
- 426 Upgrade Required
- 425 Too Early
- 424 Failed Dependency
- 423 Locked
- 422 Unprocessable Entity
- 421 Misdirected Request
- 420 Enhance your calm
- 418 I'm a teapot
- Using loops instead of higher order functions
- 417 Expectation Failed
- 416 Range Not Satisfiable
- An OAuth2 middleware for fetch()
- 415 Unsupported Media Type
- 414 URI Too Long
- 413 Payload Too Large
- 412 Precondition Failed
- 411 Length Required
- 410 Gone
- Ketting 2.5 release.
- 409 Conflict
- bigint-money: an NPM package for doing currency math
- 408 Request Timeout
- 407 Proxy Authentication Required
- MySQL examples in Node.js
- 406 Not Acceptable
- One year in San Francisco as a Software Engineer
2018
- 405 Method Not Allowed
- 404 Not Found
- Floats and money
- 403 Forbidden
- I made a thing: csv-1-2-3
- 402 Payment Required
- 401 Unauthorized
- 400 Bad Request
- Google Trends for REST, GraphQL and RPC
- Which redirect do I choose?
- 308 Permanent Redirect
- 307 Temporary Redirect
- 306 Switch Proxy
- 305 Use Proxy
- Ketting 2.3 release
- 304 Not Modified
- Http errors package for Typescript
- 303 See Other
- 302 Found
- 301 Moved Permanently
- 300 Multiple Choices
- Curveball - a TypeScript micro-framework
- 226 IM Used
- HTTP/2 Push for APIs
- Use 'let' and 'const' instead of 'var'
- 208 Already Reported
- Building protocols with HTTP
- 207 Multi-Status
- 206 Partial Content
- 205 Reset Content
- Firefox removes RSS support
- 204 No Content
- 203 Non-Authoritative Information
- 202 Accepted
- Bye Disqus, hello Webmention!
- 201 Created
- 200 OK
- 103 Early Hints
- 102 Processing
- 101 Switching Protocols
- 100 Continue
- Series of posts on HTTP status codes
- Ketting 2.0 release
- Scheduling posts on Github pages with AWS lambda functions
- WebDAV features that might be useful for HTTP services.
- A HTTP structured-header parser for Javascript
- Ketting 1.0 release.
2017
- I work at Yelp now!
- A small update about sabre/dav and baikal maintenance.
- The problems with embedding in REST today and how it might be solved with HTTP/2
- After 10 years, I'm stopping my work on sabre/dav
2016
- Working with HAL in PUT requests
- Slides for my Sass talk at True North PHP. #tnphp16
- Switching to Google AMP and back
- Syntax highlighting in presentations
- sabre/event 4 released for PHP 7
- Go for PHP programmers
- Just married!
- REST is in the eye of the beholder
- PHP Sucks
- Blogging for 10 years!
- sabre/xml and repeating elements
- Why PHP-FIG matters
- Writing SQL that works on PostgreSQL, MySQL and SQLite
- WebDAV resource sharing: an overview
- Drop 'public' not 'var'!
- Npm package author revokes his packages, breaking tons of builds
- 10 years on LinkedIn
- phpunit-bin - run phpunit from anywhere
- Strict typing in PHP 7 - poll results
- Poll: Will you be using strict typing with PHP
- Looking back at 2015 using Markov chains
2015
- Parsing Atom with sabre/xml
- Finding a DNS registrar
- PHP code in 2006 and 2016
- Now available via TLS and HTTP/2
- Switching to Linux
- Promises & Generators: my slides from True North PHP 2015
- Going freelance
- Save memory by switching to generators
- sabre/dav 3.0 released!
- PSR-7 released today
- PHP's callable typehint too loose?
- An XML library for PHP you may not hate.
- PSR-7 is imminent, and here's my issues with it.
- Dropbox starts using POST, and why this is poor API design.
- The problem with password_hash()
- HTTP/2 finalized - a quick overview
- What's a link?
- A new URI handling library for PHP.
2014
- Testing your composer dependencies with prefer-lowest
- Making the clipboard work between iTerm2, tmux, vim and OS X.
- sabre/dav 2.1 released.
- Why Google's CardDAV server isn't.
- Accessing protected properties from objects that share the same ancestry.
- Promises in PHP
- HTTP/1.1 just got a major update.
- sabre/dav 2.0 released.
- Hawk Autentication considered harmful.
- New sabre/dav website launched!
- PHP 5.5.10 timezone handling changes
- Composer's bug now fixed
- Composer is wide open with a massive security vulnerability
- fpassthru broken on OS X
- Google Code is dead.
- jCard is now a thing
- sabre/http 2.0 released
2013
- Replacing MyOpenID
- MySQL 5.6 BOOL behavior when using PDO and prepared statements
- Free Internet Explorer VM's on modern.ie
- If you care about privacy, don't use OS X mail
- On idempotence in HTTP
- Joining CalConnect
- Sabre VObject 3.1 released
- Following redirects with Curl in PHP.
- sabre-event, a simple event management library for PHP 5.4
- OS X 10.9 will ship with PHP 5.3
- Sabre VObject 3 released
- PHP 5.5.0 released!
- Escaping in iCalendar and vCard
- SabreDAV acquired by fruux
- A new blog!
2012
- Switching to PHP 5.4 on OS X
- SabreDAV 1.8 released (with namespaces!)
- Markdown output for PHPDocumentor2
- SabreDAV 1.7 released
- New open source project: Sabre VObject
- OAuth 2.0 and the Road to Hell
- IE10 and DNT-header update
- IE10 will enable the DNT header by default, and why I think this is a bad thing.
- New HTTP status codes
- New full-time gig at fruux
- Content Security Policy update
- Silex routing issues
- RFC search provider
2011
- My PHP Advent article
- PHP Includes file generator
- Moved SabreDAV to Github
- Timezone database closed down
- iconv_substr vs mbstring_substr
- Fake *.google.com SSL certificate in the wild
- SabreDAV 1.5 released with CardDAV support
- Blogging for 5 years
- Numeric string comparison in PHP
- Escaping MySQL strings with no connection available
- Throwing in the towel with SabreAMF and Dropbox PHP lib
- Speaking at the PHPBenelux march meetup
- Mozilla Documentation Center
- Speaking at DPC 2011
- SabreDAV 1.4.0-beta released
- Taking advantage of PHP namespaces with older code
- Going to PHPBenelux
- My gripe with Prototype
2010
- iCalendar / vCard parser for PHP
- slowdeath - a simple denial of service attack for most PHP-based servers
- Internationalized domain names, are you ready?
- SabreDAV 1.3.0 released
- Ubuntu has a new font
- Killing a dead ssh connection
- Evercookie: the cookie that just won't die
- Content Security Policy introduction
- New job at IBuildings
- Storing encrypted session information in a cookie
- What happened to HTTP authentication?
- Guidelines for generating XML
- Blogging for 4 years
- SabreDAV 1.2 released (with CalDAV support)
- When to escape your data
- Goodbye old Firefox profile
- Dropbox client library for PHP
- Mbstring Function Overloading Dont Use It
- Filesystem encoding and PHP
- HTML5 video: On2 VP8, H.264 and Ogg Theora
- New habari-based blog
- basename() is locale-aware
- SabreDAV 1.0.9 released & CalDAV news
- <input type="email"> and Firefox Contacts Add-on
- Jumping ship! From Subversion To Mercurial
- CalDAV server for PHP
- Published in PHP|Architect
- Unicode nearing 50% of the web
- A case for table-based design
- SabreDAV 1.0.4 released
- New open PEAR channels
- javascript's escape and encodeURI vs. PHP $_POST
2009
- OS/X WebDAV and Chunked Transfer Encoding
- South Korea's 'real-name verification law'
- Switching from Google to Bing
- Game of life with checkboxes
- SabreDAV reaches 1.0
- Comments are back!
- Deleted all comments by accident
- Upgrading to Snow Leopard adventures
- OS/X internet sharing defaults to 192.168.2.* range.
- CalDAV - it's hard!
- SabreDAV 0.12
- Converting ICalendar to XML
- Is OpenID becoming over-engineered?
- SabreDAV 0.9
- Flash ExternalInterface - Debug checklist
- SabreAMF 1.3 release
- Goto in PHP 5.3
- Changing jobs
- PHP feature request: 'Throwable' interface
- Macbook LCD screen repair project
- SabreDAV 0.8
- Blogging for 3 years
- Baseball Chronicles
- Oracle to buy Sun
- Frame busting and clickjacking prevention
- rev="canonical" and url shortening
- I bring you: floep
- SabreDAV 0.7
- Indexing geo-data 3: In practice
- Indexing geo-data 2 : simple benchmark
- Indexing geo-data
- Dangers of mutual dependencies
- WebDAV-related RFC's
- Rogers takes over my browser
- SabreDAV 0.6
- Search engines to support 'canonical urls', or: how to reinvent the wheel
- HTTP Basic and Digest authentication with PHP
- Creating streams from strings in PHP
- Apache speed and reverse proxies
- A case against pagers
- PHPUnit: A second look
- SabreDAV 0.5
- BBC drops microformats from programmes section.
- Devshed article about SQL Injection (or why security related articles should only be written by experienced people)
2008
- Geo standards on the web
- Gps trackers - any advice?
- Forking and MySQL connections
- MP4 fast-start woes
- Google Tech Talk about patents
- Zend Framework 1.7 features AMF support
- I'm programmer of the year!
- SabreDAV 0.4
- Sony Headphone Drama
- New on this blog: degraded experience for IE6
- Flash Upload changes in Flash Player 10
- Solar Framework's master-slave db adapter
- SabreAMF 1.2
- Quick MySQL tip: add comments
- Lighttpd + PHP fastcgi woes
- Integrating with Zend's OpenID
- Upcoming features in PHP 5.3
- Subversion 1.5 for debian Etch
- Preventing XSS in Javascript strings
- Converting line-endings with ViM
- Google and Yahoo start indexing SWF's
- IE8 comprehensive protection
- SabreDAV 0.3
- Macbook LCD screen broken =(
- CNMA 08 Finalist
- Site Security Policy
- Getting around "su : must be run from a terminal"
- SabreDAV 0.2
- Blogging for 2 years
- Flash opens up
- SabreDAV 0.1
- CDATA in xml.. bad idea?
- Usability, design 101
- WebDAV updates
- Silverlight 2 beta1 & IIS new video features
- First glance on IE8
- Ray Ozzie's keynote
- Off to Vegas - Mix 08
- Traversing directories
- SabreAMF 1.1 release
- Strange call from Red Hat
- SabreAMF now on gentoo portage
- MySQL Stored Procedure in PHP gotcha
- MySQL crashes on triggers + insert delayed
- Mime types.. when will people learn?
- Introduction to using SabreAMF with Flex
2007
- Adobe publishes AMF3 spec
- PHP WebDAV integration library
- Implementing WebDAV with PHP
- SabreAMF 1.0 release
- Open Source and copyright infringement
- PHP Quicksearch in firefox
- SabreAMF 1.0-beta4
- SabreAMF 1.0-beta3
- Flash Uploader on Mac not triggering onComplete event
- PHP shutdown sequence
- MemCached and MySQL UDFs
- OS/X terminal settings for linux programmers
- Leopard first impressions and problems
- HTML Purifier rocks!
- SabreAMF documentation
- SabreAMF 1.0-beta2
- SabreAMF 1.0-beta
- PHP's DateTime object and unix times..
- My Firefox extensions
- FFMpeg to support Nellymoser within the month?
- Flash to support H.264
- PHP: Arrays vs. Objects
- PHP and circular dependencies
- Future of SabreAMF
- PHPRPC and PHP frameworks
- PHP-RPC update 4
- FLVTool2 broken
- Firefox gets httpOnly cookies
- PHP-RPC update 3
- FiTC 2007 presentation video
- PHP namespaces
- PHP serializer 0.2
- The curse of major versions
- PHP serializer in userland code
- ext3: too many links!
- CSS "projection" media type
- PHP-RPC
- Blogging for 1 year
- Running cli editor from php
- Site back up!
- PHPUnit3 : first impressions
- MySQL recap and future storage engines
- PHP try..catch syntax weirdness
- FiTC 2007 rocked!
- Welcome CP/M user!
- Flash8's ExternalInterface and Internet Explorer
- SabreAMF 0.7
- I got a chumby!
- Presentation links
- Speaking at FlashinTO v59.0
- Multi-file upload using SWFUpload
- Sharing sessions between html and flash
- I'll be speaking at Flash in the Can 2007
- Rotating an image, retaining the original size
- Keeping your home directory in subversion
- Grepping in your subversion working copies
- I fixed home and end on OS/X terminal!
- SabreAMF 0.6 -> upgrade recommended
- What bug-reporting tool do you use?
2006
- SabreAMF 0.5
- SabreAMF featured on Adobe DevNet and 0.4 out
- Caching in PHP using the filesystem, APC and Memcached
- cron.daily scripts won't run
- Exploring OpenSearch
- SabreAMF 0.3 released + more info on class mappings
- Funky new look
- IE 7 RC1 acid2 test
- Creating a Gopher server with PHP and InetD
- Creating an OpenID client for PHP
- On HttpOnly, Firefox-specific XSS and this years major Livejournal XSS attack
- SabreAMF 0.2 is here
- Enabling firefox 2.0 microsummaries
- FFMpeg supports FLV 1.1
- Decoding AMF3
- Whats up for SabreAMF 0.2
- wmode="transparent" in firefox
- Updated the meta-detector library (v0.2)
- Sourcecode for Meta detector
- Building Subversion from source on debian
- PHP Application Structure
- Added MetaWeblogAPI
- Coming soon.. Code section
- Auto detecting Blog Services
- Installing SabreAMF
- Added a tagcloud
- Added comment system
- A new blog