Müşteriyi Leylek getirir. Siz uyurken satış yapan, zararı kesen otonom dijital pazarlama ajansınız.
Cloudflare üzerinde tamamen serverless çalışan multi-agent yapay zekâ platformu. KOBİ ve e-ticaret satıcıları için Meta Ads + Google Ads kampanyalarını otonom üretir, yayınlar ve optimize eder; zarar eden reklamı kapatır, bütçeyi kâr edene kaydırır.
İki çalışma modu:
- Otopilot — Tam otonom. Ajan kendi karar verir, eyleme geçer, log tutar.
- Co-Pilot — İnsan onaylı. Ajan önerir, kullanıcı uygulamadan veya e-postadan onaylar, ajan yürütür.
| URL | |
|---|---|
| Uygulama | https://leylek.nexvar.io |
| Sağlık probe (7 worker) | https://leylek.nexvar.io/api/health |
Single-origin: frontend Pages'tan, /api/* Worker route üzerinden gateway'e — aynı host, SameSite=Lax cookie.
Tamamen serverless — hiçbir sunucu kiralanmadı.
| Katman | Teknoloji |
|---|---|
| Frontend | React 19 + Vite 8 + Tailwind v4 (CSS-first @theme) — Cloudflare Pages |
| Backend (7 Worker) | Cloudflare Workers + Hono v4, Service Bindings ile haberleşir |
| Per-campaign state | Cloudflare Durable Objects (her kampanya kendi "yaşayan ajanı") |
| Veritabanı | Cloudflare D1 (serverless SQLite) + Drizzle ORM |
| Cache & session | Cloudflare KV |
| AI | Google Gemini 3.1 Flash Lite (responseSchema ile structured output) |
| Reklam API'leri | Google Ads REST v17 + Meta Marketing API v21.0 — sandbox'ta leylek-google-ads-mock / leylek-meta-ads-mock Worker'ları, prod'da googleads.googleapis.com / graph.facebook.com (tek code path, *_BASE_URL env switch) |
| Auth | Google OAuth 2.0 (ana) + Magic-link via Resend (yedek) |
| CI/CD | GitHub Actions — typecheck + lint + build + 7-worker deploy + Pages deploy on push to main |
React (Pages) ──── /api/* ────► gateway
│
▼ Service Bindings (internal, no public URL)
┌────────────┬─────────────┬───────────┬────────────┐
content-agent optimizer-agent publisher-agent analytics-worker
│ │ │
▼ ▼ ▼
Campaign DO HTTPS to mocks HTTPS to mocks
(per-campaign (sandbox) / (sandbox) /
atomic state) real Google/ real Google/
Meta (prod) Meta (prod)
│
▼
workers/google-ads-mock + meta-ads-mock
(Hono Workers emulating v17 + v21.0 APIs)
│
▼
D1 + KV
- gateway — API entry, Google OAuth + magic-link (Resend) + JWT, AES helpers, frontend façade.
- content-agent — Gemini 3.1 Flash Lite, ürün URL'sini analiz, persona çıkarımı, 3 reklam varyantı (Agresif / Hikaye / Teknik).
- optimizer-agent — Gemini 3.1 Flash Lite + Campaign Durable Object. Cron her 6 saat veya
/optimize-now; pause/keep/realloc kararı + Türkçe gerekçe. Co-Pilot modunda öneri yazar (D1notifications+ e-posta), Otopilot'ta direkt uygular. - publisher-agent —
AdPlatformClientfactory (PRD §10 port + adapter). Provider'a göreRealGoogleAdsClientveyaRealMetaAdsClient; her ikisi debaseUrlenv'i ile sandbox/prod'a yönlenir. - analytics-worker — 15 dakikalık cron +
/internal/refresh/:campaignId. Platform'dan (mock veya gerçek) fresh metric ingestion + D1metric_snapshotsaggregation →ads.spend_kuruscache. - google-ads-mock + meta-ads-mock — Google Ads REST v17 + Meta Marketing v21.0 subset'lerini emüle eder. State paylaşılan KV'de
gads:*/meta:*prefix'leri ile. Sandbox demo bunlara konuşur. - Campaign DO — per-campaign decision history, atomic Gemini → publisher zincir.
leylek/
├── apps/web/ # React 19 + Vite 8 + Tailwind v4 frontend
├── workers/
│ ├── gateway/ # Hono. OAuth, magic-link, JWT, campaign CRUD
│ ├── content-agent/ # Gemini structured-output URL → 3 variant
│ ├── optimizer-agent/ # Campaign DO + Gemini decision + Co-Pilot
│ ├── publisher-agent/ # AdPlatformClient factory + real clients
│ ├── analytics-worker/ # cron + refresh + metric aggregation
│ ├── google-ads-mock/ # Hono worker emulating Google Ads REST v17
│ └── meta-ads-mock/ # Hono worker emulating Meta Marketing v21.0
├── packages/
│ ├── shared-types/ # Zod schemas + TS types ortak
│ ├── db/ # Drizzle schema + migrations
│ └── prompts/ # Versioned Gemini prompts
├── scripts/
│ ├── seed-demo-data.ts # Deterministic Demlik Pro demo (Mulberry32)
│ ├── deploy.sh # 7-worker + Pages deploy in dependency order
│ ├── e2e-demo.sh # agent-browser walkthrough against prod
│ └── setup-cloudflare-secrets.sh
├── docs/
│ └── screenshots/ # README ekran görüntüleri
├── .github/workflows/ci.yml # build + lint + typecheck + deploy
└── package.json + pnpm-workspace.yaml
pnpm install --frozen-lockfile
cp .env.example .env # tüm credential'ları doldur
pnpm -r typecheck # tüm workspace tipleri temiz mi
pnpm dev # paralel: Vite + her worker'ın `wrangler dev`'i.env.example her secret için açıklama içeriyor — Google OAuth + Gemini + Resend + Cloudflare token + D1/KV id'leri.
| Amaç | Komut |
|---|---|
| Tüm tipler clean mi | pnpm -r typecheck |
| Lint (Biome 2.4) | pnpm lint |
| Build (frontend + workers) | pnpm build |
| Yeni Drizzle migration üret | pnpm db:generate (in packages/db/) |
| Migration'ı prod D1'e uygula | pnpm --filter @leylek/db db:migrate:prod |
| Demo verisini seed et | pnpm db:seed (idempotent) |
| Tüm stack'i deploy et | ./scripts/deploy.sh |
| Secrets'ı wrangler'a push'la | ./scripts/setup-cloudflare-secrets.sh |
| End-to-end test | ./scripts/e2e-demo.sh |
# 1) deploy
./scripts/deploy.sh
# 2) seed (idempotent, Mulberry32 PRNG ile deterministik)
pnpm db:seed
# 3) tarayıcıyı dürt
./scripts/e2e-demo.shAkış: magic-link giriş → dashboard → kampanya detay → "Şimdi Optimize Et" → Gemini canlı reasoning stream → AGGRESSIVE reklam PAUSED → ajan timeline'da yeni karar gözüküyor.
Co-Pilot modunu denemek için kampanya başlığındaki Otopilot ↔ Co-Pilot pill'ine tıkla, sonra "Şimdi Optimize Et" — bu kez karar header'daki bell'e bekleyen öneri olarak düşer; bell click → drawer → Onayla.
.github/workflows/ci.yml:
- Her push + PR:
pnpm -r typecheck && pnpm lint && pnpm test && pnpm build mainbranch push: ek olarakdeploy-pages(Pages →leylek.nexvar.io) +deploy-workers(7 worker dependency order: mocks önce, sonra leaf'ler, sonra optimizer, sonra gateway).
Secrets CLOUDFLARE_API_TOKEN + CLOUDFLARE_ACCOUNT_ID gh secret set ile repo'ya set'lendi. Pages projesi Direct Uploads tipinde (cannot update the source API hatası nedeniyle Git source'a çevrilemiyor); CI'dan deploy aynı sonucu veriyor.
![]() Batuhan Bayazıt @Batuhan4 |
![]() Mert Ali Dalkır @mertdlkr |
Canlı demo: https://leylek.nexvar.io
© 2026 NexVar. Proprietary — bu repo public görünür ancak yazılım proprietary lisans altındadır. Kopyalama, dağıtım, türetilmiş eser yasaktır. LICENSE dosyasına bakın.





