OpenDiscover is a curated directory that helps you find, verify and trust open-source software β apps, AI models, privacy tools and dev tools β and then sends you straight to the official upstream source. We index metadata. We never host, repackage or distribute binaries.
"Discover the code that powers the future."
Live demo build: krishna3163.github.io/OpenDiscover
- Tokenised, accent-insensitive, typo-tolerant ranking across title, tags, category, licence,
platform, source and description (
src/lib/search.ts). - Intent keywords are derived automatically β search
vpn,notes,llm,password manager,terminaland get the projects that mean that, not just the ones that spell it. - Faceted filters (category Β· licence Β· platform Β· source Β· Trust Score Β· verified-only),
five sort orders, "load more" pagination and
<mark>highlighting of why a result matched. - Every result set is a shareable URL:
/?q=privacy+browser&sort=trust&license=GPL-3.0&verified=1. - Press
/anywhere to jump to search,Escto clear. Recent searches are remembered locally.
- Trust Scoreβ’ (0β100) with a published rubric β licence family, maintenance age, community size, upstream verification, release signing.
- Plain-English licence explainer for MIT, Apache, GPL, AGPL, LGPL, MPL, BSD, CC0, Unlicense,
RAIL/model licences β and an explicit
β οΈ "Not open source" flag for entries that are indexed only for awareness. - Honest, derived signals: no decorative fake charts, no invented download numbers.
- Save projects with one click; persisted in
localStorage, synced across tabs, with its own page.
- Talks to Gemini over plain
fetchwith full conversation history, timeouts and aborts. - Proxy-ready: point
VITE_AI_PROXY_URLat your own function so the API key never ships to the browser (example worker inexamples/ai-proxy). - Offline fallback: with no key at all, the assistant answers from the real catalogue using the same search ranking β so the chat is never dead in a demo or in CI.
- Chat history persists per conversation; markdown rendering is HTML-safe (no
dangerouslySetInnerHTML).
- Forum hub, per-category threads, staff roster, demo chat with a staff view and notification opt-in.
- Per-project discussion threads stored locally with seeded examples.
- React 19 + TypeScript strict, Vite 7, route-level code splitting, vendor chunking.
ErrorBoundaryon every route,404page that suggests real projects,ScrollToTop, dynamicdocument.title, SEO/OG/JSON-LD meta,robots.txt,sitemap.xml, custom favicon.- Accessibility: skip link, semantic landmarks, visible focus rings,
aria-pressed/aria-expanded,aria-liveresult counts, and fullprefers-reduced-motionsupport. - ESLint 9 flat config +
tsc+ 100 Vitest tests (including dataset-integrity and app smoke tests) run in GitHub Actions on every push and PR. - The catalogue is exported to a real static API at build time:
/data/projects.json.
| Layer | Choice |
|---|---|
| UI | React 19, TypeScript (strict), React Router 7 |
| Build | Vite 7 (code-split per route, manualChunks for vendors) |
| Motion | Framer Motion (reduced-motion aware) |
| Styling | Vanilla CSS custom properties β one design system in src/index.css, no UI framework |
| Icons | Emoji, for zero weight |
| AI | Google Gemini REST API (or your proxy), with an offline catalogue fallback |
| Tests | Vitest |
| Quality | ESLint 9, tsc --noEmit, GitHub Actions |
| Hosting | GitHub Pages / Firebase / Cloud Run / any static host |
- Node.js 20.19+ (or 22 LTS)
- npm 10+
git clone https://github.com/krishna3163/OpenDiscover.git
cd OpenDiscover
npm install
npm run dev # http://localhost:5173That's it β no API key required. Search, filters, favourites, categories, project pages and the offline assistant all work out of the box.
cp .env.example .env# Option A β local development only (the key is visible in the browser!)
VITE_GEMINI_API_KEY=your-key-from-aistudio.google.com
VITE_GEMINI_MODEL=gemini-2.0-flash
# Option B β production: keep the key on your server
VITE_AI_PROXY_URL=https://your-worker.example.com/api/chat
β οΈ Anything prefixedVITE_is bundled into the client and is public. For production use the proxy (Option B). See SECURITY.md andexamples/ai-proxy.
| Command | Description |
|---|---|
npm run dev |
Dev server with HMR |
npm run build |
Exports the dataset, type-checks, builds dist/ |
npm run preview |
Serve the production build |
npm run lint / npm run lint:fix |
ESLint |
npm run typecheck |
tsc -b --noEmit |
npm test / npm run test:watch |
Unit tests |
npm run export:data |
Regenerate public/data/projects.json |
npm run deploy |
Build + publish to GitHub Pages (gh-pages) |
.
βββ .github/ CI + Pages workflows, issue & PR templates
βββ docs/ Deployment guide, roadmap
βββ examples/ai-proxy/ Minimal proxy that keeps the Gemini key server-side
βββ public/ favicon, robots.txt, sitemap.xml, 404.html, banner
βββ scripts/ export-catalogue.mjs β public/data/projects.json
βββ src/
βββ components/ Header, Hero, ProjectCard, ProjectExplorer, TrustRing, Markdown, β¦
βββ config/ demo.ts (non-secret demo config), site.ts (identity & links)
βββ context/ auth Β· favorites Β· toast (context objects split from providers
β so React Fast Refresh keeps working)
βββ data/ projects.ts (the curated catalogue) + community.ts (demo forum)
βββ hooks/ useDebounce
βββ lib/ search Β· catalog Β· tags Β· routes Β· storage Β· time Β· ghPages (all pure)
βββ pages/ one file per route, lazily loaded
βββ services/ ai.ts (Gemini/proxy transport) + localAssistant.ts (offline fallback)
βββ types.ts shared domain types
Design rule: anything that can be pure lives in src/lib/ and gets a test. Components stay thin.
Edit src/data/projects.ts β search tags are derived for you:
{
id: 612,
title: "Your Project",
description: "One honest sentence about what it does.",
category: "Dev Tools", // must be one of the six known categories
license: "MIT",
source: "GitHub",
stars: "1.4k",
verified: true,
link: "https://github.com/you/your-project", // official upstream only
trustScore: 88,
platforms: ["Linux", "Windows"],
lastUpdated: "2 weeks ago"
}npm test includes dataset-integrity checks β duplicate ids, non-official link hosts,
download portals, out-of-range Trust Scores, unparseable dates and proprietary entries marked
verified all fail the build. Details in CONTRIBUTING.md.
Full instructions (GitHub Pages with Actions, gh-pages, Firebase Hosting, Cloud Run + Docker,
Netlify/Vercel/Cloudflare, and how to wire the AI proxy) live in docs/DEPLOYMENT.md.
The repo already ships:
.github/workflows/ci.ymlβ lint Β· typecheck Β· test Β· build on every push/PR.github/workflows/deploy.ymlβ build + publish to GitHub Pages onmainpublic/404.html+src/lib/ghPages.tsβ deep links survive a refresh on PagesDockerfile+nginx.confβ production container with SPA routing
Set VITE_BASE_PATH=/OpenDiscover/ when serving from a project page (the Pages workflow does this
for you).
See docs/ROADMAP.md for the prioritised list: live GitHub/HF metadata sync, compare view, light theme, real accounts, i18n, PWA/offline, and more.
MIT Β© 2025 Krishna and the OpenDiscover contributors β see LICENSE.
- Maintainer: Krishna β kk3163019@gmail.com
- GitHub: @krishna3163 Β· LinkedIn: krishna0858
- Report a bad listing: open an issue
- Security: SECURITY.md
Built with β€οΈ for the open-source community.
