Inspiration
Brands pay for customer satisfaction surveys, and I've seen them hand out freebies and discount codes just to get people to fill them in. Meanwhile customers already say exactly what they think, for free, in the comments under brand posts and creators' reviews.
I've been on the other side of this: a phone repair that broke the water seal and then a denied warranty, and billing problems stuck behind support bots with no way to reach a person. Three students I talked to this month had the same story. None of them got what they asked for, and two ended up on Reddit for help.
The idea and research come from Overheard, a project I have worked on since July. All the code in this submission was written this weekend.
What it does
ReplyInPublic collects public comments about 17 kitchen brands from YouTube, Instagram, TikTok, X and Reddit, checks whether the brand already replied, hides the noise, and labels the rest as a question, a complaint, praise or a buyer.
The inbox shows only what is still waiting: unanswered complaints, questions and buyers. Open a comment and ReplyInPublic shows passages from that brand's saved manuals and support pages, plus a suggested reply built from them. A person approves every reply. Each message gets a case ID and a reply deadline.
It runs on its own at replyinpublic.us: YouTube every 30 minutes, Instagram, X and Reddit every hour, TikTok twice a day, and labeling every 2 hours.
How I built it
Python 3.12 and FastAPI on a Vultr server, with Caddy for HTTPS on replyinpublic.us. Data lives in Tiger Data: Postgres with a TimescaleDB hypertable for comments over time. Collectors use the YouTube Data API, Apify, EnsembleData for TikTok, and a Grok Bot automation that pushes X mentions into an ingestion endpoint. Gemini 3.5 Flash and Flash Lite label the comments and draft replies from the brand's own pages.
AI tools, credited: Cursor was my main coding agent, Grok Bot runs the X automation, Gemini runs inside the product, and Claude helped with planning and review.
Challenges I ran into
- YouTube allows 10,000 quota units a day and one search costs 100, so brand discovery runs twice a day and comment refresh runs on stored videos.
- A TimescaleDB hypertable needs its time column in every unique key, so duplicates are blocked on platform, comment ID and post time.
- Scrapers can't always see whether a brand replied. When the reply status is unknown, ReplyInPublic says so instead of counting the comment as ignored.
- Most comments are noise, so they are filtered out before anyone has to read them.
Accomplishments that I'm proud of
It is live and refreshing on its own, on real comments, and every message links back to the original post.
What I learned
Writing the reply is the easy part. Knowing what is real, what is noise and whether the brand already answered is the hard part.
What's next
Brands connect their own accounts so approved replies post through the official platform APIs. Every brand names one support person who answers anything the manuals don't cover within 48 hours. Later, public support scores built only from data solid enough to trust.
Built With
- apify
- caddy
- cursor
- ensembledata
- fastapi
- gemini
- grok
- postgresql
- python
- tiger-data
- timescaledb
- vultr
- youtube-data-api