Next.js learning platform for CCNA 200-301. The app is Arabic/English blended, RTL-aware, and generated from the local CCNA material package.
This is an independent educational project. It is not an official Cisco product, is not affiliated with Cisco, and does not claim that its author holds the official CCNA certification. Use Cisco Networking Academy and Cisco's published exam resources as the authoritative sources for the curriculum and certification.
- Dashboard-first learning experience.
- CCNA course catalogue with CCNP marked as coming soon.
- ITN, SRWE, and ENSA tracks.
- 48 generated modules.
- 439 generated lessons.
- Packet Tracer lab path.
- 60 original demo exam questions.
- Topic/resource index and safe NetAcad reference screenshots.
npm run dev
npm run lint
npm run buildThe local Windows environment uses next dev --webpack and next build --webpack because the native Turbopack/SWC binding is not loading correctly on this machine. Vercel can still deploy this as a standard Next.js app.
The app uses Auth.js / NextAuth with Google OAuth. Create .env.local from .env.example and set:
AUTH_SECRET=generate-a-strong-random-secret
AUTH_URL=http://localhost:3000
AUTH_GOOGLE_ID=your-google-oauth-client-id
AUTH_GOOGLE_SECRET=your-google-oauth-client-secretFor Google Cloud OAuth, add this redirect URI:
http://localhost:3000/api/auth/callback/google
On Vercel, set the same variables with the production URL in AUTH_URL, and add the production callback URL in Google Cloud:
https://your-domain.com/api/auth/callback/google
Run this from the ccna-academy folder when the parent ماركداون material changes:
npm run generate:contentThe generated deployment data lives at:
src/data/generated/content.jsonpublic/material/
Vercel builds from the generated data already inside this project; it does not need access to the parent material folder.
Lecture source videos stay outside Git in the parent محاضرات folder. The app stores only metadata, Blob URLs, transcripts, and timestamp mappings.
node scripts/lecture-pipeline.mjs catalog
node scripts/lecture-pipeline.mjs upload
node scripts/lecture-pipeline.mjs transcribe --limit-videos 3 --limit-chunks 12
node scripts/lecture-pipeline.mjs map
npm run generate:contentYouTube playlists are indexed without downloading video files. The pipeline stores video IDs, titles, durations, transcript metadata, and lesson mappings only:
npm run youtube:catalog
npm run youtube:transcripts
npm run lectures:map
npm run generate:contentBy default, YouTube transcript records use metadata fallback when caption tracks are not available
or would require opening each video page. Those records are shown in indexed-material/youtube/
and flagged in the review queue as metadata-only.
Required local/Vercel variables:
BLOB_READ_WRITE_TOKEN=from-vercel-blob
OPENAI_API_KEY=local-only-for-transcription
LECTURE_SOURCE_DIR=D:\path\to\local\lecturescatalog creates محاضرات/indexed-material records and src/data/generated/lecture-videos.json. upload writes Blob URLs into the lecture manifest. transcribe creates Arabic/English transcript chunks with CCNA terms preserved in English. map only publishes medium/high-confidence lesson segments unless --include-low is explicitly used.
Use ccna-academy as the Vercel project root.
Build command:
npm run buildOutput is handled by Next.js automatically. No database is required for the current static course build.
npm audit --omit=dev currently reports a moderate advisory through Next's transitive PostCSS dependency. next@16.2.10 is the latest version available at the time this project was built, and npm's suggested --force fix would downgrade Next to an old breaking version, so it was not applied.