diff --git a/CHANGELOG.md b/CHANGELOG.md index 04d6f01..e725dea 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,19 @@ numbers below were the site's earlier, hand-kept numbering and are retired; the ### Added +- **Mukoko Lingo has its own page, `/mukoko-lingo`.** Mukoko Lingo is a + partner app developed by Nyuchi Learning, part of Mukoko, Africa's super + app. The page says what it does today, who it is for, what schools get + and how to start, in the extension page's style, with the app's own icon. + Every claim is from Lingo's public repository (mukoko-dev/mukoko-lingo: + README.md, app.json, BRANDING.md and the app's own copy). It sits beside + the Toddle Enhancement Extension wherever the extension appears: a second + product card on the home page, "Mukoko Lingo" in the header (where + "Tools" is now "Toddle extension"), and the footer's "Tools" column, now + "Products". It has a SoftwareApplication node in its JSON-LD, Open Graph + tags, a sitemap entry and an entry under Products in llms.txt. + `mukokoLingo` in `src/data/site.ts` holds its links. + `tests/seo.test.ts` checks all of that. - **`npm run clean`, and after every merge.** `scripts/clean.mjs` removes the build output (`dist/`, `.astro/`, `.vercel/output/`), the QA report, the tools' caches, finished Claude Code worktrees and local branches @@ -20,6 +33,27 @@ numbers below were the site's earlier, hand-kept numbering and are retired; the ### Changed +- **Mukoko Lingo, described as it is.** The home page card and llms.txt + said Lingo was "free for personal use", "Shona and Ndebele primary" and + taught French and Portuguese. Its repository says it teaches Shona, + Ndebele, English and Chinese, and that starting is free; the copy now + says that, and links to the live app at lingo.mukoko.com rather than + mukoko.com/lingo. The home page's "three surfaces" are now the two + products and two destinations. +- **0.11.0 is on the Chrome Web Store, and is the current version (#85).** + It is 0.10.0 with a security fix to how licence keys are checked. The + Releases page lists it first, marked on the store, from the extension's + CHANGELOG; the test builds tagged since 0.10.0 (0.10.1 to 0.10.5, 0.11.1 + and 0.11.2) open its notes, and 0.12.0, not released, is not listed. + `extensionVersions.current` is 0.11.0; the new `changedIn` (0.9.0) keeps + "versions before 0.9.0" true where the old licence host and flags key are + named. The product page, the Security page (which now describes the + 0.11.0 fix), the Releases description and llms.txt name 0.11.0. The + anchors for 0.9.6 and 0.9.7 the issue asked for were already there; the + test that every tagged test build has one now covers the 0.10.x and + 0.11.x builds too. +- **`webStore`'s type is a named `Url`**, so Prettier 3.3 and 3.9 format + `src/data/site.ts` the same way; the org lint gate (3.9.4) had flagged it. - **After paying: a claim link, not a key.** The extension page's checkout note now says the licence email carries a one-time link (never the key), that it works once for 72 hours and a new one can be asked for, that diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 9d6a131..29accf8 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -5,18 +5,19 @@ three predictable places. ## What gets changed where -| Change | File | -| ------------------------------------------------------- | ----------------------------------------------------- | -| Nav links, footer columns, legal links, the wordmark | `src/data/site.ts` | -| Links to the extension (store listing, releases, guide) | `src/data/site.ts` (`toddleExtension`) | -| The extension's release notes | `src/data/releases.ts` | -| Facts on the legal pages (versions, prices, contacts) | `src/data/legal.ts` | -| Consent categories and the banner's version | `src/data/consent.ts` | -| The three destination cards | the `surfaces` array in `src/pages/index.astro` | -| Home page copy | `src/pages/index.astro` | -| Extension page copy | `src/pages/toddle-enhancement-extension.astro` | -| Header / footer structure | `src/components/SiteHeader.astro`, `SiteFooter.astro` | -| `
`, metadata, theme bootstrap | `src/layouts/BaseLayout.astro` | +| Change | File | +| ------------------------------------------------------- | ------------------------------------------------------------------- | +| Nav links, footer columns, legal links, the wordmark | `src/data/site.ts` | +| Links to the extension (store listing, releases, guide) | `src/data/site.ts` (`toddleExtension`) | +| The extension's release notes | `src/data/releases.ts` | +| Facts on the legal pages (versions, prices, contacts) | `src/data/legal.ts` | +| Consent categories and the banner's version | `src/data/consent.ts` | +| The destination cards | the `surfaces` array in `src/pages/index.astro` | +| Home page copy | `src/pages/index.astro` | +| Extension page copy | `src/pages/toddle-enhancement-extension.astro` | +| Mukoko Lingo's links / page copy | `src/data/site.ts` (`mukokoLingo`) / `src/pages/mukoko-lingo.astro` | +| Header / footer structure | `src/components/SiteHeader.astro`, `SiteFooter.astro` | +| ``, metadata, theme bootstrap | `src/layouts/BaseLayout.astro` | ## What must not be changed here diff --git a/public/llms.txt b/public/llms.txt index f103ec9..5bbbcf5 100644 --- a/public/llms.txt +++ b/public/llms.txt @@ -1,8 +1,9 @@ # Nyuchi Learning -> learning.nyuchi.com — the Nyuchi Learning surface of Nyuchi Africa. Two -> things live here: signposts to where the learning content moved, and the -> classroom software Nyuchi Web Services builds for schools. +> learning.nyuchi.com — the Nyuchi Learning surface of Nyuchi Africa. It is +> the home of Nyuchi Learning's two products, the Toddle Enhancement +> Extension and Mukoko Lingo, and of signposts to where the learning content +> moved. Nyuchi Africa is a technology company in Zimbabwe building open-source and community-based platforms. Nyuchi Web Services is its development division. @@ -106,8 +107,10 @@ community-based platforms. Nyuchi Web Services is its development division. a copy. Schools deploy it from the Chrome Web Store by extension ID, with a Google Admin console force-install (or Group Policy, Intune or a macOS profile); an organisation key is pasted in once by each teacher, since it - cannot be pushed by policy. Teachers get each minor release (0.9.0 is - the current one) from the Chrome Web Store; versions 0.8.3 to 0.8.13 were + cannot be pushed by policy. Teachers get each minor release (0.11.0 is + the current one: 0.10.0 with a security fix to how licence keys are + checked, so that a cancelled key cannot be made to work again by + writing it differently) from the Chrome Web Store; versions 0.8.3 to 0.8.13 were test builds for schools piloting it, and their changes arrived together in 0.9.0. Release notes for every version, in plain words: @@ -123,6 +126,32 @@ community-based platforms. Nyuchi Web Services is its development division. https://support.nyuchi.com/en/collections/19764027-how-to-use-the-toddle-enhancement-extension Security: https://learning.nyuchi.com/legal/security +- [Mukoko Lingo](https://learning.nyuchi.com/mukoko-lingo): a partner app + developed by Nyuchi Learning, part of Mukoko, Africa's super app. + AI-assisted, skills-based language learning for individuals, schools and + businesses across Africa. Use it in a web browser at + https://lingo.mukoko.com; schools, businesses and admins use the console + at https://lingo.nyuchi.com/console. It teaches Shona, Ndebele, Chinese + and English (Swahili is in the language picker but unfinished, and is not + a supported language). A learner gets five phrases a day, drilled with + flash cards and a short quiz, with spaced repetition scheduling what comes + back and when. Shamwari ("friend" in Shona), the AI tutor, answers + questions in chat and adapts to the learner's measured proficiency rather + than a level they picked; Shamwari never claims to be human. Pronunciation + guides, cultural context, and progress tracking (streaks, XP, bookmarks, + skill proficiency). For schools: teachers create classes, set assignments + against specific phrases and skills, and see progress per student; + assessments are diagnostic, formative and summative, graded on the server; + rosters sync over OneRoster from Clever, ClassLink and PowerSchool; + organisation admins manage users, content, moderation, guardrails, + analytics and API keys. Moderation runs in three layers: rule-based + guardrails, an AI-based check, and prompt-injection detection on anything + a learner types to the tutor. Sign-in is WorkOS AuthKit; the tutor runs on + Cloudflare Workers AI, called from Lingo's servers. Starting is free. + Open source under the MIT licence, (c) Nyuchi Learning: + https://github.com/mukoko-dev/mukoko-lingo. Enquiries: + support@nyuchi.com. + ## Where the learning content went - [Bundu Education](https://bundu.org/education): open, evidence-based K-12 @@ -130,8 +159,6 @@ community-based platforms. Nyuchi Web Services is its development division. - [Nyuchi Learning programmes](https://nyuchi.com/learning): commercial cohort-based and self-paced training in software, AI and digital skills, localised for Africa with offline study packs. -- [Mukoko Lingo](https://mukoko.com/lingo): African language learning, free for - personal use. Shona and Ndebele primary. ## Legal diff --git a/src/assets/lingo/icon.png b/src/assets/lingo/icon.png new file mode 100644 index 0000000..006d0e9 Binary files /dev/null and b/src/assets/lingo/icon.png differ diff --git a/src/data/legal.ts b/src/data/legal.ts index b7fb253..e8b52a2 100644 --- a/src/data/legal.ts +++ b/src/data/legal.ts @@ -114,25 +114,29 @@ export const pricing = [ * (0.9.0, …) is released from the extension's `main` branch and published to * the store. Teachers get minors. * - * `current` is what teachers have from the Chrome Web Store: 0.9.0, published - * on 7 October 2026. `previous` is the store release before it, named only - * where something it did still matters to a teacher updating from it (flags - * it hid stay concealed), said as history. What changed in the test builds - * between the two (0.8.3 carried 0.8.2's code) is said as "versions before - * `current`": the old licence host and the old flags storage key. There is no `next` while no minor is reviewed and waiting for the + * `current` is what teachers have from the Chrome Web Store: 0.11.0, a + * security fix on top of 0.10.0 (published 13 October 2026). `previous` is + * the store release named only where something it did still matters to a + * teacher updating from it (flags 0.8.2 hid stay concealed), said as history. + * `changedIn` is the release that moved the licence host to licenses.nyuchi.com + * and renamed the flags storage key: "versions before `changedIn`" asked the + * old host and used the old key. It stays 0.9.0 when `current` moves. + * There is no `next` while no minor is reviewed and waiting for the * store. When one is, add `next` here, say "from version- The learning content that used to live here is now spread across three surfaces of - the Bundu Family ecosystem. This domain is also where the classroom software we - build for schools lives. + Two products live here: a Chrome extension that makes the Toddle gradebook easier + to read, and Mukoko Lingo, an app for learning African languages. The learning + content that used to live here has moved to the Bundu Family ecosystem.
- +Language learning · Nyuchi Learning, part of Mukoko
++ Learn Shona, Ndebele, English or Chinese, five phrases a day, with Shamwari, an + AI tutor that adapts to your level. Teachers set assignments and see each + student's progress. +
+Where the learning went
The Foundation publishes the open frameworks at Bundu Education. Nyuchi Learning is the commercial vehicle organisations use when they want help implementing them. - Mukoko Lingo is the consumer app for individuals who want to learn a language. Same - content library underneath; different surfaces for different audiences.
tee-settings, a copy of the switches and of which features the
licence allows (not the key, and no email); tee-blur-flags (gbx-hide-flags in versions before {extensionVersions.current}), whether flags are concealed;
+ > in versions before {extensionVersions.changedIn}), whether flags are concealed;
tee-course-view, whether you chose My classes in the
home page filter; and tee-academic-year, the number of the academic year
Toddle is showing. None of it is about a student, and the extension sends none of it
diff --git a/src/pages/legal/data.astro b/src/pages/legal/data.astro
index 329957b..79576bd 100644
--- a/src/pages/legal/data.astro
+++ b/src/pages/legal/data.astro
@@ -201,7 +201,7 @@ const subprocessors = [
And four small values in the browser's storage for Toddle's own site: tee-settings,
a copy of the switches and of which features the licence allows (no key and no
- email); tee-blur-flags (gbx-hide-flags in versions before {extensionVersions.current}), whether flags are concealed; tee-course-view,
+ email); tee-blur-flags (gbx-hide-flags in versions before {extensionVersions.changedIn}), whether flags are concealed; tee-course-view,
whether the teacher chose My classes in the home page
filter; and tee-academic-year, the number of the academic year Toddle
last asked for. No student data is stored.
@@ -246,7 +246,7 @@ const subprocessors = [
A daily check for cancelled keys, only while
a licence is entered: one plain request from the extension's background worker to
https://licenses.nyuchi.com/v1/revocations (versions
- before {extensionVersions.current} asked licences.nyuchi.dev, the
+ before {extensionVersions.changedIn} asked licences.nyuchi.dev, the
same server), sending no licence key, no
identifiers, no cookies and no Toddle data. It downloads a list, signed by Nyuchi, of
the SHA-256 fingerprints of cancelled keys and checks its own key locally. Cloudflare
diff --git a/src/pages/legal/privacy.astro b/src/pages/legal/privacy.astro
index add5ece..94cdaaf 100644
--- a/src/pages/legal/privacy.astro
+++ b/src/pages/legal/privacy.astro
@@ -143,7 +143,7 @@ const description =
https://licenses.nyuchi.com/v1/revocations, from the extension's
- background worker (versions before {extensionVersions.current} asked
+ background worker (versions before {extensionVersions.changedIn} asked
licences.nyuchi.dev, the same server). It carries no licence key, no identifiers, no cookies and no
Toddle data.
https://licenses.nyuchi.com/v1/revocations (versions
- before {extensionVersions.current} asked licences.nyuchi.dev, the
+ before {extensionVersions.changedIn} asked licences.nyuchi.dev, the
same server). It
sends no licence key, no identifiers, no cookies and no Toddle data. It downloads a
list, signed by Nyuchi, of the fingerprints (SHA-256 hashes) of cancelled keys, and
@@ -536,6 +536,17 @@ const severityClass: Record+ Version {security.version}: licence keys. + Two weaknesses in how the extension checked licence keys were fixed in + {security.version}. A cancelled or refunded key could be made to work again by + writing it in a different but equivalent form, which the check for cancelled keys + did not recognise; a key is now accepted only in exactly the form it was issued in. + And because the same signature covers keys and the list of cancelled keys, the + extension now accepts only a licence as a licence. Both concerned whether a licence + is valid; neither touched what the extension reads from Toddle. Every key, as it was + issued, keeps working. +
We publish what was found, not only that it was fixed, because a school deciding
whether to trust software should know.
diff --git a/src/pages/mukoko-lingo.astro b/src/pages/mukoko-lingo.astro
new file mode 100644
index 0000000..761bca3
--- /dev/null
+++ b/src/pages/mukoko-lingo.astro
@@ -0,0 +1,364 @@
+---
+/**
+ * The product page for Mukoko Lingo: a partner app developed by Nyuchi
+ * Learning, part of Mukoko, Africa's super app.
+ *
+ * Built the way the Toddle Enhancement Extension's page is built: a hero with
+ * one call to action, a grid of what it does, a section for schools, and the
+ * plain facts a school's IT lead will ask for.
+ *
+ * Every claim is taken from Lingo's own public repository
+ * (mukoko-dev/mukoko-lingo: README.md, app.json, BRANDING.md, and the app's
+ * own copy in lib/data/translations.ts and app/welcome). Nothing is promised
+ * that the repository does not say: no app store link, no school price and no
+ * language beyond the four it calls canonical. Add them here when they exist.
+ *
+ * The icon is the app's own (assets/images/icon.png in that repository, MIT
+ * licensed). Its PNG wordmarks still read "Nyuchi Lingo", the old name, so
+ * they are not used.
+ */
+import { Image } from "astro:assets";
+import BaseLayout from "../layouts/BaseLayout.astro";
+import { mukokoLingo } from "../data/site";
+import lingoIcon from "../assets/lingo/icon.png";
+
+/* The repository is public, so linking to it is safe (unlike the extension's,
+ which is private and must never be linked). */
+const source = "https://github.com/mukoko-dev/mukoko-lingo";
+const licence = `${source}/blob/main/LICENSE`;
+
+const languageList = "Shona, Ndebele, English and Chinese";
+
+/* What it does today, from the README's "What it is" and the app's own
+ feature list on its welcome page. */
+const features = [
+ {
+ mineral: "cobalt",
+ title: "Five phrases a day",
+ body: "Each day's lesson is five phrases. You practise them with flash cards, then a short quiz.",
+ },
+ {
+ mineral: "tanzanite",
+ title: "Review at the right time",
+ body: "Spaced repetition decides which phrases come back, and when, so earlier phrases keep returning for practice.",
+ },
+ {
+ mineral: "gold",
+ title: "Shamwari, the AI tutor",
+ body: "Ask Shamwari (“friend” in Shona) a question in chat. It adapts to the level the app has measured, not to a level you picked for yourself.",
+ },
+ {
+ mineral: "malachite",
+ title: "Four languages side by side",
+ body: `${languageList}, with phrases compared across them. Pronunciation guides for all four.`,
+ },
+ {
+ mineral: "terracotta",
+ title: "Cultural context",
+ body: "Usage examples, and when a phrase is the right thing to say. Phrases for real situations: greetings, getting around, shopping, emergencies and work.",
+ },
+ {
+ mineral: "sodalite",
+ title: "Progress you can see",
+ body: "Streaks, XP, bookmarks, and how strong you are in each skill, on one dashboard.",
+ },
+];
+
+/* Who it is for: the app's own "Perfect for" list, plus the schools and
+ businesses the README names. */
+const audiences = [
+ {
+ badge: "badge badge-info",
+ label: "For a learner",
+ title: "Learn the language around you",
+ body: "Travellers, people living and working somewhere new, and locals building on a language they already have.",
+ },
+ {
+ badge: "badge badge-success",
+ label: "For a teacher",
+ title: "Set the work, see the progress",
+ body: "Create a class, set assignments against specific phrases and skills, and watch each student's progress.",
+ },
+ {
+ badge: "badge badge-accent",
+ label: "For a school or business",
+ title: "Run it for a whole organisation",
+ body: "Sync rosters from your school's system, and manage users, content, moderation and analytics from one console.",
+ },
+];
+
+const facts = [
+ {
+ label: "Languages",
+ value: `${languageList}. The app's screens are available in the same four. Swahili appears in the language picker, but it is not finished, so we do not count it yet.`,
+ },
+ {
+ label: "Where it runs",
+ value: `In a web browser, at ${mukokoLingo.url.replace("https://", "")}. Schools, businesses and admins use the console at ${mukokoLingo.console.replace("https://", "")}.`,
+ },
+ {
+ label: "Assessments",
+ value: "Diagnostic, formative and summative. They are graded on the server, not on the learner's device, so a score cannot be edited before it is recorded.",
+ },
+ {
+ label: "Class rosters",
+ value: "Rosters sync in over OneRoster from Clever, ClassLink and PowerSchool.",
+ },
+ {
+ label: "Moderation",
+ value: "Three layers on what learners type to the tutor: rule-based guardrails, an AI check, and detection of attempts to manipulate the tutor (prompt injection). Shamwari never claims to be human.",
+ },
+ {
+ label: "Sign-in and AI",
+ value: "Sign-in is through WorkOS AuthKit. The tutor runs on Cloudflare Workers AI, called from Lingo's own servers; the AI credentials never reach a learner's device.",
+ },
+ {
+ label: "Admin controls",
+ value: "Organisation admins manage users, content, moderation, guardrails, analytics and API keys.",
+ },
+ {
+ label: "Source code",
+ value: "Open source, under the MIT licence. Anyone can read how it works.",
+ },
+];
+
+const title = "Mukoko Lingo — language learning — Nyuchi Learning";
+const description =
+ "Mukoko Lingo teaches Shona, Ndebele, English and Chinese: five phrases a day, spaced repetition, and Shamwari, an AI tutor. Classes, assignments and assessments for schools. Developed by Nyuchi Learning, part of Mukoko.";
+
+/* The claims here are the ones a search result or an assistant will repeat,
+ so they are the repository's, word for word where possible. No `offers`:
+ the app says "Start for free", but there is no published price for schools,
+ and a price of 0 would claim more than that. */
+const schema = [
+ {
+ "@type": "SoftwareApplication",
+ "@id": "https://learning.nyuchi.com/mukoko-lingo#software",
+ name: mukokoLingo.name,
+ applicationCategory: "EducationalApplication",
+ operatingSystem: "Web browser",
+ description,
+ url: "https://learning.nyuchi.com/mukoko-lingo",
+ sameAs: [mukokoLingo.url],
+ inLanguage: [...mukokoLingo.languageCodes],
+ author: {
+ "@type": "Organization",
+ name: "Nyuchi Learning",
+ parentOrganization: { "@id": "https://learning.nyuchi.com/#organization" },
+ },
+ publisher: { "@id": "https://learning.nyuchi.com/#organization" },
+ brand: { "@type": "Brand", name: "Mukoko" },
+ license: "https://opensource.org/licenses/MIT",
+ featureList: [
+ "Teaches Shona, Ndebele, English and Chinese",
+ "Five phrases a day, with flash cards and a short quiz",
+ "Spaced repetition schedules what comes back and when",
+ "Shamwari, an AI tutor that adapts to the learner's measured proficiency",
+ "Pronunciation guides and cultural context",
+ "Classes, assignments and per-student progress for teachers",
+ "Diagnostic, formative and summative assessments, graded on the server",
+ "Roster sync over OneRoster from Clever, ClassLink and PowerSchool",
+ "Three layers of content moderation on what learners type to the tutor",
+ ],
+ },
+];
+---
+
+ Language learning · Nyuchi Learning
+ Learn Shona, Ndebele, English or Chinese, five phrases a day, with an AI tutor that
+ meets you at your level. Teachers can set the work and see who is keeping up.
+
+ A partner app developed by Nyuchi Learning, part of
+ Mukoko,
+ Africa's super app.
+
+ In your browser at lingo.mukoko.com · starting is free
+ What it does today
+ {feature.body}
+ Who it is for {audience.label} {audience.body} For schools
+ Lingo has two halves. Learners use the app. Teachers and admins use the console,
+ where the class work happens.
+ For whoever has to sign this off Get it
+ Go to
+ lingo.mukoko.com,
+ choose a language and take today's five phrases. Starting is free. For a class or a
+ whole school, write to us.
+
+ Who makes it. Mukoko Lingo is a partner app
+ developed by Nyuchi Learning, part of Mukoko, Africa's super app. Nyuchi Learning is
+ part of Nyuchi Africa, which also makes the
+ Toddle Enhancement Extension.
+
+ {mukokoLingo.name}
+
+
+ Five phrases a day, and a tutor to ask.
+
+ {feature.title}
+
+ One app, from one learner to a whole school.
+
+ {audience.title}
+
+ Language practice you can assign and measure.
+
+ For teachers
+
+
+ For school leaders and IT
+
+
+ The facts, plainly.
+
+ {
+ facts.map((fact) => (
+
+
+ Open it in your browser and start.
+
+ {toddleExtension.licenceHost}
(and licences.nyuchi.dev, which versions
- before {extensionVersions.current} asked, for any computer Chrome has not yet updated) so the daily check for cancelled keys can run. If it is blocked, licences keep
+ before {extensionVersions.changedIn} asked, for any computer Chrome has not yet updated) so the daily check for cancelled keys can run. If it is blocked, licences keep
working on the last result.
diff --git a/src/pages/toddle-enhancement-extension/releases.astro b/src/pages/toddle-enhancement-extension/releases.astro index b1f925e..012e746 100644 --- a/src/pages/toddle-enhancement-extension/releases.astro +++ b/src/pages/toddle-enhancement-extension/releases.astro @@ -16,7 +16,7 @@ import { toddleExtension } from "../../data/site"; const title = "Releases — Toddle Enhancement Extension — Nyuchi Learning"; const description = - "What changed in each version of the Toddle Enhancement Extension, in plain words for teachers: version 0.10.0, on the Chrome Web Store since 13 October 2026, and every version before it."; + "What changed in each version of the Toddle Enhancement Extension, in plain words for teachers: version 0.11.0, the current version on the Chrome Web Store, and every version before it."; const storeCta = toddleExtension.webStore ? { label: "Add to Chrome", href: toddleExtension.webStore } diff --git a/tests/links.test.ts b/tests/links.test.ts index 017f424..88c2bdb 100644 --- a/tests/links.test.ts +++ b/tests/links.test.ts @@ -18,7 +18,8 @@ describe("ecosystem destinations", () => { for (const url of [ "https://bundu.org/education", "https://nyuchi.com/learning", - "https://mukoko.com/lingo", + // Mukoko Lingo's live app, as its own repository's README names it. + "https://lingo.mukoko.com", ]) { it(`links to ${url}`, () => { expect(`${home}${siteData}`).toContain(url); diff --git a/tests/seo.test.ts b/tests/seo.test.ts index fa43457..b2524fd 100644 --- a/tests/seo.test.ts +++ b/tests/seo.test.ts @@ -20,6 +20,7 @@ const PAGES = [ "index.html", "toddle-enhancement-extension/index.html", "toddle-enhancement-extension/releases/index.html", + "mukoko-lingo/index.html", "legal/privacy/index.html", "legal/terms/index.html", "legal/security/index.html", @@ -268,6 +269,20 @@ describe("the releases page", () => { expect(page).toContain('id="v0.9.10"'); }); + it("says 0.11.0 is on the store, and gives the later test builds its anchor", () => { + const v0110 = release("0.11.0"); + expect(v0110).toContain("On the Chrome Web Store"); + expect(v0110).not.toContain("Coming soon to the Chrome Web Store"); + expect(page).toContain('id="v0.10.1"'); + expect(page).toContain('id="v0.11.2"'); + }); + + it("lists 0.11.0 first, and does not list 0.12.0, which is not released", () => { + expect(page.search(/