Inspiration

We are a hagwon — a private academy. A traditional, offline education business in South Korea.

Korea's academy market is dominated by large corporate chains. They have lower prices, economies of scale, and above all an overwhelming volume of student data. We tried allying with other small academies. Students still chose the cheaper big chain.

Then Korea's education system began to shift — from quantitative assessment to qualitative. Grades alone stopped explaining an applicant. Reading, independent research, performance assessments, teacher-written subject narratives, interviews — all of it started to matter more.

And that kind of record has one decisive property: you cannot manufacture it overnight.

That was our opening. A small academy will never beat a chain on number of students. It can beat them on depth of record per student. A chain holds shallow data on 100,000 kids. We can follow one student for twelve years. The only problem was that no human staff can do that at scale — which is where AI became the answer.

But the real motivation wasn't business.

Korean students spend three years accumulating a score, and then, at the very end, pick the university that matches that score. The order is backwards. I wanted to build the opposite: a student sets a goal in elementary school, and the trace of walking toward that goal becomes the application itself.

Giving educational sovereignty back to the student. That is why hi-sight exists.

What it does

hi-sight manages one student's twelve years — from 1st grade through the final year of high school — as a single continuous thread.

Elementary — read grade-matched recommended books and write a weekly reading journal Middle school — the reading journal continues, joined by long-horizon interview training and performance assessment management High school — subject-specific research records, university admission analysis from GPA and mock exams, and study-abroad preparation The point is continuity. A book read in 5th grade and a question asked in 8th grade are designed to become source material for an 11th-grade research record.

The starting point: two axes Before anything else, at signup, we establish two things. A Kolb learning-style inventory answers how does this student learn? A Holland (RIASEC) career-interest inventory answers where is this student headed? A short diagnostic on current subject strengths rounds it out.

Every recommendation that follows — books, research topics, target majors — is made along those two axes. That's why twelve years of records don't scatter: there are coordinates at the origin.

The heart of the platform: a per-student LLM wiki Everything a student produces — performance assessments, deep-dive research, career diagnostics, reading logs — doesn't scatter. It accumulates into that one student's wiki.

The more that accumulates, the more the AI personalizes to that specific student. What comes out at the end isn't a list of activities. It's a narrative — three years of evidence answering "why did this student choose this path?"

Five roles, five different doors Roles split at signup. Logging in takes you into a completely different surface.

Student → My Page: record, generate research questions, check reachable universities Parent → Premium Parent Lounge: monitor everything, receive monthly reports Consultant → Consultant Room: edit student work, finalize AI drafts Master (me) → Master Analysis Room: oversee all data, produce deep reports, run AI data correction Alumni & working professionals → Career Network Room: advice from people actually doing the job AI drafts, humans decide For performance assessments and research records, the AI only produces a draft. A consultant then edits and finalizes it — and the finalized version becomes the exemplar for the next draft.

The AI never writes a student's work for them. It asks the student questions, a human refines the answers, and the result teaches the next round. That loop is deliberate.

Reading numbers qualitatively When a student enters GPA and mock exam scores, we infer a Z-score, so we're not comparing raw grades but the context a number sits in.

z

x − μ σ z= σ x−μ ​

On top of that, we apply a correction based on school type — general high school, autonomous private, specialized, science, gifted — grounded in Korea's official university disclosure data. A grade of 3 at one school is not a grade of 3 at another.

We also correct the numbers parents are most often misled by. A 60:1 competition ratio on an essay-based track terrifies families. Subtract no-shows and applicants who fail the minimum standardized-test requirement, and the effective ratio is closer to 20:1.

effective ratio

applicants × ( 1 − r no-show ) × ( 1 − r failed minimum ) seats effective ratio= seats applicants×(1−r no-show ​ )×(1−r failed minimum ​ ) ​

Parents are users, not spectators In Korean education, the parent pays. Yet in most services the parent pays and then sees nothing.

hi-sight shares the child's performance assessments, research work, interview preparation, and academy attendance reports with the parent in full — delivered by Web Push and a monthly report. This is not surveillance. It is built to create common ground between parent and child. Only a parent who knows what their kid is working on can have a real conversation about it.

How we built it

I did not study computer science. I built this entire platform myself using Gemini and the Antigravity IDE.

That wasn't the plan. I hired a developer first.

The problem was never the code. It was context. The developer didn't know the education industry. When something got built in the wrong direction, explaining why it was wrong cost more time than the build itself. What "six early-admission slots" means. Why a regional-talent track is legally different from a regional-balance track. Why the national science institutes don't count against those six slots. That domain gap kept dragging the project backwards.

With Gemini, the gap disappeared. I could pour ten years of education-industry experience straight into a conversation. No spec documents. I just said what I knew.

The second reason for Gemini is more practical: I was already running on Google. Student records, performance assessments, and grades all lived in Google Drive and Workspace. When Gemini connected with NotebookLM, I could pull real student material directly into development. The data was already on Google — so Gemini wasn't a choice, it was the natural conclusion.

Build order I locked UI/UX before anything else. My biggest fear was shipping something that looked obviously AI-generated. So before a single feature, I supplied reference designs and fixed the palette myself. That call turned out to be right — a hundred features later, the interface never wobbled.

Only then did I add features, tab by tab. (That order is also what caused the biggest problem in this project — see below.)

The stack Frontend — Next.js 16, React 19, TypeScript, Tailwind CSS 4, Recharts Backend / DB — Prisma 7 + PostgreSQL (Supabase), 42 tables AI — Google Gemini (@google/generative-ai), with a per-task temperature policy Auth — NextAuth with role-based access control Notifications — Web Push + PWA (monthly reports, attendance) Payments — PortOne subscriptions Quality — in-house API contract checker + data health checker Built in — Google Antigravity IDE + Gemini + NotebookLM + Google Workspace Databases we built by hand None of the data was off the shelf. We collected primary sources and cleaned all of it ourselves.

Reading (elementary/middle) — curated lists from Kyobo Book Centre, the National Library for Children and Young Adults, School Library Journal Korea, the Happy Morning Reading Foundation, and the Children's Book Research Society Reading (high) — recommended reading from Seoul National University, Yonsei, Korea University, SKKU, and KAIST All of the above rebuilt as 12 grade levels × career category Academy recommendations — the official registered-academy lists from the Gangnam and Seocho district education offices, reclassified by subject, category, and learning type Admissions — placement tables, official school-of-origin disclosures, and 712 non-audition arts/PE programs transcribed from primary association documents

Challenges we ran into

Features were easy. Logic was the wall. Early on I only thought about features. Build a tab, add a function, next tab. I gave logic no thought at all.

Once features piled up, it started collapsing. The same student's GPA rendered differently on different screens. One screen used the newest mock exam; another was silently using the first one ever entered. Nothing crashed. Everything disagreed.

The most dangerous bugs never throw an error The scariest thing in this project was never a crash. It was quietly displaying a wrong number. In admissions data, that changes a child's future.

Things that actually happened:

Of 9,626 eligible early-admission programs, only 40 were reaching the screen. The filter was far too narrow — regional-doctor and regional-talent tracks had no seat at the table at all. Fixed to span the full GPA ±0.5 band. A puncture score (likelihood of an unusually low-competition year) displayed 89% for one candidate. The real figure was 14%. I still get cold thinking about a student applying on that number. For students who hadn't entered a GPA, the system was silently assuming a 3.0 and running the full analysis anyway. I hunted down and removed five such assumptions. "Advanced Pharmaceutical Sciences" was matching against "Pharmaceutical Sciences." "Veterinary Medicine" was matching "Medicine." Korean department names overlap character-for-character. Regional-talent eligibility was being judged by the track's name. A name can't tell you that. Rewritten to parse the actual eligibility clause. The AI's defaults were the enemy of consistency I found this embarrassingly late: every single Gemini call was going out at the default temperature of 1.0.

Analyze the same student record twice, get two different answers. Fine for brainstorming. A defect when you're analyzing one child's record.

A moving baseline moves everything downstream The perfect score on Korea's standardized mock exams shifts from sitting to sitting. When that baseline moves, every admission analysis built on it moves with it — silently. We had to build a dedicated correction screen just to hold that steady.

The business model I designed first couldn't survive Education consulting in Korea prices at roughly ₩5,000 per minute — about ₩300,000 an hour. Accounting for always-on online management, we set ₩500,000/month (₩550,000 with VAT).

But every feature I designed first — academy recommendations, reading recommendations, admissions consulting — was one-and-done. You get it once and you're finished. There was no reason to ever pay a second month. The product was fine; the shape of it was wrong.

Accomplishments that we're proud of

It's live, and real students are on it. Not a prototype — hi-sight.co.kr runs a 42-table production system covering signup, records, admissions analysis, payments, and parent reporting. Built by someone who had never written production code.

We refused to fake anything. This is the accomplishment I care about most. There are no hardcoded fallbacks and no randomized probabilities anywhere in this platform. If the data isn't there, we don't emit a number — we say "no data." The 712 non-audition arts/PE programs have no published GPA cutoffs, so we show a reference grade band instead of a probability. High school admissions that aren't lottery-based get no probability at all. It would have been trivial to generate a plausible-looking percentage for every screen. In this domain, a plausible-looking wrong number is worse than a blank.

We turned "check it manually" into two commands. After being burned by silent data corruption, we automated the entire class of problem:

npm run check:api # finds screens consuming fields the server never sends npm run check:data # finds typo'd regions, zero grades, zero competition ratios Both run right after loading placement data, and again before any real consultation.

We built the datasets nobody had. Twelve grade levels of curated reading crossed with career category, district academy registries reclassified by learning type, and 712 arts/PE programs transcribed by hand from primary documents because no placement table covered them.

We designed privacy by not storing. School records are analyzed by AI, but we never keep the original — only the summary, disposed of under Korean retention law. And the on-screen wording says exactly that. We did not describe something we don't store as being "safely stored."

Every number in a report is ours, not the AI's. Our code computes; the AI only explains. That constraint made the reports usable in front of an actual paying parent.

What we learned

Simple, single-source logic beats sophisticated logic. One judgment must live in exactly one place. Major-name matching in lib/majorMatch.ts. Puncture scoring in lib/puncture.ts. Paid-access checks in one hasPremiumAccess. If the same calculation exists in two places, they will diverge. Fixing this is what finally made the product coherent — and, unexpectedly, what fixed the business model too.

Deciding where an AI should be creative and where it must be mechanical is a design decision, not a config detail. Record analysis is now pinned to temperature 0, with identical inputs reusing the prior result. Places that genuinely need variety — proposing research topics — were deliberately left alone.

Be precise about what "AI learning" means. Our loop is exactly three steps: accumulate cases → feed them as prompt exemplars → calibrate probabilities. We are not training a model. Saying so plainly keeps us honest with ourselves and with parents.

Only compounding features retain. We rebuilt the model around what you lose by quitting: reading journals, performance assessments, subject records, interview training. Entry is the Kolb + Holland diagnostic; retention is accumulation; trust is the parent watching the whole process. And we sell one master pass, never à la carte — the moment a paywall interrupts a student mid-work, the purpose of this platform breaks.

When a non-engineer builds software, the advantage isn't the code — it's the domain. I can't write elegant code. But I know that "only 40 results out of 9,626" is wrong. That judgment came from ten years of sitting across from students and their parents, and it's the part AI could not have supplied.

Gemini let me write the code. I already knew what the code was supposed to do. Those two things met, and this platform is what came out.

What's next for hi-sight Student Management Platform

Move the executable parts offline. Building the platform first was deliberate — once records and community take hold online, the parts worth doing in person can follow. That is the sequence we're now entering.

Widen the Career Network Room. More alumni, more working professionals, so a student doesn't just imagine a career but gets connected to someone actually doing that job.

Complete recurring payments. The subscription skeleton is built and running in test mode; live keys land shortly.

Deepen the personalization loop. Every finalized consultant edit becomes an exemplar for the next draft. The more students we carry through a full year, the sharper that gets — which is exactly the compounding advantage a small academy can hold that a chain cannot.

Built With

Share this project:

Updates