Case study · SaaS / Marketing
PraiseboardCollect video and text testimonials with one link and embed them anywhere
Praiseboard is a testimonial web app built by DanixSoft: customers leave a text or video testimonial from one link without an account, the business approves the best in an inbox, and an embeddable wall shows only approved testimonials that were given with consent.
Collection links, in-browser video recording, a moderation inbox, and embeddable walls in masonry, grid or carousel layouts, for agencies, freelancers, coaches and small businesses.
What problem does Praiseboard solve?
Businesses collect praise in screenshots, emails and DMs, cannot easily get video testimonials, and have no clean way to show them on their site with a record that each person agreed to be quoted.
How does Praiseboard work?
A public collection page records text or video in the browser and stores the exact consent wording and time with each testimonial. Public walls read through a database function that returns only approved, consented items without emails, and media stays private in storage unless its testimonial is approved.
What we built
- Collection links with text or video, time limits, daily caps and a thank-you message
- Video recorded in the browser or uploaded, photos and star ratings
- A moderation inbox with keyboard shortcuts, tags, favourites and undo
- Import of existing text testimonials by pasting
- Walls in masonry, grid or carousel with light and dark themes, embedded with one script tag or an iframe
What is Praiseboard built with?
- Application
- Next.js 16 (App Router, Server Actions), React 19, TypeScript, Tailwind CSS v4
- Data
- Supabase Postgres with row-level security, Auth and Storage
- Quality
- Vitest unit tests and a database rules and isolation check script
Engineering challenges
- Consent wording and time stored with every testimonial; a giver's words cannot be edited
- Storage policies that make media readable only while its testimonial is approved
- Public walls served only through a security-definer function that never returns emails
- Embeds framed from the product's own domain, with every other route refusing to be framed


