Scholarships, conference Call-for-Papers, and funding opportunities live on twenty different sites — each with its own layout and its own quiet deadline. NotifyHub pulls them into one place, sorts by what's closing soonest, and gets out of your way.
Screenshot placeholder — drop a hero GIF or PNG of the dashboard here:
docs/screenshot.png. (See DEPLOYMENT.md for the shot list.)
I missed a Call-for-Papers deadline by two days because it lived on a site I forgot existed. The information was public the whole time — I just had no system to catch it. NotifyHub is that system: the deadlines come to you, in one feed, ranked by urgency.
- Three streams, one feed — scholarships, conference CFPs, and funding, normalised into one shape.
- Deadline-aware by default — every card shows days remaining and turns red inside the 7-day window.
- Live, then cached — a FastAPI backend scrapes real page titles/descriptions, then caches for 30 minutes so refreshes stay instant.
- Search & filter — narrow by keyword or category until the feed shows only what fits.
- Never breaks empty — if a source blocks scraping (or the backend is offline entirely), it falls back to curated data and still renders something useful.
- Built to be read — accessible contrast, keyboard focus, reduced-motion support, responsive from phone to desktop.
| Layer | Choice | Why |
|---|---|---|
| UI | React 19 + CRACO | Component model with CRA's comfort and config overrides — no eject. |
| Styling | Tailwind CSS + shadcn/ui | Design-system speed on top of accessible Radix primitives. |
| Routing | React Router v7 | Clean client-side routing for a multi-page SPA. |
| API | FastAPI (Python) | Async, typed, ideal for fanning out scraping work. |
| Data | MongoDB + Motor | Flexible document store with a fully async driver. |
| Hosting | Vercel | Zero-config static hosting and instant preview deploys. |
The frontend works standalone — you can run just the UI and it serves a curated dataset. The backend is an upgrade that swaps in live, scraped metadata.
cd frontend
npm install --legacy-peer-deps # React 19 + a couple of React-18 peers
npm start # http://localhost:3000That's it — open http://localhost:3000 and the feed is already populated.
cd backend
pip install -r requirements.txtCreate backend/.env:
MONGO_URL=mongodb://localhost:27017
DB_NAME=notifyhub
CORS_ORIGINS=http://localhost:3000Run it:
uvicorn server:app --reload --host 0.0.0.0 --port 8000Point the frontend at it with frontend/.env:
REACT_APP_API_BASE_URL=http://localhost:8000/apiThe dashboard now pulls live titles/descriptions from each source (and falls back to curated data for anything that blocks the request).
The frontend's data loader (frontend/src/data/opportunities.js):
- Tries the live API only when it makes sense — it will never call a
localhostbackend from a deployed host, so production stays free of console errors. - On success, enriches each live result with deadlines/tags by id.
- On failure (or no backend), returns the curated bundled dataset.
The result: a Vercel deploy that always looks complete, and a local run that upgrades itself the moment the backend is alive.
.
├── frontend/ # React SPA (the deployable artifact)
│ ├── src/
│ │ ├── pages/ # Landing, Dashboard, Profile, About, About-Project
│ │ ├── components/ # Navbar, Footer, FeedCard, ContactCard, Reveal …
│ │ ├── data/ # opportunities.js — bundled data + smart loader
│ │ └── lib/ # site.js (links), utils.js (cn)
│ └── public/ # index.html, favicon.svg, og.png, manifest
├── backend/ # FastAPI service (optional live scraper)
├── vercel.json # SPA build + rewrites for Vercel
└── docs (this repo) # README · PROJECT_DEEP_DIVE · INTERVIEW_PREP · DEPLOYMENT
- PROJECT_DEEP_DIVE.md — architecture, data flow, and how the hard parts work.
- DEPLOYMENT.md — ship it to Vercel, step by step.
- INTERVIEW_PREP.md — the walkthrough, STAR stories, and likely Q&A.
- CHANGELOG.md — what changed and when.
Chanda Charan Reddy — AI & Automation Engineer, Bangalore.
I ship production LLM systems — from a Springer-published model that reads chest X-rays to document pipelines that run themselves. Before that, I wrote real-time control code for jet engines at DRDO, where a millisecond of lag isn't a bug — it's a flameout.
NotifyHub is one project. There are 18 more (and a few jet engines) over at charanreddy.dev.
Portfolio · GitHub · LinkedIn · Book a call
Want to build something — or break something interesting? Let's talk.