Projects
Create projects, switch between them, rename, archive, duplicate, transfer, and delete from the MaShop workspace.
How-to guide
Each MaShop project is one row in the projects table: a name, a slug, an optional description, and links to your GitHub repo, Netlify site, and Supabase project. You manage projects from inside the workspace, not from a separate dashboard. This guide covers every project action that is wired in the product: create, switch, rename, archive, duplicate, transfer ownership, and delete.
Where the project controls live
There is no project-list page. Opening /projects redirects you straight into a workspace: it first tries the last project you visited (stored in localStorage under mashop:lastProjectId), then your most-recently-updated project, and if you have none it creates one for you by calling POST /api/store/ensure. If that call fails you see the reason inline, for example Impossible de créer votre projet. Réessayez dans un instant. followed by the HTTP status such as HTTP 503, plus a Réessayer button.
Two surfaces in the workspace carry the project actions:
- The project switcher in the top navigation band. Click the project name (next to the MaShop logo) to open a popover with a search box, a Nouveau projet row, and a list of your projects.
- The project settings modal, with three tabs: Général (name, slug, description), Déploiement (service connections, deploy URL), and Zone dangereuse (archive, transfer, delete). Open it from the settings entry point or with
Cmd+,(macOS) /Ctrl+,(Windows/Linux).
Create a project
Open the project switcher and click Nouveau projet. The Créer un projet modal asks for:
- Nom du projet (required). The internal workspace name. It must be 2 to 100 characters, or the server rejects it with
Le nom du projet doit faire au moins 2 caracteres. - Identifiant (slug). Auto-generated from the name and editable. Lowercase letters, digits, and hyphens.
- Description (optional).
- Type de projet (optional). Choices include E-commerce, Restaurant, Réservation, Abonnement, Billetterie, Services, Digital, and Autre. The type only hints what to build; it is not a fixed taxonomy.
The modal also shows three service cards: GitHub, Supabase, and Netlify. GitHub and Supabase are required; Netlify is optional. The Créer button stays disabled until the name is valid and both GitHub and Supabase are connected.
Submitting calls this route. If GitHub or Supabase is not connected, it returns HTTP 422 with Connectez GitHub et Supabase avant de créer un projet. and a missing list, because the AI cannot commit code or run migrations without them. On success you are routed to /projects/{id}, the new project opens, and a Projet créé toast appears. Creation is rate-limited to 5 per minute per account.
Why both services are required up front
Your code lives in your own GitHub repo and your data lives in your own Supabase project. MaShop orchestrates them but never holds your customer data. Connecting both at create time prevents a half-built project the AI cannot finish.
Switch between projects
Click the project name in the navigation band. The popover lists your projects, newest first, with the current one pinned to the top and marked with a check. Use the Rechercher un projet… field to filter by name or slug. Clicking a row navigates to /projects/{id}. When a filter matches nothing you see Aucun résultat.
The list combines projects you own with projects where you are an active collaborator. The popover renders up to 50 entries. This endpoint is rate-limited to 30 requests per minute per IP.
Rename a project
Open the project settings modal and stay on the Général tab. Edit Nom du projet, Slug, or Description, then click Enregistrer. The name and slug both feed the navigation band, so the switcher reflects the new name after the save. Enregistrer is disabled until you change something.
The save writes directly to your projects row. If you change the slug and a Netlify site already exists, MaShop also tries to rename the *.netlify.app subdomain to follow the new slug. That rename is best-effort: if the subdomain is already taken you get Sous-domaine déjà pris sur Netlify. Le slug est enregistré, mais l'URL en ligne n'a pas changé. and the slug stays saved regardless.
Duplicate a project
Open the left sidebar, open its project menu, and hover a project row. A Dupliquer icon button appears on the right of the row.
The copy is created under your account and named with a (copy) suffix. You can duplicate any project you can read, including ones shared with you as a collaborator. The new project does not inherit the source's GitHub repo, Netlify site, or linked Supabase project; those start empty. On success you are routed into the new project.
Two limits apply. Each account is capped at a project quota (the MAX_STORES_PER_USER environment value, default 50); exceeding it returns HTTP 402 with Quota atteint (50 projets max). Duplication is rate-limited to once per minute, returning Trop rapide, réessayez dans 1 minute if you click again too soon.
Archive a project
Open the project settings modal and select the Zone dangereuse tab. The first row is Archiver le projet. Click Archiver, then confirm in the warning dialog.
Archiving sets archived_at on the project row. The data is preserved: the project row, its files, its memory, and every child row stay. Archive is owner-only; an editor or viewer who calls the route gets HTTP 403 with Seul le propriétaire peut archiver ce projet. The route is rate-limited to 20 calls per 5 minutes per IP.
Archive is reversible; the danger tab is owner-only
The Zone dangereuse tab is hidden from editors and viewers, so only the owner sees archive, transfer, and delete. Archiving is a soft hide that keeps all data, unlike delete below.
Transfer ownership
In the Zone dangereuse tab, use the Transférer la propriété row and click Transférer. Enter the recipient's email and an optional message.
This records a transfer invitation and emails the recipient a signed accept link that is valid for 7 days. Only the current owner can start a transfer (HTTP 403 otherwise: Seul le propriétaire peut transférer ce projet.), and you cannot transfer to your own email (Vous êtes déjà propriétaire de ce projet.). Starting a transfer cancels any earlier pending invitation to the same email for the same project. Transfers are rate-limited to 5 per hour per IP. On success you see Demande de transfert envoyée.
The recipient completes the transfer by clicking the email link, which hits this route. They must be signed in to MaShop with the exact email the invitation was sent to; a mismatch redirects to a transfer-error page. When accepted, projects.user_id flips to the recipient and they land in /projects/{id}.
| What happens on accept | Result |
|---|---|
| New owner | Gains full ownership of the project |
| Previous owner | Loses access; not auto-added as a collaborator |
| Link reuse | An already-accepted, declined, cancelled, or expired link errors out |
Transfer is a full handover
After acceptance the previous owner has no access. If they still need to edit, the new owner can invite them back as a collaborator. See Collaborators.
Delete a project
In the Zone dangereuse tab, the last row is Supprimer définitivement. Click Supprimer. A confirmation dialog requires you to type the project name before Supprimer définitivement activates.
Delete is irreversible and cascading. It deletes your GitHub repo, deletes your Netlify site, and deletes the project row, which cascades to its files, sessions, and AI memory. The third-party steps are best-effort: if a token is missing the route still deletes the project row and returns warnings.
Delete is owner-only; editors and viewers get HTTP 403 with Seul le propriétaire peut supprimer un projet. The route is rate-limited to 5 deletes per 15 minutes per IP. After a successful delete you are sent back to /projects.
Your Supabase project is not deleted
Delete removes the GitHub repo and Netlify site, but it never touches your Supabase project, which holds your business data (orders, customers, products). Allocated credits are not refunded. If you also want to remove the database, delete it yourself from the Supabase dashboard.
Who can do what
| Action | Who can run it | Reversible |
|---|---|---|
| Create, switch, rename | Owner (and collaborators for switch) | Yes |
| Duplicate | Anyone who can read the project | n/a (creates a new project) |
| Archive | Owner only | Yes (data preserved) |
| Transfer | Owner only | No (full handover) |
| Delete | Owner only | No (irreversible) |
Next steps: connect the services a project needs in Connect services, add teammates in Collaborators, and ship in Deploy to Netlify.
