Vouzot

About this project

Vouzot is a Louisiana-focused Learning Management System — think Masterclass but rooted in South Louisiana culture. The platform lets content creators upload and manage video course curricula teaching Louisiana cooking, Cajun and jazz music, French dialects, Creole, Kouris Vini, and Cajun French. Students enroll in structured courses, track progress, and book one-on-one video mentor sessions with instructors. Features a built-in live chat support system (non-AI), newsletter subscription, and a full instructor directory. Co-founded with Dr. Daniel DeKerlegand (PhD in AI), with planned AI integration for the language learning modules. Built with Next.js 14 App Router, Mux video streaming, Stripe subscriptions, Stream video SDK for mentor sessions, and Socket.io for real-time features. Currently in active development at vouzot-test.vercel.app — not yet publicly launched.

Technology & Features

  • Tailwind CSS
  • Next.js 14 (App Router)
  • Zustand
  • TypeScript
  • Zod
  • React Hook Form
  • MongoDB
  • Shadcn UI
  • Framer Motion
  • GSAP
  • TanStack Table
  • Stripe
  • Docker
  • Prisma ORM
  • NextAuth v5
  • Socket.io
  • Stream Video SDK
  • UploadThing
# package.json
{ "dependencies": { "@auth/prisma-adapter": "1.0.12", "@chromatic-com/storybook": "^1.6.1", "@fontsource/kaushan-script": "^5.0.21", "@fontsource/sirin-stencil": "^5.0.19", "@gsap/react": "^2.1.1", "@hello-pangea/dnd": "^16.6.0", "@hookform/resolvers": "^3.3.4", "@mux/mux-node": "7.3.2", "@mux/mux-player-react": "2.2.0", "@nextui-org/checkbox": "^2.0.25", "@nextui-org/chip": "^2.0.28", "@nextui-org/progress": "^2.0.25", "@nextui-org/skeleton": "^2.0.24", "@nextui-org/spinner": "^2.0.30", "@nextui-org/system": "^2.0.15", "@nextui-org/theme": "^2.1.18", "@nextui-org/tooltip": "^2.0.30", "@prisma/client": "^5.11.0", "@radix-ui/react-accordion": "^1.1.2", "@radix-ui/react-alert-dialog": "^1.0.5", "@radix-ui/react-avatar": "^1.0.4", "@radix-ui/react-dialog": "^1.0.5", "@radix-ui/react-dropdown-menu": "^2.0.6", "@radix-ui/react-label": "^2.0.2", "@radix-ui/react-popover": "^1.1.1", "@radix-ui/react-scroll-area": "^1.1.0", "@radix-ui/react-select": "^2.0.0", "@radix-ui/react-separator": "^1.0.3", "@radix-ui/react-slot": "^1.0.2", "@radix-ui/react-switch": "^1.0.3", "@radix-ui/react-toast": "^1.1.5", "@radix-ui/react-toggle": "^1.1.0", "@radix-ui/react-tooltip": "^1.0.7", "@storybook/addon-essentials": "^8.2.2", "@storybook/addon-interactions": "^8.2.2", "@storybook/addon-links": "^8.2.2", "@storybook/addon-onboarding": "^8.2.2", "@storybook/addon-themes": "^8.2.2", "@storybook/addons": "^7.6.17", "@storybook/blocks": "^8.2.2", "@storybook/nextjs": "^8.2.2", "@storybook/react": "^8.2.2", "@storybook/test": "^8.2.2", "@storybook/theming": "^8.2.2", "@stream-io/node-sdk": "^0.1.13", "@stream-io/video-react-sdk": "^0.5.12", "@stripe/stripe-js": "^3.2.0", "@tanstack/react-table": "^8.15.3", "@testing-library/dom": "^10.3.1", "@testing-library/jest-dom": "^6.4.6", "@testing-library/react": "^16.0.0", "@testing-library/user-event": "^14.5.2", "@tiptap/extension-heading": "^2.4.0", "@tiptap/pm": "^2.4.0", "@tiptap/react": "^2.4.0", "@tiptap/starter-kit": "^2.4.0", "@types/bcryptjs": "^2.4.6", "@types/locomotive-scroll": "^4.1.3", "@types/node": "^20.12.2", "@types/react": "^18.2.73", "@types/react-datepicker": "^6.2.0", "@types/react-dom": "^18.2.23", "@types/uuid": "^9.0.8", "@uploadthing/react": "^5.5.0", "autoprefixer": "^10.4.19", "axios": "^1.6.8", "bcryptjs": "^2.4.3", "class-variance-authority": "^0.7.0", "clsx": "^2.1.0", "eslint": "^8.57.0", "eslint-config-next": "14.1.4", "eslint-plugin-storybook": "^0.8.0", "framer-motion": "^11.0.24", "gsap": "^3.12.5", "input-otp": "^1.2.4", "lenis": "^1.0.44", "locomotive-scroll": "5.0.0-beta.8", "lucide-react": "^0.364.0", "next": "14.1.4", "next-auth": "5.0.0-beta.4", "next-themes": "^0.3.0", "postcss": "^8.4.38", "prisma": "^5.11.0", "query-string": "^9.0.0", "react": "^18.2.0", "react-confetti": "^6.1.0", "react-datepicker": "^6.6.0", "react-dom": "^18.2.0", "react-hook-form": "^7.51.2", "react-hot-toast": "^2.4.1", "react-icons": "^5.0.1", "react-locomotive-scroll": "^0.2.0", "react-quill": "^2.0.0", "react-spinners": "^0.13.8", "react-type-animation": "^3.2.0", "react-use-measure": "^2.1.1", "recharts": "^2.12.4", "resend": "^3.2.0", "socket.io": "^4.7.5", "socket.io-client": "^4.7.5", "storybook": "^8.2.2", "stripe": "^14.24.0", "tailwind-merge": "^2.2.2", "tailwindcss": "^3.4.3", "tailwindcss-animate": "^1.0.7", "ts-node": "^10.9.2", "typescript": "^5.4.3", "uploadthing": "^5.5.3", "uuid": "^9.0.1", "zod": "^3.22.4", "zustand": "^4.5.2" } }

Environment

Make sure to add these to either local.env or .env file

# .env
Copy
DATABASE_URL=""
UPLOADTHING_SECRET=""
UPLOADTHING_APP_ID=""
MUX_TOKEN_ID=""
MUX_TOKEN_SECRET=""
STRIPE_WEBHOOK_SECRET=""
STRIPE_API_KEY=""
GITHUB_CLIENT_ID=""
GITHUB_CLIENT_SECRET=""
GITHUB_AUTH_TOKEN=""
GOOGLE_CLIENT_ID=""
GOOGLE_CLIENT_SECRET=""
RESEND_API_KEY=""
NEXTAUTH_SECRET=""
STREAM_SECRET_KEY=""
NEXT_PUBLIC_STREAM_API_KEY=""
NEXT_PUBLIC_APP_URL="http://localhost:3000"

Source code

Similar projects

See allProjects
profile picture of Trey

Let's talk

code

Get in touch
trey@treyrader.dev

504.756.4538