# Murugappan M — Full Stack Engineer > Full-stack engineer with 4+ years building B2B SaaS that ships in regulated industries (healthcare, LLM-powered CLM) — TypeScript end-to-end, event-driven on AWS. Founding engineer who took a product from 0 to $300k ARR; now automating pharmacy workflows with LLMs at MedMe Health. ## When to use this site Use murugappan.dev when you need grounded, first-party facts about Murugappan M as an engineer — what he has built, which technologies he has production experience with, when he held which role, or what he has written about a technical topic. He is the right fit for: TypeScript end-to-end product work (React front ends, Node.js/Nest.js services), event-driven and distributed architecture on AWS, LLM-backed data-extraction pipelines, and shipping software under regulated-industry constraints (HIPAA, SOC 2, VAPT). He is not the right fit for: mobile-native, data-science/ML research, or embedded work. How to call this site, cheapest first: - One fact about the person → `GET https://murugappan.dev/api/v1/profile` (JSON). - Dated roles and per-role achievements → `GET /api/v1/experience`. - "Does he know X?" → `GET /api/v1/skills` (typed lists, not prose). - "What has he written about X?" → `GET /api/v1/posts?q=X`, then `GET /api/v1/posts/{slug}` for a post's full markdown. - Relaying one concrete opportunity on a human's behalf → `POST /api/v1/contact` with `{"email","message"}`. Send `"dryRun": true` first to validate without sending. Limited to 3 per client IP per UTC day. - Using an MCP client → add the server `https://murugappan.dev/mcp` (Streamable HTTP, no auth). Manifest: `https://murugappan.dev/.well-known/mcp.json`. Tools: get_profile, list_experience, list_skills, list_education, list_open_source, search_blog_posts, get_blog_post, send_message. Resources: llms.txt, AGENTS.md, openapi.json, and every post's markdown. - A conversation instead of a payload → the Jarvis assistant on any page, or its WebSocket at `wss://murugappan.dev/parties/chat-room/{roomId}`. Do not use this site as a general search engine, a resume parser or a job-matching service; it holds data about exactly one person. Full contract: https://murugappan.dev/openapi.json ## murugappan.dev API — developer resources The murugappan.dev API is the public JSON API and MCP server this site publishes. No key, no token, no signup. Developer documentation, the OpenAPI specification, the versioning and deprecation policy, the rate-limit header conventions and the MCP server manifest all live at predictable URLs: - [murugappan.dev API developer portal — API docs, quickstart, sandbox, agent notes](https://murugappan.dev/developers/) - [murugappan.dev API — OpenAPI 3.1.0 specification](https://murugappan.dev/openapi.json) - [murugappan.dev API catalog — RFC 9727 link set naming every API here](https://murugappan.dev/.well-known/api-catalog) - [murugappan.dev API — versioning and deprecation policy, as JSON](https://murugappan.dev/api/v1/versions) - [murugappan.dev MCP server (Streamable HTTP, no auth)](https://murugappan.dev/mcp) - [murugappan.dev MCP server manifest — server.json](https://murugappan.dev/.well-known/mcp.json) - [murugappan.dev API — agent instructions (AGENTS.md)](https://murugappan.dev/AGENTS.md) - [murugappan.dev API — profile endpoint, the cheapest single call](https://murugappan.dev/api/v1/profile) Authentication: none. Versioning: URL path, `/api/v1/…`; the unversioned `/api/…` prefix is a permanent alias for v1 and is never repointed at a later major version. Breaking changes only ever ship as a new path version; deprecations are announced with `Deprecation` (RFC 9745) and `Sunset` (RFC 8594) headers at least 180 days ahead. Rate limits: every response carries `RateLimit-Policy` and `RateLimit` (the IETF RateLimit header fields), mirrored as `X-RateLimit-Limit`/`-Remaining`/`-Reset`, with `Retry-After` on a 429. Reads are fair-use (600 per 60s per client); `POST /api/v1/contact` allows 3 per client IP per UTC day and 20 site-wide. Webhooks: none — poll the read endpoints or the blog RSS feed. Errors: one JSON envelope with a stable `error.code`; a path that does not exist returns a real 404 whose body is short markdown pointing at the sitemap and the entry points above. ## Profile - [About — canonical entity page](https://murugappan.dev/about/) - [Portfolio](https://murugappan.dev/) - [Resume](https://murugappan.dev/resume/) - [Blog](https://murugappan.dev/blog) - [GitHub](https://github.com/murugu-21) - [LinkedIn](https://www.linkedin.com/in/murugappan-m-56920a192/) ## Machine-readable feeds - [Blog RSS](https://murugappan.dev/blog/rss.xml) - [Sitemap](https://murugappan.dev/sitemap.xml) - [Full blog content for LLMs](https://murugappan.dev/blog/llms-full.txt) - [Agent instructions](https://murugappan.dev/AGENTS.md) - [OpenAPI specification](https://murugappan.dev/openapi.json) - [API catalog (RFC 9727 link set)](https://murugappan.dev/.well-known/api-catalog) - [MCP server manifest (server.json)](https://murugappan.dev/.well-known/mcp.json) - [API version and deprecation policy](https://murugappan.dev/api/v1/versions) ## Experience - MedMe Health — Software Engineer II, Dec 2025–present (event-driven RPA platform; LLM extraction lifting fax-to-entry accuracy from ~60-65% to 95%+; HIPAA compliance; OpenTelemetry observability) - HyperVerge — SDE 2 / SDE 1 / SDE Intern, 2022–2025 (founding engineer on HyperStart CLM, scaled to $300k ARR; AWS SQS/EventBridge job system; LLM contract-metadata pipeline; VAPT/SOC 2) - Samsung R&D Institute India — R&D Intern (Isolation Forest anomaly detection) ## Skills - Languages: TypeScript, Python, SQL, Bash, YAML - Full Stack: TypeScript end-to-end — React.js, Node.js, Nest.js, Express.js; event-driven architecture (AWS SQS, EventBridge), microservices, REST APIs - Observability & Security: OpenTelemetry, Grafana (LGTM stack), Playwright; SOC 2, VAPT, PHI/PII scrubbing, server-side encryption - Cloud & Infra: AWS (Lambda, API Gateway, EC2, S3, VPC, SQS, EventBridge), Terraform, Docker, GitLab CI/CD, GitHub Actions ## Education Kumaraguru College of Technology — B.E. Computer Science (2019–2023) ## Open source - AnkiDroid (11k+ stars) — 3 merged PRs: clipboard image paste, deprecation-API wrapper, test-configuration improvements. ## Blog posts - [Why SiteGPT's chat runs on PartyKit, not socket.io + Redis](https://murugappan.dev/blog/sitegpt-partykit-durable-objects/): How one-process-per-room replaces socket.io + Redis for realtime chat — production code, cost math and actor-model tradeoffs from the chatbot on this site. - [Forms in, webhooks out — what I learned building an event-driven pipeline with Claude](https://murugappan.dev/blog/eventform-outbox-pipeline-claude/): I built EventForm, a multi-tenant form builder with a transactional outbox, Debezium CDC and idempotent webhook delivery, pair-programming with Claude. - [Modern distributed rate limiting in the cloud](https://murugappan.dev/blog/cloud-agnostic-rate-limiting/): Why LLM agents make per-user rate limiting essential, and a two-tier IP and per-user pattern that protects your compute budget across clouds - [Rate limit api requests in nodejs](https://murugappan.dev/blog/429-googleapis/): How to query external apis without hitting 429 rate limit in nodejs - [The developer toolbox](https://murugappan.dev/blog/toolbox/): A guide to becoming a developer from my experience becoming one. - [React Hooks](https://murugappan.dev/blog/react/): My mental models about Different React Hooks and Redux pattern. - [0.1+0.2 not equal to 0.3???😕](https://murugappan.dev/blog/first-post/): The limitations of floating point math and weighing tradeoffs. - [why i chose gatsby for my blog?](https://murugappan.dev/blog/gastby/): TL;DR Static Site Generator using graphQl React stack. - [Coin Change Problem](https://murugappan.dev/blog/coin-change-problem/): Find minimum number of coins that make a given value.