byForja Infra Tree 11-08-2026 — verified live
Drag the boxes to reorganise. Arrows stay connected. Positions are saved in your browser.
The two Cloudflare Pages projects are the core of the system (white outline): byforja serves the public site, byforja-tools serves this admin surface behind Cloudflare Access. Colours = category. Dashed lines = monitoring or indirect link.
Double-click a box to rename it. Use + Add independent node to drop in custom nodes, then drag them anywhere.
The 8 branches of the trunk
Each branch groups services by function. The trunk is the pair of Cloudflare Pages projects. Both projects read and write the same D1 database, which is why a schema change is never a single-repo decision.
Storage branch
Cloudflare D1 byforja ↔ both Pages projects (21 live tables, densest link)
R2 byforja-user-toolkit ← both projects (client documents, binding USER_TOOLKIT)
R2 byforja-backups ← backup worker only (D1 dumps + event archives)
Auth branch
Cloudflare Access → byforja-tools (team eo-team, gates every route)
Defense in depth: functions/_middleware.js re-checks the Access JWT against ADMIN_EMAIL on /api/admin/*, fail-closed
Magic link → public site (D1 tables magic_link_tokens + pending_logins, no third-party identity provider)
Network branch
Cloudflare DNS, zone byforja.com → routes both Pages projects
Mail records: SPF v=spf1 include:_spf.google.com ~all, DKIM google._domainkey, DMARC p=quarantine
Brevo DKIM: brevo1 + brevo2._domainkey CNAMEs delegated to Brevo
Email branch
Brevo ← public site (magic-link mail, sender contact@byforja.com)
Resend ← tools (brand-swipe invite, sender al@byforja.com)
Google Workspace ← DNS (mailboxes on byforja.com, MX on Google)
Google Postmaster Tools ··· Workspace (reputation + compliance monitoring)
Booking branch
Cal.com ← public site via the /call 302 (event digital-offensive)
Google Calendar ← Cal.com (availability sync, schedule "Disponibilite Forja", Europe/Paris)
No Cal.com webhook is wired yet — /bookings is still a placeholder waiting on the schema.
Automation branch
byforja-backup-worker → D1 + R2 (8 cron triggers, 9 HTTP endpoints)
Gmail API ← byforja-backup-worker, OAuth on al@eliteoutsiders.com (send-as al@byforja.com), added 24/08/2026 for the outreach follow-up sender (T2/T4/T5)
Notion API ← byforja-backup-worker, direct REST (Outreach Prospects DB read + Status writes)
byforja-cron-purge → D1 (monthly GDPR retention purge, 1st at 03:00 UTC)
Both are separate repos deployed as standalone Workers, not Pages Functions.
Operator branch
Terminal (macOS) → Wrangler (deploy, D1 queries, Pages secrets)
Terminal → GitHub (git push/pull on 4 private repos)
Wrangler → both Pages projects + D1. It is the only write path to production.
Business tooling — not wired to the code
Notion (Outreach Prospects DB) → Loom + mockup render → Yousign → Stripe
This is the human sales chain. None of it calls the site or the tools at runtime.
If you cut this cluster the infra keeps running — you just lose the way byForja sells.
Quick read — who's connected to whom
7 services touch the code directly: D1 (read/write from both projects), R2 user-toolkit (uploads), Cloudflare Access (gates tools), Cloudflare DNS (routes), Brevo (magic-link API), Resend (admin transactional API), Cal.com (via the /call redirect).
5 peripheral services: R2 backups (downstream of the backup worker), byforja-backup-worker and byforja-cron-purge (scheduled writers on D1), Google Workspace (mailboxes on the zone), Google Postmaster Tools (reputation monitoring on the sending domain).
3 operator tools: Terminal (macOS) drives Wrangler and GitHub. It is the human control layer — if Terminal breaks, no more deploys and no more admin work, but the live sites keep serving.
D1 is the silent hub: 4 pieces of code write to it (public site Functions, tools Functions, backup worker, purge worker). A schema change touches all four. There is no staging copy — byforja is the only database.
DNS is the second silent hub: Pages routing, Access, Google Workspace mail and Brevo DKIM all resolve through the same zone. Break the zone and mail plus hosting fail together.
Cloudflare inventory
Read live from the Cloudflare API on 11/08/2026, cross-checked against wrangler.toml in each repo.
Pages projects (2)
- byforja
- byforja.pages.dev · byforja.com · www.byforja.com
- bindings: DB → d1
byforja, USER_TOOLKIT → r2byforja-user-toolkit - secrets:
AUTH_SECRET,BREVO_API_KEY - 14 Functions endpoints under
/api
- byforja-tools
- byforja-tools.pages.dev · tools.byforja.com
- bindings: DB → d1
byforja, USER_TOOLKIT → r2byforja-user-toolkit - secrets:
ADMIN_EMAIL,RESEND_API_KEY - 20 Functions endpoints under
/api/admin, all behind CF Access
D1 databases (1)
- byforja
- id
ff9f3527-bcc5-454b-88e1-c26420688b06· created 03/05/2026 - 21 live tables, shared by site + tools + both Workers
- analytics:
events,error_events,analytics_snapshots - auth:
magic_link_tokens,pending_logins - contacts:
contacts,toolkit_resources - client model:
client_brand_bible,client_brand_options,client_brand_swipes,client_contract,client_discovery,client_monthly_plans,client_plan_comments - journey:
journey_state,journey_tasks,journey_events - tooling:
pricing_calculations,board_state,page_inventory,button_inventory
- id
R2 buckets (2)
- byforja-backups · created 04/05/2026
- private, reached only through the worker binding
BACKUP_BUCKET - prefix
YYYY-MM/d1-byforja-DATE.sql(monthly D1 dump) - prefix
events-archive/YYYY-MM/(monthly events archive)
- private, reached only through the worker binding
- byforja-user-toolkit · created 23/05/2026
- bound as
USER_TOOLKITon both Pages projects - client documents uploaded from the admin, served through
/api/me/toolkit
- bound as
Workers (2 active)
- byforja-backup-worker
- 8 crons:
0 2 1 * *events archive ·0 3 1 * *D1 backup ·0 4 1 * *URL audit ·0 4 * * 1page-flow crawl ·0 5 1 1,7 *analytics-map refresh ·0 6 * * *error watchdog ·0 8 * * 1weekly snapshot ·0 * * * *outreach follow-up sender (added 24/08/2026) - bindings: DB (byforja), BACKUP_BUCKET (byforja-backups)
- secrets: NOTION_API_KEY, CALCOM_API_KEY, GMAIL_CLIENT_ID, GMAIL_CLIENT_SECRET, GMAIL_REFRESH_TOKEN (added 24/08/2026, OAuth on al@eliteoutsiders.com — see Automation branch)
- 9 endpoints:
/run,/backup/last-run,/admin/events-archive-now,/admin/url-audit-now,/admin/page-flow-crawl-now,/admin/error-events-watchdog-now,/admin/weekly-snapshot-now,/admin/analytics-map-refresh-now,/admin/gmail-followup-now - alert mail goes out through Brevo; outreach follow-ups go out through Gmail API, same thread as AL's manual T1
- 8 crons:
- byforja-cron-purge
- 1 cron:
0 3 1 * *monthly GDPR retention purge - honours the retention promise published on byforja.com/privacy
- 1 cron:
KV namespaces (0)
- none for byForja
- the account holds one namespace,
BACKUP_STATE, and it belongs to Elite Outsiders - no byForja
wrangler.tomldeclares a KV binding — cron run history is not persisted yet
- the account holds one namespace,
Domains
- Custom domains (3)
- byforja.com → Pages project byforja
- www.byforja.com → Pages project byforja
- tools.byforja.com → Pages project byforja-tools, CF Access gated
- Platform domains (3)
- byforja.pages.dev · byforja-tools.pages.dev
- byforja-backup-worker.alexandre-corne-ac.workers.dev
Two orphan Workers still sit in the account: byforja and byforja-worker, both last modified 26/04/2026, neither has a local repo. They predate the move to Pages and look like leftovers — confirm before deleting.
The two repos
| Repo | Serves | Gate | Contents |
|---|---|---|---|
| byforja-site | byforja.com + www.byforja.com — the public bilingual FR/EN site | Public. Magic-link login on /account only |
21 pages in public/, 14 Functions endpoints, 6 D1 migrations, Playwright smoke tests |
| byforja-tools | tools.byforja.com — the admin surface, this page included | Cloudflare Access SSO (team eo-team) + ADMIN_EMAIL allowlist on the API |
38 pages in public/, 20 admin endpoints, 8 D1 migrations |
| byforja-backup-worker | Scheduled jobs against D1 and R2 | Worker default domain, admin endpoints behind a shared secret | 7 job modules, 7 crons |
| byforja-cron-purge | Monthly GDPR purge on D1 | Cron only | Single module |
All four repos are private on GitHub under alexandrecorne/. The site and tools repos both bind the same D1 and the same R2 toolkit bucket — that coupling is deliberate and it is the main reason a migration has to be run once and smoke-tested twice.
Tool pages on tools.byforja.com (38)
One line per page, taken from the page's own title and first heading. "Placeholder" means the page ships a placeholder block instead of a working dashboard.
| Page | What it is | State |
|---|---|---|
| /index | byForja Tools — AL. The hub that links every page below. | Hub |
| /alllinks | All internal links — manual index of every page on tools.byforja.com | Live |
| /analytics-map | Analytics map — what we track. Source of truth for every event type captured by bf-tracking.js | Live |
| /architecture | Architecture. The long-form system map, the largest page in the repo at 161 KB. | Live |
| /bookings | Bookings — Cal.com bookings (slug: digital-offensive) | Placeholder |
| /brand-options-editor | Brand options · A vs B. Editor for the paired brand options served to clients. | Live |
| /cal-questionnaires | Cal.com Questionnaire — byForja source of truth. Offensive Digitale · 4 questions · exact wording | Live |
| /call-cockpit | Call Cockpit. Live surface used during a prospect call. | Live |
| /click-analytics | Click analytics — click events breakdown by page, target, and timing | Placeholder |
| /clients | Clients — byForja contact base, auto-added on magic-link login plus manual entries | Live |
| /clients-detail | Client detail. Per-client record with newsletter, booking, pricing, contract and journey tabs. | Live |
| /content-system | Content system — byForja content production system | Placeholder |
| /coredata | Core data — canonical KPIs and references for byForja | Placeholder |
| /crm | CRM · Client journey. Pipeline view over the journey tables. | Live |
| /crons | Crons — byForja automation surface, backup worker plus watchdog | Live |
| /customer-journey | Customer journey. Per-email journey timeline. | Live |
| /data | Data landing — raw data hub, pointers to D1 tables and dashboards | Placeholder |
| /discovery-questionnaire | Discovery questionnaire. Pre-engagement questionnaire filled with the client. | Live |
| /email-deliverability | Email deliverability — open rates, bounces, complaints | Placeholder |
| /email-system | Email system — transactional plus marketing email orchestration | Placeholder |
| /health | byForja health — aggregate status, D1 live counters plus crons plus last snapshot | Live |
| /heatmap | Heatmap — anonymous click coordinates per page | Placeholder |
| /infra-tree | Infra tree. This page. | This page |
| /lf-cross-platform-content | Actions board — cold to served client, one intent per line | Live |
| /lf-cross-platform-content-doc | LF cross-platform — canonical doc | Placeholder |
| /mockups | Mockups — the proof asset that rides with every Loom | Live |
| /monthly-output-preview | Monthly plan preview — pick a client and a month | Live |
| /monthly-plan-questionnaire | Monthly plan. Questionnaire that feeds the monthly deliverable. | Live |
| /notion-vs-tools | Notion vs Tools — source-of-truth split, which system owns what | Live |
| /og-preview | Open-Graph preview — quick preview of OG cards for byforja.com URLs | Placeholder |
| /onboarding-questionnaire | Onboarding questionnaire. Post-signature intake. | Live |
| /page-flow | byforja.com page flow — live inventory, refreshed weekly by the page-flow crawler | Live |
| /preview-clients-detail | Client detail (preview) — layout sandbox for the /clients-detail design | Placeholder |
| /pricing-calculator | Pricing calculator — profile × launch formula × monthly tier × market × revenue → launch + monthly | Live |
| /public-site-deploy-process | byforja-site deploy process — how to ship to byforja.com | Live |
| /purchases | Purchases — purchase log (Stripe / Lemon Squeezy / manual) | Placeholder |
| /videos | byForja videos — video index and LF cross-platform link | Placeholder |
| /weekly-business-steering | byForja weekly business steering — tracking pillars and deliverables, one entry per week | Placeholder |
24 live pages, 14 placeholders. Two placeholders still carry copy inherited from the Elite Outsiders port: /email-deliverability names Kit and /purchases names Lemon Squeezy — neither is a byForja service. Worth rewriting when those pages are built.
External services wired
| Service | Category | Role | If it breaks... |
|---|---|---|---|
| Cloudflare Pages | Cloudflare | Hosts byforja.com and tools.byforja.com | Everything goes dark — public site and admin at once |
| Cloudflare D1 | Storage | Single shared SQL database, 21 tables | Login, client records, analytics and crons all fail together |
| Cloudflare R2 | Storage | Client documents (user-toolkit) and monthly backups | Toolkit downloads break; backups stop accumulating |
| Cloudflare Access | Auth | SSO gate on tools.byforja.com, team eo-team |
No access to the admin surface at all |
| Cloudflare DNS | Network | Zone byforja.com — routing plus every mail record | Cascade: hosting, Access and mail fail in the same minute |
| Brevo | Magic-link sign-in mail and worker alerts, from contact@byforja.com |
Nobody can sign in to /account and alerts go silent | |
| Resend | Admin-triggered transactional mail (brand-swipe invite), from al@byforja.com |
Brand-swipe invitations cannot be sent from the admin | |
| Google Workspace | Mailboxes on byforja.com. MX on Google, SPF include:_spf.google.com, DKIM google._domainkey, DMARC p=quarantine |
Outbound prospecting stops and inbound replies bounce | |
| Google Postmaster Tools | Monitoring | Sender reputation, spam rate and compliance for the outbound prospecting domain — dashboard for byforja.com | Reputation drift stops being visible before Gmail starts filtering |
| Cal.com | Booking | Event digital-offensive (id 6614252), schedule "Disponibilite Forja" (id 1478988), Europe/Paris |
No discovery calls can be booked from the site or from outreach mail |
| Google Calendar | Booking | Availability source synced by Cal.com | Cal.com offers slots that are already taken |
| GitHub | Operator | 4 private repos (site, tools, backup worker, cron purge) | No versioning or history; the live sites keep serving |
| Wrangler (CF CLI) | Operator | Deploys both Pages projects, queries D1, manages secrets | No deploys and no manual DB work |
| Notion | Business | Outreach Prospects DB plus the byForja doctrine pages | You lose the prospect pipeline and the docs; the code keeps running |
| Loom | Business | Outreach video sent with every prospect mockup | Outreach loses its personalised video; nothing technical breaks |
| Yousign | Business | Contract signature at close, tracked as journey step contrat_envoye |
No contract can be signed; no start date is announced |
| Stripe | Business | First transfer at close. No webhook and no secret on the Pages projects — it is manual today | No payment collected; the site is unaffected because nothing is wired |
| Canva | Retired | Retired on 09/08/2026 — mockups are now rendered by node render.js in headless Chrome, about 3.2 s per PNG |
Nothing. Listed so nobody re-wires it by accident |
Google Postmaster Tools — status on 11/08/2026
Domain byforja.com. Dashboard: postmaster.google.com/v2/sender_compliance?domain=byforja.com
All 8 compliance requirements green: SPF/DKIM, From header alignment, DMARC, encryption, user-reported spam rate, DNS records, one-click unsubscribe, honour unsubscribe.
Deliverability analysis says "not enough outgoing email" — the sending volume is still too low for Google to score reputation. That is expected at this stage, not a fault. It becomes a real signal only once outbound prospecting volume rises.
The legacy Postmaster interface is retired on 31 October. Use the /v2/ URL above — the old one will stop working.
Redirects
| From | To | Code | Why |
|---|---|---|---|
| byforja.com/call | https://cal.com/alexandrecorne/digital-offensive | 302 | Outreach mail points at byforja.com/call so the visible URL never carries the personal cal.com handle. 302 on purpose: if the Cal.com event moves, every link already sent keeps working. |
| /index-en.html · /index-en | / | 301 | EN became the default at root on 30/05/2026, FR moved to /index-fr.html. Kept so old external links survive. |
Both live in byforja-site/public/_redirects. byforja-tools/public/_redirects is empty. Verified live on 11/08/2026: /call answers 302 to the Cal.com event, tools.byforja.com answers 302 to the eo-team Access login.
Links to the full documentation
→ Notion: Claude Code HQ — universal patterns · rules shared across all four verticals
→ Notion: byForja — Claude Code HQ — specifics · posture, brand, offer, packages, contracts
→ Notion: byForja hub · business doctrine, leads, content, contracts, CRM
→ /architecture · the long-form system map · → /crons · the automation surface · → /health · live counters