Known Limitations
Last updated
This page lists the current version's known issues in deployment, caching, and the API, with workarounds where they exist.
Deployment
| Issue | Impact | Workaround |
|---|---|---|
Dependencies are not locked, so a fresh install pulls @types/express 5.x and ts-node type-checking fails at GetFromPath.ts:55 with TS2339 (req.params.path is string | string[]) |
Starting through app.json with ts-node fails to compile and the service does not come up |
Install @types/express@^4, or set TS_NODE_TRANSPILE_ONLY=true |
Nginx sends /upload/, /del/, and / to nodejs:3000 while NODE_PORT is 8080 |
Upload, delete, and health check return 502 through Nginx |
Align the proxy_pass ports with NODE_PORT; see Nginx |
| The app has no authentication | Anyone who can reach the service can upload and delete | Enable Nginx allow / deny |
Caching
| Issue | Impact | Workaround |
|---|---|---|
On a cache hit, Content-Type follows the original extension, not the output format |
E.g. a.jpg?t=avif returns image/avif the first time, then AVIF bytes labelled image/jpeg |
Most browsers sniff the content and still render it; strict clients need a code fix |
The 404 image is served with HTTP 200 |
The Cloudflare Worker rewrites it to max-age=604800 and caches it, so an image uploaded later at the same path still shows the 404 image at the edge |
Upload filenames are random, so requesting before uploading is rare; purge the Cloudflare cache when needed |
| Deleting an original purges no cache | Converted variants stay available from cache/, Nginx, and Cloudflare |
Purge manually; see Caching Layers |
| Cache filenames use unnormalized parameters | ?w=800 vs ?w=800&q=75, and ?w=9000 beyond the original size, each create their own cache file |
Use one fixed parameter style in the frontend |
| The local cache has no expiry or size cap | storage/image/cache/ keeps growing |
Clean it periodically |
API
| Issue | Impact |
|---|---|
| A successful delete message includes the absolute server path | Exposes the deployment directory layout |
| Upload creates the folder before checking the type | A rejected upload still leaves an empty folder |
| The trash keeps only the last segment and uses the UTC date | Same-named files from different folders are told apart by _{timestamp}; record original paths yourself |
The Worker accepts only .jpg/.jpeg/.png/.webp/.svg |
PDFs cannot be fetched through the Worker |
Non-numeric (w=abc) or 0 parameters |
Return the 404 image instead of 400 |