RSSAmplifier

Blog

Sean Coates is a person on the Internet

seancoates.comRSS feed ↗74 posts

Latest posts

YULBBS

It’s 2026 and I’m running a BBS * like it’s 1991. To avoid burying the lede on this: ssh yulbbs.via.sc ( telnet also works); or https://yulbbs.via.sc/ in your browser. (I mentioned this on Mastodon a while back, so this might not be new to some of you, but I realized I never wrote about it here.) I live very near to a large airport (CYUL, Dorval/Trudeau airport in Montreal). I’m certainly no…

How We Got Here

I don’t like how we got here . Yes, this is—unfortunately—yet another AI thoughtpiece. I’m sure you must be tired of reading AI thoughtpieces. I won’t be offended if you skip this one. Before you jump, though, you should know that the emdashes in this paragraph (and entire contents of this post) were written by me, Sean, a 100% human. I won’t let it take my beloved…

Orval in Dorval

Short note on here to point at another project I’ve just published: Orval in Dorval 2024 I’ve been collecting a case of Orval (the Belgian Trappist beer) every year since 2010. In 2024, eight of us got together at my place to taste my 14 year vertical. (I have 16 years now.) I made us all take notes. The linked site is the data output from that night, and it might be the biggest trove…

Studioworks

Yesterday, we launched Studioworks , the platform that I (and Nick , and Chris , and Jessica ) have been working on all year. There’s a lot more to what Studioworks will be, but for right now, it’s primarily a platform that lets creative people send really nice invoices in the easiest way we could manage. Our early (“founding member”) beta users seem to love it, and…

Vendor Security

A few weeks ago I had to have a conversation with a vendor about credentials. Despite some push back from our side, they insisted that their Bearer Token style authentication key for HTTP requests was safe from MitM + Replay attacks. The token was to be used from a user’s device (their phone). They claimed it must be safe because the API access that uses this token is protected by…

Matter and Privacy

As of October 1, 2024, I've stepped away from my role as VP of Technology at Matter. This means that I can no longer personally vouch for the privacy aspects of the app. When I was still working at Faculty , we took on a new client that was not yet named Matter . We eventually transitioned from an agency-client relationship to a startup relationship, where I became the VP of Technology. This is…

Exists is the enemy of good

We’ve all heard the adage “ perfect is the enemy of good. ” I take this to mean: if you only accept perfect , you might miss a good-enough solution. I still try to strive for perfect, but have learned to accept that good might be sometimes enough. However, I’ve been saying something to friends and colleagues—for probably a decade now—that is closely related: exists is the…

A Secret Career Code

or: How, 25 years ago, I went viral and met King (Prince) Charles Someone has been paying me to work on technology stuff for over 20 years, now. And there’s one weird trick that I’ve learned that I think it’s worth passing on. This isn’t really a secret code (and the one weird trick bit is a joke, of course), but it was so non-obvious to me in my early career, and it’s so valuable to me in my mid…

Modified Microphone

I’ve owned a Blue Yeti microphone for a little over five years, now. It’s a pretty decent microphone for video calls, and I really like that it has its own audio interface for (pass-through) earphones, and a dedicated hardware mute feature. I’ve used it on probably 1500 calls, with only one complaint: the mute button makes noise. For most of that five years, my colleagues could…

A USB Mystery

TL;DR: got some hardware that didn’t have a driver I could use. Dived into some packet captures, learned some USB, wrote some code. I’ve been on a mini quest to instrument a bunch of real-life things, lately. One thing that’s been on my mind is “noise” around my house. So, after a very small amount of research , I bought a cheap USB Sound Pressure Level…

IoT: Internet-Optional Things

I both love and hate the idea of “smart” devices in my home. It’s tough to balance the convenience of being able to turn lights on and off automatically, and adjust thermostats with my phone, with the risk that all of my devices are doing evil things to my fellow Internet citizens. But, I think I’ve landed on a compromise that works. I’ve had Internet-connected…

Did it now

I originally wrote this one to publish on Reddit , but also didn’t want to lose it. Many many years ago, I worked at a company in Canada that ran some financial services. The owner was the kind of guy who drove race cars on weekends, and on weekdays would come into the programmers’ room to complain that our fingers weren’t typing fast enough. On a particularly panicky day, one of…

Cache-Forever Assets

I originally wrote this to help Stoyan out with Web Performance Calendar ; republishing here. A long time ago, we had a client with a performance problem. Their entire web app was slow. The situation with this client’s app was a bit tricky; this client was a team within a very large company, and often—in my experience, anyway—large companies mean that there are a lot of different…

How I helped fix Canadaʼs COVID Alert app

On July 31st , Canada’s COVID Alert app was made available for general use, though it does not have support for actually reporting a diagnosis in most provinces, yet. In Quebec, we can run the tracing part of the app, and if diagnosis codes become available here, the app can retroactively report contact. It uses the tracing mechanism that Google and Apple created together , and in my…

New Site (same as old site)

You’re looking at the new seancoates.com . “I’m going to pay attention to my blog” posts on blogs are… passé , but… I moved this site to a static site generator a few years ago when I had to move some server stuff around, and had let it decay. I spent most of the past week of evenings and weekend updating to what you see now. It’s still built on Nikola , but now the…

Faculty

Officially, as of the start of the year, I’ve joined Faculty . Faculty is not just new to me, but something altogether new. It’s also something that feels older than it is. The familiar, experienced kind of old . The good kind. The kind I like. It was founded by my good friend and long-term colleague Chris Shiflett , whom I’m very happy to be working with, directly, again. People…

Shortbread

December 1st. Shortbread season begins today. (Here’s something a little different for long-time blog readers.) Four years ago, in December, I made dozens and dozens of batches of shortbread, slowly tweaking my recipe, batch after batch. By Christmas, that year, I had what I consider (everyone’s tastes are different) the perfect ratio of flour/butter/sugar/salt, and exactly the right…

API Gateway timeout workaround

The last of the four (see previous posts ) big API Gateway limitations is the 30 second integration timeout . This means that API Gateway will give up on trying to serve your request to the client after 30 seconds—even though Lambda has a 300 second limit . In my opinion, this is a reasonable limit. No one wants to be waiting around for an API for more than 30 seconds. And if something takes…

API Gateway Limitations

As I’ve mentioned a couple times in the past, I’ve been working with Lambda and API Gateway . We’re using it to host/deploy a big app for a big client, as well as some of the ancillary tooling to support the app (such as testing/builds, scheduling, batch jobs, notifications, authentication services, etc.). For the most part, I love it. It’s helped evaporate the most…

Lambda payload size workaround

Another of the AWS Lambda + API Gateway limitations is in the size of the response body we can return. AWS states that the full payload size for API Gateway is 10 MB, and the request body payload size is 6 MB in Lambda. In practice, I’ve found this number to be significantly lower than 6 MB, but perhaps I’m just calculating incorrectly. Using a Flask route like this: @app.route (…

Zappa

For the past few months, I’ve been focused primarily on a Python project that we’re deploying without any servers. Well, of course that’s not really true, but we’re deploying it without any permanent servers. The idea of “serverless” architecture isn’t brand new, anymore, but running serverless applications on the AWS infrastructure —which I’ve…

DST pain

Tonight, in Montreal (and many other North American cities), we change from Standard Time to Daylight Time. I know we programmers complain about date/time math relentlessly, but I thought it was worth sharing this real-life problem that someone asked me about on Reddit this weekend: It sounds like this is a serious problem that has effected [sic] you on more than one occasion. Story? The simplest…

Vermont

I get asked, from time to time, what things I would recommend when visiting Vermont. Here’s my list. I’ll update it as I learn about new gems. Hill Farmstead Brewery Parker Pie (near HF) for pizza / bottles; they have a great tap list Willy’s Store in Greensboro for HF bottles and Jasper Hill cheeses (Moses Sleeper, Cabot Clothbound, Alpha Tolman, Harbison, … ) There’s a…

DNS for VMs

Previously we talked about using Vagrant at Fictive Kin and how we typically have many Virtual Machines (VMs) on the go at once. Addressing each of these VMs with a real hostname was proving to be difficult. We couldn’t just use the IP addresses of the machines because they’re unreasonably hard to remember, and other problems like browser cookies don’t work properly. In the past, I’ve managed this…

SSH: jump servers, MFA, Salt, and advanced configuration

Let’s take a short break from our discussion of Vagrant to talk about how we use SSH in production at Fictive Kin . Recently, I went on a working vacation to visit my family in New Brunswick (think: east of the eastern time zone in Canada). While there, I needed to log in to a few servers to check on a few processes. I’ve done this in past years, and am frequently away from my sort-of-static home…

Vagrant: Bootstrapping

In a previous post , we talked about why we use virtual machines, and Vagrant, at Fictive Kin . Now let’s get to how we do it. If you’re familiar with Virtual Machine based development environments that are set up through a configuration management (we use Salt , but you could use something different like Ansible , Puppet , Chef , etc.), this probably won’t seem all that new to you, but there are…

Vagrant: Why?

In a previous post , I mentioned that we — at Fictive Kin — over the past several years have managed to build a development environment that works pretty well, and that I’m proud of. When ( if ) everything is working properly, we can get a new team member — even one with little technical knowledge (though indeed a small amount is required) — up and running on a development environment within a few…

Revitalization Project

It’s been over three years since I’ve posted anything new to my blog. This saddens me. I miss writing. This is my own fault, of course, and there are reasons for my absence… Part of it is shifting interests and altered career focus. I’m still working with Fictive Kin , but these days I’m doing almost no PHP, and I spend my days (and sometimes nights) with operations/systems administration. We’re…

Affirmative Wager

There’s a very risky — but important — conversation that takes place in our community from time to time. It’s about gender and sexism. To be honest, I’m scared to write about this for fear that something I say might be twisted into a derogatory opinion that is not representative of the way I actually think and feel. I put this on Twitter, a while back: coates I am constantly terrified that — as a…

Web developer

Over the weekend, I saw a discussion on Twitter about a particular developer who is worried about his future as PHP becomes less the de facto platform for all web development, and he moves to other technologies. (These are my words, and my interpretation, not his.) This got me thinking about how I’ve recently gone through a similar change in how I think about my own career, and how I was in a…

MongoDB Elections

On Monday of this week, Amazon’s EC2 service suffered a major outage , which they call “performance issues”, which we all know is simply not true . This is not a post about how Amazon has failed us. Everyone goes down. We use AWS because it’s flexible, and we need the flexibility. This is a post about how Gimme Bar went down due to this outage, despite our intentions of making everything resilient…

Berliner Weiße

I think this is the first piece I’ve written on my blog that is tagged only “beer”; apologies to my readers who don’t care about such things ( there are feeds for PHP and Web as well, if you’d prefer to avoid the occasional post on beer geekery ). I love a good berliner weiße beer. For those of you that haven’t had the pleasure of enjoying a glass, it’s a very light and refreshing, sour and…

Deploy on push (from GitHub)

Continuous deployment is all the rage right now, and I applaud the use of systems that automate a task that seems way easier than it is . That said, sometimes you need something simple and straightforward: a hook that easily deploys a few pages, or a small application, all without often-complicated set up ( come on , this is a PHP-focused site, mostly). Sometimes, you just need to deploy code when…

Lexentity

A very long time ago (three and a half years ago), I wrote a little utility to help us with the 2008 edition of PHP Advent . The utility is called Lexentity , and my recent blogging uptake made me realize that I’ve never actually written about it on here, so here it is (mostly borrowed from the README). Let's face it--this sentence is much "uglier" than the one below it. Let’s face it–this…

Use `env`

We use quite a few technologies to build our products, but Gimme Bar is still primarily a PHP app. To support these apps, we have a number of command-line scripts that handle maintenance tasks, cron jobs, data migration jobs, data processing workers, etc. These scripts often run PHP in Gimme Bar land, and we make extensive use of the shebang syntax that uses common Unix practice of putting…

PHP as a templating language

There’s been quite a bit of talk, recently, in PHP-land about templates and the ramifications of enforcing “pure” PHP scripts by preventing scripts from entering HTML mode . I’m not quite sure how I feel about this RFC, but it got me thinking about the whole idea of using PHP for templating in modern web apps. For many years, I was a supporter of using PHP as a templating language to render HTML.…

Natural Load Testing

My friend Paul Reinheimer has put together an excellent product/service that is probably of use to many of you. The product is called Natural Load Testing , and it harnesses some of the machinery that powers the also-excellent wonderproxy and its extremely useful VPN service . The gist is that once you've been granted an account (they're in private beta right now, but tell them I sent you , and if…

Ideas of March

A year ago, I posted about Ideas of March , which Chris got rolling. In it, I pledged to blog more. Today, I am not so proud to say that I have mostly failed to do so. If I had to come up with a reason, I'd have to say that, personally, 2011 turned out a whole lot different than I was expecting, back then—and not in a good way. Over the last year, however, I did post a few things that I think were…

HTTP 1.0 and the Connection header

I have a long backlog of things to write about. One of those things is Varnish (more on that in a future post). So, over these Christmas holidays, while intentionally taking a break from real work , I decided to finally do some of the research required before I can really write about how Varnish is going to make your web apps much faster. To get some actual numbers, I broke out the Apache…

Aficionadoʼs Curse / Pessimistic Optimism

As I've mentioned in previous posts, I like beer . I mean, I really like it. I've tasted many unique , special , rare , and extremely old beers. I even have Beer Judging credentials. I would go as far as to say that I'm a "beer aficionado." I find the idea of a cheap, poorly-made beer (especially when there are superior alternatives on hand) to be almost repulsive. I know aficionados in other…

Webshell

Webshell is a console-based, JavaScripty web client utility that is great for consuming, debugging and interacting with APIs. I use Firefox as my primary browser. The main reason I've been faithful to Mozilla is my set of add-ons. I use Firebug regularly, and I'm not sure what I'd do without JSONovich . Last year, as I built Gimme Bar 's internal API, I found myself using curl , extensively, and…

Gimme Bar on MongoDB

I'm happy to report that Gimme Bar has been running very well on MongoDB since early February of this year. I previously posted on some of the reasons we decided to move off of CouchDB . If you haven't read that, please consider it a prerequisite for the consumption of this post. Late last year, I knew that we had no choice but to get off of CouchDB. I was dreading the port. The dread was…

Gimme Bar no longer on CouchDB

As mentioned in a previous post , we started building Gimme Bar a little over a year ago. We did a lot of things right, but we also did some things wrong. Since—in those early days—I was the only developer, and since most of my professional development experience is in PHP, that choice was obvious. I also started building the API before the front-end . I chose a really simple routing model for the…

PHP Community Conference

I was once told that "the only reason you're successful is that you were at the right place at the right time." Other than the word "only" in that declaration, the accuser was mostly right. The reason I'm [moderately] successful is that I was at the right place at the right time. The subtlety in the second statement is in the reason I was at the right place at the magical time.

Ideas of March

Around two weeks ago, Chris wrote a blog post that I responded to, and I was reminded of some of the great conversations that helped build our community. Many of these took place on the blogs of the aughts . coates We, the web community, used to have great conversations on blogs. Here's a chance again: http://j.mp/JSandURLs (Bonus: more than 140 chars.) Like Chris , I think we've lost a bit of…

Gimme Bar: One Year Old

Exactly one year ago, today, Gimme Bar was born. Gimme Bar has been the focus of my work for that entire time, and I haven't blogged about it ( much ). Ironically (sort of), I've been far too busy working on Gimme Bar to do much writing about Gimme Bar, but I thought it fitting to take a couple minutes to write a few words about it today. The elevator pitch for the project goes something like…

Post-Advent 2010

As I write this on Christmas Eve, Chris is putting the finishing touches on PHP Advent 2010 . A brief search of my site indicates that I haven't actually blogged about PHP Advent since 2007, when I was lucky enough to write the first article. That first year, Chris put the advent articles up on his blog (and we do intend to copy them over to phpadvent.org, eventually). Sensing that Chris had…

Remote pbcopy

I use the command line a lot. I'm sure many of you do, too. I find myself often piping things between processes: $ cat seancoates.com-access_log \ > | awk {'print $1'} \ > | sort \ > | uniq \ > | wc -l 627 $ # unique IPs One particularly useful tool on my Mac is the pbcopy utility, which takes standard input and puts it on the p aste b oard (this is known as the "clipboard" on some other systems).…

Brooklyn Beta

Last week, many of the Web's most influential developers and designers converged on a seemingly unremarkable art space (née factory for novelty invisible dog leashes) in Brooklyn for the first of what I hope will become a long-standing conference tradition: Brooklyn Beta . Despite having personally helped organize several other conferences in the past, Brooklyn Beta has easily earned a spot at the…

Arbitrary Incrementer in PHP

On several recent occasions I had a need for an incrementer that uses an arbitrary character set and I thought I'd share my code with you. I've used this code in the GPL Virus that I wrote to poke fun at the Wordpress/Thesis/GPL debacle , as well as in some clean up I'm doing for the extremely useful JS Bin project. The most important application, however, was in creating a URL shortening system…