# Atomic facts for FRE-31 - { type: task, id: FRE-31, title: "Implement File Upload with S3/minio Storage", status: done, completed_on: "2026-03-09", assignee: Atlas, priority: high, } - { type: feature, name: file_upload, storage_backend: s3_minio, fallback: in_memory_mock, } - { type: constraint, name: max_file_size, value: 104857600, unit: bytes, display: "100MB", } - { type: constraint, name: allowed_extensions, values: [".epub", ".pdf", ".mobi"], } - { type: package, name: "@aws-sdk/client-s3", version: "^3.1004.0" } - { type: package, name: "@aws-sdk/lib-storage", version: "^3.1004.0" } - { type: package, name: "@aws-sdk/s3-request-presigner", version: "^3.1004.0" } - { type: endpoint, path: "/api/jobs", method: POST, handles: ["multipart/form-data", "application/json"], } - { type: module, path: "/home/mike/code/AudiobookPipeline/web/src/server/storage.js", functions: [ uploadFile, getFileUrl, deleteFile, getUploadUrl, initiateMultipartUpload, uploadPart, completeMultipartUpload, abortMultipartUpload, storeFileMetadata, ], }