TalkT is a place for spoken interview practice. Users create or select an interview, take it through a Vapi browser voice call, then get a structured score report from DeepSeek grading. Practice is most useful when it feels close to the real thing. TalkT lets users rehearse out loud, get interrupted, think on their feet, and see exactly where their answers were strong or thin before the actual interview.
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
| Feature | |
|---|---|
| Custom interview builder | Turn a target role, topic, language, and difficulty into a focused interview without writing prompts by hand. |
| Template library | Start fast from curated and community interviews when users do not want to build from scratch. |
| Real-time voice interview | Practice speaking under realistic pressure in the browser, with an interviewer that asks the stored question set out loud. |
| Multi-language flow | Builder output, interviewer voice, and report prose follow the selected interview language. |
| Interviewer personas | Choose a voice and tone that fit the session, from calmer coaching to sharper interview pressure. |
| Structured grading | Get an overall score, dimension scores, strengths, improvements, and per-question critique after the call. |
| Suggested answers | See what a stronger answer could have sounded like, question by question. |
| Progress history | Keep every scored attempt so users can compare sessions and track improvement over time. |
| Public directory ranking | Voting and Wilson ranking surface useful interviews without relying only on raw popularity. |
| Personalized recommendations | Recent practice history shapes the template order while cold-start users still see ranked templates. |
| Area | Tooling |
|---|---|
| App | Next.js 16, React 19, TypeScript |
| UI | Tailwind CSS 4, shadcn/ui, Radix UI, Geist |
| Auth | Clerk |
| Data | Prisma 7, PostgreSQL |
| Voice | Vapi Web SDK and server SDK |
| LLM | DeepSeek through an OpenAI-compatible JSON client |
| Jobs | Trigger.dev |
| Artifacts | Vercel Blob |
Prerequisites:
- Node.js 20+
- PostgreSQL
- Clerk, Vapi, DeepSeek, Trigger.dev, and Vercel Blob credentials
npm install
cp .env.example .env.local
npm run db:migrate
npm run db:seed
npm run devRun the Trigger.dev worker in a second terminal when testing grading:
npx trigger.dev devLocal Vapi webhooks need a public tunnel. Without one, status polling can repair missed callbacks through Vapi call reconciliation.
| Command | Purpose |
|---|---|
npm run dev |
Start the dev server |
npm run build |
Build for production |
npm run start |
Serve the production build |
npm run lint |
Run ESLint |
POST /api/builderruns one builder LLM turn.POST /api/interviewsstores a generated private interview.POST /api/interviews/:id/callcreates an attempt and a Vapi ephemeral assistant.- The browser starts Vapi with the returned
assistantIdand public key. POST /api/attempts/:id/gradesends the captured transcript and triggersgrade-attempt.- Trigger.dev runs DeepSeek grading, stores
Feedback, and streams progress to the results screen. POST /api/vapi/webhookand Vapi reconciliation are server-side fallbacks.
| Doc | Use it for |
|---|---|
| Architecture | System boundaries and request flow |
| API reference | Route handlers, auth, payloads |
| Data model | Prisma models and indexes |
| Voice interview | Vapi assistant and call lifecycle |
| Grading | Trigger task and DeepSeek analysis |
| Directory ranking | Publishing, votes, recommendations |
| Caching | Directory cache and invalidation |
| Configuration | Environment variables |
| Development | Local workflow and conventions |
| Deployment | Production checklist |
| Security | Auth, secrets, data handling |
app/ Next.js pages and API route handlers
components/ TalkT feature screens and shadcn primitives
lib/ Server logic, repositories, integrations, pure helpers
prisma/ Schema, migrations, seed data
trigger/ Trigger.dev tasks
tests/unit/ Node test runner suites
doc/ Developer documentation
proxy.ts Clerk middleware









