OfflineAcademy
A self-hosted, LAN-first video course library for private learning.
Turn a local folder of course videos into a clean learning dashboard with progress tracking, bookmarks, tags, categories, and optional AI-generated quizzes.
Table of Contents
- Why OfflineAcademy?
- Feature Highlights
- Screenshots
- Tech Stack
- Quick Start
- Docker Deployment
- Configuration
- Course Folder Structure
- Data & Persistence
- Updating
- Backup
- Security Notes
- License
Why OfflineAcademy?
Most online course platforms assume cloud storage, user accounts, subscriptions, and constant internet access. OfflineAcademy is built for a different workflow:
- You already have course videos stored locally.
- You want a clean interface to browse, watch, and resume lessons.
- You want progress tracking without uploading your learning data anywhere.
- You want a private LAN app that works from your desktop, laptop, tablet, or phone.
- You want optional quiz practice without turning the app into a cloud product.
OfflineAcademy is designed for single-user local/LAN deployments: home servers, NAS boxes, mini PCs, Docker hosts, homelabs, and personal workstations.
Feature Highlights
Course Library
- Scan a local course directory and build a browsable library.
- Display course cards with progress, metadata, tags, categories, and quick actions.
- Pin/favorite important courses.
- Rename courses from the UI.
- Delete from library to hide/archive without deleting files.
- Delete from disk when you intentionally want to remove course files.
- Unified action menus across dashboard and course pages.
Video Learning Experience
- Browser-based playback for local video files.
- Resume playback from the last watched position.
- Track lesson progress automatically.
- Continue watching card for the most recent lesson.
- Mobile-friendly controls and responsive layout.
- Playback speed controls.
- Fullscreen and picture-in-picture support where supported by the browser.
- Keyboard shortcuts overlay.
Bookmarks & Learning Notes
- Bookmark lessons for later review.
- Store bookmark notes alongside lessons.
- Revisit saved moments without hunting through folders manually.
Course Organization
- Add custom tags to courses.
- Add categories to courses.
- Filter and search the course library.
- Keep all organization metadata local to the app/database.
AI Quiz Practice
- Generate module-level practice quizzes.
- Supports QuizAPI and The Trivia API.
- Per-video quiz topic overrides.
- Clear or regenerate quizzes from course actions.
- Smart skip logic for low-value quiz targets:
- introductions
- footnotes
- appendices
- bonus lectures
- modules without useful quiz topics
- Graceful fallback handling when providers rate-limit or lack matching categories.
Offline & Local-First Design
- No accounts.
- No user profiles.
- No required cloud storage.
- Local SQLite database via Prisma.
- Offline-capable PWA behavior through service worker caching.
- Machine-scoped settings from the app UI.
Deployment-Friendly
- Local Node.js deployment.
- Docker and Docker Compose support.
- Portable folder mounts for courses and database.
- Suitable for trusted LAN/homelab environments.
Screenshots
Add screenshots here after cloning or publishing the repository.
Recommended images:
docs/screenshots/dashboard.png
docs/screenshots/course-page.png
docs/screenshots/watch-page.png
docs/screenshots/settings.png
Example Markdown:

Tech Stack
Frontend Next.js 14, React 18, TypeScript
Styling Tailwind CSS, Radix UI
Database SQLite
ORM Prisma
Runtime Node.js
Deploy Docker / Docker Compose or local Node.js
Quick Start
Prerequisites
- Node.js 18+ recommended
- npm
- A folder containing your course videos
1. Clone the repository
git clone https://github.com/YOUR_USERNAME/offlineacademy.git
cd offlineacademy
2. Create your environment file
cp .env.example .env
Edit .env if needed:
DATABASE_URL="file:./dev.db"
COURSES_ROOT="./My_Courses"
NEXT_PUBLIC_APP_URL="http://localhost:6767"
QUIZAPI_KEY=""
3. Install dependencies
npm ci
4. Prepare the database
npx prisma generate
npx prisma db push
5. Add courses
Create a course folder:
mkdir -p My_Courses
Place your course folders inside My_Courses.
6. Build and run
npm run build
npx next start -p 6767
Open:
http://localhost:6767
Docker Deployment
Docker is the recommended deployment path for most users.
1. Clone the repository
git clone https://github.com/YOUR_USERNAME/offlineacademy.git
cd offlineacademy
2. Create .env
cp .env.example .env
3. Create local folders
mkdir -p My_Courses prisma
touch prisma/dev.db
4. Start the app
docker compose up --build -d
Open:
http://localhost:6767
For LAN access, replace localhost with your server IP:
http://YOUR_SERVER_IP:6767
Custom Course Folder
You can store courses anywhere on the host. Update docker-compose.yml and map your folder to /app/My_Courses inside the container:
volumes:
- /path/to/your/courses:/app/My_Courses
- ./prisma/dev.db:/app/prisma/dev.db
Examples:
# Linux
- /mnt/media/courses:/app/My_Courses
# macOS
- /Users/you/Videos/Courses:/app/My_Courses
# Windows with Docker Desktop
- C:/Users/you/Videos/Courses:/app/My_Courses
Configuration
| Variable | Required | Purpose | Example |
|---|---|---|---|
DATABASE_URL |
Yes | SQLite database path | file:./dev.db |
COURSES_ROOT |
Yes | Course folder path inside the app/container | ./My_Courses |
NEXT_PUBLIC_APP_URL |
Recommended | Public app URL used by metadata and links | http://localhost:6767 |
QUIZAPI_KEY |
Optional | QuizAPI key for quiz generation | qa_... |
Settings can also be managed inside the app at:
/settings
Course Folder Structure
OfflineAcademy works best when courses are organized as folders containing module folders and video files.
My_Courses/
└── Example Course/
├── 01 - Introduction/
│ └── 01 - Welcome.mp4
├── 02 - Core Concepts/
│ ├── 01 - Lesson One.mp4
│ └── 02 - Lesson Two.mp4
└── 03 - Practice/
└── 01 - Lab Walkthrough.mp4
Supported video extensions include common browser-playable formats such as .mp4, plus additional local media formats depending on browser support.
Data & Persistence
OfflineAcademy stores app data locally.
SQLite database prisma/dev.db
Course files My_Courses/ or your configured course mount
Environment .env
Quiz cache Course/module folders where generated
Important user data:
- watch progress
- bookmarks
- bookmark notes
- course metadata
- tags and categories
- quiz records/cache
- local app settings
Updating
Local Node.js
git pull
npm ci
npx prisma generate
npx prisma db push
npm run build
npx next start -p 6767
Docker
git pull
docker compose up --build -d
Backup
Back up these items regularly:
prisma/dev.db Main SQLite database
.env Local configuration and optional API key
My_Courses/ Your source course library, if not backed up elsewhere
A simple backup can be as easy as copying prisma/dev.db somewhere safe before updates.
Security Notes
OfflineAcademy is designed for trusted local networks and personal/homelab use.
Before exposing it to the public internet, add:
- HTTPS
- reverse proxy authentication
- network access controls
- regular database backups
- careful handling of
.envand API keys
Do not commit .env, local databases, course files, or private API keys.
License
OfflineAcademy is released under the MIT License.
You are free to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the software, subject to the terms of the MIT License.
See LICENSE for the full license text.