Áleran Vocals
Piano, entrenamiento con micrófono y juegos de oído para alumnos de canto: notas, escalas, afinación, rango vocal, resistencia e intervalos.
Translation pending
Practice impromptu speaking with random topics, a focused timer and instant AI feedback on clarity, confidence, structure and filler words.
EducationGitHub @ebenezerojebaOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
Repository information has not been collected yet.
No updates detected yet. GitHub releases will appear here.
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗Practice impromptu speaking against a random topic and a timer, then get instant, specific AI coaching on clarity, structure, confidence, pace and filler words.
Core loop: choose a mode → get a topic → 3-2-1 → record → transcribe → analyze → review → practice again → track progress.
| Area | Choice |
|---|---|
| Framework | Next.js 15 (App Router), React 19, TypeScript |
| UI | Tailwind CSS 4, shadcn/ui (radix-nova), framer-motion, Recharts |
| Data | PostgreSQL + Prisma 7 (driver adapter @prisma/adapter-pg) |
| Auth | Built in-house: Argon2id + database-backed sessions (no third-party auth) |
| AI | OpenAI REST via fetch (no SDK), strict JSON-schema structured output |
| Testing | Vitest (unit + integration), Playwright (E2E, a11y, performance) |
npm install # postinstall runs `prisma generate`
cp .env.example .env # fill in AUTH_SECRET at minimum (see below)
npm run db:start # local PostgreSQL (no Docker needed) on port 54329 — keep running
npm run db:deploy # apply migrations
npm run db:seed # 189 topics + 9 achievements
npm run dev # http://localhost:3000
Generate a secret for .env:
node -e "console.log(require('crypto').randomBytes(32).toString('base64url'))"
Without OPENAI_API_KEY, set AI_PROVIDER=mock: transcription and coaching then use an isolated,
clearly-labelled development provider so the whole flow works offline. Mock output is never
presented as real coaching, and the mock provider refuses to run in production.
| Script | What it does |
|---|---|
npm run dev | Development server |
npm run db:start | Local PostgreSQL via embedded-postgres (data in .data/postgres) |
npm run db:migrate | Create a migration from schema changes |
npm test | Unit tests (Vitest) |
npm run test:integration | Integration tests against a real database (needs db:start) |
npm run test:e2e | Playwright E2E (builds to .next-build, serves on port 3100) |
npm run test:all | Everything, in the order CI runs it |
E2E builds into .next-build (NEXT_DIST_DIR) so it can run while npm run dev is using .next.
src/
├── app/ routes: (marketing) (auth) (app) onboarding api
├── components/ ui (shadcn), layout, shared
├── features/ topics practice recording transcription ai-coach
│ filler-analysis follow-up progress achievements
│ history settings notifications auth onboarding marketing
├── lib/ auth db ai email storage rate-limit validation api utils
├── stores/ hooks/ config/ generated/prisma
Rules that matter:
features/*, not in page components.unavailable instead of being invented.ARCHITECTURE.md has the full design, including the as-built decisions (section 33).
LESSONS.md records compatibility findings and debugging lessons — read it before changing
dependencies or the toolchain.
src/**/*.test.ts) — pure logic: timer, filler detection, analytics, streaks,
achievement rules, schemas, validation.tests/integration) — real PostgreSQL: auth, sessions, uploads, the
transcribe→analyze pipeline, rate limiting, notifications, the OpenAI client (mocked fetch).
Non-destructive by design: migrations are applied with migrate deploy and every test uses
unique per-run data.e2e/) — full flows in Chromium with synthetic camera/microphone, plus axe
accessibility audits, CSP/security checks and Core Web Vitals.Target is Vercel + Neon. Before going live, see "Production readiness" in ARCHITECTURE.md §33.8:
production credentials, an object-storage driver (the local filesystem driver refuses to run on
Vercel), and direct-to-storage uploads for video, which exceed the 4.5 MB serverless body limit.
vercel.json schedules the hourly notification cron (/api/cron/notifications, protected by
CRON_SECRET).