Eleplan/Embed the caregiving brain

Ellie, inside your product.

The assistant that reads a family’s whole care picture — records, documents, medications, benefits — dropped into your EHR, your portal, or your internal tools with a script tag. Bound to one patient, scoped by you, revocable in a click.

2
script tags
~17KB
gzipped, no dependencies
5 min
browser session TTL
your-ehr.example.com / patients / 4471-023
Eleanor Whitfield
78 · Female · Medicare + AK Medicaid
MRN
4471-023
DOB
11 Mar 1948
Primary
CHF, Type 2 diabetes
Last visit
4 days ago — cardiology
Chat with Ellie⤢ ×
Talking about: Eleanor Whitfield
What help can she get with the cost of her insulin?
Three routes, cheapest first
  1. Medicare Part D $35 insulin cap — already in effect on her plan
  2. Extra Help (LIS) — she is likely eligible; ssa.gov/extrahelp
  3. AK Senior Benefits — $76/mo, not currently received
Her Nov 12 denial letter was for the state pharmacy program, not Extra Help.
Your product. Your patient. Two script tags.
The problem

Your system holds the record. It does not hold the answer.

A patient chart knows the diagnosis, the medication list, and the last four visits. It does not know whether this family qualifies for a waiver, what the denial letter that arrived on Tuesday actually means, who to call about transport to dialysis, or which of the six people involved is supposed to do the next thing.

That gap is where caregivers live. They leave your product to find the answer, and most of the time they do not find it — they call, they wait, they repeat the same story to the fourth person, and they come back with nothing your system can use.

Without it
  • Leaves your product to go looking
  • Calls three numbers, waits on two
  • Repeats the whole story to a fourth person
  • Gets a letter nobody can explain
  • Comes back with nothing your system can store
With it
  • Asks in the tab they already have open
  • Gets the eligibility rule and the application link
  • Uploads the letter and asks what it means
  • Sees what the family already receives
  • Leaves the answer attached to the record

Ellie closes the gap without you building any of it. One script tag, scoped to one plan, answering from the record you already have.

Where it goes

Anywhere you already know which person you’re looking at.

The widget takes one piece of context from you — the patient, member or client currently on screen — and binds the whole conversation to it. That single fact is what makes it useful in places a general chatbot isn’t.

Digital EHR / patient portal

Answers beside the chart, not in another tab

Drop the widget into the patient view your clinicians and families already use. It opens bound to that patient — the record, the medications, the documents, the care team. Nobody picks a patient, so nobody picks the wrong one.

The plan is bound server-side into the session token. A prompt that names a different patient cannot reach one.

Care management & navigation

Your navigators stop being a search engine

The questions that eat a navigator's day — what does this cover, what happens when the waiver runs out, what do I do with this letter — get answered in the tool they are already working in, with the family's actual record in context.

Same orchestrator as the Eleplan app: benefits corpus, documents, medications, care team, and the plan itself.

Home care & agency software

Field staff get the whole picture on a phone

A caregiver standing in someone's kitchen can ask what changed since the last visit, what the new prescription is for, or what the family was told at discharge — and attach the paperwork they were just handed.

Drag-and-drop or paperclip uploads run the same OCR and extraction pipeline as the Eleplan app.

Your own internal tools

Wherever the work actually happens

Intake tools, referral queues, benefits screeners, the admin console nobody outside your company will ever see. If it renders HTML and knows which person it is looking at, it can carry Ellie.

No framework, no bundler, no build step. A plain script tag and a shadow root that will not touch your CSS.

What it can do

Not a chat box with a system prompt.

It runs the same orchestrator as the Eleplan app — the same tools, the same knowledge base, the same benefits corpus — with the plan fixed to the one you bound at mint time.

Answers from the record

Diagnoses, medications, documents, appointments, the care team and who is responsible for what — the same knowledge base the Eleplan app answers from, scoped to the bound plan.

Benefits, with the part people need

A federal + state corpus of programs, and for each one the eligibility notes and the link to apply — not a list of names. It also knows what the family already told us they receive, so it stops recommending what they already have.

Documents in, understanding out

Attach a discharge summary, a denial letter, an EOB, a photo of a pill bottle. It goes through the same OCR and extraction pipeline as the app, and becomes answerable within seconds.

Markdown that renders

Headings, tables, lists, and links that are actually clickable — because the useful half of a benefits answer is the link to the application form.

Streaming, with its work shown

Tokens as they arrive, and the tool it is running while it runs ("Loading benefits…"), so a slow answer reads as work rather than as a hang.

Conversation that survives

Sessions expire in five minutes; conversations do not. History is pinned to your user, so a renewed session picks up mid-thread instead of starting over.

Expandable, copyable

A 380px corner bubble or an 880px panel, remembered per user. Every answer copies as markdown, because it is going into a chart note or a referral.

Yours to style around

Shadow DOM isolation both ways: your page cannot break the widget and the widget cannot leak into your page. Title, launcher label and starter prompts are yours to set.

Install

An afternoon, not a quarter.

There is no SDK to adopt and no framework to match. The whole integration is one endpoint on your side and two tags on the page.

01

We issue you a key

One long-lived elk_ key, scoped to the origins you name and the plans that opted in.

02

Your server trades it for a session

One endpoint, behind your own auth. It decides who is allowed to talk and which plan they get.

03

The page loads the widget

Two script tags. The widget calls your endpoint, gets a five-minute session, and starts.

On the page

html
<script>
window.EllieWidgetConfig = {
// we send this with your key
chatUrl: "https://<id>.lambda-url.us-east-1.on.aws/",
sessionEndpoint: "/api/ellie-token", // you mint it
projectId: currentPatientId, // your id
};
</script>
<script src="https://cdn.eleplan.com/v0/ellie-widget.js" defer></script>

On your server

node
// The long-lived key never reaches a browser.
app.post('/api/ellie-token', requireYourAuth, async (req, res) => {
const url =
'https://production-api.eleplan.com/client/embed/session';
const r = await fetch(url, {
method: 'POST',
headers: {
Authorization: `Embed ${process.env.ELEPLAN_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
project_id: mapToEleplanPlan(req.user.patientId),
external_user_id: req.user.id, // audit only
}),
});
res.json(await r.json()); // { session_token: "els_…" }
});

That’s the whole integration. Optional extras: pass uploadBase to turn on document attachment, suggestions to seed starter prompts, and title to rename the panel.

Security

Designed for the review it’s going to get.

You are putting this on a page that shows patient data. So the interesting question isn’t what it can do — it’s what it can’t, and who decides.

Your server
holds elk_
POST /embed/session
origin + opt-in checked
Browser
holds els_ · 5 min · one plan

Two tokens, and the browser only ever sees the weak one

Your server holds a long-lived key (elk_) and trades it for a short-lived browser session (els_) per user. The key never reaches a page. A leaked session token is worth five minutes, on one plan.

Origin allowlist per key

Sessions are only minted for origins you registered. A copy of your page on someone else's domain gets a 403, not a conversation.

Opt-in per plan, not per account

A plan is reachable through the embed only when it has been explicitly included. Enabling a partner does not silently enable everyone in the account.

The plan is bound server-side

The bound plan travels in the session token. The browser cannot pivot to another patient, and neither can the prompt — a request body that claims a different plan is ignored.

Revocable and rate-limited

Keys carry status, expiry and a per-minute limit; revoking one takes effect on the next mint. A global kill switch can take the whole embed surface down without a deploy.

Versions are frozen, never patched under you

You pin a version in the script URL. v0 stays v0 forever — improvements ship as v1, and you move when you are ready.

The first ten minutes of questions.

How long does an integration actually take?
Two script tags on the page, and one endpoint on your server that trades your key for a session token. The server side is about fifteen lines. The hard part is deciding which of your ids maps to which plan.
What does it weigh?
One file, roughly 17KB gzipped, no dependencies and no build step. It does not pull in React, it does not touch your bundler, and it renders inside a shadow root so it cannot collide with your CSS.
Do our users need Eleplan accounts?
No. Your server decides who is allowed to talk and mints a session for them. Your identity system stays the source of truth; we only record the id you pass for the audit trail.
What happens when a session expires mid-conversation?
The widget mints a new one against your endpoint and retries the message. The user sees nothing, and the conversation carries on where it was.
Can we ship it without the upload surface?
Yes — leave uploadBase out of the config and the paperclip and drag-drop never appear. Chat works the same.

The families are already in your product.

Give them somewhere to ask the questions your system was never built to answer — without sending them anywhere else, and without building any of it yourself.