
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 theme, a plan, and proof it worked
One theme, two school years.
Drag through the timeline to follow one theme at one school, from rising mentions to a plan and back down.
Teachers at Lincoln Middle School share what’s affecting their work. MyVoice groups the responses into themes, and Coverage & planning time comes up 9 times.
The spring pulse brings 23 mentions. Leaders see the theme rising as soon as it shows up, in the view their role allows.
At 42 mentions across nine teams, it is the fastest-growing theme at the school, and the agent’s summary leads with it.
The agent drafts an action plan for a rotating coverage schedule. The leader reviews and approves it, and the staff who raised the theme get an update saying what will change.
Mentions fall to 24. The plan is tracked against the theme it answers, so the leader sees the change without building a report.
Another pulse, and mentions are down to 13, close to where they started.
At 6 mentions, coverage is no longer a theme leaders need to act on. The next rising theme gets a plan, and the loop starts again.
Illustrative. The counts are demo data, not results from a real school.

Feedback comes in through pulses: short check-ins a school runs through the year. Staff pick what their feedback is about, describe what’s happening in their own words, and can say what would help. MyVoice groups the responses into themes and tracks how often each one comes up from one pulse to the next, so leaders can see what’s rising, what’s holding steady, and what’s easing.
MyVoice calls the plans action plans. An action plan answers one theme with a goal, a set of actions, an owner and due date for each, and a way to tell whether it worked. A rotating coverage schedule, because teachers keep losing their planning periods to cover for absent colleagues, is a typical one.
The agent doesn’t write a plan and hand it over. It reads what staff said about a theme, finds the patterns behind it, and drafts a plan for a leader to review. The leader can regenerate it, edit it, or approve it and assign the actions. What comes out is a live plan inside the platform, tracked step by step, not a document.
Approving a plan also closes the loop. The draft includes an update for the staff who raised the theme, and once it’s approved they can see what their school is doing about it, follow its progress, and say whether a finished plan is helping. The next pulse shows whether the theme is easing.

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.
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.
- Pulses, anonymous feedback, and theme reporting scoped to each role.
- Production agents that summarize what staff are saying and draft action plans for leaders to review.
- Action plan tracking, with updates that go back to the staff who raised each theme.
- 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.
The next pulse shows 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 responses 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.
Pulse responses 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 themes their role should see as soon as they emerge. A result is only reported when enough people contributed to it, with the minimum set for each district, so a theme raised by a small team can’t be traced back.
The agent runs on Claude through Anthropic’s SDK. It reads responses saved against anonymity IDs, never names, accounts, or where a response 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 the agent drafts and a leader approves is tracked inside MyVoice, and the staff who raised the theme get an update. The next pulse comes back in through the same boundary and shows 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 responses 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 responses become part of a national number.
Hiding names isn’t enough on its own. If a team has three teachers, a theme that only comes from that team 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 responses saved against anonymity IDs, with no names or accounts attached, 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, the plans it had used before, saved as reference, 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 action 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.