Beginners shouldn't struggle to find their first open-source contribution. OpenForge surfaces hand-picked, beginner-friendly GitHub issues in secondsβcutting discovery time from hours to minutes.
- Open: https://open-forge.netlify.app/
- Search:
"react"or"vue" - Click a project β instantly explore beginner-friendly issues
Live endpoints:
- Frontend: https://open-forge.netlify.app/
- Backend API: https://openforge-48r0.onrender.com/api
Note: Backend runs on free tier. First request takes 20β40 seconds (cold start). Subsequent requests are instant.
Finding my first open-source issue took hours of GitHub searching. Most beginners give up before their first PR.
OpenForge was built to solve that frictionβindexing 500+ hand-picked repositories and surfacing real-time "good first issue" opportunities without the noise.
| Feature | Benefit |
|---|---|
| Curated projects | Community-submitted, hand-vetted repos (not scraped noise) |
| Distributed Redis Cache | Real-time issues cached via Redis to prevent rate limiting with fallback |
| Smart Autocomplete | Keyboard-navigable live suggestions for projects & technologies |
| Unified Dark Mode | Premium, eye-friendly theme with SVG toggle icon & zero white flashes (FOUC) |
| Local Bookmarks | Save favorite projects for later reference using safe browser local storage |
| Smart filtering | Search by project, tech stack, tags, difficulty level |
| Safe rendering | No XSS risk β all user content sanitized via DOM APIs |
The landing page highlights OpenForge's mission with a hero banner, showing "Now indexing 500+ beginner issues" and search functionality.

Browse curated projects with filtering by technology, difficulty level, and sorting options. Each project card displays difficulty badges and project descriptions.

Search and filter "good first issue" opportunities pulled directly from OpenForge repositories. Results are cached for performance with refresh controls.

Community members can easily add their repositories to OpenForge to help beginners discover them. Simple form for project name, description, GitHub URL, tags, and difficulty level.

- Frontend: Static HTML / CSS / Vanilla JS (zero build complexity)
- Backend: Python Flask + GitHub API integration (now reuses HTTP connections via a persistent
requests.Sessionfor better performance) - Testing: Python unittest suite
- Deployment: Netlify (frontend) + Render (backend)
cd backend
python -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -r requirements.txt
python app.py # Dev server at http://127.0.0.1:5000Or run production-like:
gunicorn backend.app:app --bind 0.0.0.0:5000Environment variables (optional .env file):
GITHUB_TOKEN: GitHub API token for higher rate limits (recommended).REDIS_URL: Redis database connection string (e.g.redis://localhost:6379) to enable distributed caching.ALLOWED_ORIGIN: Comma-separated CORS origins (default: all origins allowed).
cd frontend
python -m http.server 5500
# Open http://127.0.0.1:5500/index.htmlTo point at a custom API URL:
API_URL=http://127.0.0.1:5000/api bash ../scripts/generate-config.shpython -m unittest backend.test_app -vList all indexed repositories.
Query parameters:
query: Search by name, description, or tags (case-insensitive).tag: Filter by tag (exact match, case-insensitive).difficulty: Filter by difficulty (Easy,Medium,Hard).sort: Sort byname,difficulty, oroldest(default: insertion order).
Example:
curl "http://127.0.0.1:5000/api/projects?query=react&difficulty=Easy&sort=name"Response:
[
{
"id": 1,
"name": "React",
"description": "A JavaScript library for building user interfaces.",
"githubUrl": "https://github.com/facebook/react",
"tags": ["javascript", "frontend", "ui"],
"difficulty": "Medium"
}
]Submit a new repository to the index.
Request body:
{
"name": "Project Name",
"description": "Brief description.",
"githubUrl": "https://github.com/owner/repo",
"tags": ["javascript", "frontend"],
"difficulty": "Easy"
}Validation:
- All fields required.
githubUrlmust be a valid http/https GitHub URL.difficultymust beEasy,Medium, orHard.- At least one tag required (comma-separated string or array).
Response (201):
{
"message": "Project added successfully!",
"project": { /* submitted project */ }
}Fetch live "good first issue" items from indexed repositories.
Query parameters:
query: Optional search term (passed to GitHub API).
Example:
curl "http://127.0.0.1:5000/api/issues?query=documentation"Response:
[
{
"id": 12345,
"title": "Add documentation for new feature",
"repoLink": "https://github.com/owner/repo",
"issueLink": "https://github.com/owner/repo/issues/123"
}
]| Component | Choice | Why |
|---|---|---|
| Data storage | Single JSON file (backend/data.json) |
Simple, fast for demo scope |
| Issue caching | 15-min in-memory TTL | Balances freshness & GitHub API limits |
| Thread safety | RLock + Lock primitives | Safe concurrent reads/writes |
| GitHub integration | Search API + "good first issue" label | Real-time, authoritative data |
- β
No secrets in repo β use
.envfile (ignored in git) - β
CORS configured β restrict origins via
ALLOWED_ORIGINenv var - β
XSS-safe rendering β all user content via
.textContent&.setAttribute(never.innerHTML) - β Error handling β graceful API fallbacks, no stack traces exposed
| Limitation | Impact | Solution |
|---|---|---|
| Single JSON file storage | Not horizontally scalable | Replace with PostgreSQL (v2) |
| No auth on POST | Anyone can submit projects | Add API key authentication (v2) |
| Distributed Cache Fallback | Uses in-memory cache if Redis is down | Silently fallback to process memory |
- Connect your GitHub repository.
- Build command:
pip install -r requirements.txt - Set start command:
gunicorn backend.app:app --bind 0.0.0.0:$PORT - Add environment variables:
GITHUB_TOKEN(do NOT commit this)ALLOWED_ORIGIN(if restricting CORS)
- Deploy.
Alternatively, use the Procfile for Heroku or similar platforms.
- Connect your GitHub repository.
- Build command:
bash ./scripts/generate-config.sh - Publish directory:
frontend - Set environment variable:
API_URL=https://your-backend-url/api - Deploy.
The netlify.toml and scripts/generate-config.sh automatically inject the API URL into frontend/config.js at build time.
Contribute / Contact
- Open an issue or PR on the repository. Licensed under the MIT License.
We welcome contributions of all levels, especially from participants of the Elite Coders Summer of Code (ECSoC) 2026! Please read our Contributing Guide for full instructions.
Before contributing, please make sure you understand our rules:
- Issue Assignment: You must be assigned to an issue before writing code or submitting a PR. Unassigned PRs may be closed.
- One PR per Issue: Keep your PRs small and focused. Do not mix multiple issues in one PR.
- UI Screenshots: Include before/after screenshots for any interface changes.
- Code Ownership: If you submit generated code, you must review and verify it yourself.
To run OpenForge locally:
- Backend (Flask):
cd backend python -m venv .venv # Windows: .venv\Scripts\activate # macOS/Linux: source .venv/bin/activate pip install -r requirements.txt python app.py
- Frontend (HTML/CSS/JS):
Open
cd frontend # optional: point to local backend API API_URL=http://127.0.0.1:5000/api bash ../scripts/generate-config.sh python -m http.server 5500
http://127.0.0.1:5500/index.htmlin your browser.
- Explore: Find a labeled issue or create a new one using our templates.
- Claim: Request assignment by commenting on the issue.
- Priority: Issue creators receive first priority to implement their own issues.
- Activity: Assignees must show active progress. Inactivity of 3 days or more may result in reassignment.
- Fork & Branch: Fork this repo, create a branch named
feature/issue-<num>-<desc>orbugfix/issue-<num>-<desc>. - Implement & Test: Code your solution, run backend unit tests (
python -m unittest backend.test_app -v), and verify frontend functionality with no console errors. - Submit: Open a PR using our PR Template. Link the issue (e.g.,
Closes #12). - Review & Merge: A maintainer will review, request changes if necessary, tag it with
ECSoC26, and squash-merge once approved.
- Python: Follow PEP 8 guidelines.
- Frontend: Semantic HTML5, Vanilla CSS for responsive layouts, and safe DOM APIs (avoid
innerHTMLwith user inputs). - Commits: Follow Angular/Conventional Commits (e.g.,
feat(ui): ...,fix(api): ...).
We are dedicated to providing a welcoming, diverse, and safe environment for all contributors. Please review our Code of Conduct for details on expected behavior and reporting guidelines.
Made for hackathon. Ready for production.