# Modifee > Modifee lets agencies and freelance developers give their clients an AI chat inside the apps they deliver; the client asks for changes in plain language, an AI agent edits the code, opens a PR on GitHub and deploys a preview. Small changes can auto-merge; the agency keeps control of the rest. ## Product Modifee lets agencies and freelance developers give their clients an AI chat inside the apps they deliver; the client asks for changes in plain language, an AI agent edits the code, opens a PR on GitHub and deploys a preview. Small changes can auto-merge; the agency keeps control of the rest. For agencies, freelancers, and dev studios that ship client-specific projects with GitHub and Vercel. ### How it works The client asks in the widget, an agent edits the code and opens a pull request on GitHub, and a preview is deployed. Small changes can auto-merge; the agency keeps control of the rest. 1. The client asks for the change in plain language, in the chat on their site. 2. An AI agent edits the repository, opens a pull request on GitHub, and a preview is deployed. 3. A small change can auto-merge after the client approves. Larger changes wait for the agency. ### Integrations Works with GitHub, Vercel, Heroku Review Apps, and Shopify themes, plus any host that posts previews to GitHub. ## Pricing Plans are monthly, in USD, plus applicable taxes. Small edits use 1 credit, bigger changes like new pages use more. Paid plans bill $0.60 per extra credit. - Free: $0 USD/month. 15 credits / month. no overage. no credit rollover. - Starter: $39 USD/month. 150 credits / month. $0.60 per extra credit. unused credits roll over 1 month. - Studio: $129 USD/month. 600 credits / month. $0.60 per extra credit. unused credits roll over 1 month. - Agency: $349 USD/month. 2000 credits / month. $0.60 per extra credit. unused credits roll over 1 month. Included in every plan: - Unlimited projects - White-label widget - Previews without a host account - Works with any host - Built-in quotes - Auto-merge is optional. Autopilot Off means every change waits for the agency. Full pricing page: https://www.modifee.com/pricing ## Comparisons / FAQ ### What is Modifee? Modifee lets agencies and freelance developers give their clients an AI chat inside the apps they deliver; the client asks for changes in plain language, an AI agent edits the code, opens a PR on GitHub and deploys a preview. Small changes can auto-merge; the agency keeps control of the rest. ### How does Modifee work with GitHub and Vercel? Each project is one GitHub repository. Modifee opens a pull request, and Vercel builds a preview from that pull request. The client reviews the preview. The pull request is squash-merged into the default branch, and the site's existing production deploy ships it. ### Does it work with Heroku? Yes. Preview detection works with Heroku Review Apps and with any host that posts deployment status to GitHub. The widget can be installed on HTML, Next.js, WordPress, Webflow, and Shopify themes (theme.liquid). ### Can my client break production? The chat does not commit to the default branch. The change stays on a pull request until it is merged. Auto-merge runs only after the client approves a change the project's Autopilot mode allows. Protected paths, deleted files, and diffs over the file and line caps always wait for the agency. Autopilot can be set to Off so every merge waits for you. ### What changes can auto-merge? Off: Every change waits for you. Safe: Text, styles, and links. Standard: Also new pages, long copy, and small UI additions. Aggressive: Same scope as Standard, with a higher file and line cap. New projects start on Aggressive. Auto-merge runs only after the client approves, and only when a preview is ready on the pull request. Protected paths, deleted files, and diffs over that mode's file and line caps always wait for the agency. ### Do I need my own Anthropic or OpenAI key? No. You do not need your own Anthropic or OpenAI key. AI usage is included in the plan and metered in credits. ### How is it priced? Monthly plans in USD, plus applicable taxes. Free is $0 USD/month (15 credits / month, no overage, no credit rollover). Starter is $39 USD/month (150 credits / month, $0.60 per extra credit, unused credits roll over 1 month). Studio is $129 USD/month (600 credits / month, $0.60 per extra credit, unused credits roll over 1 month). Agency is $349 USD/month (2000 credits / month, $0.60 per extra credit, unused credits roll over 1 month). Small edits use 1 credit, bigger changes like new pages use more. Details are on https://www.modifee.com/pricing. ### Is it for multi-tenant SaaS? No. Modifee is built for client-specific projects. One project is one GitHub repository for one client site. It is not a shared multi-tenant application used by many customers of the same product. ### What do you store from my code? We don't keep copies of your repository. Code is only read inside a temporary sandbox during a request. ### What if the change is too big? Large requests are held for a quote instead of being attempted. The agency sends the quote, and the coding agent starts after the client accepts. Backend, auth, payments, personal data, and protected paths are held that way. ## Docs # Docs Guides for installing Modifee, giving clients access, and fixing common problems. ## Getting started - [What is Modifee](https://www.modifee.com/docs/getting-started/what-is-modifee.md): A client describes a site change in the widget, and Modifee opens a pull request you can preview and merge. - [Quickstart](https://www.modifee.com/docs/getting-started/quickstart.md): Go from a new account to a merged test change on a connected GitHub repository. ## Install - [Next.js App Router](https://www.modifee.com/docs/install/nextjs-app-router.md): Add the widget script to the Next.js root layout, then confirm Widget install is complete. - [Next.js Pages Router](https://www.modifee.com/docs/install/nextjs-pages-router.md): Add the widget script to pages/_document, then confirm Widget install is complete. - [HTML and static sites](https://www.modifee.com/docs/install/html.md): Paste the widget script before the closing body tag on an HTML or static site, then confirm Widget install is complete. - [Other frameworks](https://www.modifee.com/docs/install/other-frameworks.md): Add the widget script on Vite, Astro, Flask, Django, Laravel, or Rails, then confirm Widget install is complete. ## Client access - [Auth methods](https://www.modifee.com/docs/client-access/auth-methods.md): Choose Site without login or App with login, and see what the client does before a request is accepted. - [Access marker](https://www.modifee.com/docs/client-access/access-marker.md): Choose the URL marker that shows the widget on a site without login, and replace the link when it changes. - [Allowed emails](https://www.modifee.com/docs/client-access/allowed-emails.md): Add or remove the people who can request changes, and send a test request from the agency. ## Vercel & previews - [Vercel integration](https://www.modifee.com/docs/vercel/integration.md): Install the Vercel integration, choose the project, and grant access when that project is missing from the list. - [Signing secret](https://www.modifee.com/docs/vercel/signing-secret.md): Store MODIFEE_SECRET, push it to Vercel Production and Preview, and regenerate it when the value must change. - [Redeploy](https://www.modifee.com/docs/vercel/redeploy.md): Redeploy production after MODIFEE_SECRET is pushed so the running site picks up the new value. - [Protected previews](https://www.modifee.com/docs/vercel/protected-previews.md): Open Vercel-protected preview deployments for clients, and leave other hosts on GitHub detection. ## Using the widget - [For clients](https://www.modifee.com/docs/widget/for-clients.md): How to ask for a site change in the widget, review the preview, and read the messages you may see. - [Voice dictation](https://www.modifee.com/docs/widget/voice-dictation.md): Dictate a widget request into the text box, and how that recording is billed. ## Agency workflow - [Inbox](https://www.modifee.com/docs/agency/inbox.md): What each request status asks you to do, and what the Test badge means. - [Quotes and merges](https://www.modifee.com/docs/agency/quotes-and-merges.md): Send a quote, see what the client gets, then merge, retry, or reject. - [Autopilot and limits](https://www.modifee.com/docs/agency/autopilot-and-limits.md): The Autopilot and limits settings, their defaults, and the plan's credits. - [Guardrails](https://www.modifee.com/docs/agency/guardrails.md): Paths the coding agent must not change, the defaults, and how to edit the list. - [Health indicators](https://www.modifee.com/docs/agency/health-indicators.md): The Home light, and the green or yellow mark on each project Settings section. ## Troubleshooting - [Symptom index](https://www.modifee.com/docs/troubleshooting/index.md): Match a symptom to a troubleshooting page, and the error codes that show up most often. - [Widget not showing](https://www.modifee.com/docs/troubleshooting/widget-not-showing.md): The change button never appears on the client site. - [Email not allowed](https://www.modifee.com/docs/troubleshooting/email-not-allowed.md): The widget refuses the client's email. - [Token errors](https://www.modifee.com/docs/troubleshooting/token-errors.md): App with login: the widget cannot verify the signed client token. - [Secret and redeploy](https://www.modifee.com/docs/troubleshooting/secret-and-redeploy.md): MODIFEE_SECRET is missing on Vercel, or a redeploy did not pick it up. - [Previews](https://www.modifee.com/docs/troubleshooting/previews.md): No preview was detected, the preview is protected, or the last check failed. - [Agent and pull request](https://www.modifee.com/docs/troubleshooting/agent-and-pr.md): The agent failed, no pull request was opened, or a monthly limit stopped the request. - [Billing and plan](https://www.modifee.com/docs/troubleshooting/billing-and-plan.md): A plan limit, a missing billing account, a checkout that did not open, or the project's monthly request cap. ## Errors - [Error catalog](https://www.modifee.com/docs/errors.md): Every Modifee error code, with what caused it and how to fix it. - [MDF-AUTH-001](https://www.modifee.com/docs/errors/MDF-AUTH-001.md): You need to sign in. - [MDF-AUTH-002](https://www.modifee.com/docs/errors/MDF-AUTH-002.md): This email isn't allowed to request changes on this site. - [MDF-AUTH-003](https://www.modifee.com/docs/errors/MDF-AUTH-003.md): You don't have access to this. - [MDF-AUTH-004](https://www.modifee.com/docs/errors/MDF-AUTH-004.md): That code is incorrect or has expired. - [MDF-AUTH-005](https://www.modifee.com/docs/errors/MDF-AUTH-005.md): Too many attempts. Request a new code. - [MDF-REQ-001](https://www.modifee.com/docs/errors/MDF-REQ-001.md): Something was off with that request. - [MDF-REQ-002](https://www.modifee.com/docs/errors/MDF-REQ-002.md): We couldn't find that. - [MDF-REQ-003](https://www.modifee.com/docs/errors/MDF-REQ-003.md): That conflicted with the current state. - [MDF-REQ-004](https://www.modifee.com/docs/errors/MDF-REQ-004.md): You've used the adjustments included with this change. - [MDF-QUOTA-001](https://www.modifee.com/docs/errors/MDF-QUOTA-001.md): Request received — your team has been notified and will process it shortly. - [MDF-QUOTA-002](https://www.modifee.com/docs/errors/MDF-QUOTA-002.md): Too many requests. Try again in a moment. - [MDF-QUOTA-003](https://www.modifee.com/docs/errors/MDF-QUOTA-003.md): Too many codes requested. Try again in a few minutes. - [MDF-PLAN-001](https://www.modifee.com/docs/errors/MDF-PLAN-001.md): This workspace is over its plan limit. - [MDF-PLAN-002](https://www.modifee.com/docs/errors/MDF-PLAN-002.md): This workspace has no billing account yet. - [MDF-PLAN-003](https://www.modifee.com/docs/errors/MDF-PLAN-003.md): Billing could not be opened. - [MDF-PLAN-004](https://www.modifee.com/docs/errors/MDF-PLAN-004.md): You've reached this month's request limit. Your team can raise it. - [MDF-WIDGET-001](https://www.modifee.com/docs/errors/MDF-WIDGET-001.md): That file could not be attached. - [MDF-WIDGET-002](https://www.modifee.com/docs/errors/MDF-WIDGET-002.md): Transcription failed. - [MDF-WIDGET-003](https://www.modifee.com/docs/errors/MDF-WIDGET-003.md): The sign-in email could not be sent. - [MDF-WIDGET-004](https://www.modifee.com/docs/errors/MDF-WIDGET-004.md): Allow the microphone in your browser to dictate. - [MDF-WIDGET-005](https://www.modifee.com/docs/errors/MDF-WIDGET-005.md): The connection was lost. - [MDF-VERCEL-001](https://www.modifee.com/docs/errors/MDF-VERCEL-001.md): Vercel could not complete that request. - [MDF-VERCEL-002](https://www.modifee.com/docs/errors/MDF-VERCEL-002.md): The preview signing secret is missing or was not saved. - [MDF-VERCEL-003](https://www.modifee.com/docs/errors/MDF-VERCEL-003.md): The preview could not be opened. - [MDF-INTERNAL-001](https://www.modifee.com/docs/errors/MDF-INTERNAL-001.md): Something broke on our end. We've been notified. - [MDF-INTERNAL-002](https://www.modifee.com/docs/errors/MDF-INTERNAL-002.md): Modifee is briefly unavailable. # What is Modifee A client describes a site change in the widget, and Modifee opens a pull request you can preview and merge. Modifee is a workspace in the dashboard. You connect a GitHub repository for a client site, add a chat widget to that site, and the client asks for a change in plain language. A coding agent opens a pull request. The client reviews a preview. The change is squash-merged into the default branch. The English widget button is **Request a change**. The same strings exist in French and Spanish. Dashboard labels stay in English. ## Who it's for Agencies and freelance developers who ship client sites from GitHub. One workspace holds the projects. Each project is one repository. Clients never see the **Project name**. ## How a change moves 1. The client opens **Request a change** and describes the edit. The empty state says "A change to make on your site?" and "Describe it in a few words. You'll get a preview to approve before it goes live." 2. Modifee classifies the request. A small change is queued for the coding agent. A large one is held: backend, auth, payments, personal data, a third-party service, a form that saves or sends data, a whole-site redesign, an ambiguous scope, a protected path, or a change that is too large. The dashboard status is **Needs a quote**. Open the request from the **Inbox** and press **Send quote to client**. The client presses **Accept** or **Decline**. **Accept** queues the agent. Until then the widget says `In review by` and the team name. 3. The agent edits the repository and opens a pull request. The dashboard shows **Agent running**, then **Building preview**. 4. The client reviews the preview and presses **Looks good**. The widget status is "Preview ready — please review". If no preview is available, the dashboard shows **No preview** and the widget says `Ready for` the team name `to review`. 5. The pull request is squash-merged into the default branch. You press **Approve & merge**, or [Autopilot](https://www.modifee.com/docs/agency/autopilot-and-limits) merges an eligible change after **Looks good**. The widget then says **Live**. The dashboard status is **Merged**. New projects store Autopilot as **Aggressive**. That mode can merge trivial and standard changes after the client approves. **Off** waits for **Approve & merge** on every change. Protected files always wait for you. ## What Modifee does not do - It does not commit the change straight to the default branch. The work is a pull request until it is merged. - It does not start the coding agent on a **Needs a quote** request until the client presses **Accept**. - It does not let the agent edit a protected path. Those requests are held for a quote, and the agent blocks writes to those files. See [Guardrails](https://www.modifee.com/docs/agency/guardrails). - It does not show the widget to every visitor when **Authentication** is **Site without login**. The button stays hidden until the client opens the access-marker link. Only addresses under **Who can request changes?** can send a request. Anyone else sees "This email isn't allowed to request changes on this site." - It does not show the widget to guests when **Authentication** is **App with login**. The page must pass a signed `data-token`. Without it, the browser console says "Modifee: data-project and data-token are required". - It does not host the client site. You keep deploying the site. Modifee reads the repository you connect and opens pull requests on it. Next: [Quickstart](https://www.modifee.com/docs/getting-started/quickstart). # Quickstart Go from a new account to a merged test change on a connected GitHub repository. ## Prerequisites - A GitHub account that can install a GitHub App on the client repository. - The repository's default branch. The new-project screen labels it **Watching branch**. - The public URL of the deployed site. Local addresses are rejected. ## Steps 1. Open the sign-in page. The heading is **Sign in to Modifee**. Press **Continue with GitHub**. The page says: "Use your GitHub account. We'll ask you to install the Modifee GitHub App on the repos you choose." 2. Open **Projects**. If no GitHub App is installed, the empty state is **Connect GitHub**, with the text "Install the GitHub App before creating a project." Press **Install GitHub App** and grant the repositories you want. 3. Press **New project**. If the list is empty, the empty state is **Connect your first repo** and the button is **Connect a repo**. Choose **Repository** and **Project name**, then press **Create project**. The form states "Approved changes open a pull request on this repo." 4. The project opens on the setup wizard, step **Connect**. Enter **Site URL** (placeholder `https://example.com`) and press **Continue**. You can change it later under **Settings → Connection → Site URL**. 5. On **Client access**, pick how the client opens the widget. **Public site, no login** asks for an email code. **Site with login** uses a server token. Add at least one address under **Who can request changes?** Press **Continue**. Details: [Auth methods](https://www.modifee.com/docs/client-access/auth-methods), [Allowed emails](https://www.modifee.com/docs/client-access/allowed-emails), [Access marker](https://www.modifee.com/docs/client-access/access-marker). 6. On **Install the widget**, press **Install automatically** or open **Install manually** and paste the snippet. Install guides: [Next.js App Router](https://www.modifee.com/docs/install/nextjs-app-router), [Next.js Pages Router](https://www.modifee.com/docs/install/nextjs-pages-router), [HTML and static sites](https://www.modifee.com/docs/install/html), [Other frameworks](https://www.modifee.com/docs/install/other-frameworks). 7. Save **Site URL** if you skipped it, deploy the site, then press **Check installation** under **Settings → Widget install**. Continue when the mark beside **Widget install** is green. See the install page for your stack. 8. On the project header, press **Send a test request**. When the site URL is saved and the last check is not unreachable, this opens the live site with the access marker, test mode, and the draft "Change the homepage heading to Welcome". Press **Send** in the widget. The banner says "Test mode — agency". 9. Watch the request in **Inbox** or the project's **Requests** tab. After a preview, press **Looks good** in the widget. Then either Autopilot merges it, or the status is **Needs your merge** and you press **Approve & merge**. The dialog says "Squash-merge this pull request into the default branch." See [Quotes and merges](https://www.modifee.com/docs/agency/quotes-and-merges) and [Autopilot and limits](https://www.modifee.com/docs/agency/autopilot-and-limits). Previews are a separate wizard step, **Previews**. If the client cannot open the preview, see [Previews](https://www.modifee.com/docs/vercel/protected-previews) and [Preview problems](https://www.modifee.com/docs/troubleshooting/previews). ## Verify The request status in the dashboard is **Merged**. The widget status is **Live**. ## Troubleshooting - Sign-in: "This email is already linked to another sign-in method. Use the original method, or a different GitHub account." "Access was denied. Try again with the GitHub account you use for work." "Sign-in is temporarily unavailable. Try again in a moment." "Something went wrong while signing in. Try again." - Repositories: `Could not load repositories for` and the GitHub account login. Press **Try again**. **No repositories available** links to **Configure GitHub App access**. **Don't see your repository?** opens the GitHub App settings. `Every repository from` the account login `is already connected to a project.` `This repository is already connected to a project.` - Plan cap: "The Free plan includes 1 project." Other plans use the same sentence with their name and limit. The link beside it is **Upgrade to add another.** - Site URL: "Enter a public http(s) URL." "Enter a public site URL. Local addresses can't be used here." - Widget missing: [Widget not showing](https://www.modifee.com/docs/troubleshooting/widget-not-showing). - "This email isn't allowed to request changes on this site." is [MDF-AUTH-002](https://www.modifee.com/docs/errors/MDF-AUTH-002). See [Email not allowed](https://www.modifee.com/docs/troubleshooting/email-not-allowed). - "You've reached this month's request limit." is [MDF-QUOTA-001](https://www.modifee.com/docs/errors/MDF-QUOTA-001). - "This workspace is over its plan limit." is [MDF-PLAN-001](https://www.modifee.com/docs/errors/MDF-PLAN-001). - Preview will not open: [MDF-VERCEL-003](https://www.modifee.com/docs/errors/MDF-VERCEL-003) and [Preview problems](https://www.modifee.com/docs/troubleshooting/previews). # Next.js App Router Add the widget script to the Next.js root layout, then confirm Widget install is complete. ## Prerequisites - A Modifee project whose repository has `next.config.js`, `next.config.mjs`, `next.config.cjs`, or `next.config.ts`. - One root layout: `app/layout.tsx`, `app/layout.jsx`, `src/app/layout.tsx`, or `src/app/layout.jsx`. - **Site URL** saved under **Settings → Connection**. - **Authentication** chosen under **Settings → Client access**. The wizard step **Client access** uses **Public site, no login** and **Site with login** for the same two modes. Settings calls them **Site without login** and **App with login**. The default is **Site without login**. ## Steps Do this from the wizard step **Install the widget**, or from **Settings → Widget install**. ### Site without login 1. Open **Install manually** and select the tab **Next.js (App Router)**. The instruction is "Add this once to the root app/layout.tsx, inside `
`." 2. Put this in the root layout. If the layout already exists, add the `Script` import and the `Script` tag. Do not replace the rest of the file. **Install automatically** does the same edit: it inserts `import Script from "next/script"` and places the tag just before ``. ``` import Script from "next/script"; export default function RootLayout({ children }: { children: React.ReactNode }) { return ( {children} ); } ``` `YOUR_PROJECT_KEY` is the `data-project` value already filled in on the **Next.js (App Router)** tab. The same value is shown under **Settings → Danger zone**. `https://www.modifee.com/widget.js` is the script URL the dashboard uses when `NEXT_PUBLIC_APP_URL` is unset. Copy `src` from the tab if your dashboard shows a different origin. This mode does not use `MODIFEE_SECRET`. 3. Or press **Install automatically**. Modifee opens a pull request titled "Install Modifee widget" on branch `modifee/install-widget`. Merge it, wait for the site to redeploy, then check the installation. The button on that pull request is **Merge on GitHub**. If the repo also has `pages/_document`, this mode edits that file too. See [Next.js Pages Router](https://www.modifee.com/docs/install/nextjs-pages-router). ### App with login 1. Set **Settings → Client access → Authentication** to **App with login** and save. 2. Set `MODIFEE_SECRET` from **Settings → Client access → Signing secret**. The value is in the code block labeled **MODIFEE_SECRET**. If Vercel is not connected, the page says "Add this value as the MODIFEE_SECRET environment variable on your host. The agency app signs the logged-in user's email with HMAC-SHA256." Press **Connect Vercel** when that button is shown. After a push, the line is "MODIFEE_SECRET set on Vercel ✓". Redeploy production and preview so the new variable is live. See [Signing secret](https://www.modifee.com/docs/vercel/signing-secret) and [Secret and redeploy](https://www.modifee.com/docs/troubleshooting/secret-and-redeploy). 3. Open **Install manually** and select **Next.js (App Router)**. The tab also lists **Next.js (Pages Router)**, **Flask**, **Django**, **Laravel**, and **Rails**. Paste the signing function and the layout. The hint is "Server Component. Create the token on the server and render the tag only for a logged-in user." Then "Store the secret as MODIFEE_SECRET in your server environment." and "Sign the email on the server. The browser only receives the signature." ``` // server-only — never import this file from client code import crypto from "crypto"; export function modifeeToken(email, name) { const payload = Buffer.from( JSON.stringify({ email, name, exp: Math.floor(Date.now() / 1000) + 86400, }), ).toString("base64url"); const sig = crypto .createHmac("sha256", process.env.MODIFEE_SECRET) .update(payload) .digest("base64url"); return `${payload}.${sig}`; } import { modifeeToken } from "@/lib/modifee"; export default async function RootLayout({ children }) { const user = await getSessionUser(); return ( {children} {user ? ( ) : null} ); } ``` `YOUR_PROJECT_KEY` is the key in the dashboard snippet. `getSessionUser` is not a Modifee function. Replace it with the call that returns the signed-in user. The tag renders only when that user exists. Guests do not get a token, so they do not see the widget. 4. Or press **Install automatically**. For **App with login** the pull request adds three files and does not use the manual layout above. Paths are `lib/modifee.ts` and `components/modifee-widget.tsx`, or `src/lib/modifee.ts` and `src/components/modifee-widget.tsx` when the layout is under `src/app/`. The layout gets an import of `ModifeeWidget` from the relative path to the component, and `