Collect testimonials with a shareable link and show the best ones on any website with one script tag.
No hosting, no forms to build, no technical skills required.
- Shareable review form: create a product and get a public link where customers leave a message, a 1–5 star rating and an optional photo.
- Dashboard: see every submission per product, favorite the best ones and delete spam.
- Analytics: daily views, responses and conversion over 7, 30 or 90 days, plus an all-time rating breakdown.
- Embeddable widget: paste two lines of HTML to show your favorited testimonials on any site. It's plain JavaScript with no framework and no iframe, served from a CDN cache.
- Accessible by default: a keyboard-operable star rating, inline form errors announced to screen readers, and widget cards with list semantics and text alternatives for ratings.
- Validated end to end: the same Zod schema checks input in the browser and on the server.
- Secure: Google sign-in via Auth.js, and every mutation is scoped to the owner of the product.
- Built-in docs: guides for users at
/docs, powered by Fumadocs with full-text search.
flowchart LR
A[Create a product] --> B[Share the review link]
B --> C[Customers submit reviews]
C --> D[Review and favorite in the dashboard]
D --> E[Favorites appear in your embedded widget]
Copy the snippet from your product page in the dashboard and paste it where the reviews should appear:
<div id="embed-reviews"></div>
<script src="https://vouch.munadil.com/api/embed-reviews?productId=YOUR_PRODUCT_ID"></script>Only reviews you mark as a favorite are shown. The CDN caches responses for 2 minutes, then refreshes them in the background, so a newly favorited review can take a visit or two after that to appear.
| Area | Tools |
|---|---|
| Framework | Next.js 16 (App Router), React 19, TypeScript |
| Styling | Tailwind CSS 4, shadcn/ui, Motion |
| Docs | Fumadocs (MDX) |
| Data | PostgreSQL, Prisma 7 |
| Auth | Auth.js with Google |
| Validation | Zod 4 |
| Forms | React Hook Form |
| Uploads | Uploadcare |
| Testing | Vitest, Testing Library |
| CI | GitHub Actions (format check, tests, build) |
- Node.js 24+
- pnpm
- A PostgreSQL database (local, Neon, Supabase, etc.)
- A Google OAuth client with the redirect URI
http://localhost:3000/api/auth/callback/google
-
Clone the repository
git clone https://github.com/munadil-dev/vouch.git cd vouch -
Configure environment variables
cp .env.example .env.local
Variable Description AUTH_SECRETRandom secret for Auth.js. Generate one with openssl rand -base64 32.AUTH_GOOGLE_IDGoogle OAuth client ID. AUTH_GOOGLE_SECRETGoogle OAuth client secret. DATABASE_URLPostgres connection string used by the app (a pooled URL works). DIRECT_URLDirect (non-pooled) Postgres connection string, used by Prisma for migrations. NEXT_PUBLIC_BASE_URLPublic URL of the app, with a trailing slash, e.g. http://localhost:3000/.UPLOADCARE_SECRET_KEYUploadcare secret key, used to keep review photos once a review is saved. -
Install dependencies
pnpm install
This also generates the Prisma client.
-
Set up the database
pnpm migrate:dev
-
Start the development server
pnpm dev
Open http://localhost:3000.
| Command | Description |
|---|---|
pnpm dev |
Start the development server |
pnpm build |
Generate the Prisma client and build the app |
pnpm start |
Run the production build |
pnpm test |
Run the test suite once |
pnpm test:watch |
Run tests in watch mode |
pnpm format |
Format the codebase with Prettier |
pnpm format:check |
Check formatting (runs in CI) |
pnpm migrate:dev |
Create and apply database migrations |
pnpm db:push |
Push the schema to the database without a migration |
pnpm prisma:generate |
Regenerate the Prisma client |
pnpm prisma:studio |
Open Prisma Studio to browse the database |
app/
(auth)/auth/signin/ Sign-in page, without the site navbar
(main)/ App pages with the site navbar
(review)/[productId]/ Public review form
dashboard/ Product and review management
api/ Route handlers (reviews, products, embed widget, docs search)
docs/ Documentation site (Fumadocs)
components/
auth/ layout/ home/ Sign-in, navbar and footer, landing page
product/ review/ Product and review features
shared/ Used by more than one feature
ui/ shadcn/ui
icons/ Brand icons (Google, GitHub, X)
content/docs/ Documentation pages in MDX
lib/ Auth, database client, docs source, utilities
prisma/ Schema and migrations
schemas/ Zod schemas shared by client and server
Tests sit next to the code they cover (*.test.ts / *.test.tsx) and run with Vitest and Testing Library:
pnpm testThey cover the Zod schemas, the review form and star rating (including keyboard and screen reader behaviour), the review list filters, the API routes (ownership checks, status codes), the analytics helpers, storing Uploadcare photos and the embed widget, including XSS safety.
Contributions are welcome.
- Fork the repository and create a branch from
main. - Make your change and add tests where it makes sense.
- Run
pnpm format,pnpm testandpnpm build. - Open a pull request. CI must pass before merging.
For larger changes, please open an issue first to discuss the idea.
MIT © Munadil