Skip to content

Hi, my name is

Harsh Agrawal.

I love building useful things!

I'm a Computer Science graduate from IIIT Sonepat. Primarily interested in full-stack development.

I enjoy learning new things and building something real with them!

About Me

Hello! I'm Harsh, a Computer Science graduate from IIIT Sonepat. I finished in 2026 with a CGPA of 8.99 out of 10.

I picked up web development in college and haven't really stopped since. Most of my time goes into building applications end to end, though I've drifted steadily toward the backend.

Most recently I worked at Netision, building internal platforms — access control, analytics dashboards, and a single sign-on gateway.

Some things I've been working with recently:

  • TypeScript
  • React & Next.js
  • Node.js & Hono
  • PostgreSQL
  • ClickHouse
  • Python
Harsh Agrawal

Where I've Worked

Software Engineer Intern → Associate Software Engineer @ Netision

Feb 2026 – Aug 2026

  • Owned several internal platforms end to end, backend and frontend, on an AI agent product — analytics, access governance, organization management, and the shared sign-in that fronts all of them.
  • Moved authorization out of application code and into PostgreSQL, so the browser stops being a trust boundary: row-level policies decide what every query can see, with time-limited grants, revocation, and an admin approval flow on top.
  • Rebuilt an analytics API around a single shared query layer over ClickHouse, and replaced sequential aggregate queries with concurrent ones — measured at 5–7× faster across the fan-out range the routes actually use.
  • Integrated Microsoft Entra ID single sign-on and delegated Graph access, letting agents read Outlook, Teams, and OneDrive with the signed-in user’s own permissions rather than a service account’s.
  • Worked mostly on the parts that fail quietly — schema invariants, concurrency, and permission models — where a bug looks like nothing at all until it matters.

Some Things I've Built

  • Personal Project

    PeerScript

    A real-time collaborative code editor where several people work in the same file at once. Edits merge through Yjs CRDTs, so concurrent changes converge to the same document on every client instead of overwriting each other — with live cursors, in-room chat, and a sandboxed preview for HTML, CSS, and JavaScript.

    • React
    • Node.js
    • Socket.io
    • Yjs
    • MongoDB
    PeerScript screenshot
    PeerScript screenshot
  • Research @ C-DAC

    AutoPragma

    A DeBERTa-v3 model fine-tuned on 42,360 labelled C/C++ loops to predict whether a loop can be safely parallelized, reaching 81% accuracy and 0.77 F1 on a held-out test set. It degrades under distribution shift — on SPEC OMP it fell below the majority-class baseline — so every suite is reported against that baseline rather than the benchmark that flatters it.

    • Python
    • PyTorch
    • DeBERTa-v3
    • Transformers
    AutoPragma screenshot
    AutoPragma screenshot
  • Personal Project

    PriceWise

    A house-price regression pipeline over the Ames Housing dataset, deployed as a Streamlit app. Every transform is fit inside each CV fold rather than on the full dataset, errors are reported in dollars (R² 0.914, MAE $15,407), and model selection ignores R² gaps smaller than the fold-to-fold noise — breaking ties on MAE instead.

    • Python
    • scikit-learn
    • Streamlit
    • pytest
    PriceWise screenshot
    PriceWise screenshot

Other Noteworthy Projects

  • An internal platform governing who can open which BI dashboards, enforced in Postgres.

    • PostgreSQL
    • Next.js
    • Supabase
  • Records and analyses what LLM-backed agents did — cost, tokens, latency, answer quality.

    • ClickHouse
    • Hono
    • Next.js
  • One hosted sign-in for a multi-app platform, with Entra ID as the only way in.

    • Hono
    • Entra ID
    • Prisma
  • The control layer of an agent platform — departments, processes, agents, and who gets what.

    • PostgreSQL
    • Prisma
    • Hono
  • Proving out delegated access to Outlook, Teams and OneDrive before the production build.

    • Next.js
    • MSAL
    • OAuth 2.0

PowerIQ

Work @ Netision

An internal platform governing who can open which BI dashboards, enforced in Postgres.

  • PostgreSQL
  • Next.js
  • Supabase

People browse a dashboard catalogue, see what they can and can’t reach, and request access with a reason and a desired expiry. Admins review, grant, revoke, set expiry, manage roles, and organise the catalogue into folders.

The client talks straight to Postgres, so the browser is not a trust boundary — the whole access model lives in the database as policies, stored procedures and triggers, and the frontend checks only decide what to render.

  • Three grant paths — admin claim, role-based, and direct per-user grant — all time-bound and revocable. Permanent access is a far-future date rather than NULL, so every liveness check stays a single comparison.
  • Row-level policies deny by default, but a locked dashboard still has to be visible enough to request — partial visibility a policy can’t express. A definer-rights procedure runs past the policy, recomputes the check itself, and returns the row with its URL stripped out.
  • Approval is one atomic procedure: lock the request, re-verify admin and still-pending, create the grant, then flip status — so a double submission can’t produce two grants, or a status with no grant behind it.
  • The audit log is written by triggers rather than application code, with updates and deletes blocked outright, so no path can act unrecorded.
  • Expiry produces no write, yet history has to show it. Rather than a scheduled job, expired events are derived at read time from grants past their date — nothing to drift, and no blind spot for the period before the feature existed.

Nimbus

Work @ Netision

Records and analyses what LLM-backed agents did — cost, tokens, latency, answer quality.

  • ClickHouse
  • Hono
  • Next.js

Built end to end, backend and frontend: 21 dashboard pages across seven areas — trust, prompt, agent, model, cost, user and telemetry.

  • All data access sits behind one centralized API. The dashboard app holds no routes, no query layer and no database driver: it renders, the API answers. One place to optimise a query, one place to absorb a schema change.
  • Filtering happens in SQL, never in application memory, so counts and aggregates compute over the full filtered set instead of over whatever fit under a page cap.
  • Aggregates issue concurrently, making a response as slow as its slowest query rather than the sum of all of them. Benchmarked 5–7× faster across the fan-out range the routes use — and the ratio held as fan-out grew, so the gain generalises rather than flattering one dashboard.
  • When the upstream telemetry schema was replaced and a source table disappeared, every dashboard signal was re-derived from what the new schema kept. Signals with no equivalent return defaults rather than erroring, so a page degrades instead of failing.

Authenticate

Work @ Netision

One hosted sign-in for a multi-app platform, with Entra ID as the only way in.

  • Hono
  • Entra ID
  • Prisma

Consumer apps send unauthenticated users to the gateway with an app key. It resolves that key against a configured registry: a live session goes straight through to the mapped app, no session lands on the hosted sign-in first.

  • Adding an app is configuration, not a code change. The registry is a key=url map parsed by a schema transform that validates each entry and reports per-entry failures.
  • That same parsed map derives redirect routing, CORS origins, and the auth library’s trusted origins — one source of truth, so the three can’t drift apart. The whole environment is validated at boot and throws a formatted list of every problem, so misconfiguration fails at startup rather than at first request.
  • Email and password are disabled entirely, with cross-subdomain cookies so one session covers every app on the platform domain.
  • The session exposes the stable directory object ID rather than email, so downstream apps key identity on something immutable.

Naper

Work @ Netision

The control layer of an agent platform — departments, processes, agents, and who gets what.

  • PostgreSQL
  • Prisma
  • Hono

Models a customer organization — departments, processes, agents, users — across six data models and ten dashboard pages, with a three-tier permission chain running through three join tables.

  • The core invariant is that a user’s processes stay a subset of their department’s, and every mutation path preserves it — including the ones that break it sideways. Unmapping a process from a department removes it from every user in that department in the same transaction; changing someone’s department clears their process mappings, since the old set is invalid under the new one.
  • Mapping writes take the full desired set, diff it against what exists, and issue only adds and removes inside one transaction — idempotent, and avoiding delete-all-then-reinsert, which would churn primary keys and audit rows.
  • One authorization middleware is mounted on the whole router, so a route can’t be added without the gate, with 401 and 403 mapped deliberately so a client can tell “not signed in” from “signed in and still not allowed”.
  • The server computes an eligibility catalogue — every process paired with each department, unmapped ones flagged with a reason — so the UI can explain why an option is unselectable instead of hiding it.

Microsoft Graph POCs

Work @ Netision

Proving out delegated access to Outlook, Teams and OneDrive before the production build.

  • Next.js
  • MSAL
  • OAuth 2.0

Three Next.js apps over 23 API routes and seven delegated scopes, running the authorization-code flow against a shared Entra app registration.

  • Mail, Teams, Calendar and OneDrive all sit on one resource, so adding a capability is a scope change on the same token setup, not a separate integration.
  • Admin-consent boundaries mapped per scope — which a user can self-consent and which need a tenant admin — including one scope that is a superset of another, and one documented as needing no consent that the tenant blocked anyway.
  • Two API surfaces carry meeting data and neither subsumes the other. Calendar endpoints give subject, times and attendees but only see calendar-backed meetings; the online-meeting resource sees ad-hoc ones and carries the lobby and presenter policy, chat thread and participant identities.
  • No endpoint lists a user’s online meetings — one can only be resolved by filtering on a join URL you must already hold. I built a resolver that discovers the join URL from the calendar and resolves it to the meeting id that attendance, transcript and recording endpoints all require.

The deliverable was the finding rather than the app: a written map of what the API genuinely supports, which paths are gated pending consent, and where the shortcuts sit.

What's next?

Get in touch

I'm open to new opportunities and always happy to talk shop. Whether you have a question or just want to say hello, drop me a line.