> ## Documentation Index
> Fetch the complete documentation index at: https://developer.eka.care/llms.txt
> Use this file to discover all available pages before exploring further.

# Under the Hood

> Monthly transparency post covering infrastructure, reliability, performance, and security work across the Eka platform.

Get weekly developer updates in your inbox

New features, SDK releases, API changes, and bug fixes — delivered every week. No spam. Unsubscribe anytime.

Powered by Mailchimp · Your data is safe with us

**May 2026**

Monthly update — May 2026

## What shipped in May 2026

May was a wide-front month: the EkaScribe SDK surface kept maturing across web and mobile, EkaAgents broadened from doctor-booking into service and appointment workflows, EMR's records experience on Android gained the time and state-recovery primitives it had been missing, and Platform shipped a quiet but meaningful run of design-system, network, and ABDM improvements.

**Reliability & Uptime** — The biggest reliability work landed in the EMR records pipeline on Android. Health Records Android now keeps its own `TimeProvider` that tracks a server-time offset persisted in `SharedPreferences`, updated whenever a sync response comes back with a `Date` header. Anywhere the SDK previously called `System.currentTimeMillis()` for record and file timestamps, it now uses the synchronized clock — so `createdAt`, `updatedAt`, and `lastUsed` stay in sync across devices with skewed clocks. Alongside that, a stale-analysing-record reset clears the `is_analysing` flag for documents stuck in analysis past a cutoff, triggered automatically when records are read — so a crashed or interrupted parse no longer leaves a document permanently in the analysing state. On EkaScribe Android, session polling that previously slid into `COMPLETED` on failure now correctly transitions to `ERROR` and short-circuits the rest of the poll chain.

**Performance** — Android record-preview hot paths moved off the UI thread: image URI resolution, large-image validation, and orientation handling now run on `Dispatchers.IO` via `LaunchedEffect`, and the preview list passes `File` objects directly to `AsyncImage` instead of manually decoding bitmaps. File downloads switched to `MediaStore` on Android Q+ for scoped-storage compliance, with stream-based copy to public Downloads and a dedicated `records_temp` cache sub-directory with stricter cleanup on failure. On the JS side, the new scribe UI widget cut the integration surface significantly — what used to require wiring capture, status, and transcript primitives is now one drop-in component.

**Security & Compliance** — The MCP server's OAuth discovery flow was hardened to derive its origin from RFC 7239 `forwarded` headers before falling back to `x-forwarded-proto`, so `https://` URLs are advertised correctly when fronted by AWS API Gateway. `/.well-known/oauth-protected-resource` also now matches subpaths (e.g. `/mcp`), fixing 404s for clients that probe with the resource path appended. On the ABDM front, `abdm-ecdh` picked up a Java implementation of the ECDH primitives alongside the existing Python and Go bindings, with a CI pipeline added and the Python release path corrected — making it materially easier for JVM-based HIP/HIU integrations to handle ABDM consent and data exchange.

**Scalability** — EkaNetwork Android's `init` now accepts a list of custom OkHttp interceptors, stored per `appId` and threaded into both the `AuthApi` and dynamically-created services. Eka Scribe Android, Health Records Android, and `android-document-ui` all picked up the new network version, so hosts can plug in logging, tracing, or header interceptors without forking the network layer. The Aakaar design system's `tokens.ts` was decoupled from antd, so consumers of `@eka/aakaar/tokens` and the Aakaar MCP server no longer transitively pull antd into their bundles.

**Developer Infrastructure & Tooling** — The Aakaar MCP server got a component-metadata path-resolution fix, and the `EditableTable` bottom AutoSuggest dropdown now anchors to the nearest scrollable ancestor via a configurable `getPopupContainer` — eliminating stale dropdown positions after row inserts and the stuck-scroll state after mass-clearing rows. The `EkaScribe` TS SDK wrapped `VadWebClient`'s lifecycle methods in defensive try/catch with namespaced `[EkaScribe]` logging, so errors in the VAD path no longer escape to the host page.

**EkaScribe** — The product surface continued to mature on every runtime. The Eka JS SDK shipped a packaged scribe recording widget and a `startRecordingV2` entry point that exposes the next-generation recording flow alongside the existing `startRecording`. The MedScribe Alliance TypeScript SDK added pause and resume controls for in-progress recordings, plus a feature update tracking the LIFE-1696 work item that refreshed session and recording surfaces across thirteen files. The EkaScribe TS SDK at v2.1.50 picked up `getDocument`, `getSessionDetails`, and `startRecordingForExistingSession`, alongside an optional `publish` payload on the document API and `user_status` on `patchTransactionStatus` — closing out the full document and session lifecycle.

**EMR** — Templar receipts now print GST and use a `pt` attribute that carries a date. The OPD slip template was rewritten from string templates to JSX, aligning it with the rest of the engine. A new `examinationFindings` property group landed with backward-compatible support for legacy notes, and a long-running text-wrapping rendering bug was fixed. The patient age field on Templar receipts moved from a numeric `ageInM` to a richer `age` string — a breaking change for `TPdfObject` callers, but one that produces a more clinically meaningful age label. On Android, the records grid item's analysing state was consolidated into the `SmartTag` component, and the AddRecord preview activity got the stability, performance, and scoped-storage work described above.

**EkaAgents** — The Eka MCP SDK widened its tool surface meaningfully. New tools — `service_availability_elicitation`, `book_service`, `show_appointments_basic`, `get_patient_appointments_basic`, and a CRM lead-creation tool — extend agents from doctor-booking into service/health-package booking, appointment lookups, and lead capture. The `doctor_availability_elicitation` flow now returns `selected_doctor_id` and `selected_hospital_id` in `_meta.tool_result`, the doctor-availability success response was enriched, and the user's selected hospital is now ranked first in availability listings. The Echo Agent Kit added AG-UI streaming, Anthropic Claude prompt support, and a skills concept for building modular, reusable agent capabilities.

**April 2026**

Monthly Transparency Post

## Under the Hood — April 2026

April was about turning the AI agent infrastructure we've been investing in
into something production-grade — faster, more bounded, and easier to
authenticate against — while continuing to harden the EMR, EkaScribe, and
ABDM surfaces around it. We also opened up two pieces of internal IP to the
wider community.

### AI agent infrastructure

The Echo Agent Kit's MCP integration got the most substantial rework of the
month. The old monolithic MCP cache was retired in favor of a split design:
tool discovery and MCP sessions now live in separate caches, each with its
own idle and absolute TTLs, LRU eviction on pool exhaustion, and concurrent
cache-miss serialization to prevent duplicate discovery work. Tool cache keys
are partitioned by configurable headers, and `user_session_id` is now plumbed
through `MCPTool.run` via `tool_context` — so per-user sessions stay
correctly isolated even under load.

We also put bounds on tool execution: MCP tool calls in the Echo Agent Kit
are now capped at a 10-second timeout, so a slow downstream tool can no
longer block an agent response indefinitely. Empty prompt variables are
handled gracefully too — optional placeholders no longer throw.

On the MCP Server itself, we shipped OTP-based authentication for EMR
workspaces (with country code selection and UHID profile picking, all
mid-conversation), added a doctor discovery tool for EMR clinics, introduced
an interactive elicitation flow that lets agents confirm doctor availability
before booking, and made the MCP SDK fall back to the default EMR tool set
when a workspace has no explicit configuration — a meaningful resilience
improvement for new workspace onboarding. Profile creation in the MCP SDK
now requires a mobile number, ensuring downstream integrations always have
a contactable identifier.

The MedAssist surface saw steady iteration too — a contextual popup tied to
conversation state, configurable onboarding nudges so partners can suppress
unsolicited prompts, a proper agent-ID resolution fix, file-upload
validation against an allow-list of supported types, and a responsive layout
pass that fixes overflow on screens under 360px and 767px wide. A
microphone regression was caught and reverted same-day.

### Reliability and SDK hardening

EkaScribe's SDKs leveled up across all three runtimes. The Android SDK
switched from AAC/MP4 to LAME-based MP3 encoding for more reliable chunk
uploads, and its result polling now inspects `integration`, `transcript`,
and `custom` statuses inside `templateResults` instead of the legacy
`output` list — with empty statuses correctly treated as failures rather
than timing out. The iOS SDK now processes audio chunks in parallel,
cutting end-to-end transcription latency for longer recordings. The
JavaScript SDK gained `createDocument`, `deleteDocument`, and
`getChunkTranscript` for full programmatic document lifecycle control,
plus expanded polling parameters and a longer 20-second status API
timeout. EkaScribe iOS DocAssist also now surfaces voice-to-text failures
with a clear error state instead of silently dropping recordings.

On the Android side, the document UI no longer crashes when PDF rendering
initializes before view layout constraints are available — view setup is
now properly gated. Medical Records Android validates oversized images
before upload, moves PDF URI resolution off the main thread, and the
Health Records SDK handles missing files during record processing
gracefully with improved MD5 checksum error handling.

The Patient Directory TypeScript SDK got a `forceApiSearch` flag for
high-confidence lookups that need to bypass the local cache, and we
fixed a stale-cache edge case where partial cached state could surface
incorrect results.

### Platform and integrations

We extended the Patient Directory APIs with two new endpoints — retrieve
a patient profile by username and update an EMR user profile — plus a
GET endpoint to retrieve an EMR user by OID. The `extras` field also got
documented restrictions (no nested lists, dictionaries with one level of
nesting, 16-character key limit, leading-underscore keys ignored) so
integrators can rely on consistent shape contracts. The eka-usage-sdk
shipped at v0.1.1 with a fixed test runner and the latest Kafka usage
metric event definitions, and the ABDM-related usage events were updated
to match current consent and linking flows.

The Templar prescription engine saw a steady drumbeat of EMR-facing
improvements: clinic name on OPD slips; cleaner doctor name rendering on
IPD receipts and bills (using profile first/last name fields directly);
a `show_signature` flag plus cache-busting query parameters for S3-hosted
PDF assets; corrected ophthalmology table ordering; richer IPD admission
templates; an IPD admission TinyMCE preview fix; QR code repositioned
into the footer details for cleaner headers; a `unit_display_name`
fallback to `name` for cleaner unit labels; the addition of pachymetry,
Amsler grid, and contact lens examination tables; structured diet chart
sections in prescriptions; and a Total Paid / Amount Due summary on IPD
billing PDFs. OPD slips also got tags and a larger token font for
readability at the front desk.

### Open-sourcing internal IP

Two pieces of work landed in the open-source column. **BODHI** — two
SNOMED-linked clinical knowledge graphs (`bodhi-s` for condition–symptom
mapping and `bodhi-m` for concept–drug–lab investigation mapping, with
9,300+ nodes and 16,700+ relationships across six interchange formats)
— is now publicly available under CC BY-NC 4.0 for symptom checking,
differential diagnosis, and patient health profiling use cases. And the
**ABDM ECDH** key-exchange primitives we use internally for secure
consent and data-fetch flows are now distributable as a Python package,
so partners can integrate ABDM-aligned encryption helpers without
re-implementing the protocol.

### Developer experience

The EkaScribe documentation got a substantial revamp: a new Quick Start
guide walks integrators through installing the TypeScript SDK and
transcribing a first consultation in minutes; SDKs are now promoted as
the recommended integration path with REST APIs second and Chrome
Extension third; v1 APIs are clearly marked deprecated with migration
pointers to v2; and SDK sidebar titles use proper casing. The result is
a faster, less ambiguous path from "first time visiting the docs" to a
working transcription.

### What's next

In May, we're focused on continuing to extend the Echo Agent Kit
(audio transcription, lazy-loaded skills, and Postgres-backed tools have
already started landing in early May), expanding doctor and patient
directory APIs further, and tightening the production posture of the
MCP Server's caching and authentication paths.

**March 2026**

Monthly Transparency Post

## Under the Hood — March 2026

March was about making AI agents more capable and more connected. We expanded
what agents can do — from booking appointments to managing ABHA profiles —
while investing in the developer experience to make sure integrators can
connect, authenticate, and build quickly.

### Product highlights

* **ABHA login and profile management via MCP** — AI agents can now handle
  full ABHA workflows (login, OTP verification, profile selection, card
  retrieval) during a conversation, no manual steps needed. [View changelog](https://developer.eka.care/docs/get-started/changelog.md)
* **Vaccination and appointment reminder webhooks** — New webhook endpoints
  for vaccination reminders, appointment reminders, and follow-up variants
  let integrations react to scheduling events in real time.
* **Follow-up appointment confirmation API** — A new endpoint to
  programmatically confirm follow-up appointments, removing the need for
  manual intervention.
* **Ophthalmology data in prescription PDFs** — Prescription PDFs now include
  pachymetry, Amsler grid, and contact lens examination tables, rounding out
  ophthalmology support across the platform.
* **IPD billing PDF generation** — Clinics can now generate inpatient billing
  documents as structured PDFs with itemized charges and pricing summaries.

### AI agent infrastructure

March saw sustained investment in the Eka MCP Server — the core interface
between AI assistants and the Eka healthcare platform.

We added five new tools this month: appointment rescheduling, patient benefits
lookup, ABHA login and profile management, and doctor discovery with metadata
forwarding. Each tool follows the authenticated remote MCP specification, so
any compatible AI client can use them without custom integration work.

Authentication got more flexible too. The MCP Server now supports email-based
verification alongside mobile, and tools can prompt for credentials
mid-conversation through elicitation — meaning the user never has to leave
their AI client to authenticate.

On the developer experience side, we restructured the MCP documentation into
separate Remote and Local SDK guides, published the server on Smithery for
easier discovery, and added comparison tables so developers can choose the
right deployment model in seconds.

### SDK and integration tooling

The EkaScribe Android SDK shipped Architecture V2 (v4.0.4) with Java support,
session cancellation, and idempotent state management — a significant
reliability improvement for integrators running the SDK in production. The JS
SDK received error tracking improvements, header handling fixes, and ES6 build
support.

The Echo Agent Kit gained `_meta` field support and improved elicitation
handling, aligning it with the latest MCP specification. The Pagify SDK cleaned
up iframe lifecycle management to prevent lingering embedded views.

On the mobile side, MedAssist on iOS now handles app backgrounding gracefully
— sessions reconnect automatically — and error messages are surfaced clearly
instead of failing silently. Suggestion chips, message bubbles, and file upload
handling were all refined.

### Documentation and developer experience

We published structured ABDM milestone guides (M1–M4) covering the full
integration path from ABHA creation through health data exchange. The Doctor
Profile API was extended with a salutation field. OPD slips now display price
and patient attributes.

The EkaScribe documentation received a significant revamp in early April: a new Quick Start guide gets developers from zero to first transcription in minutes using the TypeScript SDK, the docs now lead with SDKs as the recommended integration path, and deprecated API endpoints are clearly marked. Two new Patient Directory endpoints — retrieve by username and update EMR user profiles — expanded programmatic control over patient records.

The Medical Records Android SDK gained conditional visibility for record grid
items, and the changelog itself was cleaned up (Gmail subscription links and
GitHub repository links corrected).

### What's next

In April, we're focused on expanding MCP tool coverage across the EMR,
improving real-time event delivery for webhook consumers, and continuing to
harden the authentication and session management layers across all SDKs.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.