{"id":28400556,"url":"https://github.com/liveui/s3","last_synced_at":"2025-11-01T04:04:23.125Z","repository":{"id":63916589,"uuid":"76037749","full_name":"LiveUI/S3","owner":"LiveUI","description":"S3 Client written in Swift","archived":false,"fork":false,"pushed_at":"2025-09-09T12:13:12.000Z","size":433,"stargazers_count":100,"open_issues_count":20,"forks_count":65,"subscribers_count":12,"default_branch":"master","last_synced_at":"2025-10-18T17:28:19.811Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Swift","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/LiveUI.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2016-12-09T13:29:20.000Z","updated_at":"2025-10-04T15:44:46.000Z","dependencies_parsed_at":"2023-01-14T13:45:14.243Z","dependency_job_id":null,"html_url":"https://github.com/LiveUI/S3","commit_stats":null,"previous_names":[],"tags_count":31,"template":false,"template_full_name":null,"purl":"pkg:github/LiveUI/S3","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LiveUI%2FS3","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LiveUI%2FS3/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LiveUI%2FS3/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LiveUI%2FS3/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/LiveUI","download_url":"https://codeload.github.com/LiveUI/S3/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LiveUI%2FS3/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":282092840,"owners_count":26612896,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-11-01T02:00:06.759Z","response_time":61,"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":[],"created_at":"2025-06-01T10:38:19.213Z","updated_at":"2025-11-01T04:04:23.119Z","avatar_url":"https://github.com/LiveUI.png","language":"Swift","funding_links":[],"categories":[],"sub_categories":[],"readme":"# S3Kit (Swift/Vapor 4)\n\nLightweight S3 client and signer for Swift (works great with Vapor 4).\n\n## Requirements\n\n- Swift 5.9+\n- macOS 12+\n\n## What’s Included\n\n- Signing headers (AWS SigV2 + SigV4)\n- Bucket listing, creation, deletion, and region discovery\n- Object list, upload (file/string), get, head (info), copy, move, delete\n- Error parsing to a simple internal `ErrorMessage` model\n\n## SwiftPM\n\n```swift\ndependencies: [\n    .package(url: \"https://github.com/LiveUI/S3.git\", from: \"4.0.0\")\n],\ntargets: [\n    .target(name: \"App\", dependencies: [\n        .product(name: \"Vapor\", package: \"vapor\"),\n        .product(name: \"S3Kit\", package: \"S3\")\n    ])\n]\n```\n\n## Quick Start\n\n```swift\nimport S3Kit\n\nlet config = S3Signer.Config(\n    accessKey: \"AKIA...\",\n    secretKey: \"...\",\n    region: .euCentral1\n)\nlet s3 = try S3(defaultBucket: \"my-bucket\", config: config)\n\n// Upload string\n_ = s3.put(string: \"hello\", destination: \"hello.txt\", on: req.eventLoop)\n\n// Fetch file\n_ = s3.get(file: \"hello.txt\", on: req.eventLoop)\n\n// Delete\n_ = s3.delete(file: \"hello.txt\", on: req.eventLoop)\n```\n\nTo use a custom MinIO endpoint:\n\n```swift\nlet config = S3Signer.Config(\n    accessKey: \"...\",\n    secretKey: \"...\",\n    region: Region(name: .usEast1, hostName: \"127.0.0.1:9000\", useTLS: false)\n)\n```\n\n## Public Surface (selected)\n\n- S3Kit – Extensions\n  - S3+ObjectInfo.swift\n    - get(acl file:headers:on:)\n    - get(fileInfo:headers:on:)\n    - get(fileInfo:on:)\n  - S3+Get.swift\n    - url(fileInfo:)\n    - get(file:headers:on:)\n    - get(file:on:)\n  - S3+Put.swift\n    - put(file:headers:on:)\n    - put(file:on:)\n    - put(file url:destination:access:on:)\n    - put(file path:destination:access:on:)\n    - put(file url:destination:bucket:access:on:)\n    - put(file path:destination:bucket:access:on:)\n  - Region+Tools.swift\n    - urlString(bucket:)\n    - url(bucket:)\n  - S3+Strings.swift\n    - put(string:mime:destination:bucket:access:on:)\n    - put(string:mime:destination:access:on:)\n    - put(string:destination:access:on:)\n    - put(string:mime:destination:on:)\n    - put(string:destination:on:)\n  - S3+Move.swift\n    - move(file:to:headers:on:)\n  - Error+S3.swift\n    - s3Error(), s3ErrorMessage(), s3ErrorCode()\n  - S3+Service.swift\n    - buckets(on:)\n  - S3+Delete.swift\n    - delete(file:headers:on:), delete(file:on:)\n  - S3+Bucket.swift\n    - location(bucket:on:), delete(bucket:region:on:), create(bucket:region:on:)\n  - S3+List.swift\n    - list(bucket:region:headers:on:), list(bucket:region:on:)\n  - S3+Copy.swift\n    - copy(file:to:headers:on:)\n\n- S3Kit – Protocols\n  - `S3Client` protocol and extension (same method set as above)\n\n- S3Kit – URL Builders\n  - URLBuilder.swift, S3URLBuilder.swift\n\n- S3Kit – Models\n  - Bucket.New, BucketsInfo, File.Upload/Location/Response/Info, Object, Owner\n\n## Notes on Errors\n\n- Custom external error frameworks were removed. Errors now use internal enums and simple `ErrorMessage` decoding for S3 responses. Helper methods on `Error` (`s3Error*`) are preserved for convenience.\n\n## Demo\n\nA small Vapor 4 demo exists under `Sources/S3DemoRun`.\n\nRun locally:\n\n```\nexport S3_ACCESS_KEY=yourKey\nexport S3_SECRET=yourSecret\nswift run S3DemoRun\n```\n\n## Build \u0026 Test\n\n```\nswift build\nswift test\n```\n\n## License\n\nSee the LICENSE file for more info.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fliveui%2Fs3","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fliveui%2Fs3","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fliveui%2Fs3/lists"}