Build with AI

How to build an AI language tutor for your business with v0 (no coding required)

Design the lesson first and let the rest follow. A dashboard with chat, flashcards, exercises and a dictionary built directly from simple English descriptions, then a real tutor behind it on your own AI key with a ceiling per learner, a database for progress and streaks, and sign-in that keeps each learner’s work their own.

September 2026 · 43 min read · Updated September 2026

v0

$ Build the screens for a language tutor (a dashboard with a language picker and tabs for chat practice, flashcards, exercises and a dictionary, plus a streak page), then wire in a tutor that corrects on my own AI key, with a ceiling per learner, and a database for progress and streaks.

  • Dashboard generated first
  • Tutor and database added next
  • Ready to preview
You describe it, v0 builds it
Start here

Overview & core architecture

An AI language tutor is a practice partner rather than a course: a learner types in the language they are learning, gets a reply in it with their mistakes corrected, and drills what came up, with the model answering on your own key rather than a subscription per learner.

The usual version of this is a course app. Somebody wrote the lessons, recorded the audio, and charges every learner the same amount a month for the same path through them, whether they open the app every day or twice. Every product in the comparison further down works that way.

This version replaces the fixed path with a conversation. The learner says what they can, the tutor replies in the target language and points out what to fix, and the flashcards and exercises are generated around that level rather than pulled from a fixed deck. Behind it sit a dictionary and translator for the moment a word is missing, and a streak per activity that brings people back tomorrow.

What changes underneath is the bill. Every reply, card and exercise is one call to your AI provider at a per-token price, so a learner who practises for an hour a day costs you cents and a learner who never opens the app costs you nothing. The honest consequence, and the first decision below, is that a tutor on your own key needs a ceiling per learner, because the template ships without one.

The correction is the product

A chatbot that answers in Spanish is a novelty. A tutor that answers in Spanish, shows the learner the two words they got wrong and carries on the conversation is a lesson, and the prompt that makes the model do the second thing rather than the first is the most valuable text in this build.

Content is generated, not authored

No course to write and no audio to record. Cards and exercises come from the model for the language and the level the learner chose, which is why six languages ship on day one and a seventh is a line in a list, with the caveat that generated content needs a check a curated course does not.

The seat is the meter you remove

A course app charges per learner per month. A tutor on your own key charges per message, and the two diverge in your favour exactly where a subscription is most profitable: the learners who signed up and rarely practise.

What you are building

Essential language tutor components

Six building blocks make up the tutor, and the corrected conversation is the one to prove first. Each is something you can ask your AI coding tool to build or rework in plain words.

01

Chat practice with corrections

The learner writes in the language they are learning and the tutor replies in it, marks what was wrong and why in a line or two, and keeps the conversation going. The last several turns travel with each message so the tutor remembers what was said, and the reply is rendered as formatted text rather than a wall of words.

02

Flashcards made for the level

Vocabulary cards generated for the chosen language and difficulty, flipped to reveal the meaning, with a speaker button that reads the word aloud using the visitor’s own browser voices.

03

Fill-in-the-blank exercises

Sentences generated at a chosen difficulty with a word missing, checked as the learner types, so practice follows what the conversation just surfaced rather than a fixed deck.

04

Dictionary & translator

The meaning of a word in the target language, and a phrase translated in either direction with one tap to swap the languages, without leaving the lesson to look it up somewhere else.

05

Per-activity daily streaks

A streak for chat, for cards, for exercises and for the dictionary, each recorded when the learner completes something, shown as counters on the dashboard and as a week view with charts on its own page.

06

Learner accounts & settings

Sign-up and sign-in, a profile per learner with their native and target languages, settings and a password change, and a demo mode that shows the dashboard to a visitor without an account.

Build vs buy

Own the tutor or rent a seat in a course

Every product below charges per learner per month, packaged four different ways: monthly, prepaid for a year, prepaid for longer, or once for life. None of them charges for what a learner actually did. A tutor on your own key does, which is the number to hold on to while you read the table.

Build your own

Own the tutor outright: the learners, their progress and their streaks sit in a database you control, the content is generated for the languages and levels you choose, and the only bill that moves is the model calls you route through your own AI key. With an AI coding tool writing the machinery, that build is weeks rather than a quarter.

  • No seat to buy, so a learner who signs up and rarely practises costs nothing
  • Model calls at the provider’s per-token price on your own key, with a ceiling you set per learner
  • Your own branding, your own sign-in and your own learners, which none of the four allows
  • Languages, levels and the tutor’s manner are yours to decide rather than a catalogue to pick from
  • Progress and streaks live in your database, so reporting and export are yours to define
  • The code and the records are yours outright, and can move to any host you like

Rent a course

Rosetta Stone · Mango Languages · Ling · Drops

Renting buys a curriculum written by people, audio recorded by native speakers, and a company that keeps both current across dozens of languages. What it costs is a price per learner per month, paid whether or not they practise.

  • Lessons designed by people and recorded by native speakers, which a generated card is not
  • Dozens of languages on day one, against the handful you configure
  • Live this afternoon, with somebody else absorbing the model and content changes
  • A price per learner per month on all four, however little that learner practised
  • A curriculum rather than a conversation, so a learner who wants to talk is still on rails
  • No corrections of what the learner actually wrote, because nothing in a fixed course reads it
Rosetta Stone"$19.99 /mo" billed monthly, or "$13.25 /mo" when "Billed yearly as $159.00", both for all 25 languages, with a "14-day money-back guarantee"

The plainest version of the seat: one learner, one price a month, the same whether they finish a unit a day or none. The annual plan is a third cheaper for a year paid up front, which is the usual shape of the discount on every row here. Rosetta Stone is the row to read for what a curated course with speech practice built in costs, because that is what a generated tutor is not.

rosettastone.com · checked September 2026

Mango LanguagesIndividual at $13.99 a month or $10 a month billed annually, Family at $19.99 a month or $12.50 a month billed annually for up to 5 profiles, all with "unlimited access to all 70+ languages"

The row that prices a household rather than a person: five profiles for one price, which is the closest any of these comes to the shape of a tutor you run for a group. The catalogue is the argument, seventy languages against the six this template ships with, and the counter-argument is that all seventy follow the same fixed path.

mangolanguages.com · checked September 2026

Ling$16.99 a month, $64.99 for 6 months, or $89.99 for 12 months (shown against $149.99), all with "Unlimited Access to All of Our 40+ Languages", plus a limited free tier with ads and a 7-day trial

Priced by how long you commit: the monthly rate almost halves once a learner pays for a year up front, which tells you where the margin is. A free tier with limited lessons and ads is what most learners meet first, and the paid tier removes the limit rather than adding a different kind of practice.

ling-app.com · checked September 2026

Drops"$11/month", a yearly plan at "$69.99" shown as "$5/month" with "7 days free, then billed annually", and a lifetime plan at "$150" as a one-time purchase

The row with a lifetime price, which is the packaging closest to owning something and still not the same thing: a lifetime licence to somebody else’s vocabulary games, with no learners of your own on it. Worth reading against the one-time cost of a build, because it is the only row where the comparison is one price to one price.

languagedrops.com · checked September 2026

Rule of thumb: if you want to learn a language yourself, do not build this. Any row above teaches you more for less than the weeks below cost, and a curriculum written by people beats a generated deck for a beginner. If you teach, run a school, train staff or want a product of your own, the seat is the bill, and a tutor on your own key turns a price per learner into cents per lesson. The honest middle case is a tutor for beginners in a language you do not speak yourself, and there the right answer is to build it and have a native speaker check what the model generates before learners see it.

No dev needed

Why build with v0

Skip the curriculum and the server engineering. Describe the tutor, the drills and the streaks you want, say who may sign in, and every learner’s progress is saved under their own account without you writing server code.

v0 starts with the screens, and the backend comes when you ask for it: the server routes and logic that read and write real data, usually once the interface already exists and there is something real to connect it to:

The build loop
1

Sketch

Describe the screen or component you want.

2

Preview

See it rendered live, and select any part of it to adjust directly.

3

Connect

Add a database and the routes that read and write to it, once the UI needs somewhere real to save.

Iterate

Prompt again for the next screen or the next piece of logic.

Loop back to Describe

The order matters here more than with a full-app builder: v0 gets you a finished-looking interface fast, and the data underneath doesn’t show up until you ask for it and give it somewhere to live.

One clickconnects a database

Supabase, Neon, and Upstash are integrations you add from the project menu once a screen needs to hold onto something real, and v0 provisions the credentials and writes the routes that use them.

Live preview is the feedback loop

Every prompt updates the working interface right there in the chat, so you see the actual screen changing instead of imagining it from a description.

Design mode edits without a prompt

Select an element in the live preview, adjust its style directly or type a plain-language instruction, and v0 applies the change back to the real source code as a new version.

What it costs

Pay a developer, or do it with AI

Nothing in a tutor you own carries a price per learner, so the cost is whoever writes it, plus a model bill that follows your own AI key and grows with practice rather than with sign-ups. Both ways of paying for the writing are priced below.

Hire a developer

Custom build, from scratch
Developer
~$9.8k-$39k
Supabase (backend)
Free tier · $25/mo (Pro plan)*
Hosting
$0 free tier
AI tutor calls
Per token on your own key
Build time
~195 hrs of their work

~$9.8k-$39k to build, then from $25/mo after launch

Our ~195-hour estimate, costed against the rate survey linked below, whose bands run from $45-$75/hr for North American contractors up through $100-$150+/hr for senior US developers, before the 20-40% an agency adds, which brackets the range at roughly $50/hr and $200/hr. Most of those hours are the tutor prompt, the generated drills and the streak arithmetic, none of which shows in a screenshot. Then read the model row: at the default model’s rates a lesson of twenty exchanges costs well under a cent, and it is the only line that grows with use.

Build it with v0

From scratch, with v0
v0
$0 ($5/mo of credits) to $30+/month (Plus)
Backend (Supabase)
Free tier · $25/month (Pro plan)*
Hosting (Vercel)
Free on Vercel’s Hobby plan
Your time
~94 hrs

Free to try the idea, ~$30+/month on Plus while you build a real one, then whichever plan you keep using

v0 bills in dollars of credit rather than a flat fee, so cost tracks usage: importing the pre-built template can fit inside Free’s $5 a month, while a from-scratch build runs into Free’s 7-messages-a-day cap quickly and usually needs Plus, at $30 per user per month with no annual discount shown. Because v0 generates the interface and the backend as separate steps rather than one pass, expect more prompts to reach the same result than a tool that writes both together.

* On this template the free-tier line to watch is the pause rather than storage. Nothing large is stored, because conversations are not saved and no files are kept, so a learner is a few rows of text. What bites is that a free project sleeps after a week without activity, and a tutor people open when they have ten spare minutes 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, v0.app, v0.app and vercel.com, checked September 2026.

Plan first

Decide before you build

Six decisions to make before writing code. Two of them protect your AI key from a learner who practises more than you budgeted for, and one decides whether the tutor can hear.

01

What is your ceiling on tutor calls per learner?

Every reply, card and exercise is a paid call on your key, and the template ships with no limit on any of them. Decide now how many calls a learner gets per day or per month, what the screen says at the limit, and whether a paying learner gets more. Decided now it is a field on a table. Decided after the first surprising bill it is a rewrite.

02

Which languages and levels do you offer?

The template ships six languages in a fixed list and detects the learner’s native language from their browser. The model can teach far more, and each one you add is a line in a list plus a native speaker to check what it generates. Decide the list before the first screen, because it shapes the picker, the prompts and your marketing.

03

Do you save conversations?

The template keeps the conversation in the tab and forgets it when the tab closes. Saving it lets a learner pick up where they stopped and lets you show progress, and it also makes you the keeper of everything they typed while learning. Decide which, and if you save, decide for how long and how a learner deletes it.

04

Text only, or speaking too?

The template reads a flashcard aloud with the visitor’s own browser voices and has no microphone anywhere. Speaking practice is a real build: recognising speech, scoring pronunciation, a fallback for browsers without a voice for the language. Decide whether it is in the first version, because it changes the tutor prompt and the dashboard.

05

What counts as a streak day, and in whose time zone?

A streak is the feature that brings learners back and the one that makes them angry when it breaks. Decide whether any activity keeps it alive or each activity has its own, when the day rolls over for a learner in another time zone, and whether a missed day can be repaired. Write the rule down before the arithmetic is written.

06

Free trial, demo shell, or sign-up first?

The template’s demo mode shows the dashboard to a visitor without an account and gives them no tutor, no cards and no streak, because all of those spend your key. Decide whether strangers get a few real exchanges, an invitation, or the shell. Whatever you choose, limits attach to the account, because accounts are free to create.

Approaches

Comparing your build options

Building a chat box that answers in Spanish is fast. The hard part is everything behind it: a correction that teaches rather than rewrites, drills generated at the learner’s level, a streak that counts days honestly, and a ceiling on what each learner can spend. Here are three ways to build the exact same product.

~195 hrsBuilding by hand

A tutor that answers is an afternoon. The weeks go on making it teach: correcting a learner’s sentence without rewriting it, carrying the last ten turns into the next reply, generating cards and exercises that match the level rather than the dictionary, and a streak that counts a day the way a learner in another time zone expects.

~145 hrsGeneric UI starter kit

A kit gives you a login page, a settings screen and a tab bar. It has never heard of a target language, a correction or a streak, so the tutor, the drills and the progress, which are the whole product, start from nothing.

~94 hrsAI-powered development with v0

You describe the dashboard in plain words and it appears in a live preview, then the tutor, the database and the routes behind it are a second, deliberate ask. The check that matters: sign in as a second learner and confirm the first learner’s streaks never appear.

Interactive calculator

Estimate your exact build timeframe

Customize your feature list below to see how build time changes. If you only need the tutor chat, or streaks are not part of your product, uncheck those rows to reduce the estimate.

What your language tutor needs

Your estimate

94 hrs

start to finish

Based on the 6 of 6 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

v0 runs entirely in the browser too, so there’s no download and no terminal. Before step 01: sign up, pick a plan, and know that a database is one click away once a screen actually needs to save something. GitHub is the last piece, and it’s what turns the chat into a project you can hand to someone else.

1

v0 account

Cost: Free

Sign in with a GitHub, Google, or email account and you land in a chat where you describe the interface you want. There’s nothing to install.

Sign up for v0
2

v0 subscription

Cost: Free ($5/month of credits), then $30/month (Plus)

Free includes $5 of credits a month, capped at 7 messages a day, which is fine for trying a few screens and thin for a real build. Plus is $30 per user per month, billed monthly only (v0’s pricing page shows no annual option), and it’s the realistic floor once you’re iterating past a handful of screens.

Compare v0 plans
3

Database (Supabase, Neon or Upstash)

Cost: Free to start

Where your project keeps its data, added when a screen needs one. v0 generates the interface first. A database is a one-click integration you add from the project menu once a screen needs somewhere real to save to, with Supabase, Neon and Upstash as the options, and connecting one lets v0 write the routes that use it.

Connect a database in v0
Optional
4

GitHub connection

Cost: Free

Not needed to build anything, since v0 keeps its own history of every change. Connect a repository from the chat’s Git panel and v0 also commits every code-changing message to its own branch, ready to merge as a pull request. That is the step that turns the chat into a project other tools, and other people, can use.

Connect v0 to GitHub

The database step is the one worth not skipping once your screens need real data. Everything else here takes a couple of minutes, and after that you’re just describing what you want.

Step by step

Build your language tutor, one chat at a time

v0 generates the interface first and the rest when you ask, which suits this template well: the dashboard is exactly the kind of screen worth having in front of you early. Keep one feature to one chat so its history stays a line you can follow.

  1. 01

    Generate the dashboard before anything else exists

    Start with the screen learners live in. Placeholder replies and cards are fine, and finding out the layout is wrong now costs nothing.

    PromptSketch the dashboard
    Build the learning dashboard for a language tutor: a language picker at the top and four tabs. Chat Practice with a conversation and a text box, where the tutor’s reply shows a correction of the learner’s message beneath it. Flashcards that flip to reveal a meaning with a speaker button. Quick Exercises with a fill-in-the-blank sentence and an answer box. Dictionary with a word lookup and a translate box with one tap to swap the two languages. Add four streak counters above the tabs and a separate streak history page with a week view and a chart. Use placeholder content for now. I will add the real tutor next.

    Placeholder data is fine here, and only here. Everything after this step gets something real behind it.

  2. 02

    Add the real tutor to the screen you just built, with the ceiling

    This is the step that turns a convincing mock-up into a tutor. The log and the limit go in with the first reply, because every turn resends the conversation and a long test is a bill.

    PromptBuild the tutor route and the ceiling
    Add a server route that calls my AI provider with the key held in server environment variables, never in the browser. It takes the learner’s message, their target and native languages and the last ten turns, and asks the model to reply in the target language at the learner’s level and then, in the native language, to point out up to three mistakes and how to fix them without rewriting the whole message. Before it contacts the provider it writes a row to a calls log and checks the learner’s calls today against a limit read from settings, returning a friendly limit message when it is hit. Wire the Chat tab to it and render the reply as formatted text. Use a placeholder learner id for now.

    Be explicit that the key lives on the server. v0 will otherwise reasonably reach for a client-side call, since the screen already exists and it is the shortest path.

  3. 03

    Start a new chat for the database and its routes

    Saving progress is a separate feature from practising, so give it its own chat. Restoring a version later then undoes the persistence work without taking the dashboard with it.

    PromptConnect a database and design the model
    In this chat, connect a Supabase database and create the tables and the API routes behind them. A profile per learner with their native and target languages. Activity completions with a type and the learner’s local day. Streaks per activity with the current and longest run. The calls log and the settings table from step 02. Make the dashboard read and write real data through the routes rather than placeholder content.

    Ask for the routes alongside the tables. A schema with nothing reading it leaves the dashboard exactly as fake as it was.

  4. 04

    Add auth, checked on the server and in the database

    Two layers, same rule. A route check is the first line, row-level security is the second, and it is the one that still holds when a route forgets to filter.

    PromptAdd auth and access rules
    Add authentication. Email-and-password sign-up, login, logout, a session and a profile row per learner, with signed-out visitors sent to the login screen. Every API route, including the tutor route and the ones that only record activity, must check that a learner is signed in server-side rather than trusting anything the browser sends, and the tutor route must use the real learner id for the ceiling. Then turn on row-level security for every table so the database enforces the same thing: a learner reaches only their own rows, and every insert and update carries an explicit check that the row is not being filed under someone else.

    v0 routes run on the server, so the check belongs there. A limit enforced only in the component is a limit anyone can skip.

  5. 05

    Add the drills and the dictionary, then tidy the dashboard with Design mode

    Four more routes behind the tabs you already have, all through the same ceiling. Spend the time you save on a proper visual pass over the dashboard.

    PromptAdd the drills and the dictionary
    In a new chat, add four more server routes, each through the same key, the same sign-in check and the same per-learner ceiling as the tutor: one that generates a set of vocabulary flashcards for the target language and a chosen difficulty, one that returns a fill-in-the-blank sentence at a chosen difficulty with its answer, one that defines a word, and one that translates a phrase between the two languages. Wire them to their tabs: cards that flip and read the word aloud with the browser’s own speech synthesis, exercises checked as the learner types, and the dictionary with the swap button working.

    For visual fixes on the dashboard, select the element in the preview and use Design mode rather than describing where it sits. It is faster and it changes the real code.

  6. 06
    Destination

    Add streaks, settings and demo mode, then open a pull request

    The pieces around the lesson come last, then walk the whole thing through and merge, which, if that branch is the linked Vercel project’s production branch, also deploys it.

    PromptAdd streaks, settings, demo, and ship
    Add a route that records a completed activity and updates that activity’s streak using the learner’s local day (consecutive days extend it, a missed day resets it, the longest run is kept), wire the counters and the history page to real data, and add a settings page with the learner’s languages, a password change and a usage panel showing calls and estimated cost this period. Add a demo mode where a visitor without an account sees the dashboard shell with sample content and no route accepts a call from them. Then help me walk the whole flow: open the demo signed out and confirm nothing calls the provider, sign up, hold a ten-turn conversation with mistakes in it, drill cards and an exercise, check the streaks moved, hit the daily limit on purpose and read what a learner sees. Once it holds up, publish and open a pull request for it.
Authentication & security

Protecting your app: sign-in, learner progress, and your AI key

A language tutor holds three things worth protecting: each learner’s account and progress, whatever they typed while learning, and the key that pays for every reply. Here are the rules to follow before launching.

Use your backend’s built-in authentication

Sign-up, sign-in, sessions and password changes come from the authentication service attached to your database. Use it as it comes, because a language tutor gives you no reason to build identity logic of your own, and a hand-written version that is subtly wrong fails silently until somebody’s account is open to a stranger.

Ownership enforced in the database

The template ships 8 access policies over three tables, and the rule they enforce is the simplest possible: a profile, an activity record and a streak belong to one learner and nobody else reads or changes them. There are no roles, so everyone who signs in can do the same things, which is the right shape for a personal tutor and something to change deliberately if you add a teacher view.

Every tutor call requires a signed-in learner

The five functions that call the model refuse a caller without a valid session at the gate, so an anonymous visitor cannot spend your key by finding the address. The four that record activity and settings check the caller inside the function instead. Ask for the gate check on all nine, because an open AI endpoint is an invoice rather than a data leak.

A login is not a spending limit

The half this template leaves to you. Signing in decides whose practice spends your money, not how much of it. You want a log of every call, a quota per learner over a day or a month, and a hard stop that ends the lesson politely rather than an email that warns you afterwards. Treat an unmetered tutor as a security problem, because that is how it behaves.

Store the AI key server-side and say what leaves

The provider key lives in the function’s secrets and never in the app, where anyone could lift it. Then the part people skip: every sentence a learner types travels to your AI provider, and people practising a language write about their day, their work and their family. Say so to whoever signs in, and read your provider’s terms on what it does with what it receives.

The demo mode is a shell, on purpose

A visitor who chooses to continue without an account sees the dashboard and gets no tutor, no cards, no exercises and no streak, because every one of those would spend your key on somebody you cannot identify. If you want strangers to get a taste, give them a capped account rather than opening the functions.

Enable daily backups before real learners arrive

The free tier keeps no backups, so during the build your database is the only copy of every streak a learner has kept going. Daily backups kept for seven days start on Supabase Pro at $25/mo. Move to it before the first stranger signs up, because a lost streak is the one thing a learner will not forgive.

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.

Paste this into the chat before launch so v0 checks nobody can see data they shouldn’t.

One rule outranks everything above it: your database service key and your AI provider key belong on the server only, never in the app a learner downloads and never in a repository. If either escapes, treat it as compromised, check your provider’s usage page for what was spent with it, and replace it the same day.

Workflow rules

What speeds the build, and what slows it

Speeds the build

  • One screen per message, checked in the live preview before you ask for the next one
  • Adding a database as soon as a screen needs to remember something, so v0 wires it up as it builds
  • Clicking the thing you want changed in Design mode, rather than describing where it sits
  • One feature per chat, so its history reads as a straight line you can walk back
  • Sending a finished chat over to GitHub before starting the next feature, rather than stacking several together

Slows the build

  • Asking for the whole app in one message instead of one screen at a time
  • Building screens for data the database does not hold yet
  • Describing which button to change when you could just click it
  • Letting one chat run for weeks, so going back to an older version undoes everything built after it
  • Approving several messages in a row without looking at the preview after each one
Getting code out of the chat

Connecting GitHub (Optional)

Every change in v0 is saved automatically without any technical setup. You only need to link GitHub if you want a private copy under your own control or plan to hand the codebase over to external developers.

Every message is a version

Each time a message changes your code, v0 saves it as a new version. Restoring an older one adds it back as the newest version instead of branching, so the history stays one straight line.

Versions, v0 docs

Undo from the chat itself

Scroll back through the conversation and click the revert arrow on any earlier reply, or open the version number in the top right to jump straight to a specific one.

Connecting GitHub creates a real repository

From the chat’s Git panel, connect an existing repository or create one. v0 never writes straight to your main branch: every code-changing message is committed to its own working branch first.

GitHub integration, v0 docs

A pull request is how it gets merged

When you’re ready, publish and open a pull request from that working branch into your base branch, review it like any other, and merge it. Starting a new chat picks up a fresh branch for the next round of changes.

This can also be v0’s deploy path

If the branch your pull requests merge into is also the linked Vercel project’s production branch, merging one triggers a production deployment. If it isn’t, the merge just follows whatever branch behavior that Vercel project is already configured with.

GitHub integration, v0 docs
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 deploysPublishes on every push once the repository is connected, and the template already ships the routing file that lets a bookmarked streak page open directly. Hobby is licensed for personal use only, and a tutor that students or staff sign in to is commercial by any reading, so it belongs on Pro at $20/user/mo.Pro from $20/user/mo (Hobby is non-commercial)
NetlifyDrag-and-drop or GitLink the repository, or drop the built folder onto the page and be live inside a minute. Say yes to the redirect rule it offers, because without it a learner’s bookmarked streak page lands on a not-found screen.Free tier
Cloudflare PagesLearners in more than one countryServed from the location nearest each learner, and people learning a language are rarely all in one country. The whole app is a small static folder, so the first screen arrives quickly even before the tutor has said a word.Generous free tier
GitHub PagesNot really this appPublishes straight from a GitHub project after one routing change, and it is listed to be ruled out rather than chosen: the free tier requires a public repository, and this project sits beside function secrets nobody should be able to browse.Free from a public repo only
Firebase HostingTeams already on GoogleA short setup, then one command per release, with the deep-link rewrite declared in its own config file. Nothing about a language tutor argues for it, so choose it when your other accounts already live with Google.Free Spark tier
AWS Amplify HostingTeams already on AWSPublishes from the AWS console and wants the same rewrite rule as the others before a bookmarked page resolves. Pick it because your billing already lives on AWS, and for no other reason.Free tier (build + hosting)
SurgePublish from the terminalA single command puts the built folder online with no repository involved, which is fine for showing a colleague the tutor and wrong the moment a real learner signs in and starts spending against your key.Free - unlimited publishing
DigitalOcean App PlatformDigitalOcean usersBuilds and serves from an account you already pay for, which for a small school or team means one supplier fewer beside your database and your AI provider.Free - 3 static sites, 1 GB/mo transfer

Choose on two things, neither of them speed. First, whether the plan permits commercial use, because Vercel’s Hobby tier does not and a tutor with paying learners is a business. Second, whether a bookmarked link to the streak page opens the app for a learner arriving cold, because their own progress is the page they bookmark. The tutor itself never touches the host: every reply comes from your database’s functions, and the host serves one small static folder.

The speaker button uses the visitor’s own browser voices, and a voice for the language may not exist on their device. The flashcards read a word aloud with whatever voices the browser and the operating system provide, so the accent varies from phone to phone and a language can come out in the wrong voice or not at all. Before you launch, press the speaker on every language you offer on a phone as well as a laptop, and decide what the button does when no voice is available rather than letting it silently do nothing.

Database & backend

Keep your data in Supabase

Learners, their activity and their streaks, plus the functions that call your AI provider, which is where the key belongs and the only place it should ever be.

ServiceBest forNotesFree tier
SupabaseData, auth, and the tutor callsProfiles, activity and streaks in Postgres, accounts from its auth service, and one edge function per AI job with the provider key in its secrets. Make a free project, hand over the URL and publishable key, and it is connected. Nothing large is stored, so the line to watch is not storage but the pause: a free project sleeps after a week without activity, and a learner who comes back on Monday finds a tutor that takes a moment to wake.Free tier, then usage-based
AI workflows

Add AI capabilities in one simple step

Securely route your AI API keys through a lightweight serverless function. Use simple prompts to automatically cap what each learner can spend, let them speak instead of type, place them at the right level, and schedule what they should review.

Log every call and put a ceiling on it

Nothing in the template records what the tutor was asked or what it cost, and nothing stops a learner from asking all day. 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 (which learner, which activity, which model, how many tokens went in and came back, whether it succeeded, and a cost estimate) and write to it from every function that calls the provider, successful or not. Then add a ceiling: a limit per learner per day and a total across the whole app, both settings I can change without a deploy, checked inside the function before it contacts the provider and returning a friendly "you have reached today’s practice limit" rather than an error. Do not let the client send the limit or the cost, because both are read on the server. Then add a small usage panel in settings showing calls and estimated spend for the current period.

Let the learner speak instead of type

The tutor reads cards aloud today and cannot hear. Speaking is what most learners are actually afraid of, and the browser can listen for you, with the honest caveat that the recognition may use the platform’s own service rather than run on the device.

PromptLet the learner speak instead of type
Add a microphone button to the chat and the exercises that uses the browser’s speech recognition to turn what the learner says in the target language into text, shows the transcript for them to correct before it is sent, and falls back to the text box in browsers that do not support recognition for that language. Then extend the tutor prompt so that when a message arrived by voice, the reply also comments briefly on any word the transcript suggests was mispronounced, without turning the lesson into a pronunciation drill.

Place the learner at the right level

A beginner and an intermediate learner get the same cards today unless they pick a difficulty themselves. A short placement conversation decides it for them, and the tutor adjusts as they improve.

PromptPlace the learner at the right level
Add a five-exchange placement conversation for a new learner in their target language, send the transcript to the ai function and ask for a level on a simple scale with a one-line reason, store it on the profile, and use it as the default difficulty for flashcards and exercises. Re-evaluate every twenty completed activities and tell the learner when their level changes, letting them override it.

Schedule what to review

Cards are generated fresh each time and nothing remembers which ones the learner got wrong. Saving them and bringing the hard ones back at the right interval is the difference between a game and a study tool.

PromptSchedule what to review
Save every generated flashcard and exercise to the learner’s account with whether they got it right, then add a "Review" tab that schedules cards with spaced repetition: the ones they missed come back tomorrow, the ones they knew come back in a week, then a month. Ask the ai function to generate a fresh example sentence for each card on its review day so the same word is met in a new context, and show the learner how many cards are due today on the dashboard.

v0 doesn’t ship its own model for these prompts, so you bring an API key for whichever provider you want, and v0 writes the route that calls it. Start with a cheap model while you’re still iterating on the prompt itself, then swap in a stronger one for the version that ships, and keep every AI feature behind that one route so there’s only one key to rotate.

Ready-made option

Get a head start with our template

Everything above starts from an empty folder, and it does not have to. The same tutor exists already built: the chat corrects, the cards and exercises generate, the dictionary answers and the streaks count, so your time goes on the languages, the tutor’s manner and the name on the door.

AI Language Tutor

The exact language tutor this guide builds, packaged so you can open it, point it at your own backend, and make it yours from there. Learn a language by chatting with an AI tutor that corrects you as you go, then practice until it sticks. Chat for real practice, look up meanings and translations, drill with flashcards and exercises, and keep a daily streak going.

React 18ViteTypeScriptTailwind CSSSupabase
Out of the box

The key benefits of starting with a template

The tutor chat, the drills, the dictionary and the streaks already work. Behind them, sign-in, the access rules, settings and a demo shell are done too. Read the security section above before you go live, because the ceiling on tutor calls is the one thing this template leaves to you.

Building the core from scratch

~94 hrs

Opening the template, already built

~1 hr

Pay Once, Own Forever. Build exactly what your team needs without renting a monthly SaaS subscription, paying per-seat fees, or dealing with platform lock-in.

A tutor that corrects, already prompted

The conversation function replies in the target language, marks the learner’s mistakes and carries the recent turns forward, and the reply renders as formatted text. Writing that prompt so it teaches rather than rewrites is the part a first attempt gets wrong, and it is done.

Drills generated for the level

Flashcards and fill-in-the-blank exercises come from the model for the chosen language and difficulty, with the cards read aloud by the browser. No deck to author before the first learner arrives.

A dictionary and translator in the lesson

Meaning and translation from the same dashboard, both directions, one tap to swap languages, each through its own function with the key held on the server.

Streaks with a history page

A streak per activity recorded when something is completed, counters on the dashboard, and a week view with charts on its own page, all in the database rather than in the browser.

Accounts, access rules and a demo shell

Email sign-in with a profile per learner, 8 access policies holding each learner to their own rows, settings and a password change, and a demo mode that shows the dashboard to a visitor without spending your key. There are no roles, so add a teacher view deliberately if you need one.

Customer story

From founders who build on our templates

We needed a working product in front of users fast. I started from one of these templates instead of a blank repo, customized it in our AI tool, and shipped in days - not the weeks it usually takes.
Jeevan ThomasJeevan ThomasFounder & CEO, Hado.ai
Got questions?

Common questions

Cents, at the default model’s rates. A message and its corrected reply are a few hundred tokens, so twenty exchanges cost well under a cent, and a set of flashcards or exercises is about the same. The bill grows with practice rather than with sign-ups, which is why the first prompt in the AI section puts a ceiling on it: a learner who chats all day is the one case where cents add up.

Different, and honestly so. A course written by people and recorded by native speakers teaches a beginner more reliably than a generated deck. What the tutor does that a course cannot is read what the learner actually wrote and correct it, and practise a conversation the learner chooses. Most people who build this run it beside teaching, not instead of it.

The template ships six in a fixed list (Spanish, French, English, German, Mandarin and Japanese) and detects the learner’s native language from their browser. The model can tutor many more, and adding one is a line in the list, with the honest caveat that generated content in a language you do not speak needs a native speaker to check it.

Not as shipped. The flashcards read a word aloud using the visitor’s own browser voices, and the template has no microphone, recording or pronunciation scoring anywhere. Speaking practice is the second prompt in the AI section, built on the browser’s own speech recognition, and it is a real piece of work rather than a toggle.

Not in the template. A conversation lives in the tab and is gone when it closes, which keeps the database tiny and means you hold nothing a learner typed. Saving conversations so a learner can pick up where they left off is a decision above, and it makes you the keeper of everything they said while learning.

No. Describe what you need in plain language and your AI coding tool writes the tables, the accounts, the access rules and the functions that call the model. Your own job is creating a free Supabase project for it to point at and putting your AI key in its secrets, so the records and the key end up somewhere you own.

Less than a course subscription for anything above a handful of learners, because the price per learner is missing. What is left is Supabase and a host, both starting free, with Supabase Pro from $25/mo once real people sign in and you want backups and no pause, plus the model bill on your own key, which runs to cents per lesson.

Only that learner. Every profile, activity record and streak belongs to one account and the database enforces it on every query rather than trusting the screen to filter. There are no roles as shipped, so a teacher who wants to see their students’ streaks is a feature to design rather than a setting to switch on.

They can see it. The template’s demo mode shows the dashboard to a visitor without an account and gives them no tutor, no cards and no streak, because every one of those would spend your key on somebody you cannot identify. If you want strangers to get a few real exchanges, give them a capped account instead.

As shipped, only their patience. Every model call requires a signed-in learner, so strangers cannot spend your key, but nothing caps how much a learner may ask. The first prompt in the AI section adds a log of every call and a limit per learner per day, and this guide treats it as part of the build rather than an option.

Nothing here is proprietary. Learners, activity and streaks live in ordinary PostgreSQL, so a standard dump gives you everything in a form any Postgres host accepts, and the tutor prompts are plain text in the functions.

Yes. Every host here connects a custom domain with free HTTPS in a few clicks. Worth doing before you invite anyone, because a tutor students sign in to every day should look like it belongs to you.

No. You describe the screen you want in the chat and v0 generates the React and Next.js code behind it. Sign up, pick a plan, and connect a database once your screens need real data. The setup section above walks through each one.

Both, but not automatically at the same time. v0 generates the interface first. The backend (a database and the API routes that use it) is something you ask for once a screen actually needs to save or load real data.

Free plan credits reset monthly, and the 7-messages-a-day cap resets every day. If you hit either limit mid-build, what you’ve already built stays put. You wait for the reset or move up to Plus to keep going right away.

References

Sources checked September 2026
  1. 01Pricing (monthly and yearly, all 25 languages), Rosetta Stone. rosettastone.com
  2. 02Pricing (individual and family plans), Mango Languages. mangolanguages.com
  3. 03Pricing (monthly, 6-month and 12-month plans), Ling. ling-app.com
  4. 04Premium pricing (monthly, yearly and lifetime), Drops. languagedrops.com
  5. 05API pricing (per-token rates for the default tutor model), OpenAI. developers.openai.com
  6. 06Web Speech API (speech synthesis and recognition in the browser), MDN. developer.mozilla.org
  7. 07Pricing (Pro plan, pause, backups), Supabase. supabase.com
  8. 08Web developer hourly rates 2026 (freelance and agency benchmarks). developex.com
  9. 09Row Level Security, Supabase docs. supabase.com
  10. 10v0 homepage. v0.app
  11. 11Pricing (Plus, Business), v0. v0.app
  12. 12Pricing details (Free tier, credit rollover), v0 docs. v0.app
  13. 13Databases (connecting Supabase and others), v0 docs. v0.app
  14. 14Full-stack apps, v0 docs. v0.app
  15. 15GitHub integration, v0 docs. v0.app
  16. 16Deployments, v0 docs. v0.app
  17. 17Design mode, v0 docs. v0.app
  18. 18Versions, v0 docs. v0.app
  19. 19Pricing (Hobby plan), Vercel. vercel.com

This guide is general information. Third-party prices, plan limits and market rates are quoted from the sources above and were last checked on the date shown. Vendors change them without notice, so confirm before you budget. What a generated lesson costs depends on your provider’s current rates and how much your learners practise, so treat any cost expectation here as a starting point to measure rather than a specification. Build hours and the cost estimates derived from them are our own estimates, not quotes. v0 is a product of Vercel. Verify current capabilities and pricing before relying on them.