Inspiration
For most of high school, I noticed the same pattern. Tests would come back days, sometimes weeks, after we wrote them. I later realized it wasn't because my teachers didn't care. It was because they cared too much to rush it. Many of them wanted to coach the volleyball team, run clubs, or simply go home to their families, but instead they spent their evenings hunched over stacks of paper, marking long after the school day had ended. By the time our feedback finally reached us, the lesson had already moved on. I wanted to build something that gives teachers that time back, so they can be at the game, at the dinner table, and still hand back tests while they still matter.
U mark less. U teach more.
What it does
UMarkless is an Android app that marks paper tests from a photo. A teacher snaps a picture of a handwritten test (or uploads a PDF), and within minutes almost every question, including open-ended handwritten responses marked against a rubric, has a score and a short written reason explaining it. If a response is questionable, it gets set aside so the teacher can review its marking comments. That reason matters to me more than the score itself, because it means a teacher can read the AI's thinking and disagree with it instead of just trusting a number.
It also knows when to step back. If a question includes a diagram, it gets an amber "?" rather than a guess. And if a student reaches the right answer through a different method, it gets flagged so the teacher can take a look.
For a whole class, a teacher can include an answer key to make marking fast and cheap. Without one, UMarkless marks the first paper carefully, learns the key from it, and uses that for the rest of the class. Marked tests can be saved automatically to Google Drive as Google Docs if the teacher turns that on. Student names never leave the phone; only anonymized answers are sent for marking.
How it makes money
I chose not to have a free tier or ads. Every test costs me real money to mark, so a free tier would lose money on every teacher who never upgrades. Ads wouldn't fix that either. Teachers open the app to mark a stack of tests, not to scroll for hours, and a teacher marking their students' work shouldn't have to sit through ads to do their job. Instead, teachers get a 7-day trial (approximately 30 tests), and every plan after that is priced above what it actually costs me to run.
There are three monthly plans: Starter is $6.99 for approximately 120 tests, Pro is $14.99 for approximately 400 tests, and School is $24.99 for approximately 900 tests. Every plan is also available as a discounted annual plan. All of the plans and the paywall run through RevenueCat.
Marking with an answer key costs me around 1.5¢ per paper. Even the School plan, the cheapest per test at $24.99 for approximately 900 tests (about 2.8¢ each), still covers its costs after 10% of every subscription goes back to charity. During the trial, a small line in the app shows how much free marking is left ("68% of your free marking used") and disappears once a teacher subscribes.
How we built it
The app is built in Flutter and tested on a Pixel 7. Supabase handles sign-in (including Google), the database, and the server functions. RevenueCat runs the subscriptions, the Plans screen and Customer Center, and a webhook on the server updates each teacher's plan when they buy.
For the marking itself, Claude handles handwriting and open-ended answers, while simpler questions with an answer key go to a cheaper open model. Every mark is logged with what it actually cost, so my prices are based on real numbers rather than guesses.
Challenges we ran into
The biggest problem was cost. My first version cost about 12¢ to mark a single paper, which made an affordable subscription impossible. Routing keyed questions to a cheaper model, and learning the key from the first paper in a class set, brought that down to around 1.5¢.
The second was getting the AI to admit when it wasn't sure. Its instinct is to answer confidently no matter what, and teaching it to flag diagrams and questionable answers instead of inventing a score took far more work than I expected. Real handwriting was its own challenge too; pen on paper, photographed at an angle, is much less forgiving than a clean PDF.
I also ran into payment problems I didn't know existed. RevenueCat purposely crashes release builds that use a test key, and I realized a webhook that trusted test purchases would let anyone unlock a paid plan for free, so the server now ignores them by default.
Accomplishments that we're proud of
I'm proudest of how quickly UMarkless turns a stack of tests into marked, explained results. What used to take a teacher an entire evening now takes minutes, and it works across subjects, from math and science to language classes. What meant the most, though, was handing it to a real teacher to test. Their reaction was, "This is cool, it works just like you told me it would." Hearing that from someone who marks tests every week told me I was building something that matters beyond a hackathon.
What we learned
The biggest lesson was that an honest AI is worth more than a confident one; accuracy means very little if a system can't recognize its own limits. I also learned how much thinking goes into a business model, from unit costs to deciding between a trial and a free tier, and I learned mobile payments and Supabase from the ground up.
What's next for UMarkless: AI Test Marking for Teachers
A few teachers at Thornlea Secondary School, Thornhill Secondary School, and Dr. Roberta Bondar Public School are already testing it. The Android app is being submitted to Google Play. The same Flutter code can run on iPhone, but the iOS build isn't working yet, and I'm waiting on an Apple developer account to test and fix it, so the App Store version will follow. After that, I plan to expand to more subjects and curricula beyond Ontario.
Built With
- android
- anthropic
- artificial-intelligence
- claude
- dart
- deepseek
- flutter
- google-cloud
- google-drive
- google-oauth
- ocr
- postgresql
- revenuecat
- supabase
Log in or sign up for Devpost to join the conversation.