Site, Next.js 16 App Router üzerine React 19 + TypeScript ile kuruldu; stil katmanı Tailwind CSS v4'ün CSS-öncelikli @theme token'ları, etkileşim Framer Motion, veri katmanı baştan sona Supabase (PostgreSQL + Auth + Storage + Realtime). Projenin belkemiği çok dillilik: Türkçe (varsayılan) ve İngilizce [lang] segmentiyle ayrılıyor, dil seçimi Accept-Language başlığından negotiator + intl-localematcher ile müzakere ediliyor. Buradaki asıl karar şu: Türkçe kullanıcı Türkçe adres görmeli. Klasör yapısı İngilizce kalırken (/pricing), middleware /tr/fiyatlandirma isteğini sessizce doğru sayfaya yeniden yazıyor. Bunu ayakta tutmak için üç simetrik yardımcı yazıldı — biri middleware'in çözdüğü kanonik adı, biri navigasyonun ürettiği linkleri, biri de dil değiştiricinin karşılığını hesaplıyor; böylece /tr/fiyatlandirma ↔ /en/pricing geçişi tek yerden, bozulmadan çalışıyor.
Tüm pazarlama metni iki sözlük dosyasında yaşıyor (tr.json / en.json, ~45 KB); sayfalarda gömülü metin yok. Bu ölçekte iki dosyanın zamanla birbirinden kopması kaçınılmaz olduğundan derleme-zamanı bir koruma kuruldu: tr.json kanonik tip kabul ediliyor ve en.json bu tipi yapısal olarak sağlamazsa build patlıyor — eksik çeviri anahtarı üretime çıkamıyor. İçerik tarafında hazır bir CMS kullanmak yerine yönetim paneli sıfırdan yazıldı: sekmeli markdown editör (yaz/önizle, canlı render), Supabase Storage'a bağlı medya kütüphanesi, yüklemeden önce tarayıcıda çalışan görsel sıkıştırma (1 MB üstü görseller 1920px / 0.8 kaliteye iniyor) ve yazı sıralaması için @dnd-kit ile sürükle-bırak — yalnızca fareyle değil, klavye sensörüyle de erişilebilir. Panelde recharts ile en çok okunan yazılar ve kategori dağılımı grafikleri var. Blog motoru kategori filtresi, debounce'lu arama, öne çıkan yazı, okuma süresi, ilgili yazılar ve oturum başına tekilleştirilmiş görüntülenme sayacı (Postgres RPC) içeriyor.
İngilizce içerik için panele ikinci bir editör alanı açmak yerine bir hat kuruldu: bir script yazıları çevirip title_en / content_en sütunlarına yazıyor, alan boşsa site Türkçe'ye düşüyor — yazar tek dilde üretiyor, site iki dilde yayınlıyor. SEO tarafında sayfa başına metadata, @graph yapısal verisi (Organization + SoftwareApplication), Türkçe slug'larla üretilen iki dilli sitemap, robots ve PWA manifest var; OpenGraph görselleri next/og ile üretiliyor — burada satori'nin varsayılan fontu Türkçe glifleri basmadığı için ('başlatın' → 'ba□latın') statik TTF'ler pakete gömülmek zorunda kaldı; değişken fontlar satori'yi çökerttiğinden statik olmaları şart. Güvenlik next.config seviyesinde sekiz başlıkla başlıyor (HSTS preload, tam CSP, Permissions-Policy); iletişim formunda honeypot + sunucuda yeniden doğrulanan matematik CAPTCHA + IP başına oran sınırı, giriş ekranında beş denemeden sonra kilit var; genel kayıt kapalı, panel e-posta beyaz listesiyle korunuyor. Formdan gelen mesajlar ilginç bir yol izliyor: ikinci bir Supabase istemcisiyle doğrudan ürünün kendi veritabanındaki geri bildirim kutusuna düşüyor — pazarlama sitesi ile uygulama tek bir gelen kutusunda buluşuyor.
Ürün sitesi çoğu zaman ya hazır tema üstüne kurulmuş, tek dilli ve içerik üretemeyen bir broşüre; ya da her metin değişikliği için geliştirici gerektiren, sahibinin dokunamadığı statik bir sayfaya dönüşüyor. Türkçe pazara açılan bir üründe sorun katlanıyor: adresler İngilizce kalıyor, çeviriler zamanla sessizce birbirinden kopuyor, blog altyapısı ya hiç kurulmuyor ya da ikinci dil için baştan elle yazılıyor. Sonuçta ürünün kendisi ilerlerken sitesi geride kalıyor.
Bu proje siteyi ürünün kendisi kadar ciddiye aldı: Türkçe adreslerin gerçekten Türkçe olduğu bir yönlendirme katmanı, çevirilerin kopmasını derleme anında engelleyen bir tip koruması ve sahibinin geliştiriciye ihtiyaç duymadan yazıp yayınlayabildiği kendi yönetim paneli. İngilizce içerik elle değil bir çeviri hattıyla besleniyor, eksikte Türkçe'ye düşüyor. Üstüne teknik SEO, sekiz güvenlik başlığı ve çok katmanlı bot koruması eklendi. Sonuç: içerik üretebilen, iki dilde yayın yapan, canlıda çalışan bir ürün sitesi.
Ana sayfa — hero ve platform rozetleri
Görsel yakında eklenecek
