Thank you for wanting to help! This guide will get you from zero to a merged pull request as quickly as possible.
Issues are not arranged with sequence so make sure that you complete accordingly.
- How to pick an issue
- Branch naming
- Commit style
- Code style
- Pull request process
- Who to ping for help
- AI usage policy
- Browse open issues and filter by the
good first issuelabel if you are new. - Leave a comment on the issue you want to work on — e.g. "I'd like to take this." — so others know it is claimed.
- Wait for a maintainer to assign you or give a thumbs-up before you start coding. This avoids duplicate work.
- If an issue has been inactive for more than 7 days with no PR, it is fair game again.
Branch names must follow this pattern:
<type>/<short-description>
| Type | When to use |
|---|---|
feat |
New feature or page |
fix |
Bug fix |
docs |
Documentation only |
style |
Formatting, whitespace — no logic change |
refactor |
Code restructure without behaviour change |
chore |
Tooling, dependencies, CI |
Examples:
feat/alumni-directory-search
fix/navbar-mobile-overflow
docs/contributing-guide
chore/upgrade-tailwind-v4
Branch names should use kebab-case and be ≤ 50 characters.
We follow a simplified version of Conventional Commits:
<type>(<optional scope>): <short imperative summary>
Rules:
- Use the imperative mood in the summary: "add filter" not "added filter".
- Keep the summary ≤ 72 characters.
- Reference the related issue at the end of the body:
Closes #34.
Examples:
feat(directory): add batch-year filter
fix(navbar): correct active link highlight on mobile
docs: add CONTRIBUTING guide
chore(deps): upgrade next to 16.2.3
This project uses TypeScript, React (App Router), and Tailwind CSS v4.
| Rule | Detail |
|---|---|
| Formatter | Prettier (default settings). Run pnpm format if configured. |
| Linter | ESLint — run pnpm lint before pushing. CI will block PRs with lint errors. |
| TypeScript | Strict mode is enabled. Avoid any; prefer explicit types. |
| Tailwind | Use design-system tokens (text-brand, bg-surface, etc.) defined in app/globals.css. Do not add arbitrary hex values. See the Design System (tracked in Issue #4). |
| Components | Reuse primitives from components/ (e.g. Section, SectionHeading). Create a new component if a pattern is used in ≥ 2 places. |
| File naming | PascalCase for React components (MyComponent.tsx), kebab-case for route segments (app/my-page/page.tsx). |
| Imports | Use @/ alias for project-root imports. No relative ../../ imports. |
- Fork the repo and create your branch from
main. - Make your changes, following the code style above.
- Run
pnpm lintand fix any errors. - Open a PR against
mainusing the PR template. Fill in every section of the checklist. - Link the related issue in the PR description (e.g.
Closes #34). - Wait for at least one approving review from a maintainer before merging.
- Squash-merge is preferred; the maintainer will do this when merging.
| Area | Contact |
|---|---|
| General / architecture | @MrImmortal09 |
| UI / design system | Tag the design label on your issue and mention it in the PR |
| CI / infra | Open an issue with the chore label |
You can also start a discussion in the GitHub Discussions tab (if enabled) or reach out via the project's communication channel shared in your onboarding.
Please read and follow the AI Usage Policy before contributing. It outlines your responsibilities when using AI tools, required disclosures, and quality standards for AI-assisted contributions.
Thank you for contributing — every PR counts! 🎓