Modulify

Move your code to GitHub

Copy the repository behind a site into your own GitHub, and keep editing it in Modulify.

On this page

Every Modulify site is a private GitHub repository that Modulify creates and writes to. Moving the repository copies it, with its full history, either into a new repository in a GitHub organisation you own, or into a repository you already have, replacing everything in it. Modulify keeps editing and publishing from it there, so nothing about how you work changes. What changes is who owns the code. You can move the code back to Modulify whenever you want.

Before you begin

Moving code to your own GitHub requires a paid plan. The GitHub tab in workspace settings and the Repository section on a site's Settings tab are always visible and marked Paid on every plan. On the Free plan, connecting an account and moving a repository are disabled. See Plans. Moving the code back to Modulify works on every plan.

Two permissions are involved. Connecting a GitHub account to the workspace needs the Edit workspace permission. Moving a site's repository, and moving it back, needs the Transfer projects permission. The workspace owner has both, and a custom role can be given them. See Members and roles.

Modulify can only create a new repository in a GitHub organisation, not in a personal account. A personal account can still hold a site in a repository you already have there, as Move into an existing repository describes, and it is useful for reading its private repositories with Import from GitHub. Either way GitHub asks you to install the Modulify app on the account, so you need to be an owner of the organisation, or the personal account itself.

Connect a GitHub account to the workspace

GitHub accounts are connected once per workspace, and every site in the workspace can then move into any organisation among them.

Open workspace settings

Open the dashboard, click Settings in the sidebar, then the GitHub tab. Its address is /dashboard/settings/github. The page reads Connect the GitHub organizations that can own your site repositories., and the Connected accounts list below it reads Move sites into organizations, or into repositories you already have. With nothing connected yet it shows No GitHub accounts, Connect an account to own site code.

Install the Modulify app on GitHub

Click Connect GitHub account. You are sent to GitHub, where you pick the organisation to install the Modulify app on. Choose All repositories or, if you prefer to limit it, Only select repositories. Either works as long as the app reaches at least one repository, and a limited installation still reaches the repository Modulify creates when you move a site. To move a site into a repository you already have, the app has to reach that repository.

A member of the organisation who is not an owner can only request the app on GitHub. Modulify then shows Approval requested, An owner of the organization has to approve the Modulify app before it can be connected. Connect again once they have.

Confirm your GitHub account

GitHub then asks you to authorize the Modulify app, which lets Modulify check that your own GitHub account really manages the installation you just made. If you decline, the account is not connected and a Could not connect GitHub toast reads GitHub authorization was cancelled, so the account was not connected.

Come back to Modulify

GitHub returns you to Modulify and the account appears in the list with a GitHub account connected toast, You can now import and move repositories with @<account>. The row shows the account with an @, whether it is an Organization or a User, and whether the app can see All repositories or Selected repositories. The account is connected to the workspace the connection was started from. If you have another workspace open when it finishes, the toast says so instead: @<account> was connected to <workspace>, the workspace the connection was started from.

Who can connect an account

Only a GitHub account that can see every repository the app reaches can connect it. For an organisation, seeing the repositories is not enough: your GitHub account must be an admin of every repository the app reaches, which an owner of the organisation always is. For a personal account, the GitHub account you authorize with must be that account itself. When the check fails, the account is not connected and a Could not connect GitHub toast says why.

Situation The toast says
Your GitHub account cannot manage the installation Your GitHub account cannot manage that installation, so it was not connected!
The app reaches repositories your GitHub account cannot see The Modulify app on that account reaches repositories your GitHub account cannot see, so only an owner of the account can connect it!
You are not an admin of every repository the app reaches in the organisation Only an owner of that GitHub organization can connect it, so it was not connected!
The app reaches no repository in the organisation The Modulify app on that organization cannot reach any repository yet. Give it access to at least one repository on GitHub, then connect again!
The app reaches more than 10,000 repositories in the organisation The Modulify app on that organization reaches too many repositories to confirm your access. Limit it on GitHub to the repositories it needs, then connect again!
The organisation uses single sign-on and your GitHub session is not authorized for it That organization uses single sign-on. Authorize your GitHub session for its single sign-on on GitHub, then connect again!
The Modulify app is suspended on the account The Modulify app is suspended on that GitHub account. Unsuspend it on GitHub and try again!
The Modulify app is no longer installed on the account The Modulify app is not installed on that GitHub account!

When GitHub itself fails the authorization, the toast reads GitHub could not authorize your account, so it was not connected. Start the connection again from your workspace settings.

A GitHub account can be connected to one Modulify workspace at a time. Connecting it from a second workspace answers That GitHub account is already connected to another workspace!

When GitHub sends you back on its own

GitHub can also bring you back to Modulify without the connection Modulify started, for example after you change the Modulify app's settings on GitHub through Configure, or when you pick an account that already has the app installed. Modulify then finishes the connection for the workspace you have open. With no workspace open it stops with No workspace is open, so the GitHub account was not connected.

An account that is already connected and verified in that workspace is brought up to date without a new GitHub authorization. A GitHub account up to date toast reads That GitHub account is already connected to this workspace and is now up to date., and any site in it that was waiting for access reconnects if Modulify can reach it. While the app is suspended on the account, the toast reads That GitHub account is already connected to this workspace, but the Modulify app is suspended on it. Unsuspend it on GitHub to keep using it.

An account that is connected to another workspace stops there. A Could not connect GitHub toast reads That GitHub account is already connected to another workspace! and you land on the GitHub tab.

Any other account asks you first. A Connect GitHub account dialog reads Finish connecting @<account> to <workspace>. GitHub will ask you to confirm your account. Continue to GitHub goes on to the authorization described above, and cancelling takes you back to the GitHub tab.

Verify an account connected earlier

An account connected before this confirmation step existed shows a Not verified badge and a Verify button in its row. Click Verify to go through the GitHub authorization above for that account. Until it is verified, the account cannot hold a moved site, its private repositories cannot be imported, and it is disabled in the GitHub account picker of the Move to your GitHub row. Moving a site into it is refused with Verify this GitHub account in workspace settings before moving a site into it! Verify needs the Edit workspace permission and a paid plan, like connecting.

Disconnect an account

Disconnect removes the account from the workspace. It is refused with Sites still live in this GitHub account. Move or delete them before disconnecting it! while any site still has its code in that account, is still being copied into it or back out of it, or has lost access to its repository there. A deleted site, a site whose move failed and a site whose repository was deleted on GitHub do not hold it back.

Disconnecting does not uninstall the app on GitHub. To revoke Modulify's access completely, uninstall the Modulify app from the account's GitHub settings. A workspace cannot be transferred to someone else while it has a GitHub account connected, so disconnect its accounts first. See Workspaces.

On the mobile app

In the Modulify app for iPhone and Android, open Settings from the Workspace tab's list, then the GitHub tab. It shows the same Connected accounts list, with the same Paid badge, empty state, rows, badges and confirmations as the web, and it refreshes every 10 seconds while open.

Connect GitHub account and Verify open GitHub in a sign in window on top of the app. When GitHub sends you back, a Modulify page titled Back to the app returns you to the app, which finishes the connection with the same toasts as the web. If the app does not open on its own, tap Open the app on that page. Where the web shows a tooltip on a disabled button, the app writes the same text under it, for example Moving your code to your own GitHub requires a paid plan.

In the app's Import from GitHub sheet, Connect GitHub account, Verify GitHub account and Manage repositories open this tab.

Move a site's repository

Open the Repository section

Open the site, click More in the tab strip, then Settings. Between General and Danger zone sits Repository, Own the code of this site in your own GitHub. The rest of the tab is covered in Project settings.

The Location row reads Managed by Modulify for a site that has not moved.

Choose where the code goes

The Move to your GitHub row reads Copy the repository into a connected GitHub account. Pick a Destination first: New repository, Modulify creates it in a GitHub organization., or Existing repository, Every branch and tag in it is replaced. Then pick the account in GitHub account. An account that is not verified yet is disabled with Verify this GitHub account in workspace settings first.

For a new repository, set the Repository name. It is prefilled with your site's address slug. Names can hold letters, numbers, hyphens, underscores and dots. A personal account is listed but disabled with A new repository can only be created in a GitHub organization.

For an existing repository, pick it in Repository, which lists up to 1,000 repositories the Modulify app can reach in that account, each marked Private or Public. Personal accounts can be picked here. An archived repository is listed but disabled with Archived on GitHub. Read Move into an existing repository before you pick one, because what is in it now is deleted.

Beside Move repository sits a second button that takes you to the workspace GitHub tab. It reads Connect GitHub account while the workspace has none, and Manage repositories once at least one is connected. Move repository itself is disabled with the tooltip Connect a GitHub account in workspace settings first. while no account is connected, and, for a new repository, with A new repository can only be created in a GitHub organization. while only personal accounts are. For an existing repository it is disabled with Pick the repository the code should replace. until you pick one.

Confirm the move

Click Move repository and confirm. For a new repository the dialog asks Move this repository? and explains that the code and its full history are copied into a new repository under that account on GitHub, that Modulify keeps editing and publishing from there for as long as the Modulify app can access it, and that the move cannot be undone from Modulify.

For an existing repository the dialog asks Replace this repository? and explains that every branch and tag in it is deleted and replaced with the code of the site and its full history, that Modulify keeps editing and publishing from there for as long as the Modulify app can access it, and that this cannot be undone. When the repository is public it adds that anyone can read the site code there. The button reads Replace repository.

Wait for GitHub

Modulify creates the repository in your organisation, or uses the one you picked, pushes every commit, branch and tag into it, and makes production its default branch. In a repository you picked, it then deletes the branches and tags that were there before. While it copies, Move repository shows a spinner and the site cannot be edited or published. The chat box reads The code for this site is being copied into your GitHub. Editing and publishing are paused until it finishes. The copy usually takes a few seconds, and can take several minutes for a large history. It runs on Modulify's side, so you can leave the page. If an AI edit or a publish was still finishing when the move started, the copy waits for it rather than copying half written changes. The move is only marked complete once the copy has been checked commit for commit.

When the copy completes the Location row links to the repository on GitHub with a Connected badge, and a Repository moved toast reads Your site now lives at <organisation>/<repository> and Modulify keeps updating it there. The tab that started the move, and any tab that opened the site while the copy was running, pick this up by themselves wherever you are in the site, and their chat box comes back. The original repository stays with Modulify, archived, and the move is recorded in the site's Backups tab as a Repository move entry.

If the move is refused or fails

A move that cannot start shows a Could not move repository toast, and nothing is created or changed in your GitHub.

Situation The toast says
An AI edit or a publish is running on the site This site is being edited by AI or published right now. Wait for the current AI edit or publish to finish, then move the site!
The Modulify app was uninstalled from the account The Modulify app is no longer installed on that GitHub account. Connect it again in workspace settings, then try again!
The Modulify app is suspended on the account The Modulify app is suspended on that GitHub account. Unsuspend it on GitHub and try again!
The app has not been granted the permissions it needs there, or GitHub will not let it create the repository The Modulify app does not have the permissions it needs on that GitHub account yet. Accept the updated permissions for the Modulify app in that GitHub account's settings, then try again!
The organisation already has a repository with the new name A repository named <repository> already exists in <organisation> on GitHub. Choose another name, or rename or delete that repository on GitHub, then try again!
The repository you picked is gone, or the Modulify app cannot reach it Modulify cannot see <account>/<repository> on GitHub. Check the name, and that the Modulify app can access that repository, then try again!
The repository you picked is archived <account>/<repository> is archived on GitHub. Unarchive it on GitHub, or choose another repository, then try again!
The repository you picked already holds another site <account>/<repository> already holds another Modulify site. Choose another repository!
Another site is being moved into the repository you picked at the same moment Another site is being moved into that repository right now. Choose another repository, or try again in a moment!
The repository you picked has protected branches <account>/<repository> has protected branches on GitHub, which Modulify cannot replace. Remove the branch protection on GitHub, or choose another repository, then try again!
GitHub could not be reached GitHub could not be reached, so the move did not start. Try again in a moment!

If GitHub refuses Modulify access to the organisation, the toast reads Modulify could not get access to <organisation> to create <repository>!, and any other failure to create the repository reads Modulify could not create the repository <organisation>/<repository> on GitHub, so the move did not start. Try again in a moment!

If someone deletes the site or moves it to another workspace while the move is starting, the toast reads This site changed while the move was starting, so nothing was moved. Reload the page, then try again! and any repository Modulify had already created for the move is removed from your organisation. A repository you picked is left alone.

A copy that fails after it started also shows Could not move repository, and the Location row gets a Failed badge with the reason. The code could not be copied into your GitHub account, so the site stayed with Modulify. Try again in a moment! means the copy itself failed. A branch rule on GitHub blocked the copy, so the site stayed with Modulify. Check the branch protection and rulesets of the repository on GitHub, then try again! means a branch protection rule or ruleset on GitHub refused it. A GitHub Actions workflow file in the repository blocked the copy, so the site stayed with Modulify. Delete or rename the preview and production branches of the repository on GitHub, then try again! means GitHub would not let Modulify replace a branch that holds workflow files. The copy into your GitHub did not finish in time, so the site stayed with Modulify. Start it again when you are ready. means the copy had not finished 45 minutes after the move started. A copy that is still running is left to finish. Either way a repository Modulify created for the move is removed from your organisation, while a repository you picked stays, including whatever the copy had already changed in it. The site keeps working with Modulify, and the row lets you start over.

What Modulify does after the move

Nothing you do in the editor changes. Chat edits, restores and publishes all commit to the repository at its new home, and the preview and production servers read from there. Every commit lands in your GitHub account under Modulify's own author identity, and the Backups tab in Modulify still names the person who made the change.

The repository keeps the layout Modulify gave it. The preview branch is what the editor shows and edits, and the publish branch, production until you rename it, is what a publish writes to and builds from. Each save Modulify makes to preview also adds a backup branch whose name starts with modulify/. Modulify never reads or changes any other branch, so your own branches are yours to work on.

Push your own changes

You can change the code outside Modulify, for example by merging a pull request into preview or pushing a commit to it. Modulify loads the change and keeps it:

  • With the editor open, the preview loads the change within seconds of GitHub reporting the push. Changed files are reloaded, files deleted or renamed on GitHub are removed from the preview, and the File Explorer refreshes.
  • With nobody in the editor, the change is loaded the next time the site is opened.
  • Before the AI starts on a chat message, Modulify checks preview for newer commits and loads them first, so the AI works on the latest code. While it does, the chat reads Loading changes from GitHub...
  • Chat edits are merged into your commits rather than written over them. If you push while the AI is working on a message, your change loads once the message finishes. Where you and Modulify changed the same lines of a file, your version on GitHub is kept and every other file of the edit is still saved. A GitHub version kept notice then reads <file> was also changed on GitHub at the same time, so its GitHub version was kept., or gives the number of files when there are several.
  • Edits in the preview that were not saved yet are kept too. Modulify saves them before it loads your change, and where a file was changed both in the preview and on GitHub, the version on GitHub is kept.
  • Restoring a backup from the Backups tab replaces all of the code with that backup, including commits you pushed after it. They stay in the branch history on GitHub.

A change of up to 60 files and 4 MB is applied file by file, so the preview updates in place without restarting. A larger change, or one that touches executable files or symbolic links, reloads all of the preview's code and restarts it. If the preview has edits that could not be saved, it only takes changes it can apply file by file, and otherwise keeps its code until the next check rather than reloading over those edits. The exception is a force push that leaves GitHub without the commit the preview last loaded: those edits can then no longer be compared, so the preview reloads your code.

To publish what you merged, press Publish as usual, or call a deploy hook from your pipeline once the merge lands. Either way the publish takes preview as it is on GitHub, your commits included.

The publish branch

A publish copies preview onto the publish branch and builds the live site from it, so anything pushed straight to the publish branch is replaced by the next publish. It stays in the branch history on GitHub.

When the publish branch holds changes made on GitHub since the last publish that the preview does not already have, pressing Publish in the editor asks first. The check goes file by file, so a change you merged into preview as well does not count, even when later edits in the preview changed other lines of the same files. Nothing starts: the publish panel shows the warning The <branch> branch changed on GitHub with It got changes after the last publish that the preview does not have. Publishing replaces them with what the preview shows, and they stay only in the branch history., and its button turns into Publish anyway. Pressing it goes ahead. Closing the panel leaves the branch as it is, and the next Publish checks again. A publish started from chat asks you the same question in the chat first and goes ahead only if you agree. A publish started by a deploy hook or an AI client connected over MCP goes ahead without asking.

Rebuilds Modulify runs on its own, for example after a plan change, build the commit of the last publish rather than newer commits on the publish branch, as long as that commit is still on GitHub. To keep a production branch of your own, rename the publish branch first, as Rename the publish branch describes.

Move into an existing repository

Picking Existing repository as the Destination puts the site into a repository you already have, in an organisation or a personal account, instead of a new one. The site does not merge with what is there. It replaces it:

  • Modulify first notes every branch and tag in the repository. Any that share a name with one of the site's are deleted, and the commits, branches and tags of the site are pushed in their place.
  • Once the copy has been checked commit for commit, production becomes the default branch and every other branch and tag Modulify noted is deleted. Anything added to the repository after the move started stays.
  • A branch or tag that GitHub refuses to delete stays in the repository, and the move still completes.
  • Apart from the default branch, Modulify only changes branches and tags, so issues, the wiki and the other repository settings stay as they are. A GitHub release is tied to its tag, so a release whose tag is deleted or replaced no longer points at the code it was made from.

The repository has to be one the Modulify app can reach, not archived, without protected branches, and not already holding another Modulify site, otherwise the move is refused before anything is changed. If the move fails after it started, the repository is not deleted, and you can start the move again.

Anyone in the workspace with the Transfer projects permission can do this with any repository the Modulify app reaches in a connected account, including a personal account that was connected for importing.

Moving a site into an existing repository deletes every branch and tag that was in it, and Modulify cannot bring them back. Clone or back up the repository on GitHub first if you might need its history.

Move the code back to Modulify

A site whose code lives in your GitHub can move back into a repository Modulify manages, the way it was before you moved it.

Open the Repository section

Open the site, click More in the tab strip, then Settings. Once the code lives in your GitHub, the Repository section shows a Move back to Modulify row, Let Modulify manage the code of this site again.

Confirm the move back

Click Move back and confirm. The dialog asks Move the code back to Modulify? and explains that the code of the site and its full history are copied back into a repository Modulify manages, that Modulify edits and publishes from there again, what happens to the repository in your GitHub, and that you can move the site to your GitHub again later.

Wait for the copy

The Location row shows a Moving back badge, Move back shows a spinner, and the chat box reads The code for this site is being moved back to Modulify. Editing and publishing are paused until it finishes. If an AI edit or a publish was still finishing, the copy waits for it. The copy is checked commit for commit before Modulify switches over. When it completes, a Repository moved back toast reads Modulify manages the code of this site again., and the Location row reads Managed by Modulify.

Modulify copies back the branches it works with: preview, the publish branch, which comes back as production if you renamed it, and its own modulify/... backup branches. Branches and tags you created yourself stay only in your GitHub. A repository Modulify created in your organisation is archived once the copy is confirmed, and a repository you picked with Existing repository is left as it is. The move back is recorded in the site's Backups tab as a Repository move entry.

Moving back works on every plan, including Free, and needs the Transfer projects permission. Move back is disabled with Modulify cannot reach this repository right now. while the site is Access required or Deleted, and with You do not have permission to do this. without the permission.

If moving back is refused or fails

A move back that cannot start shows a Could not move repository back toast, and nothing changes.

Situation The toast says
An AI edit or a publish is running on the site This site is being edited by AI or published right now. Wait for the current AI edit or publish to finish, then move the code back!
The code is still being copied into your GitHub The code for this site is still being moved to your GitHub. Wait for the move to finish, then try again!
The code is already moving back The code for this site is already being moved back to Modulify!
You do not have the Transfer projects permission You do not have permission to move the code of this site!

A copy that fails after it started also shows Could not move repository back. The site stays in your GitHub, Connected, and the Location row shows the reason. The code could not be copied back to Modulify, so the site stayed in your GitHub. Make sure the Modulify app is still installed on that GitHub account with administration access, then try again! means the copy itself failed. The copy back to Modulify did not finish in time, so the site stayed in your GitHub. Start it again when you are ready. means the copy had not finished 45 minutes after it started. Your repository is not touched in either case, and you can start again.

Rename the publish branch

A publish copies the preview branch onto the publish branch and builds the live site from it. The publish branch is called production until you rename it, for example to pre-production, which frees production for a branch you merge into yourself.

Open the Publish branch row

Open the site, click More in the tab strip, then Settings. In the Repository section, the Publish branch row reads The GitHub branch every publish writes to and builds from. Its field shows the current publish branch.

Type the new name

Replace the name in the field. Branch names can hold letters, numbers, hyphens, underscores and dots, start with a letter or number, and run to 100 characters. They cannot contain two dots in a row or end with a dot or .lock, and preview and HEAD are reserved.

Confirm the rename

Click Rename branch, or press Enter, and confirm. The dialog asks Rename the publish branch? and explains that Modulify renames the branch in your repository on GitHub, that every publish after this writes to and builds from the new name, and that you update anything outside GitHub that still uses the old name, such as a deploy pipeline.

Modulify renames the existing branch on GitHub rather than creating a new one, so its history moves with it. A Publish branch renamed toast reads Publishes now go to the <branch> branch. Every publish from then on writes to the new name, and the live site is built from it. The old name no longer exists in the repository, so you can create a branch of your own with it.

The row is on every site, but the field and Rename branch only work once the code lives in your GitHub with a Connected badge. Renaming needs the Transfer projects permission and a paid plan, like moving the repository. Otherwise Rename branch is disabled with a tooltip that says why.

Situation The tooltip says
The code still lives with Modulify Move the code to your GitHub to rename this branch.
The code is still being copied into your GitHub The code is still being copied into your GitHub.
The code is being moved back to Modulify The code is being moved back to Modulify.
Modulify has lost access to the repository, or it was deleted Modulify cannot reach this repository right now.
The workspace is on the Free plan Renaming the publish branch requires a paid plan.
You do not have the Transfer projects permission You do not have permission to do this.

If the rename is refused

A rename that does not go through shows a Could not rename branch toast, and the publish branch keeps its old name.

Situation The toast says
A publish is running This site is being published right now. Wait for the publish to finish, then rename the branch!
The name breaks the naming rules Branch names can only contain letters, numbers, hyphens, underscores and dots, and must start with a letter or number!
The name is preview or HEAD That branch name is used by Modulify itself, so choose another one!
A branch with that name already exists in the repository A branch named <branch> already exists in <organisation>/<repository>. Choose another name, or delete that branch on GitHub, then try again!
The current publish branch is gone from the repository, for example deleted on GitHub The <branch> branch no longer exists in <organisation>/<repository>. If it was renamed on GitHub, type the name it has now, otherwise create it again on GitHub, then try again!
GitHub did not accept the name, for example because of a branch rule in the repository GitHub did not accept that branch name. Check the branch rules of the repository on GitHub, or choose another name!
GitHub refused the rename GitHub did not let Modulify rename the branch. Check that the Modulify app still has administration access and that no branch rule blocks the new name, then try again!
GitHub could not be reached GitHub could not rename the branch right now. Try again in a moment!

If the publish branch was renamed on GitHub itself, publishing stops until Modulify knows the new name. Type that name in the field and rename. Modulify switches to it without renaming anything, as long as it is still the repository's default branch, which a renamed production branch stays.

Handing the site to someone else

A site whose code lives in your GitHub can still be transferred to another person, or moved to another workspace, on its own or inside a folder. When it leaves the workspace, Modulify copies the code back into its own organisation as part of the handover, with the same branches as Move the code back to Modulify, so the new owner receives an ordinary site, and a repository Modulify created in your organisation is archived once the copy is confirmed. A repository you picked with Existing repository is left as it is. A renamed publish branch comes back as production, so the new owner starts with the usual name. A transfer the recipient accepts into the same workspace keeps the code where it is.

The reason is that the repository and the app installation that reaches it both belong to your account. Without moving the code back, the new owner would be editing and publishing into your GitHub organisation, through your installation, with no way to take it over and no way for you to disconnect the account afterwards.

You do not need to do anything for this. It happens when the handover is accepted, or when the workspace move runs.

Modulify needs the Modulify app to still be installed on your organisation with administration access to copy the repository back. If it cannot, the handover stops with Modulify could not copy the code for <site> back from <organisation>/<repository>, so it was not handed over. Make sure the Modulify app is still installed on that GitHub account with administration access, then try again! and the site stays with you until you fix the installation. A transfer invitation is not used up by a failed copy, so the recipient can accept it again once it is fixed.

A site that cannot be copied back is refused before anything moves.

The site The handover answers
Is still being copied into your GitHub The code for <site> is still being moved to your GitHub. Wait for the move to finish, then try again!
Is being moved back to Modulify The code for <site> is being moved back to Modulify. Wait for it to finish, then try again!
Is Access required Modulify no longer has access to <organisation>/<repository>, the GitHub repository that holds <site>, or the repository was archived. Restore the Modulify app's access to that repository or unarchive it on GitHub, then try again!
Is Deleted The GitHub repository <organisation>/<repository> that held <site> was deleted on GitHub, so the site can only be deleted now!

A copy that starts while another move of the same site is still running answers The GitHub repository for <site> is busy with another move. Try again in a moment! A site whose move failed is unaffected. Its code is still with Modulify, so it hands over and moves like any other site.

Each kind of handover deals with a site it cannot take along in its own way:

  • Transfer. Accepting the transfer into another workspace answers with the reason, and the project stays where it is.
  • Move to workspace. One refused site in the selection stops the whole move. When a copy fails part way through a move of several projects, the others still move, and a Some projects stayed toast reads <n> projects were moved successfully. <names> stayed in this workspace because their code could not be copied back to Modulify from GitHub. When nothing could move, the move fails with the reason, which for several sites reads No projects were moved because the code for <names> could not be copied back to Modulify from GitHub. Make sure the Modulify app is still installed on those GitHub accounts with administration access, then try again!
  • Moving a folder. A refusal starts with The folder was not moved. The copies then run one site at a time before anything moves. If one fails, the folder and every project in it stay in the current workspace. Sites whose code was already copied back stay too, with their code now at Modulify, and the answer names them: The folder was not moved, but the code for <names> was already copied back to Modulify from GitHub. followed by the reason.

You can also move the code back yourself at any time, without handing the site over, as Move the code back to Modulify describes.

If Modulify loses access

Modulify can only work on the repository while the Modulify app is installed on the account, can see that repository, and the repository is not archived. A site switches to Access required when the app is uninstalled or suspended, when its repository is removed from a limited installation or archived, and when its repository is transferred to an account that is not connected and verified in the site's workspace. Every edit and publish is then refused with Modulify no longer has access to the GitHub repository that holds this site, or the repository was archived. Grant the Modulify GitHub app access to the repository or unarchive it, then try again!, and messages already queued in the chat wait until access is back.

GitHub tells Modulify about most of these changes as they happen. When it does not, the first save or read that fails for lack of access makes Modulify check the repository straight away, and Modulify also rechecks connected sites periodically, so a site does not keep failing without saying why.

While a site is Access required, Modulify does not read its repository at all. The Files tab shows Could not load files, the preview cannot load the code, and exporting the code answers Could not read your code from GitHub. Please try again in a moment! Modulify also only ever reaches a moved site through the GitHub account connected in the workspace the site is in, never through a connection in another workspace.

Get access back

Opening the site shows an Access required dialog, Modulify no longer has access to the GitHub repository that holds this site, or the repository was archived. Grant the Modulify app access to the repository or unarchive it. Editing and publishing come back on their own once Modulify can reach it., with Manage GitHub access, which opens the GitHub tab of the site's workspace, and Back to projects.

Fix the cause on GitHub first: give the Modulify app access to the repository, unsuspend the app, or unarchive the repository. There is nothing to click afterwards. While the dialog is open it checks GitHub again every 10 seconds, without reloading the page, and as soon as Modulify can reach the repository the dialog closes and chat and publishing come back. Until then, a second line under the message names the first thing in the way, in this order:

What is in the way The second line reads
The account that holds the repository is not connected to the site's workspace @<account> is not connected to this workspace. Connect it in workspace settings.
The Modulify app is suspended on that account, which the GitHub tab marks Suspended The Modulify app is suspended on @<account>. Unsuspend it in the GitHub settings of @<account>.
The account is marked Not verified on the GitHub tab @<account> is not verified in this workspace. Verify it in workspace settings.
The repository is archived <account>/<repository> is archived on GitHub. Unarchive it on GitHub.
The app only reaches selected repositories on that account, and this one is not among them The Modulify app on @<account> cannot see <account>/<repository>. Add the repository to the app on GitHub.

When Modulify cannot tell what is in the way, for example because GitHub did not answer, the dialog shows the message alone. A check that does not finish changes nothing on screen, and the next one runs 10 seconds later. Checks pause while the browser tab is in the background. Modulify also checks on its own every few minutes and reconnects as soon as it can reach the repository again.

A site only reconnects through a GitHub account that is connected and verified in the site's own workspace. If you uninstalled the Modulify app, installing it again is not enough on its own: connect the account again with Connect GitHub account on the GitHub tab, and the sites waiting for access in it reconnect once it is connected.

Renamed, transferred or deleted repositories

Renaming the repository on GitHub is picked up automatically, and so is renaming the organisation, which updates the account on the GitHub tab and the Location of every site in it. Transferring the repository to another account keeps the site connected only when that account is connected and verified in the same workspace as the site. Otherwise the site switches to Access required until you connect that account there.

Deleting the repository on GitHub marks the site Deleted. It opens on a Deleted dialog, The GitHub repository that held this site was deleted, so the site can no longer be edited or published. The dialog has no buttons. While it is open it reads the site's status again every 10 seconds, so it closes on its own if a later check reconnects the site. A deleted site cannot be edited, published or handed over to another workspace, only deleted. When the Modulify app only reaches selected repositories, Modulify cannot always tell a deleted repository from one it lost access to, so the site can show Access required instead. If you restore the repository on GitHub, a later check reconnects the site. A new repository created under the same name is a different repository, so Modulify does not connect the site to it and the site stays paused. A connected site whose repository was deleted and replaced this way is marked Deleted at its next check.

If the workspace drops to the Free plan

Working on a site whose code lives in your GitHub needs a paid plan, exactly like moving it there did. If the workspace owner's subscription ends, every site whose Location row reads Connected opens on a Paid plan required dialog, The code for this site lives in your own GitHub, which needs a paid plan. Upgrade the workspace to keep editing and publishing it., and every chat edit, restore and publish is refused with the same message until the workspace is paid again. The dialog offers Back to projects and Upgrade plan, which only the owner of the site's workspace can use, so for anyone else it is disabled with the tooltip Only the workspace owner can upgrade the plan. Move back to Modulify shows for whoever has the Transfer projects permission. Moving back brings the code into a repository Modulify manages, as Move the code back to Modulify describes, and the site then works on the Free plan again. While the dialog is open it checks the workspace plan every 10 seconds and closes on its own once the workspace is on a paid plan again.

Nothing changes on GitHub. The repository stays in your organisation, the Modulify app stays installed, and the site picks up where it left off as soon as the workspace is on a paid plan again. Sites that still live with Modulify, including one whose move failed, are not affected, and finishing a Connect GitHub account flow that was started before the downgrade is refused as well.

Moving the code back to Modulify, transferring the site to another person, and moving it to another workspace all still work on the Free plan, because each of them copies the code back to Modulify.

Cloning and deleting a moved site

Cloning a moved site creates the copy as a Modulify managed repository, exactly like a new site. The copy is not placed in your GitHub account.

Deleting a moved site removes it from Modulify but never deletes your repository. The code stays in your account. The one exception is a new repository that Modulify was still copying the site into when you deleted it: that half made copy can be removed from your organisation later. A repository you picked with Existing repository is never deleted, and deleting a site whose move failed leaves your GitHub untouched.

Can I move a site into a personal GitHub account?

Yes, into a repository you already have there. GitHub does not let an installed app create repositories on a personal profile, so with New repository personal accounts are disabled in the GitHub account picker with A new repository can only be created in a GitHub organization. Create the repository on GitHub, give the Modulify app access to it, then pick Existing repository and that repository, as Move into an existing repository describes.

Can I keep what is already in my repository?

No. Moving a site into an existing repository deletes every branch and tag that was in it, so the repository ends up holding only the site. Pick New repository instead, or clone the repository on GitHub before you move the site into it.

Can I move the repository back to Modulify?

Yes. Click Move back in the Move back to Modulify row, as Move the code back to Modulify describes. The code also comes back on its own when the site is handed over to another workspace.

Can I push my own commits?

Yes. Push to preview or merge a pull request into it, and Modulify loads your commits into the editor and keeps them, as Push your own changes describes. Commits pushed straight to the publish branch are replaced by the next publish, so to keep a production branch of your own, rename the publish branch first, as Rename the publish branch describes.

Can Modulify publish to a branch I already have?

No. Renaming moves the existing publish branch to the new name, and a name that already exists in the repository is refused. The only exception is the recovery described in If the rename is refused, when the publish branch itself was renamed on GitHub.

From an AI client over MCP

A connected AI client follows and drives the same moves. get_site_repository reads where the code lives, how a move stands and which connected accounts can take it, with the code:read scope. move_site_code_to_github moves the code into a connected account, move_site_code_to_modulify moves it back and rename_publish_branch renames the publish branch, with the code:write scope, which is unticked by default. The plans and permissions on this page apply the same way.

Connecting, verifying and disconnecting a GitHub account stay in the browser, in the workspace GitHub tab. See MCP tools.