Cursed knowledge we have learned as a result of building Immich that we wish we never knew.
Zitadel Actions are cursed
Zitadel is cursed because its custom scripting feature is executed with a JS engine that doesn't support regex named capture groups.
Entra is cursed
Microsoft Entra supports PKCE, but doesn't include it in its OpenID discovery document. This leads to clients thinking PKCE isn't available.
Image dimensions in EXIF metadata are cursed
The dimensions in EXIF metadata can be different from the actual dimensions of the image, causing issues with cropping and resizing.
YAML whitespace is cursed
YAML whitespaces are often handled in unintuitive ways.
Hidden files in Windows are cursed
Hidden files in Windows cannot be opened with the "w" flag. That, combined with SMB option "hide dot files" leads to a lot of confusion.
Carriage returns in bash scripts are cursed
Git can be configured to automatically convert LF to CRLF on checkout and CRLF breaks bash scripts.
Fetch inside Cloudflare Workers is cursed
Fetch requests in Cloudflare Workers use http by default, even if you explicitly specify https, which can often cause redirect loops.
GPS sharing on mobile is cursed
Some phones will silently strip GPS data from images when apps without location permission try to access them.
PostgreSQL NOTIFY is cursed
PostgreSQL does everything in a transaction, including NOTIFY. This means using the socket.io postgres-adapter writes to WAL every 5 seconds.
npm scripts are cursed
npm scripts make a http call to the npm registry each time they run, which means they are a terrible way to execute a health check.
50 extra packages are cursed
There is a user in the JavaScript community who goes around adding "backwards compatibility" to projects. They do this by adding 50 extra package dependencies to your project, which are maintained by them.
Long passwords are cursed
The bcrypt implementation only uses the first 72 bytes of a string. Any characters after that are ignored.
JavaScript Date objects are cursed
JavaScript date objects are 1 indexed for years and days, but 0 indexed for months.
ESM imports are cursed
Prior to Node.js v20.8 using --experimental-vm-modules in a CommonJS project that imported an ES module that imported a CommonJS modules would create a segfault and crash Node.js
PostgreSQL parameters are cursed
PostgresSQL has a limit of 65,535 parameters, so bulk inserts can fail with large datasets.
Secure contexts are cursed
Some web features like the clipboard API only work in "secure contexts" (ie. https or localhost)
TypeORM deletes are cursed
The remove implementation in TypeORM mutates the input, deleting the id property from the original object.