A Web of Science-style UI for discovering open-access research papers with multi-source search capabilities, built with Next.js, Fastify, and modern search backends.
- Multi-Source Search: Search across arXiv, CORE, Europe PMC, and NCBI simultaneously
- Smart PDF Resolution: Automatic PDF access with intelligent fallback chains
- Modern UI: Clean, accessible interface built with shadcn/ui and Tailwind CSS
- Flexible Search Backend: Support for Typesense, Meilisearch, and Algolia
- Real-time Faceting: Filter results by source, year, venue, and open access status
- Responsive Design: Works seamlessly on desktop and mobile devices
open-access-explorer/
├── apps/
│ ├── web/ # Next.js frontend (App Router)
│ └── api/ # Fastify API server
├── packages/
│ ├── shared/ # Shared TypeScript types
│ └── search/ # Search backend adapters
└── docker-compose.yml # Local development setup
- Next.js 14 with App Router
- TypeScript for type safety
- Tailwind CSS for styling
- shadcn/ui for components
- Lucide React for icons
- Fastify API server
- TypeScript throughout
- Node.js runtime
- Typesense (recommended)
- Meilisearch
- Algolia (optional)
- arXiv - Preprint repository
- CORE - Open access aggregator
- Europe PMC - Biomedical literature
- NCBI - PubMed/PMC database
- Node.js 18+
- pnpm (recommended) or npm
- Docker (for local search backends)
git clone <repository-url>
cd open-access-explorer
pnpm installCopy the example environment file:
cp env.example .envEdit .env with your configuration:
# Frontend
NEXT_PUBLIC_API_BASE=http://localhost:4000
NEXT_PUBLIC_SEARCH_BACKEND=typesense
# API
PORT=4000
NODE_ENV=development
# Search backends
TYPESENSE_HOST=localhost
TYPESENSE_PORT=8108
TYPESENSE_PROTOCOL=http
TYPESENSE_API_KEY=xyz
# Optional: API keys for enhanced access
CORE_API_KEY=your_core_api_key
NCBI_API_KEY=your_ncbi_api_keyChoose one of the following options:
docker run -p 8108:8108 -v/tmp/typesense-data:/data typesense/typesense:0.25.1 --data-dir /data --api-key=xyz --listen-port 8108 --enable-corsdocker run -p 7700:7700 -v/tmp/meilisearch-data:/meili_data getmeili/meilisearch:v1.5docker-compose up -dpnpm seed# Start API server
pnpm dev:api
# In another terminal, start frontend
pnpm dev:webVisit http://localhost:3000 to see the application.
Search for papers across multiple sources.
Request Body:
{
"q": "machine learning",
"filters": {
"source": ["arxiv", "core"],
"yearFrom": 2020,
"yearTo": 2024
},
"page": 1,
"pageSize": 20,
"sort": "relevance"
}Response:
{
"hits": [...],
"facets": {...},
"page": 1,
"total": 150,
"pageSize": 20
}Get detailed information about a specific paper and resolve PDF access.
Response:
{
"record": {...},
"pdf": {
"url": "https://example.com/paper.pdf",
"status": "ok"
}
}interface OARecord {
id: string; // stable identifier
doi?: string; // Digital Object Identifier
title: string; // paper title
authors: string[]; // author names
year?: number; // publication year
venue?: string; // journal/conference
abstract?: string; // paper abstract
source: "arxiv" | "core" | "europepmc" | "ncbi";
sourceId: string; // source-specific ID
oaStatus?: "preprint" | "accepted" | "published" | "other";
bestPdfUrl?: string; // direct PDF link
landingPage?: string; // canonical page
topics?: string[]; // subject keywords
language?: string; // paper language
createdAt: string; // record creation time
updatedAt?: string; // last update time
}SEARCH_BACKEND=typesense
TYPESENSE_HOST=localhost
TYPESENSE_PORT=8108
TYPESENSE_PROTOCOL=http
TYPESENSE_API_KEY=xyzSEARCH_BACKEND=meili
MEILI_HOST=http://localhost:7700
MEILI_MASTER_KEY=xyzSEARCH_BACKEND=algolia
ALGOLIA_APP_ID=your_app_id
ALGOLIA_API_KEY=your_api_key
ALGOLIA_INDEX=oa_records- Connect your repository to Vercel
- Set environment variables in Vercel dashboard
- Deploy automatically on push to main
Environment Variables:
NEXT_PUBLIC_API_BASE=https://your-api-domain.com
NEXT_PUBLIC_SEARCH_BACKEND=typesense
- Create a new service
- Connect your repository
- Set build command:
pnpm build --filter=api - Set start command:
pnpm start --filter=api
Environment Variables:
NODE_ENV=production
PORT=4000
SEARCH_BACKEND=typesense
TYPESENSE_HOST=your-typesense-host
TYPESENSE_API_KEY=your-api-key
- Create account at Typesense Cloud
- Create a cluster
- Update API configuration with cloud credentials
- Create account at Meilisearch Cloud
- Create a project
- Update API configuration with cloud credentials
apps/
├── web/ # Next.js frontend
│ ├── app/ # App Router pages
│ ├── components/ # React components
│ └── lib/ # Utilities
└── api/ # Fastify API
├── src/
│ ├── routes/ # API routes
│ ├── sources/ # Data source connectors
│ └── lib/ # Utilities
└── Dockerfile
packages/
├── shared/ # Shared types
└── search/ # Search adapters
- Create a new connector in
apps/api/src/sources/ - Implement the
SourceConnectorinterface - Add the connector to the API server
- Update the frontend to handle the new source
- Create a new adapter in
packages/search/src/ - Implement the
SearchAdapterinterface - Add configuration options
- Update the API server to support the new backend
- Fork the repository
- Create a feature branch
- Make your changes
- Add tests if applicable
- Submit a pull request
MIT License - see LICENSE file for details.
For issues and questions:
- Check the Issues page
- Create a new issue with detailed information
- Join our community discussions