Wow. It's one thing to create value on top of one of the most respected open source projects in a field, it's quite another to bash it as the opening sentence of your blog post.
It really rubs me the wrong way.
Your NodeJS example shows a tenant table and a join using tenant id.
> SELECT tenants.name, title, estimate, complete FROM todos join tenants on tenants.id = todos.tenant_id;
How is this any different? Did it automatically setup RLS?
Use a single database and RLS + session id to ensure queries already come filtered for that tenant without the need to add "where tenant_id = ?" around the application layer.