Build with AI

How to build a multi-model AI chat app with Claude Code

Stop paying per seat for a text box. Just describe your ideal app, choose your AI providers, and set your budget using natural language. Claude Code handles the rest. It connects your API keys, builds a secure login for your chat history, creates a working model picker, and sets strict spending limits so you never overpay while testing.

August 2026 · 59 min read · Updated September 2026

Claude Code

$ Build an AI chat app: replies streaming back a word at a time from a server-side function holding my own provider key, every conversation saved under my own sign-in, a model picker that only offers what the function can actually reach, Markdown and code rendering, and every call logged and capped before I test any of it.

  • Boundary and ceiling in place
  • Streaming, thread and picker wired
  • Ready for you to review
You describe it, Claude Code builds it
Start here

What a multi-model chat app actually is

A text box, a list of replies, and a bill that grows every time somebody presses send. The first two take an afternoon. The third is what the rest of this page is about.

Building a basic chat box takes an afternoon. The real engineering goes into what happens behind the screen: managing API connections, preserving conversation history, and controlling costs.

At its core, a production-ready app handles four continuous tasks. It receives your input, streams the response in real time, saves conversation threads for later, and routes requests across different AI providers. The visual UI is just the demo everyone sees. Saving context and balancing vendor models is what makes the product truly usable.

What makes chat apps unique is that you pay for every single turn. Because AI models have no built-in memory, every new message re-sends the entire conversation history back to the API. A thread with forty messages costs roughly forty times more than the first turn. Without smart context management, your spending scales compounding with every response.

An AI chat app is essentially two products stitched together: the visual interface users see, and the billing logic that controls your API usage. Commercial SaaS tools charge high monthly seat fees to rent that second half. Building your own interface connects you directly to the API meter, giving you complete control over your margins and dramatically reducing overhead.

The thread is the product, not the text box

A single question and a single answer is a demo, and you can build one in an afternoon. What people come back for is the conversation still being there tomorrow, opening at the right message, carrying what was said before into what gets asked next, and being findable six weeks later when you half remember writing something down. Build the thread first and the text box becomes an input on it.

What you resend is what you pay for

Models have no memory between calls, so a chat app re-sends the conversation on every turn to create the impression of one. That is normal and it is also the entire cost model: the bill for message forty includes messages one to thirty-nine again. Deciding how much of the past to carry, and when to summarise it instead, is the difference between an app you leave running and one you switch off.

True “multi-model” architecture

Showing five AI models in a dropdown menu is easy. Connecting them is the hard part. Every provider uses different API formats, streaming logic, and error handling, so adding a new vendor takes a full week of coding, not just another line in a list. Don’t take model lists at face value. Always check what’s actually built under the hood.

What the meter actually reads

$0.15

The price of a million input tokens on gpt-4o-mini, the model this template falls back to, read on OpenAI’s own API pricing page in August 2026. Output runs $0.60. A ChatGPT Business seat is $25 a month billed monthly, so one seat-month buys roughly 166 million input tokens at that rate, whether the person holding it sends four messages or four hundred. The seat and the meter are not measuring the same thing, and that is the whole reason to own the interface.

developers.openai.com API pricing, read August 2026 · checked August 2026

What a chat app needs

The parts every chat app is built from

The first one is what everybody demonstrates. The other five are why anybody would still be signing in three months later.

01

A reply that arrives while it is written

Waiting eight seconds for a paragraph feels broken, and watching the same paragraph appear a word at a time feels fast, even though it took exactly as long. That is the biggest single difference between a chat app people use and one they close, and it is more work than it looks: the provider sends the answer in fragments over one long-running response, so your code has to read them as they arrive, cope with a fragment split down the middle, and put the whole thing on screen and into the database once it is done.

02

A thread that survives being left and come back to

The conversation belongs to an account, opens where it left off, and shows up in a list you can scan. The small things are what people notice: a title you can read in the sidebar, renaming, deleting, and an order that puts what you touched last at the top. None of it is hard, and all of it is the difference between a demo and something with your history in it.

03

A decision about how much past you carry

The model is given the conversation again on every turn, so the length of the thread is the price of the next answer. Left alone that grows without limit, which is fine at six messages and expensive at sixty. The choices are a window of recent messages, a running summary of the older ones, or a hard stop with a new thread. Pick one deliberately rather than finding out on a bill.

04

A picker that matches what is actually behind it

Offering several models means several vendors, and each has its own request format, streaming format and error shape. The honest options are an adapter per vendor, or one service that presents them all the same way. What you should not do is list a model you cannot reach, because the app will quietly answer with a different one and nobody looking at the screen will know.

05

A ceiling on a paid endpoint, not just a lock on it

Requiring a sign-in decides whose typing spends your money. It does not decide how much. You want a record of every call, a limit per person over a window you choose, and a total that stops the feature rather than emailing you about it. Watch the sign-up path too: an app that lets anybody create an account in one click has made the meter public, which is reasonable to do and unreasonable to do without a cap.

06

Rendering what a model actually sends back

Models answer in Markdown, so a raw reply is full of asterisks and backticks unless something turns them into headings, lists and code blocks. Code needs a monospace block with a copy button, because copying code out of a chat is most of what technical users do with one. It is a small feature that gets noticed the moment it is missing.

Build vs buy

Own the interface or rent a seat on somebody else’s

The four products below meter three different things: a seat, an allowance of points, and a pool of credits. None of them meters the thing you are actually paying a provider for, which is tokens. One of them is a one-time licence that already does most of what this template does, and it is the row to read before you decide to build anything.

Build your own

Your own key means you pay the model’s list price per token and the bill tracks the typing. No seat, no allowance, and no monthly floor before the first message. It also means the product is yours: your name on it, your users signing in, and your decision about what to charge them.

  • You pay the provider’s list price per token, with nobody’s margin on top
  • Ten people cost no more than one, because there is no seat to buy
  • Your own branding, your own sign-in, and your own users, which none of the four allows
  • The conversations sit in your database, so searching, exporting and deleting are yours to define
  • Which model answers is a setting you control rather than a catalogue somebody curates
  • What a person may spend is a rule you write rather than an allowance you buy

Rent a chat product

ChatGPT Business · TypingMind · Poe · Juma

What renting buys, and what this template genuinely does not have: a wide catalogue of models from several vendors, kept current by somebody else. Poe and Juma put many vendors behind one bill. TypingMind sells a polished client you point at your own keys. All four work the afternoon you pay for them.

  • Many vendors’ models behind one bill, with new ones added as they land
  • Nothing to run: no database, no functions, no deploy, and nobody to call at midnight
  • Somebody else absorbs a provider changing an API or retiring a model
  • A seat price or a points allowance is also a spending ceiling, and your own key has none until you write one
  • Sign-in, history search and the day-to-day polish of a product with a full-time team behind it
  • TypingMind in particular is a one-time licence on your own key, which is most of this template’s argument, already built
ChatGPT Business$20/user/month billed annually (2+ users), or "$25 per user per month when billed monthly" - with Plus at $20/month and Pro from $100/month for one person

First because it is what everybody compares against, and because it prices the thing this section is about. The meter is the person: a seat costs the same in the month somebody sends four messages and the month they send four hundred, which is the arithmetic in the stat above. It is also single-vendor by construction, so the model list is OpenAI’s and the day a rival ships something better is a day you wait. What you get for it is the most polished product in this table by a distance, and for one person at $20 a month it is genuinely hard to argue with.

learn.chatgpt.com · checked August 2026

TypingMind$39 (Standard), $79 (Extended) and $99 (Premium, shown at "50% OFF" against $198) - all one-time, plus a $395 bulk licence for "up to 10 users on 50 different devices"

The most useful row in the table, and the one to be honest about: it is a working commercial product built on exactly the premise this guide argues for. You buy the licence once, plug in your own provider keys, and its own page notes that the price excludes "API costs". Multi-model parallel chats sit in the Premium tier. Its comparison column describes a ChatGPT or Claude subscription as "Single vendor only", which is the same point made from the other side. Read the $99 against the hours in the calculator above before you decide to build. The discount is a promotion rather than a list price, so check both figures when you look.

typingmind.com · checked August 2026

Poe$4.17, $16.67, $41.67, $83.33 and $208.33 a month billed yearly - for 10 thousand points a day, then 660 thousand, 1.65 million, 3.3 million and 8.25 million points a month

Included for what it does not tell you, which is worth as much as a price. The page served us yearly-billed figures with no tier names attached, so no month-to-month rate is quoted here. Nothing on that view says what a point buys either: different models cost different numbers of points per message, so "660 thousand points" cannot be turned into a number of conversations and any comparison you make with it is a guess. What Poe genuinely sells is breadth, many vendors’ models behind one subscription, which is the half this template does not have.

poe.com · checked August 2026

Juma (formerly Team-GPT)Free with 300 credits per user, then "$49/mo" for the Pro workspace with credits selectable from 5,000 upward, and Enterprise on request

The row that agrees with us, which is why it is here. It is a team chat workspace across several vendors, and it has priced the seat away: credits are shared at the workspace level, and the page promises "no per-seat pricing ever" and "Unlimited seats on every plan". That is the same instinct as building your own, sold as a subscription, and for a team that wants it working on Monday it is a fair answer. Note the rename: team-gpt.com now redirects to juma.ai, which is a reminder to check a price rather than trust a screenshot.

juma.ai · checked August 2026

Rule of thumb, and it splits on what you want to own. If you want a better chat client for yourself or a small team, do not build this: TypingMind is $99 once on your own keys, and LibreChat is free, self-hosted and genuinely multi-vendor under an MIT licence. Both beat a from-scratch build on effort and on model breadth, and saying otherwise would be selling you something. What none of them gives you is a product with your name on it that your own customers sign in to and pay for. That is the case for building, and it is a real one: the moment other people are the users, a per-seat plan stops being a tool you buy and becomes a cost that grows with your success. Work out which of the two you are, because the answer is not close in either direction.

No dev needed

Why build with Claude Code

Most software looks simple from the outside, but it’s mostly hidden plumbing: a database, logins, permissions, validating forms, and dozens of screens that read and write records. Building all of that yourself means being fluent across the full stack, so weeks go to parts customers never see before the first real feature works.

Claude Code removes that barrier. The whole workflow becomes a simple loop:

The build loop
1

Describe

Say what you want in plain words in any language.

2

Build

It writes and edits real code across backend, auth, and UI.

3

Check

Run the app and see the change actually work.

Repeat

Ask for the next thing. Repeat.

Loop back to Describe

No stage of that loop asks for the full-stack expertise or the months of boilerplate that stop most people, which is why one person can ship a working app in a couple of weeks.

Three hard partshandled for you

The data model, authentication, and access rules are what make software like this genuinely hard to build by hand. Describe them and Claude Code scaffolds all three. After that, the rest is mostly screens on top.

Any language is the interface

No code to write, and no English required either. Whether you need a new field, a renamed step, or an AI summary, describe it in whatever language you think in and Claude Code handles the implementation.

Whole project in context

It finds and reads the files a change touches, instead of needing you to paste them in, so each edit stays consistent with what is already there. Point it at the two or three files that matter and it stays fast.

What it costs

Pay a developer, or do it with AI

Running costs for this app scale directly with how much your users chat. The estimates below cover development only. API usage is billed separately, so you will need to code your own spending caps to protect your budget.

Hire a developer

Custom build, from scratch
Developer
~$10k-$41k
Supabase (backend)
Free tier · $25/mo (Pro plan)*
Hosting
$0 free tier
Model provider
Per token - the line that moves with use
Build time
~205 hrs of their work

~$10k-$41k to build, then from $25/mo plus what people type

Our ~205-hour estimate, priced at the rates in the survey linked below: senior US developers at $100-$150+ an hour, and agencies charging 20-40% above the freelancers they bid against, which is where $50/hr and $200/hr come from. Where those hours go is not where a quote usually assumes. The text box and the first reply are a couple of days. Streaming that survives a broken connection, a second vendor, a thread still cheap at message sixty, and a limit nobody can talk their way past are the rest. If a quote says "an AI chatbot", ask which of those four it covers.

Build it with Claude Code

From scratch, with Claude Code
Claude Code
$20/month (Pro) to $200/month (Max)
Backend (Supabase)
Free tier · $25/month (Pro plan)*
Hosting
$0 on a free tier
Your time
~98 hrs

~$20-$200/month while you build, then whichever plan you keep using

Claude Code itself is free. The cost sits in the Claude plan behind it. The fee doesn’t shrink when you start from a template the way a per-hour developer bill would: Pro, at $20/month, covers a template import or a short build, and a from-scratch build that runs for weeks tends to need the $100-$200/month Max plan instead, because it outlasts Pro’s usage window. Either way, the template changes how many of the hours in the estimator above you actually spend, not which Claude plan you’re paying for.

* On this template the free-tier line to watch is the pause rather than storage. No files are kept, because attachments go to the model and are never saved, and a conversation is a few kilobytes of text. What does bite is that a free project sleeps after a week of inactivity, and an app people open when they happen to have a question is exactly the sort that goes quiet. Pro, from $25/mo, ends the pause and keeps a daily backup for 7 days.

Prices and rates from supabase.com, developex.com and claude.com, checked August 2026.

Plan first

Decide before you build

Six decisions to make before writing code. Half of them directly protect your API budget from unexpected user activity.

01

Should you support one AI provider or multiple?

Decide now whether a second provider is a real requirement or a nice line on a feature list. One vendor is a perfectly good product and half the work. If you do want two, choose between writing a custom adapter for each or routing everything through one service that presents them identically. The vendors section below compares both approaches.

02

What is your hard spending limit?

Read your provider’s per-token prices before you write a single line of code, then define your limits explicitly: how many API calls or tokens per person, over what time window, and what message a user sees when they reach that limit. Deciding this now means adding a single field on a table. Deciding it after your first surprising bill means rewriting the core function that everything runs through.

03

How much conversation history will you send back each turn?

The whole conversation history goes back to the model on every message unless you decide otherwise, so this is a cost decision disguised as a quality one. A rolling window of recent messages is cheapest, a running summary keeps more of the context, and having no limit at all is the expensive default you get by not making a choice. Pick one strategy now, because it shapes your database schema.

04

Who gets access, and how will you protect your API credit card?

A one-click demo account is excellent for showing the app off, but it also gives open access to your API credit card to anybody who finds the page. Decide whether you want open sign-up, email invitations, or a demo account that is capped much harder than a paid user account. Whatever you choose, usage limits must be set per account rather than per person, because accounts are free to create.

05

How long will you retain user conversation data?

Conversations accumulate quietly and they are the most personal data in this app. Decide upfront whether threads live forever, automatically expire after a set period, or can be permanently deleted on request. Then decide the same rule for file attachments, which in this template are sent to the model and never stored locally, and state this plainly to whoever signs in.

06

Are you building an internal tool or a commercial SaaS?

Building a tool for yourself and building a product for external customers are two completely different apps. Your own internal tool needs no branding, no billing system, and no legal terms. A product other people sign into needs all three, plus a clear explanation of what happens to the data they type. Decide which one you are making before designing the first screen, because it changes your database schema and authentication flow.

Approaches

Comparing your build options

Building a basic chat interface is fast. The hard part is everything behind it: handling connection drops during streaming, managing token costs on long threads, and setting spending limits for users. Here are three ways to build the exact same product.

~205 hrsBuilding by hand

Getting one reply out of a model takes an afternoon. The months go on everything around it: a reply that arrives a word at a time and survives a dropped connection halfway through, a thread that still opens correctly on the fortieth message, a second vendor whose request shape and streaming format agree with the first one in your own code and nowhere else, and a limit on a button that spends real money every time somebody presses it.

~150 hrsGeneric UI starter kit

A kit gives you a sidebar, a message list and a text box, which is the silhouette of this app and almost none of the work. Nothing in a kit knows how to stream, what to do when the stream stops mid-sentence, that you are billed for the entire conversation again on every turn, which vendor is answering, or that the person typing is signed in and still able to spend more of your money than you meant.

~98 hrsBuilt with Claude Code

Ask for one piece at a time and the migration, the server-side function and the screen calling it arrive together as a single change. Same task list as the rows above, worked through by an agent that reads the surrounding code first, which matters most on the streaming reader, where the bug is a fragment arriving split down the middle and the symptom is a word missing from an answer nobody re-reads.

Interactive calculator

Estimate your exact build timeframe

Customize your feature list below to see how build time changes. If you only need a single AI model or a basic prototype, uncheck unused items to reduce the estimate.

What your chat app needs

Your estimate

98 hrs

start to finish

Based on the 7 of 7 features you’ve selected, plus ~21h of groundwork. Toggle any on the left to watch the number move, and open the groundwork row to untick what you have already, such as a database that is already running or going live if you are only building a mock-up for now.

A rough estimate, not a quote. Real time depends on how much you customize and how clean your data is.

Setting up your workspace

Let’s set up the tools you need

Four things need to be on your machine before step 01, and none of it takes more than about 15 minutes. Three are ordinary installers you click through, and the fourth is an active Claude subscription. From there, you build simply by describing what you want, in your own words.

1

Claude Code

Cost: Free to install · needs a paid plan to build with

Your main AI assistant. Download and run the free Claude Code CLI, connect your Anthropic account or pay-as-you-go API key, and build your app in plain English. It runs in the Terminal, and if a command line puts you off, the same tool ships as a desktop app with buttons and windows.

Install Claude Code
2

Claude subscription

Cost: $20/month (Pro) or from $100/month (Max)

Claude Code itself is free, but the free Claude.ai plan does not include Claude Code access at all, so you need at least Pro, unless you pay as you go through a Console account instead. Pro at $20/month is enough to start with, though a long, from-scratch build tends to outrun what Pro allows in a given stretch, which is when people move up to Max, from $100/month. Every plan’s usage resets on a rolling window, so on a heavy day you may hit a limit and have to wait it out.

Compare Claude plans
3

Node.js engine

Cost: Free

The engine that runs your app on your own computer. You never have to learn how it works: download the version marked LTS (the most stable one), install it, and forget about it.

Download Node.js (LTS)
4

Supabase (database)

Cost: Free to start

Where your project keeps its data. Install it, then sign in once by running supabase login. Words like migrations and row-level security turn up later in the guide, and Claude Code writes those parts for you.

Install Supabase CLI

Nothing here is worth memorizing. These four just need to exist on your machine. From step 01 on, you say what you want and Claude Code runs the commands.

Step by step

Build your chat app, prompt by prompt

You write no code at all: you say what you want, and Claude Code runs the commands. Two things about the order are worth knowing. The spending ceiling is built in the same step as the first reply, because the natural way to test a chat app is to hold a long conversation and a long conversation is the expensive kind. And the model picker gets a step of its own at 05, after something answers, because that is the first moment you can tell whether it is telling the truth.

  1. 01

    Boot it, then write down the two rules that keep this build honest

    An app running against your own database, and a CLAUDE.md holding the two constraints everything after this leans on.

    PromptSet up the project
    Set up a new React 18 + Vite + TypeScript project with Tailwind and the Supabase JS client. Read VITE_SUPABASE_URL and the publishable key (the sb_publishable_… key, which replaces the older anon key) from .env, and add .env to .gitignore in the same step so neither value reaches GitHub. Add a typed Supabase client under src/lib, then write a short CLAUDE.md describing the stack and fixing the vocabulary for a chat app (conversation, message, model, provider, stream, attachment, call log, limit) and writing down the two rules that hold for the whole build. One: my model provider key stays on the server, so every call to a model runs inside a server-side function that establishes who is asking before it does anything at all. Second: every call is logged and counted against a limit before it is made, because each one is a charge on my card, the whole conversation is sent again on every turn, and a signed-in user is not a spending cap.

    Put both in the file rather than only in this message. The second is the rule an assistant will not infer: asking for a chat feature gets you a chat feature, and nothing in the request implies that holding a forty-message conversation during testing should cost more than the first one did.

  2. 02

    Model it, sign in, and keep one account out of another’s history

    The schema, the accounts, and the rules that make a conversation private, together, because on this app they are one idea rather than three.

    PromptModel it and draw the boundary
    Write the data model as Supabase migrations. Conversations with an owner, a title and a last-updated time. Messages belonging to a conversation, with the text, whether a person or the model wrote it, the model that answered, and attachment metadata. A calls table logging every model request: who, which conversation, which model, tokens in and out, whether it succeeded and an estimated cost. Then add Supabase Auth with email and password: sign-up, login, logout, a persisted session, and a trigger that creates a profile row for a new account. Then row-level security on every table: a row is reachable only by the account it traces back to, with explicit WITH CHECK on every insert and update, and the update rule on a message must forbid changing which conversation it belongs to. The row you may edit is not the same question as what that row may become. Prove it before moving on: two accounts, and show me that the second cannot read or move the first one’s messages.

    Insist on that proof as a query you watch fail. Every mistake in a privacy boundary is invisible while there is only one account, and a second account with its own conversations in it is the cheapest test instrument in this whole build.

  3. 03

    Stream one reply, and cap it in the same breath

    The feature this app exists for, and the limit that stops testing it becoming expensive. Ask for both in one prompt so there is never a version of this code without the ceiling.

    PromptStream one reply, with a ceiling
    Build the chat call as a server-side function, with my provider key in the function’s secrets and nowhere else. It requires a signed-in user and refuses with a 401 otherwise, sends the conversation to the model, and streams the answer back to the browser as it arrives. Do the streaming carefully, because this is the part I want done properly: read the response in chunks, keep a buffer for a fragment that arrives split across two chunks rather than dropping it, and write the finished message into the database once the stream ends, including when the connection drops halfway so a half-written answer is saved as a half-written answer rather than lost. Before it contacts the provider at all, write a row to the calls table and check two limits I can configure: how many calls one account may make in a rolling window, and a total across the app. Over either, return a clear "you have reached your limit for today" and do not call the provider. Read the limit and the cost on the server, never from the client. Then a screen with a text box and the reply appearing as it is written. Finally, show me three things: a reply streaming in, the finished message in the database, and the limit refusing an eleventh call when I set the limit to ten.

    That last check is the one to insist on, and to run yourself. Set the limit low, ten is plenty, and watch it stop you. A ceiling you have not seen refuse anything is a ceiling you are hoping is there.

  4. 04

    The thread, the sidebar, and what you resend

    Somewhere for the conversation to live, a list you can scan, and the decision that keeps message sixty from costing sixty times message one.

    PromptBuild the thread and the sidebar
    Build the conversation sidebar over the conversations table: a list ordered by what I touched last, opening one loads its messages in order, plus renaming, deleting and a new-conversation button. Give a conversation a title from the first exchange rather than from the first fifty characters of what I typed, and never overwrite a title I have renamed by hand. Then the part that decides the running cost: rather than sending the whole thread every turn, send the most recent messages up to a token budget I can configure and a short running summary of anything older, stored on the conversation and updated as messages fall out of the window. Keep the full history in the database, because this is about what gets sent rather than what gets stored. While I am testing, show me the token count for the next request somewhere on screen so I can watch the effect of the budget.

    Ask for the token count on screen even though you will remove it later. It is the only way to feel what the budget does, and the difference between a forty-message thread with a window and one without is the sort of thing you want to see once rather than read about.

  5. 05

    Make the picker tell the truth

    The step this template needs more than most. A model list is a promise about what the function behind it can reach, and the two are easy to get out of step.

    PromptMake the picker honest
    Define the list of models in one place on the server, with the vendor, the id and the per-token prices for each, and have the picker read that list rather than a separate one in the frontend. The function must refuse a model that is not in it with a clear message rather than silently substituting a default, because a substitution nobody can see is worse than an error. Record on every message which model actually answered it and show that under the reply. Then, if I want a second vendor, add exactly one: a separate adapter for its request shape and its streaming format, behind the same function and the same ceiling, with its own key in secrets. Tell me plainly which of the models in my list you have actually implemented and which are only names, and do not add a name I cannot reach.

    The last sentence is the whole point. Ask for the honest answer explicitly, because a model list is exactly the kind of thing that gets padded out to look generous, and this template already ships with one name in it that the code behind cannot reach.

  6. 06
    Destination

    Markdown, attachments, and one real conversation end to end

    The rendering, the composer, your own name on it, and then the part most builds skip: use it for something you actually needed.

    PromptFinish it, then rehearse
    Finish the app. Render replies as Markdown with headings, lists and code in a monospace block with a copy button, since copying code out is most of what people do with a chat app. Add attachments to the composer, and be explicit with me about the trade: either send the file to the model without keeping it, which needs no storage, or store it and link it from the message, which needs a bucket and access rules over it. Add dictation using the browser’s own speech recognition, with a sensible message in browsers that do not offer it rather than a dead button. Put my own name, colours and copy on the header and the sign-in page. Then walk me through one real conversation end to end: sign in as a second account, hold a conversation long enough to matter, check that account cannot see the first one’s threads, and compare the spend my calls table reports against what my provider’s own usage page says.

    Check that figure against the provider’s own dashboard instead of trusting the one you built. An estimate that has drifted from the real bill is worse than having none, since you will price things off it, and week one is while the arithmetic is still small enough to follow.

Authentication & security

Protecting your app: authentication, security, and API costs

AI chat apps require protecting three things: sensitive user conversations, database privacy, and your API budget. Here are the core security rules to follow before launching.

Use your backend’s built-in authentication

Sign-up, sign-in, user sessions, and password resets should all come directly from the default authentication service attached to your database. Use it as it comes out of the box, because an AI chat app gives you no reason to build custom identity logic from scratch. A custom authentication system that is subtly broken will fail silently and give you no warning until data is leaked.

Require authentication for all AI API calls

This is the most important security pattern to copy from this template. The server function creates its database client directly from the user’s active session token, verifies who is making the request, and returns a 401 Unauthorized error if there is no logged-in user. An exposed API endpoint isn’t just a data privacy leak: it is an open credit card. If someone finds an unauthenticated endpoint, they can run automated scripts against it and leave you paying for every single API call. Check this rule first on any new feature you build.

Combine user login with hard spending limits

Authenticating users is only half the battle, and this part is up to you to implement. Requiring a login decides who is allowed to spend your money, but not how much they can spend. To protect your budget, you need a system that logs every API call, enforces usage quotas per account over a set timeframe, and hard-stops the feature when limits are reached instead of just sending you a warning email afterward. An unmetered paid endpoint is a critical financial vulnerability: treat it like a major security issue.

Set strict limits on public demo accounts

This is a specific version of the spending limit rule, and it is the one most developers miss. Creating a demo account without asking visitors to log in first is great for conversion on a landing page, but it means your sign-in barrier keeps out anonymous strangers while leaving the front door open to anyone else. Rate limits stored temporarily in server memory help, but they completely reset whenever a new instance of your server function starts up. You must attach spending caps directly to the account record in your database, not to temporary visitor sessions.

Keep your database ownership model simple

In this app architecture, every conversation belongs to a single user account, and every message belongs to a single conversation thread. This means every database access rule reduces to one simple check: "does this specific record trace back to the user making the request?" There are no complex user roles or shared workspaces here. This makes it the simplest security model possible and leaves no hidden edge cases where authorization bugs can hide.

Validate data constraints on record updates

This is a critical database rule to learn, and chat applications demonstrate it clearly. Every update rule in your database needs to answer two questions. The obvious first question is whether a user is allowed to edit a row at all. The often-forgotten second question is what that row is permitted to turn into. In a chat app, this prevents a vulnerability where a message could be edited to move it into a conversation thread owned by another user. Security rules must check both the existing column data on the way in and the updated data on the way out.

Restrict database read policies to prevent leaks

The development history of this template serves as a great lesson, which you can see in its database migration logs. It initially launched with a Row-Level Security (RLS) policy that accidentally allowed any logged-in user to read every row in the profiles table, including user email addresses. A later migration removed that rule and added a stricter one alongside another permissive policy, and a third migration finally removed that second policy too. It took two extra attempts to get a single read rule right on the simplest table in the app. Whenever you write a read rule that grants access to "anyone", check carefully which specific columns you are exposing.

Store API keys securely and disclose data usage

Your AI provider API key must live strictly in your server-side environment secrets and nowhere else. If you place an API key in client-side app code, anyone can extract it and spend your money. Beyond security, consider privacy: everything a user types is sent directly to an external AI provider. In a chat app, that text often includes sensitive personal notes, unreleased ideas, or client information that users wouldn’t share publicly. Decide what data is allowed to leave your app, state this clearly to users when they sign up, and read your AI provider’s privacy terms regarding how prompt data is handled.

Enable daily backups for user chat history

On a free database tier, there are no automated backups for your user data. Daily database backups stored for a week begin on paid plans like Supabase Pro ($25/mo). Having reliable backups is especially crucial for AI chat applications because users treat conversation threads like personal notebooks. If data is lost, users don’t just lose the last generated response, they lose weeks or months of accumulated history and context.

PromptCheck who can see what
Review the access rules (row-level security policies) on every table. For each one, tell me in simple terms who can view, add, edit, and delete records, confirm that people can only reach their own data while the right roles can reach more, and flag anything left open that shouldn’t be.

Run this before launch to make sure nobody can see data they shouldn’t.

One rule outranks everything else on this page: your database service key and your model provider key live on the server and nowhere else, which means never inside the app people download and never inside a repository. A key that escapes is burned whichever of the two it is, and the provider key is the one somebody will actually spend. Read your usage page first to see what was done with it, then replace it the same day.

Workflow rules

What speeds the build, and what slows it

Speeds the build

  • A CLAUDE.md notes file that spells out your setup and preferences
  • Asking for a plan first on anything that touches several files
  • One change per request, small enough to describe in a sentence
  • Pointing it at the two or three files that matter
  • Running the app and checking each change before the next
  • Saving a working version (a git commit) after each step, so you can undo

Slows the build

  • Vague prompts like “make it better”, which leave it guessing what you meant
  • Asking for a whole feature in one giant prompt
  • Dumping the entire project into the chat at once
  • Skipping the notes file, so it forgets your conventions each session
  • Accepting changes without running or reading them
  • No saved versions to roll back to when something breaks
Version control

Git: what it is, and why you need it

Before you build anything, meet the one tool that makes building safe. You need no coding background for it: Git remembers every version of your project, so you can try things, break things, and get back to a working state in seconds.

What Git actually is

Git is a quiet recorder that runs alongside your project. Each time you save your work it keeps a full snapshot, so the entire history of your project lives on your computer, not just whatever the files look like right now.

Why you need it

Claude Code runs inside a permission mode you choose, either asking before each change or working more freely once you trust it. Either way, experiments sometimes still break things. Git is what makes that safe: there’s always a working version to return to, so you can try bold changes without the fear of losing what already works.

A commit is a save point

Each commit is a snapshot with a short note, like “added the home page”. Make one after every working step and you can jump back to any of them later.

GitHub’s beginner guide to Git

Undo anything, safely

If a change breaks something, you roll back to the last good commit instead of unpicking it by hand. It’s the safety net that makes bold experiments with Claude Code low-risk.

GitHub is Git’s home online

Git lives on your computer. GitHub is a free, private cloud copy of the same project. It’s your backup if your laptop dies, and the place Claude Code can always get back to. Keep it private, and never commit secret keys or passwords.

Create a free GitHub account

You rarely type git commands

You do not have to memorize any of it. Ask Claude Code to “commit this” or “undo the last change” and it runs the git steps for you. Prefer clicking to typing? Claude Code’s own desktop app, which you install separately, shows each change side by side before you keep it, and GitHub Desktop gives you plain buttons for saving and rolling back.

Get the Claude Code desktop app
Going live

Where to host your application

Hosting gives your app a home on the internet so anyone can open it via a web link. Choose a service below to make your site live. (Your database, logins, and business records are stored separately in Supabase, covered below).

HostBest forNotesFree tier
VercelOne-click deploysPoint it at the repository and every push publishes itself, with nothing for a Vite project to configure. The question to settle before you invite anybody is which plan you belong on, because Hobby is licensed for personal, non-commercial use and a chat product your own customers sign in to is commercial by any reading. That puts you on Pro, at $20/user/mo.Pro from $20/user/mo (Hobby is non-commercial)
NetlifyDrag-and-drop or GitConnect the repository, or drag the built folder onto the page and be live inside a minute. The one setting that matters is the redirect rule it prompts you for, without which a link straight to a single conversation lands on a not-found page.Free tier
Cloudflare PagesUsers in more than one countryThe app is served from wherever the person opening it is. Worth a look if the people signing in are spread across time zones, because the first paint is the part they feel before the model has answered anything.Generous free tier
GitHub PagesNot really this appPublishes from a GitHub project once one routing setting is changed. Here to be ruled out rather than chosen: free means a public repository, and this repository sits next to a function holding a key that strangers can spend.Free from a public repo only
Firebase HostingTeams already on GoogleA short setup, then one command per release. Nothing about a chat app argues for it either way. The argument is that your other accounts are Google already, and if you end up adding Gemini as a second vendor that is one supplier rather than two.Free Spark tier
AWS Amplify HostingTeams already on AWSPublishes from the AWS console, and wants the same rewrite rule as the others before a link to one conversation will resolve. Chosen because AWS is on the invoice already, never because the app asked for it.Free tier (build + hosting)
SurgePublish from the terminalOne command puts the built folder online with no repository involved. Fine for showing a colleague what the thread looks like. Wrong the moment real people sign in and start spending against your key.Free - unlimited publishing
DigitalOcean App PlatformDigitalOcean usersBuilds and serves from the account you already have, which in a small company means one fewer supplier to add to the list beside your database and your model provider. That list is already three long on this build.Free - 3 static sites, 1 GB/mo transfer

Speed is not what separates these eight, because all of them serve a built folder quickly enough. Three other questions do. Does the plan you are on allow commercial use, which Vercel’s Hobby tier does not. Can it publish from a private repository, given the function secrets sitting beside this code. And does a deep link resolve for a browser that has never seen your site, because a link to one conversation is exactly what somebody will paste to a colleague.

One thing to check on the day you go live, and it is not the hosting. Hold a conversation long enough for the reply to take a while, on a phone on mobile data rather than on your desk. Streaming runs over one long-lived response, and a proxy or a flaky connection that cuts it will leave a half-written answer on screen and a half-written row in your database. Decide what the app does with that before a user finds out for you.

Database & backend

Keep your data in Supabase

Your conversations and messages, the accounts they belong to, and the one function that calls the model, which is where the provider key belongs and the only place it should ever be.

ServiceBest forNotesFree tier
SupabaseData, auth, and the model callConversations and messages live in Postgres, accounts come from its auth service, and an edge function makes the model call. That function matters more here than on most templates, because it is the only address at which the provider key and the spending ceiling can both sit. Getting started means opening a free project and giving the app its URL and publishable key, then putting the provider key into the function secrets, where the browser cannot reach it. File storage stays unused on this build, since attachments travel to the model rather than into a bucket.Free tier, then usage-based
Choosing your model routing

How you reach a second vendor

The answer may well be that you do not, and that is a valid technical choice rather than a compromise. One provider is a complete product: this template ships that way, and most users never need more. Read this section only when you have decided you genuinely want to offer models from different providers in the same dropdown menu.

Straight to each providerTwo vendors, and stopping thereThe provider’s list price and nothing else. OpenAI runs $0.15 in and $0.60 out per million tokens on gpt-4o-mini and $1.25 in and $10.00 out on gpt-5. Google’s Gemini 2.5 Flash runs $0.30 in and $2.50 out per million on the paid tier, with a free tier alongside it.

The cheapest per token, because nobody sits in the middle, and the most work per vendor. Each one needs its own key, its own request shape and its own streaming format handled in your function, which is roughly a week for the second and less for the third. Choose this when the list is short and you expect it to stay short.

developers.openai.com · checked August 2026

Google AI (Gemini) directAdding the vendor this template already advertisesGemini 2.5 Flash on the paid tier: input "$0.30 (text / image / video)" and "$1.00 (audio)", output "$2.50", per million tokens. A free tier exists.

Listed separately because it is the specific second vendor this template’s picker already names and does not reach. Its free tier makes it cheap to try before you commit to the work, and its paid text price sits between the two OpenAI models most people use, so what a conversation costs starts to depend on which model somebody picked. Price them side by side before you let users choose freely.

ai.google.dev · checked August 2026

An aggregator (OpenRouter)Many vendors, one piece of codeIts FAQ states it passes provider pricing through "without any markup, so you pay the same rate as you would directly with the provider". The fees are on the money rather than the tokens: 5.5% to buy credits with a card ($0.80 minimum), 5% with cryptocurrency, and 5% on usage above the free allowance if you bring your own keys.

One request shape and one streaming format for every model, so a new vendor becomes a string in a list rather than a week of work. Read the fee correctly, because it is easy to misread as a tax on inference: it applies when you load credit, so $100 of credit costs $105.50. Against a week of building and maintaining an adapter that is cheap, and against staying on one provider you are happy with it is money for nothing.

openrouter.ai · checked August 2026

Do the arithmetic before you choose, because the fee is smaller than it looks. Take the conversations you expect in a month, multiply by the tokens a typical one sends, and remember that a thread resends itself on every turn. At gpt-4o-mini rates a thousand medium conversations a month is a bill in single-figure dollars, and 5.5% of that is cents. At that size the decision is about your own time rather than the fee, so the answer is usually the aggregator or nothing at all. The fee starts to matter at a volume where you would be negotiating with providers directly anyway. Figures read on each vendor’s own page in August 2026.

AI workflows

Where AI genuinely helps a chat app

The AI is the app here rather than an addition to it, so the first prompt below is not a feature. It is the guard rail the one model-calling function is missing. The four after it are things you would actually want next, and your provider key stays in that same function for all of them.

Log every call and put a ceiling on it

Nothing records what the model was asked or what it cost, so the expensive calls are the ones with no history. Build this before anything else below, because everything below spends money too.

PromptLog every call and put a ceiling on it
Add a calls table that records every model call (who made it, which conversation, which model, how many tokens went in and came back, whether it succeeded, and a cost estimate) and write to it from the chat function on every call, successful or not. Then add a ceiling: a limit per account per rolling window and a total across the whole app, both settings I can change, checked inside the function before it contacts the provider and returning a clear "you have reached your limit for today" rather than an error. Apply a tighter limit to demo accounts than to real ones. Do not let the client send the limit or the cost, because both are read on the server. Then add a small usage panel showing calls and estimated spend for the current period, by account.

Stop paying for the whole thread on every message

The conversation is resent in full on every turn, so a long thread quietly gets expensive. This is the one change that makes a chat app cheaper to run without making it worse to use.

PromptStop paying for the whole thread on every message
Change what gets sent to the model. Keep the most recent messages in full up to a token budget I can set, and for anything older send a running summary instead, stored on the conversation and updated when messages fall out of the window. Show me the token count for the next request in the interface while I am testing, so I can watch the effect. Keep the full history in the database untouched, because this is about what is sent rather than what is stored, and make the budget a setting rather than a number in the code.

Give a conversation a title worth scanning

A sidebar of threads named after the first sentence somebody typed is hard to search by eye, and it is the first thing that goes wrong once there are forty of them.

PromptGive a conversation a title worth scanning
After the first exchange in a conversation, make one cheap model call to write a short title of at most six words describing what the conversation is about, and save it on the conversation. Do it once rather than on every message, let me rename it by hand afterwards and never overwrite a title I have edited myself, and count that call against the same log and ceiling as everything else. If the call fails, keep the current title rather than showing an error.

Ask before assuming somebody wants a picture

Deciding between a text answer and an image by looking for words like "image" or "draw" in the message is cheap and wrong often enough to notice, and it is wrong in the expensive direction.

PromptAsk before assuming somebody wants a picture
Replace the keyword test that decides whether a message is an image request. Give me an explicit control in the composer for asking for an image, so the choice is mine and the app never guesses. Where you keep any automatic detection at all, make it a separate cheap classification call rather than a substring match, show me which mode a message was sent in, and let me resend the same message in the other mode without retyping it. Count image calls against the ceiling at their own higher cost rather than as one call.

Search your own history, and answer from it

After a few months the conversations know things you do not: what you asked before, what worked, and the answer you are now trying to reconstruct from memory.

PromptSearch your own history, and answer from it
Add search across my own conversations. Do the finding with database queries over the message text rather than with a model, show the matching messages with their conversation and date, and let me open one at the right place. Then add an optional panel that answers a question from my own history, sending only the messages the query actually matched and quoting which conversation each part of the answer came from. Never send my whole history in one request, and where the search finds nothing, say so instead of answering from general knowledge.

Each prompt above picks the model that fits the job. As a rule of thumb, that is Haiku for high volume, Sonnet for everyday writing, and Opus for deeper reasoning. Model names move faster than this page does, so check the current list in the Claude docs (linked in the references below) before you build. Send every one of these prompts through that same ai function, so one key and one set of rules governs all of them.

Ready-made option

Get a head start with our template

Every route above begins at an empty folder, and there is one that does not. This app streams already, keeps every conversation under its own sign-in already, and renders what a model sends back already, so the weeks that the streaming, the thread and the accounts would have cost turn into an afternoon of adding your key and your name.

Multi-LLM Chat

The exact chat app this guide builds, packaged so you can open it, point it at your own backend, and make it yours from there. A multi-model chat app with streaming replies and saved conversation history. Switch between models like GPT-5, GPT-4o and Gemini 2.5, all running on your own provider key as a private, branded product.

React 18ViteTypeScriptTailwind CSSSupabase
Out of the box

The key benefits of starting with a template

Streaming replies, saved conversations, sign-in with a one-click demo, attachments, voice input, and Markdown rendering with code blocks. Read the security section above before you go live, and the fourth FAQ below for the one claim to check.

Building the core from scratch

~98 hrs

Opening the template, already built

~1 hr

~97 hrs of building you skip

Two deliberately different measurements. The build is the ~98 hrs. The hour is what adoption costs: a database of your own, a provider key in the function’s secrets, your name on the header, and one conversation held end to end to prove it works. Setting your own spending limit costs the same on either path, so neither figure includes it.

Streaming replies, handled properly

The reply arrives a word at a time over one long-lived response, and the code that reads it keeps a buffer for fragments that arrive split down the middle rather than dropping them. That buffering is the part a first attempt gets wrong, it produces answers with words missing, and it is already done here.

Conversations saved under your own sign-in

Email and password sign-in, a session that survives a refresh, and a sidebar of saved threads ordered by what you touched last, with renaming and deleting. There is also a one-click demo account for visitors, which is genuinely useful on a landing page and is the first thing to put a tighter limit on.

A composer that takes files and speech

Up to ten attachments at 20 MB each go to the model with your message, and dictation into the text box uses the browser’s own speech recognition, so it costs no tokens at all. Two honest limits: the browser dictation works in Chrome and Edge and largely does not in Firefox, and attachments are sent rather than stored, so the file name survives in the thread and the file itself does not.

Replies rendered the way models write them

Models answer in Markdown, and this renders it: headings, lists, and code in a monospace block rather than a paragraph full of backticks. Light and dark themes are both there, and it has been tested on real phones rather than only in a narrow browser window.

The provider key never reaches the browser

Every model call goes through one server-side function that checks for a valid session first and refuses without one, and your key lives in that function’s secrets. It handles the provider saying "slow down" gracefully too. What it does not do is cap anything, which is why the first prompt in the AI section above exists and why it is not optional.

One account per conversation, 11 live access policies

Every row traces back to the account that owns it, and 11 live row-level security policies out of 13 written decide who may read and change each table. Two were removed in later migrations, both of them read rules that had been too generous. There are no roles here, so everyone who signs in can do the same things, which is the right shape for a personal assistant and something to change deliberately if you add an admin.

Customer story

From founders who build on our templates

We needed a live product in front of users fast. Instead of building from scratch, I grabbed this template, customized the logic with AI, and shipped in several days. What usually takes a dev team weeks took us a weekend.
Jeevan ThomasJeevan ThomasFounder & CEO, Hado.ai
Got questions?

Common questions

Only one, and this is the first thing to know before comparing it with anything. The model picker lists five names and one of them is Gemini 2.5 Flash, while the function behind it calls OpenAI and nothing else. Pick a model it does not recognise and it quietly answers with the default instead, which is currently gpt-4o-mini, with nothing on screen saying so. So what you are buying is a polished single-vendor chat app with a picker that is ready for more, rather than a working multi-vendor one. The vendors section above is the honest answer to what adding a second one costs, and the first build step in this guide has you make the picker tell the truth before you do anything else.

As it stands, yes, and it is the first thing to add. The model function is properly locked to signed-in users and handles the provider saying "slow down", so an anonymous stranger cannot call it directly. What is missing is any cap on somebody who is signed in: no log of calls, no quota, no rate limit, and no total. Two things make that sharper here than on most apps. Signing up is one click, because the app ships a demo-account function anybody can trigger. And a conversation resends itself to the model on every turn, so cost climbs as a thread gets longer. The first prompt in the AI section above adds the log and the ceiling together.

Whatever your provider charges for the tokens, and the answer that matters is the one you measure rather than the one you read. Two things to know before you look. Prices are per million tokens and differ by an order of magnitude between a small model and a large one, so which model somebody picks changes the bill more than how much they type. And the whole thread is sent again on every turn, so the fortieth message costs roughly forty times what the first one did. Send a realistic conversation with the model you plan to default to, then read your provider’s own usage page. That measurement is worth more than any figure quoted anywhere else.

No. Up to ten files at 20 MB each go to the model with your message, and only the name, size and type are kept on the message afterwards. Reopen the conversation tomorrow and you will see that a file called quarterly.pdf was attached and you will not be able to open it. That is a deliberate trade rather than an oversight, because it means the app needs no file storage and no rules over it, but it does mean "file attachments" promises less than a reader might assume. Keeping the files is a described addition: a storage bucket, access rules over it, and a link on the message.

Yes, through the same function, and the way it decides to is worth changing early. Rather than giving you a control, it looks at your message for words like image, picture, photo or draw, and sends anything containing one to the image endpoint instead of the chat model. So a question about optimising image loading in your code comes back as a picture, and image calls cost considerably more than text ones. The fourth prompt in the AI section above replaces the guess with a control you press on purpose.

It works where the browser supports it, which in practice means Chrome and Edge, and largely not Firefox. It uses the browser’s own speech recognition rather than sending audio to a model, which is why it costs nothing per use and why it is not consistent between browsers. Dictation that behaves the same everywhere means sending the audio to a transcription model instead, which is a described change and adds a per-minute cost to a feature that currently has none.

Several people, yes, and each one sees only their own conversations. Different permissions, no: this template has no roles at all, so everyone who signs in can do the same things. An administrator who can see usage, or a reviewer who may read a thread they did not write, is a described addition rather than a setting. Think about it before you add one, because a conversation is the most personal thing in this database and somebody who can read every thread is a decision worth making deliberately.

Yes, and that is the main reason to start from this rather than rent something. You get the full source under a licence that allows client work, so the name, the colours, the copy and the domain are yours to change. Charging your own users means adding billing, which this template does not include: a payment provider, a plan per account, and a link between the plan and the limits you set. Add the spending ceiling first, because a paid plan whose users can cost you more than they pay is a worse problem than no plan at all.

Three suppliers. A database, a host, and the model provider. The first two have free tiers you can stay on for a long time, because conversations are small rows of text and no files are stored. The third is the one that tracks how much people type and has no ceiling until you build one. If you upgrade anything first, make it Supabase Pro from $25/mo, and do it for the pause rather than the storage: a free project sleeps after a quiet week, and an app people open when a question happens to come up is exactly the sort that goes quiet.

Nothing here is proprietary. Conversations and messages sit in plain PostgreSQL tables that any Postgres host accepts from a standard dump, and the messages are ordinary text. The model calls go to your provider on your own key, so moving to a different vendor is a change in one function rather than a migration. The only thing that does not come with you is anything that was attached rather than typed, because attachments were never stored.

Yes, and every host listed above attaches one in a few clicks with HTTPS included. Do it before you invite anybody, because the domain is on every sign-in link and every password reset, so moving afterwards breaks those links for the people who already saved them.

No, though you will type the occasional command: installing Claude Code, starting the app, applying a database change. The setup section above lists what you need, with a link for each, and once it’s on your machine Claude Code runs most of those commands for you.

Claude Code turns the real code into an app you can publish, with a database and user accounts. An Artifact is a one-file preview, good for a quick look but not for going live.

Claude Code’s plans reset on a rolling window rather than billing per token, so a heavy day of building can bump into a limit. You either wait for it to reset or move up a plan. Max gives more headroom for a long, from-scratch build. Nothing you’ve already built is lost either way, so the work only pauses.

References

Sources checked August 2026
  1. 01Pricing (plans, per-seat and per-user rates), ChatGPT docs. learn.chatgpt.com
  2. 02Pricing (one-time licence tiers, bulk licence, bring-your-own-key terms), TypingMind. typingmind.com
  3. 03Subscription plans (points allowances, yearly-billed rates), Poe. poe.com
  4. 04Pricing (workspace credits, seat policy), Juma. juma.ai
  5. 05API pricing (per-million-token rates by model), OpenAI. developers.openai.com
  6. 06Gemini API pricing (paid-tier rates, free tier), Google. ai.google.dev
  7. 07FAQ (markup policy, credit and bring-your-own-key fees), OpenRouter. openrouter.ai
  8. 08LICENSE (MIT), LibreChat. github.com
  9. 09Pricing (Pro plan, free-tier project pausing, backups), Supabase. supabase.com
  10. 10Web developer hourly rates 2026 (freelance and agency benchmarks). developex.com
  11. 11Row Level Security, Supabase docs. supabase.com
  12. 12Edge Functions secrets and environment variables, Supabase docs. supabase.com
  13. 13Plans and pricing (Pro, Max), Claude. claude.com
  14. 14What is the Max plan?, Claude support. support.claude.com
  15. 15Set up Claude Code, Claude docs. code.claude.com
  16. 16Models overview, Claude docs. platform.claude.com

This guide is general information, not legal advice. What a model provider may do with what you send it, and what you must tell the people signing in to your app about where their conversations go, are set by that provider’s terms and by your own local rules, so read both before other people type anything into what you build. Third-party prices, plan terms, and market rates are quoted from the sources above and were last checked on the date shown. Vendors change them without notice, and model prices move faster than anything else here, so confirm before you budget. Build hours and the cost estimates derived from them are our own estimates, not quotes. Claude, Claude Code, and the Anthropic API are products of Anthropic. Verify current capabilities and pricing before relying on them.