admins
541853bb1d
Add clean-pdf dependencies and browserless dev service
2026-07-06 11:19:51 +05:00
admins
b6d555ab3b
Add Obsidian Toolbox — 4 syntax generators under /tools
...
Inside-LMS toolbox for registered students: callout-CSS, YAML-frontmatter,
theme CSS-variables, Style Settings generators. Auth inherited from (student)
route group; no public surface, no email gate.
- Pure generators in src/lib/tools/* with Vitest (33 tests)
- Shared YAML-safe scalar quoter (_shared/yaml.ts) used by frontmatter +
style-settings: unquoted user input was silently breaking YAML (tags '#x'
-> null, color default '#7C3AED' -> null, 'a: b' -> parse error)
- hex validation in callout (no NaN), date input constrained, clipboard +
analytics calls guarded
- Prisma ToolUsage model + migration; logToolUsage Server Action (auth-first,
10-min dedup window per user/tool)
- Tool index /tools + ToolCard (explicit lucide map, no import *) + header link
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-23 15:45:52 +05:00
admins
f8aa27533c
Add vault graph poster to Obsidian Wrapped
...
- parse.worker collects edges, builds top-150-by-degree graph (links capped 600)
- graphPoster.ts renders force-graph on off-screen canvas -> PNG (DS-2 colors),
node names never leave the browser
- WrappedClient: Карточка/Граф toggle, optional node labels, lazy-load force-graph
- THIRD-PARTY-NOTICES for force-graph (MIT) and next/og satori/resvg (MPL-2.0)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-23 14:57:36 +05:00
admins
231ed083be
Add anti-bot registration protection
...
- Custom /api/register route: honeypot, disposable email blocking, Cloudflare Turnstile verification
- Register form: honeypot hidden field, Turnstile widget (loads when NEXT_PUBLIC_TURNSTILE_SITE_KEY set)
- Install disposable-email-domains package
- Add NEXT_PUBLIC_TURNSTILE_SITE_KEY and TURNSTILE_SECRET_KEY env vars to .env.example
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-26 12:35:06 +05:00
admins
444b9c0faf
Apply tech debt fixes: middleware rename, React.cache, file size limits, remove dead deps
...
- Rename proxy.ts → middleware.ts, export proxy() → middleware() so Next.js edge
protection actually activates (F001)
- Add PUBLIC_ROUTES entries for /forgot-password and /reset-password
- Wrap getSettings() in React.cache() to eliminate duplicate DB call in root layout (F003)
- Remove 4 console.log calls from saveLesson Server Action, keep console.error (F005)
- Add 50 MB file size guard to all 6 upload routes before arrayBuffer() read (F004)
- Remove unused deps: @tailwindcss/typography, shadcn, tw-animate-css (F008)
- Update CLAUDE.md: Prisma version 6.x → 7.x
- Add TECH_DEBT_AUDIT.md with 14 findings across 9 dimensions
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-09 19:35:05 +05:00
admins
dd46a10c20
Add CSV import/export for students (Stage 11)
...
Import wizard (4 steps):
- Upload CSV with UTF-8 or Windows-1251 (iconv-lite) decoding
- Auto-detect columns: Email, Имя, Фамилия, Телефон
- Preview table with per-row status: new / update / error
- Options: auto-verify email, assign course + access days, send welcome email
- Apply: creates users with bcrypt password + Account record, grants enrollments
Export:
- GET /api/admin/export-users with course filter + encoding selection
- UTF-8 with BOM (works in all apps) or Windows-1251 (legacy Excel)
- Fields: Email, Имя, Телефон, Дата регистрации, Курсы, Прогресс
Navigation: added "Импорт / Экспорт" link to admin sidebar
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-04-08 12:51:43 +05:00
admins
093e403f5f
Enhance lesson editor: prev/next nav + richer toolbar
...
- page.tsx: fetch sibling lessons, pass prevLesson/nextLesson props
- LessonEditor: ChevronLeft/Right nav buttons with lesson title tooltip
- Toolbar: added Underline, Strikethrough, inline Code, H1, Horizontal rule,
Link dialog (prompt), labeled buttons for better discoverability
- Install @tiptap/extension-underline
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-04-08 10:29:39 +05:00
admins
c647b29712
Add Markdown import from Obsidian (Stage 8)
...
- md-to-tiptap.ts: remark-based converter (headings, lists, blockquotes,
code blocks, bold/italic/strike, links, images, hr)
- Obsidian ![[wikilink]] stripped, [[link|alias]] → plain text
- POST /api/admin/import-md: parses frontmatter (gray-matter) + converts content
- LessonEditor: "Импорт .md" button populates editor without auto-save
- ROADMAP: marked Stages 2, 3, 5, 6, 7, 8 as complete, fixed numbering
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-04-07 15:44:42 +05:00
admins
05dd4d1df2
Stage 2: student lesson viewer, Kinescope player, PDF files, prev/next nav, My Courses dashboard
2026-04-07 12:13:12 +05:00
admins
d356dddc96
Stage 1: Course/Module/Lesson CRUD admin UI with TipTap editor
2026-04-07 11:36:27 +05:00
admins
9d82b73e58
feat: initial commit
2026-04-07 11:30:38 +05:00
admins
1153bcc13a
Add Prisma 7 PostgreSQL adapter
...
Prisma 7 requires explicit database adapter for runtime connections.
- Install @prisma/adapter-pg + pg
- Update prisma.ts: use PrismaPg adapter with DATABASE_URL
- Update seed.ts: same adapter pattern
- Dockerfile: copy pg deps to runner stage
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-04-07 10:48:08 +05:00
admins
80ca4b2d9d
Initialize Stage 0: Next.js 16 scaffold with auth and role-based routing
...
- Next.js 16.2.2 + React 19 + TypeScript + Tailwind v4
- Better Auth with email/password and role system (student/curator/admin)
- Prisma 7 schema: User, Session, Account, Verification + full LMS model
- Role-based dashboards: student /dashboard, curator /curator/dashboard, admin /admin/dashboard
- Auth pages: login, register, verify-email
- Better Auth API route handler
- Middleware for route protection
- Docker Compose with PostgreSQL 16
- Seed script with test users (admin/curator/student)
- CLAUDE.md and ROADMAP.md project documentation
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-04-07 10:32:37 +05:00