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/generate endpoint 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

Share this project:

Updates

Submission history