
She asked to learn Italian. We changed the rule.
An Afghan woman was waitlisted because of her nationality. She asked us to reconsider. TEEI Language is now open to Afghan women 18+, wherever they live.

Latest news, announcements, and updates from TEEI.

An Afghan woman was waitlisted because of her nationality. She asked us to reconsider. TEEI Language is now open to Afghan women 18+, wherever they live.

From today we go by TEEI: language practice, mentoring, skills training and a partner network on one engine we built ourselves. Nothing else changes.

How TEEI keeps free language and career platforms online for Ukrainians affected by the war and women from Latin America and the Caribbean

Streaming, tool-grounding and human approval: one sample company report, from volunteer hours to a shared link, drafted with the Vercel AI SDK.

For six days in August 2026, every new volunteer was turned away at the LinkedIn step while the site stayed up. How we tell a quiet door from a shut one.

Learners in TEEI's group study on DataCamp through DataCamp Donates. How the platform works, where it sits in TEEI's programmes, and our thanks.

A libSQL client shared across Worker requests hung requests in our test lane. We moved the cache into each request and kept reuse within it.

We schedule two products from one Worker. We guard individual jobs against duplicate effects and check their outcomes separately from tick delivery.

We once used one measurement for both builds. We now take separate readings, verify the serving Worker version and assess rollback against the live schema.

After an external await, we could overwrite newer state. By moving a deadline, we kept old watches alive. We changed both rules and the tests.

Until September 2026 a repair could overwrite badge images that readers had already cached as immutable. We publish every repair at a new address in R2.

TEEI's website, TEEI Language, TEEI Mentorship and Evenhall run on Cloudflare Workers. This is how, with what broke and what we measured.

How TEEI works: one platform of shared blocks. A new programme starts on parts that already work, and each is there because research shows what it does.

We can read from one Astro collection and still disagree on what is published. For a built search index, we filter preview drafts out again.

We traced a crash to old code reading new loader data, then found our tests expecting a failure report from a reload that worked.

We found a 500 before a cache hit, private values in the Worker bundle and missing sitemap routes. Each exposed a boundary we had to migrate.

We moved three apps from Pages to Workers, then changed Cloudflare accounts. We had to rebuild defaults for headers, redirects and deployment targets.

We build two Workers from one React Router app, pass programme identity through typed context, and use stored rows for scheduled work.

We found a session lookup in the language helper, outside our list of guards. We moved resolution into layout middleware and gave the context three states.

A local browser experiment found two ordering bugs in our activity line. We follow the handoffs between Astro, Workers and the visible text.

We omit names, coarsen times and mask country pairs before storage, then derive every public view from that record and remove its id at runtime.

We had recorded the volunteer's answer, but still removed the learner from the lesson. Here is where live signals end and durable outcomes begin.

We could reuse an idempotency key and still change the payload after a deploy. We now store the first attempt’s message fields so a retry can reuse them.

We keep Astro pages static while handling old measurements, failed source reads and island requests that never replace the fallback.

We restored loader data with one nonce input. For late Suspense content, we needed the same nonce in another place.

We can capture an error and still struggle to follow the failure. We compare a shared trace with a request ID across browser and Worker.

We refresh one unread count without rerunning the page's loaders. To keep the page after a rejected background panel load, we return failure as data.

We keep WebSocket upgrades outside Astro as a precaution. Locally, a copied response kept its socket; a rebuild without the socket broke the upgrade.

We can fail a React Router build on code we would never send to the browser: we check imports before we drop unused code. How we split our files.

We run Workers near our database to shorten trips, and batch reads and rewrite loaders to remove them: 84 trips to six on a development server.

Pruning Astro fallback pages reduced the files we shipped. Redirecting their old URLs needed a separate fix before the Worker.

In our Astro setup, we got 404s for old image URLs. We trace why we needed redirects before the adapter, even with Worker first.

We moved a failing call onto a service binding and it kept failing. Weeks later we found that our RPC calls could write through a maintenance pause.

We count built variables before a deploy and deployed variables before a secret write, adding the live secret inventory in both cases.

The AWS services that carry TEEI's free programmes, measured: Chime video, Bedrock checks and who decides, monitoring, and how releases are verified.

TEEI's free programmes run on Amazon Chime SDK, and every verified volunteer hour, up to the company report in Evenhall, starts as a meeting event.

With support from Algolia for Open Source, TEEI helps people find help answers and job titles in four languages, even when the spelling is imperfect.

Learners in TEEI Skills Academy have passed 75,000 hours on DataCamp. The dashboard read 76,032 on 21 September 2026. Every seat is free.