# fline docs > Every page of the fline docs in one file. Each page is also at its own .md address, listed in https://dev.fline.sh/llms.txt. --- # Start here Last checked 16 October 2026. The same page on the web: https://dev.fline.sh/docs This page explains what fline does for you, the three steps to put your app online, and who fline is for today. At the bottom is a list of every help page, so you can go straight to the step you are on. ## What fline does for you Your app works on your computer. The preview opens, the buttons work, but only you can see it. fline is hosting: a place where your app runs online, with a link you can send to other people. Claude Code does most of the work. You connect it to fline once, then ask it to put your project online. fline works out how to build and run your app, so there are no setup files to write. You never rent, log in to or look after a server. Your app gets: - **A link you can send.** It opens on any phone or computer. - **A database of your own,** if your app needs to remember things like sign-ups or bookings. fline can create it and run it. - **A web address you own,** like www.yourbakery.com, if you want one. fline sets up the padlock and renews it. If something goes wrong later, ask Claude Code again. It can see what went wrong, try a fix, or put an earlier version back. fline is free during the private beta. No card. Claude Code's own plan is separate: when Claude Code puts your app online or fixes something, that uses your plan as usual. ## Three steps 1. **Connect.** Paste one line from your fline dashboard into your computer's Terminal app, then approve fline in your browser. For now, you do this once for each project folder. 2. **Ask.** Tell Claude Code: ```prompt Put this project online with fline. ``` If your app needs passwords or keys, Claude Code gives you a link to a private fline page where you type them. 3. **Send the link.** Your app has a link that opens on any phone or computer. If something breaks, ask again. Before step 1 you need a fline account. fline is in private beta, and we open accounts by hand, a few at a time. [Getting your account](https://dev.fline.sh/docs/get-access) explains how. ## Who it's for, today - You build with Claude Code on your own computer, and your app works there. - Only you can open it so far, and you want your first users on it. - You'd rather ask in plain words than learn how hosting works. - You're happy to do the few steps that need you: paste one line, approve fline in your browser, and type any keys on a private page. Using the Code tab in the Claude desktop app? We haven't tested it with fline yet. The tested route today is Claude Code in your computer's Terminal app. Using Cursor, Codex or VS Code? There are setup steps for them, not yet tested from start to finish. ### Not for you yet if - Your app was made in ChatGPT, on the Claude website or inside an app builder like Lovable or Bolt, and isn't a folder on your computer. - You want to hand fline a GitHub link. - Your business can't afford to be offline or to lose data. During the private beta every app runs on one rented machine, with no spare, and there are no backups you can count on yet. - Your app needs to run things on a schedule, needs pausing, or needs more than a small, fixed share of one machine. - You need one account shared by a team. [What fline does today](https://dev.fline.sh/#faq) and [fline facts](https://dev.fline.sh/facts) have the details, with a date on them. ## Every help page ### Start here - [Getting your account](https://dev.fline.sh/docs/get-access): the waitlist, the email that says your account is open, and creating your account. - [Put your app online](https://dev.fline.sh/docs/first-launch): the whole first launch, step by step. ### Connect your AI - [Connect Claude Code](https://dev.fline.sh/docs/connect-claude-code): the tested way. One line in Terminal. - [Connect Cursor](https://dev.fline.sh/docs/connect-cursor): setup steps, not yet tested from start to finish. - [Connect Codex](https://dev.fline.sh/docs/connect-codex): setup steps, not yet tested from start to finish. - [Connect VS Code](https://dev.fline.sh/docs/connect-vscode): setup steps, not yet tested from start to finish. - [Other AI apps](https://dev.fline.sh/docs/connect-other): Grok, Antigravity, anything else, and what the Claude desktop app and chat apps can and can't do. ### Do more - [Passwords and keys your app uses](https://dev.fline.sh/docs/keys): the private page where you type them. - [A database of your own](https://dev.fline.sh/docs/database): when your app needs to remember things. - [Use a web address you own](https://dev.fline.sh/docs/web-address): put your app at an address like www.yourbakery.com. - [Change your app after it is online](https://dev.fline.sh/docs/update-your-app): updates, and putting an earlier version back. ### When something goes wrong - [When something goes wrong](https://dev.fline.sh/docs/when-something-breaks): what you see, and what to say to Claude Code. ### Reference - [Reference for AI coding apps](https://dev.fline.sh/docs/for-ai): the technical details, written for Claude Code and other AI apps. ## If you are an AI app reading this Read [/docs/for-ai](https://dev.fline.sh/docs/for-ai) for the technical reference: how to connect, the upload rules, how passwords and keys reach fline, and the build plan file. [/llms.txt](https://dev.fline.sh/llms.txt) lists every docs page as plain markdown, and [/llms-full.txt](https://dev.fline.sh/llms-full.txt) has all of them in one file. Every page here is also available as markdown by adding `.md` to its address. When your person asks you to put their project online with fline, follow the server's own instructions and its `deploy_a_repository` prompt. Hand any private fline page link to the person without opening it. Next: [Getting your account](https://dev.fline.sh/docs/get-access) --- # Getting your account Last checked 16 October 2026. The same page on the web: https://dev.fline.sh/docs/get-access This page takes you from the waitlist to an open fline account. It covers the emails you'll get, how to create your account with the right email address, the code we send you, and what to do if a screen tells you to wait. ## 1. Ask for early access fline is in private beta. We open accounts by hand, a few at a time, as room opens. Go to [the sign-up form](https://dev.fline.sh/#join) and enter your email address. The other questions are there to help us, and you can skip the optional ones. After you join, we send you one email to confirm it: **You're on the fline list**. If you joined before we started sending it, you won't get this one. You're still on the list, and you'll still get the next email. ## 2. Wait for "Your fline account is open" When we open your account, we send you an email: **Your fline account is open**. It has a link to create your account. You don't need to do anything while you wait. If you'd like your place on the list removed, write to privacy@fline.sh from the address you signed up with. ## 3. Create your account with the same email address Open [https://app.dev.fline.sh/registration](https://app.dev.fline.sh/registration). This is where your fline dashboard lives, the page where you'll see your apps. - **Use the same email address you joined the waitlist with.** That's how fline knows the account is yours. An account with a different address isn't matched to your place on the list, so it waits on its own. - Choose a password. If the page refuses it, it says why. A longer password you haven't used anywhere else usually works. - Any other boxes, like your name, are optional. You can create your account before the "account is open" email arrives. It just stays on a waiting screen until we open it. ## 4. Enter the code we email you As soon as you create your account, you're signed in and fline asks you to **confirm your email**. We send a code to your address. The subject starts with "Confirm your email address". Type the code on the fline page and press the button to confirm. The code works once, and only for a short while. If it has stopped working, the same page can send you a new one. The email also has a link you can open instead of typing the code. That link may open a plainer page that doesn't look like the rest of fline. It is still fline's own sign-in system. ## 5. Open your fline dashboard once After the code, open [your fline dashboard](https://app.dev.fline.sh). Visiting it once sets up your account. Claude Code can't use fline until you've done this. We send you a short welcome email the first time you open your dashboard after your account is open. If your dashboard opens and shows steps to connect your AI app, your account is open and ready. Go on to [connect Claude Code](https://dev.fline.sh/docs/connect-claude-code). ## What the waiting screen means Instead of your dashboard, you may see a screen that asks you to wait or to do one thing. It shows the email address you're signed in with. Check that address first: most problems come from using a different one. | What the screen says | What it means | What to do | |---|---|---| | You're on the list | Your sign-in works, but your account isn't open yet. | Wait for the "Your fline account is open" email, then sign in again. If you joined the waitlist with another address, sign out and create an account with that one. | | Confirm your email address | You haven't entered the code yet. | Press **Enter the code**, then type the code from the email. | | This address is already in use | Another fline account already has this email address. | Sign in with that account instead. If you can't, use the contact links on [the fline site](https://dev.fline.sh/#contact). | | This account has not been granted access | We decided not to open this account. | If you think it's a mistake, use the contact links on [the fline site](https://dev.fline.sh/#contact). | The screen checks again when you come back to it, so you can leave it open in a tab. ## If no email arrived 1. **Look in your spam or junk folder,** and in tabs like Promotions or Updates. Search your inbox for "fline". 2. **Check the address.** Was it the one you typed on the waitlist form? A small typo means the email went somewhere else. 3. **Sign in to check.** Go to [https://app.dev.fline.sh/login](https://app.dev.fline.sh/login). If you don't have an account yet, create one at [https://app.dev.fline.sh/registration](https://app.dev.fline.sh/registration) with your waitlist address. If your dashboard opens, your account is open, whether or not the email reached you. If you see "You're on the list", it isn't open yet. 4. **No code?** On the "Confirm your email" page, ask for a new code. Look in spam again before asking twice. 5. **Forgot your password?** Use **Forgot password?** on the [sign-in page](https://app.dev.fline.sh/login). We email you a code to set a new one. ## The emails fline sends you Until your account opens, we only email you about getting in: a confirmation when you join and an email when your account opens. Once you use fline, it also sends a welcome, up to three short emails to help you get started (each stops once you've done that step), and emails about your launches. Every one of these has an unsubscribe link. Here is each one: - **You're on the fline list,** once, when you join (only if you joined after we started sending it). - **Your fline account is open,** once, when we open your account. - **A welcome,** the first time you open your dashboard after your account is open. - **Up to three short emails to help you get started:** one if you haven't created your account a couple of days after it opens, one if you haven't connected Claude Code yet, and one if nothing of yours is online yet. Each one stops once you've done that step. - **Emails about your launches:** when fline starts getting your app ready, when it's live, and if it can't get it built and started. Two more emails carry a code rather than news, and these two have no unsubscribe link: - **The code to confirm your email address,** when you create your account. - **A code to set a new password,** if you ask for one. There's no newsletter. Next: [Connect Claude Code](https://dev.fline.sh/docs/connect-claude-code), then [put your app online](https://dev.fline.sh/docs/first-launch). --- # Put your app online Last checked 16 October 2026. The same page on the web: https://dev.fline.sh/docs/first-launch This page walks you through your first launch with fline, from a project that works on your computer to a link you can send. It covers the few steps that need you, the sentence to type, what you see while fline gets your app ready, and what to say to Claude Code afterwards. ## Before you start: is this you? This path fits if: - you built your app with Claude Code; - your project is a folder on your computer, and the app runs there; - your fline account is open. If it isn't yet, see [Getting your account](https://dev.fline.sh/docs/get-access). If you made your app in ChatGPT, on the Claude website, or in an app builder like Lovable or Bolt, fline can't take it yet. [Other AI apps](https://dev.fline.sh/docs/connect-other) explains why. If you use the Code tab in the Claude desktop app: we haven't tested it with fline yet. The path we've tested is Claude Code in your computer's Terminal app. ## 1. Connect Claude Code to fline Your fline dashboard shows one line to copy. Open your computer's Terminal app, go to your project folder, paste the line, and approve fline in your browser. For now, you do this once for each project folder. It's copy and paste, and none of it is coding. [Connect Claude Code](https://dev.fline.sh/docs/connect-claude-code) has every step, including how to open Terminal. Using Cursor, Codex or VS Code? Use the setup steps for [Cursor](https://dev.fline.sh/docs/connect-cursor), [Codex](https://dev.fline.sh/docs/connect-codex) or [VS Code](https://dev.fline.sh/docs/connect-vscode) instead. They aren't yet tested from start to finish. ## 2. Ask Claude Code In your project folder, start Claude Code and tell it: ```prompt Put this project online with fline. ``` Name fline in the sentence. Left to choose, Claude Code may pick a different host. ## 3. Let Claude Code send your project Claude Code packs up a copy of your project folder and sends it to fline. Before it does, it may ask your permission to run a few commands, and to use fline's actions. That's the upload, and it's expected. Allow it. Your original stays in your folder. fline keeps a copy so it can build and run your app. fline then reads the copy and works out how to build and run your app, so there are no setup files to write. To do that, fline sends parts of your code to an AI model made by OpenAI. Passwords and keys you save on fline never go to that model. A few limits to know: your project can be up to 100 MB once Claude Code packs it up, not counting the add-ons your app downloads when it's built. ## 4. Type passwords and keys on the private page If your app uses a password or key, like a payment key or an email service key, Claude Code gives you a link to a private fline page. 1. Open the link in your browser. If you're not signed in to fline there, sign in first. 2. Type each value in its box and save. 3. Go back to Claude Code and tell it you're done. You type the key there, not in the chat. Claude Code sees that you did it, not what you typed. The page works once, for 10 minutes, and only while you're signed in to your own fline account. If it has stopped working, ask Claude Code for a new link. Once saved, nothing in fline shows the key again, not to Claude Code and not on your dashboard. If you paste a key into the chat instead, Claude Code sees it. It can save it on fline itself, and it should suggest you replace it with a new key on fline's private page. To keep a key away from Claude Code, type it only on fline's page. [Passwords and keys your app uses](https://dev.fline.sh/docs/keys) has more, including where to find the keys services give you. ## 5. If your app needs a database If your app needs to remember things, like sign-ups or bookings, Claude Code can have fline create a database of your own. fline runs it. Claude Code takes care of connecting it to your app. If it needs you, it asks you to copy one line from your fline dashboard and tells you where it goes. [A database of your own](https://dev.fline.sh/docs/database) explains the rest. ## 6. Watch it get ready Open [your fline dashboard](https://app.dev.fline.sh). Your project appears there, with a short line that says what fline is doing, such as reading your code or building. If something needs you, like keys, the dashboard says so. Claude Code keeps checking too, and tells you when it's done. fline also emails you when it starts getting your app ready and when your app is live. If Claude Code stops before the end, tell it: ```prompt Keep going until my project is live on fline. ``` ## 7. Open the link When your app is ready, your dashboard shows your app's link. If you have the dashboard open while it gets ready, it says "It's live." Claude Code gives you the link too. The link starts out long, because it's made automatically. It ends in apps.dev.fline.sh. Open it on your phone to check it works away from your computer. For a short address, put your app at a web address you own, like www.yourbakery.com. See [Use a web address you own](https://dev.fline.sh/docs/web-address). ## 8. Before you send the link - **The link is public.** Anyone who has it can open your app. If your app holds private information, like customers' names or orders, give it a sign-in, and ask Claude Code to check that each person sees only their own data. fline doesn't check your app's own code. - **There's no uptime promise yet.** During the private beta every app runs on one rented machine, with no spare. It suits trying your app with your first users. - **Keep a copy of anything you can't lose.** We don't promise backups yet, and there's no button to download your database. - **Size.** Each project gets 1 processor core, about 1 GB of memory and 8 GB of storage. Nothing runs on a schedule, and a project can't be paused yet. - **Cost.** fline is free during the private beta, with no card. Claude Code's own plan is separate: when it puts your app online or fixes something, that uses your plan as usual. Then send the link to your first users. ## If something goes wrong If a launch fails, your dashboard says so, and a button copies the problem for Claude Code. Paste it in and ask for help. Claude Code can see what went wrong and try a fix. Whether it finds the fix depends on Claude Code, so we can't promise it will. [When something goes wrong](https://dev.fline.sh/docs/when-something-breaks) covers what you might see. ## Things to say to Claude Code ```prompt Put this project online with fline. ``` ```prompt My app needs a key for [SERVICE]. Give me fline's private page instead of asking me to paste it here. ``` ```prompt Check that each person who signs in can see only their own data. ``` ```prompt The last update on fline failed. What went wrong? Try a fix, or put the earlier version back. ``` ```prompt Save fline's build plan in this project, so later updates follow the same plan. ``` ```prompt Attach www.[YOURNAME].com to this project on fline and tell me which record to add. ``` To change your app later, ask Claude Code to update it on fline. The current version keeps running while the new one is prepared. See [Change your app after it is online](https://dev.fline.sh/docs/update-your-app). Next: [Change your app after it is online](https://dev.fline.sh/docs/update-your-app) or [Passwords and keys your app uses](https://dev.fline.sh/docs/keys) --- # Connect Claude Code Last checked 16 October 2026. The same page on the web: https://dev.fline.sh/docs/connect-claude-code This page connects Claude Code to your fline account, so it can put your app online for you. You paste one line into your computer's Terminal app, then approve fline in your browser. Claude Code is the AI coding app we've tested with fline from start to finish. ## Before you start - **Your fline account is open,** and you've opened [your fline dashboard](https://app.dev.fline.sh) once. If not, see [Getting your account](https://dev.fline.sh/docs/get-access). Connect after your account is open: before that, Claude Code can't use fline, and it may keep asking you to sign in. - **Claude Code is installed** and you've used it to build your app. - **You know where your project folder is,** the folder on your computer that holds your app. ## What Terminal is, and how to open it Terminal is an app on your computer where you type commands instead of clicking. Claude Code runs there. You only need it to paste one line. **On a Mac:** press Command and Space together, type `Terminal`, and press Return. It's also in Finder, under Applications, then Utilities. **On Windows:** open the Start menu, type `Terminal`, and open **Terminal**. On older versions of Windows, type `PowerShell` and open **Windows PowerShell** instead. A window opens with a line of text and a blinking cursor. That's where you paste. ## 1. Go to your project folder in Terminal The connection is made for the folder Terminal is in, so start in your project folder. **On a Mac:** type `cd` and a space, then drag your project folder from Finder into the Terminal window. Its location appears after `cd`. Press Return. **On Windows:** open your project folder in File Explorer, right-click an empty part of the window, and choose **Open in Terminal**. If you don't see that option, type `cd` and a space in Terminal, then paste the folder's location from File Explorer's address bar, and press Return. If Claude Code is already running in this window, type `/exit` and press Return first, or open a new Terminal window. ## 2. Paste the line from your dashboard Your fline dashboard shows this line under **Claude Code**, with a button to copy it. It is the same line: ```copy claude mcp add --transport http fline https://mcp.dev.fline.sh/mcp ``` Paste it into Terminal and press Return. It tells Claude Code where fline is. It doesn't put anything online yet. This connects fline for this project folder only. For now, you do this once for each project folder. To connect fline for every project folder at once, use this line instead: ```copy claude mcp add --transport http -s user fline https://mcp.dev.fline.sh/mcp ``` ## 3. Sign in to fline from Claude Code 1. Start Claude Code in the same folder: type `claude` and press Return. 2. Type `/mcp` and press Return. Claude Code lists its connections. 3. Choose **fline**, then choose **Authenticate**. Your browser opens. The next section explains what you see there. ## 4. Approve fline in your browser **If you're not signed in to fline in that browser,** you see the fline sign-in page first. Sign in with your fline email address and password. **Then you see a page that asks you to approve the connection.** It looks plainer than the rest of fline, and that's expected. It shows: - **A name at the top.** This is the name your AI app gave itself when it connected, so it may read differently from "Claude Code". Only approve if you started this from Claude Code a moment ago. - **A list of permissions,** each with a tick box and a short code such as `project:read`. The table below says what each one lets Claude Code do. - **A "remember my decision" box.** You can leave it as it is. - **Two buttons, Deny and Allow.** Make sure every permission box is ticked, then press **Allow**. Claude Code gets only the permissions you tick, and it needs all of them to put your app online. | Code on the page | What it lets Claude Code do | |---|---| | `openid` | Confirm which fline account you signed in with. | | `offline_access` | Stay connected, so you don't have to approve fline again every time you use it. | | `project:read` | See your projects: their progress, their link, what went wrong, what your app printed, what it uses, and the names of the passwords and keys your app uses (never their values). | | `project:write` | Create and delete projects, send your project folder to fline, answer fline's questions about your app, give you the link to the private page where you type keys, save a key it already has, create, pause, resume or delete a database, and connect a database you already have. | | `deploy` | Put your app online, restart it, and put an earlier version back. | | `domain:write` | Attach a web address you own to your project, check it, and remove it. | You may see some of these and not others, depending on what Claude Code asks for. No permission lets Claude Code read a saved password or key back. Once you approve it, Claude Code can also delete a project or a database, so read what it plans to do before you agree to big changes. When the browser says you can go back, return to Terminal. In `/mcp`, fline now shows as connected. ## Check that it worked Ask Claude Code: ```prompt List my projects on fline. ``` If you haven't put anything online yet, it says you have none. That's the answer you want: it means the connection works. Claude Code may ask your permission the first time it uses each fline action. Allow it. ## If something goes wrong - **"command not found: claude"** means Terminal can't find Claude Code. Open Terminal the same way you usually start Claude Code, or reinstall Claude Code, then try again. - **"already exists"** means fline is already connected for this folder. Go straight to step 3. - **Claude Code keeps asking you to sign in to fline.** Open [your fline dashboard](https://app.dev.fline.sh). If it says "You're on the list", your account isn't open yet. Wait for the "Your fline account is open" email. If the dashboard opens, approve again from `/mcp` and make sure every box is ticked. - **You pressed Deny by mistake.** Run `/mcp`, choose fline, and choose Authenticate again. ## Disconnect Claude Code On your fline dashboard, open **Agents**. Each connected AI app is listed with a button to disconnect it. Disconnecting takes effect within 30 seconds, and your app keeps running. To connect again later, repeat step 3. Next: [Put your app online](https://dev.fline.sh/docs/first-launch) --- # Connect Cursor Last checked 16 October 2026. The same page on the web: https://dev.fline.sh/docs/connect-cursor This page connects Cursor to your fline account, so its AI can put your app online for you. You add a few lines to a settings file, then approve fline in your browser. **Setup steps, not yet tested from start to finish.** Claude Code is the only AI coding app we've used with fline all the way to a live app. These steps match what your fline dashboard shows for Cursor, but we haven't followed them through to a live app ourselves. If you get stuck, [Claude Code](https://dev.fline.sh/docs/connect-claude-code) is the tested way. ## Before you start - **Your fline account is open,** and you've opened [your fline dashboard](https://app.dev.fline.sh) once. If not, see [Getting your account](https://dev.fline.sh/docs/get-access). Connect after your account is open, or Cursor may keep asking you to sign in. - **Your project is open in Cursor.** ## 1. Add fline to Cursor's settings file Cursor keeps its connections in a settings file called `mcp.json`. You can put fline in one of two places: - **For every project:** the file `mcp.json` in the `.cursor` folder of your home folder (`~/.cursor/mcp.json` on a Mac, `%USERPROFILE%\.cursor\mcp.json` on Windows). This is the one your dashboard shows. - **For this project only:** create a folder named `.cursor` at the top of your project folder, and a file named `mcp.json` inside it. You can do both from Cursor's file list. Put these lines in the file. Your dashboard shows the same lines under **Cursor**, with a button to copy them: ```copy { "mcpServers": { "fline": { "url": "https://mcp.dev.fline.sh/mcp" } } } ``` **If the file already has other connections in it,** don't paste a second copy of the outer brackets. Add only the `"fline": { ... }` part inside the existing `"mcpServers"` list, with a comma between it and the entry before it. Save the file. ## 2. Sign in to fline from Cursor Open Cursor's settings and go to the section for MCP. Find **fline** in the list and follow its prompt to log in. Your browser opens. Cursor moves its menus from time to time. If you can't find the section, search Cursor's settings for "MCP". ## 3. Approve fline in your browser **If you're not signed in to fline in that browser,** you see the fline sign-in page first. Sign in with your fline email address and password. **Then you see a page that asks you to approve the connection.** It looks plainer than the rest of fline, and that's expected. At the top is the name the app gave itself when it connected. Only approve if you started this from Cursor a moment ago. Make sure every permission box is ticked, then press **Allow**. Cursor gets only the permissions you tick, and it needs all of them to put your app online. | Code on the page | What it lets Cursor do | |---|---| | `openid` | Confirm which fline account you signed in with. | | `offline_access` | Stay connected, so you don't have to approve fline again every time you use it. | | `project:read` | See your projects: their progress, their link, what went wrong, what your app printed, what it uses, and the names of the passwords and keys your app uses (never their values). | | `project:write` | Create and delete projects, send your project folder to fline, answer fline's questions about your app, give you the link to the private page where you type keys, save a key it already has, and create, pause, resume or delete a database. | | `deploy` | Put your app online, restart it, and put an earlier version back. | | `domain:write` | Attach a web address you own to your project, check it, and remove it. | No permission lets Cursor read a saved password or key back. ## 4. Check that it worked In Cursor's AI chat, ask: ```prompt Paste this into Cursor List my projects on fline. ``` If it says you have none, the connection works. Then ask it to put your project online. [Put your app online](https://dev.fline.sh/docs/first-launch) walks through what happens next. It's written for Claude Code, and the steps are the same. ## If something goes wrong - **fline doesn't appear in Cursor's list.** Check that the file is named `mcp.json`, sits in a folder named `.cursor`, and that every bracket and quote mark from the lines above is there. Restart Cursor. - **Cursor keeps asking you to sign in to fline.** Open [your fline dashboard](https://app.dev.fline.sh). If it says "You're on the list", your account isn't open yet. ## Disconnect Cursor On your fline dashboard, open **Agents**. Each connected AI app is listed with a button to disconnect it. Your app keeps running. Next: [Put your app online](https://dev.fline.sh/docs/first-launch) --- # Connect Codex Last checked 16 October 2026. The same page on the web: https://dev.fline.sh/docs/connect-codex This page connects Codex, OpenAI's AI coding app, to your fline account, so it can put your app online for you. You add two lines to a settings file, then type one line in Terminal to approve fline in your browser. **Setup steps, not yet tested from start to finish.** Claude Code is the only AI coding app we've used with fline all the way to a live app. These steps match what your fline dashboard shows for Codex, but we haven't followed them through to a live app ourselves. If you get stuck, [Claude Code](https://dev.fline.sh/docs/connect-claude-code) is the tested way. ## Before you start - **Your fline account is open,** and you've opened [your fline dashboard](https://app.dev.fline.sh) once. If not, see [Getting your account](https://dev.fline.sh/docs/get-access). Connect after your account is open, or Codex may keep asking you to sign in. - **Codex is installed** and you can start it in Terminal, the app on your computer where you type commands. [Connect Claude Code](https://dev.fline.sh/docs/connect-claude-code) explains how to open Terminal on a Mac or on Windows. ## 1. Add fline to Codex's settings file Codex keeps its settings in a file called `config.toml`, in a folder named `.codex` inside your home folder: `~/.codex/config.toml` on a Mac, `%USERPROFILE%\.codex\config.toml` on Windows. Open that file in a plain text editor, or create it if it doesn't exist. Add these two lines at the end. Your dashboard shows the same lines under **Codex**, with a button to copy them: ```copy [mcp_servers.fline] url = "https://mcp.dev.fline.sh/mcp" ``` Save the file. Some text editors change straight quote marks into curly ones. Codex can't read curly quotes, so check that the quote marks around the address are straight. ## 2. Sign in to fline from Terminal In Terminal, paste this line and press Return: ```copy codex mcp login fline ``` Your browser opens. ## 3. Approve fline in your browser **If you're not signed in to fline in that browser,** you see the fline sign-in page first. Sign in with your fline email address and password. **Then you see a page that asks you to approve the connection.** It looks plainer than the rest of fline, and that's expected. At the top is the name the app gave itself when it connected. Only approve if you started this from Codex a moment ago. Make sure every permission box is ticked, then press **Allow**. Codex gets only the permissions you tick, and it needs all of them to put your app online. | Code on the page | What it lets Codex do | |---|---| | `openid` | Confirm which fline account you signed in with. | | `offline_access` | Stay connected, so you don't have to approve fline again every time you use it. | | `project:read` | See your projects: their progress, their link, what went wrong, what your app printed, what it uses, and the names of the passwords and keys your app uses (never their values). | | `project:write` | Create and delete projects, send your project folder to fline, answer fline's questions about your app, give you the link to the private page where you type keys, save a key it already has, and create, pause, resume or delete a database. | | `deploy` | Put your app online, restart it, and put an earlier version back. | | `domain:write` | Attach a web address you own to your project, check it, and remove it. | No permission lets Codex read a saved password or key back. ## 4. Check that it worked In Terminal, paste this line and press Return: ```copy codex mcp list ``` fline should be in the list. Then start Codex in your project folder and ask: ```prompt Paste this into Codex List my projects on fline. ``` If it says you have none, the connection works. [Put your app online](https://dev.fline.sh/docs/first-launch) walks through what happens next. It's written for Claude Code, and the steps are the same. ## If something goes wrong - **`codex mcp login fline` says it doesn't know fline.** Check the file is named `config.toml`, sits in the `.codex` folder in your home folder, and has both lines with straight quote marks. - **Login doesn't start.** Your dashboard suggests adding this line under the other two, then trying step 2 again: ```copy auth = "oauth" ``` - **Codex keeps asking you to sign in to fline.** Open [your fline dashboard](https://app.dev.fline.sh). If it says "You're on the list", your account isn't open yet. ## Disconnect Codex On your fline dashboard, open **Agents**. Each connected AI app is listed with a button to disconnect it. Your app keeps running. Next: [Put your app online](https://dev.fline.sh/docs/first-launch) --- # Connect VS Code Last checked 16 October 2026. The same page on the web: https://dev.fline.sh/docs/connect-vscode This page connects VS Code's AI chat to your fline account, so it can put your app online for you. You add a few lines to a settings file in your project, start the connection, then approve fline in your browser. **Setup steps, not yet tested from start to finish.** Claude Code is the only AI coding app we've used with fline all the way to a live app. These steps match what your fline dashboard shows for VS Code, but we haven't followed them through to a live app ourselves. If you get stuck, [Claude Code](https://dev.fline.sh/docs/connect-claude-code) is the tested way. ## Before you start - **Your fline account is open,** and you've opened [your fline dashboard](https://app.dev.fline.sh) once. If not, see [Getting your account](https://dev.fline.sh/docs/get-access). Connect after your account is open, or VS Code may keep asking you to sign in. - **Your project folder is open in VS Code,** and you use its AI chat in agent mode, the mode where it can run actions for you. ## 1. Add fline to your project's settings file In VS Code's file list, create a folder named `.vscode` at the top of your project folder, if there isn't one. Inside it, create a file named `mcp.json`. Put these lines in the file. Your dashboard shows the same lines under **VS Code**, with a button to copy them: ```copy { "servers": { "fline": { "type": "http", "url": "https://mcp.dev.fline.sh/mcp" } } } ``` The first word is `servers`. Other apps use `mcpServers`, and VS Code ignores that word without saying so, so copy the lines exactly. **If the file already has other connections in it,** add only the `"fline": { ... }` part inside the existing `"servers"` list, with a comma between it and the entry before it. Save the file. To connect fline for every project instead, open the Command Palette (Command, Shift and P on a Mac; Control, Shift and P on Windows), run **MCP: Open User Configuration**, and put the same lines there. ## 2. Start the connection With `mcp.json` open, look just above the `"fline"` line. VS Code shows a small **Start** link there. Click it, and accept the prompt to sign in. Your browser opens. ## 3. Approve fline in your browser **If you're not signed in to fline in that browser,** you see the fline sign-in page first. Sign in with your fline email address and password. **Then you see a page that asks you to approve the connection.** It looks plainer than the rest of fline, and that's expected. At the top is the name the app gave itself when it connected. Only approve if you started this from VS Code a moment ago. Make sure every permission box is ticked, then press **Allow**. VS Code gets only the permissions you tick, and it needs all of them to put your app online. | Code on the page | What it lets VS Code's AI do | |---|---| | `openid` | Confirm which fline account you signed in with. | | `offline_access` | Stay connected, so you don't have to approve fline again every time you use it. | | `project:read` | See your projects: their progress, their link, what went wrong, what your app printed, what it uses, and the names of the passwords and keys your app uses (never their values). | | `project:write` | Create and delete projects, send your project folder to fline, answer fline's questions about your app, give you the link to the private page where you type keys, save a key it already has, and create, pause, resume or delete a database. | | `deploy` | Put your app online, restart it, and put an earlier version back. | | `domain:write` | Attach a web address you own to your project, check it, and remove it. | No permission lets it read a saved password or key back. ## 4. Check that it worked In VS Code's AI chat, in agent mode, ask: ```prompt Paste this into VS Code List my projects on fline. ``` If it says you have none, the connection works. [Put your app online](https://dev.fline.sh/docs/first-launch) walks through what happens next. It's written for Claude Code, and the steps are the same. ## If something goes wrong - **No Start link appears.** Check the file is named `mcp.json`, sits in a folder named `.vscode`, and starts with `"servers"`, not `"mcpServers"`. - **VS Code keeps asking you to sign in to fline.** Open [your fline dashboard](https://app.dev.fline.sh). If it says "You're on the list", your account isn't open yet. ## Disconnect VS Code On your fline dashboard, open **Agents**. Each connected AI app is listed with a button to disconnect it. Your app keeps running. Next: [Put your app online](https://dev.fline.sh/docs/first-launch) --- # Other AI apps Last checked 16 October 2026. The same page on the web: https://dev.fline.sh/docs/connect-other This page is for connecting an AI app that doesn't have its own page here. It gives the setup steps your fline dashboard shows for Grok, Antigravity and "Something else", and it says plainly which apps can't put an app on fline yet. **Setup steps, not yet tested from start to finish.** Claude Code is the only AI coding app we've used with fline all the way to a live app. Nothing on this page has been followed through to a live app. If you get stuck, [Claude Code](https://dev.fline.sh/docs/connect-claude-code) is the tested way. ## What every AI app needs fline gets your app as a copy of your project folder, packed up and sent by the AI app. So the AI app has to: - run on your computer and be able to open your project folder; - be able to run commands there, to pack the folder and send it; - support remote MCP servers, which is how AI apps connect to services like fline, with a browser sign-in. The address to connect to is: ```copy https://mcp.dev.fline.sh/mcp ``` Before you connect, your fline account must be open and you must have opened [your fline dashboard](https://app.dev.fline.sh) once. See [Getting your account](https://dev.fline.sh/docs/get-access). ## Grok In Terminal, the app on your computer where you type commands, in your project folder, paste this line and press Return: ```copy grok mcp add --transport http fline https://mcp.dev.fline.sh/mcp ``` Your browser opens the first time Grok uses fline. If it doesn't, this line checks the setup and the connection: ```copy grok mcp doctor fline ``` ## Antigravity Antigravity keeps its connections in the file `~/.gemini/config/mcp_config.json`. In Antigravity you can open it from the agent panel: **Manage MCP Servers**, then **View raw config**. Put these lines in it: ```copy { "mcpServers": { "fline": { "serverUrl": "https://mcp.dev.fline.sh/mcp" } } } ``` The word is `serverUrl`, not `url`. Antigravity ignores an entry that says `url` without telling you. ## Something else Most AI apps that connect to remote MCP servers use a settings file with an `mcpServers` list. Try this first: ```copy { "mcpServers": { "fline": { "url": "https://mcp.dev.fline.sh/mcp" } } } ``` If your app can only start programs on your computer and can't connect to an address, use this bridge instead. It needs Node.js installed. It runs the same browser sign-in on your computer and passes everything through to fline: ```copy { "mcpServers": { "fline": { "command": "npx", "args": ["-y", "mcp-remote", "https://mcp.dev.fline.sh/mcp"] } } } ``` ## Approving fline in your browser Whichever app you use, your browser opens. If you're not signed in to fline there, sign in first. Then a plainer page asks you to approve the connection. At the top is the name the app gave itself when it connected: only approve if you started this a moment ago. Make sure every permission box is ticked, then press **Allow**. [Connect Claude Code](https://dev.fline.sh/docs/connect-claude-code) has the full list of permissions and what each one lets the app do. No permission lets an app read a saved password or key back. You can disconnect any app from **Agents** on your fline dashboard, and your app keeps running. ## The Claude desktop app The Claude desktop app has a Chat tab and a Code tab. - **The Chat tab can't put an app on fline.** It can't pack up a project folder on your computer and send it. - **The Code tab** is not yet tested with fline. - **Adding fline in the Claude app's own settings,** as a custom connector with no Terminal, may work, but we haven't tested it, so we don't offer it yet. The tested way today is Claude Code in your computer's Terminal app. See [Connect Claude Code](https://dev.fline.sh/docs/connect-claude-code). ## ChatGPT, Claude on the web, and app builders These can't put an app on fline today: - **ChatGPT and Claude on the web.** A chat in your browser can't reach the project folder on your computer, so it can't send fline your project. - **App builders such as Lovable, Bolt, Replit and Base44.** They can't send fline a project. Apps made inside a builder often keep their database and sign-in inside that builder, so downloading the code isn't always enough to run it somewhere else. We haven't tested sending a downloaded builder project with Claude Code. fline also can't take a GitHub link, and there's no upload button on the dashboard yet. If your app was made in one of these, use the publish option in the app you built it in. Next: [Put your app online](https://dev.fline.sh/docs/first-launch) --- # Passwords and keys your app uses Last checked 16 October 2026. The same page on the web: https://dev.fline.sh/docs/keys This page helps you give your app the passwords and keys it needs, without pasting them into the chat with Claude Code. It explains what a key is, how fline's private page works, how to replace a key later, and what to do if a key ends up somewhere it shouldn't. ## What a key is A key (often called an API key) is a password your app uses to talk to another service: taking payments, sending email, or asking an AI model a question. Whoever holds the key can use that service as you, and the bill comes to you. That's why it's worth some care. You get a key from the service that issued it, usually on a page in its own dashboard called something like "API keys", "Developers" or "Settings". Many services give you two kinds: a test key for trying things out, and a live key for real use. Your app online needs the live one. ## Where your key goes: fline's private page When your app needs a password or key, Claude Code gives you a link to a private fline page. 1. Open the link in your browser. If you're not signed in to fline there, sign in first. 2. The page lists the name of each value your app needs, like `STRIPE_SECRET_KEY`. Type or paste each value in its box. The eye button shows what you typed, so you can check nothing got cut off. 3. Save, then go back to Claude Code and tell it you're done. You type it there, not in the chat. Claude Code sees that you did it, not what you typed. - The page works once, for 10 minutes, and only while you're signed in to your own fline account. - If the page says the link has expired or was already used, ask Claude Code for a new one. It can make another without seeing any value. - Once you save a password or key, nothing in fline shows it again, not to Claude Code and not on your fline dashboard. - Saved passwords never go into the build, or to the AI model fline uses to read your code. ```prompt My app needs a key for [SERVICE]. Give me fline's private page instead of asking me to paste it here. ``` ## If you already pasted a key into the chat If you already pasted a key into the chat, Claude Code can save that key on fline itself, and it should suggest you replace it with a new key on fline's private page. fline won't show it again after that, but Claude Code has already seen it, and so has the chat. For a key that can spend money or reach your customers' information, the careful thing is to replace it: get a new key from the service and type the new one on fline's private page. The steps are under [If a key gets out](#if-a-key-gets-out). To keep a key away from Claude Code from now on, type it only on fline's page. ```prompt Don't ask me to paste keys into the chat. When my app needs one, give me fline's private page. ``` ## Settings that aren't secret Some of your app's settings aren't secret, like which AI model it uses or the name it shows. Claude Code can set those on fline itself, and you can see them on your fline dashboard. fline refuses to store a value as a plain setting when its name looks like a key or password, so a key doesn't end up on show by mistake. ## Replace a key You might replace a key because the service gave you a new one, or because the old one got out. **On your fline dashboard.** Open your project on [your fline dashboard](https://app.dev.fline.sh) and go to the list of your app's passwords, keys and settings (today it's called Variables). Next to the key's name, choose Replace, type the new key and save. You're typing it on fline, not in the chat. **Or ask Claude Code** to give you a private page for the new key. ```prompt I have a new key for [SERVICE]. Give me fline's private page so I can replace the old one. ``` Then ask Claude Code to restart your app. A new key reaches your running app only when it restarts or when it's put online again. ```prompt Restart my app on fline so it uses the new key. ``` Putting an earlier version of your app back doesn't bring back old keys. Your current keys stay in place. ## If a key gets out If you pasted a key somewhere it shouldn't be, or you're not sure where it's been, replace it. 1. Go to the service that issued the key, like your payment or email company, and get a new key. Most services let you cancel the old one in the same place. 2. Type the new key on fline, as in [Replace a key](#replace-a-key). 3. Ask Claude Code to restart your app on fline, so it starts using the new key. ## Keys in your project folder A key saved in a file in your project folder, such as a file named `.env`, can be read by Claude Code whenever it works in that folder, and it travels with your project when the folder is sent anywhere. When Claude Code sends your project to fline, fline keeps files named like key files, such as `.env` files, and files that contain a few common kinds of key away from the AI model that reads your code. If it finds one, it tells Claude Code which file it was, and Claude Code should tell you. These files still go into your app's build, so ask Claude Code to leave them out of what it sends. fline can't catch every key, so keep live keys on fline's private page rather than in your files. If your app prints a saved key word for word while it runs, fline blanks it out of what you and Claude Code can read. A changed or partial copy of the key gets through. ```prompt Tell me which files in my project hold keys or passwords, so I can move them to fline's private page. ``` ```prompt Make sure no secret key ends up in the code that runs in the visitor's browser. ``` Next: [A database of your own](https://dev.fline.sh/docs/database) or [Change your app after it is online](https://dev.fline.sh/docs/update-your-app) --- # A database of your own Last checked 16 October 2026. The same page on the web: https://dev.fline.sh/docs/database This page helps you give your app a place to remember things, like sign-ups, bookings or messages. It explains what fline creates when you ask, how your app finds its database, who can reach it, how to pause or delete it, and how to use a database you already have instead. ## Ask Claude Code for one If your app needs to remember things between visits, ask Claude Code. It reads your project and tells fline what kind your app needs. ```prompt My app needs a database. Have fline create one for it. ``` You may not need to ask. When fline reads your project to put it online, it looks for a database your app uses, and Claude Code tells you if anything is needed from you. ## What fline creates fline can create a Postgres database for your app and run it for you. If your app needs a fast cache instead, fline creates one with Valkey, which is Redis-compatible. - **One small size.** Each database gets 1 GB of memory and room for about 8 GB of data. There's no bigger size yet. - **It belongs to your account,** not to one project. It stays when you change your app or delete a project, and more than one of your projects can use it. - **You can see it** on the Services page of [your fline dashboard](https://app.dev.fline.sh). You can also create one there yourself. ## How your app finds its database Your app has to be told where its database is: one line that holds the database's address and its password. Claude Code takes care of that with fline. If it needs you, Claude Code asks you to copy that line from your fline dashboard and tells you where it goes. When you paste it, use fline's private page or your dashboard, not the chat. See [Passwords and keys your app uses](https://dev.fline.sh/docs/keys). ## Who can reach it Your database is on the internet, so your app can reach it. It's locked with a password and encryption: it takes only encrypted connections, and only with its password. You can also limit who can reach it. Open the database on the Services page of your dashboard and add the addresses you want to allow under "Who may reach it". ## Pause it, or delete it You can pause a database and resume it later. While it's paused, nothing can reach it, including your app, and its data stays where it is. If you delete a database, its data is kept for seven days, then destroyed. After the seventh day nothing can bring it back. Claude Code should ask you before it deletes one. ```prompt Pause the database my app on fline uses. I'll ask you to resume it later. ``` ## Keep your own copy Keep your own copy of anything you can't lose. We don't promise backups yet, there's no way to restore, and there's no button to download your database. Putting an earlier version of your app back doesn't change what's in your database. ## If the database password gets out Your fline dashboard can give the database a new password. The old one stops working, with no overlap, so your app can't reach the database until it has the new line too. Ask Claude Code to help you put the new line in place before you do it. ## Use a database you already have Already have a database (Postgres, MySQL, MongoDB, Redis or RabbitMQ)? Connect that instead. Claude Code tells fline what kind it is, and you type its address on fline's private page, the same page you use for keys. ```prompt My app should use the database I already have, not a new one. Set that up on fline and give me the private page for its address. ``` Next: [Use a web address you own](https://dev.fline.sh/docs/web-address) or [Change your app after it is online](https://dev.fline.sh/docs/update-your-app) --- # Use a web address you own Last checked 16 October 2026. The same page on the web: https://dev.fline.sh/docs/web-address This page helps you put your app at a web address you own, like www.yourbakery.com, instead of the long link it starts with. It covers the one record you add at the company where you bought the address, what your fline dashboard shows you, how the padlock is set up, and what to do if the address doesn't work yet. ## The link you start with Every app gets its own link with the padlock as soon as it's running. It's a long, unique address made automatically, ending in apps.dev.fline.sh, and you can send it to anyone. fline can't make it shorter. For a short address, use one you own. When you add your own address, the long link keeps working too. ## What you need A web address you bought from a domain company, such as Cloudflare, GoDaddy, Namecheap or Squarespace. fline doesn't sell web addresses. You also need to be able to sign in at that company, because you'll add one record there. Attaching your address to fline is free during the private beta. You still pay your domain company for the address itself. ## 1. Ask Claude Code to attach it ```prompt Attach www.[YOURNAME].com to this project on fline and tell me which record to add. ``` You can also do it yourself: open your project on [your fline dashboard](https://app.dev.fline.sh), go to Domains, and choose Add domain. ## 2. Add one record at your domain company Claude Code can't add this record for you. You add it at the company where you bought your web address. Your fline dashboard shows exactly which record to add. Open your project, go to Domains, and pick your domain company from the list: Cloudflare, GoDaddy, Namecheap, Squarespace Domains, AWS Route 53, or another company. The dashboard then uses that company's own words for each box and tells you where to find the page. For a www address, it's one record. Your dashboard shows: - the type, which is `CNAME`; - the name, usually just `www`; - the value, which is your app's long link. Copy each one into the box with the same name at your domain company and save. A few things that commonly go wrong: - **Typing the whole address in the name box.** Most companies want only `www` there, and add the rest themselves. Typing the full address can give you a doubled name that leads nowhere. Your dashboard shows the right form for the company you picked. - **On Cloudflare,** set the record's proxy status to `DNS only` (the grey cloud). With the orange cloud, fline can't see the record. - **A record name that starts with `_smartline-challenge`.** That's an older name for fline. If your dashboard shows it, type it exactly as shown. ## 3. Wait for fline to find it Once the record is saved, fline checks for it, and keeps checking for 48 hours. A new record can take a while to reach everyone, so it's normal for the first checks to miss it. When fline finds the record, it sets up the padlock for your address and keeps it renewed. Then your app opens at your own address. To have fline check again sooner, ask Claude Code: ```prompt Check whether www.[YOURNAME].com is working on fline yet. If it isn't, tell me what the record should be and what fline found instead. ``` If 48 hours pass and fline still hasn't found the record, fline marks the address as failed and stops checking. Checking again won't bring it back. Fix the record, then ask Claude Code to take the address off your project and attach it again, so the checking starts over. ## An address without www A www or app address, like www.yourbakery.com, works with any domain company. An address without www, like yourbakery.com, works today if your domain is with Cloudflare. With other domain companies, use a www address, even if your dashboard shows a record for the address without www. ## Take an address off ```prompt Take www.[YOURNAME].com off my project on fline. ``` The address stops opening your app. The long link keeps working. You can remove the record at your domain company afterwards. Next: [Change your app after it is online](https://dev.fline.sh/docs/update-your-app) or [When something goes wrong](https://dev.fline.sh/docs/when-something-breaks) --- # Change your app after it is online Last checked 16 October 2026. The same page on the web: https://dev.fline.sh/docs/update-your-app This page helps you change your app once it's online: a new feature, a fix, new words on a page. It explains what to ask Claude Code, what happens to the version people are using while the new one gets ready, what stays the same, and how to put an earlier version back if the change goes wrong. ## 1. Make the change on your computer Work with Claude Code in your project folder as usual, and check the change works in the preview on your computer first. fline puts online what's in your folder, so what you see there is what you'll get. ## 2. Ask Claude Code to update your app ```prompt Update my app on fline with the changes I just made. ``` Claude Code packs up your project folder again and sends it to fline. fline reads it and gets the new version ready, the same way as the first time. You'll see it on [your fline dashboard](https://app.dev.fline.sh), and fline emails you when the build starts and when it's live. ## What happens to the version people are using The current version keeps running while the new one is prepared. People who open your link keep seeing your app as it was. When the new version is ready, it takes the old one's place, at the same link. If fline can't build the new version, the version already online keeps running. Your dashboard and Claude Code say what went wrong, so you can try a fix and update again. ## What stays the same - **Your database** and everything in it. It belongs to your account, not to one version of your app. - **Your passwords and keys.** If the new version needs a new key, Claude Code gives you a private page for it. See [Passwords and keys your app uses](https://dev.fline.sh/docs/keys). - **Your web address** and your long link. If your app says a key is missing after an update, ask Claude Code: ```prompt After the update, my app on fline says a key is missing. Check which keys fline has for my app and tell me what's needed. ``` ## Keep the same plan every time The first time, fline reads your project and works out how to build and run it. You can ask Claude Code to save that plan in your project, in a file called fline.json, and later updates follow the same plan. ```prompt Save fline's build plan in this project, so later updates follow the same plan. ``` If you later change how your app is built, for example by adding a new part to it, Claude Code can update the plan too. ## Put an earlier version back If an update broke something, ask Claude Code to go back to an earlier version. ```prompt The last update on fline broke my app. Show me the earlier versions and put back the one from before it. ``` Claude Code can list the versions fline has kept, with when each was made, and put back the one you choose. fline runs exactly what ran then, as a new version, and keeps your current passwords and keys. So the version number goes up, not down. That's expected. Some things to know: - **There's no button on your dashboard for this yet.** Ask Claude Code. - **It doesn't change your database.** Anything your app saved since stays saved, and anything it deleted stays deleted. - **It doesn't bring back old keys.** Your current keys stay in place. - **If an old version can't be used any more,** fline refuses and says why, rather than running something close to it. - **Your project folder doesn't change.** The earlier version is back online, but the files on your computer still have the newer code. Ask Claude Code to fix the problem there before your next update. ## Things to say to Claude Code ```prompt Update my app on fline with the changes I just made. ``` ```prompt The last update on fline failed. What went wrong? Try a fix, or put the earlier version back. ``` ```prompt What versions of my app does fline have, and which one is running now? ``` Next: [When something goes wrong](https://dev.fline.sh/docs/when-something-breaks) or [Passwords and keys your app uses](https://dev.fline.sh/docs/keys) --- # When something goes wrong Last checked 16 October 2026. The same page on the web: https://dev.fline.sh/docs/when-something-breaks This page helps you find out what went wrong and what to do next. Find the heading that matches what you see. Each one says what it usually means, what to ask Claude Code, and when to write to the person who builds fline. Most of the time, the first step is the same: ask Claude Code to look. It can see what went wrong on fline and try a fix. Whether it finds the fix depends on Claude Code, so we can't promise it will. To write to the person who builds fline, use the contact links on [the fline site](https://dev.fline.sh/#contact). ## My app shows an error Your app is online, but a page shows an error, stays blank, or doesn't load. **What it usually means.** Something in your app stopped, it's missing a key or setting, it can't reach its database, or there's a mistake in its own code. If your app crashes, fline restarts it by itself, so it may come back and then stop again. **What to ask Claude Code.** Ask while the problem is happening. Claude Code can read only the most recent things your app printed, so it sees the most while the error is fresh. ```prompt My app on fline shows an error when I [WHAT YOU DID]. Look at what went wrong on fline and try a fix. ``` Your fline dashboard keeps 7 days of what your app printed, and you can search it there. **If you just typed a new key** and your app still says it's missing, your app needs a restart to pick it up: ```prompt Restart my app on fline so it picks up the key I just entered. ``` **If an update broke it,** you can put the earlier version back. See [Change your app after it is online](https://dev.fline.sh/docs/update-your-app). **When to write to us.** If Claude Code says the problem is on fline's side rather than in your app, or your fline dashboard itself won't open. ## Claude Code says it can't connect Claude Code says fline needs you to sign in, or can't connect, or keeps asking you to sign in again. **What it usually means.** One of these: - **Your account isn't open yet.** Claude Code may say the account "is waiting for approval". Connecting again won't change that. See [It says my account is waiting](#it-says-my-account-is-waiting). - **You haven't opened your fline dashboard yet.** Claude Code may say to "open https://app.dev.fline.sh once in a browser". Open [your fline dashboard](https://app.dev.fline.sh) once, then try again. - **You haven't confirmed your email address.** Claude Code may say to "confirm the address from the mail sent at registration". Enter the code from that email. See [Getting your account](https://dev.fline.sh/docs/get-access). - **You're in a different project folder.** Unless you set it up for all folders, Claude Code connects to fline once for each project folder. Go to the folder you connected, or connect again in this one. - **The approval in your browser didn't finish.** Run the connect steps again and approve fline in the browser tab that opens. **What to try.** In Claude Code, type this to see whether fline is connected, and choose fline to sign in again: ```copy /mcp ``` Then ask: ```prompt Check that you're connected to fline and tell me exactly what it says. ``` [Connect Claude Code](https://dev.fline.sh/docs/connect-claude-code) has every step. **When to write to us.** If your dashboard opens and shows your projects, you've approved fline in your browser, and Claude Code still can't connect. ## It says my account is waiting Your fline dashboard shows "You're on the list", or Claude Code says your account is waiting for approval. **What it means.** Your sign-in works, but your account isn't open yet. We open accounts by hand, a few at a time, as room opens. When yours is open, we send you an email: "Your fline account is open". **What to do.** - Check you created your account with the same email address you joined the waitlist with. If you used another address, sign out and create an account with that one. - Wait for the email, then sign in again. The waiting screen checks again each time you come back to it. - Connecting Claude Code again won't open your account sooner. [Getting your account](https://dev.fline.sh/docs/get-access) explains every waiting screen. **When to write to us.** If you've had the "Your fline account is open" email, you signed up with the same address, and your dashboard still says you're waiting. ## The build failed Your dashboard or an email says fline couldn't get your app built and started. The message names the step where it stopped. **What it means, by step.** | The message mentions | What it means | |---|---| | intake | fline couldn't read the copy of your project folder Claude Code sent. It may be bigger than 100 MB once packed, hold more than 20,000 files, or not be packed the way fline expects. | | analyze | fline couldn't work out how to build and run your app. | | render | fline couldn't prepare the instructions for building your app. | | build | Your app's own build step stopped, or took longer than 15 minutes. | | provision | fline couldn't set up the database your app needs, for example because that database is paused. | | submit | fline couldn't start your app. If it also says `no_capacity`, see [It says there's no room](#it-says-theres-no-room). | **What to ask Claude Code.** Your dashboard has a button that copies the problem for Claude Code. Copy it, paste it into Claude Code, and add: ```prompt The last update on fline failed. What went wrong? Try a fix, or put the earlier version back. ``` If this was an update to an app that was already online and fline couldn't build the new version, the version that was running keeps running while you fix it. **If Claude Code says the upload link expired.** The link it uses to send your project works for 15 minutes. It can ask fline for a new one. Tell it to try again. **If your project is too big.** The limit is 100 MB once packed, not counting the add-ons your app downloads when it's built. Ask Claude Code to leave out what fline doesn't need: ```prompt My project is too big to send to fline. Leave out anything fline doesn't need, like installed packages and build output, and try again. ``` **When to write to us.** If Claude Code has tried a few fixes and the same step keeps failing with a reason neither of you understands. ## My web address doesn't work yet You attached an address like www.yourbakery.com, and it doesn't open your app. **What it usually means.** - The record at your domain company isn't saved yet, or its name or value is slightly off. Most often the whole address went into the name box instead of just `www`. - On Cloudflare, the record is set to proxied (the orange cloud). It needs to be `DNS only` (the grey cloud). - The address has no www, and your domain isn't with Cloudflare. Use a www address instead. - The record is fine, and it hasn't reached everyone yet. fline keeps checking for 48 hours. **What to ask Claude Code.** ```prompt Check whether www.[YOURNAME].com is working on fline yet. If it isn't, tell me what the record should be and what fline found instead. ``` If 48 hours have passed, fline marks the address as failed and stops checking, and checking again won't bring it back. Fix the record, then ask Claude Code to take the address off your project and attach it again. [Use a web address you own](https://dev.fline.sh/docs/web-address) has every step. **When to write to us.** If your dashboard shows the address as working but it still doesn't open your app. ## It says there's no room There are two kinds of "no room". **fline is full.** The message says `no_capacity`, usually after "failed at submit". During the private beta fline has room for a small number of projects across everyone. When it's full, a new project is turned away at the end, after it has been prepared. There's no waiting line, and trying again won't help until room opens. Apps that are already online keep running and can still be updated. **When to write to us.** Write to us when you see `no_capacity`, so we know you're waiting for room. **Your app has used its share.** Each project gets 1 processor core, about 1 GB of memory and 8 GB of storage, shared by all its parts, and it can't be changed yet. Each database gets 1 GB of memory and room for about 8 GB of data. If your app keeps stopping and starting again, it may be using more memory than its share. ```prompt My app on fline keeps restarting. Check whether it's running out of memory or storage, and how to make it use less. ``` ## I didn't get an email **What to check first.** Look in your spam or junk folder, and in tabs like Promotions or Updates. Search your inbox for "fline". Check you're looking at the address you signed up with. **Which email you're waiting for.** - **"Your fline account is open."** You can check without it: sign in at [your fline dashboard](https://app.dev.fline.sh/login). If your dashboard opens, your account is open, whether or not the email reached you. - **The code to confirm your email address.** On the "Confirm your email" page, ask for a new code. - **Emails about a launch.** fline emails you when a build starts, when your app goes live, and if it can't get your app built and started. Your fline dashboard shows the same thing, so you can always check there. [Getting your account](https://dev.fline.sh/docs/get-access) lists every email fline sends. **When to write to us.** If your dashboard says your account is open but you never get the code to confirm your address, even after asking for a new one and checking spam. ## The page for my key says the link doesn't work The private page for passwords and keys works once, for 10 minutes, and only while you're signed in to your own fline account. If it says the link has expired or was already used, ask Claude Code for a new one: ```prompt The private fline page for my keys has expired. Give me a new link. ``` If it asks you to sign in, sign in with your fline account, then open the link again. See [Passwords and keys your app uses](https://dev.fline.sh/docs/keys). Next: [Start here](https://dev.fline.sh/docs) or [Reference for AI coding apps](https://dev.fline.sh/docs/for-ai) --- # Reference for AI coding apps Last checked 16 October 2026. The same page on the web: https://dev.fline.sh/docs/for-ai This page is written for AI coding apps (Claude Code, Cursor, Codex and others) that are helping a person put a project online with fline. It is precise rather than friendly. If you are the person, you don't need it: ask Claude Code, and point it here. The same content is plain Markdown at [https://dev.fline.sh/docs/for-ai.md](https://dev.fline.sh/docs/for-ai.md), and an index of every page is at [https://dev.fline.sh/llms.txt](https://dev.fline.sh/llms.txt). Where this page and a tool's live answer disagree, the tool wins; tell the person if you notice a disagreement. ## What fline is fline is hosting for apps people build with an AI coding app on their own computer. You pack the project folder as a gzipped tar, upload it to a signed URL, and fline analyses the source, writes its own build files, builds images, runs the containers and gives the app an HTTPS URL of the form `.apps.dev.fline.sh`. It can also create a managed database and serve the app at a domain the person owns. - Private beta. Accounts are opened by hand. Room on the platform is small (see [Capacity](#limits-and-capacity)). - One rented machine. No failover, no uptime commitment, no backup or restore promise. - One person per account. No teams. - To plan builds, fline sends parts of the source to OpenAI's GPT-5. Saved secrets never reach it. A key written into source files can, apart from files that are held back (see [Archive rules](#archive-rules)). Tell the person this if they ask who reads their code. ## Connecting | Item | Value | |---|---| | MCP endpoint | `https://mcp.dev.fline.sh/mcp` (Streamable HTTP) | | Protocol revisions | 2026-07-28 (via `server/discover`), 2025-06-18, 2025-03-26 | | Server capabilities | tools and prompts. No resources. | | Authorization | OAuth 2.1 authorization code with PKCE, through Ory Hydra. Dynamic client registration is open. | | Protected resource metadata | `/.well-known/oauth-protected-resource` on the MCP host | | Authorization server metadata | `/.well-known/oauth-authorization-server` on the MCP host (Hydra's metadata with fline's `registration_endpoint` and scopes merged in) | | Scopes | `project:read`, `project:write`, `deploy`, `domain:write`, `offline_access`. Registration also grants `openid` by default. | | Token lifetime | access token 15 minutes, refresh token 30 days | | Unauthenticated | `initialize`, `tools/list`, `prompts/list`, `prompts/get` | | Authenticated | every `tools/call` | No scope reads a secret value. `offline_access` only obtains a refresh token. Claude Code, the client tested end to end: ```copy claude mcp add --transport http fline https://mcp.dev.fline.sh/mcp ``` Then `/mcp`, select fline, choose Authenticate. Without `-s user` the server is registered for the current folder only. Setup steps for Cursor, Codex, VS Code, Grok and Antigravity are on the person's dashboard; they are not tested end to end. ### Before any tool call works The person needs all three: 1. an approved fline account (opened by hand during the beta); 2. a confirmed email address; 3. one visit to the dashboard at `https://app.dev.fline.sh` in a browser, which creates their workspace. Until then OAuth completes normally, and every `tools/call` returns HTTP 401 with `WWW-Authenticate: Bearer realm="fline", resource_metadata="...", error="invalid_token"` and one of these messages: | Message begins | Meaning | What to do | |---|---|---| | `this account is waiting for approval` | Account not yet approved. The token is valid. | Tell the person their account isn't open yet and they'll get an email when it is. Do not re-run OAuth; it changes nothing. | | `this account has never asked for access` | No access row: they never loaded the dashboard, or their address is unconfirmed. | Ask them to sign in at `https://app.dev.fline.sh` once and confirm their address with the emailed code. | | `token owner is not provisioned` | Approved, but the workspace isn't created. | Ask them to open `https://app.dev.fline.sh` once in a browser. | | `this account has not been granted access` | Denied. | Tell them; they can use the contact links on `https://dev.fline.sh/#contact`. | Your client may present this 401 as "needs authentication" and offer to sign in again. If the message above is visible to you, relay it to the person in plain words instead of looping. ## Tools Write tools take an optional `idempotency_key`; reuse the same key to retry a call safely. | Scope | Tools | |---|---| | `project:read` | `list_projects`, `get_project`, `get_project_detail`, `get_deploy_status`, `get_events`, `get_logs`, `get_images`, `get_usage`, `list_versions`, `list_env_names`, `list_domains`, `list_services`, `get_service`, `list_external`, `get_config`, `check_config` | | `project:write` | `create_project`, `delete_project`, `get_upload_url`, `complete_upload`, `submit_declaration`, `answer_questions`, `declare_env_names`, `get_secrets_link`, `set_env`, `delete_env_name`, `create_service`, `delete_service`, `pause_service`, `resume_service`, `attach_external`, `detach_external`, `refresh_config` | | `deploy` | `deploy`, `restart`, `rollback`, `stop` | | `domain:write` | `attach_domain`, `check_domain`, `delete_domain` | Annotated destructive: `delete_project`, `delete_service`, `delete_domain`, `delete_env_name`, `set_env` (it replaces an existing value), `pause_service`, `detach_external`, `stop`. Ask the person before any of them. `stop` is not implemented and always refuses. A project cannot be stopped or paused, only deleted (or have its domain removed with `delete_domain`). ## First deploy: call order 1. **`create_project`** `{name}`. Keep `project_id`, `upload_url`, `blob_key`. The answer also carries `expires_in` (seconds) and `max_bytes`. 2. Optional: **`submit_declaration`** `{project_id, declaration}` with a short object describing the project. It is read by the analysis as an untrusted hint and cannot change platform rules. Send it before step 4 if you send it at all. 3. **Build the archive and PUT it** to `upload_url` (see [Archive rules](#archive-rules)). The PUT goes straight to object storage; no extra headers are signed. Example: `curl -sS -T project.tar.gz ""`. If the link has expired (15 minutes), call **`get_upload_url`** `{project_id}` for a new one. 4. **`complete_upload`** `{project_id, blob_key}`. Until this call the platform doesn't see the upload, and the project stays in `awaiting_source`. 5. **Poll `get_project`**. The project moves on its own through `analyzing`, then possibly parks: - `awaiting_answers`: answer the open questions with **`answer_questions`** `{project_id, answers: [{key, value}]}`. - `awaiting_secrets`: the analysis found variables that need values. If it missed one, add the name with **`declare_env_names`** `{project_id, names}`. Then call **`get_secrets_link`** and hand the URL to the person **unopened**. Tell them: open it in a browser, sign in to fline if asked, type each value, save, then come back and say done. It works once, for 10 minutes. Never ask them to paste a secret into the chat. - a warning listing a quarantined file that holds a credential: tell the person which file. If it is a live key, suggest they get a new one from the service that issued it. The file was held back from the analysis only and still went into the build, so re-upload without it. - `provisioning`: the platform is creating or attaching a managed database and writing its connection string. Nothing is asked of you. - `rendering`, then `locked`: build files are ready. 6. **`deploy`** `{project_id}` at `locked`. The worker also queues the build itself after rendering, so `deploy` on a project already in `building`, `rendering`, `analyzing`, `provisioning` or `submitted` returns the current state without error. 7. **Poll `get_deploy_status`** until it settles. `desired` (what was asked for) and `observed` (what is running) arrive separately; report `observed`. The URL is on `get_project` once the runtime is up. 8. On failure, fetch the **`diagnose_a_deployment`** prompt and follow it: `get_project_detail`, then `get_events`, then `get_logs`. 9. After the first successful deploy, call **`get_config`** and save the result as `fline.json` at the archive root (see [fline.json](#flinejson)). Never ask the person which port the app listens on. No tool takes a port. fline passes `PORT` into every container and routes whichever port the process opens. The process must listen on all interfaces (`0.0.0.0`); an app that listens only on loopback is refused with a reason. Never write a Dockerfile for fline. fline generates one per built service from the plan; a Dockerfile in the project is read as evidence only. ## Archive rules - Format: gzip-compressed tar. No zip, no Git URL, no inline upload. - Create it from inside the project folder so paths are relative to the project root, for example `tar -czf ../project.tar.gz -C /path/to/project --exclude=.git --exclude=node_modules .`. `fline.json` is read only at the archive root. - Exclude `.git`, `node_modules` and other installed dependencies, build output, and real `.env` files. Keep `.env.example` (or `.sample`, `.template`, `.defaults`): fline reads its variable names, not its values. It is still listed among quarantined files by name. - Size: at most 100 MiB compressed (`max_bytes` = 104857600). Larger archives are rejected at intake with `archive_too_large`. - At most 20,000 regular files; uncompressed-to-compressed ratio at most 100:1. A source, entrypoint or build-config file larger than 32 MiB is refused (`file_too_large`), so keep large data files out. `fline.json` is capped at 64 KiB (`config_too_large`). - Refused: absolute paths, paths that escape the root, symlinks pointing outside the archive. - On macOS, set `COPYFILE_DISABLE=1` when running `tar` so it doesn't add `._*` metadata files. fline does not filter them; they are counted as files. - Held back from analysis (quarantined and reported by name): files named like credentials (`.env*`, `*.pem`, `id_rsa`, `id_ed25519`, `credentials.json`, `.npmrc`, `.netrc`, `*.p12`, `*.pfx`, `serviceaccount*.json`) and files containing a private key block, `sk_live_`, `AKIA` or `ghp_` patterns. They are held back from the analysis only: they still go into the build, so leave them out of the archive. This is a backstop, not a scanner; most keys in source would get through. ## fline.json `get_config` returns the plan as a `fline.json` document. Saved at the archive root, later deploys build from it with no re-analysis of the plan (a model call still screens each upload, and build files are still generated each deploy). `smartline.json` is accepted as a legacy name; if both are present, `fline.json` wins. Decoding is strict: unknown fields are refused. Use `notes` for comments. ```json { "version": 1, "project": { "id": "", "platform": "" }, "declaration": {}, "answers": { "": "" }, "notes": "free text", "stack_paths": ["package.json", "package-lock.json"], "services": [ { "name": "web", "context": ".", "image": "", "language": "node", "evidence": "why the analysis chose this", "base_image": "node:22", "runtime_image": "node:22-slim", "build_commands": ["npm ci", "npm run build"], "run_command": ["node", "server.js"], "public": true, "ingress_label": "", "depends_on": [], "env_names": [ "STRIPE_SECRET_KEY", { "name": "DATABASE_URL", "scope": "managed", "ref": "postgres" } ], "volumes": [{ "path": "/data", "reason": "uploads" }], "notes": "" } ], "domains": ["www.example.com"] } ``` Rules the checker enforces, and the mistakes they prevent: - `version` must be 1. `project.id` must be this project's id. `stack_paths` is required; if the stack changed (new package manager or lockfile) the file is refused as written against a different stack: call `refresh_config`. - There is no port field. - `build_commands` run in the build stage in order; `run_command` becomes the container command. They must agree about paths. - Never put a program on `run_command` (an inline `node -e` or `python -c`); the quoting doesn't survive. Commit a script and name the file. - No `chown` in `build_commands`. - A service with `image` set is prebuilt: nothing is built. Images from `docker.io`, `ghcr.io` or `quay.io` only. Its `run_command` replaces the image's CMD but not its ENTRYPOINT. Configure it through `env_names` entries carrying a literal `value`, for example `{"name": "KAFKA_ADVERTISED_LISTENERS", "value": "PLAINTEXT://kafka:9092"}`. A literal is allowed only on a service that names an image, is never a credential, and carries no `ref`, `scope` or `bind`. Services reach each other by service name. - Never plan a Postgres, Redis or Valkey service. Declare the variable as managed instead (see [Databases](#databases)). Loop: edit the file, call **`check_config`** `{project_id, config}` (free, checks against the last uploaded archive) until it answers ok, then upload. **`refresh_config`** re-runs the analysis ignoring the file, costs an analysis and is asynchronous: poll `get_project` until it leaves `analyzing`, then `get_config`. ## Variables and secrets The rule: **never ask the person to paste a secret into the chat.** Declare the name and hand them the link. | Tool | Does | |---|---| | `declare_env_names` | Declares names only. Values are not accepted. | | `get_secrets_link` | Returns `{url, expires_at, instruction}`: a one-use link to a form, valid 10 minutes, that only the signed-in, approved owner can use. It shows each declared name that has no value yet. Do not open, follow or relay its contents. | | `set_env` `{project_id, name, value, secret}` | `secret` is required. `secret: true` writes to the secret store; nothing can read it back, this tool included. `secret: false` writes a plaintext setting that `list_env_names` and the dashboard show. | | `list_env_names` | Names, whether each is set, required, declared, and the value for plaintext settings only. Never a secret value. | | `delete_env_name` | Removes a value. A name the analysis declared stays required, so the next deploy waits at the secrets gate. | | `restart` | Re-applies the current version. The only way a secret written after the last deploy reaches running containers. | What `set_env` with `secret: true` is for: storing a value you **already hold**. That is one you generated (a random session key), or one the person already pasted into the chat before you could stop them. Never ask for a key in the chat to use this path; `get_secrets_link` is the way in for anything the person has. It is honest to say "fline won't show it again"; it is not honest to say "your AI never saw it". For a key that went through the chat, suggest the person get a fresh one from its issuer and type it on the `get_secrets_link` form. `set_env` refusals: - `secret: false` with a name whose last underscore-separated segment is `KEY`, `TOKEN`, `SECRET`, `PASSWORD`, `PASS`, `PWD`, `CREDENTIAL`, `CREDENTIALS` or `DSN`. Rename it or send `secret: true`. - An empty value. Declare the name and let the person fill it in. - `secret: false` on a name that already holds a secret. Call `delete_env_name` first. - A name the plan binds to a managed database or addon. The platform writes that value itself. `secret: true` on a name that already holds a secret replaces it. Either kind takes effect on the next deploy or `restart`. A plaintext setting survives re-analysis; a secret added by hand under a name the analysis didn't declare does not. The person can also set or replace a secret themselves on the project's Variables page in the dashboard. That never passes through you. If the app prints a saved secret verbatim, fline blanks exact matches longer than 2 characters out of the logs you read. Partial or transformed copies get through. ## Databases **The truth, from the worker:** when the plan marks a variable as `scope: "managed"` with `ref` `"postgres"` or `"valkey"`, the platform wires it. After analysis the project moves to `provisioning`; the worker reuses the database already bound to this project, or else the account's oldest database named `-` (lowercased, at most 64 characters), or else creates one with that name. It waits until the database is active and writes the connection string into the project's secrets under the planned variable name. Nobody is asked for it, and you must not `declare_env_names` it or `set_env` it (`set_env` refuses). Consequences: - **Prefer the plan path.** If the analysis didn't mark the variable managed, fix it in `fline.json` (`{"name": "DATABASE_URL", "scope": "managed", "ref": "postgres"}`), `check_config`, and re-upload. - **`create_service` is separate.** It makes an account-level database that the plan path uses only if it is named `-postgres` or `-valkey`. Otherwise you get two. Call `list_services` before creating one. A database made with `create_service` and not wired by the plan needs its connection string copied by the person from the dashboard's Services page into the secrets form. No tool returns a connection string or password. - **A paused database blocks wiring.** Provisioning fails with a message asking the person to resume it. - `format` on a managed variable: empty (the URL, the default), `"libpq"` for keyword/value Postgres configuration, `"host_port"` for a bare host:port. Valkey is TLS only and produces a `rediss://` URL; an app reading a bare `REDIS_ADDR` host:port must be changed to read a URL. What a managed database is: - `create_service` `{name, engine, version?, size_class?}`: `engine` is `postgres` (PostgreSQL 16) or `valkey` (Valkey 8, Redis-compatible). One size: 1 GiB memory, about 8 GiB of data. It starts `provisioning` and becomes `active` once its certificate is issued; poll `get_service`. - It belongs to the account, outlives any project, and can serve several projects. - Reachable from the internet over TLS with its password (Postgres DSN carries `sslmode=verify-full`). The person can restrict source addresses on the dashboard ("Who may reach it"). - `pause_service` / `resume_service`: reversible; paused refuses connections, keeps data. - `delete_service`: stops connections; data kept seven days, then destroyed. Ask first. - No backups are promised and there is no restore or download. Tell the person to keep their own copy of anything they can't lose. `rollback` never changes database contents. **Bring your own:** `attach_external` `{project_id, offering, alias?, variable?}` with `offering` one of `postgres`, `redis`, `mysql`, `mongodb`, `rabbitmq`. It takes the shape only; `variable` defaults to `DATABASE_URL`, `REDIS_URL`, `MONGODB_URI` or `AMQP_URL`. The project moves to `awaiting_secrets` and the person types the URL on the `get_secrets_link` form. `detach_external` undoes it; `list_external` lists them. MySQL is not a managed offering. A project that needs one either attaches an external MySQL or runs it as an ordinary prebuilt-image service. ## Domains 1. **`attach_domain`** `{project_id, domain}` returns the record to add, once. You cannot add it for the person; they add it at their DNS provider. 2. **`list_domains`** shows each domain's verification state, the TXT record, last check and last objection, and the platform hostname to point at. 3. **`check_domain`** `{project_id, hostname}` runs a check now. It is rate-limited behind a certificate budget: poll it slowly, never in a tight loop. Do not call it on a failed domain: it answers an internal error that reads like an outage. Records: - A subdomain (`www`, `app`): one `CNAME` from the hostname to the project's platform hostname. It proves ownership and routes traffic. Works at any provider. - Ownership can also be proven with a `TXT` record at `_smartline-challenge.` holding the token. The `_smartline` prefix is an older name; use it exactly as given. A TXT alone proves ownership but routes nothing. - An apex (bare) domain: confirmed only on Cloudflare (CNAME flattening). On other providers, use a `www` address. - Cloudflare: the record must be "DNS only" (not proxied). - After 48 hours a domain that still isn't proven is marked failed, and it never leaves that state: remove it and add it again (`delete_domain`, fix the record, `attach_domain`). `check_domain` cannot revive it. - Once verified, fline obtains the certificate and renews it. The dashboard's Domains page shows the record in the person's provider's own field names (Cloudflare, GoDaddy, Namecheap, Squarespace Domains, AWS Route 53, other). Send the person there rather than dictating field names. ## Updates and rollback - **Update:** `get_upload_url`, PUT the new archive, `complete_upload`. On a project already running, the old runtime keeps running while the new version is analysed and built. Then follow the same polling as a first deploy. A failure before submit leaves the old version running. - **Rollback:** `list_versions` `{project_id, limit?}` (newest first: `state_version`, when, who, what it superseded), then `rollback` `{project_id, to}`. It deploys the old version's contents as a **new, higher** version (rolling back to 3 can put the project on 12). It restores the specification, **not** the secrets: current values are re-pinned. It is refused if the stored version no longer validates. There is no rollback button in the dashboard. - Domains, managed databases and secrets persist across updates and rollbacks. ## Diagnosis Fetch the `diagnose_a_deployment` prompt. In short: 1. `get_project_detail`: per-container state, health, restart count, image digest, last failure with its class. A climbing restart count is a crash loop in the app. 2. `get_events`: the state timeline with reasons and which component moved it. 3. `get_logs` `{project_id, kind, lines?, service?}`: `kind: "build"` is stored build output; `kind: "runtime"` is a bounded tail of running containers (no history, no search), narrowed with `service`. Read it while the symptom is present. The dashboard searches 7 days of runtime output; you get only recent lines. 4. `list_env_names`: a required, unset variable holds the project at the secrets gate. 5. `get_images`: which build is actually running. Two lookalikes: a secret entered after the last deploy isn't in running containers until `restart`; a prebuilt image ignoring its command is the ENTRYPOINT rule. The dashboard shows failures with a button that copies the failure text for the person to paste to you. ## Limits and capacity | Limit | Value | |---|---| | Project size class | 1 vCPU, 1 GiB memory, 8 GiB disk, shared by all services. Not changeable. `get_usage` reports consumption, not charges. | | Managed database | 1 GiB memory, about 8 GiB data | | Archive | 100 MiB compressed, 20,000 files | | Upload link | 15 minutes | | Secrets link | one use, 10 minutes | | Build | each attempt stops at 15 minutes | | Runtime output | 7 days searchable in the dashboard; tools get a recent tail | | Usage history | up to 30 days (`get_usage` windows `1h`, `6h`, `24h`, `7d`, `30d`) | | Domain verification | 48 hours | | Scheduled jobs | none (no cron field) | **Capacity:** the platform holds a small number of projects across all users. There is no queue. When it is full, a new project goes through upload, analysis and build and is then refused at hand-off: the project fails at stage `submit` with a reason beginning `no_capacity`. Do not retry. Tell the person fline is full right now and suggest they write to the founder via `https://dev.fline.sh/#contact`. Existing projects can still update and roll back. ## Error reference | Where | Code or text | Meaning | Do | |---|---|---|---| | any `tools/call` | HTTP 401, `invalid_token` | Account pending, unconfirmed, not provisioned, or denied (see [Before any tool call works](#before-any-tool-call-works)) | Relay the message; don't loop on OAuth | | any `tools/call` | HTTP 401, no `error` | No token | Start OAuth | | any `tools/call` | `insufficient_scope` | Token lacks the tool's scope | Re-authorize with that scope | | state tools | `the project is in state X; ...` | Wrong state for this call | Follow the sentence after the semicolon | | `get_project` failure, stage `intake` | `archive_too_large`, `archive_empty`, `too_many_files`, `compression_bomb`, `file_too_large`, `config_too_large`, `archive_unreadable`, `absolute_path`, `path_traversal`, `symlink_escape`, `bad_path` | Archive refused | Rebuild the archive per [Archive rules](#archive-rules) | | stage `analyze` | reason text | Analysis failed | Read the reason; consider writing `fline.json` | | stage `provision` | e.g. managed service paused | Managed database couldn't be wired | Ask the person to resume it in the dashboard, then upload again | | stage `render` / `build` | reason text, build logs | Build files or build failed | `get_logs kind=build`; fix `build_commands`/`run_command` | | stage `submit` | `no_capacity: ...` | Platform full | Stop; tell the person | | deploy failure class | `invalid_manifest`, `image_pull_failed`, `healthcheck_failed`, `secrets_unavailable`, `converge_timeout`, `internal_error` | Runtime hand-off failed | `get_project_detail`, `get_events`; `internal_error` is the platform's, tell the person | | `set_env` | refusal sentence | See [Variables and secrets](#variables-and-secrets) | Follow the sentence | | `stop` | not implemented | No stop exists | `delete_domain` or `delete_project` | | secrets form | expired or used | One-use, 10 minutes | Call `get_secrets_link` again | | upload PUT | expired | Link older than 15 minutes | `get_upload_url` | To retry a failed project, upload again (`get_upload_url`, PUT, `complete_upload`). `deploy` does not restart a `failed` project. ## Prompts Fetched with `prompts/get`, no authentication. | Name | Argument | Content | |---|---|---| | `deploy_a_repository` | `name` (optional) | Call order from `create_project` to a running URL | | `update_a_live_app` | `project_id` (required) | A new version, a changed setting, or an earlier version put back | | `add_a_database` | `project_id` (optional) | A managed Postgres or Valkey wired through the plan, or a database the person already runs | | `use_a_web_address` | `project_id` (required), `domain` (optional) | The record the person adds, and how fline checks it | | `diagnose_a_deployment` | `project_id` (required) | What to read, in order, when a deploy fails or isn't answering | | `freeze_the_build_plan` | `project_id` (required) | Committing `fline.json` and keeping it correct | | `explain_to_the_person` | none | How to talk to someone who is not a programmer, and what never to ask them | ## Talking to the person The person is often not a programmer. They built the app with you and want it online. Use their words, not ours: | Instead of | Say | |---|---| | deploy | put it online | | repository, repo | your project folder | | environment variables, secrets | passwords and keys your app uses; settings, for non-secret values | | secrets link, form | a private fline page where you type it | | console | your fline dashboard | | logs | what went wrong; what your app printed | | rollback | put an earlier version back | | DNS record, CNAME | one record at the company where you bought your web address | | TLS certificate | the padlock | | connection string | the database's address line | | Valkey, Redis | a fast cache | | OAuth, scopes | approve fline in your browser | | build failed at render | it stopped while getting your app ready | Rules that matter to them: - Before uploading, say you're about to pack and send a copy of their project folder to fline. The original stays on their computer. - Never ask them to paste a key into the chat. Give them the private page and say: it works once, for 10 minutes, only while signed in; you'll see that they saved it, not what they typed. - Never promise backups, uptime, timings, a free tier, or that a fix will work. - Their app's link is public. If the app holds personal data, offer to check that each user sees only their own data. - If something needs them (a record at their domain company, a value on the private page, resuming a database, a dashboard visit), say exactly what and where, then wait. - fline is free during the private beta, with no card. Their AI coding app's own plan is separate and is used as usual when you work for them. ## A snippet for the project's AGENTS.md or CLAUDE.md The person can drop this into their project so any AI coding app working in the folder knows how the project goes online: ```copy ## Hosting This project is put online with fline. Read https://dev.fline.sh/llms.txt and https://dev.fline.sh/docs/for-ai.md before changing how it is built or deployed. - fline is connected as an MCP server at https://mcp.dev.fline.sh/mcp. Use its tools; don't write a Dockerfile or pick a port. - fline.json at the project root is fline's build plan. Check edits with check_config before uploading. - Never ask me to paste a password or key into the chat. Use get_secrets_link and give me the link unopened. - To update: get_upload_url, upload the tar.gz, complete_upload, then follow get_project. - To undo a bad update: list_versions, then rollback. ``` Next: [When something goes wrong](https://dev.fline.sh/docs/when-something-breaks) or [Start here](https://dev.fline.sh/docs)