How to build an AI language tutor for your business with Claude Code (no coding required)
Stop paying per learner for a course nobody finishes. Describe the tutor you want in plain words and Claude Code builds it: chat practice that corrects as it goes, flashcards and exercises made for the level, a dictionary in the lesson, daily streaks, and a ceiling per learner on what your own AI key can spend.
Claude Code
$ Build a language learning app: learners pick a language, chat with a tutor that replies in it and corrects their mistakes, drill flashcards and fill-in-the-blank exercises made for their level, look up words and translate phrases, and keep a daily streak. Each learner sees only their own progress.
- Tutor chat answering with corrections
- Drills and streaks built
- Ready for you to review
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.
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.
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.
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.
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.
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.
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.
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.
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 · DropsRenting 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
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
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
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
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.
Why build with Claude Code
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.
Claude Code removes that barrier. The whole workflow becomes a simple loop:
Describe
Say what you want in plain words in any language.
Build
It writes and edits real code across backend, auth, and UI.
Check
Run the app and see the change actually work.
Repeat
Ask for the next thing. Repeat.
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.
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 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
- ~94 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. 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 and claude.com, checked September 2026.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
You describe one piece at a time in plain words and Claude Code writes the tutor functions, the dashboard and the database work together, reading the rest of the project before it edits any of it. The check that matters: type a sentence with a mistake in it and read whether the correction teaches or just rewrites.
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.
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.
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.
Claude Code
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 CodeClaude subscription
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 plansNode.js engine
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)Supabase (database)
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 CLINothing 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.
Build your language tutor, prompt by prompt
No code to write. Describe what you need and Claude Code runs the commands. One thing about the order: the ceiling on tutor calls goes in with the first corrected reply, because the natural way to test a tutor is to talk to it for an hour, and an hour of testing without a limit is a bill.
- 01
Set up the project
An empty app running against your own database, plus a notes file so Claude Code keeps the two rules this build depends on in front of it.
PromptSet up the projectSet 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 the vocabulary for a language tutor (learners, target language, activities, streaks) and recording two standing rules: every call to the AI provider goes through a server-side function with the key in its secrets and a per-learner limit checked first, and the browser never holds the key or decides the limit.
Write the limit rule down now. A function that calls the provider directly from the browser is the first thing any assistant will reasonably suggest, and it would put your key in every learner’s hands.
- 02
Get the tutor answering, with the ceiling in the same step
One server-side function, one corrected reply, and the log and the limit built in from the first call. No accounts yet, so use a placeholder learner id and a small limit while you test.
PromptBuild the tutor function and the ceilingCreate a Supabase edge function called chat-assistant that calls my AI provider with the key held in function secrets, never in the browser. It takes the learner’s message, their target language, their native language and the last ten turns of the conversation, and asks the model to reply in the target language at the learner’s level, then, in the native language, to point out up to three mistakes in what they wrote and how to fix them, without rewriting the whole message. Before it calls the provider it must write a row to a calls table (learner, activity, model, tokens in and out, cost estimate) and check that learner’s calls today against a limit read from a settings table, returning a friendly "you have reached today’s practice limit" when it is hit. Then build one simple chat page that shows the conversation and renders the reply as formatted text. Use a placeholder learner id for now.
Test it with a sentence that has a real mistake in it, in a language you know. A reply that quietly rewrites the sentence is a chatbot. A reply that says what was wrong and why is a tutor, and the prompt is where the difference lives.
- 03
Add accounts, the data model and the rules that keep them apart
Now the ordinary application work. Sign-in, a profile per learner with their languages, the activity and streak tables, and access rules so one learner’s progress is theirs alone.
PromptAdd auth, tables and access rulesAdd Supabase Auth with email and password: sign-up, login, logout, a persisted session, a profiles row per learner created by a trigger on sign-up with their native and target languages, and a useUser hook. Then the data model as migrations. An activity_completions table recording each completed activity with its type and the day. A user_streaks table holding the current and longest streak per activity. Wire the calls and settings tables from step 02 to the real learner id. Enable row-level security on every table so a learner reaches only their own rows, with explicit WITH CHECK clauses on insert and update, and make every function, including the ones that only record activity, refuse a caller without a valid session at the gate. Show me how to verify a second learner gets nothing back for the first learner’s rows.
There are no roles here, and that is right for a personal tutor. Ownership is one rule, which is exactly why it should be watertight.
- 04
Build the dashboard, the drills and the dictionary
The screen learners live in. Four tabs on one dashboard, each behind its own function, all through the same ceiling.
PromptBuild the dashboard and the drillsBuild the learning dashboard as one page with four tabs and a language picker at the top. Chat Practice uses the function from step 02. Flashcards calls a get-flashcards function that generates a set of vocabulary cards for the target language and a chosen difficulty, flips to reveal the meaning, and reads the word aloud with the browser’s own speech synthesis. Quick Exercises calls a generate-exercise-sentence function for fill-in-the-blank sentences at a chosen difficulty and checks the answer as the learner types. Dictionary calls get-word-meaning for a definition and translate-text for a phrase, with one tap to swap the two languages. Every function goes through the same key, the same sign-in check and the same per-learner ceiling as the chat. Put my name and colours on it.
Ask that every function share the ceiling explicitly. Four functions with four separate limits is the version of this that looks finished until the bill arrives.
- 05
Add streaks and the history page
The feature that brings learners back tomorrow, and the one that makes them angry when it miscounts. Decide the rule before it is written.
PromptAdd streaks and historyAdd an activity-completed function that records a completed activity for the signed-in learner and updates that activity’s streak: consecutive days extend it, a missed day resets it, and the longest streak is kept. Treat a day as the learner’s local day, sent from the browser and validated on the server. Add a get-streaks function and show the four streaks as counters on the dashboard, then build a streak history page with a week view and charts of completions per day and per activity. Explain to me exactly when a streak breaks, so I can write it in the app’s help text.
The time-zone question is the one to settle here. A learner in Tokyo whose streak resets at midnight in your city will stop trusting the number, and then the feature is worth nothing.
- 06Destination
Add settings and demo mode, then use it as a stranger would
Finish with the pieces around the lesson, then open a private window and try to spend your key without an account.
PromptAdd settings, demo, and testAdd a settings page for the learner’s languages and a password change, each through a function that checks the caller. Add a demo mode: a visitor who continues without an account sees the dashboard shell with sample content and clear prompts to sign up, and none of the functions accept a call from them. Add a usage panel in settings showing the learner’s calls and estimated cost this period. Then run the app and walk me through the whole thing: open the demo signed out and confirm nothing calls the provider, sign up, hold a ten-turn conversation with mistakes in it, drill a set of cards and an exercise, look a word up, check the streaks moved, then hit the daily limit on purpose and read what the app says, and fix whatever breaks on the way.
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.
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 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.
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
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 GitUndo 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 accountYou 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 appWhere 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).
| Host | Best for | Notes | Free tier |
|---|---|---|---|
| Vercel | One-click deploys | Publishes 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) |
| Netlify | Drag-and-drop or Git | Link 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 Pages | Learners in more than one country | Served 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 Pages | Not really this app | Publishes 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 Hosting | Teams already on Google | A 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 Hosting | Teams already on AWS | Publishes 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) |
| Surge | Publish from the terminal | A 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 Platform | DigitalOcean users | Builds 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.
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.
| Service | Best for | Notes | Free tier |
|---|---|---|---|
| Supabase | Data, auth, and the tutor calls | Profiles, 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 |
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.
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.
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.
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.
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.
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.
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.
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.
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 ThomasFounder & CEO, Hado.aiCommon 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, 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 September 2026- 01Pricing (monthly and yearly, all 25 languages), Rosetta Stone. rosettastone.com
- 02Pricing (individual and family plans), Mango Languages. mangolanguages.com
- 03Pricing (monthly, 6-month and 12-month plans), Ling. ling-app.com
- 04Premium pricing (monthly, yearly and lifetime), Drops. languagedrops.com
- 05API pricing (per-token rates for the default tutor model), OpenAI. developers.openai.com
- 06Web Speech API (speech synthesis and recognition in the browser), MDN. developer.mozilla.org
- 07Pricing (Pro plan, pause, backups), Supabase. supabase.com
- 08Web developer hourly rates 2026 (freelance and agency benchmarks). developex.com
- 09Row Level Security, Supabase docs. supabase.com
- 10Plans and pricing (Pro, Max), Claude. claude.com
- 11What is the Max plan?, Claude support. support.claude.com
- 12Set up Claude Code, Claude docs. code.claude.com
- 13Models overview, Claude docs. platform.claude.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. Claude, Claude Code, and the Anthropic API are products of Anthropic. Verify current capabilities and pricing before relying on them.