> ## 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.

export const SubscribeForm = () => {
  const [email, setEmail] = useState("");
  const [status, setStatus] = useState("idle");
  const handleSubmit = e => {
    e.preventDefault();
    const trimmed = email.trim();
    if (!trimmed || !trimmed.includes("@")) {
      setStatus("error");
      return;
    }
    window.open("http://eepurl.com/i3Lz2E", "_blank");
    setStatus("success");
    setEmail("");
  };
  return <div style={{
    background: "#E1F5EE",
    border: "1px solid #5DCAA5",
    borderRadius: "12px",
    padding: "20px 24px",
    marginBottom: "28px"
  }}>
      <div style={{
    fontSize: "15px",
    fontWeight: "600",
    color: "#085041",
    marginBottom: "4px"
  }}>
        Get weekly developer updates in your inbox
      </div>
      <div style={{
    fontSize: "13px",
    color: "#0F6E56",
    marginBottom: "14px",
    lineHeight: "1.5"
  }}>
        New features, SDK releases, API changes, and bug fixes — delivered every week. No spam. Unsubscribe anytime.
      </div>
      {status === "success" ? <div style={{
    background: "#0F4C3A",
    color: "white",
    borderRadius: "8px",
    padding: "10px 16px",
    fontSize: "13px"
  }}>
          ✓ Check your inbox to confirm your subscription.
        </div> : <form onSubmit={handleSubmit} style={{
    display: "flex",
    gap: "8px",
    flexWrap: "wrap"
  }}>
          <input type="email" value={email} onChange={e => {
    setEmail(e.target.value);
    setStatus("idle");
  }} placeholder="your@email.com" required style={{
    flex: "1",
    minWidth: "200px",
    height: "38px",
    border: status === "error" ? "1.5px solid #E24B4A" : "1.5px solid #5DCAA5",
    borderRadius: "8px",
    padding: "0 14px",
    fontSize: "13px",
    color: "#111",
    background: "white",
    outline: "none"
  }} />
          <button type="submit" style={{
    height: "38px",
    background: "#0F4C3A",
    color: "white",
    border: "none",
    borderRadius: "8px",
    padding: "0 20px",
    fontSize: "13px",
    fontWeight: "500",
    cursor: "pointer",
    whiteSpace: "nowrap"
  }}>
            Subscribe →
          </button>
        </form>}
      {status === "error" && <div style={{
    fontSize: "11px",
    color: "#E24B4A",
    marginTop: "6px"
  }}>
          Please enter a valid email address.
        </div>}
      <div style={{
    fontSize: "11px",
    color: "#0F6E56",
    marginTop: "8px",
    opacity: "0.75"
  }}>
        Powered by Mailchimp · Your data is safe with us
      </div>
    </div>;
};

<SubscribeForm />

<Update
  label="May 2026"
  description="Monthly update — May 2026"
  tags={["Update"]}
  rss={{
title: "Eka Under the Hood — May 2026",
description: "• EkaScribe SDKs expanded — pause/resume, V2 recording, a JS UI widget, document and session lifecycle APIs, and hardened VAD\n\n• EkaAgents booking gained service/health-package elicitation, appointment lookups, and richer doctor-availability context\n\n• EMR records on Android got server-synchronized time, automatic stale-state recovery, and a smoother add-record flow\n\n• Platform hardening — MCP OAuth discovery fixes, Aakaar/antd decoupling, EditableTable dropdown anchoring, and a Java implementation of the ABDM ECDH primitives\n\nRead more: https://developer.eka.care/under-the-hood"
}}
>
  ## 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.
</Update>

<Update
  label="April 2026"
  description="Monthly Transparency Post"
  tags={["Feature", "Update"]}
  rss={{
title: "Eka Under the Hood — April 2026",
description: "• Echo Agent Kit MCP integration redesigned with split tool/session caches, LRU eviction, and bounded tool-call timeouts\n\n• EkaScribe SDKs leveled up — Android moved to MP3 encoding with smarter polling, iOS gained parallel chunk processing, and the JS SDK added full document lifecycle methods\n\n• Patient Directory APIs expanded with retrieve-by-username, EMR user updates, and a force-fresh search flag in the TS SDK\n\n• BODHI clinical knowledge graphs released publicly under CC BY-NC 4.0\n\n• ABDM ECDH primitives now available as a Python package for partner integrations\n\nRead more: https://developer.eka.care/under-the-hood"
}}
>
  ## 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.
</Update>

<Update
  label="March 2026"
  description="Monthly Transparency Post"
  tags={["Feature", "Update"]}
  rss={{
title: "Eka Under the Hood — March 2026",
description: "• AI agents expanded with ABHA login, appointment rescheduling, and patient benefits tools\n\n• EkaScribe Android SDK v4.0.4 — Architecture V2 with Java support and idempotent state management\n\n• MCP Server now supports email authentication and mid-conversation credential elicitation\n\n• ABDM milestone guides M1–M4 published\n\nRead more: https://developer.eka.care/under-the-hood"
}}
>
  ## 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](/changelog)
  * **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 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.
</Update>
