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