A web app that helps researchers identify, explore, and organize academic conferences using semantic, lexical, and hybrid search.
Live: https://scholar.kubishi.com/
- Frontend: Static HTML + vanilla JS + Bootstrap 5
- Backend: Cloudflare Pages Functions (TypeScript)
- Database: Cloudflare D1 (SQLite) with FTS5 for full-text search
- Vector Search: Cloudflare Vectorize (1536 dimensions, cosine similarity)
- Auth: Auth0 SPA SDK with RS256 JWT verification
- Embeddings: OpenAI text-embedding-3-small
- Node.js 18+
- Wrangler CLI
- Cloudflare account
- Auth0 account
- OpenAI API key
npm installnpx wrangler loginnpx wrangler pages dev frontend/publicNote: Local dev has limitations - D1 will be empty and Vectorize doesn't work locally.
npx wrangler pages deploy frontend/public --project-name=kubishi-scholarSet in wrangler.toml under [vars]:
AUTH0_DOMAIN- Your Auth0 domainAUTH0_CLIENT_ID- Auth0 SPA client IDAUTH0_AUDIENCE- Auth0 API audience
Set via Cloudflare Dashboard:
- Go to Workers & Pages > kubishi-scholar > Settings > Environment variables
- Add
OPENAI_API_KEYas an Encrypted variable in Production
Update frontend/public/js/config.js with your Auth0 settings.
kubishi-scholar/
├── frontend/public/ # Static frontend
│ ├── index.html # Main search page
│ ├── css/styles.css # Styles
│ └── js/ # JavaScript modules
├── functions/ # Cloudflare Functions API
│ ├── api/ # API endpoints
│ ├── lib/ # Shared utilities
│ └── _middleware.ts # Auth middleware
├── schema/ # Database schema
│ └── d1-schema.sql # D1 schema with FTS5
├── scripts/ # Migration scripts
├── wrangler.toml # Cloudflare config
└── package.json
| Endpoint | Method | Auth | Description |
|---|---|---|---|
/api/search |
GET | No | Search conferences |
/api/conferences/:id |
GET | No | Get conference by ID |
/api/conferences/count |
GET | No | Get total count |
/api/user |
GET | Yes | Get user profile |
/api/favorites |
POST | Yes | Toggle favorite |
/api/conferences/submit |
POST | Yes | Submit conference |
/api/admin/* |
* | Admin | Admin endpoints |
npx wrangler d1 create kubishi-scholar-dbnpx wrangler d1 execute kubishi-scholar-db --file=schema/d1-schema.sql --remotenpx wrangler vectorize create kubishi-conferences --dimensions 1536 --metric cosine- MIGRATION.md - Migration details from previous stack