← All work
EdTech · programming educationSole product engineer and architectIn production

Kodio

A self-grading coding classroom

Next.js 15
TypeScript
PostgreSQL / Prisma
NextAuth v5
Sandboxed code execution
AI tutoring
i18n (TR/EN)
Docker
The core loop — editor, visible and hidden test results, and the XP the submission earned.
The core loop — editor, visible and hidden test results, and the XP the submission earned.

Kodio is a bilingual programming-education platform that assigns coding work to a class, grades every submission automatically inside a sandbox, and coaches students through failures without handing them the solution.

Client context

Kodio is the coding platform of Fennaver Akademi, a Turkish academy teaching programming fundamentals in C, Python, JavaScript and C++. The audience is beginner-to-intermediate students, most of them working in Turkish, taught in cohorts that move through material together on a schedule.

The operational challenge

Teaching programming at cohort scale creates three problems that no amount of lecturing solves.

Grading does not scale. Every student submits code that has to be compiled, run against several inputs, and compared to expected output. Doing that by hand for a class, every week, is the single largest time sink an instructor has — and it is the work that most delays feedback, which is exactly when feedback matters most.

Deadlines and access are administrative, not pedagogical. Instructors need a specific challenge to open for a specific class, at a specific time, close at a specific time, and produce a record of who completed it and who did not. Generic learning platforms treat this as a spreadsheet exercise bolted onto the content.

Beginners get stuck alone. A student who is blocked at 11pm has three options: guess, give up, or paste the problem into a chatbot that hands back a complete solution and destroys the learning. None of them produce a programmer.

Product strategy

The platform was built around one principle: the feedback loop, not the content library, is the product. Content is cheap; a system that reliably tells a beginner what is wrong with their code within seconds — and an instructor who did what, when — is not.

Three decisions followed from that:

  1. Execution is a commodity, so it must be replaceable. Code runs in an external sandbox (Piston as the primary engine, Judge0 retained as a fallback for legacy challenges), behind an internal service interface. Neither engine is allowed to leak into the domain logic.
  2. AI is a tutor, not an answer key. The assistant is deliberately constrained at the prompt level rather than left to behave like a general chatbot.
  3. Cohort visibility is a data-model concern. Class membership lives on the user as tags, and assignments snapshot their recipients — which is what makes historical reporting trustworthy.

The core solution

Assignment-driven delivery. An instructor selects a challenge, sets a start and end time in Europe/Istanbul, and targets either individual students or a class tag. The service expands that tag into an explicit recipient list, notifies each student in real time over Server-Sent Events, and enforces access at submission time: outside the window or outside the recipient list, the API refuses the submission. A later syncRecipients call folds in students who joined the class after the assignment was created.

Automated grading with tolerant comparison. Every submission is executed against all test cases — visible and hidden. Raw string equality is a poor grader for beginners, so challenges declare an output format: exact, trimmed, lenient (normalises line endings, trailing whitespace and blank-line runs) or numeric_only, plus an allowExtraOutput flag for learners who print prompts alongside their answer. The runner also detects a class of failure specific to C: a process killed by SIGKILL after producing no output is reported with a plain-language explanation about unflushed stdout instead of an opaque crash.

A Socratic AI tutor. When a challenge enables it, students get an assistant that receives the challenge description, their current code, the hint list and — importantly — their latest failing test results. Its system prompt forces a diagnose-first, four-level scaffold: nudge, conceptual hint, a 2–5 line partial pattern, then guided pseudocode. It is explicitly forbidden from producing a complete solution, from writing snippets longer than five lines, and from revealing hidden test cases. It answers in Turkish or English to match the learner. Six providers sit behind one interface with an automatic failover provider, and responses stream token-by-token.

Structured learning journeys. Beyond one-off challenges, the platform ships guided paths — a Turkish Python journey of 27 topics, and an equivalent C journey — where each topic is read → quiz → coding challenge, and the next topic unlocks only when both the quiz and the challenge are complete.

Motivation mechanics that are actually wired to the work. XP scales with difficulty, decays with repeated attempts (0.9^(attempts-1)), and pays a speed bonus under five minutes. Levels follow floor(sqrt(xp/100)) + 1. Streaks are computed on UTC calendar days with unit-test coverage for the break/continue edge cases, and achievements, weekly/monthly XP tables and a cached leaderboard hang off the same events.

My role

Sole product engineer and architect: product definition, data modelling, the entire Next.js 15 / TypeScript / Prisma codebase, the execution and AI service layers, the admin console, Turkish/English localisation, and the Docker/Nginx deployment. Roughly 26,000 lines of TypeScript across 159 files, 47 API route handlers and 23 database models, taken from first commit to production in about three months.

Technical approach

Outcomes and evidence

The platform runs in production and its public sign-in page reports 41+ challenges and 109+ registered students. Product analytics and in-app satisfaction surveys are live in the production build.

Operationally, the system now provides what the manual process could not:

No adoption, revenue or learning-outcome improvements are claimed here; those figures were not measured.


Need a similar product or workflow? If you are turning a manual, cohort-based process into a platform — automated evaluation, timed assignments, role-based access and an AI layer that has to behave — I build these end to end.

Screens

The Socratic tutor receives the challenge, the student's code and their failing tests — and is forbidden from producing a complete solution or revealing hidden tests.
The Socratic tutor receives the challenge, the student's code and their failing tests — and is forbidden from producing a complete solution or revealing hidden tests.
The buyer-facing outcome — who finished, on time or late, exportable as CSV.
The buyer-facing outcome — who finished, on time or late, exportable as CSV.
Guided journeys where the next topic unlocks only when both the quiz and the coding challenge are complete.
Guided journeys where the next topic unlocks only when both the quiz and the coding challenge are complete.
Each topic runs read → quiz → coding challenge.
Each topic runs read → quiz → coding challenge.
The student dashboard — assignments, streaks and level progress.
The student dashboard — assignments, streaks and level progress.
XP scales with difficulty, decays with repeated attempts and pays a speed bonus under five minutes.
XP scales with difficulty, decays with repeated attempts and pays a speed bonus under five minutes.
The production sign-in page and the counters it publishes itself.
The production sign-in page and the counters it publishes itself.

Produced against a local instance with fictional demo data, except the public production sign-in page. No student data appears in any published asset.

Architecture

System contextscroll to explore
Assignment to graded submissionscroll to explore
← Back to all work