leap
Python package for the Lifetime Exposures and Asthma outcomes Projection (LEAP) Model
Portfolio project that drafts insurance appeal letters from explanation-of-benefits files. Not for real patient information.
HealthJavaScript · TypeScriptGitHub @shanifadhil33-blipOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Loading the full README. The saved excerpt is shown below.
A portfolio project for drafting insurance appeal letters. Drop an EOB PDF, extract denied claims via Vision AI, and draft an appeal from the notes you paste. Not a HIPAA product. Not for real patient information.
• Framework: Next.js 16 (App Router)
• Styling: Tailwind CSS + shadcn/ui
• Database & Auth: Supabase (PostgreSQL, Auth, RLS)
• AI: Gemini, then Groq, then OpenRouter. A provider is skipped when its key is missing.
• PDF Processing: pdfjs-dist (client-side rendering)Read the full README ↗A portfolio project for drafting insurance appeal letters. Drop an EOB PDF, extract denied claims via Vision AI, and draft an appeal from the notes you paste. Not a HIPAA product. Not for real patient information.
npm install
npm run dev
Copy .env.example. Extraction and letters keep working when a key is absent: that provider is skipped. If none of the three keys are set, the app returns a short message and does not call a model.
| Variable | Required | Purpose |
|---|---|---|
NEXT_PUBLIC_SUPABASE_URL | yes | Supabase project URL |
NEXT_PUBLIC_SUPABASE_ANON_KEY | yes | Supabase anon key |
SUPABASE_SERVICE_ROLE_KEY | server | Service role key |
GEMINI_API_KEY | first AI choice | Direct Gemini API (generativelanguage.googleapis.com) |
GEMINI_MODELS | no | Comma-separated model chain. Default: gemini-3.5-flash-lite,gemini-3.1-flash-lite,gemini-3.8-flash,gemini-2.5-flash-lite. Flash-Lite models are first because Flash models on this key allow only 20 requests a day. |
GROQ_API_KEY | second AI choice | Groq's OpenAI-compatible API. Used for text extraction and letters, not page images. |
GROQ_MODEL | no | Default openai/gpt-oss-120b. The request allows extra output tokens so reasoning fits. |
OPENROUTER_API_KEY | last resort | The previous OpenRouter model chains, unchanged. |
A signed-in GET /api/ai-health pings the first model of each configured provider and returns { provider, configured, models: [{ model, ok, httpStatus }] }. Add ?all=1 to ping every model. Unconfigured providers are listed and not called. The response never includes keys or upstream error text.