⬅️ README’ye dön

📖 Site Rehberi · 🔐 Supabase Sistemi · 🍴 Fork Kurulumu


📖 Site Rehberi — Hangi Dosya Ne İşe Yarar, Neyi Nerede Değiştiririm?

Bu dosya, siteyi bir daha açtığında (“bunu nereye koymuştum?”) hızlıca yön bulman için var. Her bölüm bir dosyayı/özelliği anlatıyor: ne işe yarıyor, hangi satırı değiştirirsen ne olur.


0. Klasör yapısı — sayfalar neden alt klasörlerde?

Kök dizinin GitHub’da (dosya listesinde, commit geçmişinde) karışık görünmemesi için tek tek sayfalar (Jekyll’in “pages” dediği .md dosyaları) konularına göre 4 klasöre ayrılmıştır:

Klasör İçerik Örnek URL
hesap/ Giriş, kayıt, şifre sıfırlama akışı /hesap/giris.html
panel/ Oturum açmış kullanıcı sayfaları (panel, admin, GitHub içerik yönetimi, özel içerik) /panel/panel.html
icerik/ Herkese açık içerik listeleri (blog, akademik projeler, izlediklerim, okuduklarim) /icerik/blog.html
kurumsal/ İletişim, gizlilik politikası /kurumsal/iletisim.html

Önemli: Bu, sadece bu sayfaların repo’daki kaynak dosya konumu. Her sayfanın front-matter’ında (permalink: alanı yoksa Jekyll klasör yapısından otomatik üretir, buradaki sayfalarda URL klasör adını birebir yansıtır — örn. panel/panel.md/panel/panel.html) URL’ler klasör yapısıyla tutarlıdır. Bir sayfayı bulmak istediğinde: URL’in ilk parçası (/panel/..., /hesap/... vb.) hangi klasörde olduğunu doğrudan söyler.

index.md, index-bakim.md, _config.yml, _headers, Gemfile, README.md, robots.txt, feed.xml gibi Jekyll’in kökte durmasını beklediği ya da tüm siteyi ilgilendiren dosyalar kökte kalmaya devam eder — sadece “tek bir sayfaya ait” .md dosyaları klasörlere ayrılmıştır.

Bir sayfanın URL’ini değiştirmek istersen: ilgili dosyanın front-matter’ındaki permalink: satırını değiştirmen yeterli, dosyayı taşımana gerek yok. Ama URL’i değiştirirsen, o sayfaya link veren tüm yerleri (nav menüsü _layouts/default.html, assets/js/nav-auth.js, auth-guard.js, auth-pages.js içindeki Supabase redirect URL’leri, ilgili diğer .md sayfalarındaki iç linkler) da elle güncellemen gerekir — aksi halde kırık link veya (giriş/şifre sıfırlama söz konusuysa) sessizce çalışmayan bir akış ile karşılaşırsın.


1. _config.yml — Sitenin ana ayar dosyası

Jekyll build’inde her sayfaya site.XXX olarak erişilebilen tüm genel değerler burada. En sık dokunacağın dosya.

Alan Ne işe yarar
title Site başlığı, sekme adı, header’daki logo yazısı
description SEO açıklaması, sosyal medya paylaşım kartlarında görünür
url Sitenin birincil adresi (Cloudflare Pages domainin)
github_username GitHub kullanıcı adın
kutuphane_repo İzlediklerim/okuduklarım verisinin tutulduğu ayrı repo
izleme_projects_url / okuma_projects_url GitHub Projects panolarının linkleri
substack_url / substack_feed Substack blog adresin ve RSS feed’i
google_analytics_id Google Analytics ölçüm kimliği
profile_image Profil fotoğrafın (assets/e yükleyip yolunu buraya yaz)
cloudflare_worker_url İzleme/okuma verisini çeken Worker’ın adresi
mirror_site_url Yedek/ikincil site adresin (GitHub Pages)
giscus: altındaki alanlar Yorum sistemi (giscus.app’ten alınır) — category için “Announcements” tipi bir kategori seçmen önerilir, böylece yorum başlığını sadece sen/giscus botu açabilir
social: altındaki linkler GitHub, LinkedIn, X/Twitter, Instagram, YouTube, n-sosyal, ORCID, Academia, ResearchGate, 1000Kitap, Play Store
future true kalmalı — zamanlanmış/gizli yazıların çalışması buna bağlı, bkz. bölüm 9

2. _config_cloudflare.yml — Sadece Cloudflare build’ine özel ek ayarlar

Cloudflare Pages build komutunda --config _config.yml,_config_cloudflare.yml ile birlikte okunur; buradaki anahtarlar _config.yml‘deki aynı isimli anahtarların üzerine yazar. Şu an sadece google_analytics_id burada — Cloudflare build’i için ayrı bir Analytics ID istersen kullan, aynı ID’yi kullanacaksan bu dosyaya dokunmana gerek yok.

3. _headers — Cloudflare Pages güvenlik header’ları

Kök dizinde duran bu dosya, Cloudflare Pages tarafından otomatik okunur (bir ayar paneline eklemene gerek yok — dosyanın repo’da olması yeterli). Her sayfaya X-Frame-Options, X-Content-Type-Options, Referrer-Policy, Permissions-Policy, Strict-Transport-Security header’larını ekler. Sadece Cloudflare Pages’te çalışır — GitHub Pages özel HTTP header ayarlamayı desteklemiyor, o yüzden mirror sitede bu korumalar yok.

Değiştirmek isteyebileceğin tek yer: Permissions-Policy satırındaki camera=(), microphone=(), geolocation=(), payment=() — ileride bu API’lerden birini gerçekten kullanacaksan (örn. bir harita gömersen ve konum istersen), ilgili parantezin içine (self) yazman gerekir.

4. kurumsal/iletisim.md — İletişim formu

src="FORM-EMBED-LINKINI-BURAYA-YAPISTIR" satırındaki placeholder’ı, Google Forms’tan aldığın gerçek embed linkiyle değiştir (Forms’ta Gönder > <> ikonu > src= değerini kopyala).

5. cloudflare-worker/worker.js — İzlediklerim/Okuduklarım verisini çeken Worker

Bu dosya Cloudflare Dashboard’a ayrıca yapıştırılıp deploy edilmesi gereken ayrı bir kod — repo’daki kopyası sadece kaynak/yedek, canlıya otomatik yansımaz. Değiştirdiğinde Cloudflare Dashboard’da “Save and Deploy” yapman gerekir.

Ne Nerede Nasıl değiştirilir
GitHub kullanıcı adı GITHUB_LOGIN sabiti (dosyanın başı) Tırnak içindeki değeri kendi kullanıcı adınla değiştir
Proje numaraları PROJECTS objesi içinde number: GitHub Projects panosunun URL’indeki /projects/N/ sayısı
Sütun sırası PROJECTS objesi içinde her projenin sutunSirasi: dizisi Panoda sütunları sürükleyip yer değiştirdiğinde site OTOMATİK güncellenmez (GitHub API view-sırasını döndürmüyor) — panodaki güncel sırayı, sütun adlarını BİREBİR yazımla (büyük/küçük harf dahil), soldan sağa bu diziye elle yaz. Listede unuttuğun bir alan otomatik sona eklenir, kaybolmaz. sutunSirasi: [] bırakırsan GitHub’daki field oluşturma sırası kullanılır.
Gizlenen “yerleşik” sütunlar YERLESIK_ALANLAR seti GitHub’ın otomatik eklediği sistem alanları (Assignees, Labels, Reviewers, Created, Updated, vb.) burada listeleniyor ve tabloya hiç girmiyor. GitHub ileride yeni bir sistem alanı eklerse ve sitede gereksiz bir sütun görürsen, o alanın adını (BİREBİR yazımla) bu sete ekle.
GITHUB_TOKEN Kodun içinde YOK Cloudflare Dashboard > Settings > Variables and Secrets kısmından secret olarak eklenir. Asla dosyaya yazma.

6. robots.txt

Sitemap: satırındaki adres, _config.yml‘deki url ile aynı domaini göstermeli.

7. _includes/hakkimda-icerik.md ve _includes/hakkimda-kutusu.md

Anasayfada görünen “hakkımda” metni ve kutusu — biyografini, unvanını, tanıtım yazını buraya serbest metin olarak yaz.

8. İçerik ekleme — blog yazıları ve akademik projeler

9. Zamanlanmış ve gizli yazılar/projeler

Bir yazıyı ya da akademik projeyi GitHub’a hemen ekleyip, sitede istediğin tarihe kadar veya sen izin verene kadar görünmemesini sağlayabilirsin.

Nasıl çalışır?

“yayinda” ve “date” artık birbirine bağlı çalışıyor. Bir yazı/proje sitede görünmek için iki şartı BİRDEN sağlamalı:

  1. yayinda: false YAZILMAMIŞ olmalı (alan yoksa veya true ise sorun yok).
  2. date alanındaki tarih gelmiş veya geçmiş olmalı (gelecekteyse gösterilmez).

Yani:

Front-matter’a şu iki alanı ekle:

---
title: "Yazı Başlığı"
date: 2026-09-01
yayinda: true
sitemap: false
permalink: /blog/on-izleme-RASTGELE-BIR-DIZI/
---

Nerede tanımlı (teknik detay, dokunmana gerek yok ama bilgi için)

10. panel/github-yonetim.md — GitHub Pages için tarayıcı içi içerik yönetim paneli (mini CMS)

Bölüm 8 ve 9’da anlatılan işi (yeni _posts//_projects/ dosyası oluşturma, yayinda/sitemap/permalink alanlarını elle yazma) artık elle dosya oluşturup GitHub’a push etmeden, doğrudan tarayıcıdan yapabileceğin bir panel var: /panel/github-yonetim.html. Netlify/Decap CMS gibi 3. parti bir servise ihtiyaç duymaz — doğrudan GitHub REST API’sine (contents endpoint’i) istek atıp commit oluşturur, tamamen GitHub Pages’in kendisiyle çalışır.

Bu panel, sitenin Supabase tabanlı /panel/admin.html panelinden TAMAMEN BAĞIMSIZDIR. /panel/admin.html Supabase’teki üye/rol/özel içerik sistemini yönetir; /panel/github-yonetim.html ise bu deponun kendi statik Jekyll içeriğini (blog yazıları, akademik projeler, profil fotoğrafı) yönetir. Aralarındaki tek ortak nokta: bu sayfaya erişim de aynı requireAuth({ role: 'admin' }) mekanizmasıyla korunur (bkz. assets/js/auth-guard.js), yani sadece Supabase’te role: 'admin' olan hesaplar görebilir. Header’daki “Hesabım ▾” menüsünde, adminsen “Admin Paneli” linkinin hemen altında “GitHub İçerik Yönetimi” olarak görünür (bkz. assets/js/nav-auth.js).

Paketteki dosyalar

panel/github-yonetim.md              <- Jekyll sayfası (_layouts/default.html'i kullanır, admin-only)
assets/js/github-yonetim.js    <- Panelin tüm mantığı
assets/css/github-yonetim.css  <- Bu sayfaya özel ek stiller (auth.css'in üzerine eklenir)

Neler yapabilirsin

GitHub bağlantısı ve token güvenliği

Panelin üstündeki “GitHub Bağlantısı” sekmesinden şunları girmen gerekir:

Teknik detay (dokunmana gerek yok ama bilgi için)


🎨 Tema Anahtarı (Koyu/Açık Mod)

Header’daki kayan switch — ☀️/🌙 ikonları sabit iki uçta, ortadaki topuz aktif temaya göre kayıyor, yanında “Açık mod”/”Koyu mod” yazan bir etiket var.

Ne Nerede
Yapı (HTML) _layouts/default.html içinde #theme-toggle butonu
Davranış (JS) Aynı dosyanın altındaki <script> bloğu — data-theme özniteliğini değiştirip localStorage‘a kaydediyor
Görünüm (CSS) assets/style.css içinde .theme-toggle, .theme-toggle-track, .theme-toggle-thumb, .theme-toggle-icon, .theme-toggle-label sınıfları
Mobil davranış 640px altında metin etiketi gizleniyor, sadece anahtar+ikonlar kalıyor (bkz. style.css‘teki @media bloğu)
Giscus (yorumlar) senkronizasyonu _layouts/default.html‘deki aynı script bloğunda bir MutationObserverdata-theme her değiştiğinde, o an DOM’da bir giscus yorum kutusu varsa ona postMessage ile “temanı değiştir” mesajı gönderiyor. Giscus’un iframe’i geç yüklendiği (data-loading="lazy", kullanıcı yorumlara kaydırana kadar açılmıyor) için bunu tek seferlik değil, sürekli izleyerek yapıyoruz.

💬 Yorumlar (Giscus)

Dosya Ne işe yarar
_includes/comments.html Giscus widget’ını yükleyen kod. site.giscus.* ayarları _config.yml‘den geliyor (bkz. bölüm 1).
assets/style.css içinde #giscus-container / iframe.giscus-frame Yorum kutusunun tam genişlik kullanmasını sağlayan kurallar. Kutu daralmış/küçülmüş görünürse önce burayı kontrol et.
Tema senkronizasyonu Yukarıdaki “Tema Anahtarı” bölümüne bak — giscus’un koyu/açık modu sitenin temasıyla senkron kalması bu mekanizmaya bağlı.

Giscus’un kendi ayarları (repo, kategori, tema rengi vb.) giscus.app üzerinden alınıp _config.yml‘e yapıştırılıyor — orta bir değişiklik yapmak istersen (örn. tepki emojilerini kapatmak) giscus.app’te yeni ayarı oluşturup _includes/comments.html içindeki ilgili data-* satırını güncellemen yeterli.


🗂️ İzlediklerim / Okuduklarım Tablosu

Dosya Ne işe yarar
assets/js/koleksiyon-tablo.js GitHub Projects verisini Worker’dan çekip tabloyu (arama, tür filtresi, sayfalama dahil) oluşturan ortak kod. Hem icerik/izlediklerim.md hem icerik/okuduklarim.md bunu kullanıyor.
icerik/izlediklerim.md, icerik/okuduklarim.md Sayfanın kendisi — koleksiyonTablosuOlustur({...}) çağrısındaki dataUrl, containerId gibi parametreler hangi projeye (?project=izleme / ?project=okuma) bağlanacağını belirliyor.
Sütun sırası/gizlenen sütunlar Bkz. yukarıdaki bölüm 5 (cloudflare-worker/worker.js) — tablonun kendisi değil, worker’ın döndürdüğü veri bu sırayı belirliyor.

👤 Header’daki “Hesabım” Menüsü

Dosya Ne işe yarar
_layouts/default.html içinde #auth-nav Nav’daki tek kapsayıcı — JS yüklenmeden önce görünen statik “Giriş Yap” linkini içerir (progressive enhancement / no-JS yedeği).
assets/js/nav-auth.js Sayfa açılışında oturumu kontrol edip #auth-nav‘ın içeriğini dolduran script. Çıkış yapmışken tek bir “Giriş Yap” linki, giriş yapmışken “Hesabım ▾” açılır menüsü (Panelim, adminse Admin Paneli ve GitHub İçerik Yönetimi, Çıkış Yap) gösterir. Başka bir sekmede oturum açılıp kapandığında onAuthStateChange ile kendini günceller.
assets/style.css içinde .auth-nav* sınıfları Açılır menünün görünümü — mevcut nav a stiliyle aynı renk değişkenlerini kullanır, açık/koyu temayla otomatik uyumludur.

Bu menü, sitenin Supabase kullanıcı sistemine bağlıdır — bkz. aşağıdaki “🔐 Supabase Kullanıcı Sistemi” bölümü. O sistemi tamamen kaldırırsan (bkz. “Bölüm 3 — Silme” altındaki “Supabase kullanıcı sistemini kaldırmak istersen”), bu menüyü de kaldırman gerekir.


🔒 Güvenlik Notları (bilmen faydalı olur)


⬅️ README’ye dön

📖 Site Rehberi · 🔐 Supabase Sistemi · 🍴 Fork Kurulumu