A Next.js-powered browser for FHIR (Fast Healthcare Interoperability Resources) servers. Query and explore healthcare data with an intuitive interface.
FHIRbird is creaated by Runbeam.
- π§ Server Configuration: Easily set and save your FHIR server URL
- π Flexible Querying: Support for search, read by ID, and capability statement queries
- π Custom Headers: Add authentication and custom headers via JSON
- π CORS Proxy: Built-in proxy to bypass CORS restrictions
- π Interactive Results: Expandable JSON viewer with syntax highlighting
- π― Common Resources: Quick access to frequently-used FHIR resource types
- πΎ Persistent Settings: Server URL and preferences saved in local storage
- π Request Details: View the exact request sent (method, URL, headers)
- β‘ Real-time Feedback: Loading states and error handling
- Node.js 18+ and npm
npm installRun the development server:
npm run devOpen http://localhost:3000 in your browser.
npm run build
npm startFHIRbird is deployed at https://fhirbird.runbeam.io
Copy .env.example to .env.local and configure:
cp .env.example .env.localRecommended settings for production:
NODE_ENV=production
# Restrict proxy to trusted FHIR servers
ALLOWED_FHIR_DOMAINS=hapi.fhir.org,*.hl7.org,*.fhir.org,server.fire.lyIn production mode (NODE_ENV=production), users select from a predefined list of FHIR servers instead of entering URLs manually. This improves security and user experience.
Default servers:
- HAPI FHIR R4 (Public Test Server)
- HAPI FHIR R5 (Public Test Server)
- https://server.fire.ly
To customize: Edit the PRODUCTION_FHIR_SERVERS array in components/ServerConfig.tsx
- Set
NODE_ENV=production - Customize
PRODUCTION_FHIR_SERVERSlist if needed - Configure
ALLOWED_FHIR_DOMAINSto match your server list - Enable HTTPS/SSL
- Set up monitoring and logging
- Configure CDN/WAF (Cloudflare, AWS WAF, etc.)
- Review rate limits (currently 60 req/min per IP)
- Set up error tracking (Sentry, etc.)
Click the "Configure" button and enter your FHIR server base URL. For testing, you can use the public HAPI FHIR server:
https://hapi.fhir.org/baseR4
Choose from three query modes:
- Select a resource type (Patient, Observation, etc.)
- Optionally add search parameters like
_count=10orname=Smith - Click "Execute Query"
- Select a resource type
- Enter a specific resource ID
- Click "Execute Query"
- Fetches the server's CapabilityStatement (metadata)
- Shows what resources and operations the server supports
- Click "Execute Query"
Add authentication or custom headers as JSON:
{"Authorization": "Bearer your-token-here"}If your FHIR server doesn't support CORS:
- Check "Use proxy to avoid CORS issues" (enabled by default)
- The app will route requests through a Next.js API proxy
- Uncheck to make direct requests (requires CORS-enabled server)
- Results are displayed in an interactive, expandable tree view
- Click the arrows (βΆ/βΌ) to expand/collapse sections
- Use "View Raw JSON" to see the complete response
- Patient
- Observation
- Condition
- Procedure
- MedicationRequest
- Encounter
- Practitioner
- Organization
- AllergyIntolerance
- DiagnosticReport
- Immunization
- CarePlan
- Framework: Next.js 16 with App Router
- Language: TypeScript
- Styling: Tailwind CSS
- Linting: Biome
fhirbird/
βββ app/
β βββ page.tsx # Main application page
βββ components/
β βββ ServerConfig.tsx # FHIR server configuration
β βββ QueryInterface.tsx # Query builder form
β βββ ResultsDisplay.tsx # Results viewer
βββ README.md
FHIRbird includes a built-in proxy to handle CORS issues:
- Enabled by default: Requests go through
/api/fhir-proxy - How it works: The Next.js server makes the request server-side (no CORS restrictions)
- When to disable: Only if your FHIR server has CORS properly configured
The proxy preserves all custom headers including authentication tokens.
FHIRbird includes several security measures to prevent abuse:
- 60 requests per minute per IP address
- Prevents DoS attacks and excessive API usage
- Returns 429 status when limit exceeded
- Only HTTP/HTTPS protocols allowed
- Private IP ranges (127.x, 10.x, 192.168.x, 172.16-31.x) blocked only when
NODE_ENV=production - Localhost and private IPs are allowed in development mode for local testing
- 30 second timeout on proxy requests
- 10MB response size limit to prevent memory exhaustion
- Automatic cleanup of aborted requests
For production deployments, consider:
- Authentication: Add API keys or OAuth to the proxy endpoint
- Distributed Rate Limiting: Use Redis instead of in-memory storage
- Allowlist: Restrict proxy to specific FHIR server domains
- Monitoring: Log and alert on suspicious patterns
- CDN/WAF: Use Cloudflare or AWS WAF for additional protection
MIT
Contributions welcome! Please feel free to submit a Pull Request.

