From Matyas → Dani | Repo: matt-clientsflow/clientsflow-studio (private) | Date: 2026-06-18
A Modal-hosted sales-prep tool. Feed it a prospect's website URL, it returns: deep-scraped site analysis, SEO keyword research + DataForSEO volumes, competitor analysis, and a fully generated new website HTML — all via Gemini 3.1 Pro. Output goes into a reviewer workflow and Notion CRM. Hungarian UI, English code.
clientsflow-studio-v2 (currently not deployed — the workspace hit the 8 web-function cap).
v3
v3.0 — n8n-style two-zone node graph UI, reviewer rebuild, comment re-anchor, per-version client links. 124 tests. Deployed as clientsflow-studio-v3.
v3.1
Matyas's latest work (see section 3 below). Builds on v3 in place. LIVE at clientsflow-studio-v31. All 148 tests green. This is the branch you should treat as the current "main" for production work.
dani/work-2026-06-16
Your work branch — untouched by Matyas.
dani/deploy-seo-test
Your SEO test branch — untouched by Matyas.
dani/ branches. No merge has happened yet — that's your job.
v3.1All commits are already pushed. These are the major features added on top of v3.0:
sitemap.xml. Navbar rebuilt from grouped header links. ~2× faster than before.Setting table to switch back. Keyword checkbox selection exports final-keywords.csv for downstream steps.gemini-2.5-flash-image bg removal. Note: the model returns an opaque result on solid-bg logos — code falls back to a corner-matte. A real segmenter (rembg) is the future upgrade.RULE_BANK named version), 4b = prompt-driven refine pass. Both have Load-into-reviewer + Regenerate buttons.app/clients/fx.py fetches a live USD→HUF rate so DataForSEO CPC is correctly in HUF (the flat 365 rate overstated CPC by ~20%).#labStatus shows what's running at all times; poll interval 5s→3s.Full test suite: 148 green / 1 skipped. Live at matyas--clientsflow-studio-v31-web.modal.run.
invalid_grant — refresh token expired. The volumes step falls back to DataForSEO automatically. Re-consent helper: studio/scripts/ads_exchange_code.py.scripts/smoke.py echo-chain step is stale — it false-fails post-deploy. Rewrite or drop it before running in CI.preview-edit endpoint exists and is tested, but the UI that rides on it was deferred.git fetch never touches your local branches — it only updates the remote-tracking refs. Do it first, then inspect before merging anything.
# First time:
git clone https://github.com/matt-clientsflow/clientsflow-studio.git
cd clientsflow-studio
# Already cloned:
git fetch --all # downloads everything — safe, no local changes
git branch -a # list all local + remote branches
git log origin/dani/work-2026-06-16 --oneline -5 # your latest commits
Your dani/ branches will appear under remotes/origin/dani/… — untouched.
git checkout v3.1 # or: git switch v3.1
This is the branch you'll likely base production on.
python3 -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
You'll also need the Modal CLI: pip install modal and modal token new (ask Matyas for credentials).
python3 -m pytest -q # should be 148 passed / 1 skipped on v3.1
You're in charge of the merge. Suggested approach:
production branch off v3.1 — this is your integration target.git checkout -b production v3.1dani/work-2026-06-16 commits against v3.1:git log v3.1..origin/dani/work-2026-06-16 --onelinegit merge --no-ff origin/dani/work-2026-06-16pytest again, then push:git push origin productionmain — it is v1.0, frozen, still live for legacy reference. Production work goes to a separate branch or a new v4 / production branch.
The app deploys as a named Modal app. The name is set inside modal_app.py — check it matches the slot you want to occupy.
# Deploy from the v3.1 branch (or your merged branch):
python3 -m modal deploy modal_app.py
# Live URL (v31 slot):
# https://matyas--clientsflow-studio-v31-web.modal.run/
The workspace is on the Modal Starter plan — max 8 web functions. Check modal app list and free a slot if needed before deploying a new app name.
All API keys live in a Modal secret called studio-secrets (in the matyas workspace). You'll need Matyas to either share the secret or invite you to the workspace. Never commit secrets to the repo.
Key env vars the app expects: GEMINI_API_KEY, R2_ACCESS_KEY_ID, R2_SECRET_ACCESS_KEY, R2_BUCKET, ADMIN_PASSWORD, STUDIO_BASE_URL, STUDIO_WEBHOOK_SECRET, MISSIVE_API_KEY, NOTION_TOKEN, DATAFORSEO_LOGIN, DATAFORSEO_PASSWORD.