Inspiration

Every year, millions of Indian families pick a college from brochures that say "95% placed". The brochures don't say 95% of whom. A college can drop students who went for higher studies from the count, or quote a single record-high package as if it were typical. Families then take on education loans based on those numbers.

We wanted a platform with no brochure to protect: independent, student-funded, and honest about its denominators.

What it does

EduClear shows what a college actually delivers, then guides the decision and the financing around it.

  • Truth Lens toggles between the brochure claim and the audited figure.
  • Placement Truth matrix (AG Grid) and ROI and payback charts (AG Charts) compare colleges side by side.
  • Safe / Sweet-spot / Reach deck matches a student's rank to colleges, with plain-language intake in English and हिंदी.
  • Choice-filling simulator flags order-inversion mistakes in JoSAA counselling.
  • Seat-deposit tracker applies UGC refund tiers and generates a refund letter.
  • Counselling sessions are booked in a Bryntum calendar and paid through a PayPal sandbox escrow ledger. Funds are released to the counsellor with PayPal Payouts after the session is confirmed.
  • Copilot agent proposes a booking and only creates the PayPal order after the user confirms, through PayPal's official MCP server.

The math

The headline number uses one formula everywhere. Eligible students exclude those who chose higher studies:

$$ \text{placement rate} = \frac{\text{placed}}{E}, \qquad E = \text{graduating on time} - \text{direct to higher studies} $$

Payback is measured against disposable income, not gross pay:

$$ \text{payback (months)} = \frac{\text{4-year total cost}}{\text{in-hand monthly income} - \text{living cost}} $$

Sandbox charges convert at a fixed, disclosed rate: $\text{USD cents} = \operatorname{round}(\text{INR} \times 0.012 \times 100)$.

How we built it

  • Backend: Python 3.12, FastAPI, Pydantic v2 and SQLModel, with Postgres on Render. Money is stored as integers, never floats.
  • Frontend: React, Vite and TypeScript. AG Grid, AG Charts and Bryntum are lazy-loaded, so the first load is about 82 KB gzipped.
  • Deterministic engines for every number. The LLM (Qwen3-4B) only parses intake and phrases explanations. It never produces a figure a user sees.
  • Integrations behind interfaces with mock fallbacks: PayPal Orders v2 with JS SDK v6 and Pay Later, signed webhooks, Payouts, Channel3 for campus-kit prices, and an optional Zapier hook with no personal data. The demo keeps working if any one of them is down.
  • Safety by design: the server computes prices, the app refuses to start unless PAYPAL_ENV=sandbox, and the agent never books without a human confirmation.
  • Quality: 84 offline tests, a Postman collection with automated tests, an end-to-end smoke script, and an axe-core WCAG 2.1 AA scan of our own pages.

Challenges we ran into

  • "Zero invented numbers" is expensive. Our first dataset rule was that every figure needed an official URL, a retrieval date and a SHA-256 of the saved document. Many colleges failed because their own documents didn't support a figure, for example no same-season highest package, no per-year fees, or no official cutoff. We dropped them instead of estimating.
  • Switching datasets. We later ran the app on a larger supplied dataset of 108 colleges. It isn't source-verified, so the app labels every record "Supplied dataset, not audited". We kept the earlier verified records archived and say so openly.
  • PayPal has no escrow product. We built an internal ledger that captures funds and releases them with Payouts. The app calls it a ledger, not an escrow account.
  • A hung PayPal pop-up. The sandbox login sometimes sticks on its spinner after sign-in, so the SDK's approval callback never fires. We added a retry that polls for the capture and a "check my payment" link.
  • Agent speed. Letting the model route and rephrase every message took about 18 seconds. We made routing rules-first and call the model only for ambiguous messages.
  • Currency. The UI shows ₹ but sandbox payments run in USD, so we show the fixed conversion rate to the user.

Accomplishments we're proud of

A working end-to-end path from a booked slot, through a PayPal sandbox payment, to a Payouts release, with an agent that cannot spend money without a human click.

What we learned

  • Honest labelling beats polish: a clearly marked "not audited" badge builds more trust than a clean number with no source.
  • Keeping the LLM away from numbers made the product both safer and faster.
  • Putting every external service behind an interface with a mock made the demo much more reliable.

What's next

  • Cover branches beyond Computer Science.
  • Verify the 108-college dataset against official sources.
  • Add real vetted counsellors in place of the demo profile.
  • Add Elastic-powered search.

Built with

python fastapi react typescript postgresql paypal bryntum ag-grid channel3 render postman zapier qwen

Built With

Share this project:

Updates

Submission history