mirror of
https://github.com/supabase/supabase.git
synced 2026-10-05 09:25:06 +03:00
Closes [DOCS-1289](https://linear.app/supabase/issue/DOCS-1289/get-the-linter-to-fix-what-it-flags-or-retirereplace-the-linter) Stacked on #50600, which points contributors at the authoring skills. Merge that one first. ## Problem Contributors experienced friction with the linter. They felt nickle and dimed for tiny nits and felt detracted from the work itself. PRs would become noisy with tiny one-word suggestions. Additionally, our homegrown linter is not very intelligent, causing frequent overrides. ## Solution This removes the linter entirely in favor of directing contributors to use SKILLS instead. The removal entails... - **CI.** Delete the three `docs_lint` workflows: the PR check, the external-PR comment companion, and the nightly `--fix` bot. Drop the stale `zizmor.yml` ignore entry for the deleted workflow. - **Tooling.** Delete `supa-mdx-lint.config.toml` and the 14 rule files. Drop the `lint:mdx` script and the `@supabase/supa-mdx-lint` dependency from docs, learn, and ui-library, and regenerate the lockfile. - **Content.** Remove the 181 directives. A separate commit carries Prettier's reformatting of the tables and blank lines those comments had suppressed, so the deletion commit stays readable. No prose changes. - **Style guide.** The word list states each rule directly instead of describing what the linter flagged. Every term survives, including the phrase groups that mirrored `Rule004ExcludeWords`. - **Skills.** `write-the-docs`, `edit-the-docs`, and `review-the-docs` drop `pnpm lint:mdx` from their self-review commands and check the word list directly. `ask-the-docs`'s CI reference drops both workflows. ## Manual testing 1. Run `git grep -i supa-mdx-lint -- . ':!pnpm-lock.yaml'`. No matches. 2. Run `pnpm install --frozen-lockfile --lockfile-only`. It passes, so the lockfile matches the three trimmed manifests. 3. Run `git diff master...HEAD --name-only --diff-filter=ACMR | grep -E '\.(md|mdx)$' | xargs npx prettier --config prettier.config.mjs --check`. All changed markdown passes. 4. Open the [reformatted filter table](https://docs-git-docs-retire-mdx-linter-supabase.vercel.app/docs/guides/observability/logs#filter-events) on the preview and compare it with [production](https://supabase.com/docs/guides/observability/logs#filter-events). The table renders the same. <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Documentation** * Documentation guidance now uses manual prose and terminology review with the shared word list. * Clarified storage configuration and common Realtime channel mistakes. * Improved table formatting, text wrapping, and selected reference links. * Updated documentation authoring and review guidance. * **Chores** * Retired automated MDX linting from workflows and local validation commands. * Removed lint-suppression markers throughout documentation without changing instructions. * Added targeted documentation review guidance for pull requests. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
60 lines
36 KiB
Plaintext
60 lines
36 KiB
Plaintext
---
|
|
id: 'storage-s3-compatibility'
|
|
title: 'S3 Compatibility'
|
|
description: 'Compatibility spec'
|
|
subtitle: 'Learn about the compatibility of Supabase Storage with S3.'
|
|
sidebar_label: 'S3'
|
|
---
|
|
|
|
Supabase Storage is compatible with the S3 protocol. You can use almost any S3 client to interact with your Storage objects (such as [Cyberduck](/partners/integrations/cyberduck)).
|
|
|
|
Storage supports [standard](/docs/guides/storage/uploads/standard-uploads), [resumable](/docs/guides/storage/uploads/resumable-uploads) and [S3 uploads](/docs/guides/storage/uploads/s3-uploads) and all these protocols are interoperable. You can upload a file with the S3 protocol and list it with the REST API or upload with Resumable uploads and list with S3.
|
|
|
|
Storage supports presigning a URL using query parameters. Specifically, Supabase Storage expects requests to be made using [AWS Signature Version 4](https://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-query-string-auth.html). To enable this feature, enable the S3 connection via S3 protocol in the Settings page for Supabase Storage.
|
|
|
|
<Admonition type="caution">
|
|
|
|
**S3 versioning is not supported.** Supabase Storage does not enable S3's versioning capabilities for buckets. Deleted objects are permanently removed and cannot be restored.
|
|
|
|
</Admonition>
|
|
|
|
## Implemented endpoints
|
|
|
|
The most commonly used endpoints are implemented, and more will be added. Implemented S3 endpoints are marked with ✅ in the following tables.
|
|
|
|
### Bucket operations
|
|
|
|
| API Name | Feature |
|
|
| ------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
| ✅ [ListBuckets](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListBuckets.html) | |
|
|
| ✅ [HeadBucket](https://docs.aws.amazon.com/AmazonS3/latest/API/API_HeadBucket.html) | ❌ Bucket Owner:<br/> ❌ x-amz-expected-bucket-owner |
|
|
| ✅ [CreateBucket](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateBucket.html) | ❌ ACL:<br/> ❌ x-amz-acl<br/> ❌ x-amz-grant-full-control<br/> ❌ x-amz-grant-read<br/> ❌ x-amz-grant-read-acp<br/> ❌ x-amz-grant-write<br/> ❌ x-amz-grant-write-acp<br/>❌ Object Locking:<br/> ❌ x-amz-bucket-object-lock-enabled<br/>❌ Bucket Owner:<br/> ❌ x-amz-expected-bucket-owner |
|
|
| ✅ [DeleteBucket](https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucket.html) | ❌ Bucket Owner:<br/> ❌ x-amz-expected-bucket-owner |
|
|
| ✅ [GetBucketLocation](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketLocation.html) | ❌ Bucket Owner:<br/> ❌ x-amz-expected-bucket-owner |
|
|
| ❌ [DeleteBucketCors](https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketCors.html) | ❌ Bucket Owner:<br/> ❌ x-amz-expected-bucket-owner |
|
|
| ❌ [GetBucketEncryption](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketEncryption.html) | ❌ Bucket Owner:<br/> ❌ x-amz-expected-bucket-owner |
|
|
| ❌ [GetBucketLifecycleConfiguration](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketLifecycleConfiguration.html) | ❌ Bucket Owner:<br/> ❌ x-amz-expected-bucket-owner |
|
|
| ❌ [GetBucketCors](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketCors.html) | ❌ Bucket Owner:<br/> ❌ x-amz-expected-bucket-owner |
|
|
| ❌ [PutBucketCors](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketCors.html) | ❌ Checksums:<br/> ❌ x-amz-sdk-checksum-algorithm<br/> ❌ x-amz-checksum-algorithm<br/>❌ Bucket Owner:<br/> ❌ x-amz-expected-bucket-owner |
|
|
| ❌ [PutBucketLifecycleConfiguration](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketLifecycleConfiguration.html) | ❌ Checksums:<br/> ❌ x-amz-sdk-checksum-algorithm<br/> ❌ x-amz-checksum-algorithm<br/>❌ Bucket Owner:<br/> ❌ x-amz-expected-bucket-owner |
|
|
|
|
### Object operations
|
|
|
|
| API Name | Feature |
|
|
| -------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
| ✅ [HeadObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_HeadObject.html) | ✅ Conditional Operations:<br/> ✅ If-Match<br/> ✅ If-Modified-Since<br/> ✅ If-None-Match<br/> ✅ If-Unmodified-Since<br/>✅ Range:<br/> ✅ Range (has no effect in HeadObject)<br/> ✅ partNumber<br/>❌ SSE-C:<br/> ❌ x-amz-server-side-encryption-customer-algorithm<br/> ❌ x-amz-server-side-encryption-customer-key<br/> ❌ x-amz-server-side-encryption-customer-key-MD5<br/>❌ Request Payer:<br/> ❌ x-amz-request-payer<br/>❌ Bucket Owner:<br/> ❌ x-amz-expected-bucket-owner |
|
|
| ✅ [ListObjects](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjects.html) | Query Parameters:<br/> ✅ delimiter<br/> ✅ encoding-type<br/> ✅ marker<br/> ✅ max-keys<br/> ✅ prefix<br/>❌ Request Payer:<br/> ❌ x-amz-request-payer<br/>❌ Bucket Owner:<br/> ❌ x-amz-expected-bucket-owner |
|
|
| ✅ [ListObjectsV2](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectsV2.html) | Query Parameters:<br/> ✅ list-type<br/> ✅ continuation-token<br/> ✅ delimiter<br/> ✅ encoding-type<br/> ✅ fetch-owner<br/> ✅ max-keys<br/> ✅ prefix<br/> ✅ start-after<br/>❌ Request Payer:<br/> ❌ x-amz-request-payer<br/>❌ Bucket Owner:<br/> ❌ x-amz-expected-bucket-owner |
|
|
| ✅ [GetObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html) | ✅ Conditional Operations:<br/> ✅ If-Match<br/> ✅ If-Modified-Since<br/> ✅ If-None-Match<br/> ✅ If-Unmodified-Since<br/>✅ Range:<br/> ✅ Range<br/> ✅ PartNumber<br/>❌ SSE-C:<br/> ❌ x-amz-server-side-encryption-customer-algorithm<br/> ❌ x-amz-server-side-encryption-customer-key<br/> ❌ x-amz-server-side-encryption-customer-key-MD5<br/>❌ Request Payer:<br/> ❌ x-amz-request-payer<br/>❌ Bucket Owner:<br/> ❌ x-amz-expected-bucket-owner |
|
|
| ✅ [PutObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html) | System Metadata:<br/> ✅ Content-Type<br/> ✅ Cache-Control<br/> ✅ Content-Disposition<br/> ✅ Content-Encoding<br/> ✅ Content-Language<br/> ✅ Expires<br/> ❌ Content-MD5<br/>❌ Object Lifecycle<br/>❌ Website:<br/> ❌ x-amz-website-redirect-location<br/>❌ SSE-C:<br/> ❌ x-amz-server-side-encryption<br/> ❌ x-amz-server-side-encryption-customer-algorithm<br/> ❌ x-amz-server-side-encryption-customer-key<br/> ❌ x-amz-server-side-encryption-customer-key-MD5<br/> ❌ x-amz-server-side-encryption-aws-kms-key-id<br/> ❌ x-amz-server-side-encryption-context<br/> ❌ x-amz-server-side-encryption-bucket-key-enabled<br/>❌ Request Payer:<br/> ❌ x-amz-request-payer<br/>❌ Tagging:<br/> ❌ x-amz-tagging<br/>❌ Object Locking:<br/> ❌ x-amz-object-lock-mode<br/> ❌ x-amz-object-lock-retain-until-date<br/> ❌ x-amz-object-lock-legal-hold<br/>❌ ACL:<br/> ❌ x-amz-acl<br/> ❌ x-amz-grant-full-control<br/> ❌ x-amz-grant-read<br/> ❌ x-amz-grant-read-acp<br/> ❌ x-amz-grant-write-acp<br/>❌ Bucket Owner:<br/> ❌ x-amz-expected-bucket-owner |
|
|
| ✅ [DeleteObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObject.html) | ❌ Multi-factor authentication:<br/> ❌ x-amz-mfa<br/>❌ Object Locking:<br/> ❌ x-amz-bypass-governance-retention<br/>❌ Request Payer:<br/> ❌ x-amz-request-payer<br/>❌ Bucket Owner:<br/> ❌ x-amz-expected-bucket-owner |
|
|
| ✅ [DeleteObjects](https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObjects.html) | ❌ Multi-factor authentication:<br/> ❌ x-amz-mfa<br/>❌ Object Locking:<br/> ❌ x-amz-bypass-governance-retention<br/>❌ Request Payer:<br/> ❌ x-amz-request-payer<br/>❌ Bucket Owner:<br/> ❌ x-amz-expected-bucket-owner |
|
|
| ✅ [ListMultipartUploads](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListMultipartUploads.html) | ✅ Query Parameters:<br/> ✅ delimiter<br/> ✅ encoding-type<br/> ✅ key-marker<br/> ✅️ max-uploads<br/> ✅ prefix<br/> ✅ upload-id-marker |
|
|
| ✅ [CreateMultipartUpload](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateMultipartUpload.html) | ✅ System Metadata:<br/> ✅ Content-Type<br/> ✅ Cache-Control<br/> ✅ Content-Disposition<br/> ✅ Content-Encoding<br/> ✅ Content-Language<br/> ✅ Expires<br/> ❌ Content-MD5<br/>❌ Website:<br/> ❌ x-amz-website-redirect-location<br/>❌ SSE-C:<br/> ❌ x-amz-server-side-encryption<br/> ❌ x-amz-server-side-encryption-customer-algorithm<br/> ❌ x-amz-server-side-encryption-customer-key<br/> ❌ x-amz-server-side-encryption-customer-key-MD5<br/> ❌ x-amz-server-side-encryption-aws-kms-key-id<br/> ❌ x-amz-server-side-encryption-context<br/> ❌ x-amz-server-side-encryption-bucket-key-enabled<br/>❌ Request Payer:<br/> ❌ x-amz-request-payer<br/>❌ Tagging:<br/> ❌ x-amz-tagging<br/>❌ Object Locking:<br/> ❌ x-amz-object-lock-mode<br/> ❌ x-amz-object-lock-retain-until-date<br/> ❌ x-amz-object-lock-legal-hold<br/>❌ ACL:<br/> ❌ x-amz-acl<br/> ❌ x-amz-grant-full-control<br/> ❌ x-amz-grant-read<br/> ❌ x-amz-grant-read-acp<br/> ❌ x-amz-grant-write-acp<br/>❌ Storage class:<br/> ❌ x-amz-storage-class<br/>❌ Bucket Owner:<br/> ❌ x-amz-expected-bucket-owner |
|
|
| ✅ [CompleteMultipartUpload](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html) | ❌ Bucket Owner:<br/> ❌ x-amz-expected-bucket-owner<br/>❌ Request Payer:<br/> ❌ x-amz-request-payer |
|
|
| ✅ [AbortMultipartUpload](https://docs.aws.amazon.com/AmazonS3/latest/API/API_AbortMultipartUpload.html) | ❌ Request Payer:<br/> ❌ x-amz-request-payer |
|
|
| ✅ [CopyObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html) | ✅ Operation Metadata:<br/> ⚠️ x-amz-metadata-directive<br/>✅ System Metadata:<br/> ✅ Content-Type<br/> ✅ Cache-Control<br/> ✅ Content-Disposition<br/> ✅ Content-Encoding<br/> ✅ Content-Language<br/> ✅ Expires<br/>✅ Conditional Operations:<br/> ✅ x-amz-copy-source<br/> ✅ x-amz-copy-source-if-match<br/> ✅ x-amz-copy-source-if-modified-since<br/> ✅ x-amz-copy-source-if-none-match<br/> ✅ x-amz-copy-source-if-unmodified-since<br/>❌ ACL:<br/> ❌ x-amz-acl<br/> ❌ x-amz-grant-full-control<br/> ❌ x-amz-grant-read<br/> ❌ x-amz-grant-read-acp<br/> ❌ x-amz-grant-write-acp<br/>❌ Website:<br/> ❌ x-amz-website-redirect-location<br/>❌ SSE-C:<br/> ❌ x-amz-server-side-encryption<br/> ❌ x-amz-server-side-encryption-customer-algorithm<br/> ❌ x-amz-server-side-encryption-customer-key<br/> ❌ x-amz-server-side-encryption-customer-key-MD5<br/> ❌ x-amz-server-side-encryption-aws-kms-key-id<br/> ❌ x-amz-server-side-encryption-context<br/> ❌ x-amz-server-side-encryption-bucket-key-enabled<br/> ❌ x-amz-copy-source-server-side-encryption-customer-algorithm<br/> ❌ x-amz-copy-source-server-side-encryption-customer-key<br/> ❌ x-amz-copy-source-server-side-encryption-customer-key-MD5<br/>❌ Request Payer:<br/> ❌ x-amz-request-payer<br/>❌ Tagging:<br/> ❌ x-amz-tagging<br/> ❌ x-amz-tagging-directive<br/>❌ Object Locking:<br/> ❌ x-amz-object-lock-mode<br/> ❌ x-amz-object-lock-retain-until-date<br/> ❌ x-amz-object-lock-legal-hold<br/>❌ Bucket Owner:<br/> ❌ x-amz-expected-bucket-owner<br/> ❌ x-amz-source-expected-bucket-owner<br/>❌ Checksums:<br/> ❌ x-amz-checksum-algorithm |
|
|
| ✅ [UploadPart](https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPart.html) | ✅ System Metadata:<br/>❌ Content-MD5<br/>❌ SSE-C:<br/> ❌ x-amz-server-side-encryption<br/> ❌ x-amz-server-side-encryption-customer-algorithm<br/> ❌ x-amz-server-side-encryption-customer-key<br/> ❌ x-amz-server-side-encryption-customer-key-MD5<br/>❌ Request Payer:<br/> ❌ x-amz-request-payer<br/>❌ Bucket Owner:<br/> ❌ x-amz-expected-bucket-owner |
|
|
| ✅ [UploadPartCopy](https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html) | ❌ Conditional Operations:<br/> ❌ x-amz-copy-source<br/> ❌ x-amz-copy-source-if-match<br/> ❌ x-amz-copy-source-if-modified-since<br/> ❌ x-amz-copy-source-if-none-match<br/> ❌ x-amz-copy-source-if-unmodified-since<br/>✅ Range:<br/> ✅ x-amz-copy-source-range<br/>❌ SSE-C:<br/> ❌ x-amz-server-side-encryption-customer-algorithm<br/> ❌ x-amz-server-side-encryption-customer-key<br/> ❌ x-amz-server-side-encryption-customer-key-MD5<br/> ❌ x-amz-copy-source-server-side-encryption-customer-algorithm<br/> ❌ x-amz-copy-source-server-side-encryption-customer-key<br/> ❌ x-amz-copy-source-server-side-encryption-customer-key-MD5<br/>❌ Request Payer:<br/> ❌ x-amz-request-payer<br/>❌ Bucket Owner:<br/> ❌ x-amz-expected-bucket-owner<br/> ❌ x-amz-source-expected-bucket-owner |
|
|
| ✅ [ListParts](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListParts.html) | Query Parameters:<br/> ✅ max-parts<br/> ✅ part-number-marker<br/>❌ Request Payer:<br/> ❌ x-amz-request-payer<br/>❌ Bucket Owner:<br/> ❌ x-amz-expected-bucket-owner |
|