
Teachers won’t be candid if they can be identified
Our client works with schools across the country, and it kept seeing the same pattern: trust and satisfaction between educators and the people who run their schools were low. It wasn’t a handful of bad schools. It was a national trend. They hired D2 Labs to develop the concept with them and build the platform: a way to collect feedback from educators anonymously, track it over time, and show school leaders the real problems in their workforce at a glance.
Before MyVoice, the usual channel was a town hall: educators and leadership in a room together, often on a planning day. The trouble is the room. Teachers get nervous about being completely honest face to face, in front of their peers and their supervisors, so the hardest problems tend to stay unsaid.
The whole thing depends on honesty. A teacher who thinks their principal could work out who said something will soften it or say nothing. Anonymity is what lets real change happen, and the system is what carries it through, taking the discomfort out of the process. So the guarantee had to be real, which meant building it into the architecture from the start instead of adding it later.
A score, a plan, and proof it worked
One indicator, two school years.
Drag through the timeline to follow one indicator at one school, from a falling score to a plan and back.
Every teacher at North Ridge High rates the 48 statements. Indicator 5.1, about the freedom to make classroom-level decisions, averages 3.62.
The next round of ratings brings 5.1 down to 3.48. Leaders see the trend as soon as it shows up, in the view their role allows.
At 3.30, 5.1 is now the lowest-scoring indicator at the school, so it is the first card a leader sees when they open the plan wizard.
The leader picks 5.1 and adds a sentence of context. The agent drafts “Expanding Teacher Autonomy in Instructional Decision-Making,” and it goes live as a goal tied to 5.1.
5.1 rises to 3.41. The plan is tracked against the score it was written to move, so the leader sees the change without building a report.
Another round of ratings, and 5.1 is at 3.58, nearly back to where it started.
At 3.71, 5.1 is no longer the school’s lowest indicator. The next lowest one opens the plan wizard, and the loop starts again.
Illustrative. The scores are demo data, not results from a real school.

The inventory comes from our client’s research into what drives school culture. It covers ten areas, from how clearly a school communicates its direction to whether teachers feel they belong there. Each area is measured by four to six plain statements, and those statements are the indicators the rest of the platform works from.
MyVoice calls the plans solution plans. A solution plan is something a district rolls out to its workforce, with a cause it addresses and a goal it can measure. Holding more frequent town hall meetings because the district expects them to raise how teachers rate collaboration is a typical one.
The agent doesn’t write a plan and hand it over. Leaders build plans in a wizard. It opens on the district’s top quantitative issues, and the leader picks the ones they want to change. From there the agent works alongside them, suggesting goals based on those metrics and drawing on the district’s solutions library: plans the district has used before, saved as reference. Then it walks the leader through the rest: which schools the plan applies to, how it will be tracked, when it goes live, and who can edit it. What comes out is a live goal inside the platform, not a document.

What I built
I’ve been the only engineer on MyVoice since 2022, responsible for discovery, architecture, implementation, validation, and the long-term support that follows.
The stack is deliberately plain. MyVoice is a Next.js app backed by Postgres, and we host it ourselves on AWS Lambda. The agents run on Claude through Anthropic’s SDK.
- The inventory, anonymous messaging, and role-based trend reporting.
- Production agents that work with leaders to turn low scores into solution plans.
- Solution plan tracking, tied to the scores each plan is meant to move.
- A national data viewer and query system over a multi-tenant architecture, where each district’s data is kept separate on shared infrastructure.
Where anonymity is enforced.
Select a part of the system. Below the line, MyVoice knows people only by their anonymity ID.
New ratings show whether the plan worked.
Everyone signs in to a Next.js app we host ourselves on AWS Lambda. The account knows who a person is and what role they have. What they submit leaves it under an anonymity ID instead.
Every user has an anonymity ID, and it is the only identifier their ratings and messages carry past this point. Reporting, the agent, and the national view are all built on anonymity IDs, so none of them has anything that leads back to a person.
Inventory ratings and anonymous messages are saved against the anonymity ID, never the account. Multi-tenancy is built into the architecture, so each district’s data stays separate on shared infrastructure.
Leaders see the trends their role should see as soon as they appear. A result is only reported when enough people contributed to it, with the minimum set for each district, so a small department’s average can’t be traced back.
The agent runs on Claude through Anthropic’s SDK. It reads feedback the system has already summarized, never raw messages or where they came from, and uses tools to search the district’s solutions library. Evals in CI check its guardrails and how it uses those tools.
Our national data viewer queries across tenants to show trends like teacher happiness, retention, and student success across districts and states. It is built from the same anonymized data as every school report.
The plan a leader builds with the agent becomes a live goal inside MyVoice. New ratings come back in through the same boundary and show whether it worked.
Anonymity is part of the data model
Promising teachers anonymity in the interface isn’t enough. It has to hold everywhere the data goes, including places nobody thought about when the promise was made.

So in MyVoice, anonymity is decided by how scores are stored. Every user has an anonymity ID, and that ID is what their responses are saved against. Reporting works only with anonymity IDs, which keeps individual people out of every report.
That matters most at the top. Because multi-tenancy is built into the architecture, D2 Labs can look at trends like teacher happiness, retention, and student success across districts and states from one national view. That view is built from the same anonymized data, so the guarantee a teacher gets in one school still holds when their scores become part of a national number.
Hiding names isn’t enough on its own. If a department has three teachers, its “anonymous” average is easy to trace back. So the data system won’t report a result unless enough people contributed to it, with the minimum sample size set for each district.
The agent never sees who said what
The simplest way to keep an agent from revealing a source is to never give it one. The agent doesn’t know where any piece of feedback came from. It only sees feedback the system has already summarized, so it has nothing identifying to leak, even by accident.
The rest of the agent’s behaviour is checked by evals (automated tests of its output) that run in CI, on every code change. One set covers guardrails, meaning the edge cases we never want to see in production:
- Drifting into topics that have nothing to do with the user’s school or district.
- Producing output that doesn’t match the schema the application expects, which would break the plan it’s building.
A second set checks the quality of the work, and it exists because of a real failure. Early on, the agent was suggesting fairly generic solutions. It had tools for searching the district’s solutions library, but it often didn’t use them, so the plans it proposed ignored what that district had already tried.
To fix it, we built a series of increasingly complicated requests into the eval suite and tuned when the agent calls its tools, and in what order, until the solutions library was actually applied. Those cases now run in CI with the guardrail checks, so a change that makes the agent generic again fails before it ships.
Six states and counting
MyVoice first rolled out in late 2022 through our client partnership. It now reaches about 20,000 educators in about 200 districts across six states, and it’s still expanding.
Much of that growth comes from people who use the product. District champions in Georgia and Arizona bring new districts onto the platform in their states. We also have a strong presence and connections in the public sector, and a busy pipeline of new states.
Districts use it for real planning, too. On average a district creates two or three solution plans a semester, which adds up to hundreds of plans across the platform. Most are large plans tracked over a long period, not quick fixes. On average, the workforce happiness metrics we track go up at schools that use MyVoice.