Inspiration
Small business owners, freelancers, and creators know they should post consistently on social media, but writing captions, coming up with visual ideas, and sticking to a schedule every single week is a chore most people quietly give up on. I wanted to build something that actually does this work autonomously, not just a chatbot you have to keep prompting.
What it does
ContentPilot is an agent, not a chatbot. You brief it once with your brand's business type, tone, target audience, and brand color. From then on, the agent runs on its own: it reads the saved brand profile, generates a full week of ready-to-use captions and visual direction using Gemini, tags each post with the best-fit platform, and stores everything in Firestore for review. In production it's triggered by Cloud Scheduler on a weekly cadence, with zero user interaction required for it to run.
How we built it
- Backend: Python + Flask, structured as an explicit agent (Goal / Tools / Run loop) so it maps directly onto Google ADK's Agent, Tool, and Runner primitives
- AI: Gemini 3.5 Flash generates the captions, platform recommendation, and visual direction for each post, constrained to strict JSON output
- Storage: Google Cloud Firestore stores brand profiles and every generated content run
- Trigger: Google Cloud Scheduler calls the agent's
/api/generateendpoint on a weekly schedule — this is what makes it genuinely autonomous rather than chat-driven - Frontend: A single-file HTML/CSS/JS dashboard for brand setup and reviewing generated content
Challenges we ran into
- Getting Gemini to reliably return strict, parseable JSON for five structured posts at once, rather than prose with embedded formatting
- Structuring the agent logic so it could run identically whether triggered manually (for the demo) or by Cloud Scheduler in the background — the same
run()method handles both - Working within a 2-day build window as a solo builder — prioritizing a working async pipeline over posting-integration polish
Accomplishments that we're proud of
- A genuinely autonomous pipeline: once the brand is set, the agent needs no further human input to produce a week of on-brand content
- Clean separation of agent logic (
agent.py) from the API layer (main.py), so swapping in the full Google ADK runtime later requires no changes to the Gemini prompt or Firestore logic - A distinctive, on-brand frontend design built without a component framework
What we learned
- Structuring an "agent" around explicit Goal / Tools / Run pays off immediately — it made the autonomous-trigger requirement trivial to satisfy
- Constraining LLM output format up front avoids nearly all downstream parsing pain
- Proving autonomy convincingly (a scheduler + logs with no live user session) matters more to credibility than UI polish
What's next for ContentPilot
- Real posting integration via the Meta Graph API / LinkedIn API
- Actual image generation alongside the visual-direction text
- Multi-brand support per account, and a feedback loop where approvals/edits tune future generations
Built With
- css3
- flask
- gemini-api
- google-adk
- google-cloud-firestore
- google-cloud-schedular
- google-gemini
- html5
- javascript
- python
Log in or sign up for Devpost to join the conversation.