I build intelligent systems that survive beyond the demo.
I’m a Software Engineering student at DTU, building retrieval systems, reliable backends, and data-heavy products. The interesting part usually starts after the happy path.
Course-aware GraphRAG that turns PDFs into searchable concept graphs, reranks evidence, and returns page-grounded answers.
ReactFastAPIPostgreSQLQdrantNeo4j
Inside the build
PDF extraction / bounded OCR
Page-aware chunks → PostgreSQL
Embeddings → Qdrant
Concept extraction → Neo4j
READY-gated vector candidates
Graph relationship expansion
Reranking
Grounded answer
Key decision
Immutable course UUIDs align records across stores. PostgreSQL-backed leases and attempt fencing make a bounded, in-process worker restart-safe without adding a separate queue service. READY gating prevents partially ingested documents from entering retrieval; page and chunk provenance survive expansion and reranking.
What needed care
An accepted upload is not a usable document. Partial graph extraction, provider rate limits, interrupted jobs, and cross-store deletion all need explicit states. Resumable section checkpoints, provider failover, attempt fencing, and upload-scoped cleanup make these failure paths inspectable.
A support-investigation prototype that plans, retrieves evidence, verifies its proposal, and waits for human approval before creating a review ticket.
PythonSQLiteBM25Gemini/OpenAI APIsJavaScript
Inside the build
Issue → persistent SQLite queue
Worker records investigation plan
Model selects scoped tools
BM25 policies + account/service fixtures
Evidence → plan revision
Verify exact proposal
Human approves or rejects
Idempotent local review ticket
Key decision
A bounded single-agent loop uses Gemini/OpenAI adapters and explicit tools rather than arbitrary code execution. Verification is bound to the exact proposal and is invalidated when evidence or the plan changes. SQLite transactions enforce one local ticket per approved run.
What needed care
Demo scenarios use fictional accounts, policies, and incidents. Scripted mode is deterministic; live mode uses model-selected tool calls. Mechanical evidence checks do not establish semantic correctness or prompt-injection resistance. The local server has no production authentication or tenant isolation, and approval creates a local ticket rather than a refund or an external support action.
A PostgreSQL-backed job runner that makes retries, worker crashes, lease recovery, and cancellation visible—with Python and Go workers.
PythonGoFastAPIPostgreSQLDocker Compose
Inside the build
FastAPI validates and accepts jobs
PostgreSQL stores jobs and attempts
Workers claim with SKIP LOCKED
Leases and heartbeats fence attempts
Registered handlers execute work
Retry, cancel, or recover expired leases
Key decision
PostgreSQL is the coordination layer: short transactions claim work atomically, while Python and Go processes share a lease protocol. Submission idempotency is separate from business-effect idempotency. Execution is at least once; arbitrary external side effects are not exactly once.
What needed care
Cancellation is cooperative, so a handler that ignores it can still succeed. SKIP LOCKED does not guarantee global fairness. The lab has no tenant isolation, arbitrary-code sandbox, or validated backup strategy. Local benchmark observations are not production capacity or service-level guarantees.
Lap-time prediction and Monte Carlo simulation for comparing pit-stop strategies using real 2021–2025 F1 data.
PythonStreamlitscikit-learnPandasNumPy
Inside the build
FastF1 telemetry
Feature engineering
Rolling split
Lap-time model
Monte Carlo simulation
Strategy bands
Interactive dashboard
Key decision
Use the latest available earlier-season median for each circuit as the pre-race baseline, excluding the completed test race. Compare Ridge with HistGradientBoosting and sample residuals plus pit loss to return P10/P50/P90 strategy-time bands.
What needed care
Wet-weather laps and Las Vegas produce larger errors. The model is more trustworthy in dry-race scenarios and does not yet explicitly simulate traffic, safety cars, or overtakes.
Parses résumés locally, scores five ATS dimensions, compares job descriptions, and exports actionable feedback.
ReactTypeScriptViteTailwind CSSRadix UI
Inside the build
PDF / DOCX / TXT
Browser parsing
Five-dimension scoring
Job keyword comparison
Feedback report
HTML export
Key decision
Core parsing and scoring run locally. Weighted checks provide explainable feedback rather than presenting an opaque score as a hiring prediction. A local history keeps the ten most recent analyses.
What needed care
Complex document layouts can scramble extracted text, while keyword matches lack the judgment of a recruiter. Scores are heuristic guidance, not a guarantee of compatibility with every employer's ATS or of an interview.
Supporting core application development on Frappe, WhatsApp workflow testing through Gupshup APIs, and internal tooling and documentation with the product and technology teams.
Remote · Python · JavaScript · Frappe · REST APIs
Currenttechnology internship
02
Bluestock Fintech
Jun — Aug 2026
Data Analyst Intern
Built a mutual-fund analytics platform covering 40 schemes, 10 datasets, 87K+ records, and 4.5 years of NAV history.
Python · Pandas · SQL · Power BI
87K+records analyzed
03
ELUSOC Summer of Code
Jul 2026
Open Source Contributor · Gold Engineer
Ranked 20th of 592 nationally, earning 475 contribution points and the Gold Engineer distinction.
Open source · Engineering collaboration
20 / 592national rank
04
Enginow Open Source Hackathon
2026
Open Source Contributor
Finished eighth of 422 participants, in the top 2%, with 1,680 contribution points.
A short selection from my FixNearby and Open Connect work: product features in one codebase, interaction and reliability fixes in the other.
Select a record to inspect the contribution trail.
MERN hyperlocal services platform
Made everyday service workflows portable, observable, and easier to trust.
Full-stack contributor
On my FixNearby fork, I worked across the React client and Express/MongoDB server. The largest slice was a set of export and continuity tools—worker contact cards, booking calendars, comparison CSVs, civic-issue GeoJSON, and recently viewed workers—alongside runtime and authorization guardrails.
43
authored commits in fork history
5
workflow export tools
3
runtime guardrails
Portable workflowsTurned records into useful files↗
Added browser downloads for vCards, iCalendar bookings, worker-comparison CSVs, and civic-issue GeoJSON. Each utility is small, testable, and attached to the screen where the data is already being reviewed.
User continuityKept the last six workers close↗
Added bounded, de-duplicated recently viewed worker history with a local-storage fallback, so returning to a useful profile does not require a new search round-trip.
Operational resilienceMade the server easier to run and debug↗
Added health/readiness endpoints, a graceful shutdown lifecycle, and request correlation IDs. Together they give deploys and incident logs clearer boundaries without introducing another service.
04 / Behind the systems
Building is how I learn.
I’m interested in the parts of software that stop being obvious once the demo works: retrieval quality, retries, distributed state, data consistency, and product edge cases.
Most of my recent work sits between AI systems, backend engineering, and data infrastructure. Outside that, I spend time solving DSA problems, reading about system design, and occasionally running or playing badminton.