Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions Contribution.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# Contributing to Good First Issue

Thank you for wanting to contribute! Please follow these steps to add a new project.

---

## How to Add a New Project

1. Fork the repository and clone it locally.
2. Open `data/projects.json`.
3. Add your project entry at the end of the list.
4. Make sure all required fields are present (see schema.json for reference).
5. Run the validation script to check your project:
```bash
npm install
npm run validate-projects
21 changes: 21 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -54,3 +54,24 @@ $ bun dev # start the development server
```

The app should open in your browser.


## Adding a New Project

If you want to add a new open-source project to this list, please follow the
step-by-step guide in the documentation below:

👉 [How to Add a New Project](docs/adding-a-new-project.md)

Make sure to validate your changes before submitting a Pull Request.

## New Feature: Real-Time Search

We have added a **real-time search** feature to make it easier to find projects:

- Search by **project name**, **language**, or **labels**
- Results update **instantly** as you type
- Works with all projects in `data/projects.json`

Try it out in the `website/index.html` page!

25 changes: 25 additions & 0 deletions Website/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Good First Issue Projects</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<h1 style="text-align:center;">Good First Issue Projects</h1>

<div id="search-container">
<input
type="text"
id="repo-search"
placeholder="Search projects by name, language, or label..."
/>
</div>

<div id="project-list">
<!-- Project items will appear here -->
</div>

<script src="scripts.js"></script>
</body>
</html>
51 changes: 51 additions & 0 deletions Website/script.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
document.addEventListener("DOMContentLoaded", () => {
const searchInput = document.getElementById("repo-search");
const projectList = document.getElementById("project-list");

// Dummy data (later connect to data/projects.json)
const projects = [
{
name: "Sample Project",
description: "This is a sample project for testing search.",
github_url: "https://github.com/example/sample-project",
labels: ["good first issue"],
language: "JavaScript"
},
{
name: "Test Project",
description: "Another example project.",
github_url: "https://github.com/example/test-project",
labels: ["help wanted"],
language: "Python"
}
];

// Render projects
function renderProjects(items) {
projectList.innerHTML = items
.map(
(p) => `
<div class="project-item">
<h3>${p.name}</h3>
<p>${p.description}</p>
<small>${p.language} | Labels: ${p.labels.join(", ")}</small>
</div>
`
)
.join("");
}

renderProjects(projects);

// Real-time search
searchInput.addEventListener("input", (e) => {
const query = e.target.value.toLowerCase();
const filtered = projects.filter(
(p) =>
p.name.toLowerCase().includes(query) ||
p.language.toLowerCase().includes(query) ||
p.labels.some((label) => label.toLowerCase().includes(query))
);
renderProjects(filtered);
});
});
27 changes: 27 additions & 0 deletions Website/style,css
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
body {
font-family: Arial, sans-serif;
margin: 20px;
}

#search-container {
text-align: center;
margin-bottom: 20px;
}

#repo-search {
width: 50%;
padding: 10px;
font-size: 16px;
border-radius: 8px;
border: 1px solid #ccc;
}

#project-list .project-item {
padding: 10px;
border-bottom: 1px solid #eee;
transition: background 0.2s;
}

#project-list .project-item:hover {
background-color: #f9f9f9;
}
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -24,3 +24,4 @@
"dayjs": "^1.11.10"
}
}

30 changes: 30 additions & 0 deletions projects.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
[
{
"name": "Sample Project",
"description": "This is a sample project for testing search.",
"github_url": "https://github.com/example/sample-project",
"labels": ["good first issue"],
"language": "JavaScript"
},
{
"name": "Test Project",
"description": "Another example project for practice.",
"github_url": "https://github.com/example/test-project",
"labels": ["help wanted"],
"language": "Python"
},
{
"name": "Frontend Fun",
"description": "A fun project to test UI skills.",
"github_url": "https://github.com/example/frontend-fun",
"labels": ["good first issue", "UI"],
"language": "HTML"
},
{
"name": "Backend Buddy",
"description": "Example backend project for learning APIs.",
"github_url": "https://github.com/example/backend-buddy",
"labels": ["help wanted"],
"language": "Node.js"
}
]
1 change: 1 addition & 0 deletions vercel.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,4 @@
"framework": "nuxtjs",
"installCommand": "yum install -y python3-pip"
}