🌀 FireFeed - Turn Feedback Into Actionable Insights


As a freelancer who's worked with various businesses, I've noticed a common challenge that keeps coming up: the disconnect between companies and their customers when it comes to feedback.
I watched businesses struggle with scattered feedback across different platforms - some using Google Forms, others relying on email surveys, and many simply hoping customers would leave reviews. What struck me most was seeing a local startup make a major product decision based on a handful of vocal customers, only to later realize this didn't represent their broader user base.
That's when it struck me - what if I could create a system that not only makes collecting feedback effortless but also uses AI to automatically analyze and extract actionable insights from every piece of feedback received?
✒️ Introduction
Meet FireFeed—an AI-powered feedback management platform that helps businesses seamlessly collect, analyze, and act on customer feedback. In this article, I'll show you how it's revolutionizing the way businesses handle customer feedback.
🔐 Key Features
1/ Feedback Analysis: FireFeed uses AI to automatically analyze customer sentiment and extract actionable insights. The system processes feedback in real-time, providing businesses with immediate understanding of customer satisfaction levels and key areas for improvement.
export function createFeedback(
rating: number,
description: string,
organizationId: string
): Feedback | null {
const systemPrompt = `Analyze this feedback and determine its sentiment. Using that analysis, summarize the key issues raised and suggest ways for us, as a company, to address them. Format your response in markdown.
Feedback: "${description}"
Here's the JSON response schema: {
sentiment: 'POSITIVE', // Can also NEUTRAL or NEGATIVE
analysis: '' // Your analysis & summary goes here
}`;
const modelName: string = 'llm';
const model = models.getModel<OpenAIChatModel>(modelName);
const input = model.createInput([
new SystemMessage(systemPrompt)
]);
input.maxTokens = 1250;
input.temperature = 0;
input.responseFormat = ResponseFormat.Json;
const output = model.invoke(input);
const modelResponse = JSON.parse<ResponseSchema>(output.choices.pop().message.content.trim());
console.log(`modelResponse :>> ${modelResponse.toString()}`);
console.log(`modelResponse isValid :>> ${modelResponse.isValid()}`);
// Insert feedback into the database
const query = `
INSERT INTO "Feedback" ("id", "organizationId", "rating", "description", "analysis", "sentiment", "createdAt", "updatedAt")
VALUES ('${uuid()}', '${organizationId}', ${rating}, '${escapeSQL(description)}', '${escapeSQL(modelResponse.analysis)}', '${modelResponse.sentiment}', NOW(), NOW())
RETURNING *;
`;
const result = postgresql.query<Feedback>('database', query);
if (result.error) {
console.error(`Error inserting feedback: ${JSON.stringify(result.error)}`);
return null;
}
return result.rows.length ? result.rows.pop() : null;
}
2/ Customizable Widget: Businesses can easily customize their feedback collection widget to match their brand identity. The widget can be embedded on any website or shared via direct link, making it flexible for various use cases.
3/ Multi-Channel Collection: FireFeed offers multiple ways to collect feedback:
Embedded website widget
Direct feedback links
QR codes for physical locations
4/ Analytics Dashboard: The platform provides comprehensive analytics, allowing businesses to track feedback trends, monitor sentiment patterns, & view detailed feedback analysis.
🛠️ Tech Stack
FrontEnd: Next.js 15, TypeScript, React
BackEnd: Modus Functions
Styling: Tailwind CSS, shadcn/ui
Authentication: NextAuth.js
Database: PostgreSQL
AI Models: OpenAI’s GPT-4o Mini (w/ Modus’ Model API)
File Storage: EdgeStore
Email: Brevo
🦄 How I Used Modus
I had FUN trying out a couple of stuff with Modus! Chuckles, of course it’s fun in retrospect. Here they are:
1/ A NextAuth.js adapter 100% powered by Modus' function: Yes, you read that right! I implemented the 5 I needed for my project. 5 was enough for me (with some other functions) to couple up a full authentication system.
Here's the adapter:
import { Awaitable } from 'next-auth';
import { createUser, linkAccount } from '#/lib/graphql/mutation';
import { Adapter, AdapterAccount, AdapterUser } from 'next-auth/adapters';
import { getUser, getUserByAccount, getUserByEmail } from '#/lib/graphql/queries';
export const ModusAdapter: Adapter = {
createUser: createUser,
getUser: async (id) => {
const user = await getUser({ id });
return user as Awaitable<AdapterUser | null>;
},
getUserByEmail: async (email) => {
const userByEmail = await getUserByEmail({ email });
return userByEmail as Awaitable<AdapterUser | null>;
},
getUserByAccount: async ({ provider, providerAccountId }) => {
const userByAccount = await getUserByAccount({ provider, providerAccountId });
return userByAccount as Awaitable<AdapterUser | null>;
},
linkAccount: async (account: AdapterAccount) => {
await linkAccount({
userId: account.userId,
type: account.type,
provider: account.provider,
providerAccountId: account.providerAccountId,
refresh_token: account.refresh_token ?? '', // OPTIONAL, not supported yet by Modus ;(
access_token: account.access_token ?? '', // OPTIONAL, not supported yet by Modus ;(
expires_at: account.expires_at ?? 0, // OPTIONAL, not supported yet by Modus ;(
token_type: account.token_type ?? '', // OPTIONAL, not supported yet by Modus ;(
scope: account.scope ?? '', // OPTIONAL, not supported yet by Modus ;(
id_token: account.id_token ?? '', // OPTIONAL, not supported yet by Modus ;(
session_state: account.session_state ?? '', // OPTIONAL, not supported yet by Modus ;(
});
}
};
Here's one of the Modus functions that powers it:
export function createUser(name: string, email: string, password: string, currentOrganizationId: string): User {
const user = postgresql.execute(
'database',
`INSERT INTO "User" (id, name, email, password, "currentOrganizationId", "emailVerified", "createdAt", "updatedAt")
VALUES ('${uuid()}', '${name}', '${email}', '${password}', '${currentOrganizationId}', NULL, NOW(), NOW())`
);
if (user. Error) {
throw new Error(`Error creating user: ${JSON.stringify(user.error)}`);
}
// Fetch and return created user
const fetchedUser = postgresql.query<User>(
'database',
`SELECT * FROM "User" WHERE email = '${email}' LIMIT 1`
);
if (fetchedUser.error) {
throw new Error(`Error fetching created user: ${JSON.stringify(fetchedUser.error)}`);
}
const returnUser = fetchedUser.rows.pop();
if (!returnUser) throw new Error('User creation failed');
console.log(`Return User :>> ${JSON.stringify(returnUser)}`);
return returnUser;
};
2/ Apart from the 5 I implemented for NextAuth, I worked on other functions (both big and small) making it 23 in total! My app's BackEnd is 100% powered by Modus & PostgreSQL. Here's a full list of functions:
getVerificationCodeByEmail
createMembership
deletePasswordResetToken
deleteVerificationCode
generatePasswordResetToken
getPasswordResetTokenByToken
getUser
getUserByEmail
createFeedback
createOrganization
getFeedbackByFeedbackId
getFeedbacksByOrganizationId
getUserByAccount
updateOrganization
updateUser
getVerificationCodeByCode
linkAccount
createUser
generateVerificationCode
getDashboardStats
getFeedbackByOrganizationIdAndFeedbackId
getOrganization
getUserOrganizationsByUserId
💪 Challenges Faced
1/ Understanding AssemblyScript's Boundaries: So, Modus has 2 languages you can use to develop with it, Go & AssemblyScript. I chose to work with AssemblyScript because it is similar to TypeScript in some ways, but it's not. No. Far from it 😭. My terminal was almost, always red with errors of all kind. Thanks to my trusty ChatGPT, figuring it out took lesser time than usual.
2/ Widget Integration: Creating a widget that's both customizable and easy to integrate across different websites presented unique technical challenges, especially around cross-origin communication and styling isolation.
3/ Data Visualization: Building an intuitive dashboard that effectively communicates feedback trends and insights required extensive research and iteration.
📸 Screenshots
🔗 Project Links
Repository: https://git.new/FireFeedRepo
✨ Conclusion
FireFeed is transforming how businesses collect and utilize customer feedback. By combining AI-powered analysis with flexible collection methods and intuitive visualization, it makes feedback management accessible and actionable for businesses of all sizes.
Whether you're looking to improve customer satisfaction, identify areas for improvement, or make data-driven decisions, FireFeed provides the tools and insights you need to succeed.
Try FireFeed today and start turning your customer feedback into actionable insights!
Subscribe to my newsletter
Read articles from Omezibe Obioha directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by

Omezibe Obioha
Omezibe Obioha
I enjoy crafting aesthically-pleasing, human-centric digital experiences ❤.