Zkt Timer
Merhaba, ben İbrahim. Uzun zamandır küp çözüyorum ve yarışmalara katılmaya başladıktan sonra bu iş benim için bir hobi olmaktan çıkıp çok daha ciddi bir uğraşa dönüştü. Antrenmanlarım ciddileştikçe her çözümün ardından kendime aynı soruları sorar oldum: Nerede vakit kaybettim, hangi geçişte yavaşladım, hangi algoritmayı hâlâ tam oturtamadım? Kullandığım araçlar süremi tutmakta gayet başarılıydı ama bu soruların cevabını bulmamda pek yardımcı olmuyordu. Ben ise çözümlerimi derinlemesine inceleyebileceğim, algoritmalarımı düzenli çalışabileceğim ve bütün bunları tek bir yerde yapabileceğim bir araç istiyordum. Farklı uygulamaları denedim ama aradığımı tam olarak hiçbirinde bulamadım; sonunda da onu kendim yapmaya karar verdim.
Başlangıçta hedefim oldukça mütevazıydı; yalnızca kendi kullanacağım, her ayrıntısına hâkim olduğum basit bir timer yapmak istiyordum. Ama eklediğim her parça beraberinde yeni bir ihtiyacı da getirdi. Önce çözümlerimi incelemek için analiz araçlarını yazdım, ardından algoritma çalışmak için trainer'ı, daha sonra da smart küp bağlantısını ve cihazlar arası senkronizasyonu ekledim. Bunların hiçbiri sanıldığı kadar kolay olmadı; her küp markasının Bluetooth protokolü kendi içinde ayrı bir bilmeceydi, bir cihazda kusursuz çalışan bir özellik başka bir cihazda hiç beklemediğim bir yerden bozulabiliyordu ve bazen tek bir hatanın peşinde saatlerimi, hatta günlerimi harcadım. Yine de çözdüğüm her sorun beni bir adım daha ileri taşıdı ve o küçük timer zamanla kendi başına bir ekosisteme dönüştü.
Proje 2025'te başladı ve o günden bu yana ilk hâlinden çok farklı bir yere geldi. Web üzerinde başlayan yapı zamanla iOS ve Android'e taşındı; bugün aynı kod tabanı tarayıcıda, telefonda ve tablette çalışıyor. Bu yolun büyük kısmını tek başıma yürüdüm. Mağaza incelemelerinden ödeme sistemlerine, native koddan gerçek zamanlı maçlara kadar her adım benim için ayrı bir öğrenme süreciydi ve neredeyse hiçbiri ilk denemede yerine oturmadı. Bu süre boyunca yaptığım iş yalnızca yeni özellikler eklemekten ibaret değildi; asıl mücadele, sistemleri tekrar tekrar ele almak, bazılarını birden fazla kez baştan tasarlamak ve bütün parçaların birbiriyle uyum içinde çalışmasını sağlamaktı.
Başta yalnızca kendim için yazdığım bu araç, bugün başka küpçülerin her gün antrenman yaptığı, birbiriyle yarıştığı ve yarışmaları takip ettiği bir yere dönüştü. Hiç tanımadığım birinin kişisel rekorunu Zkt Timer'da kırdığını görmek, bütün o uğraşın boşa gitmediğini hissettiriyor. Yeni özelliklerin önemli bir kısmı da artık onu kullanan insanların geri bildirimlerinden doğuyor. Zkt Timer'ı bitmiş bir ürün olarak görmüyorum; hâlâ her gün üzerinde çalıştığım, büyümeye devam eden bir proje ve açıkçası bu yolun daha başında olduğumu düşünüyorum.

Zkt Timer — ibrhyyme
Zkt Timer'ı tasarlayan ve geliştiren kişi.
Credits
Yukarıda bu yolun büyük kısmını tek başıma yürüdüğümü söyledim, ama işin aslı şu ki hiçbir zaman gerçekten yalnız değildim. Speedcubing dünyasında yıllar içinde büyümüş, son derece cömert bir açık kaynak kültürü var ve Zkt Timer'ı geliştirirken bu kültürden sürekli beslendim. Pek çok projeyi uzun uzun inceledim; bazılarını kendi bilgisayarımda çalıştırıp denedim, bazılarını ise nasıl çalıştığını gerçekten anlayabilmek için satır satır okudum.
Her projeden ayrı bir şey öğrendim. Kimi, karıştırma üretimi ya da çözücü yaklaşımları gibi teknik konularda bana yol gösterdi; kimi de trainer ve kullanıcı deneyimi tarafında neyin gerçekten işe yaradığını görmemi sağladı. Bazen bir algoritma fikri, bazen bir veri modeli, bazen de bir sistemin bütününe bakış açısı, takıldığım bir noktada önümü açan şey oldu.
Bu parçaları olduğu gibi alıp kullanmak yerine, her birini Zkt Timer'ın kendi yapısına uyacak şekilde yeniden ele aldım. Sistemlerin çoğunu baştan yazdım, bazılarını sadeleştirdim, bazılarını ise ihtiyaç duydukça genişlettim. Farklı kaynaklardan gelen yaklaşımları tek bir mimari altında, birbiriyle uyum içinde çalışacak hâle getirmek bu sürecin hem en zor hem de en öğretici kısmıydı.
Bu yüzden bugün ortaya çıkan yapı tek bir kaynağa dayanmıyor; farklı projelerden öğrendiklerimin bir araya gelip yeniden inşa edilmesiyle şekillendi. Ama şunu açıkça söylemeliyim ki aşağıda adı geçen geliştiricilerin emeği olmasaydı, Zkt Timer bugünkü hâline bu kadar kısa sürede asla ulaşamazdı.
Bir şeyi ileriye taşımanın yalnızca yeni bir şey eklemekten ibaret olmadığına inanıyorum; senden önce yapılan işi doğru anlamak, ona saygı göstermek ve üzerine dürüst bir katkı koymak da en az onun kadar önemli. Bu yüzden bu projeye doğrudan ya da dolaylı olarak dokunan herkesin hakkını teslim etmek, benim için bir nezaketten çok, ödenmesi gereken bir borç.
Aşağıda adını andığım projelerin ve geliştiricilerin her biri, Zkt Timer'ın oluşumunda farklı bir rol oynadı. Kimi bir fikrin çıkış noktası oldu, kimi uzun süre takılıp kaldığım bir problemi çözmemi sağladı, kimi de ufkumu açıp daha iyi bir yaklaşımı görmeme vesile oldu. Bu çalışmaların çoğu, insanların kendi boş zamanlarından feda ederek geliştirdiği ve hiçbir karşılık beklemeden herkesle paylaştığı emeklerin ürünü; bunun ne kadar değerli olduğunu, kendi projemde aynı yükün altına girdiğimde çok daha iyi anladım.
Emeğini, zamanını ve bilgisini bu toplulukla paylaşan herkese en derin saygımı ve içten teşekkürlerimi sunuyorum. İyi ki varsınız.
— ibrhyyme
Zkt Timer'daki Yenilikler
Bu bölümde Zkt Timer için tasarlanan ve geliştirilen özellikler yer alıyor. Her biri platformun kendi ihtiyaçlarından ve kullanıcılardan gelen geri bildirimlerden doğdu.
Yarışma Bildirim ve Geri Sayım Sistemi
Zkt Timer, takip ettiğiniz yarışmalar için otomatik bildirim üretir. Kayıtların açılması, grup ve görev atamalarının yayınlanması, sonuçların girilmesi ve kırılan rekorlar bildirim olarak iletilir; yarışma tarihine kadar da bir geri sayım tutulur. Sistem sunucu tarafında zamanlanmış görevler olarak çalışır ve hem uygulama içi hem push bildirimi üretir.
Rekor Radarı
Katılacağınız yarışmada kırılabilecek rekorları önceden hesaplar. Yarışmacı listesi, etkinlik programı ve güncel ulusal rekorlar karşılaştırılarak hangi rekorların tehlikede olduğu belirlenir ve yarışma sayfasında gösterilir.
Native Mobil Uygulama
Zkt Timer, iOS ve Android'de native uygulama olarak sunulur. Smart küp bağlantısı native bir BLE katmanı üzerinden çalışır; ivmeölçer ve titreşim desteği native eklentilerle sağlanır. Kenar hareketleri, güvenli alanlar ve klavye davranışı her platform için ayrı ele alınmıştır.
Magnet Timer
Ekrana dokunmadan süre tutmayı sağlayan, iOS ve Android uygulamasına özel bir timer türü. Telefon masada düz durur, küp telefonun arka kamera ucunda bekler; telefonun pusula sensörü küpün içindeki mıknatısları algılar. Küp kaldırıldığında süre başlar, masaya bırakıldığında durur. Her telefonun sensörü farklı davrandığı için kalibrasyon her küp ve telefon modeli için ayrı yapılır; eşikler sensörün ham değerlerinden hesaplanır. Sensörü okuyan native katman iOS ve Android için ayrı ayrı yazıldı, algılama mantığı gerçek cihaz kayıtları üzerinde test edildi.
Tam Çevrimdışı Mod
İnternet bağlantısı olmadan çözüm yapılabilir, seans açılabilir ve istatistikler görüntülenebilir. Bağlantı geri geldiğinde bekleyen çözümler sıraya alınarak sunucuyla uzlaştırılır, çakışmalar çözülür ve kopya kayıtlar parmak izine göre elenir.
Offline Battle (1v1)
İki kişinin aynı cihaz üzerinde karşılıklı yarıştığı bir mod. Telefonda ve tablette ekran karşılıklı iki yarıya bölünür; masaüstünde oyuncular yan yana oturur ve A ile L tuşlarını kullanır. Oyuncular birbirinden bağımsız başlar ve her biri kendi smart küpünü bağlayabilir. Ceza durumları ve skorlar ayrı takip edilir, tur geçmişi detaylı olarak saklanır.
Online Battle
Smart küple, aynı anda rakip arayan başka bir oyuncuya karşı oynanan 1v1 maç. İki oyuncu aynı karıştırmayı çözer, üç turu ilk alan kazanır. Süre internetten değil küpün kendi saatinden ölçüldüğü için bağlantı gecikmesi sonucu etkilemez. Eşleştirme, bekleme uzadıkça genişleyen bir reyting aralığıyla çalışır; maçı sunucu yönetir ve her çözümü hamle kaydı ile küp saati üzerinden doğrular. Reytingler Glicko-2 ile hesaplanır ve Sıralama sayfasında listelenir.
Algoritma Setleri
Çalışılmak istenen algoritmaları kişisel setlerde toplamayı sağlayan bir yapı. OLL, PLL, F2L gibi farklı kategorilerden vakalar aynı sette bir araya gelebilir. Bir set gizli tutulabilir, yalnızca bağlantıyla paylaşılabilir ya da herkese açılabilir; paylaşılan bağlantı kendi önizlemesiyle açılır. Herkese açık setler Topluluk Setleri'nde listelenir ve başkaları tarafından kaydedilebilir. Değişiklikler anında kaydedilir, setler çevrimdışı kullanım için cihazda da tutulur.
Mesajlar
Kullanıcıların birebir yazışabildiği bir mesajlaşma sistemi. İlk kez yazan birinin mesajı doğrudan gelen kutusuna düşmez, İstekler sekmesinde onay bekler. Sohbete bir çözüm eklenebilir; karşı taraf süreyi görür ve çözümün detayını açabilir. Gönderilen mesaj düzenlenebilir ya da geri alınabilir. Kimin yazabileceği, okundu bilgisi, yazıyor göstergesi ve çevrimiçi noktası her kullanıcının kendi ayarına bağlıdır; engelleme ve şikâyet de sistemin içindedir.
Kişiselleştirme
Bulmaca renkleri 2x2'den 7x7'ye, Square-1, Clock ve FTO için ayrı gruplar hâlinde seçilir ve uygulamadaki tüm çizimlere yansır: karıştırma görseli, smart küp görünümü ve diğerleri. Timer'ın arkasına bir görsel ya da 40 MB'a kadar bir MP4 video konabilir; video çözüm sırasında durur ve bu ayar cihaz başına tutulur. Masaüstünde timer ekranındaki modüller sütunlara, alt şeride ya da boş bir alana sürüklenerek serbestçe yerleştirilir ve kenarlarından boyutlandırılır.
Cuber Card
Profil bilgilerini tek bir görsele dönüştüren paylaşılabilir kart. Avatar, isim, yarışma sayısı, madalyalar ve WCA rekorları kart üzerinde yer alır. Mobilde native paylaşım menüsüne, masaüstünde doğrudan indirmeye bağlıdır.
Referanslar
Aşağıdaki projeler Zkt Timer'ın gelişimi boyunca farklı şekillerde referans oldu. Her madde iki şeyi birlikte anlatıyor: o projeden ne alındığını ve üzerine ne kurulduğunu.

Zkt Timer'ın yazılım mimarisindeki en güçlü referansım. Bir cubing platformunda React + SSR, Node.js + GraphQL, PostgreSQL + Prisma ve Redis'in nasıl bir arada çalıştığı kash'in cubedesk projesi incelenerek çıkarıldı. Servis organizasyonu ve klasör yapısı konusunda yol gösterdi. Etkisi yalnızca sunucu tarafında kalmadı: timer ekranının yerleşimi, çözüm listesi ve modül düzeni gibi noktalarda cubedesk'in kurduğu arayüz dili de referans alındı. Ayrıldığımız nokta şu: cubedesk bir web uygulaması. Aynı kod tabanının Capacitor ile iOS ve Android'e de çıkmasını istedim, bu yüzden SSR katmanını, oturum yönetimini ve cihazlar arası veri senkronizasyonunu native tarafı da taşıyacak şekilde yeniden kurdum.

Karıştırma üretiminin temeli. Bulmaca tiplerinin karıştırma algoritmaları ve alt küme yapısı, min2phase Kociemba çözücüsü ve grup teorisi kütüphanesi cs0x7f'in csTimer ve min2phase projeleri referans alınarak kuruldu. Bu kod JavaScript'ten TypeScript'e taşınırken kayıt tabanlı bir üretici mimarisine geçirildi; artık her bulmaca tipi kendi jeneratörünü kaydediyor ve istemci ile sunucu aynı karıştırmayı üretebiliyor. Üzerine 40'tan fazla CFOP, Roux, Mehta ve ZZ alt kümesi, Square-1 ve Clock için kendi 2D çizicilerim ve ağır çözücüleri arayüzü kilitlemeden çalıştıran bir Web Worker katmanı eklendi.

Trainer modülünün kullanıcı deneyimi tarafındaki ana referanslarımdan biri. Smart küpün bir antrenman akışına nasıl bağlandığı Pau Oliva Fora'nın projesi incelenerek çıkarıldı. Zkt Timer'da bu yapı dört ayrı moda bölündü (Standart, Smart Küp, Tanıma, Verimlilik); her algoritma için ayrı istatistik tutuldu, kuyruk sıralaması kullanıcının zayıf olduğu vakalara göre uyarlanabilir hale getirildi, 2D ve 3D desen görselleştirmesi ile algoritma sayfalarını yazdırmaya yarayan PDF dışa aktarma eklendi.

Trainer'da kullanılan algoritma koleksiyonunun önemli bir bölümü spencerchubb'ın cubingapp veri setinden geldi ve Zkt Timer'ın veri modeline uyarlandı. Kurulum algoritmaları kendi betiklerimle yeniden üretildi, desen görselleri kendi çizim hattımdan geçirildi, koleksiyon 31 kategoriye bölündü ve kendi eklediğim algoritmalarla genişletildi.

Cross, XCross, EOCross ve F2L çifti çözücü mantığının başlangıç noktası. or18'in geliştirdiği koordinat tabanlı IDA* uygulamaları Zkt Timer'ın çözücü sisteminin tasarımında temel referans oldu. Bu modülde yapılan iş taşıma ve uyarlamadır: çözücüler Web Worker mimarisine alındı ve adım adım çözüm arayüzüne bağlandı. Algoritmanın arkasındaki matematik or18'e aittir.

1v1 odaların ve dostane yarış formatının kavramsal temeli bu projeden geliyor. Eşzamanlı ve paylaşılan bir çözüm modelinin nasıl kurulduğu coder13'ün çalışması incelenerek çıkarıldı. Zkt Timer'ın oda sistemi bu fikrin üzerine sıfırdan yazıldı ve LetsCube'da eksik olduğunu düşündüğüm şu fikirler eklendi: odada smart küp desteği, canlı sohbet, seyirci modu, oda yönetimi ve kullanıcı engelleme, 1v1 düello modu ve Redis üzerinden birden fazla sunucuya yayın yapabilen bir Socket.IO katmanı.

WCA yarışmalarında yarışmacıların kendi gruplarını ve görevlerini takip etmesi için yapılmış bir proje ve işini çok iyi yapıyor. Yarışmacıların bu bilgi için ayrı bir siteye gitmesini istemedim, bu yüzden aynı deneyimi Zkt Timer'ın içine taşıdım. Yarışmacının kendi programı, hakem ve karıştırıcı görevleri, etkinlik bazlı kişisel rekorları ve tur sonuçları artık tek ekranda toplanıyor. Grup ekranlarının düzeni bu projenin etkisiyle şekillendi.

WCA yarışmalarının canlı takibi için yapılmış, tur bazlı sonuç akışını gerçekten çok iyi çözen bir platform. WCA Software Team'in çalışması, Zkt Timer'daki WCA Live entegrasyonunun yapısal yaklaşımına doğrudan kaynaklık etti. ZKT yarışma platformunun kendisi ise Zkt Timer için sıfırdan yazıldı: kayıt sistemi, skor kartı girişi, toplu giriş modu, tur yönetimi, hakem ve karıştırıcı ve koşucu görev atama, ulusal rekor takibi, delege yönetimi, A/B gün bölmeli yarışmalar ve WCIF üretimi. wca-live'dan alınan şey delege iş akışının mantığıdır.

Açılış sayfasındaki etkileşimli 3D küp Dev-tanay'in bu projesinden birebir port edildi. Kaynak Three.js r95 ile yazılmıştı; r125'e taşınırken değişen API'ler uyarlandı ve kod TypeScript'e çevrildi. Sınıf yapısı ve metot isimleri kaynakla aynı kaldı. Benim eklediğim kısım küpün Zkt Timer'ın timer'ına bağlanması oldu: karıştırma üretimi, çözüm algılama ve süre ölçümü. Bu maddede kodun iskeleti Dev-tanay'a aittir.

PLL Tanıma Antrenörü modülünün doğrudan temeli. Klavyeden PLL tanıma pratiği, iki taraflı tanıma rehberi ve uyarlanabilir tekrar mantığı Roman Strakhov'un projesinden alındı. Kaynak Vue ile yazılmıştı; modül React ve TypeScript'te yeniden yazıldı. Yeniden yazım sırasında tanıma rehberi 73 vakanın tamamını kapsayacak şekilde tamamlandı, geçmişi cihazda saklayan bir katman, bir sözlük görünümü ve 13 adımlık bir görev yolculuğu eklendi. Modül bugün kaynağın yaklaşık dört katı büyüklüğünde.
Kullanılan Kütüphaneler
Zkt Timer'ın altyapısında doğrudan kullanılan temel cubing kütüphaneleri.

cubing.js — Lucas Garron & the cubing.js team Smart küp durum takibi, WCA notasyonu ve KPattern eşleştirme için kullanılan temel kütüphanedir. Lucas Garron ve cubing.js katkıcıları tarafından geliştirilmektedir.

GAN smart cube'lar için Bluetooth bağlantı yönetimi ve jiroskop/hareket mantığını sağlayan kütüphanedir. Smart Cube modülünün temelini bu kütüphane oluşturmaktadır.

gan-web-bluetooth'un bakımı süren devamı. GAN, QiYi, MoYu, Giiker ve GoCube sürücülerimizdeki birçok düzeltme (bir Bluetooth paketindeki birden fazla GAN hamlesini okuma, paket doğrulama, jiroskop desteği, MAC adayları) bu kütüphaneden alındı; gerçek küp kayıtları testlerimizde kullanılıyor.
Çeşitli analiz ve çözüm özelliklerinde kullanılan temel küp çözücü kütüphanesidir.
Açık Kaynak
Zkt Timer; React, Apollo, Prisma, Three.js başta olmak üzere yüzlerce açık kaynak paketin üzerine inşa edilmiştir. Kullanılan tüm bağımlılıkların listesine package.json dosyasından ulaşılabilir. Bu kütüphaneleri uzun yıllar boyunca geliştirip sürdüren herkese ayrıca teşekkür ederim.
Topluluğa
WCA'ya ve küresel speedcubing topluluğuna. Tek bir bulmaca etrafında dünya çapında olağanüstü bir topluluk kurulmuştur. Zkt Timer'ın bir anlam taşımasının asıl sebebi, bu topluluğun bir parçası olabilmesidir.
Telif Hakkı Bildirimleri
Bu yazılımın bazı bölümleri, yukarıda belirtilen projelerden kod veya konseptlere referans içermektedir. Her proje, kendi orijinal telif haklarını korumaktadır. Zkt Timer'ın kendi mimarisi, sistemleri ve özellikleri ise aşağıdaki telif hakkına tabidir:
Bu proje GNU Genel Kamu Lisansı v3.0 altında yayınlanmıştır.