
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.

Running a distributed, technology-dependent nonprofit at scale requires infrastructure decisions that the sector rarely documents openly. This hub changes that. We publish the operational detail that other nonprofits usually keep internal: how we handle GDPR compliance across a multi-country participant base, how we structure safeguarding protocols for online mentorship programmes, how we built our content pipeline, and what we have learned from deploying digital tools in crisis response contexts.
The audience is other nonprofit professionals, sector researchers, and grant makers who need to understand the operational scaffolding behind the programmes they fund or study. Nonprofit technology infrastructure, volunteer management at scale, and remote programme delivery are not glamorous topics, but they determine whether a programme actually reaches the people it is designed to serve.
We also use this hub for TEEI organisational updates: new programme launches, partnership announcements, team changes, and annual report summaries. If you follow TEEI's work and want to understand not just what we do but how we do it, this is where we make that transparent. The goal is a sector that learns from shared operational experience, not one where every organisation reinvents the same infrastructure in isolation.
Featured article: TEEI's Volunteer Certification System: Design and Implementation.

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.