product
Edactly
A teaching platform for Indian schools whose tutor would rather say nothing than say something wrong.

Schools in India already had access to AI. What they did not have was AI a teacher could trust in front of a class. The failure mode that matters in a classroom is not a slow answer, it is a confident wrong one, delivered to thirty children who have no way to check it.
So Edactly is built around a refusal. The student tutor retrieves against an NCERT-aligned library, and when a question falls outside the syllabus it says so rather than reaching for something plausible. There is a similarity floor below which it returns nothing at all.

That screenshot is a real exchange, not a mock-up. It shows the behaviour the whole product rests on: a tutor that teaches rather than answers. Handing over “friction” would have been trivially easy and completely useless.
Two products, one estate
Edactly and ZoodleMe are separate products sharing a single AWS estate, and keeping that estate small was a deliberate constraint rather than an accident.
- 7
- LambdasAPI, extraction, and the generation workers
- 26
- Alembic migrationsCI fails if models and migrations disagree
- 1,600
- users on ZoodleMethe sibling product on the same platform
The whole thing is Terraform — every Lambda, the API Gateway, RDS, Cognito, the buckets, the scheduler, and the OIDC roles CI assumes to deploy. Nothing was clicked into existence in a console, which means the estate can be read, reviewed and rebuilt.
One decision I keep being asked about: the Lambdas sit outside any VPC. A NAT Gateway would have cost more per month than the database it was protecting, so instead the database enforces TLS, uses scram-sha-256, and has a forty-character generated password. That is a trade I would make again at this size and revisit the moment there is a second database worth isolating.
The gate I am most glad I built
CI fails the build when the SQLAlchemy models and the Alembic migrations disagree.
It sounds fussy. It has caught the specific, miserable class of bug where a model gains a column, nobody generates the migration, and everything works locally until the deploy — at which point the failure surfaces as a query error in production rather than a red build.

Where it actually stands
The platform is live and the pilot with a first school has not started yet. I would rather say that plainly than imply a user base that does not exist. What exists is the product, the estate it runs on, and a tutor that has been taught when to keep quiet.