NetKoçum
Study tracking for Turkish university-exam (YKS) students and their coaches: finds weak topics, plans the week and links official resources to the exact page
- Role
- Product, backend, frontend & infrastructure (solo)
- Period
- 2026 —
- Status
- Live
- Links
- Visit site ↗
By the numbers
7,6007,600 - original questions with explanations
177177 - official resources, linked to the page
487487 - topics mapped across two curricula
674674 - automated tests (unit + integration)
Overview
netkocum.com is a platform where a student preparing for Türkiye's university entrance exam (YKS) logs what they study, and the system works out which topics are weak and what to focus on this week. Mock exams, a mistake box, a review schedule, a weekly plan and a bank of 7,600 original questions live in one place, and the student's coach sees the same screens. I built every layer myself, from idea to launch.
- Rules engine: 12 risk rules run over a snapshot of the student (topic states, the last 35 days of logs, mock exams, mistakes) and raise alerts such as accuracy bands, overdue reviews, blank rate and net drops, each with a suggested next step.
- Automatic weekly plan: picks overdue reviews, low-accuracy topics and the next new topics by their weight in the exam and spreads them over the week; the coach edits and publishes the draft. A catch-up estimate compares the last four weeks' pace with the pace needed before exam day.
- Official resource catalogue: 177 free MEB and ÖSYM publications with 2,089 topic mappings, each link opening the PDF at the page where the topic starts. No content is copied; only the link and page number are stored.
- Question bank: 7,600 original questions with explanations across 25 TYT and AYT subjects. Topic tests favour unseen and previously missed questions; there are grade-level (9-12) tests, a daily challenge and a speed round.
- Two curricula side by side: the 2018 programme (YKS 2027) and the new Maarif model (YKS 2028+). MEB's 2026 programmes were read subject by subject and each of the 487 topics was mapped; a student's programme follows their exam year.
- KVKK (Turkish GDPR): privacy notice and explicit consent, parental consent under 18, data export and account deletion; coach access is visible to the student and logged. Data stays on a server in Türkiye.
Screens

Today: streak, points and last-7-day accuracy; the day's tasks with the official resource and page, plus mistakes and topics due for review. 
Topics: TYT/AYT and grade (9-12) filters, a coverage bar and the catch-up estimate. 
Topic detail: the next recommended MEB test, official resources that open at the topic's page, ÖSYM questions per year and the 1-3-7-21 review schedule. 
Weekly plan: review, re-study and new-topic tasks proposed by the rules engine; the coach edits and publishes. 
Self-test: topic tests from a bank of 7,600 original questions, a daily challenge and a speed round; each answer is checked instantly with an explanation. 
Mock exams: TYT/AYT net-score trend, the target line and correct/wrong/blank per section. 
Progress: the "Will you make it?" estimate (last four weeks' pace vs. the required pace), weekly quests and a study heatmap. 
Coach panel: alerts derived from the student's logs with a suggested next step, meeting notes and the path to the target.
01
Problem
Most students preparing for YKS keep their study log in a notebook or a spreadsheet. The record exists but no decision comes out of it: the student has to work out alone which topic is weak, which review is overdue and what to prioritise this week. The coach only learns what happened at the weekly meeting.
MEB and ÖSYM publish free, good-quality material, but it is scattered across PDFs hundreds of pages long. A student has to know which book and which page to open for, say, derivatives.
On top of that the curriculum changed: starting with grade 9, schools moved to the new Maarif model, topics shifted between grades and some were dropped. In the same year, grade 12 studies the old programme and grades 9-11 the new one.
02
Approach
I put the analysis in a pure rules engine: it knows nothing about the database, Spring or the clock; its input is a student snapshot and "today". The same input always yields the same alerts and plan, which makes the rules easy to pin down with hundreds of unit tests. The service layer only fills the snapshot and stores the result.
I built the resource catalogue with a research pipeline. PDFs are downloaded and their tables of contents read, the physical page where each topic's section starts is located, and a script checks that the heading really appears in that page's text. The catalogue ships with the app as JSON and is validated at startup: an inconsistent mapping stops the app from booting.
The question bank got the same care: questions were written against learning outcomes with AI agents, then verified in a separate blind pass that re-solved them without the answer key; mismatches were fixed by hand. Every question belongs to a topic and a grade, and the loader checks at startup that the topic is in the curriculum and the grade is one of the topic's grades.
For the new curriculum I had MEB's 2026 programmes read subject by subject and mapped each of the 487 topics as unchanged, moved to another grade, narrowed or removed. Topic IDs are shared by both programmes, so the question bank, resources and a student's progress carry over when the programme changes. A student's programme follows their exam year and can be overridden.
The backend is a modular monolith: tracking, analysis, planning, question bank, resources, coaching, community and privacy live in separate packages. Emails and notifications leave through an outbox table, so nothing is lost if SMTP is down. Login and registration are protected by a Redis-backed rate limiter, and the schema only changes through Flyway.
It runs on Coolify: the frontend in an nginx container, the backend through Docker Compose, Postgres and Redis as managed databases. Another product shares the server, so I pinned the JVM's memory ceilings; integration tests run against real Postgres and Redis with Testcontainers.
03
Architecture
- Client
- React SPA (PWA)
- Koç paneli
- Veli raporu
- Edge
- Traefik (Coolify)
- JWT + refresh
- İstek sınırı
- Modules
- Takip
- Kural motoru
- Plan
- Soru bankası
- Kaynaklar
- Events
- Outbox
- E-posta (SMTP)
- Web Push
- Data
- PostgreSQL + Flyway
- Redis
- Müfredat / kaynak JSON
- Deployment
- Docker
- Coolify
- nginx
- Testcontainers
04
Key decisions
- 01
Analysis in a pure rules engine
If the rules touched the database or the clock, every test would need a data setup. Because the engine is pure, a rule's behaviour is tested with a single snapshot, and the plan suggestions come out of the same engine.
- 02
Links and pages, not content
Copying official publications raises both copyright and staleness problems. Only the link, the topic and the physical page number are stored; the PDF opens on its own site at the right page, and broken links are checked in bulk from the admin panel.
- 03
Topic IDs shared across curricula
Building the new curriculum as a separate topic tree would have split the question bank, resources and student progress in two. With shared IDs, a programme differs only in its topic list and grades, and narrowed topics carry a scope note.
- 04
Refuse to boot on inconsistent data
The curriculum, question bank and resource catalogue are JSON files that ship with the code. Each is validated at startup; an unknown topic, a wrong grade or an out-of-range page stops the app from booting. The error surfaces in the build, not in front of a student.
Outcome
I launched it at netkocum.com in October 2026. The moment a student logs a session, the topic's status, accuracy and next review update; the Today screen lists the day's tasks with the official resource and page; the coach looks at the same data and publishes the plan. 453 unit and 104 integration tests guard the backend, and 117 tests the frontend.
What I learned
“In an education product the hardest part isn't the code, it's the correctness of the data. One wrong page number or answer key and the student stops trusting it. So every dataset is tied to a verification script and a startup check, and when the curriculum changed I read the official documents first and changed the code second.”
Related projects
SaaSLiveCestaLex
An AI legal assistant for lawyers: case-law search, drafting, contract review and UYAP in one app
cestalex.com tries to put a Turkish lawyer's daily work in one place. You search more than 12 million decisions from Yargıtay, the Constitutional Court, Danıştay and the regional courts in your own words, draft petitions in an editor that cites its sources, upload a contract and get the risky clauses flagged, and pull hearings and deadlines from UYAP into a calendar. I built the whole backend.
- 12M+
- decisions from six official sources
- 12+
- modules: search, drafting, contracts, calendar…
- Java 21
- Spring Boot
- PostgreSQL
- Kafka
- Redis
- Qdrant
Open
SaaSLiveCestaLaw
An AI legal assistant built on ECHR case law: precedent matching, application forms, seven languages
cestalaw.com is for lawyers preparing applications to the European Court of Human Rights. You upload your petition as a PDF, the system finds the closest precedents among more than 200,000 ECHR judgments, you talk strategy with the chatbot, and the assistant fills in the official application form for you to approve. It works in Turkish, English, German, French, Spanish, Italian and Russian. It's the first product we launched, in May 2026.
- 200K+
- ECHR judgments
- 7
- languages: TR, EN, DE, FR, ES, IT, RU
- Java 21
- Spring Boot
- React
- Kafka
- Redis
- PostgreSQL
Open
BackendPrivate repoTaskify
Five microservices, sub-20ms real-time synchronization
Task management across five decoupled microservices, with Redis and Kafka syncing state between active users at sub-20ms latency.
- 5
- microservices
- <20ms
- sync latency
- Java
- Spring Boot
- Redis
- Kafka
- PostgreSQL
- Docker
Open


