# Move Exported ChatGPT Website Files to Another Host

> Move a ChatGPT Site to Cloudflare Pages, Netlify or GitHub Pages. Get the full file tree, test a preview, set access, and then retire the original.

## What this move involves

The move has six parts:

1. Get the complete file tree of your ChatGPT Site, not only the page that you see.
2. Test the files locally.
3. Deploy them to a static host such as Cloudflare Pages, Netlify, or GitHub Pages.
4. Test a preview.
5. Set access.
6. Only then, restrict or delete the original Site.

![ChatGPT Sites page showing a published static website](/assets/en/blog/how-to-migrate-a-chatgpt-site-to-revdoku/chatgpt-sites-page.webp)

*The ChatGPT Sites page lists your Sites and their published addresses. Start here to pick the Site that you want to move.*

A Site made of static files (HTML, CSS, JavaScript, images, fonts and downloads) can move to almost any static host. A static host is a service that serves plain files. A Site can also depend on a database, server functions, secret keys, or other services of the platform. Before such a Site can work on a different host, you must replace those parts.

The move creates a separate copy. It does not change or protect the URL of the original Site. You handle that URL at the end.

The OpenAI [ChatGPT Sites help article](https://help.openai.com/en/articles/20001339) covers publishing, sharing settings, custom domains, and the deletion of a Site. If you cannot find a download option for the files of your Site, ask ChatGPT for them. Ask in the conversation where you built the Site, as step 2 shows.

## 1. Make sure that the Site can move as static files

A simple static Site looks like this:

```text
index.html
assets/
styles.css
app.js
logo.webp
downloads/
guide.pdf
```

If the Site does one of these things, pause before you continue:

- It saves data between visits.
- It signs users in.
- It calls an API with a secret key.
- It relies on another hosted service.

The static files can move, but you must rebuild the backend (the server part of the Site) or host it separately. A static host does not recreate the backend.

Before you copy anything, decide what must stay behind. Examples are API keys, private prompts, customer records, environment files, and local file paths.

## 2. Get the complete file tree from ChatGPT

Open the conversation where you built the Site. Paste this prompt:

```text
Prepare a complete static export of this website as a ZIP file.

Requirements:
1. Include index.html and every HTML, CSS, JavaScript, image, font,
document and data file the website uses.
2. Keep the folder structure and all relative paths.
3. Do not include secrets, API keys, private prompts, environment files,
customer data or local computer paths.
4. List every file in the ZIP with its path.
5. Put index.html at the root of the ZIP.
6. Tell me whether the site uses a client-side router (one index.html
serving several paths) or a separate HTML file per page.
7. List any feature that depends on a server, database, sign-in or
platform service and will not work as static files.
```

Download the ZIP and extract it. Compare the file list from ChatGPT with the files that are actually in the folder. A homepage can look correct even when a secondary image, font, download, or route is missing.

Do not rebuild the Site from a copy of the rendered page in your browser. That copy misses generated assets, other routes, and files that load only after a user action.

## 3. Test the files locally

Serve the folder from a local web server, a program that serves files from your computer. Do not double-click `index.html`, because some scripts and paths work only over HTTP. Run these commands:

```bash
cd my-site
python3 -m http.server 8000
```

Open `http://localhost:8000` and test these items:

- The homepage and every navigation item
- Images, fonts, buttons, forms and downloads
- The browser console (no missing-file or script errors)
- A phone-width window

Fix each problem that you find here. A host will not fix it for you.

## 4. Choose a host and handle routing

| Host | How to deploy the folder | Client-side routing | Access control |
|---|---|---|---|
| [Cloudflare Pages](https://developers.cloudflare.com/pages/get-started/direct-upload/) | Drag and drop the folder or ZIP in the dashboard, or `npx wrangler pages deploy ` | Works by default when there is no top-level `404.html` | Email codes or allowlists through Cloudflare Access |
| [Netlify](https://docs.netlify.com/deploy/create-deploys/) | Drag the folder to Netlify Drop or a project's Deploys page | Add a `_redirects` rule | Site password on paid plans |
| [GitHub Pages](https://docs.github.com/en/pages/quickstart) | Push the files to a repository and enable Pages | No rewrite rules | Public only on GitHub Free |
| [Vercel](https://vercel.com/docs/deployment-protection/methods-to-protect-deployments/password-protection) | Import a repository or deploy with the Vercel CLI | Configure a rewrite | Password Protection on Pro and Enterprise |

Routing decides which file the host sends for each path. It is the setting that people most often get wrong. If the Site has a separate HTML file for each page (for example `about/index.html`), it works on every host without changes.

A client-side router is one `index.html` that handles `/about`, `/pricing`, and other paths. With a client-side router, the host must serve `index.html` for unknown paths. Cloudflare Pages does this automatically if the project has no top-level `404.html` ([how Pages serves files](https://developers.cloudflare.com/pages/configuration/serving-pages/)). On Netlify, add a file named `_redirects` at the root with the line `/* /index.html 200` ([Netlify rewrites](https://docs.netlify.com/manage/routing/redirects/rewrites-proxies/)). GitHub Pages has no rewrite rules. On GitHub Pages, a router needs hash-based URLs, where the path comes after a `#` sign.

The step-by-step guides for [Netlify](/blog/publish-ai-site-netlify/) and [GitHub Pages](/blog/publish-ai-site-github-pages/) cover the deploy itself in more detail.

## 5. Deploy a preview and test it

Before you change a custom domain, deploy to the default address of the host (for example `my-site.pages.dev` or `my-site.netlify.app`).

Test the preview in a normal window and in a private window:

- Open the homepage and every navigation item.
- Reload a nested page directly, for example `/about`. A 404 here means that the routing setting is wrong.
- Test buttons, forms, downloads and outbound links.
- Test the layout at desktop and phone widths.
- Open a few file URLs directly. Make sure that you did not upload private files.
- Watch the browser console for missing assets.

## 6. Choose access, then go live

Before you share the new copy, decide who can see it:

- Public access, for work that is for anyone.
- A shared password, for a simple client gate. Use Netlify password protection (paid plans, [Netlify docs](https://docs.netlify.com/manage/security/secure-access-to-sites/password-protection/)) or Vercel Password Protection.
- An email allowlist (a list of approved addresses) with one-time codes. Use it to let in only named people or one company. Put Cloudflare Access in front of Cloudflare Pages, with the [One-time PIN login](https://developers.cloudflare.com/cloudflare-one/identity/one-time-pin/). Our [Cloudflare Pages protection guide](/blog/how-to-password-protect-a-cloudflare-pages-site/) shows how to protect both the `pages.dev` address and a custom domain.

Before you send the link, test the gate in a private window. If the Site used a custom domain, wait until the preview passes every test. Then move the DNS records (the entries that point the domain to a host) to the new host. Test the domain again.

If the content changes later, deploy the updated folder to the same project. The address stays the same.

## 7. Restrict or delete the original Site

Do this only after the new copy passes every test:

1. Open the original Site in ChatGPT. Open its **Share** settings.
2. Under **Who has access**, choose the narrowest option, such as only yourself. If you do not need the Site anymore, use **Delete site**. Deletion is permanent.
3. Open the old URL in a signed-out private window. Make sure that it does not show the content anymore.
4. Update links, bookmarks, campaigns, and email signatures to the new URL.

Pages that were public can stay in search snippets or saved copies for some time. Our [Google indexing check for ChatGPT Sites](/blog/can-chatgpt-sites-show-up-in-google-what-site-chatgpt-site-r/) explains why you must remove sensitive material before anything is public. The guide to [restricting access to a ChatGPT Site](/blog/how-to-password-protect-a-chatgpt-site/) covers the sharing options in more depth.

## Migration checklist

Before you call the move finished, make sure that:

- `index.html` is at the root of the deployed folder.
- The file list from ChatGPT matches the deployed files.
- Relative links and assets work, also on nested pages that you load directly.
- You did not upload secrets or private data.
- The routing setting is correct for a client-side router.
- The intended access gate appears before any content loads.
- You restricted or deleted the old Site only after the new copy worked.
- You kept a local copy of the last working version.

A docs portal with Ask AI
and support tickets

Connect a repository, or describe your product to start. Each docs site has search, Ask AI, an API console, an MCP server and support tickets.

Publishes from GitHub on every push

Works with Mintlify repositories

API console from your OpenAPI file

MCP server and llms.txt for AI agents

Ask AI and support tickets

Analytics for people and AI agents

Start Free →

Questions? Ask AI in our docs
No card required.

## Frequently Asked Questions

### What if ChatGPT cannot give me a ZIP file?

Ask ChatGPT to print each file in its own code block, with the full path above each block. Start with index.html. Save every block under that exact path in a new folder. Before you test the folder locally, compare it with the file list.

---

[View the canonical page](https://revdoku.com/blog/how-to-migrate-a-chatgpt-site-to-revdoku/) · [Browse llms.txt](https://revdoku.com/llms.txt)
