{"id":50288348,"url":"https://github.com/codewithveek/fluxmedia","last_synced_at":"2026-05-28T04:01:10.698Z","repository":{"id":335606384,"uuid":"1145139940","full_name":"codewithveek/fluxmedia","owner":"codewithveek","description":"A TypeScript-first media management library that provides a unified API for uploading, managing, and serving media across multiple cloud providers (Cloudinary, AWS S3, Cloudflare R2, and more).","archived":false,"fork":false,"pushed_at":"2026-03-06T08:23:10.000Z","size":874,"stargazers_count":3,"open_issues_count":2,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-13T21:10:56.334Z","etag":null,"topics":["assets-management","cloudinary","image","image-manipulation","image-processing","media","r2","s3","sdk","typescript","video","video-processing"],"latest_commit_sha":null,"homepage":"https://fluxmedia.dev","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/codewithveek.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-01-29T13:28:46.000Z","updated_at":"2026-03-06T08:23:14.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/codewithveek/fluxmedia","commit_stats":null,"previous_names":["darkcodewrangler/fluxmedia","codewithveek/fluxmedia"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/codewithveek/fluxmedia","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/codewithveek%2Ffluxmedia","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/codewithveek%2Ffluxmedia/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/codewithveek%2Ffluxmedia/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/codewithveek%2Ffluxmedia/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/codewithveek","download_url":"https://codeload.github.com/codewithveek/fluxmedia/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/codewithveek%2Ffluxmedia/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33593400,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-05-28T02:00:06.440Z","response_time":99,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["assets-management","cloudinary","image","image-manipulation","image-processing","media","r2","s3","sdk","typescript","video","video-processing"],"created_at":"2026-05-28T04:01:03.453Z","updated_at":"2026-05-28T04:01:10.692Z","avatar_url":"https://github.com/codewithveek.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# FluxMedia\n\n\u003cp align=\"left\"\u003e\n  \u003cimg src=\"./webapp/public/fluxmedia-logo.svg\" alt=\"FluxMedia logo\" width=\"260\" /\u003e\n\u003c/p\u003e\n\n**One API for all your media uploads.**\n\nA unified, TypeScript-first media library for modern applications. Upload to Cloudinary, S3, R2, and more with a single interface.\n\n## Features\n\n- **Unified API** - Write once, use any provider\n- **Type-safe** - Full TypeScript support with intelligent autocomplete\n- **Tree-shakeable** - Only bundle what you use\n- **React integration** - Hooks and components included\n- **Extensible** - Plugin system and native provider API access\n- **Lightweight** - Lazy loading and dynamic imports for minimal bundle size\n\n## Quick Start\n\n```bash\n# Install core + provider\npnpm add @fluxmedia/core @fluxmedia/cloudinary cloudinary\n```\n\n```typescript\nimport { MediaUploader } from '@fluxmedia/core';\nimport { CloudinaryProvider } from '@fluxmedia/cloudinary';\n\nconst uploader = new MediaUploader(\n  new CloudinaryProvider({\n    cloudName: 'your-cloud',\n    apiKey: 'your-key',\n    apiSecret: 'your-secret',\n  })\n);\n\nconst result = await uploader.upload(file, {\n  folder: 'avatars',\n  transformation: {\n    width: 400,\n    height: 400,\n    fit: 'cover',\n    format: 'webp',\n  },\n});\n\nconsole.log(result.url);\n```\n\n## Packages\n\n| Package                                        | Description                 | Size  |\n| ---------------------------------------------- | --------------------------- | ----- |\n| [@fluxmedia/core](./packages/core)             | Core types and abstractions | ~13KB |\n| [@fluxmedia/cloudinary](./packages/cloudinary) | Cloudinary provider         | ~14KB |\n| [@fluxmedia/s3](./packages/s3)                 | AWS S3 provider             | ~11KB |\n| [@fluxmedia/r2](./packages/r2)                 | Cloudflare R2 provider      | ~12KB |\n| [@fluxmedia/plugins](./packages/plugins)       | Official plugins            | ~20KB |\n| [@fluxmedia/react](./packages/react)           | React hooks and components  | ~9KB  |\n\n## Why FluxMedia?\n\n### Unified API Across Providers\n\nUse the same code regardless of which provider you choose:\n\n```typescript\n// Cloudinary\nconst uploader = new MediaUploader(new CloudinaryProvider({ ... }));\n\n// S3\nconst uploader = new MediaUploader(new S3Provider({ ... }));\n\n// R2\nconst uploader = new MediaUploader(new R2Provider({ ... }));\n\n// Use the same API everywhere\nawait uploader.upload(file);\n```\n\n### TypeScript First\n\nFull type safety and IntelliSense support:\n\n```typescript\nconst result = await uploader.upload(file);\n// result.url - autocomplete knows all properties\n// result.width, result.height, result.format, etc.\n```\n\n### Lightweight Bundles\n\nTree-shakeable architecture with lazy loading:\n\n- **Core**: ~13KB (minified, excludes SDK)\n- **Provider packages**: ~11-14KB each (excludes SDK)\n- **Plugins**: ~20KB (all 5 plugins)\n\n## Examples\n\n- [Basic Node.js](./examples/basic-node) - All providers, plugins, and core features\n- [Next.js App](./examples/nextjs-app) - Full Next.js integration with all providers\n\n## React Integration\n\n```bash\npnpm add @fluxmedia/react\n```\n\n```typescript\nimport { useMediaUpload } from '@fluxmedia/react';\n\nfunction UploadButton() {\n  const { upload, uploading, progress, error, result } = useMediaUpload({\n    mode: 'signed',\n    signUrlEndpoint: '/api/media/sign'\n  });\n\n  return (\n    \u003cdiv\u003e\n      \u003cinput\n        type=\"file\"\n        onChange={(e) =\u003e upload(e.target.files?.[0])}\n        disabled={uploading}\n      /\u003e\n      {uploading \u0026\u0026 \u003cprogress value={progress} max={100} /\u003e}\n      {result \u0026\u0026 \u003cimg src={result.url} alt=\"Uploaded\" /\u003e}\n      {error \u0026\u0026 \u003cdiv\u003eError: {error.message}\u003c/div\u003e}\n    \u003c/div\u003e\n  );\n}\n```\n\n## Plugins\n\n```bash\npnpm add @fluxmedia/plugins\n```\n\nAvailable plugins:\n\n- **File Validation** - Validate types, sizes, extensions\n- **Image Optimization** - Resize, format, quality (requires sharp)\n- **Metadata Extraction** - EXIF, dimensions, hashing\n- **Analytics** - Logging and tracking with typed events\n- **Retry** - Automatic retry with exponential backoff\n\n## Provider Feature Comparison\n\n| Feature               | Cloudinary | S3  | R2  |\n| --------------------- | ---------- | --- | --- |\n| Image Transformations | Yes        | No  | No  |\n| Video Processing      | Yes        | No  | No  |\n| AI Tagging            | Yes        | No  | No  |\n| Multipart Upload      | Yes        | Yes | Yes |\n| Direct Upload         | Yes        | Yes | Yes |\n\n## Development\n\n```bash\n# Install dependencies\npnpm install\n\n# Build all packages\npnpm build\n\n# Run tests\npnpm test\n\n# Lint\npnpm lint\n```\n\n## Contributing\n\nWe welcome contributions! Please see [CONTRIBUTING.md](./CONTRIBUTING.md) for details.\n\n## License\n\nMIT © FluxMedia Contributors\n\n---\n\n**Built with TypeScript**\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcodewithveek%2Ffluxmedia","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcodewithveek%2Ffluxmedia","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcodewithveek%2Ffluxmedia/lists"}