CCMC Notes is a comprehensive course-notes library and academic calendar built with Next.js (App Router).
It lets students:
- Browse notes grouped by level, semester, and course
- Search by title, description, or lecturer name
- See recently updated courses at a glance
- Preview PDFs inline (desktop) or open them in a dedicated preview page (mobile)
- Manage class schedules with a full-featured calendar (monthly, weekly, daily, and yearly views)
- Add, edit, and delete timetable entries directly from the calendar
Notes metadata is stored in a single JSON file (public/notes.json) and rendered on the main page.
Note: Replace the URL above with your actual deployment URL (Vercel, Netlify, etc.)
Daily calendar view with detailed timetable, current time indicator, and sidebar with mini calendar and events list
- Framework: Next.js 16 (App Router, TypeScript)
- UI: Tailwind CSS + Radix UI components
- PDF Rendering:
@embedpdffor inline PDF viewing - State Management: React hooks and context
- Internationalization: Custom i18n system (English & French)
- Theme: Dark/Light mode with system preference
- Data Storage:
- Notes: Static JSON (
public/notes.json) - Calendar: LocalStorage (with IndexedDB support ready)
- Notes: Static JSON (
- Feature-based Architecture: Organized codebase following feature-based structure
- Responsive Design: Mobile-first approach with bottom sheets for mobile navigation
- Accessibility: ARIA labels, keyboard navigation, and screen reader support
- Performance: Optimized with React Server Components and client-side caching
- Node.js 18+ and npm
- Git
-
Clone the repository:
git clone https://github.com/yunweneric/ccmc_notes.git cd ccmc_notes -
Install dependencies:
npm install
-
Run the development server:
npm run dev
-
Open your browser:
Navigate to
http://localhost:3000
ccmc_notes/
βββ app/ # Next.js App Router pages
β βββ page.tsx # Home page (notes library)
β βββ calendar/ # Calendar page
β βββ preview/ # PDF preview page
β βββ api/ # API routes
βββ components/ # Shared UI components
β βββ ui/ # Base UI components (Button, Input, etc.)
β βββ theme/ # Theme switcher
β βββ language/ # Language switcher
β βββ github/ # GitHub button
βββ lib/
β βββ features/ # Feature-based modules
β β βββ courses/ # Notes library feature
β β βββ calendar/ # Calendar feature
β β βββ preview/ # PDF preview feature
β β βββ i18n/ # Internationalization
β βββ shared/ # Shared utilities
βββ public/
β βββ notes.json # Notes data source
βββ docs/
βββ screenshots/ # Application screenshots
The app expects public/notes.json to be an array of course groups, each with a list of notes:
[
{
"level": "100",
"semester": "1",
"course_code": "MATH101",
"course": "Math 101",
"notes": [
{
"title": "Lecture 1 β Introduction to Algebra",
"description": "Overview of algebraic foundations and basic notation.",
"lecturer_name": "Dr. John Doe",
"added_date": "2025-09-15",
"file_url": "https://example.com/some-pdf.pdf"
}
]
}
]level: Academic level (e.g.,"100","200", etc.)semester: Semester number (e.g.,"1","2")course_code: Course code identifier (e.g.,"MATH101")course: Human-readable course name (e.g.,"Math 101")notes: Array of individual notes for that coursetitle: Note titledescription: Brief descriptionlecturer_name: Lecturer/Professor nameadded_date: ISO date string (e.g.,"2025-09-15")file_url: Direct link to the PDF file
Important: For inline viewing to work,
file_urlmust point to a PDF that is accessible from the browser and not fully blocked by CORS. If inline loading fails, users can still click "Open in new tab" in the viewer.
- Filter by Level / Semester / Course using the dropdowns (desktop) or bottom sheet (mobile)
- Search notes using the search input (matches on title, description, and lecturer name)
- See recently added courses in the "Recently added courses" section
- Open a note:
- On desktop: Clicking Open shows the PDF inline in the right-hand viewer
- On mobile: Clicking Open navigates to the
/previewpage for a focused PDF view
- Switch views: Use the view switcher to toggle between Month, Week, Day, and Year views
- Navigate dates: Use Previous/Next buttons or click on dates
- Add schedule: Click on empty time slots to add new class schedules
- Edit/Delete: Click on existing schedule blocks to edit or delete them
- Mobile: Use the bottom sheet to access calendar options and settings
The app supports multiple languages:
- English (default)
- French (FranΓ§ais)
Language can be switched via the language switcher in the header (desktop) or options bottom sheet (mobile).
The app supports three theme modes:
- Light - Light color scheme
- Dark - Dark color scheme
- System - Follows system preference
Theme can be switched via the theme switcher in the header (desktop) or options bottom sheet (mobile).
Contributions are welcome! This section explains how to add notes, tweak the UI, or improve functionality.
- Node.js 18+ and npm installed
- Basic familiarity with React / Next.js and TypeScript
-
Fork this repository (if contributing externally)
-
Clone your fork:
git clone <your-fork-url> cd ccmc_notes
-
Install dependencies:
npm install
-
Run the dev server:
npm run dev
-
Make sure the app runs at
http://localhost:3000without TypeScript or runtime errors
- Open
public/notes.json - Follow the existing structure:
- To add a new course, add a new object to the top-level array
- To add a new note to an existing course, append a new object to its
notesarray
- Ensure:
added_dateis a valid date string (e.g.,"2025-09-18")file_urlis a valid PDF link that can be opened in the browser
- Save the file and verify in the browser that:
- The course appears with the correct level/semester
- The new note shows up and opens correctly in the viewer
- Use TypeScript types consistently
- Keep components small and focused
- Follow the feature-based architecture structure
- Prefer existing UI primitives in
components/ui - Follow existing Tailwind CSS style patterns and spacing
- Write accessible code with proper ARIA labels
- For UI changes, update components in
lib/features/[feature]/presentation/ - For behavioral changes, update hooks in
lib/features/[feature]/hooks/ - For data changes, update services in
lib/features/[feature]/data/services/
When you're done:
- Run the dev server and test your changes manually
- Ensure there are no TypeScript or console errors
- Test on both desktop and mobile views
-
Create a feature branch:
git checkout -b feature/short-description
-
Commit your changes with a clear message:
git commit -m "Add notes for CS 201 and improve PDF viewer error message" -
Push and open a Pull Request:
- Describe what you changed
- Mention how to test it
- Include screenshots or GIFs for UI changes if helpful
This project is licensed under the MIT License - see the LICENSE file for details.
- Built with Next.js
- UI components inspired by Radix UI
- PDF rendering powered by @embedpdf
- Icons from Lucide
If you encounter any issues or have questions:
- Check the Issues page
- Create a new issue with a detailed description
- Include screenshots if applicable
Made with β€οΈ for students
β Star this repo if you find it helpful!



