Skip to main content
TEEI in Practice
Engineering note · Research & Engineering · 14 October 2026 What TEEI Runs on AWS

TEEI in Practice

Engineering noteResearch & Engineering

What TEEI Runs on AWS

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

On this page
  1. How it fits together
  2. At a glance
  3. How it is put together
  4. Live video and captions
  5. Attendance: hours that start as meeting events
  6. The test room: every room, opened in its roles
  7. AI on Amazon Bedrock, and the checks around it
  8. Speech and media
  9. Events and analytics
  10. Data safety and the database move
  11. Monitoring from outside
  12. Security and the account guard
  13. Proofs, PDFs and images
  14. Build and release: the CodeBuild lane, and why it is off
  15. Built, not yet open
  16. The rest of the plumbing
  17. Frequently asked questions

Live video, attendance, AI checks, monitoring and builds. Measured on the live account on 14 and 15 October 2026.

TEEI’s free programmes connect people from Ukraine, and women from Latin America and the Caribbean, with volunteers who help them practise a language and build a career. The Educational Equality Institute runs those programmes on its own platform: TEEI Language, then Skills Academy, then TEEI Mentorship, with Evenhall by TEEI as the workspace for partner companies. The web front ends run on Cloudflare. Much of the work behind them runs on Amazon Web Services.

This article goes through the AWS services that carry that work and what each is for, how much each was used over 30 days in September and October 2026, every AI check that runs on Amazon Bedrock and who makes the final decision after it, and how the build lane on AWS CodeBuild worked and why it was switched off. Every number was read from the live account or from the infrastructure code on 14 and 15 October 2026. Rounded figures say “about”.

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 person opens TEEI Language on a phone. The page comes from Cloudflare. When they join a 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, Chime tells EventBridge in Frankfurt, a forwarder tells the platform, and the platform settles the hours that a volunteer’s record and a partner company’s report are later built from. If they chat, a model on Bedrock flags concerns for a person to review. Outside the session, monitors on AWS watch the Cloudflare side every few minutes, findings land as tickets on the team’s board, and the code behind all of it is verified on one EC2 build machine before it ships.

Three phone screens in a row, joined by arrows. First, the home screen of TEEI Language for a sample learner, with a goal, sample volunteers and the next session, tomorrow at 15:00. Second, a one-to-one practice session on a phone between demo personas, with the volunteer's video in the middle and the controls below. Third, Evenhall's demo with sample data: a company's quarterly impact report with 154 hours contributed, 10 volunteers and 27 sessions. Under each phone, the step and where it runs: the page and the booking on Cloudflare Workers; an authenticated request through Amazon API Gateway and the media through Amazon Chime SDK in Ireland; meeting events through Amazon EventBridge in Frankfurt, settled into the hours a company report is built from.
Figure 1. One hour of practice, from the booking to the company report, and where AWS comes in. Source: TEEI, captured from the public tour of TEEI Language and Evenhall’s public demo on 15 October 2026, and from a live Amazon Chime SDK meeting with demo personas on 14 October 2026. All data shown is sample data.

All of that exists for conversations like the ones Oksana K. describes.

Figure 2. Oksana K., a TEEI Language participant, on real conversations with real people, at the times and on the days that suit her. Source: TEEI, a film recorded with Oksana K.’s consent; this square cut rendered on 22 September 2026.

One of TEEI’s volunteers works at AWS. In a career film for TEEI Mentorship, Dana A. tells people starting out in software how she got there.

Figure 3. Dana A., a TEEI volunteer who works at AWS, on teaching herself to code, and on starting projects and applying for jobs before you feel ready. Source: TEEI, a film recorded with Dana A.’s consent; this square cut rendered on 22 September 2026.

At a glance

Table 1. TEEI on AWS in figures.Read from the live account on 14 October 2026; the note says what each figure covers.
MeasureFigureNote
Account
AWS accounts1every Region below sits in the same account
Regions in use4Ireland for almost everything; Frankfurt for video control, attendance and an off-Region backup; London for a video test environment; Oregon for device testing only
CloudFormation stacks46written in AWS CDK (TypeScript)
Compute
AWS Lambda functions8264 in Ireland, 10 in Frankfurt, 8 in London
Lambda invocations288,872in the 30 days to 14 October
Live video and captions
Amazon Chime SDK attendee-minutes142,5361 July to 13 October 2026
Amazon Transcribe streaming audio27,074 sthe same period, about seven and a half hours of captions
AI
Models in product features2Claude Sonnet 4.6 and Claude Haiku 4.5 on Amazon Bedrock, through the EU cross-Region inference profile
AI checks live for participants5each with a named final decision maker, below
Amazon Bedrock Guardrails checks72,427in 30 days, input and output
Monitoring and builds
Amazon CloudWatch alarms176with 100 log groups and one dashboard
AWS CodeBuild builds9,751all on record; the lane was switched off on 11 October 2026

How it is put together

One account, three working Regions. TEEI uses a single AWS account. Ireland holds the API, the functions, the tables, the AI calls, the monitoring and the build machine. Frankfurt is where the Amazon Chime SDK control plane runs for TEEI’s meetings and where meeting events arrive, so attendance processing, an independent evidence trail and an off-Region copy of the database backups sit there. The audio and video themselves flow through the Chime media service in Ireland. London holds a separate video test environment, a complete second copy of the video path built for end-to-end testing. Oregon holds no deployed resources: AWS Device Farm there gives remote access to real iPhones for testing.

Diagram of TEEI's one AWS account. Browsers and phones send audio and video directly to the Amazon Chime SDK media service in Europe (Ireland). TEEI's platforms on Cloudflare Workers, which hold no AWS keys, reach AWS through one signed door, Amazon API Gateway in Ireland, and Europe (Frankfurt) sends meeting events and watch results back to them. Ireland holds almost everything, from Amazon Bedrock and 64 Lambda functions to 159 alarms and the build machine. Frankfurt holds meeting control, meeting events, 10 Lambda functions and the backup copy. London holds a video test environment, and Oregon nothing deployed. Turso, Cloudflare Access, GitLab CI and ElevenLabs sit outside AWS.
Figure 4. One account, four Regions: almost everything in Ireland, meetings and events in Frankfurt, a video test environment in London, and only device testing in Oregon. Source: TEEI, drawn from our AWS infrastructure code and a read-only sweep of our AWS account, 14 and 15 October 2026.

Everything is code. The whole estate is one AWS CDK project in TypeScript. Six stacks are built on every deploy: the foundation (encryption key, buckets, budgets, the alert topic), the data stack (DynamoDB tables, an event bus, the analytics store, the database export bucket), the launch stack (the API and nearly every product function), the alarm stack, and two attendance stacks in Frankfurt. Every other stack, from monitoring to build lanes to database hosts, needs an explicit flag at deploy time, so a plain deploy cannot bring anything up by accident. Four small CDK apps sit beside the main one: the video test plane and evidence trail, two PDF renderers, and the security sources. 46 stacks exist today, 40 in Ireland, 4 in Frankfurt and 2 in London.

One signed door. TEEI Language, Skills Academy and TEEI Mentorship run on Cloudflare Workers, and those Workers hold no AWS keys. Every call they make to AWS is an HTTPS request to one Amazon API Gateway HTTP API with 32 routes. Every request is authenticated before a product function runs. The credential never carries a person’s account id or email address. The authorizer ran 25,101 times in 30 days. It is kept warm with provisioned concurrency, and so is the video-session function, so the first join of the morning does not wait for a cold start. A separate health route lets every deploy prove that the Workers and AWS agree on the signing keys before it goes live; it answered 17,474 times.

A few narrow exceptions. Some renderers (share cards and the company contribution reports) are reached through Lambda function URLs with AWS IAM authentication. Each caller holds a credential that can do one thing: invoke that one function. A small number of other narrowly scoped credentials serve staff tools. Evenhall calls Amazon Bedrock with its own credential, through the EU cross-Region inference profile.

Most of the work is watching. Of the 288,872 Lambda invocations in the 30 days to 14 October, about half delivered findings to the team’s board or watched the platforms from outside. The signed door and its health route took about one in seven. The AI functions, the five checks described below included, made 331 calls between them.

Horizontal bar chart of 288,872 AWS Lambda invocations in the 30 days to 14 October 2026, by what the functions do. Findings to the team's board lead with 88,507, then monitoring from outside with 53,896, the signed door and health route with 42,575, and attendance and receipts with 40,471. The AI checks, practice and speech functions, marked in the accent colour, made 331 calls across 11 functions.
Figure 5. AWS Lambda invocations in 30 days, grouped by what the functions do. The AI functions are marked in the accent colour. Source: TEEI, from Amazon CloudWatch, the Invocations metric of all 82 functions from 14 September 14:00 to 14 October 14:00 UTC, read on 15 October 2026 at 06:09 UTC.

Live video and captions

Every TEEI Language and TEEI Mentorship session, one-to-one or in a group, is an Amazon Chime SDK meeting, and so are Skills Academy’s live sessions. When a person opens the session room, the Worker first checks that they belong in that booking. Only then does it ask the video-session function for a meeting and an attendee token. The function creates or reuses the meeting, returns the token and keeps no state of its own. From that moment audio and video travel directly between the browser and the Chime media service in Ireland; none of it passes through TEEI’s servers.

In the 30 days to 13 October the video-session function ran 5,839 times, and Lambda recorded no execution errors. Use grew through the summer, from 215 attendee-minutes in the first full week of July to 17,036 in the week from 21 September; an attendee-minute is one person connected to a meeting for one minute.

Bar chart of Amazon Chime SDK attendee-minutes per week, Monday to Sunday, for the 14 full weeks from 6 July to 11 October 2026. Use rises almost every week, from 215 in the first week to a peak of 17,036 in the week of 21 September, and stands at 13,707 in the week of 5 October.
Figure 6. Amazon Chime SDK attendee-minutes per full week, July to October 2026. With the days before the first full week and after the last, the total from 1 July to 13 October is 142,536. Source: TEEI, from AWS Cost Explorer, the daily usage of Amazon Chime SDK attendee-minutes across every meeting in our account, read on 15 October 2026 at 06:08 UTC.

Voice Focus echo reduction ran on practically all of those minutes from August onwards.

The room’s small signals ride on Chime data messages: in-call chat, raised hands, reactions, and mute and away state. Screen sharing uses Chime content share, and a host can remove a participant. Live captions are Amazon Transcribe streaming, started through Chime. They are opt-in, and in a one-to-one session both people have to agree before captions start. Transcribe identifies the language being spoken, with English as the preferred language. Captions used 27,074 seconds of streaming audio from July to 13 October.

Chime media pipelines are set up to record a short story that both people have agreed to. A recording is capped at three minutes and stops the moment either person leaves. The feature is not open to participants.

Attendance: hours that start as meeting events

Chime publishes an event to Amazon EventBridge in Frankfurt whenever someone joins, leaves or drops out, and when a meeting ends. A rule forwards those events to a small Lambda that hands each one to the platform’s ingest route; a second rule does the same for the Language staging environment. The platform then settles attendance from the event history, after the session: the time both people were connected, a five-minute minimum, settled from half an hour after the scheduled end once the room is empty, waiting up to four hours past that end for a conversation that runs over. That settlement is what verified volunteer hours are built from.

Those hours belong to volunteers like Heidi B., who comes to every session with a topic ready.

Figure 7. Heidi B., a volunteer language partner in TEEI Language, on preparing each session and meeting her learners regularly. Source: TEEI, a film recorded with Heidi B.’s consent; this square cut rendered on 22 September 2026.

In the 30 days to 13 October the production forwarder ran 10,068 times. 33 attempts failed and were retried. An event that still fails lands in a dead-letter queue, and a drain function replays that queue every 15 minutes. On 14 October all 14 queues in the account, the 11 dead-letter queues included, were empty.

A third rule writes an independent receipt of the main Chime meeting events, eight types in all, into a versioned S3 bucket, with no names, email addresses or join tokens in it: 23,234 receipts in those 30 days. An audit can compare that trail with what the platform recorded. Every hour a canary checks that the routing rule still exists and is enabled, and sends a synthetic event all the way through (722 runs).

The test room: every room, opened in its roles

The London test environment also has a page of its own. It lists every room TEEI runs on Amazon Chime SDK, from the booked one-to-one session and the Speaking Café to TEEI Meetings and Skills Academy’s webinars: 25 rows on 16 October 2026. Nothing on it is typed in by hand. The page is computed when it loads, from the same code the rooms run: who may speak, who holds the host tools, whether captions are offered, how many video tiles are shown, and where TEEI’s settings differ from the SDK’s defaults, each with a link to the line of code that decides it.

Every room below opens with one press, signed in as one of the demo personas: the sample learners, volunteers and hosts from TEEI’s public tours. The environment has its own database, so no participant’s data is in it. The rooms are open to anyone reading this.

Test room · London · demo personas onlySkills Academy webinar, as a listener
A Skills Academy webinar in the TEEI test room, seen by a listener. On the left the room, hosted by Fatima Al-Sayed, with a Join the session button. On the right the AWS trace panel with its tabs Join, Media, Capabilities, Captions, Events, Settle and Fault path, open at Join, which lists each step of the join with its time.

One press

You are in the room as a listener, with the AWS trace open beside it.

Enter the webinar as a listener as the host

Open the host in one tab and a listener in another to see both sides.

Join, step by step measured 15 October 2026

  1. 1Who may enter0 ms
  2. 2Meeting lease95 ms
  3. 3Signed token0 ms
  4. 4API Gateway125 ms
  5. 5Meeting Lambda52 ms
  6. 6Mediayour browser, straight to Amazon Chime SDK
  1. 1The room. The host is Fatima Al-Sayed, a demo persona; you join muted, as a listener.
  2. 2One press joins. Step one, who may enter, is decided before anything reaches AWS.
  3. 3The AWS trace: Join, Media, Capabilities, Captions, Events, Settle and Fault path.
  4. 4The join token, decoded. The Worker removes the account id before it writes the trace.

Twelve rooms, one press each

All 25 rows, with the code behind each

everyone speaksthe host presentslisteners are invited up

Each button opens the room in a new tab, in that role. A running room is reused; if its demo personas are all in other rooms, you land on the overview and press again a few minutes later.

Once you are in, a panel beside the room shows what happened on AWS. A group room or a meeting lets you in as it opens; a one-to-one call waits for you to press Join:

  • Join: each step of the join with its timing, the AWS X-Ray trace id, and which function answered.
  • Media: packet loss, round-trip time, the video layer being received, the audio profile, and whether Voice Focus is on.
  • Capabilities: in a Skills Academy webinar, the UpdateAttendeeCapabilities call made when the host invites a listener to speak, as sent and as answered.
  • Captions: Amazon Transcribe captions in a one-to-one session, with a count of the caption bytes that passed through TEEI’s servers. The count stays at zero, because the captions reach the browser from Chime.
  • Events: every EventBridge event for the meeting, the fields the forwarder sends, what the ingest did with it, and its receipt in S3 once the independent rule has written it.
  • Settle: the attendance settlement, run for this one room at once instead of after the usual wait, with its outcome and the time both people were connected.
  • Fault path: in the test environment only, the ingest can be set to refuse the next event. A reader then watches that event refused three times, land in the dead-letter queue, and come back stored when the queue is drained.

Inside the trace

The Join tab of the trace: six steps from the click to media, each with its time, from who may enter to the meeting Lambda.
Join. Six steps from the click to media, each with its time and its answer.
The Capabilities tab: the UpdateAttendeeCapabilities call as sent and as answered, HTTP 200 in 133 ms.
Capabilities. The UpdateAttendeeCapabilities call when a host invites a listener up, as sent and as answered: HTTP 200 in 133 ms.
The Fault path tab: an Arm switch, the dead-letter queue count and a Drain now button.
Fault path. Armed, the ingest refuses the next event three times; it lands in the dead-letter queue, and Drain replays it.

Source: TEEI, captured in the London test environment on 15 October 2026, with demo personas only. Identifiers are removed from the images.

On 15 October 2026 a scripted walk with two browsers joined a Skills Academy webinar in the test room as host and listener, and passed all 23 of its steps. The listener raised a hand, the host invited them to speak, and the capability call answered with HTTP 200 in 115 ms. The meeting’s events arrived with their S3 receipts. An earlier walk the same day ran the fault path end to end: three refusals, the event in the dead-letter queue, and the event stored after the drain.

AI on Amazon Bedrock, and the checks around it

The AI checks at TEEI run on Claude Sonnet 4.6 in Amazon Bedrock, called through the EU cross-Region inference profile, so requests are processed inside EU Regions. The product functions share one configuration: that model, and a shared Bedrock guardrail at a pinned, numbered version. The infrastructure refuses to deploy a draft guardrail version.

Five AI checks run for participants today.

Volunteer screening. When someone applies to volunteer, the model reads the application at temperature zero through a forced tool and returns a structured verdict: a decision, red flags, ambiguities, positive signals, a confidence score and a seriousness rating. The application is passed to the model as untrusted data. Only the decision, the counts and the token numbers are recorded; the application text is not. Automatic approval is restricted to TEEI Language conversation partners who pass screening; mentors and course teachers always go to a person, whatever the verdict. 99 screenings ran in 30 days.

Chat safeguarding. The model flags chat concerns for staff, who decide how to respond. It never acts by itself. The message text is not recorded. 81 checks ran in 30 days.

The help assistant. It answers only from TEEI’s help articles and checks its citations against them before an answer is shown; when it cannot answer, the person is told so and can reach a member of staff. A question that touches on safety gets emergency guidance and no model text at all. On the public website the assistant answers only from four approved public FAQ lists. It sits behind the shared guardrail. 98 questions in 30 days.

Return plans. When a volunteer has been taken off the listings and submits a plan to return, the model reports what the plan contains: eight yes or no items, anything missing, and any red flags. It does not decide. Programme rules decide, and in the most serious cases a member of staff does. The model never relists anyone. There is a matching review for learners. Three reviews ran over the same 30 days.

The group practice guide. In group practice, the volunteer leading the session can ask for a guide pitched across the learners’ levels. The volunteer decides whether to use it.

Table 2. The five AI checks and who makes the final decision.
CheckWho makes the final decision
Volunteer screeningthe platform, automatically, only for Language conversation partners who pass screening; staff for everyone else
Chat safeguardingstaff
Help assistantthe assistant answers, and only with a surviving citation
Return plansthe platform’s policy, and staff at the strictest level
Group practice guidethe volunteer

A prompt cannot ship without a passing evaluation. Every check whose prompt decides something has an evaluation guard that runs when the infrastructure is synthesised. It fingerprints the prompt, the decision rule and the output contract. If any of them changes, the fingerprint no longer matches the committed evaluation receipt, and the deploy stops until the evaluation has been run again against Bedrock and has passed.

Table 3. The evaluation each check must pass before its prompt can ship.
CheckEvaluation on recordWhat it must achieve
Volunteer screening75 caseszero false automatic approvals, zero errors
Mentor screening94 cases, 360 callssafety cases refused in at least 80 % of runs, ordinary applications passed in at least 90 %
Chat safeguarding18 caseszero escapes, zero errors
Return plans (volunteers, learners)14 cases eachzero unsafe, zero harmful, zero failed
Level reading60 cases, five repeats, three separate setsexact level agreement of at least 0.75, never more than one band off, zero inflated levels under adversarial input
Practice reply17 cases, 34 sampleszero on every listed fault, from errors to leaked instructions

The last two guard features that are built but not open to participants. Our note on Practice Companion’s rooms describes all four rooms, how they are built on AWS and how the companion reads a learner’s level.

Three phone screens from Practice Companion. On the left, the Write room: the learner has written No, I working morning. Can after three?, and one correction appears under it, working to work, with the reason in a sentence. In the middle, the Say room: the receptionist's line, played by AI, then Say it in your own words and a line the learner could say. On the right, the level conversation at question three of six, with the learner's earlier answers and the companion's next question.
Figure 8. Practice Companion, the feature those last two evaluations guard. It is built and not open to participants. Source: TEEI, captured from Practice Companion’s rooms on our development server, with fixture data in place of a real learner, 18 October 2026.

The guardrails. The shared guardrail filters harmful content and screens prompts for attacks. It refuses medical and legal advice, blocks card numbers and passwords, and masks email addresses, phone numbers, bank account numbers and similar identifiers. Practice conversations have their own role-play guardrail with a lower violence threshold, because in testing the shared one blocked 4 of 35 harmless learner lines. Practice replies receive an additional safety check on their structured output.

In 30 days the guardrails ran 72,427 checks, 40,570 on input and 31,857 on output. The role-play guardrail ran about 48,700 of them and stepped in 37 times; the shared guardrail ran about 8,600 on its pinned version and stepped in 269 times. These totals cover every guardrail in the account, evaluation runs included, which CloudWatch counts alongside live traffic.

What is recorded. TEEI leaves Bedrock model invocation logging off, so its own account keeps no copy of prompts or replies. The product functions are built to record outcomes, counts and token numbers rather than text, and each one has a per-person hourly limit and a reserved share of concurrency.

Speech and media

  • Uploaded video. Participants and applicants upload testimonial, profile and work videos straight from the browser to Amazon S3 with presigned URLs (2,770 requests in 30 days). Each upload starts one AWS Elemental MediaConvert job that produces HTTP Live Streaming (HLS), an MP4 fallback and a poster frame, and a second function reports the result back to the platform: 867 jobs and 867 reports in 30 days. Deleting a video also cancels any job still running on it.
  • Photographed homework. A learner can photograph handwritten work and send it to the volunteer who asked for it, through its own bucket (389 requests).
  • Speech. Amazon Polly neural voices synthesised about 1,500 characters a month.
  • Voice practice. A WebSocket server for spoken practice runs on Amazon ECS on AWS Fargate behind an Application Load Balancer, one task for staging and one for production. The ElevenLabs Speech Engine, which is not an AWS service, dials it, and it answers with Claude Haiku 4.5 through the EU profile behind the role-play guardrail. It is open to staff only.

Events and analytics

The platform sends product events to AWS through an events proxy (739 calls in 30 days). An event logger writes each one to DynamoDB and to an S3 analytics store in date partitions (1,063 runs), which AWS Glue describes and Amazon Athena queries. An event never carries an account id. DynamoDB holds 14 tables in all, among them the consent log, pathway progress, rate limits and email suppression, with point-in-time recovery.

Data safety and the database move

The platform’s main database is Turso (libSQL), not AWS. AWS holds the safety copies: a nightly export to S3 kept for 180 days.

The database is moving to AWS. The new home is the libSQL server on an AWS Graviton instance in its own VPC with no inbound port at all; the only way in is through Cloudflare Tunnel and Cloudflare Access. Backups stream continuously to S3, and AWS Backup takes hourly, daily and monthly recovery points into locked vaults, with a copy in Frankfurt. Every new backup object gets an S3 Object Lock retention within seconds of upload. Every minute a canary proves from outside that a request without a token is refused and that Cloudflare Access stops a request with no credentials at all. There are two hosts: one has served a demo since 5 October, and one for production was created on 11 October. Production still runs on Turso. The three locked vaults held 53, 47 and 12 recovery points on 14 October.

Monitoring from outside

The platform runs on Cloudflare, so much of its monitoring deliberately runs on AWS, where a Cloudflare outage cannot silence it.

Table 4. The watches that run on AWS and their runs in 30 days.Grouped by how often each one runs.
WatchRuns in 30 daysNote
Every minute
Findings delivered as tickets61,535to the team’s board, and on events as well
Every five minutes
Video client-log collector17,282one run per programme
Portal watch from Frankfurt8,653public health, the internal scheduler heartbeat, and that each Worker can still sign in to AWS
Reliability monitor8,641external liveness, that the required alert rules exist, and that alerts are delivered
Independent snapshot collector8,640so the monitor never vouches for itself
CloudWatch Synthetics canary8,640through Evenhall’s public journey
Every hour
Observer720over Worker logs, error reports, product analytics and the support queue, with no model involved
Total114,111

Behind those sit 176 CloudWatch alarms, a bridge that turns AWS alarms into Sentry events, an inbound route for Sentry’s own alerts, and AWS X-Ray tracing on the product functions. The 21 most serious alarms, among them the API’s error rate, sign-in and video-session failures and the database guards, page the team by SMS through Amazon SNS.

Security and the account guard

  • AWS CloudTrail records every Region into a bucket under S3 Object Lock for a year, with write events on the database buckets.
  • Amazon GuardDuty is on; a high-severity finding pages the team.
  • Amazon Inspector scans the container images in Amazon ECR (13 repositories).
  • AWS KMS holds seven customer-managed keys: for data, for the two database hosts, for the Frankfurt backup copy, for signing build manifests, for signing release artefacts, and for signing published impact figures.
  • AWS Secrets Manager holds 63 secrets.
  • GitLab CI reaches AWS through OpenID Connect, with a narrowly scoped role and no stored key.
  • Public sharing of EBS snapshots is blocked for the account.
  • AWS Budgets watches the account with eight budgets.

Proofs, PDFs and images

  • Signed impact figures. Each published snapshot of TEEI’s impact figures is signed with an asymmetric AWS KMS key whose private half never leaves AWS, and a copy is kept in a bucket under S3 Object Lock in compliance mode for ten years. Nobody, TEEI included, can change or delete it in that time. A headless Chromium function prints the snapshot as a PDF with its digest and signature fingerprint in the footer (9 runs in 30 days).
  • Company contribution reports. Evenhall’s contribution report becomes a PDF in one of two renderers: WeasyPrint (11 production runs in 30 days), or Chromium printing the same component the company sees on screen, so the PDF follows the screen (36 production runs and 107 in staging).
Four pages of a sample company contribution report side by side. The cover reads Learning support, measured, for the sample company Horizon Technologies, with 36.90 measured volunteer hours. Page two, Contribution at a glance: 36.90 hours, 44 completed sessions, 20 learners reached, 5 countries and 4 languages, and how the count is reached from 52 bookings on file. Page three, Who contributed: six sample volunteers with their programme, sessions, measured hours and share of the hours. Page four, Monthly activity: completed sessions and measured hours for each month from January to September 2026.
Figure 9. The first four of nine pages of a contribution report, printed by the Chromium renderer from the component the company sees on screen. Source: TEEI, rendered on 16 October 2026 by Evenhall’s Chromium PDF renderer, run locally from its source, for an invented company with sample data only. The company and the volunteer names are the ones in Evenhall’s public demo. Record incomplete, on every page, is the report saying correctly that no filed record stands behind a sample.
  • Credential artwork. Every five minutes a function draws the artwork of each new credential and the look its holder chose, into Cloudflare R2: 4,364 production runs in 30 days.
A sample credential in the three forms the artwork function draws. On the left, an A4 certificate of volunteer service awarded to Moira Sinclair, Senior Language Volunteer, for 10 verified sessions with 4 learners in Ukraine, issued 14 October 2026, with the verification code at its foot. On the right, the square badge with the same facts over an evening photograph, and below it the wide card shown when the credential is shared on LinkedIn.
Figure 10. One credential, drawn three ways by the same function: the certificate, the badge and the share card. Source: TEEI, drawn on 16 October 2026 with the template the production function draws from, for a sample record. Moira Sinclair is a demo persona from the product tour, and the code is an example that verifies nothing.
  • Share cards. A volunteer can share a session they teach as a card in link, feed or story format. The production renderer was created on 13 October.

Build and release: the CodeBuild lane, and why it is off

From August to October 2026, TEEI verified release candidates of TEEI Language and TEEI Mentorship on AWS CodeBuild. An AWS Step Functions state machine per product fanned the work out in one parallel step: 15 jobs for Language and 12 for Mentorship. They covered quick preflight checks; API, route and server contracts; every database migration applied to a clean database; four shards of logic tests and two of database-heavy replays; four browser shards running the full Playwright release sweep; and two advisory lanes, a secret scan with a software bill of materials and a set of journeys that prove a save survives a reload. Each job ran in a container image pinned by digest against one exact S3 object version of the candidate. The commands were embedded in the state machine, so a run could not supply its own. The result was a manifest written exactly once and signed with an AWS KMS key. A separate release executor prepared and promoted releases. 9,751 builds are on record: 5,829 logic and contract jobs, 2,749 browser jobs, 766 security scans, 267 review publications, 99 release preparations and 20 promotions, and a few dozen more for the main site, Evenhall and the video test plane.

The off switch. We could not get the parallel lane to run reliably end to end. On 11 October 2026 TEEI switched it off. An explicit IAM deny forbids starting any lane state machine or CodeBuild project, and the release scripts in the product repository refuse before they make any AWS call. CodeBuild has recorded zero build minutes from 12 October.

The lane worked hardest just before it stopped. The week from 28 September ran 3,151 builds, about a third of everything on record, and the week of the switch-off still ran 1,850. No build has started since.

Bar chart of AWS CodeBuild builds per week, Monday to Sunday, from the week of 3 August to the week of 12 October 2026. Builds rise unevenly to a peak of 3,151 in the week of 28 September and 1,850 in the week of 5 October. A numbered marker on 11 October shows the lane being switched off, and the week of 12 October has no builds.
Figure 11. AWS CodeBuild builds per week, from the first build on 7 August until the lane was switched off on 11 October 2026: 9,751 in all. Source: TEEI, from AWS CodeBuild, the start time of every build on record (its projects are in Ireland and London), read on 15 October 2026 at 06:16 UTC.

What replaced it. The same job list, from the same lane definitions, now runs on one build machine: an Amazon EC2 m7i.8xlarge (32 vCPUs, with a 500 GiB gp3 volume at 16,000 IOPS) in Ireland, in the same account. Each job runs at the exact commit, results are reused only when the source tree, lockfile, job script and lane definitions all match, and the deploy accepts the manifest it writes. The machine runs from 06:00 to midnight Oslo time on an Amazon EventBridge Scheduler schedule.

The CodeBuild projects, images, roles and state machines are still deployed, switched off rather than deleted.

Built, not yet open

Table 5. Product features built on AWS and not yet open to participants.
PartState on 14 October 2026
Practice conversation, level conversation, Skills Academy feedback, recorded storiesbuilt, behind flags, not open to participants
Mentor profile, career advicedeployed, no calls in 30 days
Voice practiceopen to staff only

Practice conversation and the level conversation open only after they pass L2SAFE, the benchmark TEEI Research built to test whether a model understands and answers a question as safely in learner language as in fluent language.

The rest of the plumbing

Table 6. The other AWS services and what each one does at TEEI.
ServiceWhat it does at TEEI
Amazon EventBridge72 rules in Ireland, 7 in Frankfurt and 7 in London: alarm routing, findings, database guards, the Chime event rules, and the schedules that drive the watches above
EventBridge Schedulerfive schedules: credential artwork (twice), the observer, and the build machine’s morning start and night stop
AWS Step Functionsseven state machines, kept from the CodeBuild lane
Amazon SQS and Amazon SNS14 queues, all empty on 14 October; eight topics for alerts
Amazon ECS, Elastic Load Balancing, Amazon VPCthe voice practice service; three load balancers; five VPCs, no NAT gateways
Amazon EC2three instances: the build machine and the two database hosts
Amazon S343 buckets, seven of them under Object Lock
AWS Certificate Managerfour certificates, all in use

Frequently asked questions

Where does TEEI's product AI run?

On Amazon Bedrock, through the EU cross-Region inference profile, so requests are processed in EU Regions.

Does an AI decide who can volunteer?

Only for TEEI Language conversation partners on a clean pass; mentors and course teachers always go to a person.

Does TEEI keep the chat messages that are checked?

No. Bedrock invocation logging is off and the check records a rating and counts, not the text.

Why did TEEI move releases off CodeBuild?

We could not get the parallel CodeBuild lane to run reliably end to end. The full release verification now runs on an Amazon EC2 instance in the same AWS account, with the same job list.

More in Research & Engineering