- Certificate: Hardcode approval gate — completely removed the auto-issue path; `certRequiresApproval()` now strictly returns `true`, ignoring DB configuration. - Certificate: Quiz completion now queues a pending record and triggers a "Pending approval" notification instead of falsely confirming issuance. - Certificate: Public endpoints now enforce a guard on `status=issued`; frontend strips the auto-issue side effect and claim button (issuance restricted to admins). - Chats tab: Refactor layout into a full-width centered banner above two equal-height side-by-side panels (`grid-cols-1 lg:grid-cols-2`), utilizing `max-h` and `overflow-y-auto` to eliminate whitespace bleed. - Video player: Fix settings flyout prematurely closing on mouse movement (removed `setSettingsOpen` from `poke`); add a click-outside listener via `mousedown`. - Video player: Deduplicate controls — the speed pill now directly cycles playback speed, leaving the gear icon as the single entry point for settings (eliminating overlapping popovers). - Video player: Implement full-bleed theater mode using the `-mx-[50vw] w-screen` technique, keeping the progress strip constrained to `max-w-5xl` below.
Pargar
A bootcamp learning path with no shortcuts.
Verified watch, quizzes with hearts, a skill tree, and a mentor. The product UI is Persian (پرگار).
Pargar is a gated LMS for a bootcamp. A student watches the lesson for real, passes that lesson's quiz, and only then opens the next branch of the skill tree. Alongside the path: mentor chat, events, a weekly league, a monthly challenge, and a certificate.
Public registration sits behind a phone whitelist. Invite links work on their own. Students cannot recover a password themselves; an admin sets a new one from that person's profile.
The path
| Step | What happens |
|---|---|
| Verified watch | Watch time is checked with periodic heartbeats. Skipping ahead does not finish the lesson. |
| Quiz with hearts | Each wrong answer spends a heart. An empty heart meter locks the account until staff reviews it. |
| Skill tree | The next branch opens only after its parent is passed. Staff unlock the following lesson. |
| Community | Mentor chat, events, a weekly league that resets on Monday, and a monthly challenge. |
| Certificate | An unlisted digital link. A physical copy, when enabled, is offline payment only. |
Three roles: a student walks the path, a mentor sees curriculum and student learning, and an admin also manages users, invites, site settings, and physical certificate orders.
Product detail: docs/product.md
Run it locally
Docker is required. Copy .env.example and replace every replace-with-… value. The admin password is ADMIN_PASSWORD. The default username is admin.
cp .env.example .env
./scripts/compose-dev.sh up -d --build
The app is at https://localhost. Traefik uses its own certificate, so the browser shows one warning. API health:
curl -k https://localhost/api/health
k3s and production: docs/deployment.md
Stack
| Layer | Technology |
|---|---|
| API | Go, Postgres, Redis, S3/RustFS, WebSocket |
| UI | Next.js 15, React, Tailwind |
| Edge | Traefik, on Compose and Helm |
The browser talks to one origin. Traefik splits the UI from /api. Detail: docs/architecture.md
Repository
backend/ API, migrations, seed data
frontend/ Next.js UI
deploy/ Compose, Traefik, Helm chart
scripts/ Local run, k3s, backup
docs/ Engineering docs
| Doc | Read it for |
|---|---|
| Product | Student path, admin, invites, certificates |
| Architecture | Data flow and service boundaries |
| Development | Local workflow and tests |
| Deployment | Compose, Helm, production |
| Security | Sessions, secrets, rate limits, uploads |
| Operations | Backup, metrics, troubleshooting |
| API | Route contract |
| Configuration | Environment variables |
Index: docs/README.md
License
Released under AGPL-3.0.
