← UzbekCDL.com

Ready-to-build technical specification

Tailwind theme

theme: { extend: { colors: { navy:'#0B192C', amber:'#FF6B00', charcoal:'#1E293B', canvas:'#F8FAFC', white:'#FFFFFF' }, fontFamily: { heading:['Plus Jakarta Sans','Inter','sans-serif'], body:['Inter','Roboto','sans-serif'] }, borderRadius:{ card:'12px' } } }

Next.js App Router structure

app/
├── [locale]/
│   ├── page.tsx
│   ├── about/page.tsx
│   ├── courses/[slug]/page.tsx
│   ├── practice/[category]/page.tsx
│   ├── states/[state]/page.tsx
│   ├── pre-trip/[system]/page.tsx
│   ├── blog/[slug]/page.tsx
│   ├── faq/page.tsx
│   └── contact/page.tsx
├── api/leads/route.ts
├── api/progress/route.ts
├── sitemap.ts
└── layout.tsx
components/ quiz/ course/ navigation/ forms/ schema/
lib/ supabase.ts i18n.ts crm.ts telegram.ts
data/ quizzes/ states/ glossary/

PostgreSQL / Supabase schema

create table users (id uuid primary key default gen_random_uuid(), email text unique, phone text, full_name text, state_code char(2), preferred_language text default 'uz-Latn', telegram_handle text, created_at timestamptz default now());
create table courses (id uuid primary key default gen_random_uuid(), slug text unique, title_uz text, title_en text, eldt_type text, published boolean default false);
create table enrollments (user_id uuid references users, course_id uuid references courses, status text, enrolled_at timestamptz default now(), primary key(user_id,course_id));
create table modules (id uuid primary key default gen_random_uuid(), course_id uuid references courses, position int, title_uz text, title_en text);
create table quizzes (id uuid primary key default gen_random_uuid(), module_id uuid references modules, mode text, passing_score int default 80);
create table questions (id uuid primary key default gen_random_uuid(), quiz_id uuid references quizzes, prompt_en text, prompt_uz text, choices jsonb, correct_index int, explanation_uz text, explanation_en text);
create table attempts (id uuid primary key default gen_random_uuid(), user_id uuid references users, quiz_id uuid references quizzes, score numeric, answers jsonb, completed_at timestamptz);
create table progress (user_id uuid references users, module_id uuid references modules, percent numeric default 0, updated_at timestamptz default now(), primary key(user_id,module_id));

Bilingual quiz JSON

{
  "id": "air-brakes-012",
  "category": "air-brakes",
  "question": {
    "en": "What should you do when the low air pressure warning activates?",
    "uz": "Past havo bosimi ogohlantirishi yoqilganda nima qilish kerak?"
  },
  "choices": [
    {
      "en": "Continue driving",
      "uz": "Haydashda davom eting"
    },
    {
      "en": "Stop safely as soon as possible",
      "uz": "Imkon qadar tez xavfsiz to‘xtang"
    },
    {
      "en": "Pump the brake pedal",
      "uz": "Tormoz pedalini qayta-qayta bosing"
    }
  ],
  "correctIndex": 1,
  "explanation": {
    "uz": "Past bosim tormoz tizimi xavfsiz ishlamasligi mumkinligini bildiradi.",
    "en": "Low pressure indicates the air brake system may no longer operate safely."
  },
  "officialTerm": "Low Air Pressure Warning",
  "difficulty": "beginner"
}

Course JSON-LD

{
  "@context": "https://schema.org",
  "@type": "Course",
  "name": "Class A CDL ELDT Theory — Uzbek & English",
  "description": "FMCSA ELDT theory training with Uzbek explanations and official English terminology.",
  "provider": {
    "@type": "Organization",
    "name": "UzbekCDL.com",
    "url": "https://uzbekcdl.com"
  },
  "inLanguage": [
    "uz",
    "en"
  ],
  "courseMode": "online",
  "educationalLevel": "Entry-Level Driver Training",
  "hasCourseInstance": {
    "@type": "CourseInstance",
    "courseMode": "online",
    "courseWorkload": "Self-paced"
  }
}

Implementation notes: Supabase Auth + Row Level Security, Strapi optional for editorial workflow, CRM webhook with retry queue, Telegram bot notification after lead validation, WCAG 2.1 AA focus states, image optimization, edge caching, localized static routes, FAQ/HowTo/Organization/EducationalOccupationalProgram schemas, llms.txt and XML sitemaps.