Facebook Twitter GitHub LinkedIn LinkedIn LinkedIn
Back to all case studies

Designing, building, and operating a custom two-sided online marketplace

Case Study: Taste Agent x Foxhound Systems
Service areas
Custom Software Development Product Strategy
Development focus
SaaS Web Accessibility Database Optimization Server Side Rendering Cloud Hosting
Technology stack
Haskell Yesod Persistent/Esqueleto Stimulus Turbo Tailwind CSS PostgreSQL Docker Nix Amazon Web Services (AWS) AWS ECS AWS RDS AWS S3 AWS SES Github Actions
Organization
Taste Agent (Relish Works)

Portrayal of the Taste Agent application on a pair of phones. One phone has a page labeled 'Browse Meals' and shows several compelling photos and meals to choose from. The other phone has a page labeled 'The Fatty Duck' and shows information about a meal booking, including the items that will be received, party size, and the booking date.

Taste Agent is a new venture, born from the creative incubator that is Relish Works—an innovation hub dedicated to investing in and cultivating groundbreaking products within the food service industry.

Following a successful collaboration in which Foxhound Systems played a pivotal role in developing a product and technology strategy for a restaurant-focused online marketplace, the Taste Agent team once again enlisted our expertise. The team entrusted us with the ambitious task of executing this vision by creating the marketplace platform.

The envisioned platform would serve as a marketplace to connect restaurant operators and social media influencers, facilitating innovative and compelling marketing and allow restaurants to tap into social media marketing to grow their customer base. The platform would facilitate meal bookings and allow the two parties to arrange meals for the purpose of influencers creating social media marketing content. For an initial release, the intended form factor would be a responsive web application designed for a mobile-first experience. The Taste Agent team established key technical criteria for the application, emphasizing exceptional performance across mobile devices under varying connectivity conditions, alongside a user interface designed for accessibility, conforming to the Web Content Accessibility Guidelines.

Your team has been very easy to work with. Our past projects haven’t gone this smoothly. Mara
Director of Innovation, Relish Works

Project goals

There were several key goals defined at the outset of building the Taste Agent platform:

  1. Transformation of the product vision into a intuitive user experience and functional design.
    Our first objective was to build on the strategic foundation laid out in our preliminary engagement and translate the high-level product vision and strategic objectives of the Taste Agent team into a tangible user experience. We aimed to accurately model the envisioned feature set and user interface by creating detailed wireframes and functional specifications, which would clearly communicate the platform’s planned functionality to all stakeholders.
  2. Development of a completely custom, full-featured, production-grade software platform.
    The Taste Agent team decided against common approaches like heavily modifying WordPress or relying on no-code solutions, opting instead for a completely custom software build (you can read our thoughts on the topic in our article: Do “No-code” platforms reduce software development costs?). This approach was used to ensure maximum control over the user experience, application performance, and ability to scale over time, all while keeping infrastructure costs as low as possible in anticipation of growing platform traffic.
  3. An excellent, mobile-first experience in the form of an easy-to-use, highly performant, responsive web application.
    Given the preeminence of mobile engagement, our objective was to deliver an intuitive and responsive web application with excellent performance. Ensuring optimal functionality across mobile devices, especially during poor mobile connectivity, was paramount, to achieve the maximal level of application accessibility and user satisfaction.
  4. A plan for iterative development from the very beginning.
    Whereas many new software projects are developed as minimum viable products (MVPs) and are anticipated to be discarded, we recognized that this approach would not be suitable for this project. Understanding the complexity and ambition behind creating a marketplace, we opted for an iterative development strategy. Starting with a core set of features that address essential user needs, we planned for frequent improvements to the software based on direct user feedback post-launch, ensuring the platform evolves in alignment with its users’ desires and meets the business demands of the Taste Agent team.
  5. A timely launch that would synchronize with marketing initiatives.
    The development timeline was planned to align with marketing strategies and user acquisition efforts, setting a firm deadline for the initial release. This synchronization ensured that the platform would make its market debut exactly when anticipated, laying the groundwork for immediate user engagement and feedback.
An example of a wireframe for the Taste Agent application created with the tool Balsamiq, illustrating the type of UX design employed at the early stages of a development project. One of the wireframes from the Taste Agent project created by Foxhound Systems during the initial phases of development. Even with a clearly articulated product vision and high level feature goals, creating wireframes is an essential step in the development of a software product. This wireframe was one of several dozen that our team created in order to clearly communicate the UX and desired feature set of the application.

Technology strategy

One of the biggest tasks our team had during this project was selecting approaches and tools to use to build the Taste Agent platform. Ultimately, our selections were based on the priorities laid out by the Taste Agent team considered against the various experiences we’ve had using numerous programming languages, frameworks, and platforms to build and operate software systems.

The top development priorities laid out by the Taste Agent team were as follows:

In order to achieve these priorities, we made several key choices when building this project.

Employing server-side rendering for enhanced performance and simplicity

We opted to deliver HTML directly from the server using a server-side rendered (SSR) architecture, ensuring a straightforward and highly accessible navigation experience. This method contrasts with single-page applications (SPAs), which rely heavily on client-side JavaScript to dynamically update the UI without full page reloads. Our decision for SSR was driven by the desire to minimize business logic duplication, streamline content delivery, and enhance overall user experience by allowing the application servers to handle most of the processing.

This approach not only simplifies development by centralizing logic on the back end, but it also enhances responsiveness and accessibility for users by reducing CPU usage on the client’s browser. Given that most users will access the platform via mobile phone browsers—which typically have more limited performance capabilities than computers—leveraging the server-side capabilities to present a slim interface ensures a smoother experience without the complexity and overhead associated with SPAs. Our web accessibility target of compliance with WCAG level AA was made easier to achieve through our use of SSR, with traditional links and forms being used for navigation and interaction with the application.

For the limited number of cases in the application where a dynamic update to a page was necessary, we still typically deferred to the server. We used a JavaScript library called Turbo to perform partial page updates based on HTML blocks returned from the server. We also used Turbo Drive, a drop-in feature of the library that accelerates regular links and form submissions by turning document HTTP requests into XHR requests, significantly improving performance. For the cases where client-side updates were required (such as when modifying the default validation messages presented by forms without losing input focus), we used Turbo’s companion library, Stimulus.

We set a performance target of 100 milliseconds for user actions and page loads under good network conditions, which we believed to be achievable given the control we had over the rendering progress, as well as our high performance programming language and database selections.

Leveraging a best-in-class programming language & database combination

The server-side programming language we chose was Haskell, which we’ve both used and written about extensively in the past (see: Why Haskell is our first choice for building production software systems). Haskell is a statically-typed programming language with an extremely powerful type system. It gives developers the ability to identify many errors very quickly (maximizing the application’s reliability and correctness), and lending itself to rapid development (helping us achieve our intended delivery timeline). Haskell compiles to executables that are very fast, usually an order of magnitude faster than other languages commonly used for development, such as PHP, Ruby, or Python. This extra performance was doubly useful in a SSR application with all logic for both validation and rendering being performed by the application server.

We used PostgreSQL as our database, driven by our experience that relational databases are best-in-class at what they do, offering an unrivaled combination query flexibility, schema control, and performance. SQL databases, in our view, are the best choice for the overwhelming majority of applications, and PostgreSQL stands out as the leading open-source option. Its comprehensive feature set, thorough documentation, and wide compatibility make it an ideal choice for deployment across various cloud hosting environments, aligning perfectly with our project requirements and ensuring seamless operations for the Taste Agent platform.

Infrastructure optimized for seamless operations

A critical component of our partnership with Taste Agent involved not just the creation but also the ongoing maintenance and operation of the platform post-launch. To this end, the selection of the deployment environment and production infrastructure was a pivotal early decision. We chose Amazon Web Services (AWS) for its robust and scalable infrastructure, specifically utilizing Elastic Container Service (ECS), allowing us to deploy the application using containers but without managing containerization manually, for instance, through Docker.

Our deployment process is streamlined and fully automated, utilizing GitHub Actions for a seamless CI/CD pipeline. This setup employs the Nix package manager for its reproducible builds and Docker to creation the application image, which is pushed to the AWS Elastic Container Registry (ECR), from which it is automatically deployed to ECS by bringing the new versions online before tearing down the incumbent containers. This approach not only enhances the reliability and scalability of the platform but also ensures a smooth operational experience for the Taste Agent team and its users.

We lean heavily into other AWS services such as Cloudwatch for logging and alerts, Relational Database Service (RDS) for running our PostgreSQL database, Simple Email Service (SES) for sending emails, and S3 for file storage. We employ the principle of least privilege in our security configurations, deploying everything in a production AWS account with minimal access, aggressively restricting everything using security groups and eliminating public access where possible, such as to the database.

Project outcomes

Scroll!
A screenshot from the Taste Agent application showing meals available for booking that users can view more details about. A screenshot from the Taste Agent application showing an upcoming booking.
Screens from the Taste Agent application taken from the production deployment. The first screenshot portrays a view of upcoming meals that users can book. The second screenshot shows an upcoming booking as seen from the perspective of a restaurant operator.
Technical success, web accessibility, and outstanding performance
Foxhound Systems successfully released the Taste Agent platform in time for the target launch.
Our application architecture and technology decisions, such as a server-side rendered application architecture and our use of the Haskell programming language enabled us to deliver a fully functional and thoroughly tested software platform with minimal defects.
The application achieved its web accessibility targets, conforming to WCAG level AA compliance. The application is successfully usable with assistive technologies such as screen readers and exclusively using keyboard navigation and inputs.
By building the platform with the extremely fast Haskell programming language and hand-writing optimized PostgreSQL queries, we achieved an average page load time of 60 milliseconds, even for pages that require database access. This fell well within our target of 100 milliseconds.
Feature completeness and successful collaboration
The initial release included all of the core features planned at the outset, illustrating the importance of taking time to write functional specifications and create UX wireframes. Without the early planning and documentation to act as a map for the project, it achieving the same feature set in the same time frame would have been difficult or impossible.
Even with an aggressive launch target, in our continual collaboration with the Taste Agent team, we made several adjustments and additions to the desired launch feature set, which we were able to build and include by launch day as well.
At the moment of release, the platform was poised for additional development and updates. In the first few months since the release of the platform, our team has launched numerous updates to the platform.
Infrastructure reliability and seamless deployments
We achieved a robust and resilient production infrastructure capable of serving the needs of the platform and its users, along with a build pipeline that enables seamless, zero-downtime deployments.
In the few months since the application launch, the application has been updated dozens of times, with updates ranging from tiny adjustments to large feature updates. Our zero-downtime deployments have resulted in a 100.0% application uptime during this time frame.
Excellent user feedback and engagement
Users of the platform have provided positive feedback when surveyed, remarking on ease-of-use and overall smoothness of their usage experience.
Users of the platform are highly engaged, becoming repeat users and signaling intent for ongoing use.
Positioned and ready for growth of the platform
With the excellent foundation created during initial development, the application continues to receive updates and grow in features and functionality based on requests from the Taste Agent team.
The growing user base and high levels of engagement are the result of a well executed product development strategy, and point to continued future growth.

See our other case studies or work with us.