Mohammed Ashraf — Engineering Lead, Analytics & AI · Facilio

I build products for the agentic era.

Currently shipping

Full-stack engineer with four years of end-to-end ownership of Facilio's analytics domain: the dashboard product, the charting library every app renders on, the Java APIs beneath them, and now the LLM copilot, agents and MCP tooling that build dashboards from a sentence. RefundDesk is where I take the same ideas to Postgres.

RefundDesk
rbac · rag · postgres
SUPPORTCan we refund an annual plan 40 days after renewal?
PLAN
RETRIEVE
clearance · L2
rls filter
hybrid · rrf
answer
412ms
4 of 11 chunks visible to this roleaudit · logged
ask the portfolio

A portfolio should answer questions, not just list things.

This console is a small, honest agent: no model behind it, just grounded answers, a visible plan, and a confidence it does not inflate. The same shape RefundDesk uses, minus the retrieval.

01Plan the answer and pick a source on this site.
02Trace every step so you can see what it did.
03Stream the reply and cite where it came from.

Pick a prompt or type your own. Enter sends.

⏎ to send0
selected work

Retrieval you can trust by role.

One project carries the weight here. The rest is the trail that got me to it.

hero project

RefundDesk

RBAC-aware RAG for refund decisions

An assistant that answers refund-policy questions for Finance, Support, Sales, Legal and HR, where what you can retrieve depends on who you are. Access control is enforced in the database, not in the prompt: Postgres row-level security sits under pgvector, so a Support agent cannot be talked into reading a Legal memo.

  • Ingestion for PDFs, scanned PDFs (OCR), DOCX, XLSX, email, Markdown and HTML via Docling, with versioned documents, soft-deletes and a human review gate.
  • Section-level ACL markings travel with every chunk; RLS policies are forced on the app role and checked with SQL leak tests.
  • Hybrid retrieval: BM25 over tsvector plus HNSW cosine on bge-m3 embeddings, fused with Reciprocal Rank Fusion.
  • A tool-calling agent loop with guardrails and an audit trail, a FastAPI backend, a React + Vite UI, and retrieval and agent evals.
PythonFastAPIPostgrespgvectorRow-Level SecurityDoclingReactViteDocker
querying…0.94 · policy v3 §4.2
RLS filter · 4 of 11 chunks
RRF fused · bm25 + hnsw
Clearance set · support/L2

Earlier

2022, learning React in public

SOCO — Soconnect

A small social network

Connect with friends, post, follow and react. Built while learning Redux.

ReduxReactReact Router

MHD Racquets Store

Badminton e-commerce

Catalogue, cart, wishlist and Razorpay checkout for badminton gear.

ReactRazorpayReact Router

Color Strips

Palettes from images

Drop an image, get a colour palette.

Next.jsChakra UI
experience

Four years owning one domain, end to end.

Technical owner of the analytics domain end to end: the Java APIs, the frontend product, the visualisation and UI libraries, and the AI layer on top. Primary contributor to the dashboard, charting, design-system and criteria-builder codebases, and the main reviewer of pull requests into the dashboard codebase.

4+years owning the analytics domain
~85%production bundle cut, ~1 MB to ~150 KB
5packages in the app-launcher SDK
EveryFacilio app renders on the charting library

Member of Technical Staff · Engineering Lead, Analytics & AI

Facilio · Data-driven building operations · multi-region B2B SaaS

Jun 2022 – present

AI: dashboard agents, Widget Copilot & MCP

Nov 2025 – present

The agentic layer on top of analytics: agents that build dashboards from a sentence, and the tooling that lets other agents do the same.

  • Widget Copilot: a Java agent workflow (intent identification, module-selector guardrails, widget generation, summary) streamed token by token over SSE to a Vue chat UI with partial-JSON rendering and persisted history.
  • Dashboard generation agents that produce whole dashboards and widgets (cards, gauges, charts, list views, narratives, images) from natural-language prompts, with prompt editing, thumbnails and AI licensing controls.
  • Python MCP server and connectors exposing widget creation, data fetch and signed-URL exports as tools, with per-user service tokens propagated through tool calls so agents act with the caller's permissions.
  • Agno orchestration in the Python AI service (widget router, intent identifier, prompt builders, copilot tools) called by the Java backend for multi-step workflows; a WebMCP tool registry with an iframe bridge so in-page agents can drive the client.
  • Authored and maintain the agents' system-instruction library and the reference corpus they ground on: internal query language, layout grammar, widget-edit guides and a facilities-management language map.
JavaPythonAgnoMCPSSEWebMCPPrompt engineering

Dashboards & analytics platform

2023 – present

Built the dashboard product from scratch and carved it out of the monolith.

  • Standalone Vue 2 micro frontend: grid layouts, tabs and grouping, KPI and card widgets, module and pivot reports, live module reports, drilldown filters, timelines, sharing and permission scoping, app-scoped dashboards and translations.
  • Split dashboards and reporting out of the monolithic client into an independently built and deployed module with an embed bridge, shrinking the host bundle and decoupling release cadence.
  • Designed and implemented the analytics and dashboard API layers in the core Java server: report data, folder CRUD, widget lifecycle, report, pivot and dashboard export with signed URLs, permission definitions and route configuration.
  • Cut the production JavaScript bundle from ~1 MB to ~150 KB through Webpack tuning, lazy-loaded grid widgets and dependency pruning.
Vue 2PiniaJavaMySQLMicro frontendsWebpack

Identity, Home launcher & SDK

Sep 2026

A cross-app launcher, the identity API behind it, and an SDK host apps adopted within a week.

  • Home API in the Java identity service: RBAC-backed, user-scoped app catalog, CORS filter, server-to-server client to the core app and platform-app launch URL resolution, rolled out across all deployment regions.
  • React 19 + Vite launcher with per-app roles, profile, org switching, authenticator setup and confirmed destructive account actions, working around cross-site cookie and regional CORS constraints.
  • Five-package SDK: headless TypeScript core, a Stencil web component, auto-generated React and hand-written Vue 2.7 bindings, and a React Native switcher, published to npm via CodeBuild CI.
JavaReact 19ViteStencilTypeScriptReact NativeCodeBuild

PPM calendar

Aug 2025 – Feb 2026

Planned-maintenance scheduling, delivered end to end.

  • Java backend for folder and PPM CRUD, criteria, pagination, dynamic KPIs and rescheduling; Vue + Bryntum SchedulerPro frontend.
  • PDF export through the Puppeteer PDF service with timeout handling and isolated browser contexts; fixed a series of multi-timezone rendering defects reported from production.
JavaVueBryntum SchedulerProPuppeteer

Shared libraries: charts, design system, criteria, icons

2022 – present

The packages every Facilio app consumes, and the generation target for the AI agents.

  • Charting library designed from scratch on Apache ECharts 5: bar, spline, pie, gauge, treemap, heatmap, telemetry-map and baseline charts, drilldowns, palettes, dark theme, unit and decimal formatting, timezone and DST handling; shipped as a versioned package.
  • Co-maintainer of the design system: reading and dashboard cards, page header, cascader, accordion, steps, modals, gridstack sub-grids and the default theme tokens.
  • Maintained the filter and criteria builder across two major versions with a beta-then-stable release flow; contributed to the shared forms package.
  • Own the SVG icon pipeline and categorised icon set, the internal docs site with icon search and deprecation, animated icons, and publishing to the private registry.
ECharts 5D3gridstackDesign systemsnpm packagesSemantic versioning

Earlier

  • Jan 2020Software Engineer Intern · Gofrugal, Chennai
  • Jul – Oct 2019Machine Learning Data Associate · Amazon, Chennai — training-data preparation and quality control
  • Feb – Apr 2019Engineering Trainee · ABB, Riyadh, Saudi Arabia — Electrical Products & Distribution Solutions
  • Nov 2017 – Feb 2018Intern · ABB, Chennai — power system studies of industrial networks

Education

  • 2014 – 2018Bachelor of Engineering, Electrical and Electronics Engineering · Anna University, Chennai
Résumé (PDF)
how I build

Three things I keep coming back to.

01

Agents are users too

An interface an agent can read, query and act on is a better interface for people as well. Tool-shaped UI, typed data, no hidden state.

02

Security lives in the data layer

Prompts are suggestions. Row-level security, ACLs on chunks and leak tests are guarantees. RefundDesk is built on that difference.

03

Motion should have weight

Springs over durations. Interactions that can be interrupted and still feel right. Every effect on this page is a tuned spring, not a guess.

stack

Java and Vue by day, Python and Postgres by night.

JavaREST APIsPythonExpresspgvectorLLM agent workflowsMCP serversSSE streamingGuardrailsRAGVue 2React 19StencilWebpackVitei18nD3Bryntum SchedulerProBitbucket PipelinesMulti-region deploys
StrutsMySQLNode.jsPostgresRow-Level SecurityTool callingAgnoIntent classificationWebMCPEvalsPiniaTypeScriptMicro frontendsRollupnpm packagesApache ECharts 5gridstackPuppeteer PDFAWS CodeBuild
BackendAI & agentsFrontendData viz & delivery
writing

Notes from the inside of JavaScript.

Backend and retrieval write-ups are next, as RefundDesk grows.

JavaScript

The puzzle behind this keyword

What `this` refers to in each calling scenario, and why.

Read on Hashnode ↗
JavaScript

What's an execution context?

The phases of an execution context on the call stack.

Read on Hashnode ↗
JavaScript

The prototype multiverse

Prototypal inheritance in JavaScript, explained from the chain up.

Read on Hashnode ↗
Open to conversations


Full-stack and agentic AI work, or just comparing notes on agents, retrieval and dashboards. Chennai, India, open to relocation.