Bu repository bir kişisel portfolio / personal website projesidir. Proje şu anda temel anasayfa aşamasındadır. Modern, dark-theme tasarımlı bir anasayfa oluşturulmuş olup Hero, Projeler ve Yetenekler bölümleri Svelte component'leri ile geliştirilmiştir.
Bu aşamadaki amaç anasayfanın temel yapısını kurmak ve Astro + Svelte + Tailwind CSS stack'inin nasıl birlikte çalıştığını göstermektir.
| Teknoloji | Rol | Durum |
|---|---|---|
| Astro | Ana framework — routing, sayfa üretimi, static build | ✅ Kurulu |
| Svelte | İnteraktif UI component'leri için framework | ✅ Kurulu (4 component mevcut) |
| Tailwind CSS | Utility-first CSS framework — stillendirme | ✅ Kurulu |
| Sanity | Headless CMS — içerik yönetimi | ⏳ Planlanan (henüz entegre değil) |
Astro bu projenin ana framework'üdür. Tüm sayfa yapısı, routing ve build sistemi Astro tarafından yönetilir.
- Routing:
src/pages/klasöründeki dosyalar otomatik olarak URL route'larına dönüşür (file-based routing). - Sayfalar (
pages): Her.astrodosyası bir HTML sayfası üretir. - Layout'lar (
layouts): Sayfaların ortak HTML yapısını (head, body, meta tag'ler) tanımlar. - Static Generation: Astro varsayılan olarak build zamanında statik HTML üretir. Sunucu tarafında çalışan bir runtime yoktur.
- Build:
astro buildkomutu iledist/klasörüne statik dosyalar üretilir. - GitHub Pages ile ilişkisi: Üretilen statik dosyalar doğrudan GitHub Pages üzerinde sunulabilir.
- HTML üretimi: Her sayfa için tam HTML dosyaları üretilir.
- JavaScript stratejisi: Astro varsayılan olarak sayfaya sıfır JavaScript gönderir. JavaScript yalnızca bir component'e
client:*direktifi verildiğinde tarayıcıya gönderilir.
Astro konfigürasyonu astro.config.mjs dosyasında tanımlanır:
import { defineConfig } from 'astro/config';
import svelte from '@astrojs/svelte';
import tailwindcss from '@tailwindcss/vite';
export default defineConfig({
site: 'https://falsisdev.github.io',
base: '/website',
integrations: [svelte()],
vite: {
plugins: [tailwindcss()],
},
});site: Üretim URL'si (GitHub Pages adresi)base: Repository adına göre alt dizin (/website)integrations: Svelte entegrasyonuvite.plugins: Tailwind CSS v4 Vite plugin'i
Svelte, Astro'nun yerine geçen bir framework değildir. Astro ile birlikte çalışan bir UI component framework'üdür.
Astro = sayfanın ana framework'ü (routing, layout, static HTML)
Svelte = gerektiğinde kullanılan interaktif component sistemi
Astro'nun "Islands Architecture" yaklaşımında, sayfanın büyük kısmı statik HTML olarak üretilir. Yalnızca interaktif olması gereken bölümler (islands) Svelte component'leri olarak tarayıcıda hydrate edilir.
Bir Svelte component'i Astro sayfasında kullanıldığında, varsayılan olarak yalnızca HTML olarak render edilir ve tarayıcıya JavaScript gönderilmez. Component'in tarayıcıda interaktif olması için bir client:* direktifi gerekir:
| Direktif | Davranış |
|---|---|
client:load |
Sayfa yüklendiğinde hemen hydrate et |
client:idle |
Tarayıcı boşta kaldığında hydrate et |
client:visible |
Component viewport'a girdiğinde hydrate et |
client:media |
Belirli bir media query eşleştiğinde hydrate et |
client:only="svelte" |
Sunucuda render etme, yalnızca tarayıcıda render et |
---
import Counter from '../components/Counter.svelte';
---
<Counter client:load />Not: Projede şu anda 4 Svelte component'i bulunmaktadır:
Navbar.svelte,Hero.svelte,ProjectCard.svelte,SkillBar.svelte. Tümü Svelte 5 runes söz dizimi ($props(),$state(),$effect(),$derived()) kullanmaktadır.
Tailwind CSS bu projede utility-first yaklaşımıyla stillendirme için kullanılmaktadır.
- Stillendirme için Tailwind utility class'ları kullanılacak
- Component'lerin içine gerektiğinde utility class olarak uygulanacak
- Gereksiz global CSS yazılmayacak
- İleride tasarım sistemi (design system) oluşturulabilir ancak şu an oluşturulmamıştır
Tailwind CSS v4, Vite plugin yöntemiyle entegre edilmiştir:
@tailwindcss/viteplugin'iastro.config.mjsiçinde Vite'a eklenirsrc/styles/global.cssdosyasında@import "tailwindcss";direktifi bulunur- Bu CSS dosyası
src/layouts/Layout.astroiçinde import edilir
Tailwind v4'te ayrı bir tailwind.config.js dosyasına gerek yoktur. Konfigürasyon gerektiğinde CSS dosyası içinde @theme direktifi ile yapılabilir.
Sanity, ileride bu projenin içerik yönetim sistemi (Headless CMS) olarak kullanılması planlanmaktadır.
Sanity (içerik kaynağı)
↓
Astro build (build zamanında içerik çekilir)
↓
Static output (HTML/CSS/JS dosyaları)
↓
GitHub Pages (statik hosting)
- Sanity bir runtime backend değildir. İçerik kaynağı olarak kullanılacaktır.
- İçerik Sanity Studio üzerinden yönetilecek.
- Astro build zamanında Sanity API'sinden içerik çekilecek ve statik HTML'e dönüştürülecek.
- Üretilen statik dosyalar GitHub Pages'ta sunulacak.
- Kullanıcı sayfayı ziyaret ettiğinde Sanity'ye herhangi bir istek yapılmayacak — her şey önceden build edilmiş olacak.
ÖNEMLİ: Sanity şu anda projeye entegre edilmemiştir. Dependency olarak eklenmemiştir. Hiçbir Sanity kodu, schema, client veya environment variable bulunmamaktadır.
GitHub Pages bu projenin hosting platformudur.
GitHub repository
↓
Astro build (astro build)
↓
dist/ klasörü (statik dosyalar)
↓
GitHub Pages (statik hosting)
GitHub Pages yalnızca statik dosyaları sunabilir:
- HTML, CSS, JavaScript, görseller, fontlar vb.
- Server-side Go, Python veya Node.js uygulaması çalıştıramaz
- Veritabanı bağlantısı kuramaz
- API endpoint'i barındıramaz
- WebSocket veya SSE bağlantısı sunamaz
Bu nedenle projedeki tüm içerik build zamanında statik olarak üretilmelidir.
GitHub Pages uyumluluğu için astro.config.mjs dosyasında şu ayarlar yapılmıştır:
site: 'https://falsisdev.github.io'— üretim URL'sibase: '/website'— repository adına göre alt dizin
Bu proje şu anda backend içermemektedir. Bu bilinçli bir mimari karardır.
- GitHub Pages yalnızca statik dosya sunar
- Portfolio içeriği build zamanında üretilebilir
- Sanity entegrasyonu da build-time'da çalışacak
- Gereksiz karmaşıklık eklememek için backend katmanı oluşturulmamıştır
İleride backend gerektiren özellikler (örneğin gerçek zamanlı veri, form submission, authentication) eklenirse:
- Bu özellikler GitHub Pages'ın dışında ayrı bir servis olarak çalışmalıdır
- Serverless function'lar (Cloudflare Workers, Vercel Edge Functions vb.) kullanılabilir
- Veya ayrı bir backend repository'si oluşturulabilir
Not: Eski projede bulunan Go backend bu aşamada tamamen kaldırılmıştır. Go veya herhangi bir backend dili bu repository'de bulunmamaktadır.
website/
├── .gitignore # Git ignore kuralları
├── ARCHITECTURE.md # Mimari dokümantasyon (git'e açık)
├── README.md # Proje tanıtım dosyası (İngilizce)
├── astro.config.mjs # Astro konfigürasyonu
├── package.json # Proje dependency'leri ve script'ler
├── package-lock.json # Dependency lockfile
├── tsconfig.json # TypeScript konfigürasyonu
├── svelte.config.js # Svelte preprocessor konfigürasyonu
├── public/ # Statik dosyalar (build'e kopyalanır)
│ └── favicon.svg # Site favicon'u
└── src/ # Kaynak kodlar
├── components/ # Svelte component'leri
│ ├── Navbar.svelte # Yüzen glassmorphic navigasyon çubuğu
│ ├── Hero.svelte # Anasayfa hero section (GitHub avatar, animasyonlu giriş)
│ ├── ProjectCard.svelte # Proje kartları grid'i (kategori filtreleme, yıldızlar)
│ └── SkillBar.svelte # Canlı GitHub dil analitiği ve teknoloji ekosistemi
├── layouts/ # Sayfa layout'ları
│ └── Layout.astro # Ana layout (HTML boilerplate, dark theme, dot-matrix grid)
├── lib/ # Yardımcı modüller
│ └── github.ts # GitHub API veri çekme ve fallback önbellek katmanı
├── pages/ # Sayfalar (file-based routing)
│ └── index.astro # Ana sayfa (Navbar + Hero + Projects + TechStack + Footer)
└── styles/ # Global stiller
└── global.css # Tailwind CSS import'u, tema token'ları ve animasyonlar
Aşağıdaki klasörler ihtiyaç duyulduğunda oluşturulabilir:
| Klasör | Amaç |
|---|---|
src/content/ |
Astro Content Collections (lokal içerik) |
src/lib/ |
Yardımcı fonksiyonlar ve modüller |
Kural: Bu klasörleri gerçekten ihtiyaç duyulana kadar oluşturma. Boş klasör oluşturma.
Astro file-based routing kullanır. src/pages/ klasörüne eklenen her .astro dosyası otomatik olarak bir route oluşturur.
| Dosya | URL |
|---|---|
src/pages/index.astro |
/website/ |
src/pages/about.astro |
/website/about |
src/pages/projects/index.astro |
/website/projects |
src/pages/blog/[slug].astro |
/website/blog/:slug (dinamik) |
---
// src/pages/about.astro
import Layout from '../layouts/Layout.astro';
---
<Layout title="Hakkımda">
<main>
<h1>Hakkımda</h1>
<p>İçerik buraya gelecek.</p>
</main>
</Layout>Bu dosya oluşturulduğunda /website/about adresinde erişilebilir olur.
Gelecekte interaktif bir component gerektiğinde:
<!-- src/components/Counter.svelte -->
<script>
let count = $state(0);
</script>
<button on:click={() => count++}>
Sayaç: {count}
</button>---
import Counter from '../components/Counter.svelte';
---
<Layout title="Örnek">
<!-- Statik içerik -->
<h1>Merhaba</h1>
<!-- İnteraktif island -->
<Counter client:load />
</Layout>| Durum | Direktif |
|---|---|
| Hemen interaktif olması gerekiyor | client:load |
| Sayfa yüklendikten sonra yeterli | client:idle |
| Kullanıcı component'i görene kadar bekleyebilir | client:visible |
| Yalnızca belirli ekran boyutlarında | client:media="(min-width: 768px)" |
| Sunucuda render etmeye gerek yok | client:only="svelte" |
Not: Mevcut component'ler (
Hero.svelte,ProjectCard.svelte,SkillBar.svelte) bu pattern'i takip etmektedir.
Tailwind CSS ile stillendirme doğrudan HTML elementlerine utility class'lar eklenerek yapılır.
<h1 class="text-2xl font-bold text-zinc-900">Başlık</h1>
<p class="mt-2 text-zinc-600">Açıklama metni</p>Svelte component'lerinde de aynı yaklaşım geçerlidir:
<div class="rounded-lg border p-4">
<slot />
</div>Tailwind v4'te özel değerler CSS dosyasında @theme ile tanımlanabilir:
/* src/styles/global.css */
@import "tailwindcss";
@theme {
--color-brand: #6366f1;
}Not:
global.cssdosyasında dark-theme renk paleti (brand,brand-light,surface,surface-alt,border) ve Inter fontu tanımlanmıştır.
İleride portfolio içeriğinin Sanity üzerinden yönetilmesi planlanmaktadır.
| İçerik | Açıklama |
|---|---|
| Projects | Portfolio projeleri |
| Posts | Blog yazıları |
| Profile | Kişisel bilgiler |
| Experiences | İş deneyimleri |
- İçerik Sanity Studio üzerinden oluşturulur/düzenlenir
- Astro build zamanında Sanity API'sinden içerik çekilir
- İçerik statik HTML sayfalarına dönüştürülür
- Statik dosyalar GitHub Pages'a deploy edilir
ÖNEMLİ: Bu içerik tipleri ve Sanity entegrasyonu henüz oluşturulmamıştır. Gelecekte yapılacaktır.
GitHub API (api.github.com/users/falsisdev)
↓ Build-time fetch (src/lib/github.ts)
Astro build (SSG) [Fallback cache garantisi]
↓ statik dosya üretimi (dist/)
GitHub Pages (statik hosting)
↓ statik dosya sunumu
Tarayıcı (Browser) + Svelte Islands (Hydration)
Proje, build zamanında GitHub API üzerinden profil bilgilerini (avatar, bio, takipçi ve repo sayısı), repository dil istatistiklerini (Go, Vue, JavaScript, TypeScript, Svelte vb.) ve açık kaynak proje repository'lerini (getGitHubProjects) çeker. API erişilemediğinde veya rate-limit oluştuğunda sistemin kesintisiz çalışması için src/lib/github.ts içinde tip tanımlı bir fallback önbellek katmanı (FALLBACK_PROFILE, FALLBACK_TECH_STACK, FALLBACK_PROJECTS) bulunur.
Sanity (CMS — içerik kaynağı)
↓ API çağrısı (build zamanında)
Astro build
↓ statik dosya üretimi
Static output (dist/)
↓ deploy
GitHub Pages (hosting)
↓ statik dosya sunumu
Tarayıcı (Browser)
İleride gerçek zamanlı özellikler (örneğin canlı GitHub aktivitesi) eklenmek istenirse, GitHub Pages tek başına yeterli olmayacaktır.
GitHub API (veri kaynağı)
↓
Backend / Serverless Function (veri işleme)
↓ SSE veya WebSocket
Tarayıcı (Browser)
Bu tür bir mimari şunları gerektirir:
- Ayrı bir backend servisi veya serverless function
- GitHub Pages dışında bir hosting (backend için)
- Client-side JavaScript ile bağlantı yönetimi
ÖNEMLİ: Bu sistemlerin hiçbiri şu anda projede bulunmamaktadır. Eski projede bulunan Go backend ve SSE sistemi kaldırılmıştır.
Projeye kod eklerken uyulması gereken kurallar:
-
Gereksiz dependency ekleme. Her yeni dependency eklenmeden önce gerçekten gerekli olup olmadığını değerlendir.
-
Astro'nun doğal yapısını bozma. File-based routing, layout sistemi ve static generation Astro'nun varsayılan davranışlarıdır. Bunları gereksiz yere override etme.
-
Svelte'i yalnızca ihtiyaç olduğunda kullan. Statik içerik (metin, görsel, layout) için Svelte component'i oluşturma. Svelte yalnızca tarayıcıda interaksiyon gerektiren bölümler için kullanılmalı.
-
Her şeyi Svelte component'ine dönüştürme. Astro component'leri (
.astrodosyaları) statik içerik için yeterlidir ve sıfır JavaScript üretir. -
Statik içerik için gereksiz client-side JavaScript kullanma.
client:*direktifini yalnızca gerçekten interaktif component'ler için kullan. -
GitHub Pages uyumluluğunu koru. Eklenen her özelliğin statik build ile uyumlu olduğundan emin ol.
-
Backend gerektiren özellikleri doğrudan frontend'e zorla sokma. Server-side işlem gerektiren özellikler için ayrı bir servis planla.
-
Sanity ile ilgili kodu gerçekten entegrasyon yapılana kadar ekleme. Placeholder Sanity kodu, boş client'lar veya dummy schema'lar oluşturma.
-
Kullanılmayan klasör ve abstraction oluşturma. Klasörler gerçekten ihtiyaç duyulduğunda oluşturulmalı.
-
Overengineering yapma. Basit bir özellik için karmaşık abstraction katmanları oluşturma.
npm installnpm run devVarsayılan olarak http://localhost:4321 adresinde çalışır.
npm run buildStatik dosyaları dist/ klasörüne üretir.
npm run previewÜretilen statik dosyaları lokal sunucu ile önizler.
Bu proje Conventional Commits formatını kullanmaktadır:
<type>: <description>
Kullanılan type'lar:
| Type | Kullanım |
|---|---|
feat |
Yeni özellik |
fix |
Hata düzeltme |
chore |
Bakım işleri (dependency güncelleme, config değişikliği) |
docs |
Dokümantasyon değişikliği |
refactor |
Davranış değiştirmeyen kod yeniden yapılandırması |
style |
Kod formatı değişikliği (işlevsel değişiklik yok) |
feat: center hero avatar and fetch projects from GitHub API
Hero bölümündeki avatar tam merkeze hizalandı ve "ECE Undergrad @ YTU • Systems & Full-Stack Developer" unvan rozeti dikey hizada doğrudan avatarın altına yerleştirildi. GitHub API üzerinden repolar çekilerek (getGitHubProjects) ProjectCard bileşenine canlı aktarıldı, kategori filtreleme ve fallback desteği sağlandı.