Files are stored as <UPLOAD_DIR>/<id>/<filename>. The previous static serving attempted to serve <UPLOAD_DIR>/<id> (a directory) which failed. Custom /assets/:id route now looks up filename from DB and uses sendFile. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>