impact.tr
Next.js 16 + Tailwind 4. SSG, markdown-driven content, self-host (Docker).
Dev / build
npm install
npm run dev # localhost:3000 (we use 3010 in the background)
npm run build # production build
npm run start # serve the production build
Docker:
docker compose up -d --build # HOST_PORT=3010 by default
Content workflow (no CMS, yalnızca markdown + git)
Yeni edisyon, yeni yarışma formatı, yeni foto = dosya ekle + commit + push. Site otomatik güncellenir.
Yeni edisyon ekle
-
content/editions/<slug>.mddosyası oluştur. Örnek:--- slug: ankara-hands-on-2026 competition: hands-on-challenge # hands-on-challenge | ideathon | robo-soccer name: Hands-On Challenge — Ankara Regional status: past # past | upcoming | announced startDate: "2026-06-14" endDate: "2026-06-15" city: Ankara venue: ODTÜ KKM stats: teams: 24 participants: 200 volunteers: 25 winners: - { place: 1, team: "Takım Adı", school: "Okul", members: 4 } - { place: 2, team: "...", school: "...", members: 3 } teams: - { name: "Takım A", school: "Lise X", size: 4 } - { name: "Takım B", school: "Ü. Y", size: 3 } partners: - "Partner 1" testimonials: - { by: "İsim", org: "Kurum", quote: "..." } summary: "Tek cümlelik özet, kart & meta yerlerinde görünür." --- Serbest metin (markdown). `##`, `###`, listeler, bağlantılar. -
Foto klasörü oluştur (opsiyonel):
public/photos/<slug>/01.jpg…NN.jpg. Şu an otomatik galeri sadececemberlitas-hands-on-2026için bağlı — yeni edisyonları otomatik çekmesi için tek satırlık helper gerekiyor (aşağıda TODO). -
Commit + push → SSG yeniden üretir, anasayfadaki "Edisyonlar" grid'i ve toplam metrikler (
statsvarsa) otomatik güncellenir.
Yeni yarışma formatı
content/competitions/<slug>.md:
---
slug: archeology-hackathon
name: Archeology Hackathon Challenge
short: Kültürel miras hackathonu
tagline: "Bir cümle hook."
format: "Kısa açıklama."
durationDays: 2
ageGroups: [Lise, Üniversite]
categories: [Veri, Görüntü işleme]
color: brand # brand | accent | pink
order: 4
---
Markdown body.
Sonra src/components/Nav.tsx'a bir link daha ekle; ve src/lib/content.ts'te CompetitionSlug union type'ına yeni slug'ı ekle.
Yeni yorum / review
src/lib/reviews.ts içindeki reviews dizisine ekle:
{
quote: "...",
by: "İsim",
org: "Kurum",
edition: "Çemberlitaş 2026",
}
Edition-specific testimonial'lar için o edisyonun .md dosyasındaki testimonials alanını kullan — edisyon detay sayfasında görünür.
Foto ekle
- Yeni foto:
public/photos/<klasör>/<ad>.jpg. 1600px genişlik civarı, JPG quality ~78 öneri. - Çoklu indirme için Drive linki varsa:
/tmp/gdown-venv/bin/gdown --folder "<drive-folder-url>" -O public/photos/<klasör> # sonra Pillow ile 1600px'e küçült (script örneği geliştirilebilir)
Pending / TODO
Kod seviyesinde hazır olup veri bekleyen şeyler:
- Ataköy edisyonu — tarih (
startDate/endDate) doğrulanmalı. Şu an2025-12-20/21tahmin. Takım listesi + kazananlar eklenmeli. - Çemberlitaş Hands-On 2026 — 16 takımın tam listesi (okul + kişi)
teamsalanına girilmeli. Tüm podium (2. ve 3.) girilmeli. - Çemberlitaş Ideathon 2025 — stats (katılımcı/takım sayısı), kazananlar, varsa foto klasörü.
- Robo Soccer — resmi isim kesinleşirse (
Robo SoccermıImpact Robo Soccermı), tarih/mekan netleşinceistanbul-robo-soccer.mdveankara-robo-soccer.mdgüncellenmeli. Başvuru Google Forms URL'si ekle → yarışma sayfasına embed. - Ataköy foto klasörü — Drive'da
1JzYEOfWaT6oTSDgycG0GCg-rXrlZRK5Kçekilemedi (sadece boş alt klasörler indirdi). Manuel indirippublic/photos/atakoy-hands-on/altına kopyalanmalı. - Ek testimonials — şu an yalnızca M. Buğrahan Kılıç'ın yorumu var. Katılımcı/gönüllü yorumları toplanmalı.
- Diğer etkinlikler (LinkedIn'den çıkan) — ZAĞANOS International STEM Expo, ZAĞANOS Case Study Challenge, Archeology Hackathon Challenge, Arduino workshops. Bunların hangisi ayrı bir format mı, hangisi tek seferlik mi karar ver;
content/competitions/veyacontent/editions/altına uygun şekilde eklenmeli.
Kod seviyesinde yapılacaklar:
- Otomatik edisyon galerisi:
public/photos/<edition-slug>/klasörü varsa edisyon detay sayfasına otomatik<Gallery>düşsün. Şu an sadececemberlitas-hands-on-2026için hardcoded.src/lib/photos.tsgibi bir helper:getEditionPhotos(slug)→fs.readdirSyncile otomatik. - OG image (
src/app/opengraph-image.tsx) — WhatsApp/Slack/Twitter link preview için. - sitemap.xml ve robots.txt (
src/app/sitemap.ts,src/app/robots.ts). - Google Forms embed Robo Soccer başvuru için. Form URL'si geldiğinde
/yarismalar/robo-soccer/basvururoute'u ya da yarışma sayfasına iframe blok. - Yorum gönderme — şu an
mailto:linki. İleride bir Google Forms ile Sheets'e düşsün; yeni yorumları eldenreviews.ts'ye taşıma akışı. - "Önceki etkinlikler" arşiv sayfası —
/edisyonlarindex'i henüz yok; ana sayfadan 6 kart görünüyor. Tüm edisyonları listeleyen bir sayfa eklenmeli. - Gerçek logo — şu an "i" harfi violet blok. IG'deki "impact" wordmark SVG'ye çevirilip
public/logo.svg+Logo.tsxgüncellenmeli. - Foto optimizasyonu — şu an 1600px JPG. Next Image zaten optimize ediyor ama AVIF/WebP export eklenebilir.
- E-posta rate-limiting / iletişim formu — mailto iyi ama spam gelirse form'a taşıyabiliriz.
Deploy
Self-host Docker Compose. Üretim adımları:
# Reverse proxy (caddy/nginx) impact.tr → 127.0.0.1:3010
docker compose up -d --build
docker compose logs -f web
Reverse proxy örneği (Caddy):
impact.tr {
reverse_proxy 127.0.0.1:3010
}
Yapı
content/
competitions/*.md # yarışma formatları
editions/*.md # edisyonlar (metrik, kazanan, takım, testimonial)
public/
photos/<slug>/*.jpg # edisyon/format fotoğrafları
src/
app/ # App Router sayfaları
page.tsx # anasayfa
yarismalar/[slug]/ # yarışma detay
edisyonlar/[slug]/ # edisyon detay
sponsor/, hakkimizda/, iletisim/
components/ # Nav, Footer, Section, PageHero, Gallery, PhotoStrip, ...
lib/
content.ts # markdown loader, helpers
contact.ts # iletişim, ekip, değerler, SDG (tek kaynak)
reviews.ts # yorumlar + foto index
İletişim
- Site: impact.tr
- E-posta: contact@impact.tr · info@impact.tr · hello@impact.tr
- Ekip: tarik@ · tuna@ · yigit@ impact.tr
- Instagram: @impact.tr
- LinkedIn: impactcommunit