📣 Announcement
langx.io v2 is the site for LangX v2: rewritten from the ground up for the new app, with a new design, free language tools, and a blog that answers what learners actually search for.
🎨 A new site
- Redesign. The whole story is told on an actual phone screen: the chat, corrections, translation, Discover and the welcome-back flow for v1 members. It's drawn from the app's own design handoff and appears on every route.
- Plans and tokens told straight. Free, Pro and Pro+ are mirrored from the app's
PLAN_LIMITS, and the token earning table fromTOKEN_RULES. The token now has its own page, linking out to token.langx.io. - Comparisons.
/compareputs LangX next to HelloTalk, Tandem, Duolingo and others. Every ads claim is checked against each app's store listing. - Legal pages updated for v2: the minimum age is 16, analytics and screen recording are disclosed, and the rules for deleted accounts and suspensions are spelled out.
🧰 Free language tools
- Most common words in 53 languages, with English meanings. Search across every language at once, download any slice as CSV or text, and see example sentences.
- Say it in any language: 976 everyday words, each shown across every language that has a common word for it.
- Hear the words. A speaker button sits on every tool that shows a word: the word lists, search, similar words, the meaning quiz, the vocabulary test, and the games once they're answered. It covers the top 5,000 words of 29 languages (138k readings) in the same Kokoro and Piper voices the app uses. The readings are synthesised offline and served from a release asset.
- IPA beside every word: the pronunciation is written out as well as spoken.
- Games and tests: a daily word game, guess the language, a meaning quiz, a vocabulary-size test, words two languages share, and alphabet charts.
✍️ Blog and SEO
- Dozens of new guides and word hubs, with charts, app screens and step-by-step visuals in every post.
- Structured data, a cleaner sitemap, IndexNow after each deploy, and a weekly Search Console rankings report.
🔧 Under the hood
- Deploys go through
wrangler-action, sincecloudflare/pages-actionwas deleted, and the whole Cloudflare zone is purged after each deploy. - Page views are counted without storing anything on the visitor, and are proxied through langx.io.
- Dependencies were bumped, and the workflows now run on current Node.
What's Changed
- Made powered by / verified by companie's icons on home page change color to the brand color when hovered by @Honzoraptor31415 in #93
- Updated author names and links in the following blog posts. by @Caluryth in #112
- Rewrite the site for the v2 launch by @xuelink in #113
- Unbreak the website PR check by @xuelink in #115
- Put Pro+ on the site by @xuelink in #114
- Move the workflows off actions that run on a forced Node by @xuelink in #116
- Make /pro three lists instead of a grid by @xuelink in #117
- Mirror the day-repair sink from the app by @xuelink in #118
- Say that we keep a date of birth and where the country comes from by @xuelink in #119
- Rename the plans, and stop the site claiming what the app no longer does by @xuelink in #120
- Say that the email address outlives the deleted account by @xuelink in #121
- Add the pronunciation award to the earning table by @xuelink in #122
- chore(deps-dev): bump prismjs from 1.29.0 to 1.30.0 by @dependabot[bot] in #107
- chore(deps): bump tar-fs by @dependabot[bot] in #109
- chore(deps-dev): bump vite from 4.5.3 to 4.5.12 by @dependabot[bot] in #111
- chore(deps-dev): bump brace-expansion from 1.1.11 to 1.1.18 by @dependabot[bot] in #123
- chore(deps-dev): bump postcss from 8.4.31 to 8.5.26 by @dependabot[bot] in #124
- chore(deps-dev): bump nanoid from 3.3.6 to 3.3.18 by @dependabot[bot] in #126
- chore(deps): bump js-yaml and svelte-sitemap by @dependabot[bot] in #125
- chore(deps-dev): bump immutable from 4.3.4 to 4.3.9 by @dependabot[bot] in #129
- Say how notifications are actually switched off by @xuelink in #131
- Subscribe through v2's API, which is taking over api.langx.io by @xuelink in #132
- Redesign: one story, told on a phone by @xuelink in #130
- Set the logo wordmark in Nunito by @xuelink in #133
- Terms and Privacy: minimum age is 16, not 18 by @xuelink in #134
- Video in the copy, and say what the attachment limit counts by @xuelink in #135
- Add /tools/most-common-words: frequency word lists for 53 languages by @xuelink in #136
- Canonicalise the tools pages without a trailing slash by @xuelink in #137
- Rebuild the tools pages: cross-language search, figures, per-language downloads by @xuelink in #138
- Download any slice of a word list, as CSV or text by @xuelink in #139
- Purge the whole zone on deploy, not a hand-written list by @xuelink in #140
- Tools: four more, and finish the first by @xuelink in #141
- Tools in the footer, and an open-source section on the homepage by @xuelink in #142
- Say that the app has analytics, because it does by @xuelink in #143
- Three shareable games by @xuelink in #144
- Put a globe in the hero instead of the phone by @xuelink in #145
- Rebuild the landing page from the Claude Design handoff by @xuelink in #146
- Second chat card, and the redesign on every route by @xuelink in #147
- Show the plans and welcome-back cards on pages that ship no JS by @xuelink in #148
- Put the app on the homepage, drawn from its own design handoff by @xuelink in #149
- Put the welcome-back screen on the page that explains it by @xuelink in #150
- Two Polyglot features the pricing page never listed by @xuelink in #151
- Give the tokens their own page by @xuelink in #152
- Send readers on to token.langx.io for the detail by @xuelink in #153
- Give the token a section on the homepage, pointing outward by @xuelink in #154
- A message earns 1 token, not 2 by @xuelink in #155
- Offer the write-up before the rules, not after them by @xuelink in #156
- Stop the token.langx.io button drifting off to the right by @xuelink in #157
- Mirror the caps that moved with the message rate by @xuelink in #159
- Free gallery is 5 photos, Fluent 10 by @xuelink in #158
- Sticker packs are the fourth thing tokens buy by @xuelink in #160
- Count page views, and store nothing on the visitor to do it by @xuelink in #161
- Start analytics on mount, because a prerendered page never re-runs load by @xuelink in #162
- Name the Cloudflare analytics that was already there by @xuelink in #163
- Send page views through langx.io, because blockers drop PostHog's host by @xuelink in #164
- The v1 return story: welcome-back copy, and the launch email's images by @xuelink in #166
- Boosted profiles on the plans, and a real suspension clause by @xuelink in #167
- Discover: the boosted strip on the phone screen by @xuelink in #168
- Count the page a visitor actually arrives on by @xuelink in #169
- Draw the social card instead of screenshotting the page by @xuelink in #170
- Drop the unreferenced pre-redesign screenshot by @xuelink in #171
- Drop the three badge images the redesign replaced by @xuelink in #172
- Say that the app records the screen, before the build that does it by @xuelink in #173
- Halve the daily pool to 5,000 tokens by @xuelink in #174
- Pricing: Echo cards read aloud a day, per plan by @xuelink in #175
- Plans: chat messages read aloud by @xuelink in #177
- SEO: lighter blog pages, 404 out of the sitemap, word-game and quiz titles by @xuelink in #179
- Echo, invites and three sticker packs on /tokens, and a post on why teaching pays by @xuelink in #180
- trailingSlash: 'never', set where SvelteKit reads it by @xuelink in #181
- SEO: structured data, competitor comparisons and new guides by @xuelink in #178
- Blog index: send only the card fields by @xuelink in #182
- More SEO content: Korean, beginners, more languages, basic words, learning guides by @xuelink in #183
- Say pages: hear each word read aloud by @xuelink in #184
- Deploy: replace the deleted cloudflare/pages-action with wrangler-action by @xuelink in #185
- Weekly Search Console rankings report by @xuelink in #187
- Blog: visuals in every post (charts, app screens, takeaways, step paths) by @xuelink in #186
- Say pages: right answer lines, an "in other languages" heading, popular words from search data by @xuelink in #189
- Blog: 11 new posts with visuals, v2 cover, truly-scaled bar charts by @xuelink in #188
- IndexNow after each deploy; rankings report tracks the new pages by @xuelink in #190
- Rankings report: twelve-week trend charts by @xuelink in #191
- Posts, /compare and say pages: something to look at, not only text by @xuelink in #192
- Blog: fantasy, strong and space word hubs by @xuelink in #193
- Posts: keep post styles out of the phone replicas by @xuelink in #194
- App Store icons in comparisons; six alphabet guides; animal and color hubs by @xuelink in #195
- /compare: an Ads column, checked against each app's store listing by @xuelink in #196
- Blog lists: a picture for every post; "No ads" on the free apps table by @xuelink in #197
- Speaker buttons on every tool that shows a word by @xuelink in #198
- One-to-one posts: the Ads row becomes "No ads", as on /compare by @xuelink in #199
- Ads claims across the site, checked against competitors.ts by @xuelink in #200
- Six more alphabet guides, body and everyday word hubs, guides on /tools/alphabet by @xuelink in #201
- Writing guide: ads rules per app, "No ads" table row by @xuelink in #202
- Deploy: the complete word readings by @xuelink in #203
- Say pages: the word tiles fill their rows and keep long words whole by @xuelink in #204
- v2: README, version and the site preview by @xuelink in #206
- Alphabet charts: corrected sounds and names, guides updated to match by @xuelink in #205
- Tools: IPA pronunciation beside every word by @xuelink in #207
Full Changelog: v0.2.10...v2.0.0
