Skip to main content
TEEI in Practice
Engineering note · Research & Engineering · 18 October 2026 How Project Galileo Protects TEEI’s Platforms

TEEI in Practice

Engineering noteResearch & Engineering

How Project Galileo Protects TEEI’s Platforms

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

On this page
  1. How it fits together
  2. At a glance
  3. What a request meets on the way in
  4. The website and the stories
  5. Public figures that stay public
  6. Forms that stay open
  7. TEEI Language: the ring and the room
  8. TEEI Mentorship and Skills Academy
  9. Certificates people share
  10. Evenhall: what companies see
  11. Staff tools and how we ship
  12. What the protection handled
  13. If you run a small nonprofit on Cloudflare
  14. The engineering series behind this story
  15. Thank you, Cloudflare
  16. About the figures
  17. Frequently asked questions

The website, TEEI Language, TEEI Mentorship, Skills Academy, Evenhall and the tools our staff use, and what stands in front of each of them. Security and traffic figures read from our Cloudflare account between 14 and 18 October 2026.

Oksana T. learned English in one-to-one sessions with volunteers on TEEI Language. In her film she talks about joining when she felt stuck, and about becoming less afraid to speak.

Figure 1. Oksana T., who learned English on TEEI Language, on what the sessions gave her. 1 min 21 s, with captions. Source: TEEI film library, with Oksana T.’s agreement to its use on TEEI’s pages; this cut was rendered on 22 September 2026.

Today, a learner can open TEEI Language on their phone, choose an available volunteer and start a conversation. Behind that experience are the web applications that organise participation, connect people and record their activity. Those applications run on Cloudflare, with Business-plan protection on our main zone provided through Project Galileo.

The Educational Equality Institute (TEEI) is a nonprofit, and our programmes are free. The participants in this story are Ukrainians affected by the war, both those displaced abroad and those still living in Ukraine, and women from Latin America and the Caribbean, including women who have migrated or been displaced. What people come for is ordinary, and it matters:

  • finding a peer and a place to belong
  • using a new language with more confidence in daily life
  • talking through a CV or a job interview with someone who has done the job
  • learning data, technology or project management skills

Volunteers from many countries give that time as conversation partners, mentors and teachers.

TEEI organises its programmes in four areas: connection, language, skills and work. Participants can combine language practice, skills learning and mentoring according to their needs, without following a fixed sequence. Three platforms on our main zone carry language, skills and work: TEEI Language, Skills Academy and TEEI Mentorship. Evenhall serves the companies whose employees take part.

This article goes through each platform in this story in turn: what people do there, what stands in front of it, and what that protection handled up to 16 October 2026. The screens come from demo platforms and sample workspaces: every name in those screens belongs to a sample profile, and none of the faces or pictures in them shows a participant. The two films are different. Oksana T. and Ihor R. took part in TEEI’s programmes and agreed to their films being used on TEEI’s pages. The security and traffic figures were read from our Cloudflare account between 14 and 18 October 2026. Cloudflare’s analytics are sampled, so those figures are estimates, and they count requests, not people, confirmed intrusions or prevented breaches. Each table, chart and note gives its own window, and their limits are listed at the end.

Built through volunteer contributions. TEEI’s software platforms are built through volunteer work, with NOK 0 spent on paid software development. Infrastructure and third-party services are separate from that figure.

How it fits together

A learner finds TEEI on the website and opens TEEI Language on a phone. The page comes from Cloudflare. They pick a volunteer who is free right now, and the volunteer’s screen rings. When they join the session, the Worker authenticates the request and asks AWS for a meeting; from then on their voice goes through the Chime media service in Ireland. When they leave, the platform settles the hours that a volunteer’s record and a partner company’s report are later built from. When a volunteer gives their time through an employer, the company’s managers see it in Evenhall. People earn certificates and badges as they go.

Each of those screens is answered by a different Worker, or by the same Worker doing a different job, and every one of them sits on a hostname of our main zone. The voice and video of the session itself run on Amazon Chime SDK, outside the zone. Cloudflare’s Managed Ruleset runs in front of every TEEI platform on the zone, so requests that match its signatures are blocked before they reach our code, whichever platform they arrive at.

Four phone screens in a row, joined by arrows. First, the TEEI website's home page with the words Connection, Language, Skills, Work and a button that says I want to learn. Second, the home screen of TEEI Language for a sample learner, with a goal, sample volunteers and the next session. Third, a one-to-one practice session on a phone between demo personas, with the video in the middle and the controls along the bottom. Fourth, the home screen of TEEI Mentorship for a sample mentee, with the next mentoring session. Under each screen, the Worker that serves it and the Cloudflare feature it relies on.
Figure 2. An example path through TEEI, across four screens and the Workers behind them. The names and portraits are sample profiles, and the larger pictures are scene images that the site and the apps use. Source: TEEI, captured from the website, the public tours of TEEI Language and TEEI Mentorship, and a live Amazon Chime SDK meeting with demo personas, 14 October 2026.

The platforms hold people’s bookings, the records of the sessions they took part in, and the certificates they earn and share. Many of the people who use them are Ukrainians affected by the war, or people rebuilding a career or finding their way in a new job market.

Through Project Galileo, Cloudflare gives TEEI its Business plan on our main zone, at no cost. The main zone is more than the website. TEEI Language, TEEI Mentorship, Skills Academy and Evenhall all live on hostnames inside it, and so do our internal tools. The protection sits in front of the platforms where learners and volunteers meet, not only in front of the page that describes them. Galileo’s support is that plan on the zone. The Workers Paid plan, R2 storage, AI services and the other third-party services the platforms use are separate from it.

Most of the work is done by two layers. The first is the Cloudflare Managed Ruleset, which Cloudflare maintains and keeps up to date. The version we run was last updated on 15 October. The second is a handful of narrow rules we wrote ourselves for problems we have actually had.

That first layer was not on from the start. Our zone has been on the Business plan through Project Galileo since 6 July 2026, but we turned on the Managed Ruleset only on 22 September, so the blocks counted in this article start that day. A plan that includes a protection is not the same as a protection that runs.

Table 1. What stands in front of each platform in this story.The Managed Ruleset runs in front of every TEEI platform on the main zone; the rest is set platform by platform.
PlatformWhat people do thereIn front of it
Websiteread about the programmes and the people in them, check a figure, write to usthe Managed Ruleset, and our own rules for the impact page and the forms
TEEI Languagebook a volunteer, answer a ring, open the roomthe Managed Ruleset, and a rate limit on sign-in
TEEI Mentorshipfind a mentor and book a sessionthe Managed Ruleset
Skills Academyregister for a workshop, a clinic, an expert Q&A or a classthe Managed Ruleset
Evenhallinvite employees, read their hours, prepare a reportthe Managed Ruleset
Adminwhere TEEI’s staff run the programmesthe Managed Ruleset, and its own sign-in and role checks
Previews, staging and database toolswhere we build, test and look after the dataCloudflare Access, for selected ones
The video callthe conversation itselfnot on the zone: it runs on Amazon Chime SDK

At a glance

Table 2. TEEI’s main zone in figures.
MeasureFigureNote
Protection on the zone
Requests blocked by the Managed Ruleset99,08222 September to 16 October; on from 10:28 UTC on 22 September
Of those, matching rules for files that can reveal how a site is built86 %version-control, configuration and backup files, by the rule each request matched
Challenges from our rule on the impact page885from 11 October
Spam submissions blocked by our forms rule433all between 17 September, when the measurement starts, and 25 September
Requests stopped by Browser Integrity Check40617 September to 16 October
DDoS-classified events0in the firewall data, 17 September to 16 October
Blocked by the Managed Ruleset at each platform’s address, 22 September to 16 October
Website29,270
Evenhall1,899at its earlier address, which forwards to Evenhall
Skills Academy1,771its own hostname on the Mentorship Worker
TEEI Language1,770
TEEI Mentorship1,119
Traffic
Requests answered by the five core application Workers5.2 million17 September to 16 October
Runtime errors in those requests70the same window
Requests to the zone answered from cache7.7 millionof 10.7 million, 14 September to 13 October
Programmes
Sessions on TEEI Language and TEEI Mentorship12,517the public statistics on 14 October 2026
Hours of conversation9,435.5the same reading

What a request meets on the way in

The same zone settings apply to every TEEI platform on the zone. They decide how a browser may connect, and what every answer tells it about connecting next time.

Table 3. The settings every request to the main zone meets.Read from the zone’s configuration on 17 October 2026; the responses we captured on 18 October carry the HSTS and HTTP/3 settings.
SettingStateNote
Always Use HTTPSona plain HTTP request is sent to HTTPS
SSL/TLSstrictfor connections from Cloudflare to an origin server
Minimum TLS version1.2
HSTSonincluding subdomains, for about six months
HTTP/3onoffered in every response we captured

On 18 October 2026 we sent two requests from Oslo to show what happens next. The first asked for our impact page, the way a reader would. The second asked for /.git/config, a version-control file of the kind about 73 percent of the blocked requests asked for.

Captured from Oslo · 18 October 2026, 05:35 UTCtheeducationalequalityinstitute.org

Two requests, one zone

The same door, two answers

  1. BrowserOslo
  2. Cloudflaredata centre OSL, the rules; the probe stops here
  3. Our Workerthe website

A reader

GET /about/impact/

  1. ConnectionHTTP/2 over TLS · strict-transport-security: max-age=15768000; includeSubDomains
  2. Managed Rulesetpassed
  3. Our Worker200
  4. Raya4c52df86ee2568e-OSL

A probe

GET /.git/config

  1. ConnectionHTTP/2 over TLS · the same header
  2. Managed RulesetVersion Control - Information Disclosure · block
  3. Our Workernever reached
  4. Answer403 · Cloudflare's block page · ray a4c52e00fc8a5694-OSL

Both requests were sent by TEEI. The status codes, headers and ray IDs are copied from the responses, and the rule from our firewall events, where the second request appears under its ray ID. Passed and never reached follow from those answers. Nothing here is simulated.

The reader’s request passed the ruleset and was answered by the website’s Worker. The probe never got that far. Cloudflare’s Managed Ruleset matched it to the rule Version Control - Information Disclosure, answered with its own block page and status 403, and recorded the event in our firewall data under the ray ID shown, a4c52e00fc8a5694. Both answers carry the same HSTS header and offer HTTP/3, and the OSL at the end of each ray ID names the data centre in Oslo that received them.

The website and the stories

Between 22 September and 16 October, Cloudflare’s Managed Ruleset blocked about 29,270 requests at the website’s address. Across the zone, most of what it blocks are requests for version-control files such as .git. The website stays open to anyone, without a sign-in, while those requests are turned away before they reach our code.

The website is an Astro 7 site that runs as a Worker with Static Assets. Most of our traffic goes there: of the about 5.2 million requests the five core application Workers answered in the 30 days to 16 October, the website’s Worker answered about 3.1 million. People find the programmes there, reach us through its forms, and watch films from people who took part.

Oksana T.’s film above is one of those on the stories wall. The films sit in an R2 bucket and reach the browser through the bucket’s public domain, in the byte ranges the player requests when it plays. The player is set to preload="none", which asks the browser not to fetch the video ahead of playback; its poster image loads with the page. Ihor R.’s film, further down, measured 6.7 MB on 15 October 2026, in the same square cut the stories wall plays.

What Cloudflare’s cache does for the zone is easiest to see by day, over the 30 days from 14 September to 13 October.

Stacked area chart of requests per day to TEEI's main zone, 14 September to 13 October 2026, by cache status. In Cloudflare's sampled analytics about 7.7 million of 10.7 million requests were cache hits, and about 2.7 million carried the status none, bypass or updating.
Figure 3. Requests to TEEI's main zone by cache status. The zone carries the website and the platforms' hostnames. A hit was answered from Cloudflare's cache, none means the response did not go through the cache, and dynamic is a kind of response Cloudflare does not cache by default. Source: TEEI, from Cloudflare’s GraphQL Analytics API, HTTP requests to the zone by cache status and day, visitor requests only, read on 14 October 2026 at 18:26 UTC.

About 7.7 million of the 10.7 million requests in those 30 days, seven in ten, were answered from Cloudflare’s cache. About 2.7 million carry the status none, bypass or updating, and the dynamic and miss layers together are under 300,000.

The same zone carries the redirects that keep old links alive. The website used to run on WordPress, and other sites still link to its old addresses, among them news sites and job boards in Ukraine. On 12 October we found 39 of those addresses that answered 404 and added them to a Bulk Redirect list, 78 entries with both slash forms. All 117 checks we ran answered 301 in one hop, kept the query string, and ended on a page that answered 200.

Public figures that stay public

Anyone can open our impact page. When automated crawling of it increased, we did not put everyone behind a challenge. We wrote a narrow rule for that crawl instead. From 11 to 16 October it issued about 885 challenges.

The public statistics that the Language Worker publishes said, on 14 October 2026 at 13:38 UTC, that 12,517 sessions and 9,435.5 hours of conversation have taken place across TEEI Language and TEEI Mentorship, with members in 148 countries.

The website shows the same counter. Its impact page pins each published figure, so that a citation stays true, and under the record it prints the counter as it stands now. The website’s Worker asks the Language Worker for that number, so the reader’s address never reaches the counter, and reuses each reading for 30 seconds. The capture below was taken two hours after the reading above, so its live line is a little higher.

The figure record on the impact page of TEEI's website, on a phone. It shows 11,984 completed sessions across TEEI Language and TEEI Mentorship, recorded since 22 April 2022, with a monthly chart and three checks: read from the live counter on 18 September 2026, defined in the measurement register, and pinned so that a citation stays true. Below the record, a line reads the live counter: 12,525 sessions, 541 more than the pinned figure, read on 14 October at 15:44 UTC.
Figure 4. The website's impact page on a phone: the pinned record, and under it the live counter from the Language Worker. Source: TEEI, captured from the impact page on TEEI’s website at phone width, 14 October 2026.

Forms that stay open

Partners, companies and volunteers reach us through public enquiry forms, and we want those forms open to anyone. In the 30 days we measured, a rule for known spam sources blocked about 433 submissions, all between 17 and 25 September. Since 26 September it has had nothing to block.

Those are two of the rules we wrote ourselves. They address the specific patterns we have observed on our services, and each one is kept as narrow as possible, so that public pages stay public. We are not publishing the exact rules.

TEEI Language: the ring and the room

The door. Between 22 September and 16 October, the Managed Ruleset blocked about 1,770 requests at TEEI Language’s address. Sign-in on TEEI Language also has a rate limit of its own, and in the 30 days we measured it recorded no events. In the 30 days to 16 October, the Language Worker answered about 1.4 million requests. For a learner, TEEI Language’s pages are where a conversation is arranged and begun: the booking, the ring and the way into the room.

TEEI Language and TEEI Mentorship are two products on one platform, built from one React Router 8 codebase and deployed as two Workers. Language is where people practise a language through real conversations; Mentorship connects mentees with professional mentors.

A volunteer’s home in TEEI Language shows the learner they meet next, the requests waiting for an answer and the hours they have given.

Three crops of a volunteer's home in TEEI Language on a phone, from the demo platform. The first is the top of the page: the greeting, the learner the volunteer meets next, and that learner's question. Below it, a strip of the coming days and the confirmed session on Friday at 18:00. The second shows two requests waiting for an answer, nothing to write up, and three learners with nine verified hours together. It also shows the standing Senior Language Volunteer. The third lists the two requests, each a learner asking for a 30-minute conversation on their own topic, with the buttons Accept and Decline. Sample people.
Figure 5. TEEI Language on a phone: a volunteer's home. The learner they meet next brought a question, two more requests wait for an answer, and the hours given are counted. Sample people. Source: TEEI Language demo platform, 14 October 2026.

The ring. Some conversations do not wait for a booking. A volunteer can mark themselves available now, and a learner who sees them can start a session straight away. The volunteer’s screen then rings, and the volunteer answers or declines. If nobody answers, the booking must be settled and the learner told, even if the volunteer’s browser has been closed. That needs something that can hold a connection open and keep time after every browser has closed, which a request and a response cannot do. That is a Durable Object.

Sequence diagram with five columns: the learner's browser, the Language Worker, the Turso database, the LivePresence Durable Object and the volunteer's browser. The volunteer's browser holds a hibernating WebSocket to the Durable Object. The learner picks the volunteer; the Worker writes the booking to the database first, then notifies the Durable Object and waits at most about two seconds for it, whatever the answer. The Durable Object rings the volunteer's screen and sets an alarm for two and a half minutes. If the volunteer answers, the ring is settled and both join the room. If the alarm fires first, the Durable Object asks the database to settle the unanswered booking and tells the learner the authoritative outcome.
Figure 6. A ring, from the learner's choice to the volunteer's screen. The database is written first, and the wait for the Durable Object is capped at about two seconds. Source: TEEI, drawn from the live presence service in TEEI Language, 14 October 2026.

The room. People open the room from their own TEEI page, check camera and microphone in a lobby, and talk. The page comes from the Language Worker, and the video call runs on Amazon Chime SDK. In the meeting and attendee fields, the meeting service receives opaque identifiers, the booking’s generated ID and a pseudonymous user ID, rather than names or email addresses. The voice and video themselves take a separate path, through Chime’s media service, and background blur lets someone take part without showing their home.

The lobby before a one-to-one session in TEEI Language. On the left, the start time in Oslo and in Kyiv, and the learner's words from booking: I would like to practise talking about my work. On the right, the volunteer's camera preview, a button to join, and the camera, microphone and background blur settings.
Figure 7. The lobby: the time in both cities, what the learner asked for when booking, and a camera and microphone check before joining. Source: TEEI, captured in a live Amazon Chime SDK meeting, with demo personas in place of real participants, 18 October 2026.

The practice room article shows the room in full.

A one-to-one session in progress on a laptop. The learner fills the screen, the volunteer's own picture sits in the corner, the time left is shown at the top, and the controls for microphone, camera, screen sharing, raised hand, reactions, captions, chat and notes run along the bottom.
Figure 8. A one-to-one session: the other person fills the screen, and everything else stays at the edges. Source: TEEI, captured in a live Amazon Chime SDK meeting, with demo personas in place of real participants, 18 October 2026.

The distance. TEEI’s programmes are for people who are often on a phone, on a mobile network, in a country far from our database. By September, TEEI Language was quick in Western Europe and slow almost everywhere else. Over the week before 21 September, request-weighted regional averages of the data centres’ median Worker times on page requests were 247 milliseconds in Western Europe, 1,193 in the western United States, 1,656 in Japan and 2,723 in Oceania; the mix of pages was not controlled. A Worker runs in the data centre closest to the person by default, and our database has one location, in AWS Europe (Ireland), so the further away someone was, the more each trip to the database could cost. On 21 September we committed a placement setting so that our Workers run next to the database instead of next to the user; it reached production with the release of 22 September.

Bar chart comparing TEEI Language pages in the seven days before 21 September 2026 with the seven days to 14 October 2026, each week taken as a whole. The median page time went from 310 milliseconds to 180, the 90th percentile from 1,348 to 474, database round trips per page from 12.4 to 5.8, and the time per round trip from 121 to 58 milliseconds. Placement, batching, loader rewrites and indexes changed together.
Figure 9. TEEI Language pages across a combined release, one week as a whole on each side. Code removed trips. Source: TEEI, from Workers Logs for successful page requests that read the database, timed inside the Worker, 14 October 2026.

Placement, loader changes and indexes shipped together. The before-and-after figures describe that combined release and the traffic in each measurement window; they do not isolate the effect of placement. A request-local read coalescer batches eligible SQL reads into fewer transport calls; it does not deduplicate identical statements. Loader rewrites and indexes reduce other database work. Both weeks are summarised the same way, over every page request in the week; the placement article describes its own measurement window in full. The Workers article shows 179 and 499 milliseconds for the later week, because there the daily figures are averaged; taken as a whole, the same week gives 180 and 474.

TEEI Mentorship and Skills Academy

The door. Between 22 September and 16 October, the Managed Ruleset blocked about 1,119 requests at TEEI Mentorship’s address and about 1,771 at Skills Academy’s. The Mentorship Worker, which answers both, handled about 239,000 requests in the 30 days to 16 October.

Finding a mentor. On TEEI Mentorship, mentees browse approved mentors by expertise and request or book a session, and the mentor accepts when acceptance is required. A mentor helps with a CV, interview preparation, a job-search strategy, a career change or how hiring works in their industry.

Two crops of a mentor's home in TEEI Mentorship on a phone, from the demo platform. The first is a request waiting for an answer. A mentee new to the mentor asks for a 45-minute session on Sunday 18 October at 19:00. They want to practise answering behavioural questions with someone who has hired before. The buttons Accept and Decline sit below. The second is the mentor's week, with two open times for mentees to book and one session booked on Saturday at 18:00. Below it, the group session the mentor hosts, From operations to product, with two people enrolled, and the mentor's recap of the last session. Sample people.
Figure 10. TEEI Mentorship on a phone: a mentor's home. A request from a mentee with the topic they want to practise, the week with open times, a group session, and the last recap. Sample people. Source: TEEI Mentorship demo platform, 14 October 2026.

Ihor R. is a career fellow on TEEI Mentorship. In his film he talks about moving to a different country, the help his mentors gave him with his LinkedIn profile, cover letter and CV, and wanting to work as a project manager.

Figure 11. Ihor R., a career fellow on TEEI Mentorship, on what his mentors helped him with. 1 min 22 s, with captions. Source: TEEI film library, with Ihor R.’s agreement to its use on TEEI’s pages; this cut was rendered on 22 September 2026. File sizes measured on 15 October 2026.

Learning a skill. Skills Academy has two halves. Participants study at their own pace on DataCamp and take Google Career Certificates on Coursera. Alongside that, volunteers teach live: a workshop, a clinic, an expert Q&A, a webinar, or a class that meets weekly for two to six sessions. Mentors on TEEI Mentorship help participants choose learning resources, apply what they learned, review practical work and plan next steps. Skills Academy is served from a second hostname on the Mentorship Worker. TEEI brings the learners and does the scheduling. In a class, participants receive a certificate once the teaching team confirms the required attendance and reviewed work.

The Discover page of Skills Academy on a laptop. Tabs for workshops, clinics, expert Q&As, webinars and classes sit above the search filters. The featured session is a sample expert Q&A with a button to register, and the week's sample sessions follow below it.
Figure 12. Skills Academy's Discover page, served from a second hostname on the Mentorship Worker. The sessions and hosts are samples. Source: TEEI, Skills Academy’s Discover page with sample sessions, captured for TEEI’s programmes page, October 2026.

An instructor’s desk shows the next session with its registrations and the preparation for it, and the sessions after it.

Two crops of an instructor's Skills Academy desk on a phone, from the demo platform. The first is the next session: a workshop on Tuesday 20 October, 19:00 to 20:30, called Tell your operations work as product decisions. It shows 3 of 12 places registered, 5 days until it starts, a written preparation in five steps, and the button Prepare. The second lists the two sessions after it. A clinic, Product CV review clinic, has 2 of 8 registered. An expert Q&A, Ask a product lead: your first ninety days, has 3 of 30 registered. Sample data.
Figure 13. Skills Academy on a phone: an instructor's desk. The next workshop with its registrations and preparation, then the clinic and the expert Q&A after it. Sample data. Source: Skills Academy demo platform, 14 October 2026.

Certificates people share

The certificates and badges people earn are kept in R2, in the bucket the website reads them from, and they are most of what R2 holds. The managed-artwork URLs we inspected use the website’s own hostname, where its Worker reads the files from R2, so those requests meet the same Managed Ruleset as the website.

Horizontal bar chart of R2 storage by bucket group on 14 October 2026: 18.04 GB in 31 buckets, of which certificates and badges hold 10.92 GB and films 5.58 GB. The platform logs hold most of the objects, 318,916 of 381,023.
Figure 14. What fills R2. Certificates and badges hold most of the bytes; the platform logs hold most of the objects. Source: TEEI, from Cloudflare’s GraphQL Analytics API, R2 storage per bucket, the latest sample in the 48 hours before 14 October 2026 at 13:36 UTC. Stored bytes, metadata included.

By object count the order flips: the platform logs hold more than eleven objects for every certificate or badge.

A sample TEEI Language certificate of achievement with the placeholder name Your name, for the Language Learner role, with a seal and placeholder certificate details.
Figure 15. A sample TEEI Language certificate. The name and the certificate details are placeholders. Source: TEEI, the sample certificate shown on the website’s pages for TEEI Language, October 2026.

The share cards for published sessions have a bucket of their own. A separate renderer outside Cloudflare writes them with an R2 API token, which is scoped to buckets, not to prefixes within them. R2’s temporary credentials can be narrowed to a prefix, but the renderer does not use them. We use separate buckets to keep the share-card renderer’s write access separate from certificate storage, so a fault in the renderer cannot overwrite the certificates people put on LinkedIn.

The public /verify/ page lists TEEI’s registration numbers, official domain and current programme names. Individual credentials have a separate verification page, which links to their badge and certificate files.

Evenhall: what companies see

Evenhall is where a partner company’s managers invite employees into TEEI’s programmes, see what they did there, and turn it into a report they can file. Between 22 September and 16 October, the Managed Ruleset blocked about 1,899 requests at the address Evenhall had under its earlier name, which now forwards to Evenhall. The Evenhall Worker answered about 332,000 requests in the 30 days to 16 October.

A company applies, and once TEEI has reviewed the application, its managers invite employees into TEEI Language, Skills Academy or TEEI Mentorship.

Evenhall sends email, takes in applications from companies and syncs employee lists from HR systems. None of that should keep the person who pressed the button waiting, so Evenhall uses three Cloudflare Queues: applications, email and HR system sync. A manager pastes the employees’ email addresses and presses Send invitations. For each address the Worker saves an invitation and an outbox row in separate database writes, then publishes a queue message that references the row. Queue messages identify work held in the database rather than carrying the recipient list or message content. Consumers use guarded claims and provider idempotency where supported to handle retries. Recovery and terminal handling differ between message families; the detailed queue article describes their boundaries.

Each of the three queues has a dead-letter queue. This is the email queue:

Flow diagram of Evenhall's email queue. A manager presses a button in Evenhall. The Evenhall Worker writes an outbox row to the database and publishes a message that references the row to a Cloudflare Queue. Before sending, the queue consumer reads the row, acquires a conditional claim and calls the email provider with an idempotency key. On exponential retry paths the delay doubles from one minute up to an hour; a message retried after every failed delivery reaches its dead-letter queue after eight retries. That consumer passes it to the email-family handler before acknowledging it. Applications and HR system sync have their own consumers. Separately, a sweep every five minutes alerts the team when a scheduled job goes stale.
Figure 16. Evenhall's email queue carries a reference to the outbox row, not the recipient or the message. Delivery state stays in the database; a successful queue acknowledgement does not prove delivery to a recipient. Source: TEEI, drawn from Evenhall’s queue configuration and consumers, 14 October 2026.
The Invite employees page in Evenhall's demo workspace for a sample company. A field takes email addresses, one per line or separated by commas, with a Send invitations button below it. A panel beside it explains how inviting works: add people, send invitations so that each person receives a single-use link, and track who has joined.
Figure 17. Invite employees: for each address, an invitation and an outbox row in the database, and a reference to the row in the queue. Source: TEEI, captured from Evenhall’s public demo workspace with sample data, 23 October 2026.

What Evenhall adds is the company’s view: who took part, how much time they gave, and reports a manager can prepare for leadership.

Two Evenhall phone screens from the demo workspace. The first lists the most recent completed sessions, each with a colleague, a programme, the hours and the status Verified. The second is one colleague's record, with their hours and sessions.
Figure 18. Evenhall on a phone: the most recent completed sessions, each with a person, a programme, the hours and a status, and one colleague's own record of hours and sessions. Demo workspace; the people and figures are fictional. Source: Evenhall demo workspace, October 2026.

The hours in it are counted from the room, not the calendar. When both people join a session, we record from TEEI’s video room when each of them connected and left. For a one-to-one session, the hours are the time both were connected to the same room at the same time, not the length of the booking. A session whose evidence has not arrived is kept apart and is not counted as hours. “Verified” here means verified by TEEI, from our own room records. It does not mean audited by anyone else.

A company’s CSR manager sees each named employee’s hours and session records. Employees never see each other’s records, and participants’ names stay out of the company’s reporting. Personal learning conversations and mentoring notes stay private. The company never sees the conversation, only the record that it took place.

Staff tools and how we ship

Admin is where TEEI’s staff run the programmes. It has its own sign-in and role checks, and the Managed Ruleset runs in front of it as well. Selected preview and staging environments, our database tools and specific internal endpoints sit behind Cloudflare Access.

We deploy often. TEEI Language had 235 production deploys between 27 June and 14 October 2026, and TEEI Mentorship 107. Every production deploy is written to a deploy log and probed. If the probe fails, the release script restores the previous version on its own, as long as that version still works with the database schema.

That has happened twice. On 22 July a Language deploy failed its probe at 07:10:12 UTC, because the probe expected a heartbeat the new version had only just added; the previous version was back six seconds later, and a release with the corrected probe went out at 08:05 and passed. On 28 July a Mentorship deploy rolled back because the probe still expected the closed service Mentorship had been before it opened on 24 July. The recorded rollbacks on 22 and 28 July were triggered by probe problems. They demonstrate the rollback path, not confirmed application failures; the probes were corrected.

We keep logs long enough to answer a question asked next quarter, not only one asked this week, and Workers Logs keep a few days. So Language and Mentorship send their logs to R2 through Logpush. Logpush needs two switches, and having only the first is the trap: with observability on and Logpush off, the Logpush job exists, reports no error and delivers nothing. The two settings now sit next to each other in the configuration, with a comment that says so.

Silence is the other thing we watch for. Evenhall’s daily sync went stale on 12 July 2026, and nobody was told for two months. Now a sweep runs every five minutes and sends an alert when a scheduled job goes stale. It has been on in production since 28 September.

Table 4. The five core application Workers in 30 days, 17 September to 16 October 2026, from Cloudflare’s analytics.The Workers article counts every production Worker to 14 October, so its totals differ.
WorkerRequestsRuntime errors
Website3,127,0400
TEEI Language1,412,86050
Evenhall332,04020
TEEI Mentorship and Skills Academy239,0700
Admin114,8500
Total5,225,86070

In the 30 days to 16 October, the five core application Workers answered about 5.2 million requests, and about 70 of them ended in a runtime error. Keeping the platforms on one account means a small team sees all of them in one place: one set of analytics, one set of logs and one view of every Worker.

What the protection handled

Since 22 September 2026, Cloudflare’s Managed Ruleset has run in front of every TEEI platform on the zone. From 22 September to 16 October 2026, it blocked an estimated 99,000 requests across TEEI’s main zone.

Line chart of requests blocked per day by Cloudflare's Managed Ruleset on TEEI's main zone, 17 September to 16 October 2026. The line stays at zero until 22 September, when the ruleset was turned on at 10:28 UTC, then runs at around 4,000 a day: 99,082 in 25 days, with the most in a day, 8,106, on 24 September. A dashed line marks the day it was turned on. Weekends are toned.
Figure 19. Requests blocked by the Managed Ruleset per day. Nothing was blocked by it before 22 September, when it was turned on at 10:28 UTC; that first day counts from then. Source: TEEI, from Cloudflare’s GraphQL Analytics API, firewall events from the Managed Ruleset by day, 17 September to 16 October 2026 (UTC), read on 17 October 2026 at 09:41 UTC.

The rules those requests matched show what they asked for:

Horizontal bar chart of what the requests blocked by Cloudflare's Managed Ruleset asked for, by the rule they matched, 22 September to 16 October 2026: about 73 percent version-control files such as .git, 13 percent configuration and backup files that could leak information, 4 percent fake search-engine bots, 3 percent a known code-injection signature and 7 percent everything else.
Figure 20. What the blocked requests asked for, as approximate shares of the estimated 99,000 requests the Managed Ruleset blocked, by the Cloudflare rule each request matched. Source: TEEI, from Cloudflare’s GraphQL Analytics API, firewall events from the Managed Ruleset by rule, 22 September to 16 October 2026 (UTC), read on 17 October 2026 at 09:41 UTC. Configuration and backup files join two rule families, common files and file extensions.

Together, about 86 percent of the blocked requests matched rules for files that can reveal how a site is built or where its secrets are kept.

A request that matches a signature does not tell us who sent it or why. In June 2026, for Project Galileo’s twelfth anniversary, Cloudflare published its first comprehensive report on cyberattacks targeting civil society, announced in its anniversary post. It found that civil society organisations faced attempts to exploit website vulnerabilities at a rate more than seven times higher than other Cloudflare customers.

Cloudflare’s Browser Integrity Check stopped about 406 more requests in the 30 days, most of them between 20 and 22 September. No DDoS-classified events appeared in the firewall data for the period.

The counts for each platform, given above, are also in the public data file. They are counted at each platform’s own hostname and do not add up to the total, because internal tools and other host variants are not listed.

If you run a small nonprofit on Cloudflare

This is what we would tell another organisation in our position:

  1. Check which protections are actually enabled. We had the Business plan from July and turned on the Managed Ruleset in September. Check which rulesets are active, not just which features the plan includes.
  2. Lock down the basics. Turn on Always Use HTTPS, strict TLS and a minimum of TLS 1.2. Turn on HSTS once every hostname it will cover, subdomains included, works over HTTPS.
  3. Put internal tools and previews behind Cloudflare Access. We use Cloudflare Access to control access to selected preview and staging environments, database tools, and specific internal endpoints. Our admin application uses its own authentication and role checks.
  4. Write narrow rules for the problems you actually have. One specific pattern is better than a challenge for every visitor.
  5. Keep your logs longer than the dashboard does. We send the Workers logs for TEEI Language and TEEI Mentorship to R2 with Logpush, so that we can still answer next quarter’s questions about those services.

The engineering series behind this story

This article is the story of the people the platforms serve and the protection around them. The engineering behind it is a series of notes. It starts with How TEEI Runs Its Platforms on Cloudflare Workers. Two reading paths branch from it: Astro on Workers, for our website, and React Router 8, for TEEI Language, TEEI Mentorship, Evenhall and admin.

Thank you, Cloudflare

For the learner, the purpose is a conversation, a class or a useful exchange with a mentor. For the volunteer, it is a practical way to contribute. The technology has to support those encounters, while the organisation protects the information and services around them.

Through Project Galileo, Cloudflare gives TEEI Business-plan protection on our main zone. That protection sits in front of the website and the platforms through which people from Ukraine, Latin America and the Caribbean meet volunteers from many countries. Thank you to the Project Galileo team.

Cloudflare is welcome to share this story, quote it, and use TEEI’s name and logo.

About the figures

  • Security and Workers traffic figures are estimates from Cloudflare’s sampled analytics, for 17 September to 16 October 2026 (UTC), read on 17 October 2026. The Managed Ruleset figures cover 22 September to 16 October. Programme totals are taken from TEEI’s public programme statistics, read on 14 October 2026.
  • The counts per platform are for the Managed Ruleset at each platform’s own hostname, 22 September to 16 October 2026. Evenhall’s count is for its earlier hostname, which now forwards to the current one; both are served by the same Worker.
  • The 5.2 million requests and the about 70 runtime errors cover the five core application Workers in the 30 days to 16 October 2026. The Workers article counts every production Worker in the 30 days to 14 October, so its totals differ. A runtime error is counted apart from HTTP error responses, and neither is an uptime figure.
  • The two requests in the panel were sent by TEEI from Oslo on 18 October 2026 at 05:35 UTC, and their headers and the firewall event are kept with the article’s working files.
  • Requests measure load, not people.
  • A request that matches a signature does not mean we run the software it targets, or that the attempt would have worked.
  • No DDoS-classified events appeared in the firewall data for this period. That does not show that no attack was attempted, and the observed activity does not establish a targeted campaign against TEEI.
  • The Managed Ruleset, custom rule and DDoS figures, the Workers totals and the programme figures, with their measurement periods and definitions, are in a public data file. The cache and storage figures come from the Workers article.
  • How TEEI Runs Its Platforms on Cloudflare Workers covers the architecture, the limits we hit and how we deploy.

Frequently asked questions

What is Project Galileo?

Cloudflare's programme for organisations doing public-interest work. Through it, TEEI's main zone runs on Cloudflare's Business plan at no cost. The Workers Paid plan, R2 storage, AI services and the other third-party services the platforms use are separate from that support.

What did the Managed Ruleset block?

An estimated 99,000 requests from 22 September to 16 October 2026. About 86 percent matched rules for version-control, configuration and backup files, the kind that can reveal how a site is built or where its secrets are kept.

What should a small nonprofit on Cloudflare check first?

That the protections the plan includes are actually switched on. We had the Business plan from 6 July 2026 but turned on the Managed Ruleset only on 22 September. The article ends with the five steps we would recommend, starting with that one.

Can I check the figures?

The Managed Ruleset, custom rule and DDoS figures, the Workers totals and the programme figures, with their measurement periods and definitions, are in a public data file, linked under About the figures.

More in Research & Engineering

Partnerships

Talk to us about building with TEEI

We use these details only to reply.