by jinm29
:four_leaf_clover: Healthcare AI agent app that combines medical records with AI-assisted conversations
# Add to your Claude Code skills
git clone https://github.com/jinm29/ai-healthcare-appGuides for using ai agents skills like ai-healthcare-app.
ai-healthcare-app is an open-source ai agents skill for AI coding assistants such as Claude Code, Codex CLI, and ChatGPT, built by jinm29. :four_leaf_clover: Healthcare AI agent app that combines medical records with AI-assisted conversations. It has 51 GitHub stars.
ai-healthcare-app's catalog security scan is still queued. You can run an instant dependency and prompt-injection check now with the "Scan for vulnerabilities" button above.
Clone the repository with "git clone https://github.com/jinm29/ai-healthcare-app" and add it to your Claude Code skills directory (see the Installation section above).
ai-healthcare-app is primarily written in TypeScript. It is open-source under jinm29 on GitHub, so you can review or fork the full source.
Yes. SkillsLLM lists many other AI Agents skills you can browse and compare side by side. Open the AI Agents category from the badge at the top of this page, or use the Related Skills and comparison links further down to weigh ai-healthcare-app against similar tools.
No comments yet. Be the first to share your thoughts!
Unlocks once the catalog security scan passes (runs nightly).
The deep catalog scan for this skill is still queued. Run an instant dependency check now instead.
A self-hostable health data platform that combines structured medical records with AI-assisted conversations. Upload lab results, health checkups, and personal health context — then chat with LLM providers using that data as grounded context.
Built with Next.js 15, TypeScript, PostgreSQL, and an optional Redis cache layer for production deployments.
| Capability | Description |
|---|---|
| Health data ingestion | Upload PDFs and images; automatic parsing into structured JSON |
| Multi-provider LLM support | OpenAI, Anthropic, Google Gemini, and Ollama (local) |
| Privacy-first deployment | Run fully local with Docling + Ollama — no cloud required |
| Cloud mode | Managed blob storage and Trigger.dev background jobs |
| Internationalization | 10 locales via next-intl |
| Redis cache layer | Optional persistence for API response caching with graceful degradation |
| Credential encryption | AES-256-CBC for stored LLM API keys |
flowchart TB
subgraph Client
UI[Next.js App Router UI]
end
subgraph Application
API[API Routes and Server Actions]
Auth[NextAuth Credentials]
Parser[Health Data Parser]
Cache[Cache Service]
end
subgraph Data
PG[(PostgreSQL)]
Redis[(Redis)]
end
subgraph External
Docling[Docling Serve]
LLM[LLM Providers]
Blob[Vercel Blob]
Trigger[Trigger.dev]
end
UI --> API
API --> Auth
API --> Parser
API --> Cache
Cache --> Redis
API --> PG
Parser --> Docling
Parser --> LLM
API --> Blob
API --> Trigger
| Mode | Storage | Parsing | Background jobs |
|---|---|---|---|
local |
Filesystem (public/uploads) |
Docling (Docker) | In-process |
cloud |
Vercel Blob | Upstage / cloud APIs | Trigger.dev |
sequenceDiagram
participant User
participant API as /api/health-data
participant Parser as PDF Parser
participant DB as PostgreSQL
participant Cache as Redis
User->>API: POST multipart file
API->>DB: Create record (status PARSING)
API->>Parser: parseHealthData()
Parser-->>API: Structured JSON + OCR metadata
API->>DB: Update record (status COMPLETED)
API->>Cache: Invalidate cached entry
API-->>User: Parsed health data
sequenceDiagram
participant User
participant Middleware
participant Chat as /api/chat-rooms
participant LLM as Provider API
User->>Middleware: Request /chat/[id]
Middleware->>Middleware: Verify JWT session
User->>Chat: POST message
Chat->>LLM: Stream completion with health context
LLM-->>User: Assistant response
open-health/
├── docs/ # Engineering documentation and audit notes
├── messages/ # i18n translation files (10 locales)
├── prisma/ # Database schema, seed data, migrations
├── public/ # Static assets and local upload directory
├── src/
│ ├── actions/ # Next.js server actions
│ ├── app/ # App Router pages and API routes
│ ├── components/ # React UI components (shadcn/ui)
│ ├── context/ # React context providers
│ ├── hooks/ # Custom React hooks
│ ├── lib/
│ │ ├── api/ # API helpers (auth guards)
│ │ ├── config/ # Typed environment configuration
│ │ ├── encryption/ # AES encryption for API keys
│ │ ├── errors/ # Application error types
│ │ ├── health-data/ # Parsers (PDF, vision, document)
│ │ ├── logger/ # Structured JSON logging
│ │ └── redis/ # Connection manager and cache service
│ ├── trigger/ # Trigger.dev background tasks
│ ├── auth.ts # NextAuth configuration
│ └── instrumentation.ts # Server lifecycle hooks
├── docker-compose.yaml # Local stack: Postgres, Redis, Docling, app
├── Containerfile # Production container image
└── vitest.config.ts # Unit test configuration
Design decisions:
src/lib/ with clear sub-modulessrc/lib/api/REDIS_ENABLED=falsegit clone https://github.com/OpenHealthForAll/open-health.git
cd open-health
cp .env.example .env
# Edit .env — generate AUTH_SECRET and ENCRYPTION_KEY (see Configuration)
docker compose --env-file .env up --build
Open http://localhost:3000 and register an account.
npm install
cp .env.example .env
# Start PostgreSQL and Redis locally, then:
npx prisma db push
npx prisma db seed
npm run dev
Copy .env.example to .env and configure the following:
| Variable | Description |
|---|---|
DATABASE_URL |
PostgreSQL connection string |
AUTH_SECRET |
NextAuth signing secret (32+ random bytes, base64) |
ENCRYPTION_KEY |
AES-256 key for API key storage (32 bytes, base64) |
NEXT_PUBLIC_URL |
Public URL of the application |
Generate secrets:
node -e "console.log(require('crypto').randomBytes(32).toString('base64'))"
| Variable | Default | Description |
|---|---|---|
REDIS_URL |
redis://localhost:6379 |
Redis connection URL |
REDIS_ENABLED |
true |
Set to false to disable caching |
REDIS_KEY_PREFIX |
open-health: |
Namespace prefix for cache keys |
REDIS_CONNECT_TIMEOUT_MS |
10000 |
Connection timeout |
REDIS_MAX_RETRIES |
10 |
Max retries per request |
| Variable | Values | Description |
|---|---|---|
DEPLOYMENT_ENV |
local or cloud |
Controls storage and parser backends |
LOG_LEVEL |
debug, info, warn, error |
Logging verbosity |
DEPLOYMENT_ENV=cloud)| Variable | Description |
|---|---|
OPENAI_API_KEY |
Platform OpenAI key |
ANTHROPIC_API_KEY |
Platform Anthropic key |
GOOGLE_API_KEY |
Platform Google key |
BLOB_READ_WRITE_TOKEN |
Vercel Blob storage |
TRIGGER_PROJECT_ID |
Trigger.dev project |
TRIGGER_SECRET_KEY |
Trigger.dev secret |
npm install # Install dependencies
npm run dev # Start dev server (port 3000)
npm run typecheck # TypeScript validation
npm run lint # ESLint
npm run test # Unit tests (Vitest)
npm run validate # typecheck + lint + test
npm run build # Production build
docker compose up database redis docling-serve # Infrastructure only
docker compose up --build # Full stack
When running Ollama on the host machine:
http://docker.for.mac.localhost:11434http://host.docker.internal:11434Tests use Vitest and cover infrastructure modules:
npm run test # Run all tests once
npm run test:watch # Watch mode
Test files are co-located with source: src/**/*.test.ts
Covered areas:
Ensure ENCRYPTION_KEY is set in .env before running npm run dev. Generate a valid 32-byte base64 key (see Configuration).
docker compose ps redisREDIS_URL matches your environmentREDIS_ENABLED=falseConfirm Docling is running:
docker compose logs docling-serve
npx prisma db push
npx prisma generate
npm install
npx prisma generate
npm run typecheck
git checkout -b feat/your-featurenpm run validateSee CONTRIBUTING.md for detailed guidelines.
Commit conventions: Use imperative mood (feat:, fix:, chore:, docs:, test:, refactor:).
Can I run this without Redis?
Yes. Set REDIS_ENABLED=false. The application skips caching and continues to work normally.
Is my health data sent to cloud LLMs automatically?
Only when you configure cloud LLM providers and use cloud deployment mode. Local mode with Ollama keeps inference on your machine.
What file formats are supported?
PDF, PNG, JPEG, and other image formats. PDFs are converted to images for vision-model parsing.
How are API keys stored?
LLM provider API keys are encrypted at rest using AES-256-CBC with your ENCRYPTION_KEY.
Does this replace medical advice?
No. OpenHealth is an informational tool. Always consult qualified healthcare professionals for medical decisions.
See LICENSE.