Skip to content
Open
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
23 changes: 23 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -42,3 +42,26 @@ jobs:

- name: Production build
run: npm run build

site-quality:
name: Browser and SEO checks
runs-on: ubuntu-24.04
timeout-minutes: 30
steps:
- name: Check out repository
uses: actions/checkout@v7

- name: Set up Node.js
uses: actions/setup-node@v7
with:
node-version: 24
cache: npm

- name: Install dependencies
run: npm ci

- name: Check desktop and mobile browser behavior
run: npm run e2e

- name: Crawl production build and verify SEO
run: npm run launch-check
2 changes: 1 addition & 1 deletion CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ project, check a change and open a pull request.
Use Node.js 22.18 or newer and npm:

```bash
git clone https://github.com/Coding-Professional/procoderji.git
git clone https://github.com/procoderji-com/procoderji.git
cd procoderji
npm ci
npm run dev
Expand Down
101 changes: 47 additions & 54 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,135 +4,128 @@

# ProCoderJii Learning Hub

### A focused learning space for engineering students.
### Free learning resources and campus-placement practice for engineering students.

Browse course resources, learn from practical guides, explore career opportunities, and take a short break with free coding games.
Study, practise reasoning skills, and find practical guidance in one student-focused project.

[Visit the website](https://procoderji.com) · [Report a bug](https://github.com/Coding-Professional/procoderji/issues/new?template=bug_report.yml) · [Request a feature](https://github.com/Coding-Professional/procoderji/issues/new?template=feature_request.yml)
[Website](https://procoderji.com) · [Roadmap](https://github.com/procoderji-com/procoderji/issues/22) · [Report a bug](https://github.com/procoderji-com/procoderji/issues/new?template=bug_report.yml) · [Request a feature](https://github.com/procoderji-com/procoderji/issues/new?template=feature_request.yml)

[![CI](https://github.com/Coding-Professional/procoderji/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/Coding-Professional/procoderji/actions/workflows/ci.yml)
[![CI](https://github.com/procoderji-com/procoderji/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/procoderji-com/procoderji/actions/workflows/ci.yml)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
[![Next.js](https://img.shields.io/badge/Next.js-16-black?logo=next.js)](https://nextjs.org/)
[![TypeScript](https://img.shields.io/badge/TypeScript-5-blue?logo=typescript)](https://www.typescriptlang.org/)

</div>

> [!NOTE]
> The course browser is in place, but no course subjects or notes are published yet. Guides and job listings are also awaiting reviewed content. The two games are playable now. See [Current content](#current-content) for details.
> The course catalogue, guides, and job listings do not yet contain published resources. Pattern Sprint and Digit Recall are playable now. See [current content](#current-content) and the [roadmap](https://github.com/procoderji-com/procoderji/issues/22) for the project direction.

## Contents

- [About](#about)
- [Features](#features)
- [What students can do](#what-students-can-do)
- [Current content](#current-content)
- [Getting started](#getting-started)
- [Commands](#commands)
- [Commands and CI](#commands-and-ci)
- [Project structure](#project-structure)
- [Contributing](#contributing)
- [Security and privacy](#security-and-privacy)
- [Privacy and safety](#privacy-and-safety)
- [License and attributions](#license-and-attributions)

## About

ProCoderJii is a learning hub for engineering students. The project brings course material, practical learning guides, career listings, and small browser games together in one Next.js website. It is built to make useful, reviewed resources easier to browse and to give contributors a clear path for adding them.
ProCoderJii is a student-focused learning hub for engineering coursework and campus-placement preparation. The project aims to make useful, reviewed study resources easier to find and give students short, practical ways to practise skills.

The repository is organized for community contributions: start with the guides below, open an issue to discuss a larger change, and submit a pull request when you are ready.
The site is built with Next.js, React, TypeScript, Tailwind CSS, and MDX. It is a static content-driven app today: there are no user accounts or database, and game scores are not saved. Content is reviewed and registered in the project catalogues before it appears as a published resource.

## Features
## What students can do

- **Course browser:** organize learning material by course, branch, and semester.
- **Games:** Pattern Sprint and Digit Recall are free to play at [`/games`](https://procoderji.com/games). No login is required and scores are not saved between visits.
- **Guides and jobs:** curated sections for practical guides and career opportunities. Only reviewed entries are shown.
- **Optional video cards:** show recent videos from a public YouTube channel feed when configured.
- **Content validation:** validate Markdown and MDX content and prevent unsafe HTML from being rendered.
- **Responsive interface:** browse the site on desktop and mobile.
- **Browse coursework:** navigate course, branch, and semester pages. A page only becomes searchable when useful, reviewed content is published for it.
- **Practise placement skills:** play Pattern Sprint for number-pattern reasoning and Digit Recall for memory practice at [`/games`](https://procoderji.com/games). These are original practice exercises, not official employer assessments or promises of hiring outcomes.
- **Find practical guidance:** read reviewed study, career, and internship resources when they are published.
- **Use the site without an account:** practice is free, works in a browser, and does not save scores between visits.
- **Contribute:** help improve code, documentation, and original learning material through focused pull requests.

There are currently no user accounts, database, admin panel, PDF downloads, or chatbot. The contact form opens the visitor's email app; the site does not store submissions.
Latest-video cards are optional and use a public YouTube feed when configured. The contact form opens the visitor's email app; the site does not store submissions.

## Current content

| Section | Status |
| Area | Status |
| --- | --- |
| Course browser | Course, branch, and semester navigation is available; no subjects or notes are published yet. |
| Games | Pattern Sprint and Digit Recall are playable without an account. |
| Course catalogue | Course, branch, and semester navigation exists; no subjects or notes are published yet. |
| Placement practice | Pattern Sprint and Digit Recall are playable without login; the placement-focused roadmap is in progress. |
| Guides | No reviewed guides published yet. |
| Jobs | No reviewed listings published yet. |
| Videos | Optional; requires a public YouTube channel ID. |
| Jobs and internships | No reviewed listings published yet. |
| Latest videos | Optional; requires a public YouTube channel ID. |

Sample files under `src/content` are intentionally not registered as published notes. Please follow the [content guide](docs/content-guide.md) before adding learning material.
Sample files under `src/content` are intentionally not registered as published notes. Follow the [content guide](docs/content-guide.md) before adding learning material.

## Getting started

### Requirements

- Node.js 22.18 or newer for the full test suite (Node.js 24 is used in CI).
- npm.
- Google Chrome for browser tests. Microsoft Edge can be used with `E2E_CHANNEL=msedge`.

Clone the repository and install its locked dependencies:
- Node.js 24 (the version used in CI).
- npm, included with Node.js.
- Google Chrome for browser checks; Microsoft Edge can be used locally with `E2E_CHANNEL=msedge`.

```bash
git clone https://github.com/Coding-Professional/procoderji.git
git clone https://github.com/procoderji-com/procoderji.git
cd procoderji
npm ci
npm run dev
```

Open <http://localhost:3000>. The site works without environment variables. To show recent videos locally, copy `.env.example` to `.env.local` and configure the public YouTube channel ID.

### Environment
Open <http://localhost:3000>. The site works without environment variables. To enable latest-video cards locally, copy `.env.example` to `.env.local` and configure the public YouTube channel ID.

| Variable | Required | Purpose |
| --- | --- | --- |
| `YOUTUBE_CHANNEL_ID` | No | Enables the latest-video section using the channel's public feed. |
| `NEXT_PUBLIC_SITE_URL` | No | Overrides the canonical site URL, such as for a staging deployment. |
| `NEXT_PUBLIC_SITE_URL` | No | Overrides the canonical site URL, for example in a staging deployment. |

See [deployment documentation](docs/deployment.md) for hosting and environment details. Never commit secrets or personal credentials.
See [deployment documentation](docs/deployment.md) for hosting details. Never commit secrets or private credentials.

## Commands
## Commands and CI

| Command | Purpose |
| --- | --- |
| `npm run dev` | Start the local development server. |
| `npm run lint` | Run ESLint. |
| `npm run typecheck` | Check TypeScript types. |
| `npm test` | Run unit and content validation tests. |
| `npm test` | Run unit and content-validation tests. |
| `npm run build` | Create the production build. |
| `npm run launch-check` | Build and crawl the site, checking links and SEO metadata. |
| `npm run e2e` | Run browser checks in Chrome on desktop and mobile. |
| `npm run e2e` | Build with temporary synthetic content and check browser behavior on desktop and mobile. |
| `npm run launch-check` | Build the real site and crawl links, sitemap, metadata, and SEO rules. |

Browser checks use temporary synthetic content and restore their fixtures when they exit. They refuse to run if `src/data` or `src/content` has local changes. The runner and fixtures are documented in [`e2e/run.mjs`](e2e/run.mjs) and the [`e2e/` directory](e2e/).
Pull requests run lint, type checks, unit tests, a production build, browser checks, and the production link/SEO crawl. The E2E runner refuses to run when `src/data` or `src/content` has local changes, then restores its fixtures when it exits.

## Project structure

```text
src/app/ Routes and page layouts (Next.js App Router)
src/components/ Shared UI and page sections
src/app/ Routes, layouts, metadata, sitemap, and robots rules
src/components/ Shared UI and landing-page sections
src/content/ Markdown and MDX learning content
src/data/ Course, guide, and job catalogues
src/lib/ Content validation, rendering, SEO, and game logic
e2e/ Browser tests, fixtures, and production crawl checks
src/lib/ Validation, rendering, SEO, and game logic
e2e/ Browser checks, fixtures, and production crawl
docs/ Architecture, content, security, and deployment guides
.github/ CI workflow, issue forms, and pull-request template
.github/ CI, Dependabot, issue forms, and pull-request template
.agents/ Optional coding-agent instructions
.claude/ Pointers to canonical agent-tool documentation
seo/ Site-specific search and editorial planning notes
seo/ SEO notes and planning material
```

For the system overview, read [Architecture](docs/architecture.md). To add or update published notes, read the [Content guide](docs/content-guide.md).
Start with [Architecture](docs/architecture.md), the [Content guide](docs/content-guide.md), or [Contributing](CONTRIBUTING.md).

## Contributing

Contributions are welcome. Please read [CONTRIBUTING.md](CONTRIBUTING.md) before opening a pull request. For larger changes, open an issue first so the scope can be discussed. Bug reports and feature ideas can use the repository's issue forms.
Please read [CONTRIBUTING.md](CONTRIBUTING.md) before opening a pull request. For larger changes, check existing issues and discuss the scope first. Bug reports and feature requests have dedicated issue forms. Contributors are expected to follow the [Code of Conduct](CODE_OF_CONDUCT.md).

Contributors are expected to follow the [Code of Conduct](CODE_OF_CONDUCT.md). Submit original learning content or link to official sources; do not copy notes, job descriptions, papers, or images without permission.
Learning material must be original or link to official sources. Do not copy notes, job descriptions, papers, or images without permission. Optional coding-agent tools and their upstream notices are documented in [docs/agent-tools.md](docs/agent-tools.md) and [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md).

## Security and privacy
## Privacy and safety

Please report vulnerabilities using the private reporting instructions in [SECURITY.md](SECURITY.md). The site's data handling is described in its [privacy policy](https://procoderji.com/privacy). For local setup and deployment, see [docs/deployment.md](docs/deployment.md).
Please report vulnerabilities using the private reporting instructions in [SECURITY.md](SECURITY.md). Read the site's [privacy policy](https://procoderji.com/privacy) for information about data handling.

## License and attributions

The project is available under the [MIT License](LICENSE). Optional coding-agent tools and their upstream license notices are documented in [docs/agent-tools.md](docs/agent-tools.md) and [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md).

The `private` setting in `package.json` prevents publishing this app as an npm package; it does not control GitHub repository visibility.
The project is available under the [MIT License](LICENSE). Vendored agent tools retain their separate upstream notices; see [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md).
2 changes: 1 addition & 1 deletion e2e/launch.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -222,7 +222,7 @@ try {
}
if (home.headers.get("x-powered-by")) bad("/", `framework header is still sent: X-Powered-By: ${home.headers.get("x-powered-by")}`);
// Removed template/unused files must not be served any more.
for (const p of ["/next.svg", "/vercel.svg", "/file.svg", "/globe.svg", "/window.svg", "/bg.png"]) {
for (const p of ["/next.svg", "/vercel.svg", "/file.svg", "/globe.svg", "/window.svg", "/bg.png", "/bg.jpg"]) {
if ((await fetch(BASE + p)).status !== 404) bad(p, "unused file is still being served");
}

Expand Down
18 changes: 4 additions & 14 deletions src/app/dashboard/layout.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import { DashboardClientLayout } from "./dashboard-layout-client";
import Image from "next/image";

export default function DashboardLayout({
children,
Expand All @@ -8,19 +7,10 @@ export default function DashboardLayout({
}) {
return (
<>
{/* Background Image with Overlay */}
<div className="fixed inset-0 z-[-1]">
<Image
src="/bg.jpg"
alt=""
aria-hidden="true"
fill
className="object-cover opacity-20 dark:opacity-10"
priority
/>
<div className="absolute inset-0 bg-background/80 backdrop-blur-[2px]" />
<div className="absolute inset-0 bg-gradient-to-b from-background/50 via-transparent to-background/50" />
</div>
<div
aria-hidden="true"
className="fixed inset-0 z-[-1] bg-gradient-to-b from-background via-background to-muted/30"
/>

<DashboardClientLayout>
{children}
Expand Down
2 changes: 1 addition & 1 deletion src/app/terms/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { EmailLink, Fill, H2, LegalLayout, Operator, P, UL, legalMetadata } from

export const metadata = legalMetadata(
"Terms of Use",
"The terms for using ProCoderJii Notes.",
"Review the terms for using ProCoderJii Notes, including acceptable use, ownership of study material, and service limitations.",
"/terms"
);

Expand Down
Loading