No description
Find a file
Gleb Zaglyadnov a2f924f786
Some checks are pending
ci / lint-and-test (push) Waiting to run
ci / docker-build (push) Waiting to run
fix(deploy): stop hardcoding CREO_WEB_BASE in bot compose service
Overrode whatever the real .env value was — env_file: never won against
environment: for the same key. Falls back to the placeholder only if
CREO_WEB_BASE is genuinely unset.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-27 14:13:14 +03:00
.forgejo/workflows ci: drop setup-python (uncached action fails on local runner); use slim+apt 2026-07-15 12:54:34 +03:00
apps feat(bot): OpenRouter-powered crypto Telegram bot MVP + prod deploy prep 2026-07-27 13:52:39 +03:00
backups fix(deploy): stop hardcoding CREO_WEB_BASE in bot compose service 2026-07-27 14:13:14 +03:00
data feat(bot): OpenRouter-powered crypto Telegram bot MVP + prod deploy prep 2026-07-27 13:52:39 +03:00
deploy fix(deploy): stop hardcoding CREO_WEB_BASE in bot compose service 2026-07-27 14:13:14 +03:00
examples feat: Phase 0 scaffold — provider abstraction + hybrid pipeline + CLI 2026-05-21 11:50:34 +03:00
scripts fix(archive): omit the server deploy log from the data snapshot 2026-07-22 12:22:00 +03:00
src/creo feat(bot): OpenRouter-powered crypto Telegram bot MVP + prod deploy prep 2026-07-27 13:52:39 +03:00
tests feat(bot): OpenRouter-powered crypto Telegram bot MVP + prod deploy prep 2026-07-27 13:52:39 +03:00
vendor/reverse-SynthID feat(bot): OpenRouter-powered crypto Telegram bot MVP + prod deploy prep 2026-07-27 13:52:39 +03:00
.deploy-discipline feat: Phase 0 scaffold — provider abstraction + hybrid pipeline + CLI 2026-05-21 11:50:34 +03:00
.dockerignore feat: local Docker run + fix htmx target inheritance on cost estimate 2026-05-21 12:46:27 +03:00
.env.example feat(bot): OpenRouter-powered crypto Telegram bot MVP + prod deploy prep 2026-07-27 13:52:39 +03:00
.env.production.example feat(bot): OpenRouter-powered crypto Telegram bot MVP + prod deploy prep 2026-07-27 13:52:39 +03:00
.gitignore fix(gitignore): ignore .env.production (was untracked-but-not-ignored) 2026-07-27 14:10:10 +03:00
CHANGELOG.md fix(deploy): stop hardcoding CREO_WEB_BASE in bot compose service 2026-07-27 14:13:14 +03:00
docker-compose.yml chore(docker): mount ./src for live reload in dev compose 2026-05-26 15:05:25 +03:00
Dockerfile fix(fal): batch img2img to fal's 4-image cap; editable install for live src 2026-05-26 15:45:16 +03:00
HANDOFF.md refactor: replace infrastructure identifiers with placeholders 2026-07-22 12:11:22 +03:00
LICENSE.md feat: Phase 0 scaffold — provider abstraction + hybrid pipeline + CLI 2026-05-21 11:50:34 +03:00
PLAN.md docs(handoff): self-contained handoff package for developer transfer 2026-07-22 11:40:35 +03:00
PROVIDERS.md feat: Phase 0 scaffold — provider abstraction + hybrid pipeline + CLI 2026-05-21 11:50:34 +03:00
pyproject.toml feat(bot): OpenRouter-powered crypto Telegram bot MVP + prod deploy prep 2026-07-27 13:52:39 +03:00
README.md docs(handoff): self-contained handoff package for developer transfer 2026-07-22 11:40:35 +03:00
TELEGRAM_BOT_TZ.md feat(bot): OpenRouter-powered crypto Telegram bot MVP + prod deploy prep 2026-07-27 13:52:39 +03:00
UI_UX.md feat: Phase 0 scaffold — provider abstraction + hybrid pipeline + CLI 2026-05-21 11:50:34 +03:00

Creo Generator

Ad-creative generator for affiliate marketers. Swappable AI providers, Telegram delivery, web config dashboard.

Status: v0.31.0 — deployed and running in production since 2026-05-27. Web dashboard + Telegram bot + CLI all working; 100 tests green.

New to this project? Start with HANDOFF.md — setup, architecture tour, production topology, and the roadmap.

What it does

Given a brief — vertical × angle × traffic_source × geo — Creo generates ad creatives by:

  1. Generating a background image (Fal.ai Flux) via a provider abstraction.
  2. Generating ad copy (OpenRouter → DeepSeek-V3) primed with few-shot examples from the dataset.
  3. Compositing copy onto the image per a per-traffic-source layout preset (Pillow).

Phase 1 wraps this in a Telegram bot + HTMX web dashboard. See UI_UX.md.

Architecture

Concern Doc
Roadmap, phases, generation pipeline PLAN.md
Provider matrix + trainability tiers PROVIDERS.md
Dashboard + bot UX UI_UX.md
src/creo/
  briefs/        # CreativeBrief, VisualBrief, CopyVariant — the contract
  providers/     # TextProvider/ImageProvider protocols, registry, adapters
  presets/       # LayoutTemplate + YAML loader
  examples/      # few-shot retriever over data/examples
  composition/   # PillowCompositor — overlay copy onto background
  pipeline.py    # orchestrates the hybrid pipeline
  cli.py         # `creo generate`
data/
  examples/{vertical}/{angle}/{traffic_source}/*.yml   # training data (primary IP)
  presets/*.yml

Quickstart

uv venv --python 3.12
uv pip install -e ".[dev]"
cp .env.example .env          # leave keys blank for mock mode

# Generate in mock mode (no API calls, placeholder images + copy):
creo generate --brief examples/brief.taboola.yml -n 5

# With live keys, fill .env then run the same command.

Output PNGs land in out/.

Web dashboard (Phase 1)

# Local MVP — dev-login, mock providers, SQLite. No keys or bot token needed.
CREO_MOCK=1 CREO_DEV_AUTH=1 uvicorn apps.web.main:app --reload --port 8000
# open http://localhost:8000 → "Start (dev login)" → Generate

The Telegram bot (apps/bot/bot.py) runs only when BOT_TOKEN is set — bot wiring is intentionally post-MVP. With live keys, set OPENROUTER_API_KEY + FAL_API_KEY in .env and drop CREO_MOCK.

License

UNLICENSED — Copyright (c) 2026 Sergey Dyo. All Rights Reserved. See LICENSE.md.