From 1cbe044e9087e169a8c258b823f0d83c53c50da0 Mon Sep 17 00:00:00 2001 From: xue Date: Wed, 23 Sep 2026 15:19:24 -0400 Subject: [PATCH 1/3] /compare: a landing page that asks, hooks and shows, not a wall of type MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The page most people arrive on from a search for another app opened on a long title and a table. It now sells, in the order a visitor decides: - Hero: the ask (yellow, with the outlined pill under it) beside the chat replica playing a correction; the H1 counts the apps from competitors.ts. - Figures between two hairlines: unlimited corrections, 5 chats a day, 182 languages, 18 free Echo packs, 0 ads. - The hook, `AppPicker`: one chip per app, and the chosen one next to LangX in six rows, with a verdict built from the data rather than written per app. Before hydration the chips are links to the posts; `?vs=hellotalk` opens on that app. The two heads sit on the same columns as the cells. - `CheckRows`: the matrix as a picture — every app's icon in every row, lit where it has the thing, counted from competitors.ts at build time. - A chapter ("the difference is a person.") with the Discover screen and the second yellow, the kinds map (LangX under Courses too, for Echo), the full matrix with a sticky first column, the posts in two columns, twelve real Google Play reviews with the reviewers' own photos where they have one, a FAQ with FAQPage data, and the closing call. Shared pieces: `data/compare.ts` (marks, kinds, LangX's row, the verdict), `data/echo.ts` (Echo as the site may describe it, from langx/docs/echo.md), `data/reviews.ts` (the reviews, which the homepage now reads too, first six), `compare/Cell.svelte` (a mark and a word). FAQ takes `items`, FinalCta a `title`. Photos are in static/images/reviews with a README on their source. Co-Authored-By: Claude Fable 5.1 --- PRODUCT.md | 3 +- src/lib/components/compare/AppPicker.svelte | 425 +++++++++ src/lib/components/compare/Cell.svelte | 68 ++ src/lib/components/compare/CheckRows.svelte | 255 ++++++ src/lib/components/organisms/FAQ.svelte | 15 +- src/lib/components/organisms/FinalCta.svelte | 5 +- .../components/organisms/PlanUsageCard.svelte | 128 --- src/lib/components/organisms/Pricing.svelte | 18 - .../components/organisms/Testimonials.svelte | 42 +- src/lib/data/compare.ts | 132 +++ src/lib/data/echo.ts | 32 + src/lib/data/reviews.ts | 113 +++ src/routes/(site)/compare/+page.svelte | 846 +++++++++++++----- src/routes/{pro => plans}/+layout.svelte | 0 src/routes/{pro => plans}/+page.svelte | 0 src/routes/{pro => plans}/+page.ts | 0 static/images/reviews/README.md | 8 + static/images/reviews/aaron.webp | Bin 0 -> 3542 bytes static/images/reviews/amanda.webp | Bin 0 -> 1918 bytes static/images/reviews/dasha.webp | Bin 0 -> 2208 bytes static/images/reviews/elias.webp | Bin 0 -> 2010 bytes static/images/reviews/erica.webp | Bin 0 -> 3484 bytes static/images/reviews/layla.webp | Bin 0 -> 2022 bytes static/images/reviews/mubarak.webp | Bin 0 -> 2070 bytes static/images/reviews/ray.webp | Bin 0 -> 3956 bytes 25 files changed, 1656 insertions(+), 434 deletions(-) create mode 100644 src/lib/components/compare/AppPicker.svelte create mode 100644 src/lib/components/compare/Cell.svelte create mode 100644 src/lib/components/compare/CheckRows.svelte delete mode 100644 src/lib/components/organisms/PlanUsageCard.svelte delete mode 100644 src/lib/components/organisms/Pricing.svelte create mode 100644 src/lib/data/compare.ts create mode 100644 src/lib/data/echo.ts create mode 100644 src/lib/data/reviews.ts rename src/routes/{pro => plans}/+layout.svelte (100%) rename src/routes/{pro => plans}/+page.svelte (100%) rename src/routes/{pro => plans}/+page.ts (100%) create mode 100644 static/images/reviews/README.md create mode 100644 static/images/reviews/aaron.webp create mode 100644 static/images/reviews/amanda.webp create mode 100644 static/images/reviews/dasha.webp create mode 100644 static/images/reviews/elias.webp create mode 100644 static/images/reviews/erica.webp create mode 100644 static/images/reviews/layla.webp create mode 100644 static/images/reviews/mubarak.webp create mode 100644 static/images/reviews/ray.webp diff --git a/PRODUCT.md b/PRODUCT.md index 19ee8171..655356f4 100644 --- a/PRODUCT.md +++ b/PRODUCT.md @@ -90,7 +90,8 @@ published line. ## Evidence on Hand -- Seven real Google Play reviews (names and text in `Testimonials.svelte`). +- Twelve real Google Play reviews (names, text and photos in + `src/lib/data/reviews.ts`; the homepage shows the first six, /compare all). - 18 blog posts under `src/routes/(blog-article)/`. - Store links: App Store id6474187141, Google Play `tech.newchapter.languageXchange`, web app `app.langx.io`. diff --git a/src/lib/components/compare/AppPicker.svelte b/src/lib/components/compare/AppPicker.svelte new file mode 100644 index 00000000..cbeccb9b --- /dev/null +++ b/src/lib/components/compare/AppPicker.svelte @@ -0,0 +1,425 @@ + + +
+
+ Head to head +

Which app are you comparing?

+

Pick one. The same six rows for every app, and the full write-up one tap further.

+
+ + + +
+ {#key selected.slug} +
+
+
+ + LangX + {LANGX.what} +
+ +
+ {#if icon} + + {:else} + + {/if} + {selected.name} + {selected.what} +
+
+ +
+
+ Kind + {LANGX.kind} + {KIND_LABEL[selected.kind]} +
+
+ Talk with real people + + +
+
+ Free plan + + + {LANGX.free} + + + + {selected.free} + +
+
+ Ads + + +
+
+ Open source + + + + +
+
+ Best for + {LANGX.bestFor} + {selected.bestFor} +
+
+ +

{verdict(selected)}

+ +
+ + +
+
+ {/key} +
+
+ + diff --git a/src/lib/components/compare/Cell.svelte b/src/lib/components/compare/Cell.svelte new file mode 100644 index 00000000..a62e2e54 --- /dev/null +++ b/src/lib/components/compare/Cell.svelte @@ -0,0 +1,68 @@ + + + + {#if mark} + + {/if} + {text} + + + diff --git a/src/lib/components/compare/CheckRows.svelte b/src/lib/components/compare/CheckRows.svelte new file mode 100644 index 00000000..f3f64dec --- /dev/null +++ b/src/lib/components/compare/CheckRows.svelte @@ -0,0 +1,255 @@ + + +
+
+ By the numbers +

Who ticks which box

+

+ All {total} apps on this page, one row per thing that decides a comparison. A lit icon has it. +

+
+ +
    + {#each rows as r, i} +
  • +
    + {r.label} + {r.note} +
    + + {r.count} of {total} +
  • + {/each} +
+ +

+ From the side-by-side table below, checked against each app's own site and store listing in + September 2026. +

+
+ + diff --git a/src/lib/components/organisms/FAQ.svelte b/src/lib/components/organisms/FAQ.svelte index 37c6e9b4..385d81b0 100644 --- a/src/lib/components/organisms/FAQ.svelte +++ b/src/lib/components/organisms/FAQ.svelte @@ -1,23 +1,28 @@
- FAQ -

Questions

+ {eyebrow} +

{title}

- {#each faqObjects as item (item.id)} + {#each items as item (item.id)}

+ +

+

Free plan, no ads. iPhone, Android and the browser.

+
+
- - - +
-
-

LangX at a glance

-
- {#each facts as f} -
-
{f.label}
-
{f.value}
-
- {/each} -
- +
+ {#each figures as f} +
+ +
{f.value}
+
{f.label}
+
+ {/each} +
+ + + + + +
+
+

the difference is a person.

+

+ Courses drill you and AI tutors answer you. LangX matches you with someone who speaks the + language you are learning and is learning yours, so every chat teaches both of you — and + any message can be corrected, without limit. Before anyone replies, Echo gives you free + packs of phrases to review. +

+
    +
  • + Matching in both directions +
  • +
  • + Unlimited corrections, on every plan +
  • +
  • + Free Echo packs to learn from +
  • +
  • No ads. Open source.
  • +
+
+ + +
+
+
+ + + +

What kind of app is it?

“Language app” covers five different things. Most people end up using one from two of these - groups — a course or a tutor for structure, and people to talk with. + groups — a course or a tutor for structure, and people to talk with. LangX is in two of them: + the exchange is the product, and Echo's free packs are the part you can study alone.

{#each KINDS as k}
+

{k.title}

{k.what}

    - {#if k.kind === 'exchange'}
  • + {#if k.kind === 'exchange' || k.kind === 'course'}
  • LangX
  • {/if} {#each byKind(k.kind) as c} @@ -203,8 +264,12 @@
{#if COMPETITORS.length} -
+

Language apps, side by side

+

+ Every app on this page in the same six columns. Each cell is a mark and a word; the row for + LangX is tinted. +

@@ -230,16 +295,14 @@ height="24" />LangX - Two-way exchange with corrections and translation in the chat + {LANGX.what} - - - - - - + + + + + + {#each COMPETITORS as c} @@ -258,14 +321,12 @@ {c.what} - - - - + + + + {/each} @@ -277,7 +338,7 @@

LangX vs each app

-
    +
      {#each oneToOne as post}
    • Roundups and guides

      -
        +
          {#each roundups as post}
-
-

The quickest comparison is a conversation.

-

LangX is free to start on iPhone, Android and the web.

-
- -
+
+
+ Reviews +

What people say

+

{ratingsLine} Every quote below is a public Google Play review, as written.

+
+
    + {#each reviews as review} +
  • +
    + + + {review.name} + {review.store} + + +
    +
    {review.body}
    +
  • + {/each} +
+

+ Read every review on Google Play +

+ + + + diff --git a/src/routes/pro/+layout.svelte b/src/routes/plans/+layout.svelte similarity index 100% rename from src/routes/pro/+layout.svelte rename to src/routes/plans/+layout.svelte diff --git a/src/routes/pro/+page.svelte b/src/routes/plans/+page.svelte similarity index 100% rename from src/routes/pro/+page.svelte rename to src/routes/plans/+page.svelte diff --git a/src/routes/pro/+page.ts b/src/routes/plans/+page.ts similarity index 100% rename from src/routes/pro/+page.ts rename to src/routes/plans/+page.ts diff --git a/static/images/reviews/README.md b/static/images/reviews/README.md new file mode 100644 index 00000000..5598995d --- /dev/null +++ b/static/images/reviews/README.md @@ -0,0 +1,8 @@ +# Reviewer photos + +The profile pictures beside the Google Play reviews quoted on /compare, as +the public listing shows them (play.google.com, tech.newchapter.languageXchange, +fetched 23 September 2026 and resized to 96×96 WebP). Each belongs to the +person whose review it sits beside; a reviewer with no photo of their own on +Google Play gets initials instead (see `src/lib/data/reviews.ts`). Take one +down the moment its owner asks. diff --git a/static/images/reviews/aaron.webp b/static/images/reviews/aaron.webp new file mode 100644 index 0000000000000000000000000000000000000000..58f5c4cc27047873a370aa50f3435813d23f6cea GIT binary patch literal 3542 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 Q-qFld2hf{sUBtG)0BD!|>;M1& literal 0 HcmV?d00001 diff --git a/static/images/reviews/amanda.webp b/static/images/reviews/amanda.webp new file mode 100644 index 0000000000000000000000000000000000000000..c02c9dfdce824d2e7b068d9e7cf7be0b84ce4adb GIT binary patch literal 1918 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 literal 0 HcmV?d00001 diff --git a/static/images/reviews/erica.webp b/static/images/reviews/erica.webp new file mode 100644 index 0000000000000000000000000000000000000000..f94ab3258216ffaf8248934638a55bb2c8ec9a19 GIT binary patch literal 3484 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 E0IEX^3;+NC literal 0 HcmV?d00001 diff --git a/static/images/reviews/mubarak.webp b/static/images/reviews/mubarak.webp new file mode 100644 index 0000000000000000000000000000000000000000..00b5cab46acbeb04123f909eaadffc0e862dd4ef GIT binary patch literal 2070 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 OF(sc=24?^eJOBWKI?xvY literal 0 HcmV?d00001 From eab4ebe886bc1309f5a80f90cc4b0668805fa627 Mon Sep 17 00:00:00 2001 From: xue Date: Wed, 23 Sep 2026 15:19:52 -0400 Subject: [PATCH 2/3] Comparison posts: LangX has Echo, so "no lessons" is no longer true MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Eleven posts said LangX had no lessons, flashcards, spaced repetition or course. Echo — eighteen free packs of phrases in six languages at three levels, read aloud, plus a card for any message a partner corrects — makes those lines false, so each is rewritten to say what is there and what still is not: no lesson path, no grammar course, a library far smaller than Memrise's. The Lessons row in the Babbel, Busuu, Memrise, Praktika and Speak tables, the Structured lessons row in the social Duolingo post, the free-apps table and setup, and the best-apps roundup all name Echo now; the Memrise post gets a section on it, since Memrise is the closest thing to it. Co-Authored-By: Claude Fable 5.1 --- .../best-language-learning-apps/+page.md | 2 +- .../free-language-learning-apps/+page.md | 6 +++--- .../open-source-alternative-to-babbel/+page.md | 8 ++++---- .../open-source-alternative-to-busuu/+page.md | 10 +++++----- .../open-source-alternative-to-cambly/+page.md | 2 +- .../open-source-alternative-to-duolingo/+page.md | 9 +++++---- .../open-source-alternative-to-memrise/+page.md | 16 +++++++++++----- .../open-source-alternative-to-praktika/+page.md | 4 ++-- .../open-source-alternative-to-preply/+page.md | 2 +- .../open-source-alternative-to-speak/+page.md | 8 ++++---- .../social-alternative-to-duolingo/+page.md | 6 +++--- 11 files changed, 40 insertions(+), 33 deletions(-) diff --git a/src/routes/(blog-article)/best-language-learning-apps/+page.md b/src/routes/(blog-article)/best-language-learning-apps/+page.md index e97b6f53..1ba6d379 100644 --- a/src/routes/(blog-article)/best-language-learning-apps/+page.md +++ b/src/routes/(blog-article)/best-language-learning-apps/+page.md @@ -192,7 +192,7 @@ A language exchange pairs you with someone who speaks the language you are learn - **[HelloTalk](https://www.hellotalk.com)** has the largest community, a public feed called Moments where natives correct your posts, and live Voicerooms. Chat and calls are free; translation, AI correction and voice-to-text have daily caps unless you pay for VIP. - **[Tandem](https://tandem.net)** is more focused on one-to-one exchange, with reviewed profiles and audio and video calls. Its free plan allows 10 new conversations and 3 translations a day; Tandem Pro raises both and removes ads. -- **[LangX](https://get.langx.io)** is ours. Matching runs both ways: you only see people who speak what you learn and learn what you speak. **Hold any message to correct it**, and corrections are unlimited on every plan, as are replies. Translation is built into the chat (20 a day on Free), with voice and photo messages, read-aloud and daily streaks. No ads, and the whole app is [open source (BSD-3)](https://github.com/langx/langx). The honest limits: the community is much smaller than HelloTalk's or Tandem's, the Free plan starts 5 new conversations a day, and there are **no live calls**, only voice, photo and video messages. Paid plans are on the [plans page](/pro). +- **[LangX](https://get.langx.io)** is ours. Matching runs both ways: you only see people who speak what you learn and learn what you speak. **Hold any message to correct it**, and corrections are unlimited on every plan, as are replies. Translation is built into the chat (20 a day on Free), with voice and photo messages, read-aloud and daily streaks. Echo, its spaced-repetition tab, ships eighteen free packs of phrases in six languages and turns any corrected message into a card. No ads, and the whole app is [open source (BSD-3)](https://github.com/langx/langx). The honest limits: the community is much smaller than HelloTalk's or Tandem's, the Free plan starts 5 new conversations a day, and there are **no live calls**, only voice, photo and video messages. Paid plans are on the [plans page](/pro). @@ -43,7 +43,7 @@ This page compares the two as of September 2026. We make LangX, and we will be c Busuu is a **course app**. It was founded in London in 2008 and has been owned by Chegg since 2022. It teaches 14 languages through lessons that run from A1 to C1 on the CEFR scale, with vocabulary review, grammar, and speaking and writing exercises. Its signature extra is **Community Corrections**: you submit a written or spoken exercise, and fluent speakers in the Busuu community correct it. -LangX is a **language exchange app**. There are no lessons. You are matched with people who speak the language you are learning and are learning a language you speak, and you have real conversations, with corrections, translation and voice messages built into the chat. +LangX is a **language exchange app**. There is no lesson path; what you can study alone is Echo, free spaced-repetition packs of phrases in six languages. You are matched with people who speak the language you are learning and are learning a language you speak, and you have real conversations, with corrections, translation and voice messages built into the chat. So a Busuu alternative can mean two things: @@ -58,7 +58,7 @@ So a Busuu alternative can mean two things: name: "LangX", tagline: "Language exchange app", points: [ - "No lessons; ongoing one-to-one chats", + "Ongoing one-to-one chats; Echo packs to review, no lesson path", "Two-way matching", "Correct any message, unlimited on every plan", "Translation built into the chat", @@ -85,7 +85,7 @@ So a Busuu alternative can mean two things: | | LangX | Busuu | | --- | --- | --- | | What it is | Language exchange app | Structured course app with a community | -| Lessons | None | CEFR-aligned lessons, A1 to C1, in 14 languages | +| Lessons | No lesson path; Echo has 18 free phrase packs in six languages, read aloud, three levels each | CEFR-aligned lessons, A1 to C1, in 14 languages | | Matching | Two-way: people who speak what you learn and learn what you speak | Exercises are routed to fluent speakers, or sent to friends | | Corrections | Correct any message in an ongoing conversation, unlimited on every plan | Community Corrections on course exercises; free members can send a limited number, Premium is unlimited | | Conversation | Ongoing one-to-one chats | Short exchanges around a correction | @@ -157,7 +157,7 @@ LangX's app and API are open source under BSD-3 on [GitHub](https://github.com/l ### What LangX does not do -- **No lessons, no grammar explanations, no curriculum.** If you need to be taught the basics, LangX will not do that. +- **No grammar explanations and no curriculum.** Echo's free phrase packs give you something to review, but if you need to be taught the basics, a course does that better. - **No live calls,** only voice messages. - **A smaller community,** so some language pairs have fewer people. - **The free plan caps new conversations** at 5 per rolling 24 hours (replies and corrections are never capped). The [plans page](/pro) has details. diff --git a/src/routes/(blog-article)/open-source-alternative-to-cambly/+page.md b/src/routes/(blog-article)/open-source-alternative-to-cambly/+page.md index f1f66102..9d30dc65 100644 --- a/src/routes/(blog-article)/open-source-alternative-to-cambly/+page.md +++ b/src/routes/(blog-article)/open-source-alternative-to-cambly/+page.md @@ -45,7 +45,7 @@ This page compares LangX vs Cambly as of September 2026. We make LangX, and we w **Cambly** is an online English tutoring service. You subscribe to a plan, then book or start video lessons with native English-speaking tutors, around the clock. It teaches English only, and it has a separate program for children, Cambly Kids. -**LangX** is a free language exchange app. There are no tutors and no lessons. You are matched with someone who speaks the language you are learning and is learning a language you speak, and you help each other in a one-to-one chat with corrections, translation and voice messages built in. +**LangX** is a free language exchange app. There are no tutors and no lessons with a teacher; what you can study alone is Echo, free spaced-repetition packs of phrases in six languages. You are matched with someone who speaks the language you are learning and is learning a language you speak, and you help each other in a one-to-one chat with corrections, translation and voice messages built in. So a "Cambly alternative" can mean two things: diff --git a/src/routes/(blog-article)/open-source-alternative-to-duolingo/+page.md b/src/routes/(blog-article)/open-source-alternative-to-duolingo/+page.md index 72db118d..8e7907fb 100644 --- a/src/routes/(blog-article)/open-source-alternative-to-duolingo/+page.md +++ b/src/routes/(blog-article)/open-source-alternative-to-duolingo/+page.md @@ -37,7 +37,7 @@ LangX is an open source, social alternative to Duolingo for the part Duolingo do This page is a head-to-head LangX vs Duolingo comparison, checked at the time of writing (September 2026). We make LangX, and we will say plainly where Duolingo wins. -If you want an open source alternative to Memrise for speaking with real people, LangX is a free, open source (BSD-3) language exchange app that matches you with native speakers who can correct any message you send. Memrise is still the better tool for learning vocabulary with native-speaker videos, spaced review and AI practice, so the honest answer to "LangX vs Memrise" is: Memrise helps you learn the words, LangX gives you people to use them with. +If you want an open source alternative to Memrise for speaking with real people, LangX is a free, open source (BSD-3) language exchange app that matches you with native speakers who can correct any message you send. Memrise is still the better tool for learning vocabulary with native-speaker videos and AI practice, and its course library is far larger than Echo, LangX's own spaced-repetition tab. So the honest answer to "LangX vs Memrise" is: Memrise helps you learn the words, LangX gives you people to use them with — and, with Echo, a place to keep the sentences those people teach you. @@ -65,7 +66,7 @@ So today Memrise is best described as an **official-course app built on native-s | | LangX | Memrise | | --- | --- | --- | | What it is | Language exchange app with real people | Vocabulary and course app with AI practice | -| Lessons | None | Official courses organized into Scenarios, with spaced review | +| Lessons | No lesson path; Echo has 18 free phrase packs in six languages, read aloud, three levels each | Official courses organized into Scenarios, with spaced review | | Who you talk to | Native speakers matched two ways: they speak what you learn and learn what you speak | AI (MemBot, Podchats); no human conversation partners | | Corrections | A human partner can correct any message; unlimited on every plan | AI feedback on your conversations and exercises | | Native speakers | Real people in real chats | Short videos of native speakers saying words and phrases | @@ -155,6 +156,10 @@ On LangX, your partner holds any message to correct it, and corrections are unli text="On LangX your partner holds any message to correct it, so you learn what sounds natural. Corrections are unlimited on every plan, Free included." /> +### Spaced repetition, fed by real conversations + +LangX has **Echo**, a spaced-repetition tab of its own, free on every plan. It ships with eighteen packs of phrases — English, Spanish, German, French, Russian and Italian, at three levels each, every phrase read aloud — so there is something to review before you have a single partner. The part Memrise cannot copy: one tap on any message, correction or feed post makes a card, so the sentences you review are the ones a real person actually said to you. Memrise's library is far larger, and its videos of native speakers have no equivalent here. + ### Open source and a real free plan The LangX app and API are public on [GitHub](https://github.com/langx/langx) under the BSD-3 license and can be self-hosted. Memrise is closed source, and many former users were frustrated when community courses were moved out of the app, which is part of why people look for an open source alternative to Memrise. LangX Free includes unlimited text messages, unlimited replies and corrections, 5 new conversations and 20 translations per rolling 24 hours. See [plans](/pro) for more. @@ -165,14 +170,14 @@ LangX shows no ads and uses no advertising identifiers. It does run product anal ### What LangX does not do -- **No flashcards, spaced repetition or course.** LangX will not drill vocabulary for you. +- **A much smaller library.** Echo has eighteen phrase packs and the cards you make yourself; there is no course of Memrise's size and no native-speaker videos. - **No community course library,** so it is not a replacement for Memrise's user-made courses. - **No AI chat today.** LangX Copilot, private AI feedback, is planned for Polyglot but not shipped. - **No live calls,** only voice messages, and a smaller community means fewer partners for some language pairs. ## Is LangX a free Memrise alternative? -For speaking practice, yes: LangX Free has no time limit and no ads, and corrections and replies are never capped. It is not a free vocabulary course. If you want free flashcards, pair LangX with a spaced-repetition tool, and use our free [most common words](/tools/most-common-words) lists to decide what to learn first. +For speaking practice, yes: LangX Free has no time limit and no ads, and corrections and replies are never capped. For vocabulary, Echo gives you free spaced repetition — eighteen phrase packs in six languages, read aloud, and a card for any sentence a partner sends or corrects — but not a course of Memrise's size. Our free [most common words](/tools/most-common-words) lists help you decide what to learn first. ## LangX vs Memrise: who should pick which? @@ -188,6 +193,7 @@ For speaking practice, yes: LangX Free has no time limit and no ads, and correct - have some vocabulary and want to use it with real native speakers - want an open source alternative to Memrise you can audit or self-host - want unlimited human corrections on a free plan with no ads +- want spaced repetition fed by real conversations: Echo turns any message into a card - are learning a language where you want real people, not just videos **Or combine them.** Learn ten words in Memrise, then use three of them in a LangX conversation that day. Words you have actually said to a person are much harder to forget. Our guide on [how to remember your foreign languages](/stop-the-struggle-how-to-remember-your-foreign-languages-even-after-years) and the free [vocabulary test](/tools/vocabulary-test/french) pair well with this routine. @@ -207,7 +213,7 @@ For more speaking-focused options, see [Duolingo alternatives for speaking](/duo ### What is the best open source alternative to Memrise? -For speaking practice with native speakers, LangX is an open source alternative to Memrise: its app and API are BSD-3 licensed on GitHub. For flashcards, an open source spaced-repetition tool is the closer match; LangX does not do vocabulary drills. +For speaking practice with native speakers, LangX is an open source alternative to Memrise: its app and API are BSD-3 licensed on GitHub. For flashcards, LangX's Echo does spaced repetition too, with free packs in six languages and cards made from your chats, though an open source tool like Anki has a far larger library of decks. ### What happened to Memrise community courses? diff --git a/src/routes/(blog-article)/open-source-alternative-to-praktika/+page.md b/src/routes/(blog-article)/open-source-alternative-to-praktika/+page.md index af9e4964..91c02a27 100644 --- a/src/routes/(blog-article)/open-source-alternative-to-praktika/+page.md +++ b/src/routes/(blog-article)/open-source-alternative-to-praktika/+page.md @@ -59,7 +59,7 @@ So when people search for a "Praktika alternative", they usually want one of two | --- | --- | --- | | What it is | Language exchange app with real people | AI tutor app with animated avatar tutors | | Who you talk to | Native speakers matched two ways: they speak what you learn and learn what you speak | AI avatars with different personalities and accents | -| Lessons | None | Learning paths with 1,000+ lessons, including exam prep | +| Lessons | No lesson path; Echo has 18 free phrase packs in six languages, read aloud | Learning paths with 1,000+ lessons, including exam prep | | Corrections | A human partner can correct any message; unlimited on every plan | Real-time AI feedback on pronunciation, grammar and word choice, with adjustable strictness | | Translation | Built into the chat (Free 20 a day, Fluent 300, Polyglot 1000) | Tutors can explain in your native language | | Voice and calls | Voice, photo and video messages, read-aloud; no live calls | Spoken, face-to-face-style conversation with an avatar; no human calls | @@ -162,7 +162,7 @@ LangX shows no ads and uses no advertising identifiers. It does use product anal ### What LangX does not do - **No AI tutor today.** LangX Copilot, private AI feedback while you practice, is planned for Polyglot but not shipped. -- **No lessons, paths or exam prep.** +- **No learning paths or exam prep.** Echo's free phrase packs are something to review, not a course. - **No live calls,** only voice messages. - **People are not always online,** and a smaller community means fewer partners for some language pairs. diff --git a/src/routes/(blog-article)/open-source-alternative-to-preply/+page.md b/src/routes/(blog-article)/open-source-alternative-to-preply/+page.md index a7dfa5e2..98921d52 100644 --- a/src/routes/(blog-article)/open-source-alternative-to-preply/+page.md +++ b/src/routes/(blog-article)/open-source-alternative-to-preply/+page.md @@ -45,7 +45,7 @@ This page compares LangX vs Preply as of September 2026. We make LangX, and we w **Preply** is a tutor marketplace. You browse tutors, filter by language, price, reviews, specialty and availability, book a trial lesson, and if you like the tutor you subscribe to a set number of lessons with them. Its app lists lessons in more than 90 languages, and the platform also covers subjects beyond languages. It also sells corporate language training for companies. -**LangX** is a free language exchange app. There are no tutors and no lessons. You are matched with someone who speaks the language you are learning and is learning a language you speak, and you help each other in a one-to-one chat with corrections, translation and voice messages built in. +**LangX** is a free language exchange app. There are no tutors and no lessons with a teacher; what you can study alone is Echo, free spaced-repetition packs of phrases in six languages. You are matched with someone who speaks the language you are learning and is learning a language you speak, and you help each other in a one-to-one chat with corrections, translation and voice messages built in. So a "Preply alternative" can mean two things: diff --git a/src/routes/(blog-article)/open-source-alternative-to-speak/+page.md b/src/routes/(blog-article)/open-source-alternative-to-speak/+page.md index 5ecfa4ce..81516e0c 100644 --- a/src/routes/(blog-article)/open-source-alternative-to-speak/+page.md +++ b/src/routes/(blog-article)/open-source-alternative-to-speak/+page.md @@ -34,7 +34,7 @@ If you want an open source alternative to Speak that gets you talking with real @@ -44,7 +44,7 @@ We make LangX, so we have a stake in this. Everything about Speak below comes fr [Speak](https://www.speak.com) is an **AI speaking tutor**. It was founded in 2016 in San Francisco by Speakeasy Labs, is backed by the OpenAI Startup Fund, and is built around what it calls the Speak Method: learn phrases native speakers actually use, practice them until they are automatic, then apply them in back-and-forth conversation with the Speak Tutor AI. You speak out loud the whole time, and the app gives real-time feedback on pronunciation and phrasing. -LangX is a **language exchange app**. There are no lessons and no AI tutor today. You are matched with people who speak the language you are learning and are learning a language you speak, and you have real conversations with them, with corrections, translation and voice messages built into the chat. +LangX is a **language exchange app**. There is no lesson path and no AI tutor today; what you can study alone is Echo, free spaced-repetition packs of phrases in six languages, read aloud. You are matched with people who speak the language you are learning and are learning a language you speak, and you have real conversations with them, with corrections, translation and voice messages built into the chat. So a "Speak alternative" can mean two things: @@ -59,7 +59,7 @@ So a "Speak alternative" can mean two things: | --- | --- | --- | | What it is | Language exchange app with real people | AI speaking tutor with a structured course | | Who you talk to | Native speakers matched two ways: they speak what you learn and learn what you speak | The Speak Tutor AI, in lessons, roleplays and free talk | -| Lessons | None | Expert-built course with tutor lessons, drills, roleplays and vocab builders | +| Lessons | No lesson path; Echo has 18 free phrase packs in six languages, read aloud | Expert-built course with tutor lessons, drills, roleplays and vocab builders | | Corrections | A human partner can correct any message; unlimited on every plan | Instant AI feedback on pronunciation and phrasing | | Translation | Built into the chat (Free 20 a day, Fluent 300, Polyglot 1000) | Part of the lessons, not a chat tool | | Voice and calls | Voice, photo and video messages, read-aloud; no live calls | You speak out loud to the AI throughout; no human calls | @@ -161,7 +161,7 @@ LangX shows no ads and uses no advertising identifiers. It does have product ana ### What LangX does not do - **No AI tutor today.** LangX Copilot, private AI feedback while you practice, is planned for Polyglot but has not shipped yet. -- **No lessons or drills.** If you cannot yet form a sentence, LangX will not teach you how. +- **No spoken lessons or drills.** Echo's free phrase packs are read aloud and reviewed on a schedule, but if you cannot yet form a sentence, LangX will not teach you how. - **No live calls,** only voice messages. - **Humans are not instant.** Your partner has a life and a time zone, and a smaller community means fewer people for some language pairs. diff --git a/src/routes/(blog-article)/social-alternative-to-duolingo/+page.md b/src/routes/(blog-article)/social-alternative-to-duolingo/+page.md index dc6c9171..e5d27db7 100644 --- a/src/routes/(blog-article)/social-alternative-to-duolingo/+page.md +++ b/src/routes/(blog-article)/social-alternative-to-duolingo/+page.md @@ -99,13 +99,13 @@ If the game side is what you love about Duolingo, it is here too: The difference from Duolingo is what earns the points. On LangX you climb by talking to people and helping them learn your language. -LangX is not a course. There is no lesson path, grammar unit or placement test. It works best once you can write a few simple sentences, which is roughly where Duolingo gets you. +LangX is not a course. There is no lesson path, grammar unit or placement test — Echo, its free spaced-repetition tab, gives you phrase packs to review, not lessons. It works best once you can write a few simple sentences, which is roughly where Duolingo gets you. ## Duolingo vs LangX at a glance | | Duolingo | LangX | @@ -117,7 +117,7 @@ The difference from Duolingo is what earns the points. On LangX you climb by tal | Feedback | Automatic, against model answers | Corrections from native speakers, unlimited on every plan | | Speaking | Speaking exercises; AI Video Call and Roleplay on paid plans | Voice notes, read-aloud; no live calls | | Streaks and games | Streaks, XP, leagues, gems | Streaks, tokens, weekly/monthly/yearly/all-time leaderboards | -| Structured lessons | Yes | No | +| Structured lessons | Yes | No lesson path; Echo has free phrase packs to review | | Free plan | Yes, every course | Yes: unlimited replies and corrections, 5 new conversations a day, 20 translations a day | | No ads | No (Super removes them) | Yes | | Open source | No | Yes (BSD-3) | From 40f1c16230938bc5071d2be1ea4ced5f9abd5325 Mon Sep 17 00:00:00 2001 From: xue Date: Wed, 23 Sep 2026 15:19:52 -0400 Subject: [PATCH 3/3] /pro becomes /plans, simpler, with the app's own paywall beside the ask The plans page moves to the address the header link already said. Every link on the site follows (the header, the footer, the FAQ, the welcome-back page and fifty-odd posts), and static/_redirects sends /pro and /pro/ to /plans with a 301, since the old path was published everywhere. The page itself is rebuilt on the compare page's grammar: the ask beside the paywall replica, the four things every plan keeps between two hairlines, three cards that show five lines each instead of eleven (`highlights` in plans.ts, a subset of the record), the limits as bars in the plans' three colours (`limits` in plans.ts), the questions people ask before they pay with FAQPage data, and the closing call. It ships the client now, like the other pages, so the questions open and the header steps back while the page's yellow is on screen. Pricing.svelte and PlanUsageCard.svelte had no other reader and are gone. Co-Authored-By: Claude Fable 5.1 --- DESIGN.md | 2 +- src/lib/components/atoms/Seo.svelte | 2 +- src/lib/components/organisms/Footer.svelte | 2 +- src/lib/components/organisms/Header.svelte | 2 +- .../components/organisms/WelcomeBack.svelte | 2 +- src/lib/components/phone/PaywallScreen.svelte | 2 +- src/lib/data/faq.ts | 4 +- src/lib/data/features.ts | 2 +- src/lib/data/plans.ts | 46 ++ .../+page.md | 2 +- .../+page.md | 2 +- .../+page.md | 2 +- .../+page.md | 2 +- .../+page.md | 2 +- .../+page.md | 2 +- .../+page.md | 2 +- .../+page.md | 2 +- .../+page.md | 2 +- .../+page.md | 2 +- .../+page.md | 2 +- .../+page.md | 2 +- .../best-language-exchange-apps-2027/+page.md | 2 +- .../+page.md | 2 +- .../best-language-exchange-apps/+page.md | 2 +- .../best-language-learning-apps/+page.md | 2 +- .../+page.md | 2 +- .../+page.md | 2 +- .../+page.md | 2 +- .../free-language-exchange-apps/+page.md | 2 +- .../free-language-learning-apps/+page.md | 2 +- .../(blog-article)/is-hellotalk-free/+page.md | 2 +- .../(blog-article)/is-tandem-free/+page.md | 2 +- .../langx-v2-what-changes-and-why/+page.md | 2 +- .../+page.md | 2 +- .../+page.md | 2 +- .../open-source-alternative-to-busuu/+page.md | 2 +- .../+page.md | 2 +- .../+page.md | 2 +- .../+page.md | 2 +- .../+page.md | 2 +- .../+page.md | 2 +- .../+page.md | 2 +- .../+page.md | 2 +- .../+page.md | 2 +- .../+page.md | 2 +- .../+page.md | 2 +- .../+page.md | 2 +- .../open-source-alternative-to-speak/+page.md | 2 +- .../+page.md | 2 +- .../+page.md | 2 +- .../+page.md | 2 +- .../social-alternative-to-duolingo/+page.md | 2 +- .../social-language-learning-apps/+page.md | 2 +- .../+page.md | 2 +- .../what-is-a-language-exchange/+page.md | 2 +- src/routes/plans/+layout.svelte | 2 +- src/routes/plans/+page.svelte | 626 +++++++++++++++++- src/routes/plans/+page.ts | 7 +- static/_redirects | 5 + 59 files changed, 711 insertions(+), 85 deletions(-) diff --git a/DESIGN.md b/DESIGN.md index 54b92181..6c2ecdcc 100644 --- a/DESIGN.md +++ b/DESIGN.md @@ -464,7 +464,7 @@ Hairline rows in a 76ch column; the 1.0625rem 600 question turns blue on hover; - **Don't** use blue for anything that is not interactive, except the lowercase chapter heading beside a phone; never use green for anything that is not a correction or success, or orange for anything but streaks and stars. - **Don't** put a second yellow button in a viewport; the companion is the outlined pill, and the dark pill belongs to the header and the send button. -- **Don't** put token arithmetic, plan tables or feature lists on the homepage; the mechanism is shown in the phones and the plans live on `/pro`. +- **Don't** put token arithmetic, plan tables or feature lists on the homepage; the mechanism is shown in the phones and the plans live on `/plans`. - **Don't** use Nunito for running text or in inputs, or reach for a Nunito weight lighter than 700. - **Don't** use the browser's default focus ring; the ring is 2px blue with a 2px offset and 8px radius. - **Don't** borrow the legacy orange (`--color--secondary`) or `#ffd400` on redesigned surfaces; they remain only so blog callouts keep a value. diff --git a/src/lib/components/atoms/Seo.svelte b/src/lib/components/atoms/Seo.svelte index 83ef7a37..6c51d7fa 100644 --- a/src/lib/components/atoms/Seo.svelte +++ b/src/lib/components/atoms/Seo.svelte @@ -13,7 +13,7 @@ /** Page title. Suffixed with the brand unless it is long, and never on the homepage. */ export let title: string | null = null; export let description: string = defaultDescription; - /** Path, not a full URL — e.g. `/pro`. */ + /** Path, not a full URL — e.g. `/plans`. */ export let path: string = ''; /** Kept out of the index, for pages like the 404 that must not rank. */ export let noindex = false; diff --git a/src/lib/components/organisms/Footer.svelte b/src/lib/components/organisms/Footer.svelte index e6adad5c..572ff07a 100644 --- a/src/lib/components/organisms/Footer.svelte +++ b/src/lib/components/organisms/Footer.svelte @@ -14,7 +14,7 @@ { title: 'Product', links: [ - { label: 'Plans', href: '/pro' }, + { label: 'Plans', href: '/plans' }, { label: 'Tokens', href: '/tokens' }, { label: 'LangX Token', href: 'https://token.langx.io' }, { label: 'Coming from v1?', href: '/welcome-back' }, diff --git a/src/lib/components/organisms/Header.svelte b/src/lib/components/organisms/Header.svelte index c761ba49..11a2ecb9 100644 --- a/src/lib/components/organisms/Header.svelte +++ b/src/lib/components/organisms/Header.svelte @@ -9,7 +9,7 @@ // footer because they are most of what arrives from search. const links = [ { href: '/#features', label: 'Features', wide: true }, - { href: '/pro', label: 'Plans' }, + { href: '/plans', label: 'Plans' }, { href: '/compare', label: 'Compare' }, { href: '/tools', label: 'Tools' }, { href: '/blog', label: 'Blog' }, diff --git a/src/lib/components/organisms/WelcomeBack.svelte b/src/lib/components/organisms/WelcomeBack.svelte index b3ed7b16..bbbeced6 100644 --- a/src/lib/components/organisms/WelcomeBack.svelte +++ b/src/lib/components/organisms/WelcomeBack.svelte @@ -86,7 +86,7 @@ >replying to every message you get is unlimited, and so is writing corrections, on every plan. The free plan limits how many conversations you can open, never how much you can talk. - The full comparison is here. + The full comparison is here.

diff --git a/src/lib/components/phone/PaywallScreen.svelte b/src/lib/components/phone/PaywallScreen.svelte index 6857a07b..b2a014e8 100644 --- a/src/lib/components/phone/PaywallScreen.svelte +++ b/src/lib/components/phone/PaywallScreen.svelte @@ -5,7 +5,7 @@ /** * `app/(app)/paywall` from the design handoff, on the Fluent tab. The * benefits are the real ones from `$lib/data/plans.ts`. Where the app puts - * a price, this replica puts nothing: /pro says prices are shown in the + * a price, this replica puts nothing: /plans says prices are shown in the * app, and a number here would contradict the page it sits on. */ const features = [ diff --git a/src/lib/data/faq.ts b/src/lib/data/faq.ts index a4f81722..f414e35e 100644 --- a/src/lib/data/faq.ts +++ b/src/lib/data/faq.ts @@ -13,7 +13,7 @@ export const faqObjects: FaqObject[] = [ { id: 1, title: 'Is LangX free?', - content: `Yes. Replying to messages and correcting people are unlimited for everyone. On the free plan you can start 5 new chats and use 20 translations a day. Fluent and Polyglot remove those limits and add a few extras.` + content: `Yes. Replying to messages and correcting people are unlimited for everyone. On the free plan you can start 5 new chats and use 20 translations a day. Fluent and Polyglot remove those limits and add a few extras.` }, { id: 2, @@ -43,7 +43,7 @@ export const faqObjects: FaqObject[] = [ { id: 5, title: 'What is LangX Copilot?', - content: `Private AI feedback on your own messages while you chat with a real person. Only you see it. It isn't in the app yet; it's coming later, for Polyglot.` + content: `Private AI feedback on your own messages while you chat with a real person. Only you see it. It isn't in the app yet; it's coming later, for Polyglot.` }, { id: 6, diff --git a/src/lib/data/features.ts b/src/lib/data/features.ts index 0de1d638..f889cf78 100644 --- a/src/lib/data/features.ts +++ b/src/lib/data/features.ts @@ -7,7 +7,7 @@ import type { Feature } from '$lib/utils/types'; // // Matching, corrections and streaks are demonstrated with live screens higher // up the homepage, so they are not repeated here. Keep each line short and -// plain; the details live on /pro and in the FAQ. +// plain; the details live on /plans and in the FAQ. // // NOTE: `image` still points at v1 screenshots in `static/images/features/`. // Nothing renders them any more. diff --git a/src/lib/data/plans.ts b/src/lib/data/plans.ts index 97aca1de..96b8192a 100644 --- a/src/lib/data/plans.ts +++ b/src/lib/data/plans.ts @@ -25,6 +25,12 @@ export type Plan = { /** `pro` and `pro-plus` tint the card the way the app tints the tier. */ tone?: 'pro' | 'pro-plus'; points: PlanPoint[]; + /** + * The four or five lines the card on /plans shows: the pitch, not the + * record. Every one restates a point above (or, for Free, Echo — see + * echo.ts), so the long list stays the only place a limit is defined. + */ + highlights: PlanPoint[]; }; export const plans: Plan[] = [ @@ -52,6 +58,13 @@ export const plans: Plan[] = [ { label: '1 language you are learning, 1 you speak natively' }, { label: 'Filters: country, age and level' }, { label: '5 photos on your profile' } + ], + highlights: [ + { label: 'Unlimited replies and corrections' }, + { label: '5 new conversations a day' }, + { label: '20 translations a day' }, + { label: 'Echo packs to learn from, free' }, + { label: 'No ads' } ] }, { @@ -73,6 +86,13 @@ export const plans: Plan[] = [ label: 'Boosted profile', note: 'A Boosted strip above the Discover list, shown to everyone whose languages match yours. On by default; switch it off in Settings.' } + ], + highlights: [ + { label: 'Unlimited new conversations' }, + { label: '300 translations a day' }, + { label: '2 languages you learn, 2 you speak' }, + { label: 'Gender and city filters' }, + { label: 'Boosted profile' } ] }, { @@ -107,10 +127,36 @@ export const plans: Plan[] = [ note: 'Private AI feedback while you practise.', pending: true } + ], + highlights: [ + { label: '1000 translations a day' }, + { label: '5 languages you learn, 5 you speak' }, + { label: 'Who viewed you, incognito, Nearby' }, + { label: 'Write in your language, send in theirs' }, + { label: 'LangX Copilot', pending: true } ] } ]; +/** + * The metered things, one row each, for the bars on /plans: the same numbers + * as the lists above, in the order Free, Fluent, Polyglot. `null` is + * unlimited; `shown` is the label when the number alone would mislead. + */ +export type LimitRow = { + label: string; + values: [number | null, number | null, number | null]; + shown?: [string, string, string]; +}; + +export const limits: LimitRow[] = [ + { label: 'New conversations a day', values: [5, null, null] }, + { label: 'Translations a day', values: [20, 300, 1000] }, + { label: 'Chat messages read aloud a day', values: [15, 100, 250] }, + { label: 'Echo cards read aloud a day', values: [10, 50, 100] }, + { label: 'Languages, learning + native', values: [2, 4, 10], shown: ['1 + 1', '2 + 2', '5 + 5'] } +]; + /** The three lines worth keeping under the plans. Everything else was noise. */ export const planNotes = [ 'The free plan’s daily caps run over a rolling 24 hours, not a calendar day.', diff --git a/src/routes/(blog-article)/best-apps-to-practice-arabic-with-native-speakers/+page.md b/src/routes/(blog-article)/best-apps-to-practice-arabic-with-native-speakers/+page.md index f656d1e5..4040c619 100644 --- a/src/routes/(blog-article)/best-apps-to-practice-arabic-with-native-speakers/+page.md +++ b/src/routes/(blog-article)/best-apps-to-practice-arabic-with-native-speakers/+page.md @@ -132,7 +132,7 @@ Compare: [LangX vs Tandem](/open-source-alternative-to-tandem), or read [Tandem Our app. [LangX](https://get.langx.io) matches in both directions: set Arabic as the language you are learning and you see Arabic speakers who are learning a language you speak. The country filter is on every plan, including Free, so you can look for partners in Egypt, Lebanon or Morocco. Your partner can hold any message to correct it, and corrections are **unlimited on every plan**. Translation is inside the chat (20 a day on Free). - **Best for:** careful written practice in Arabic script, with no ads. -- **Keep in mind:** ask about dialect in your first message, since a country filter only tells you where someone lives. The community is far smaller than HelloTalk's or Tandem's, and there are **no live calls**, only text, voice, photo and video messages. Free allows 5 new conversations a day; replies are unlimited. See [plans](/pro). +- **Keep in mind:** ask about dialect in your first message, since a country filter only tells you where someone lives. The community is far smaller than HelloTalk's or Tandem's, and there are **no live calls**, only text, voice, photo and video messages. Free allows 5 new conversations a day; replies are unlimited. See [plans](/plans). -On LangX, a partner corrects you by holding the message and writing the fix, and corrections and replies are unlimited on every plan, including Free. The honest limits: the community is smaller than the biggest exchange apps, the Free plan starts 5 new conversations a day, and there are no live calls; you practice with text, voice, photo and video messages. Details are on the [plans page](/pro). +On LangX, a partner corrects you by holding the message and writing the fix, and corrections and replies are unlimited on every plan, including Free. The honest limits: the community is smaller than the biggest exchange apps, the Free plan starts 5 new conversations a day, and there are no live calls; you practice with text, voice, photo and video messages. Details are on the [plans page](/plans). -LangX is our own app, so weigh this accordingly. Its free plan has **no ads**, **unlimited replies and unlimited corrections** (you hold any message to correct it), 20 translations a day and 5 new conversations a day. Its limits are real: 5 new conversations is fewer than HelloTalk's 10, there are **no live calls** (you practice with text plus voice, photo and video messages), there is nothing like Moments' reach or Voicerooms, and the community is far smaller. The code is open source, which is the main reason people compare it with HelloTalk; [LangX vs HelloTalk](/open-source-alternative-to-hellotalk) covers the full picture, and the [plans page](/pro) lists every limit. +LangX is our own app, so weigh this accordingly. Its free plan has **no ads**, **unlimited replies and unlimited corrections** (you hold any message to correct it), 20 translations a day and 5 new conversations a day. Its limits are real: 5 new conversations is fewer than HelloTalk's 10, there are **no live calls** (you practice with text plus voice, photo and video messages), there is nothing like Moments' reach or Voicerooms, and the community is far smaller. The code is open source, which is the main reason people compare it with HelloTalk; [LangX vs HelloTalk](/open-source-alternative-to-hellotalk) covers the full picture, and the [plans page](/plans) lists every limit. Choosing between the big apps? Tandem vs HelloTalk compares the two side by side, and our best language exchange apps roundup covers the rest. Every LangX comparison is on the compare page. diff --git a/src/routes/(blog-article)/is-tandem-free/+page.md b/src/routes/(blog-article)/is-tandem-free/+page.md index 901d54ee..6c0f953b 100644 --- a/src/routes/(blog-article)/is-tandem-free/+page.md +++ b/src/routes/(blog-article)/is-tandem-free/+page.md @@ -122,7 +122,7 @@ If Tandem's translation cap, ads or application wait put you off, our roundup of text="On LangX you hold any message to correct it, and corrections are unlimited on every plan, including Free. There are no ads and no application wait." /> -LangX is our own app, so take this as a disclosure rather than a verdict. Its free plan has **no ads**, **unlimited replies and unlimited corrections** (hold any message to correct it), **20 translations a day** and 5 new conversations a day, and there is no application wait. The trade-offs are real: 5 new conversations is fewer than Tandem's 10, there are **no live calls or group rooms** (you practice with text plus voice, photo and video messages), and the community is much smaller. The app's code is open source; [LangX vs Tandem](/open-source-alternative-to-tandem) covers the full comparison, and the [plans page](/pro) lists every limit. +LangX is our own app, so take this as a disclosure rather than a verdict. Its free plan has **no ads**, **unlimited replies and unlimited corrections** (hold any message to correct it), **20 translations a day** and 5 new conversations a day, and there is no application wait. The trade-offs are real: 5 new conversations is fewer than Tandem's 10, there are **no live calls or group rooms** (you practice with text plus voice, photo and video messages), and the community is much smaller. The app's code is open source; [LangX vs Tandem](/open-source-alternative-to-tandem) covers the full comparison, and the [plans page](/plans) lists every limit. Still deciding? The best language exchange apps roundup compares the main options, and every LangX comparison is on the compare page. diff --git a/src/routes/(blog-article)/langx-v2-what-changes-and-why/+page.md b/src/routes/(blog-article)/langx-v2-what-changes-and-why/+page.md index 6c97a2d3..7a3470aa 100644 --- a/src/routes/(blog-article)/langx-v2-what-changes-and-why/+page.md +++ b/src/routes/(blog-article)/langx-v2-what-changes-and-why/+page.md @@ -110,7 +110,7 @@ stays open source under BSD-3, and you can host your own instance. > section 2.4 of the [privacy policy](/privacy-policy) says what is in one. > This website is not recorded. -The full comparison is on the [plans page](/pro). +The full comparison is on the [plans page](/plans). ## The second: LangX Token is not what the litepaper described diff --git a/src/routes/(blog-article)/open-source-alternative-to-babbel/+page.md b/src/routes/(blog-article)/open-source-alternative-to-babbel/+page.md index fab39781..4fe8420d 100644 --- a/src/routes/(blog-article)/open-source-alternative-to-babbel/+page.md +++ b/src/routes/(blog-article)/open-source-alternative-to-babbel/+page.md @@ -159,7 +159,7 @@ Babbel teaches 14 languages. LangX lists 182, so if your target language is not ### Open source and a free plan that stays free -The LangX app and API are public on [GitHub](https://github.com/langx/langx) under the BSD-3 license and can be self-hosted. Babbel is closed source. LangX Free is a real plan, not a sample: unlimited text messages, unlimited replies and corrections, 5 new conversations and 20 translations per rolling 24 hours. See the [plans page](/pro) for what Fluent and Polyglot add. +The LangX app and API are public on [GitHub](https://github.com/langx/langx) under the BSD-3 license and can be self-hosted. Babbel is closed source. LangX Free is a real plan, not a sample: unlimited text messages, unlimited replies and corrections, 5 new conversations and 20 translations per rolling 24 hours. See the [plans page](/plans) for what Fluent and Polyglot add. ### No ads diff --git a/src/routes/(blog-article)/open-source-alternative-to-bilingua/+page.md b/src/routes/(blog-article)/open-source-alternative-to-bilingua/+page.md index 00319517..f9d74bc9 100644 --- a/src/routes/(blog-article)/open-source-alternative-to-bilingua/+page.md +++ b/src/routes/(blog-article)/open-source-alternative-to-bilingua/+page.md @@ -168,7 +168,7 @@ This is the biggest lesson from Bilingua. When a closed app shuts down, it is go - **No live calls** on LangX, only voice messages. - **No conversation bot.** LangX Copilot, private AI feedback on your own messages, is coming later for Polyglot, but it is not available yet. - **A smaller community** than the biggest exchange apps, so some language pairs have fewer people. -- **The free plan caps new conversations** at 5 per rolling 24 hours. Replies and corrections are never capped. The [plans page](/pro) has the details. +- **The free plan caps new conversations** at 5 per rolling 24 hours. Replies and corrections are never capped. The [plans page](/plans) has the details. ## Who should pick which? diff --git a/src/routes/(blog-article)/open-source-alternative-to-busuu/+page.md b/src/routes/(blog-article)/open-source-alternative-to-busuu/+page.md index 0e9c35b5..8eab9d5c 100644 --- a/src/routes/(blog-article)/open-source-alternative-to-busuu/+page.md +++ b/src/routes/(blog-article)/open-source-alternative-to-busuu/+page.md @@ -160,7 +160,7 @@ LangX's app and API are open source under BSD-3 on [GitHub](https://github.com/l - **No grammar explanations and no curriculum.** Echo's free phrase packs give you something to review, but if you need to be taught the basics, a course does that better. - **No live calls,** only voice messages. - **A smaller community,** so some language pairs have fewer people. -- **The free plan caps new conversations** at 5 per rolling 24 hours (replies and corrections are never capped). The [plans page](/pro) has details. +- **The free plan caps new conversations** at 5 per rolling 24 hours (replies and corrections are never capped). The [plans page](/plans) has details. ## Who should pick which? diff --git a/src/routes/(blog-article)/open-source-alternative-to-cambly/+page.md b/src/routes/(blog-article)/open-source-alternative-to-cambly/+page.md index 9d30dc65..a2950be5 100644 --- a/src/routes/(blog-article)/open-source-alternative-to-cambly/+page.md +++ b/src/routes/(blog-article)/open-source-alternative-to-cambly/+page.md @@ -165,7 +165,7 @@ LangX shows no ads and uses no advertising identifiers. It does have product ana ## Is LangX a free Cambly alternative? -For practice, yes; for lessons, no. LangX Free includes unlimited text messages, unlimited replies and corrections, 5 new conversations a day and 20 translations a day, with no ads. Fluent and Polyglot add unlimited new conversations, more translations and more languages; see the [plans page](/pro). Prices are set per region and shown in the app. What you do not get on any plan is a tutor. +For practice, yes; for lessons, no. LangX Free includes unlimited text messages, unlimited replies and corrections, 5 new conversations a day and 20 translations a day, with no ads. Fluent and Polyglot add unlimited new conversations, more translations and more languages; see the [plans page](/plans). Prices are set per region and shown in the app. What you do not get on any plan is a tutor. diff --git a/src/routes/plans/+page.svelte b/src/routes/plans/+page.svelte index f6f1bb89..3084109f 100644 --- a/src/routes/plans/+page.svelte +++ b/src/routes/plans/+page.svelte @@ -1,46 +1,622 @@ + + +
-
- -
- +
+
+ Plans +

Free is a real plan. Paying lifts the limits.

+

+ Replying and correcting are unlimited on every plan. Fluent and Polyglot lift the other + limits — prices are set per region and shown in the app. +

+
+ + +
+

Monthly or yearly, with a free trial, bought inside the app.

+
+
+ + +
-
- +
+ +
+ {#each always as f} +
+ +
{f.value}
+
{f.label}
+
+ {/each} +
+ +
+
+ Three plans +

Each one lists only what is new

+

Polyglot has everything in Fluent, and Fluent has everything in Free.

+
+
+ {#each plans as plan, i} +
+ +

{plan.name}

+

{plan.tagline}

+
    + {#each plan.highlights as point} +
  • + + {point.label}{#if point.pending} + Coming soon{/if} +
  • + {/each} +
+
+ {/each} +
+
+ +
+
+ The numbers +

The limits, side by side

+

A rolling 24 hours, not a calendar day. Only translation has a real per-request cost.

+
+
    + {#each plans as plan, i} +
  • + {/each} +
+
    + {#each limits as row, r} +
  • + {row.label} + +
  • + {/each} +
+

{planNotes.join(' ')}

+
+ + + + diff --git a/src/routes/plans/+page.ts b/src/routes/plans/+page.ts index 1365c6c6..61b9ea05 100644 --- a/src/routes/plans/+page.ts +++ b/src/routes/plans/+page.ts @@ -1,5 +1,4 @@ -import { dev } from '$app/environment'; - -// No dynamic data on this page, so it prerenders to a static asset. -export const csr = dev; +// No dynamic data on this page, so it prerenders to a static asset. It +// ships the client too, since the redesign: the questions open, the bars grow +// and the header steps back while the page's own yellow is on screen. export const prerender = true; diff --git a/static/_redirects b/static/_redirects index 263914dc..3ff95dca 100644 --- a/static/_redirects +++ b/static/_redirects @@ -17,3 +17,8 @@ /customization/ /blog 301 /blog-posts /blog 301 /blog-posts/ /blog 301 + +# The plans page moved from /pro to /plans on 23 September 2026: the old path +# was published everywhere, so it lands on the new one rather than a 404. +/pro /plans 301 +/pro/ /plans 301
Language exchangeYesYesNoneYes (BSD-3)Practice that teaches, without ads{LANGX.kind}{LANGX.bestFor}
{KIND_LABEL[c.kind]}{PEOPLE[c.people].text}{FREE[c.freePlan].text}{ADS[c.ads].text}{c.openSource ? 'Yes' : 'No'} + + {c.bestFor}