One place for everything happening in the global startup ecosystem: funding rounds, accelerator cohorts, investor profiles, startup jobs, product launches, GitHub projects, and startup news. Stackd aggregates public feeds and APIs, and every item links back to its original source.
Stackd is an aggregator. It does not claim ownership of syndicated content.
- Global by default: Americas, Europe, SEA, India, LATAM, Africa, and Global.
- Works without paid APIs: RSS feeds, Hacker News, GitHub public search, local JSON directories, and SQLite are enough for a demo.
- Cross-entity search across startups, investors, news, jobs, cohorts, launches, and repositories.
- Community data in
data/cohorts.json,data/investors.json, anddata/startups.json. - No accounts: the only user data stored is digest subscriber email.
- Free-tier friendly scheduler: ingestion jobs run every 24 hours, and demos can use manual refresh.
- Frontend: Next.js App Router, React, Tailwind CSS, Base UI/shadcn-style components.
- Backend: Python FastAPI, APScheduler, Prisma Client Python.
- Database: SQLite for local development, Neon/PostgreSQL for production.
- Hosting: Vercel for frontend, Render for backend, Neon for Postgres.
- Email: Resend for digest delivery.
- Frontend:
https://stackd-startups.vercel.app - Backend:
https://stackd-backend-4cb7.onrender.com
Render free instances can sleep. The first request after inactivity may be slow.
git clone https://github.com/Rayan9064/Stackd.git
cd Stackd
copy .env.example .env
python -m venv venv
.\venv\Scripts\Activate.ps1
pip install -r backend\requirements.txt
python backend\setup_db.py
python -m uvicorn backend.main:app --host 127.0.0.1 --port 8000The backend runs at http://127.0.0.1:8000.
Check it:
Invoke-RestMethod http://127.0.0.1:8000/healthPopulate data immediately:
Invoke-RestMethod -Method Post http://127.0.0.1:8000/api/admin/refreshOpen a second terminal:
cd Stackd\frontend
npm install
npm run devThe frontend runs at http://localhost:3000.
For local development:
NEXT_PUBLIC_API_URL="http://127.0.0.1:8000"Set these on Render for the backend service:
PYTHON_VERSION="3.11.9"
DATABASE_URL="postgresql://USER:PASSWORD@HOST/neondb?sslmode=require"
CORS_ORIGINS="https://stackd-startups.vercel.app,http://localhost:3000,http://127.0.0.1:3000"
AUTO_REFRESH_ON_STARTUP="true"
AUTO_REFRESH_COOLDOWN_HOURS="12"
RESEND_API_KEY=""
RESEND_FROM_EMAIL="digest@example.com"
PH_API_KEY=""
REDDIT_CLIENT_ID=""
REDDIT_CLIENT_SECRET=""
GITHUB_TOKEN=""Notes:
- Local development can use
DATABASE_URL="file:./dev.db". - Use Neon’s pooled Postgres connection string in production.
RESEND_API_KEYis only required for sending digest emails.- Product Hunt, Reddit, and GitHub tokens are optional. Missing optional keys should not crash the app.
GITHUB_TOKENis recommended for higher GitHub API rate limits.AUTO_REFRESH_ON_STARTUP=trueruns source ingestion after backend boot unless the latest source run is inside the cooldown window.AUTO_REFRESH_COOLDOWN_HOURS=12prevents free-tier restarts from repeatedly hitting external APIs.- If Prisma has trouble with Neon, use
sslmode=requireand omitchannel_binding=require.
Set this on Vercel for the frontend project:
NEXT_PUBLIC_API_URL="https://stackd-backend-4cb7.onrender.com"Do not put backend secrets in Vercel.
Create a Render Web Service from the repository:
- Runtime: Python 3
- Branch:
main - Root Directory:
backend - Build Command:
pip install -r requirements.txt && python setup_db.py- Start Command:
uvicorn main:app --host 0.0.0.0 --port $PORTsetup_db.py handles Prisma schema setup, prisma db push, client generation, and copies the Prisma query engine binary into the app directory for Render runtime.
After deploy:
Invoke-RestMethod https://stackd-backend-4cb7.onrender.com/healthThe backend starts a background refresh automatically after boot when AUTO_REFRESH_ON_STARTUP=true.
Use POST /api/admin/refresh only when you want to force a demo refresh outside the cooldown window.
Import the repository into Vercel:
- Framework: Next.js
- Root Directory:
frontend - Environment Variable:
NEXT_PUBLIC_API_URL
After changing NEXT_PUBLIC_API_URL, redeploy the frontend. The API-backed pages are rendered dynamically and fetch backend data with cache: no-store.
All list responses include:
{ "data": [], "total": 0, "page": 1, "limit": 50, "hasMore": false }Important routes:
GET /healthGET /api/newsGET /api/launchesGET /api/jobsGET /api/fundingGET /api/startupsGET /api/cohortsGET /api/investorsGET /api/githubGET /api/search?q=aiPOST /api/digest/subscribePOST /api/admin/refresh
- News RSS: every 24 hours.
- Indie Hackers RSS: every 24 hours.
- Hacker News: every 24 hours.
- Reddit: every 24 hours, skipped unless credentials are present.
- Product Hunt: every 24 hours, skipped unless
PH_API_KEYis present. - GitHub: every 24 hours, works without a token but benefits from
GITHUB_TOKEN. - Jobs: every 24 hours.
- Weekly digest: Sunday 09:00 UTC.
On Render free tier, APScheduler only runs while the backend service is awake. Startup refresh covers normal redeploys, while POST /api/admin/refresh is still available for manual demo refreshes.
Community-maintained JSON files live in data/.
- Add accelerators to
data/cohorts.json. - Add investors to
data/investors.json. - Add startup profiles to
data/startups.json. - Add source-backed startup enrichment to
data/startup_enrichment.json.
Always include a sourceUrl.
Current startup profile data comes from:
data/startups.json: curated startup directory, official website, geography, sector, stage, and one-line profile.data/startup_enrichment.json: manually curated source-backed social links, funding rounds, profile sources, and ownership/shareholder slices where public percentages exist.- Adapter-backed graph evidence: Product Hunt, Hacker News, GitHub, jobs, news/RSS, Reddit, and local directory records attach signals to curated startups only when matching is safe.
Useful checks before shipping:
python -m pytest backend\tests -q
cd frontend
npm run lint
npm run buildThen run:
Invoke-RestMethod -Method Post http://127.0.0.1:8000/api/admin/refresh
Invoke-RestMethod http://127.0.0.1:8000/api/news
Invoke-RestMethod http://127.0.0.1:8000/api/search?q=aiFor production:
Invoke-RestMethod https://stackd-backend-4cb7.onrender.com/health
Invoke-RestMethod https://stackd-backend-4cb7.onrender.com/api/newsMIT