The whole point of collecting testimonials is showing them off. We need an embeddable widget that users can drop onto their website with a single script tag.
Starting with Wall of Love (masonry grid) as the first template. The embed system is the real work here — a lightweight JS loader that fetches testimonials from a public endpoint and renders inside Shadow DOM so it doesn't clash with the host site's CSS.
What this involves:
widgets entity and migrations (type, styling config, filtering rules)
- Widgets CRUD at
/api/v1/projects/{id}/widgets
- Public data endpoint
GET /api/v1/public/widgets/{id}/data returning filtered approved testimonials, no auth
- JS loader served at
/w/{widget_id}.js
- Wall of Love masonry template
- Embed code generator in the dashboard
- Widget crate at
crates/widget/
The JS loader should be tiny (~2KB). It loads the widget data, renders into Shadow DOM, caches in localStorage for perf.
The whole point of collecting testimonials is showing them off. We need an embeddable widget that users can drop onto their website with a single script tag.
Starting with Wall of Love (masonry grid) as the first template. The embed system is the real work here — a lightweight JS loader that fetches testimonials from a public endpoint and renders inside Shadow DOM so it doesn't clash with the host site's CSS.
What this involves:
widgetsentity and migrations (type, styling config, filtering rules)/api/v1/projects/{id}/widgetsGET /api/v1/public/widgets/{id}/datareturning filtered approved testimonials, no auth/w/{widget_id}.jscrates/widget/The JS loader should be tiny (~2KB). It loads the widget data, renders into Shadow DOM, caches in localStorage for perf.