Collective Voice: Using Dancer2 at a Digital Marketing Agency

At work, we have used Perl for over 20 years for web application development and automation. Recently, we have created, and are just about to open source, an application designed to collect online testimonials. There are similar paid services which include an online review portal such as GatherUp. The pricing plans for these services start at $75+ per month. As web developers, we decided to build our own solution. Thus was born Collective Voice.

Business Case

The growth of the web has empowered customers to have greater power than ever. Buyers often turn to customer testimonials and reviews to determine whether or not they trust a product, service, and even a seller. In fact, surveys show that buyers read seven reviews on average before deciding to trust a business.

But, getting reviews can be challenging. How do you make it easy for happy clients to leave reviews? And, when soliciting reviews from your customers, how do you prevent unhappy clients from leaving negative reviews? A testimonial review portal can benefit.

Testimonial Portal Requirements

Our immediate needs are far simpler than what the commercial solutions offer. We identified the following requirements for our software:

  1. Make it easy for happy customers to provide 5-star reviews
  2. Provide a feedback mechanism for less satisfied customers
  3. Support multiple domains
  4. Display 1-4 links to review sites for 4-5 stars
  5. Email form submissions for 3 or less stars

Tech Stack


Having a deep experience with Perl that goes back into the mid-90's, Dancer was an obvious choice for this project. It provides a simple but powerful web application framework that is quick to setup and get running so that I could focus more time and effort on the front-end design. As an adherent of test-driven development, I appreciate the built-in support for automated testing. Read more about testing in the Dancer2::Manual.


As a long-time developer, I have my usual set of front-end frameworks that I'm comfortable using such as Bootstrap and jQuery. For this application, I wanted to experiment with newer tools that were light-weight and introduced a new way of building user interfaces.

A programmer friend had recently suggested that I try out Tailwind CSS. This framework is built as a set of tiny components that you bring together to construct unique user interfaces. There is a site with pre-built components that includes both free and paid components at

It took a bit of trial and error to get into the hang of building interfaces up from simple utility classes, but I am hooked! It eliminates the need for writing custom CSS using id's and nested classes. The end result is less coding and more succinct designs. Check out an example at

One of the downsides of using minimalist frameworks is that you often need to pull in other libraries to provide additional support. In this case, I needed a Javascript library for the modal dialogs and form validation.

Rather than pulling in a fat library like jQuery for this purpose, I learned that many Tailwind developers were opting for a lightweight alternative called Alpine JS. This library offers the reactive and declarative nature of big frameworks like Vue or React at a much lower resource cost.

Phil Smith has a good introductory article at Smashing Magazine.

Lastly, I found the Alptail collection of open-source UI components invaluable as I built the UI. It provided the star rating and modal dialogs. Thanks to Daniel Palmer for putting that together.

Bringing it All Together

With the foundations laid, it's time to bring everything together for the big dance. There are 2 services that were needed

For hosting the application, I chose a $5/month Linode server with Debian 10. In the repository, I have written a detailed description of how to get the application up and running within this environment that's available in the repository which will be released soon. Linode often offers free credit when signing up as a new user. If you'd like to support my work, please use my referral link.

For delivering the form submissions back to the company being reviewed, I opted for SendGrid. Sure we could install an MTA to the server such as Postfix. And, debugging email delivery is not my idea of fun.

Getting Started

So far, I have been doing development in a private repository. I will be releasing v1.0 to the world via a public GitHub repository in the next couple of weeks.

This application is available on GitHub. Follow the steps in to get started and share your gratitude, frustrations or ideas for how to improve it. I welcome your comments!


This article has been written by William McKee (knowmad) for the Perl Dancer Advent Calendar 2020. Follow me on GitHub or connect with me on LinkedIn or at

Copyright & License

Copyright (C) 2020 by William McKee (knowmad). This work is licensed under a Creative Commons Attribution 4.0 International License.