Türk dernekleri için kriptografik doğrulamalı, açık kaynak dijital seçim yönetim sistemi. Her oy bir hash, her makbuz bir mühür. Kimse kimin kime oy verdiğini göremez — teknik olarak.
Dernek genel kurullarında seçim yapmış herkes bu durumlardan en az birini yaşamıştır.
200 üyeli bir dernekte tek kurul için sayım 1–2 saat, üç kurul için gece yarısına kadar uzar. Oyla ile sayım anında biter.
Elle sayımda pusulalar yanlış okunabilir, sayılar tutmayabilir, mükerrer oy çıkabilir. Oyla'da her oy kriptografik hash ile kayıt altında — manipülasyon imkânsız.
Küçük derneklerde üyeler oylarının gizli kalmadığından endişe duyar. Kimlik bilgisi ile oy bilgisi ayrı tablolarda — birbirleriyle hiçbir şekilde eşleştirilemez.
Seçim biter, sonuçlar elle tutanağa geçirilir, divan imzalar. Oyla'da seçim kapandığı anda resmi tutanak PDF olarak otomatik üretilir.
Hazırlıktan tutanağa altı adım. Her adımda farklı bir kullanıcı rolü devreye girer.
Üye listesini sisteme yükle — tek tek veya CSV ile toplu aktarım. Seçim kurullarını tanımla: Yönetim Kurulu, Denetleme Kurulu, Disiplin Kurulu. Adayları ilgili kurullara ata. Kota ve yedek sayısını belirle.
Genel kurul açılışında divan başkanı, üyeleri ve kâtip tanımlanır. Tüm ön koşullar karşılandıktan sonra "Seçimi Başlat" ile sistem aktife alınır. Divan, hazirun sayısını ve katılım oranını canlı takip eder.
Üye masaya gelir, kimliğini gösterir. Görevli TC veya sicil numarasını girer, üye bulunur, 1. imza atılır. Sistem üyeye özel tek kullanımlık oy bağlantısını SMS ile gönderir. Üye masadan ayrılmadan oyunu kullanır, görevli 2. imzayı atar.
Üye SMS'teki bağlantıyı açar. Her kurul için aday listesi görüntülenir, kontenjan kadar seçim yapılır. "Oyumu Gönder ve Kilitle" ile oy kaydedilir — geri alınamaz. SMS ile makbuz kodu iletilir.
Salon ekranına yansıtılan sonuç ekranı oylar geldikçe güncellenir. Kazananlar yeşil, yedekler açık yeşil. Seçim kapanınca ekran "Resmi Sonuçlar" moduna geçer. Projeksiyon için perde modu tam ekran açılabilir.
Seçim kapandığı anda resmi PDF tutanağı hazır: divan kurulu, katılım istatistikleri, kurul bazlı sonuçlar, güvenlik özeti ve imza alanları. Şeffaflık için commitment hash listesi CSV olarak indirilebilir.
Admin, divan başkanı, görevli ve üye — her kullanıcı sadece kendi görevi için tasarlanmış arayüzü görür.
Anonimlik tasarım seviyesinde garanti altında. Teknik bir tercih değil, mimari bir zorunluluk.
HMAC-SHA256 ile üretilen token'lar veritabanında asla plaintext olarak tutulmaz. Yalnızca hash'i saklanır. Token bir kez kullanılınca atomik olarak yakılır.
HKDF+HMAC v1 şeması: oy verisi, HKDF türetilmiş anahtar ile HMAC'lanır. Hash, oy içeriğini açıklamadan bağımsız doğrulama imkânı sunar.
votes tablosunda member_id sütunu yoktur. tokens ve votes tabloları hiçbir zaman JOIN yapılmaz. Görevli dahil hiç kimse kimin kime oy verdiğini göremez.
Aktivite logu HMAC prev_hash zinciri ile korunur. Tek bir satır değişse zincir kırılır. Admin zinciri tek tıkla doğrulayabilir.
DB destekli, IP+endpoint bazlı, üstel geri çekilme ile. Session bazlı atlatma açığı kapalı. Kalıcı blok mekanizması mevcut.
CSP, HSTS, X-Frame-Options, Referrer-Policy, Permissions-Policy. Bootstrap Icons dahil tüm varlıklar self-hosted — CDN bağımlılığı yok.
Framework yok. Büyük ORM yok. Her bağımlılık bir gerekçeye dayanıyor.
Her yazılımın sınırı olmalı. Bu sınırlar bilinçli tercihler.
Uzaktan / online oy kullanma aracı değildir. Üye fiziksel olarak genel kurulda hazır bulunmalı, kimliğini görevliye ibraz etmelidir. Bu, Dernekler Kanunu'nun "şahsen oy kullanma" şartını karşılayan kasıtlı bir tasarım tercihidir.
Ticari bir SaaS değildir. Abonelik, bulut hesabı veya ücret yok. Kodu alır, kendi sunucuna kurarsın. MIT lisanslı, kaynak kod tamamen açık.
Her tür oylama için değildir. Dernek genel kurul organ seçimleri için tasarlandı. Anket, referandum veya genel amaçlı oylama platformu değildir.
E-Devlet veya merkezi sistem bağlantısı yoktur. TC kimlik doğrulaması görevli üzerinden fiziksel kimlik ibrazıyla yapılır; NVI API veya merkezi kimlik doğrulama entegrasyonu mevcut değildir.
Plug-and-play değildir. Kurulum teknik bilgi gerektirir: Docker, Linux komut satırı, DNS yapılandırması. Sıfır teknik bilgiyle kurulum desteklenmez.
Docker yeterli. Geliştirme ortamı için beş komut, production için birkaç ek adım.
$ git clone https://github.com/barisozyurt/oyla.git && cd oyla $ cp .env.example .env $ bin/install # secret üretir, admin parolası sorar, demo veri yükler $ docker compose up -d $ docker compose exec php bin/migrate
$ cp .env.example .env # APP_ENV=production, APP_DEBUG=false $ bin/install --no-demo # demo verisi olmadan $ docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d $ docker compose exec php composer install --no-dev --optimize-autoloader $ docker compose exec php bin/migrate
Projeyle ilgili sorularınız, hata bildirimleriniz veya katkı önerileriniz için aşağıdaki kanalları kullanabilirsiniz.