[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-81567":3},{"id":4,"name":5,"fullName":6,"owner":5,"repo":5,"description":7,"homepage":8,"htmlUrl":9,"language":10,"languages":9,"totalLinesOfCode":9,"stars":11,"forks":12,"watchers":13,"openIssues":14,"contributorsCount":12,"subscribersCount":12,"size":12,"stars1d":14,"stars7d":15,"stars30d":15,"stars90d":12,"forks30d":12,"starsTrendScore":16,"compositeScore":17,"rankGlobal":9,"rankLanguage":9,"license":18,"archived":19,"fork":19,"defaultBranch":20,"hasWiki":19,"hasPages":21,"topics":22,"createdAt":9,"pushedAt":9,"updatedAt":29,"readmeContent":30,"aiSummary":31,"trendingCount":12,"starSnapshotCount":12,"syncStatus":32,"lastSyncTime":33,"discoverSource":34},81567,"bucketdock","bucketdock\u002Fbucketdock","BucketDock - native macOS desktop browser for S3-compatible object storage","https:\u002F\u002Fbucketdock.com",null,"TypeScript",32,0,24,1,8,3,46.8,"Apache License 2.0",false,"main",true,[23,24,25,26,27,28],"amazon-s3","clouflare-r2","s3","s3-browser","s3-bucket","s3-upload","2026-06-12 04:01:34","# \u003Cimg src=\"src-tauri\u002Ficons\u002F32x32.png\" alt=\"BucketDock icon\" width=\"32\" height=\"32\" \u002F> BucketDock\n\n**BucketDock — your S3 browser, on your macOS desktop.**\n\nBucketDock is built for AWS S3, Cloudflare R2, Hetzner Object Storage, and other S3-compatible providers when you want a desktop UI instead of the CLI or a browser dashboard.\n\n\u003Cimg src=\"bucketdock-app-screenshot.png\" alt=\"BucketDock application screenshot\"\u002F>\n\u003Cimg src=\"bucketdock-files-copy-screenshot.png\" alt=\"BucketDock application files\u002Ffolders copy screenshot\"\u002F>\n\n## macOS notice\n\nThis is an unsigned developer-preview build. It is not signed with Apple Developer ID and is not notarized.\n\nmacOS may say: \"the app is damaged or cannot be opened\". To run it:\n\n```bash\nxattr -dr com.apple.quarantine \u002FApplications\u002FBucketDock.app\nopen \u002FApplications\u002FBucketDock.app\n```\n\nFor screenshots and step-by-step first-launch help, see the\n[download and install guide](https:\u002F\u002Fbucketdock.com\u002Finstall.html).\n\n### macOS Gatekeeper note\n\nCurrent builds are ad-hoc signed but not Apple-notarized. macOS may block them after download. This is expected for early developer-preview builds.\n\nOfficial signed and notarized builds are planned later.\n\n## Implemented Features\n\n### Connections\n\n- Multiple saved connections\n- Providers: AWS S3, Cloudflare R2, Hetzner Object Storage, generic S3-compatible endpoints\n- Connection testing from the UI\n- Optional fixed bucket list for scoped credentials\n- Edit and delete connection profiles\n\n### Bucket And Object Browsing\n\n- Bucket sidebar per connection\n- Folder-like navigation over object prefixes\n- Folder rows have a Finder-style disclosure triangle (>) that expands the folder inline and lists its children indented under the parent — without navigating into the folder\n- Multi-select in the current listing\n- Context menus for common actions\n- Empty states and loading skeletons\n- Inline filter box in the toolbar (case-insensitive substring match)\n- Sortable columns: Name, Type, Storage Class, Size, Modified\n- The Name column is resizable so long filenames and folder names do not force the table wider than needed\n- Type column shows the real `Content-Type` returned by the server (fetched via batched HEAD requests after the listing loads); it falls back to the default S3 type (`application\u002Foctet-stream` for files, `—` for folders) until the HEAD response arrives\n- Per-row actions menu (…) for keyboard- and mouse-friendly access\n- Modified column shows a short relative time with a full timestamp on hover\n- Right-pane Finder-style bucket grid when a connection is selected without a bucket\n\n### Object Operations\n\n- Upload files\n- Upload folders recursively\n- Drag-and-drop file upload into the current prefix\n- Download a file\n- Download multiple selected items\n- Download folders recursively\n- Create folder placeholder objects\n- Rename objects (use a slash to move into a sub-prefix in the same bucket, e.g. `images\u002Fphoto.jpg`)\n- Rename \u002F move folders (copy-and-delete across an entire prefix)\n- Delete single objects\n- Delete multiple selected objects\n- Delete prefixes recursively\n- Delete confirmation lists every item that will be removed\n- Open a file through a presigned URL\n- Inline preview for images, audio, video, PDFs, and text files\n- Copy files between buckets, including across different connections and providers\n- Copy whole folders between buckets (recursive multi-file copy)\n- Move files and folders between buckets (copy-then-delete-source, where each\n  source is removed only after its own copy completes — partial \u002F failed \u002F\n  cancelled transfers leave the source untouched)\n- Copy \u002F Move destination picker with a folder tree, lazy-expanded children\n  on click, and an inline \"New Folder\" action so you can carve out a fresh\n  destination without leaving the dialog\n- Calculate folder size recursively across all nested subfolders — either from the folder context menu (\"Folder Size\") or by clicking the `—` in the Size column of any folder row\n\n### Transfer Queue\n\n- Background queue for uploads, downloads, and bucket-to-bucket copies\n- Per-transfer status (running, done, failed, cancelled)\n- Live progress bar for uploads (per-part for multipart), downloads, and copies\n- Cancel a running transfer\n- Retry a failed transfer\n- Dock at the bottom-right with collapse and clear-finished actions\n\n### Metadata\n\n- View object size, modified time, ETag, storage class, and key\n- Dedicated \"Get Info\" view (read-only) and a separate \"Edit Headers\" editor\n- Edit Content-Type\n- Edit Cache-Control\n- Edit Content-Disposition\n- Edit Content-Encoding\n- Edit Content-Language\n- Edit custom user metadata\n\n### Desktop Behavior\n\n- Native macOS window via Tauri\n- Native macOS application menu (File, Edit, View, Window, Help) with standard ⌘ accelerators and links to website \u002F docs \u002F GitHub\n- Window draggable from the titlebar zone\n- Native file and directory pickers\n- macOS Keychain secret storage\n- Light and dark appearance support\n- Persistent sidebar width\n- Persistent selected connection, bucket, and prefix state\n- Friendly error messages on connection test \u002F save (recognises `AccessDenied`, `SignatureDoesNotMatch`, `InvalidAccessKeyId`, `NoSuchBucket`, network failures)\n\n## Not Implemented Yet\n\nThe following items are not implemented in the current codebase and should not be treated as shipped features:\n\n- object tags\n- Finder reveal or open-downloaded-file action\n- bucket policy inspection\n\n## Keyboard Shortcuts\n\nCurrent object browser shortcuts:\n\n- `Delete` or `Backspace` with a selection: delete selected items\n- `Enter` with one selected folder: open that folder\n- `Cmd+A` or `Ctrl+A`: select all visible items\n- `Cmd+I` or `Ctrl+I`: open info for one selected file\n\n## Architecture\n\nBucketDock uses a split desktop architecture:\n\n```text\nNext.js frontend\n  -> Tauri command bridge\n    -> Rust backend\n      -> AWS SDK for S3 \u002F R2 \u002F Hetzner \u002F compatible providers\n```\n\nThe frontend never talks directly to S3.\n\nAll storage requests are executed by the Rust backend through Tauri commands. That keeps request signing logic and secrets out of the browser runtime.\n\n## Local Data And Secrets\n\nConnection metadata is stored in:\n\n```text\n~\u002FLibrary\u002FApplication Support\u002FBucketDock\u002Fconnections.json\n```\n\nStored there:\n\n- connection name\n- provider\n- endpoint\n- region\n- access key id\n- optional bucket list\n\nSecret access keys are stored separately in the macOS Keychain under the service name:\n\n```text\ncom.bucketdock.app\n```\n\nIf a connection was created before native Keychain persistence was enabled, edit that connection, enter the Secret Access Key again, and save it once so the secret is written into the macOS Keychain.\n\n## Development\n\n### Prerequisites\n\n- macOS\n- Node.js\n- pnpm\n- Rust\n- Tauri prerequisites for macOS\n\nTauri setup instructions:\n\nhttps:\u002F\u002Ftauri.app\u002Fstart\u002Fprerequisites\u002F\n\n### Install Dependencies\n\n```bash\npnpm install\n```\n\n### Run The Desktop App\n\n```bash\npnpm tauri dev\n```\n\nThis starts the Next.js frontend on port `1420` and launches the Tauri shell.\n\n### Run Only The Frontend\n\n```bash\npnpm dev --port 1420\n```\n\nThis is useful for UI work, but storage operations require the Tauri shell and Rust backend.\n\n### Build\n\n```bash\npnpm tauri build\n```\n\nThe Next.js frontend is exported to `out\u002F`, and Tauri bundles the macOS app from there.\n\nBuild artifacts are written under:\n\n```text\nsrc-tauri\u002Ftarget\u002Frelease\u002Fbundle\u002F\n```\n\n### Useful Backend Check\n\n```bash\ncargo check --manifest-path src-tauri\u002FCargo.toml\n```\n\n### Tests\n\nThe project ships two suites that both run in CI before any release build:\n\n```bash\n# Frontend unit tests (Vitest + jsdom): IPC bridge, app store, copy-to\n# self-overwrite guard, MIME helper, secret-leak invariants.\npnpm test\n\n# Backend unit tests (Rust): connection metadata round-trip, validation,\n# bucket-filter parsing, S3 key percent-encoding, rename_prefix edges,\n# keychain service \u002F bundle account constants.\ncargo test --manifest-path src-tauri\u002FCargo.toml\n```\n\n## Provider Setup\n\n### AWS S3\n\nTypical AWS S3 setup:\n\n```text\nProvider: AWS S3\nRegion: eu-central-1\nEndpoint: leave empty\nBuckets: leave empty to auto-list, or set one or more names\n```\n\n### Cloudflare R2\n\nUse the account endpoint and keep the bucket name separate.\n\nStandard R2 setup:\n\n```text\nProvider: Cloudflare R2\nEndpoint: https:\u002F\u002F\u003CACCOUNT_ID>.r2.cloudflarestorage.com\nRegion: auto\nBuckets: your-bucket-name\n```\n\nIf you have access to more than one bucket, the `Buckets` field can contain a comma-, space-, newline-, or semicolon-separated list.\n\nImportant rules:\n\n- Do not append the bucket name to the endpoint URL\n- Keep region set to `auto`\n- For bucket-scoped credentials, enter the exact bucket name in the `Buckets` field\n- For jurisdiction-specific R2 endpoints, paste the full endpoint manually\n\nCorrect:\n\n```text\nEndpoint: https:\u002F\u002F\u003CACCOUNT_ID>.r2.cloudflarestorage.com\nBuckets: media-assets\nRegion: auto\n```\n\nIncorrect:\n\n```text\nEndpoint: https:\u002F\u002F\u003CACCOUNT_ID>.r2.cloudflarestorage.com\u002Fmedia-assets\nBuckets: media-assets\nRegion: auto\n```\n\n### Generic S3-Compatible Providers\n\nExample:\n\n```text\nProvider: S3-Compatible\nEndpoint: https:\u002F\u002Fs3.example.com\nRegion: us-east-1\nBuckets: my-bucket\n```\n\n### Hetzner Object Storage\n\nExample:\n\n```text\nProvider: Hetzner Object Storage\nEndpoint: https:\u002F\u002Ffsn1.your-objectstorage.com\nRegion: hidden in the form\nBuckets: my-bucket\n```\n\n## Troubleshooting Cloudflare R2\n\n### SignatureDoesNotMatch\n\nIf opening a bucket fails with an error like:\n\n```text\nFailed to list objects: S3 error: service error: unhandled error (SignatureDoesNotMatch)\n```\n\ncheck the following first:\n\n1. The endpoint must be the account endpoint, not an endpoint with the bucket appended.\n2. The region must be exactly `auto`.\n3. The bucket name must be entered separately in the `Buckets` field.\n4. If the credentials are scoped to one specific bucket, that bucket must be listed explicitly.\n5. Remove any trailing spaces from endpoint, access key id, bucket name, and secret.\n\nFor bucket-scoped R2 credentials, BucketDock skips the account-wide `ListBuckets` call and uses the configured bucket names directly.\n\n### Saved Connection Works Only While Editing\n\nIf typing the secret into the edit form makes `Test` pass, but testing the saved connection fails, the saved secret is missing. Open `Edit Connection`, enter the Secret Access Key again, and click `Save` so BucketDock can write it into the macOS Keychain.\n\n## License\n\nBucketDock source code is licensed under the Apache License, Version 2.0.\n\nSee [LICENSE](.\u002FLICENSE) for details.\n\nThe BucketDock name, logo, icon, domain, and official release assets are not licensed for use in a way that suggests endorsement by the official project.\n","BucketDock 是一款专为 macOS 设计的桌面浏览器，用于访问 S3 兼容的对象存储服务。其核心功能包括多连接管理、支持 AWS S3、Cloudflare R2 和 Hetzner Object Storage 等多种提供商，以及文件和文件夹的上传下载、重命名等操作。技术上，BucketDock 采用 TypeScript 开发，提供了直观的图形界面，用户可以方便地浏览桶内的对象，并进行多选、排序、过滤等操作。适合需要通过桌面应用程序而非命令行或网页控制台来管理和操作 S3 存储的用户使用。",2,"2026-06-11 04:05:32","CREATED_QUERY"]