Back to projects

Adaro

AI-powered ad campaigns for local businesses that actually look good

PythonTypeScriptDjangoNext.jsPostgreSQLOpenAI API
Adaro landing page

Introduction

Adaro is an AI-driven platform that helps local businesses create professional ad campaigns without needing a marketing team or design skills. Users paste a link to their business — a website, a social media page, anything public — and Adaro scrapes it to pull out product info, brand colors, visual style, and overall vibe. From there, users can tweak that profile or jump straight into generating ads with a prompt. The ads automatically adjust to match the feel of the business, so a cozy bakery and a tech startup get campaigns that actually look like them.

Role

Co-Founder & Fullstack Software Engineer (team of 3)

Purpose & Goal

Adaro started when a close friend pitched the idea of building a real business together. The three of us had been classmates and coworkers for a while, and we wanted to try shipping something that people would actually pay for. The core observation was simple: local businesses struggle with advertising. They don't have the budget for an agency and don't have the time to learn design tools, so they end up with generic templates or nothing at all. We wanted to give them a way to get quality ad creative by just providing a link and a few words about what they wanted to promote.

Adaro dashboard

Technical Spotlight

The hardest problem we tackled was automating ad uploads to social media platforms. Our first approach was integrating each platform's developer API directly — Facebook, Instagram, X, and so on. That turned into a massive time sink: every platform has its own OAuth flow, token refresh rules, posting constraints, and content policies. Managing all of that in a reliable way was pulling us away from the core product. We pivoted to self-hosting Postiz, an open-source social scheduling tool, but that had its own problems. Postiz is designed for individual users managing their own accounts, not for a multi-tenant SaaS. We would have needed to spin up a separate Postiz instance per customer and abstract over its internals, which made it fragile and hard to maintain. Ultimately, we scoped that feature out of the MVP entirely and focused on making the ad generation pipeline solid. On the infrastructure side, I implemented structured end-to-end logging across the backend, which gave us real visibility into what was happening in production. I also refactored our API middleware so that user authentication and profile loading happened once at the middleware layer instead of being repeated in every endpoint handler — that cleaned up a lot of duplicated code and made the API surface more consistent.

Lessons Learned

The biggest lesson was about shipping over perfecting. We spent a lot of early time building on a foundation of "do it right the first time" when we should have been optimizing for speed to market. As a business, what matters is getting something into users' hands so you can learn what they actually need — not whether your architecture is pristine. Technically, I learned a lot about structured logging, cloud deployment tradeoffs, and what it takes to build a product that real users interact with. If I started over, I'd pick a stack optimized for deployment speed — something like Next.js on Vercel with Supabase — or go with a more industry-standard backend like Spring Boot. Oracle Cloud was the right call for cost, and Coolify made deployment smooth, but the overall stack was built more for learning than for rapid iteration.