Bring an existing S3-compatible bucket into Brimble Object Storage. Runs in the background, no proxying through your laptop.
Brimble’s migration flow pulls objects from any S3-compatible source bucket into a Brimble bucket. The copy runs server-side, so you don’t proxy bytes through your laptop or your local network.
Source endpoint (leave blank for AWS S3, otherwise the source provider’s S3 endpoint URL).
Access key id and Secret access key with read access on the source.
Source prefix (optional), e.g. legacy/2024/.
Destination prefix (optional), e.g. imported/.
Click Start migration.
The migration is queued; the next page shows live progress.
The migration credentials are temporary. Brimble holds the source credentials only for the duration of the migration and discards them when the job ends (success, failure, or cancel). Even so, scope the source credentials to read-only and rotate them on the source side once the migration completes.
Open the migration detail page and click Cancel. The job stops at the next object boundary; any objects already copied stay in the destination bucket.Cancellation isn’t a rollback. To undo a partial migration, delete the imported objects from the destination bucket manually (the Objects tab has bulk delete).
Object data, content type, and standard metadata. Custom user-defined metadata (x-amz-meta-*) is preserved.
Source ACLs are dropped. Brimble buckets don’t expose per-object ACLs; everything in a Brimble bucket is private and reachable only via a storage credential or a presigned URL. See Access model.
Versioning is not preserved. Only the current version of each object is copied.
If an object with the same key already exists in the destination, it’s overwritten. Run a partial migration with a destination prefix to avoid clobbering existing data.
Per-object copy errors are retried automatically. If the whole job hits a fatal error (bad credentials, source bucket unreachable), the migration moves to failed; fix the cause and start a fresh migration. Re-running with the same source/destination prefixes safely re-copies anything missing; matching objects are overwritten in place.
One in-flight migration per bucket. Wait for the current one to finish (or cancel it) before starting another into the same destination.
No cross-account moves within Brimble through this flow. To move data between two Brimble buckets, issue an Editor credential on the destination, a ReadOnly credential on the source, and use aws s3 sync with two endpoints. The hosted migration is intended for inbound copies from external providers.
You pay storage on the destination bucket for everything that’s been copied so far, prorated by the hour. There’s no separate migration fee. Once the source is decommissioned, you’re only paying Brimble for the data.
Migration stuck in queued. A migration into the same destination bucket is already running. Cancel it or wait, then retry.Failed with “access denied on source.” The provided source credentials can’t read the source bucket. Confirm the key pair, region, and (for non-AWS sources) the endpoint URL. Issue a fresh read-only credential at the source and retry.Failed with “endpoint unreachable.” The source endpoint URL is wrong or the source bucket has IP restrictions that block Brimble. Allow Brimble’s outbound IPs at the source (check support for the current ranges) or remove the IP restriction during the migration window.Missing objects after completed. If you used a sourcePrefix, only matching keys were copied. Run a second migration with no prefix (or a different one) to pick up the rest.Want to re-run a migration into the same destination. Start a new migration with the same parameters. Existing objects are overwritten in place; new ones are added.
Buckets, configure CORS if browsers will read from the destination.
Last modified on October 31, 2026
Was this page helpful?
{"docsConfig":{"theme":"aspen","$schema":"https://mintlify.com/docs.json","name":"Brimble","description":"Brimble documentation. Deploy applications, manage domains, scale services, and ship without operating infrastructure.","colors":{"primary":"#006fff","light":"#006fff","dark":"#006fff"},"logo":{"light":"https://mintcdn.com/brimble-86/SR8fPQyZ_KbNTiea/logo/icon.png?fit=max\u0026auto=format\u0026n=SR8fPQyZ_KbNTiea\u0026q=85\u0026s=f4a01ce77637fe22d051f2c4fdb128e8","dark":"https://mintcdn.com/brimble-86/SR8fPQyZ_KbNTiea/logo/icon.png?fit=max\u0026auto=format\u0026n=SR8fPQyZ_KbNTiea\u0026q=85\u0026s=f4a01ce77637fe22d051f2c4fdb128e8"},"favicon":"https://mintcdn.com/brimble-86/SR8fPQyZ_KbNTiea/logo/icon.png?fit=max\u0026auto=format\u0026n=SR8fPQyZ_KbNTiea\u0026q=85\u0026s=f4a01ce77637fe22d051f2c4fdb128e8","background":{"color":{"light":"#ffffff","dark":"#1a1c1e"}},"navbar":{"links":[{"href":"https://app.brimble.io","label":"Dashboard"},{"href":"https://brimble.io/changelog","label":"Changelog"},{"href":"https://status.brimble.io","label":"Status"}],"primary":{"type":"button","label":"Sign up","href":"https://app.brimble.io/signup"}},"footer":{"socials":{"x":"https://x.com/brimblehq","github":"https://github.com/brimblehq"}},"seo":{"metatags":{"og:type":"website","og:site_name":"Brimble Docs","og:image":"https://brimble.io/og-image.png","twitter:card":"summary_large_image","twitter:site":"@brimblehq","twitter:creator":"@brimblehq","robots":"index, follow"},"indexing":"all"},"fonts":{"heading":{"family":"ABC Marfa","weight":700,"source":"fonts/ABCMarfaVariableVF-Trial.woff2","format":"woff2"}},"contextual":{"options":["copy","view","chatgpt","claude","perplexity"],"display":"header"},"metadata":{"timestamp":true},"styling":{"latex":true},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"brimble-86","hasAudioNarration":false,"actualSubdomain":"brimble-86","customDomains":["paper.brimble.io"],"gitSource":{"type":"github","owner":"brimblehq","repo":"paper","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6ae342dbf2e535e50ffb1572","collectionId":"217f9fd9-3ec8-4e03-8d1e-81b42d132526","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ae342dbf2e535e50ffb1572"},"feedback":{"thumbs":true,"issues":false,"agentFeedback":true,"edits":false},"entitlements":{"AI_CHAT":{"status":"DISABLED"}},"buildId":"6ae59e6167c58c3a14fda205","clientVersion":"0.0.4043","searchFilterCounts":[{"language":"default","tag":"Core API","count":116},{"language":"default","tag":"Documentation","count":102},{"language":"default","tag":"Projects","count":36},{"language":"default","tag":"Sandboxes","count":29},{"language":"default","tag":"Sandbox API","count":23},{"language":"default","tag":"Domains","count":22},{"language":"default","tag":"Environments","count":14},{"language":"default","tag":"Databases","count":12},{"language":"default","tag":"CLI","count":10},{"language":"default","tag":"Object Storage","count":9}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[{"filePath":"style.css","content":"b,em strong,strong,strong em{font-family:\"ABC Marfa\",-apple-system,BlinkMacSystemFont,\"Segoe UI\",system-ui,sans-serif;font-weight:700}:root.dark,[data-theme=dark],html.dark{--bg-page-dark:#1a1c1e;--bg-elevated-dark:#202022;--bg-elevated-2-dark:#29292a;--bg-surface-dark:#222528;--text-strong-dark:#ffffff;--text-body-dark:#bdbcbc;--text-faded-dark:#9a9d9c;--text-extra-faded-dark:#8e9195;--border-dark:#454545}.dark body,[data-theme=dark] body{background-color:#1a1c1e;color:#bdbcbc}.dark h1,.dark h2,.dark h3,.dark h4,.dark td strong,[data-theme=dark] h1,[data-theme=dark] h2,[data-theme=dark] h3,[data-theme=dark] h4,[data-theme=dark] td strong{color:#fff}.dark .card,.dark [class*=Check],.dark [class*=Frame],.dark [class*=Info],.dark [class*=Note],.dark [class*=Tip],.dark [class*=Warning],.dark [class*=callout],.dark blockquote,[data-theme=dark] .card,[data-theme=dark] [class*=Frame],[data-theme=dark] [class*=callout],[data-theme=dark] blockquote{background-color:#202022;border-color:#454545}.dark code:not(pre code),[data-theme=dark] code:not(pre code){background-color:#29292a;color:#fff;border:.5px solid #454545}.dark .code-block,.dark hr,[data-theme=dark] .code-block,[data-theme=dark] hr{border-color:#454545}.dark pre,.dark pre code,[data-theme=dark] .code-block [data-component-part=code-block-root],[data-theme=dark] pre,[data-theme=dark] pre code,html.dark .code-block [data-component-part=code-block-root],html.dark .code-block pre code,html.dark .code-block pre.shiki{background-color:#202022!important;border:0;box-shadow:none}.dark .code-block-fade-overlay,[data-theme=dark] .code-block-fade-overlay{--fade-color-dark:#202022!important}.dark table,[data-theme=dark] table{border-collapse:separate;border-spacing:0;background-color:#202022;border:1px solid rgba(255,255,255,.08);border-radius:10px;overflow:hidden}.dark thead,[data-theme=dark] thead{background-color:#29292a}.dark th,[data-theme=dark] th{padding:10px 16px;color:#fff;font-size:.8125rem;font-weight:600;border:0;border-bottom:1px solid rgba(255,255,255,.08)}.dark td,[data-theme=dark] td{padding:12px 16px;color:#bdbcbc;vertical-align:top;border:0;border-top:1px solid rgba(255,255,255,.06)}.dark tbody tr:first-child td,[data-theme=dark] tbody tr:first-child td{border-top:0}.dark tbody tr,[data-theme=dark] tbody tr{background-color:transparent;transition:background-color 120ms ease}.dark tbody tr:hover,[data-theme=dark] tbody tr:hover{background-color:rgba(255,255,255,.025)}.dark table:not(:has(th:not(:empty))) thead,[data-theme=dark] table:not(:has(th:not(:empty))) thead{display:none}.dark table:not(:has(th:not(:empty))) td:first-child,[data-theme=dark] table:not(:has(th:not(:empty))) td:first-child{width:30%;color:#fff}.dark aside,.dark nav,[data-theme=dark] aside,[data-theme=dark] nav{background-color:#1a1c1e;border-color:#454545}.dark aside a.active,.dark aside a[aria-current=page],[data-theme=dark] aside a.active,[data-theme=dark] aside a[aria-current=page]{background-color:#29292a;color:#fff}.dark ::selection,[data-theme=dark] ::selection{background:rgba(255,155,0,.45);color:#fff6e8}*{scrollbar-width:thin;scrollbar-color:rgba(0,0,0,.18) transparent}.dark *,[data-theme=dark] *{scrollbar-color:rgba(255,255,255,.14) transparent}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-track{background:0 0}::-webkit-scrollbar-thumb{background-color:rgba(0,0,0,.18);border-radius:999px;border:2px solid transparent;background-clip:padding-box}::-webkit-scrollbar-thumb:hover{background-color:rgba(0,0,0,.28)}.dark ::-webkit-scrollbar-thumb,[data-theme=dark] ::-webkit-scrollbar-thumb{background-color:rgba(255,255,255,.14)}.dark ::-webkit-scrollbar-thumb:hover,[data-theme=dark] ::-webkit-scrollbar-thumb:hover{background-color:rgba(255,255,255,.22)}[id*=toc i] ol,[id*=toc i] ul,aside[aria-label*=\"on this page\"i] ol,aside[aria-label*=\"on this page\"i] ul,nav[aria-labelledby*=on-this-page i] ol,nav[aria-labelledby*=on-this-page i] ul{position:relative;padding-left:16px;margin-left:0;list-style:none}[id*=toc i]>ol::before,[id*=toc i]>ul::before,aside[aria-label*=\"on this page\"i]>ol::before,aside[aria-label*=\"on this page\"i]>ul::before,nav[aria-labelledby*=on-this-page i]>ol::before,nav[aria-labelledby*=on-this-page i]>ul::before{content:\"\";position:absolute;left:5px;top:0;bottom:0;width:1.5px;background-color:rgba(0,0,0,.1);border-radius:999px}.dark [id*=toc i]>ol::before,.dark [id*=toc i]>ul::before,.dark aside[aria-label*=\"on this page\"i]>ol::before,.dark aside[aria-label*=\"on this page\"i]>ul::before,.dark nav[aria-labelledby*=on-this-page i]>ol::before,.dark nav[aria-labelledby*=on-this-page i]>ul::before,[data-theme=dark] [id*=toc i]>ul::before,[data-theme=dark] nav[aria-labelledby*=on-this-page i]>ol::before{background-color:rgba(255,255,255,.1)}[id*=toc i] li,aside[aria-label*=\"on this page\"i] li,nav[aria-labelledby*=on-this-page i] li{position:relative}[id*=toc i] li:has(>a.active)::before,[id*=toc i] li:has(>a[aria-current=page])::before,[id*=toc i] li:has(>a[aria-current=true])::before,aside[aria-label*=\"on this page\"i] li:has(>a.active)::before,aside[aria-label*=\"on this page\"i] li:has(>a[aria-current=page])::before,aside[aria-label*=\"on this page\"i] li:has(>a[aria-current=true])::before,nav[aria-labelledby*=on-this-page i] li:has(>a.active)::before,nav[aria-labelledby*=on-this-page i] li:has(>a[aria-current=page])::before,nav[aria-labelledby*=on-this-page i] li:has(>a[aria-current=true])::before,nav[aria-labelledby*=on-this-page i] li:has(>a[data-active=true])::before{content:\"\";position:absolute;left:1px;top:50%;width:9px;height:9px;border-radius:999px;background-color:#006fff;box-shadow:0 0 0 3px rgba(0,111,255,.18);transform:translateY(-50%);z-index:1}"}],"page":{"pagePath":"object-storage/migrate","slug":"/object-storage/migrate","pageMetadata":{"title":"Migrate from another provider","description":"Bring an existing S3-compatible bucket into Brimble Object Storage. Runs in the background, no proxying through your laptop.","og:image":"https://paper.brimble.io/og/object-storage/migrate.png ","twitter:image":"https://paper.brimble.io/og/object-storage/migrate.png ","href":"/object-storage/migrate"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Bring an existing S3-compatible bucket into Brimble Object Storage. Runs in the background, no proxying through your laptop.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,ol:`ol`,p:`p`,strong:`strong`,ul:`ul`,..._provideComponents(),...props.components},{Heading,Warning}=_components;if(!Heading)_missingMdxReference(`Heading`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsx(_components.p,{children:`Brimble’s migration flow pulls objects from any S3-compatible source bucket into a Brimble bucket. The copy runs server-side, so you don’t proxy bytes through your laptop or your local network.`}),`\n`,_jsx(Heading,{level:`2`,id:`when-to-use-it`,children:`When to use it`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`You’re moving from another provider and want everything in one bucket.`}),`\n`,_jsx(_components.li,{children:`You’re consolidating multiple source buckets into a single Brimble bucket using prefixes.`}),`\n`,_jsxs(_components.li,{children:[`You want a one-shot copy with progress tracking instead of running `,_jsx(_components.code,{children:`aws s3 sync`}),` in a `,_jsx(_components.code,{children:`screen`}),` session for hours.`]}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`prerequisites`,children:`Prerequisites`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`A Brimble bucket already created in the destination region. See `,_jsx(_components.a,{href:`/object-storage/buckets#create-a-bucket`,children:`Buckets → Create a bucket`}),`.`]}),`\n`,_jsxs(_components.li,{children:[`The source bucket’s:`,`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:_jsx(_components.strong,{children:`Bucket name.`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.strong,{children:`Region.`})}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Endpoint URL`}),` (for non-AWS S3-compatible sources). Skip for AWS.`]}),`\n`,_jsxs(_components.li,{children:[`An `,_jsx(_components.strong,{children:`access key pair`}),` with read permission on the source. Brimble only needs read; never hand over write credentials.`]}),`\n`]}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`Optional: a `,_jsx(_components.strong,{children:`source prefix`}),` (only copy objects under this path) and / or a `,_jsx(_components.strong,{children:`destination prefix`}),` (write into this folder in the Brimble bucket).`]}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`start-a-migration`,children:`Start a migration`}),`\n`,_jsx(Heading,{level:`3`,id:`from-the-dashboard`,children:`From the dashboard`}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsx(_components.li,{children:`Open the Brimble bucket you want to import into.`}),`\n`,_jsxs(_components.li,{children:[`Go to `,_jsx(_components.strong,{children:`Migrations → New migration`}),`.`]}),`\n`,_jsxs(_components.li,{children:[`Fill in:`,`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Source bucket`}),` name.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Source region`}),`.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Source endpoint`}),` (leave blank for AWS S3, otherwise the source provider’s S3 endpoint URL).`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Access key id`}),` and `,_jsx(_components.strong,{children:`Secret access key`}),` with read access on the source.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Source prefix`}),` (optional), e.g. `,_jsx(_components.code,{children:`legacy/2024/`}),`.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Destination prefix`}),` (optional), e.g. `,_jsx(_components.code,{children:`imported/`}),`.`]}),`\n`]}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`Click `,_jsx(_components.strong,{children:`Start migration`}),`.`]}),`\n`]}),`\n`,_jsx(_components.p,{children:`The migration is queued; the next page shows live progress.`}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`The migration credentials are temporary.`}),` Brimble holds the source credentials only for the duration of the migration and discards them when the job ends (success, failure, or cancel). Even so, scope the source credentials to read-only and rotate them on the source side once the migration completes.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`watch-progress`,children:`Watch progress`}),`\n`,_jsx(_components.p,{children:`The migration detail page shows:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Status:`}),` `,_jsx(_components.code,{children:`queued`}),`, `,_jsx(_components.code,{children:`running`}),`, `,_jsx(_components.code,{children:`completed`}),`, `,_jsx(_components.code,{children:`failed`}),`, or `,_jsx(_components.code,{children:`cancelled`}),`.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Objects copied`}),` out of total discovered.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Bytes copied`}),` out of total bytes discovered.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Started at`}),` and (when finished) `,_jsx(_components.strong,{children:`ended at`}),` timestamps.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Last error`}),` (if any), with the offending key.`]}),`\n`]}),`\n`,_jsx(_components.p,{children:`Refresh the page to update; the dashboard also surfaces a notification when the migration finishes.`}),`\n`,_jsx(Heading,{level:`2`,id:`cancel-a-migration`,children:`Cancel a migration`}),`\n`,_jsxs(_components.p,{children:[`Open the migration detail page and click `,_jsx(_components.strong,{children:`Cancel`}),`. The job stops at the next object boundary; any objects already copied stay in the destination bucket.`]}),`\n`,_jsxs(_components.p,{children:[`Cancellation isn’t a rollback. To undo a partial migration, delete the imported objects from the destination bucket manually (the `,_jsx(_components.strong,{children:`Objects`}),` tab has bulk delete).`]}),`\n`,_jsx(Heading,{level:`2`,id:`what-gets-copied`,children:`What gets copied`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Object data, content type, and standard metadata.`}),` Custom user-defined metadata (`,_jsx(_components.code,{children:`x-amz-meta-*`}),`) is preserved.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Source ACLs are dropped.`}),` Brimble buckets don’t expose per-object ACLs; everything in a Brimble bucket is private and reachable only via a storage credential or a presigned URL. See `,_jsx(_components.a,{href:`/object-storage/objects#access-model`,children:`Access model`}),`.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Versioning is not preserved.`}),` Only the current version of each object is copied.`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`If an object with the same key already exists in the destination, it’s `,_jsx(_components.strong,{children:`overwritten`}),`. Run a partial migration with a destination prefix to avoid clobbering existing data.`]}),`\n`,_jsx(Heading,{level:`2`,id:`retries-and-resumability`,children:`Retries and resumability`}),`\n`,_jsxs(_components.p,{children:[`Per-object copy errors are retried automatically. If the whole job hits a fatal error (bad credentials, source bucket unreachable), the migration moves to `,_jsx(_components.code,{children:`failed`}),`; fix the cause and start a fresh migration. Re-running with the same source/destination prefixes safely re-copies anything missing; matching objects are overwritten in place.`]}),`\n`,_jsx(Heading,{level:`2`,id:`limits`,children:`Limits`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`One in-flight migration per bucket.`}),` Wait for the current one to finish (or cancel it) before starting another into the same destination.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`No cross-account moves within Brimble through this flow.`}),` To move data between two Brimble buckets, issue an `,_jsx(_components.code,{children:`Editor`}),` credential on the destination, a `,_jsx(_components.code,{children:`ReadOnly`}),` credential on the source, and use `,_jsx(_components.code,{children:`aws s3 sync`}),` with two endpoints. The hosted migration is intended for inbound copies from external providers.`]}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`billing-during-migration`,children:`Billing during migration`}),`\n`,_jsx(_components.p,{children:`You pay storage on the destination bucket for everything that’s been copied so far, prorated by the hour. There’s no separate migration fee. Once the source is decommissioned, you’re only paying Brimble for the data.`}),`\n`,_jsx(Heading,{level:`2`,id:`troubleshooting`,children:`Troubleshooting`}),`\n`,_jsxs(_components.p,{children:[_jsxs(_components.strong,{children:[`Migration stuck in `,_jsx(_components.code,{children:`queued`}),`.`]}),` A migration into the same destination bucket is already running. Cancel it or wait, then retry.`]}),`\n`,_jsxs(_components.p,{children:[_jsxs(_components.strong,{children:[_jsx(_components.code,{children:`Failed`}),` with “access denied on source.”`]}),` The provided source credentials can’t read the source bucket. Confirm the key pair, region, and (for non-AWS sources) the endpoint URL. Issue a fresh read-only credential at the source and retry.`]}),`\n`,_jsxs(_components.p,{children:[_jsxs(_components.strong,{children:[_jsx(_components.code,{children:`Failed`}),` with “endpoint unreachable.”`]}),` The source endpoint URL is wrong or the source bucket has IP restrictions that block Brimble. Allow Brimble’s outbound IPs at the source (check support for the current ranges) or remove the IP restriction during the migration window.`]}),`\n`,_jsxs(_components.p,{children:[_jsxs(_components.strong,{children:[`Missing objects after `,_jsx(_components.code,{children:`completed`}),`.`]}),` If you used a `,_jsx(_components.code,{children:`sourcePrefix`}),`, only matching keys were copied. Run a second migration with no prefix (or a different one) to pick up the rest.`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Want to re-run a migration into the same destination.`}),` Start a new migration with the same parameters. Existing objects are overwritten in place; new ones are added.`]}),`\n`,_jsx(Heading,{level:`2`,id:`next-steps`,children:`Next steps`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`/object-storage/credentials`,children:`Storage credentials`}),`, issue keys for your apps to use the destination bucket.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`/object-storage/objects`,children:`Working with objects`}),`, point your S3 clients at the new bucket.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`/object-storage/buckets`,children:`Buckets`}),`, configure CORS if browsers will read from the destination.`]}),`\n`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Migrate from another provider","description":"Bring an existing S3-compatible bucket into Brimble Object Storage. Runs in the background, no proxying through your laptop.","og:image":"https://paper.brimble.io/og/object-storage/migrate.png ","twitter:image":"https://paper.brimble.io/og/object-storage/migrate.png ","href":"/object-storage/migrate"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"When to use it","slug":"when-to-use-it","depth":2,"children":[]},{"title":"Prerequisites","slug":"prerequisites","depth":2,"children":[]},{"title":"Start a migration","slug":"start-a-migration","depth":2,"children":[{"title":"From the dashboard","slug":"from-the-dashboard","depth":3,"children":[]}]},{"title":"Watch progress","slug":"watch-progress","depth":2,"children":[]},{"title":"Cancel a migration","slug":"cancel-a-migration","depth":2,"children":[]},{"title":"What gets copied","slug":"what-gets-copied","depth":2,"children":[]},{"title":"Retries and resumability","slug":"retries-and-resumability","depth":2,"children":[]},{"title":"Limits","slug":"limits","depth":2,"children":[]},{"title":"Billing during migration","slug":"billing-during-migration","depth":2,"children":[]},{"title":"Troubleshooting","slug":"troubleshooting","depth":2,"children":[]},{"title":"Next steps","slug":"next-steps","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"brimble-86","siteName":"Brimble","title":"Migrate from another provider - Brimble","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-05-31T08:40:56.143Z","gitLastModified":"2026-10-31T07:52:44.000Z","originalFileLocation":"object-storage/migrate.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Bring an existing S3-compatible bucket into Brimble Object Storage. Runs in the background, no proxying through your laptop.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Brimble\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003cmeta data-mint-head name=\"robots\" content=\"index, follow\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/brimble-86/LFcyxdNu5eilxs2I/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/brimble-86/LFcyxdNu5eilxs2I/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/brimble-86/LFcyxdNu5eilxs2I/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/brimble-86/LFcyxdNu5eilxs2I/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/brimble-86/LFcyxdNu5eilxs2I/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/brimble-86/LFcyxdNu5eilxs2I/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/brimble-86/LFcyxdNu5eilxs2I/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/brimble-86/LFcyxdNu5eilxs2I/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/brimble-86/LFcyxdNu5eilxs2I/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Migrate from another provider - Brimble\">\u003cmeta data-mint-head property=\"og:description\" content=\"Bring an existing S3-compatible bucket into Brimble Object Storage. Runs in the background, no proxying through your laptop.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Brimble Docs\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://paper.brimble.io/object-storage/migrate\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://paper.brimble.io/og/object-storage/migrate.png \">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Migrate from another provider - Brimble\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Bring an existing S3-compatible bucket into Brimble Object Storage. Runs in the background, no proxying through your laptop.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://paper.brimble.io/og/object-storage/migrate.png \">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/brimble-86/LFcyxdNu5eilxs2I/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Brimble\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#006fff\">\u003cmeta data-mint-head name=\"twitter:creator\" content=\"@brimblehq\">\u003clink data-mint-head rel=\"canonical\" href=\"https://paper.brimble.io/object-storage/migrate\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/object-storage/migrate.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://paper.brimble.io/#organization\",\"name\":\"Brimble\",\"url\":\"https://paper.brimble.io\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/brimble-86/SR8fPQyZ_KbNTiea/logo/icon.png?fit=max\u0026auto=format\u0026n=SR8fPQyZ_KbNTiea\u0026q=85\u0026s=f4a01ce77637fe22d051f2c4fdb128e8\"}},{\"@type\":\"WebSite\",\"@id\":\"https://paper.brimble.io#website\",\"name\":\"Brimble\",\"url\":\"https://paper.brimble.io\",\"publisher\":{\"@id\":\"https://paper.brimble.io/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://paper.brimble.io/object-storage/migrate#webpage\",\"url\":\"https://paper.brimble.io/object-storage/migrate\",\"name\":\"Migrate from another provider\",\"description\":\"Bring an existing S3-compatible bucket into Brimble Object Storage. Runs in the background, no proxying through your laptop.\",\"dateModified\":\"2026-10-31T07:52:44.000Z\",\"isPartOf\":{\"@id\":\"https://paper.brimble.io#website\"},\"breadcrumb\":{\"@id\":\"https://paper.brimble.io/object-storage/migrate#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://paper.brimble.io/object-storage/migrate#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Object storage\",\"item\":\"https://paper.brimble.io/object-storage/overview\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Migrate from another provider\",\"item\":\"https://paper.brimble.io/object-storage/migrate\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://paper.brimble.io/object-storage/migrate#article\",\"headline\":\"Migrate from another provider\",\"name\":\"Migrate from another provider\",\"description\":\"Bring an existing S3-compatible bucket into Brimble Object Storage. Runs in the background, no proxying through your laptop.\",\"url\":\"https://paper.brimble.io/object-storage/migrate\",\"mainEntityOfPage\":{\"@id\":\"https://paper.brimble.io/object-storage/migrate#webpage\"},\"image\":\"https://paper.brimble.io/og/object-storage/migrate.png\",\"dateModified\":\"2026-10-31T07:52:44.000Z\",\"publisher\":{\"@id\":\"https://paper.brimble.io/#organization\"},\"isPartOf\":{\"@id\":\"https://paper.brimble.io#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Brimble\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Brimble","nav":{"global":null,"tabs":[{"tab":"Documentation","groups":[{"group":"Getting started","public":true,"icon":"rocket","pages":[{"title":"Brimble Documentation","href":""},{"title":"What is Brimble? Platform overview","sidebarTitle":"What is Brimble","href":"/getting-started/introduction"},{"title":"Quickstart: deploy your first app","sidebarTitle":"Quickstart","href":"/getting-started/quickstart"}]},{"group":"Brimble Agent","public":true,"icon":"sparkles","pages":[{"title":"Brimble Agent: AI assistant for deployments","sidebarTitle":"Brimble Agent","href":"/agent/overview"},{"title":"Use Brimble Agent in the dashboard","sidebarTitle":"Using the agent","href":"/agent/using-the-agent"},{"title":"What Brimble Agent can do","sidebarTitle":"What it can do","href":"/agent/what-it-can-do"},{"title":"Brimble Agent plans, limits, and API keys","sidebarTitle":"Keys and limits","href":"/agent/keys-and-limits"}]},{"group":"Brimble MCP","public":true,"icon":"robot","pages":[{"title":"Brimble MCP server","sidebarTitle":"Brimble MCP","href":"/mcp/overview"},{"title":"Connect an agent to Brimble MCP","href":"/mcp/connect"}]},{"group":"CLI","public":true,"icon":"terminal","pages":[{"title":"Install and set up the Brimble CLI","sidebarTitle":"Brimble CLI","href":"/cli/overview"},{"title":"Deploy from the CLI","href":"/cli/deploy"},{"title":"Manage projects from the CLI","href":"/cli/projects"},{"title":"Manage brimble.toml from the CLI","sidebarTitle":"Config as code","href":"/cli/config"},{"title":"Logs from the CLI","href":"/cli/logs"},{"title":"Environment variables from the CLI","href":"/cli/environment-variables"},{"title":"Manage database backups and point-in-time recovery from the CLI","sidebarTitle":"Databases","href":"/cli/databases"},{"title":"Domains, environments, and teams","href":"/cli/domains-and-teams"},{"title":"Connect coding agents","href":"/cli/agents"},{"title":"Use the CLI in CI","href":"/cli/ci"}]},{"group":"Projects","public":true,"icon":"cube","pages":[{"title":"Projects and services","href":"/projects/overview"},{"title":"Service types: web, static, worker, database","sidebarTitle":"Service types","href":"/projects/service-types"},{"title":"Frameworks supported","href":"/projects/frameworks"},{"title":"Regions and datacenter locations","sidebarTitle":"Regions","href":"/projects/regions"},{"title":"How builds work on Brimble","sidebarTitle":"Builds","href":"/projects/builds"},{"title":"Inside the Brimble Builder","href":"/projects/build-system"},{"title":"Deployments and deployment history","sidebarTitle":"Deployments","href":"/projects/deployments"},{"title":"Quick start: configure a project with brimble.toml","sidebarTitle":"Configure projects with brimble.toml","href":"/projects/brimble-toml"},{"title":"Git integrations: GitHub, GitLab, Bitbucket","sidebarTitle":"Git integrations","href":"/projects/git-integrations"},{"title":"Deploy a background worker","sidebarTitle":"Deploy a worker","href":"/projects/deploy-a-worker"},{"title":"Deploy a Rust app on Brimble","sidebarTitle":"Deploy a Rust app","href":"/projects/deploy-rust"},{"title":"Deploy WordPress on Brimble","sidebarTitle":"Deploy WordPress","href":"/projects/deploy-wordpress"},{"title":"Deploy an MCP server","href":"/projects/deploy-an-mcp-server"},{"title":"Deploy from a Docker image","href":"/projects/deploy-from-docker-image"},{"title":"Discover and deploy MCP servers","href":"/projects/discover-mcp-servers"},{"title":"Persistent disk for projects","sidebarTitle":"Persistent disk","href":"/projects/persistent-disk"},{"title":"Mount config and secret files","sidebarTitle":"Files","href":"/projects/files"},{"title":"Roll back a deployment","href":"/projects/rollback-a-deployment"},{"title":"Site password protection","href":"/projects/password-protect"},{"title":"Preview collaboration","href":"/projects/preview-collaboration"}]},{"group":"Databases","public":true,"icon":"database","pages":[{"title":"Deploy a managed database","sidebarTitle":"Deploy a database","href":"/databases/deploy-a-database"},{"title":"High availability databases","href":"/databases/high-availability"},{"title":"Point-in-time recovery for Postgres and MySQL","href":"/databases/point-in-time-recovery"}]},{"group":"Config as code","public":true,"icon":"file-code","pages":[{"title":"Configure projects with brimble.toml","href":"/config-as-code/brimble-toml"},{"title":"brimble.toml reference","href":"/config-as-code/reference"}]},{"group":"Sandboxes","public":true,"icon":"box","pages":[{"title":"Sandboxes: isolated compute on demand","sidebarTitle":"Sandboxes","href":"/sandboxes/overview"},{"title":"Sandbox SDKs for TypeScript, Python, and Go","sidebarTitle":"SDKs","href":"/sandboxes/sdks"},{"title":"Sandbox quickstart with the SDK","sidebarTitle":"Sandbox quickstart","href":"/sandboxes/quickstart"},{"title":"Sandbox snapshots","sidebarTitle":"Snapshots","href":"/sandboxes/snapshots"},{"title":"Inside the Brimble Sandbox runtime","href":"/sandboxes/sandbox-system"},{"group":"Cookbook","public":true,"icon":"utensils","pages":[{"title":"Run untrusted code in a sandbox","sidebarTitle":"Run untrusted code","href":"/sandboxes/cookbook/untrusted-code"},{"title":"Run an AI coding agent","href":"/sandboxes/cookbook/ai-coding-agent"},{"title":"Run Docker inside a sandbox","href":"/sandboxes/cookbook/docker-in-sandbox"},{"title":"A persistent dev environment","href":"/sandboxes/cookbook/persistent-dev-env"}]}]},{"group":"Volumes","public":true,"icon":"hard-drive","pages":[{"title":"Volumes: persistent disks","sidebarTitle":"Volumes","href":"/volumes/overview"}]},{"group":"Object storage","public":true,"icon":"database","pages":[{"title":"S3-compatible object storage","sidebarTitle":"Object storage","href":"/object-storage/overview"},{"title":"Create and manage storage buckets","sidebarTitle":"Buckets","href":"/object-storage/buckets"},{"title":"Working with objects","href":"/object-storage/objects"},{"title":"S3 storage credentials and access keys","sidebarTitle":"Storage credentials","description":"Issue, rotate, and revoke S3-compatible access keys, scoped per bucket and per role.","href":"/object-storage/credentials"},{"title":"Migrate from another provider","href":"/object-storage/migrate"}]},{"group":"Domains","public":true,"icon":"globe","pages":[{"title":"Add a custom domain to your project","sidebarTitle":"Add a custom domain","description":"Point your own domain at a Brimble project: add it, set the DNS record, wait for verification, and fix common problems.","href":"/domains/custom-domains"},{"title":"Buy a domain through Brimble","href":"/domains/buy-a-domain"},{"title":"Transfer a domain to or from Brimble","sidebarTitle":"Transfer a domain","href":"/domains/transfer-a-domain"},{"title":"Manage DNS records","href":"/domains/manage-dns-records"},{"title":"Redirect a domain to another URL","sidebarTitle":"Redirect a domain","href":"/domains/redirect-a-domain"},{"title":"Wildcard domains and subdomains","sidebarTitle":"Wildcard domains","href":"/domains/wildcard-domains"},{"title":"Supported DNS record types","sidebarTitle":"DNS record types","href":"/domains/dns-records"},{"title":"Email forwarding for your domain","sidebarTitle":"Email forwarding","href":"/domains/email-forwarding"}]},{"group":"Environments","public":true,"icon":"layer-group","pages":[{"title":"Project environments","sidebarTitle":"Environments","href":"/environments/overview"},{"title":"Manage environment variables","href":"/environments/environment-variables"},{"title":"Reference shared and cross-project variables","href":"/environments/env-references"}]},{"group":"Networking","public":true,"icon":"network-wired","pages":[{"title":"Networking and the edge","href":"/networking/overview"},{"title":"HTTP, WebSockets, and gRPC","href":"/networking/http"},{"title":"Request lifecycle on Brimble's edge","sidebarTitle":"Request lifecycle","href":"/networking/request-lifecycle"},{"title":"Internal networking between services","sidebarTitle":"Internal networking","href":"/networking/internal-services"},{"title":"Static outbound IPs","href":"/networking/static-outbound-ips"},{"title":"Rate limits for traffic and builds","sidebarTitle":"Rate limits","href":"/networking/rate-limits"}]},{"group":"Scaling","public":true,"icon":"arrows-up-down","pages":[{"title":"Configure horizontal scaling","sidebarTitle":"Configure scaling","href":"/scaling/overview"}]},{"group":"Observability","public":true,"icon":"gauge","pages":[{"title":"Project metrics: CPU, memory, and latency","sidebarTitle":"Project metrics","href":"/observability/metrics"},{"title":"Application and request logs","sidebarTitle":"Logs","href":"/observability/logs"}]},{"group":"Analytics","public":true,"icon":"chart-line","pages":[{"title":"Web analytics for deployed sites","sidebarTitle":"Web analytics","href":"/analytics/web-analytics"}]},{"group":"Workspaces and teams","public":true,"icon":"users","pages":[{"title":"Create a team workspace","sidebarTitle":"Create a workspace","href":"/workspaces-and-teams/create-a-workspace"},{"title":"Manage teams and members","sidebarTitle":"Manage teams","href":"/workspaces-and-teams/manage-teams"},{"title":"Roles and permissions","href":"/workspaces-and-teams/roles-and-permissions"},{"title":"Single sign-on (SSO) and Directory Sync","sidebarTitle":"SSO and Directory Sync","href":"/workspaces-and-teams/sso"}]},{"group":"Security","public":true,"icon":"shield-halved","pages":[{"title":"Brimble API keys","sidebarTitle":"API keys","href":"/security/api-keys"},{"title":"Two-factor authentication","href":"/security/two-factor-authentication"}]},{"group":"Billing","public":true,"icon":"receipt","pages":[{"title":"How Brimble billing works","sidebarTitle":"How billing works","href":"/billing/plans"},{"title":"Wallet and card payments","sidebarTitle":"Wallet","href":"/billing/wallet"},{"title":"Compute pricing: CPU and memory rates","sidebarTitle":"Compute pricing","href":"/billing/compute"},{"title":"Build minutes and top-ups","sidebarTitle":"Build minutes","href":"/billing/build-minutes"},{"title":"Brimble referral program","sidebarTitle":"Referrals","href":"/billing/referrals"}]},{"group":"Notifications","public":true,"icon":"bell","pages":[{"title":"Notifications: dashboard, email, and push","sidebarTitle":"Notifications","href":"/notifications/overview"}]},{"group":"Webhooks","public":true,"icon":"bolt","pages":[{"title":"Webhooks for platform events","sidebarTitle":"Webhooks","href":"/webhooks/overview"},{"title":"Webhook events reference","href":"/webhooks/events"}]},{"group":"Log Drains","public":true,"icon":"file-export","pages":[{"title":"Log drains: forward logs to HTTPS or S3","sidebarTitle":"Log Drains","href":"/drains/overview"}]},{"group":"Troubleshooting","public":true,"icon":"wrench","pages":[{"title":"Fix failed builds","sidebarTitle":"Build failures","href":"/troubleshooting/build-failures"},{"title":"Application failed to respond","href":"/troubleshooting/application-failed-to-respond"},{"title":"Fix 502 Bad Gateway errors","sidebarTitle":"502 Bad Gateway","href":"/troubleshooting/502-errors"},{"title":"Fix DNS issues","sidebarTitle":"DNS issues","href":"/troubleshooting/dns"},{"title":"Fix TLS certificate errors","sidebarTitle":"TLS certificate issues","href":"/troubleshooting/tls"},{"title":"Fix a stuck deployment","sidebarTitle":"Deployment is stuck","href":"/troubleshooting/deployment-stuck"}]},{"group":"Reference","public":true,"icon":"book","pages":[{"title":"Glossary of Brimble terms","sidebarTitle":"Glossary","href":"/glossary"}]}]},{"tab":"Core API","pages":[{"title":"Core API","href":"/api-reference/core/introduction"}]},{"tab":"Sandbox API","pages":[{"title":"Sandbox API","href":"/api-reference/sandboxes/templates-list"}]}]},"basePath":"","title":"Migrate from another provider - Brimble","buildId":"dpl_G9nrg4qeJSZtah1Ziwbc2n6WkLch","deploymentId":"dpl_G9nrg4qeJSZtah1Ziwbc2n6WkLch","dynamics":[],"chunks":[]}