From abridge-pack
Sets up local Abridge dev environment with HAPI FHIR server via Docker, synthetic patient data, and TypeScript config for clinical AI/EHR workflow testing.
npx claudepluginhub jeremylongshore/claude-code-plugins-plus-skills --plugin abridge-packThis skill is limited to using the following tools:
Local development workflow for Abridge clinical AI integrations. Uses a local HAPI FHIR server for EHR simulation, synthetic patient data from Synthea, and Abridge sandbox APIs. Never use real PHI in development.
Provides reference architecture for Abridge clinical AI integration with EHRs (Epic/Athena) via FHIR R4 APIs. Includes HIPAA-compliant data flows, project structure for multi-site health systems.
Sets up local dev workflow for Fireflies.ai GraphQL API: project structure, records real responses as fixtures for offline testing, Vitest integration.
End-to-end onboarding for the HealthClaw + OpenClaw personal-health-agent stack. Walks anyone — not just developers — through (1) installing OpenClaw as the local AI gateway, (2) standing up an open-source FHIR server (HAPI or Medplum) on their machine, (3) connecting their EHR records via HealthEx, Josh Mandel's fhir-skills, Flexpa, or any patient-right-of-access / TEFCA IAS service, (4) installing HealthClaw Guardrails with the OpenClaw personas pre-wired, and (5) pulling + reviewing health data end-to-end. Triggers when a user asks "how do I get started", "how do I set this up", "what do I need to use HealthClaw", "first time setup", "install everything", or any first-run question. Use this before any other HealthClaw skill when the user hasn't yet built their stack.
Share bugs, ideas, or general feedback.
Local development workflow for Abridge clinical AI integrations. Uses a local HAPI FHIR server for EHR simulation, synthetic patient data from Synthea, and Abridge sandbox APIs. Never use real PHI in development.
abridge-install-auth setup# Run HAPI FHIR R4 server locally
docker run -d --name hapi-fhir \
-p 8080:8080 \
-e hapi.fhir.default_encoding=json \
hapiproject/hapi:latest
# Verify
curl -s http://localhost:8080/fhir/metadata | jq '.fhirVersion'
# → "4.0.1"
# Seed synthetic patient
curl -X POST http://localhost:8080/fhir/Patient \
-H "Content-Type: application/fhir+json" \
-d '{"resourceType":"Patient","name":[{"given":["Jane"],"family":"Doe"}],"birthDate":"1985-03-15","gender":"female"}'
// src/config/dev.ts
interface DevConfig {
abridge: { baseUrl: string; clientSecret: string; orgId: string };
fhir: { baseUrl: string };
fixtures: { transcriptsDir: string };
}
const devConfig: DevConfig = {
abridge: {
baseUrl: process.env.ABRIDGE_SANDBOX_URL || 'https://sandbox.api.abridge.com/v1',
clientSecret: process.env.ABRIDGE_CLIENT_SECRET!,
orgId: process.env.ABRIDGE_ORG_ID!,
},
fhir: { baseUrl: 'http://localhost:8080/fhir' },
fixtures: { transcriptsDir: './fixtures/transcripts' },
};
export default devConfig;
// fixtures/transcripts/index.ts
export const CARDIOLOGY_VISIT = {
specialty: 'cardiology',
segments: [
{ speaker: 'provider', text: 'I see you are here for a blood pressure follow-up.', timestamp_ms: 0 },
{ speaker: 'patient', text: 'Yes, I have been taking the lisinopril like you prescribed.', timestamp_ms: 3500 },
{ speaker: 'provider', text: 'Your BP today is 138 over 85. Better, but still elevated. Let us increase lisinopril from 10 to 20mg.', timestamp_ms: 7200 },
{ speaker: 'patient', text: 'Okay. Should I be worried?', timestamp_ms: 15000 },
{ speaker: 'provider', text: 'Not at all. Come back in four weeks.', timestamp_ms: 18000 },
],
};
export const DERMATOLOGY_VISIT = {
specialty: 'dermatology',
segments: [
{ speaker: 'provider', text: 'What brings you in today?', timestamp_ms: 0 },
{ speaker: 'patient', text: 'I have this mole on my back that has been changing color.', timestamp_ms: 2500 },
{ speaker: 'provider', text: 'How long has it been changing? Any itching or bleeding?', timestamp_ms: 5000 },
{ speaker: 'patient', text: 'About three months. It itches sometimes.', timestamp_ms: 8000 },
{ speaker: 'provider', text: 'The borders look irregular. I want to do a biopsy today.', timestamp_ms: 12000 },
],
};
// src/dev/test-encounter.ts
import devConfig from '../config/dev';
import { CARDIOLOGY_VISIT } from '../../fixtures/transcripts';
import axios from 'axios';
async function runDevEncounter() {
const api = axios.create({
baseURL: devConfig.abridge.baseUrl,
headers: {
'Authorization': `Bearer ${devConfig.abridge.clientSecret}`,
'X-Org-Id': devConfig.abridge.orgId,
},
});
const { data: session } = await api.post('/encounters/sessions', {
patient_id: 'demo-patient-001',
provider_id: 'demo-provider-001',
encounter_type: 'outpatient',
specialty: CARDIOLOGY_VISIT.specialty,
sandbox: true,
});
for (const seg of CARDIOLOGY_VISIT.segments) {
await api.post(`/encounters/sessions/${session.session_id}/transcript`, seg);
}
await api.post(`/encounters/sessions/${session.session_id}/finalize`);
// Poll for note
for (let i = 0; i < 30; i++) {
const { data } = await api.get(`/encounters/sessions/${session.session_id}/note`);
if (data.status === 'completed') {
console.log(JSON.stringify(data.note.sections, null, 2));
// Push to local FHIR
await axios.post(`${devConfig.fhir.baseUrl}/DocumentReference`, {
resourceType: 'DocumentReference',
status: 'current',
content: [{ attachment: { contentType: 'text/plain', data: Buffer.from(JSON.stringify(data.note.sections)).toString('base64') } }],
});
console.log('Note pushed to local FHIR server');
return;
}
await new Promise(r => setTimeout(r, 2000));
}
}
runDevEncounter().catch(console.error);
{
"scripts": {
"dev:fhir": "docker start hapi-fhir 2>/dev/null || docker run -d --name hapi-fhir -p 8080:8080 hapiproject/hapi:latest",
"dev:encounter": "tsx watch src/dev/test-encounter.ts",
"dev:all": "npm run dev:fhir && npm run dev:encounter",
"test:fixtures": "vitest run --grep 'fixture'"
}
}
| Error | Cause | Solution |
|---|---|---|
| Docker port conflict | Port 8080 in use | docker stop hapi-fhir && docker rm hapi-fhir |
| Sandbox rate limit | Too many test sessions | Wait 60s between test runs |
| FHIR validation error | Malformed resource | Validate against FHIR R4 schema |
For reusable SDK patterns, see abridge-sdk-patterns.