Zirve Asansör — Asansör Bakım Platformu
Babam Trabzon'da asansör bakım şirketi işletiyor.
Altı proje

Backend — MySQL Üstünde Tek REST Sözleşmesi

Yönetim Paneli — Patronun Masaüstü Paneli

Yönetim PWA — Patronun Paneli, iPad'de

Müşteri PWA — Apartman Yöneticisinin Uygulaması

Teknisyen — Çevrimdışı Çalışan Saha Uygulaması

Beşikdüzü Asansör — Tanıtım Sitesi
Sorun
Şirketin hiç yazılımı yoktu. Aidatlar bir deftere yazılıyor, ödemeler nakit olarak babama veriliyor, hangi binanın hangi aylar için borçlu olduğu onun kafasında duruyordu. Bir yönetici bakiyeye itiraz ettiğinde gösterecek bir şey yoktu.
Apartman yöneticileri çoğunlukla yaşlı, teknolojiyle arası iyi olmayan ve bir iki yılda bir değişen insanlar. Onlar için yapılacak her şeyin merdiven boşluğunda telefon tutan birine göre olması gerekiyordu. Teknisyenler de günlerini sinyalin olmadığı makine dairelerinde ve bodrumlarda geçiriyor; bu, ziyareti kaydetmek için bağlantı isteyen bir uygulamayı baştan eledi.
Mimari
Her şeyin sahibi MySQL üstünde tek bir Node ve Express backend'i. Veritabanına dokunan tek şey o, API sözleşmesini değiştirmeye yetkili tek yer de o. Her istemci ayrı bir depo; sözleşmenin bir kopyasına karşı yazılıyor ve onu düzenleyemiyor.
Masaüstü paneli JavaFX. Bunu biraz Java bildiğim için seçtim, biraz da masaüstü istemci hile yapamadığı için: API'nin ilk günden eksiksiz olmasını zorluyor. iPad paneli masaüstünün ekran ekran web kopyası. Müşteri uygulaması bir bağlantıdan ya da kareokuttan kurulan bir PWA; çünkü yerel bir iOS uygulaması App Store dışında dağıtılamıyor ve bu kullanıcılar zaten mağazada bir şey aramayacaktı. Teknisyen uygulaması React Native, çünkü çevrimdışı depolama ve ileride push gerekiyor.
Bunların altında her kayıt bir binaya ait, kişiye değil; yönetici değişir, borç kalır. Bakiye hiç saklanmıyor. Geçerli aidatların toplamından geçerli ödemelerin toplamı çıkarılıyor, her sorulduğunda yeniden. Mali hiçbir kayıt silinmiyor; yanlış ödeme gerekçesiyle iptal ediliyor ve görünmeye devam ediyor. İzin verdiğim tek istisna tamirat borcu kalemi, o doğrudan kaldırılabiliyor.
Benim rolüm
Tek kişilik bir projeydi ve kararlar bendeydi: mimari, veri modeli, API sözleşmesi ve her ekranın nasıl davranacağı. Uygulamayı yapay zekâ kodlama ajanlarıyla, önce dokümantasyon diyerek yürüttüm. Bir mimari doküman var, bir de sözleşme. Her istemci oturumu bu dosyalara yönlendirildi ve onları değiştiremeyeceği söylendi; sözleşmenin değişmesi gerektiğinde backend değiştirdi, kopyalar yenilendi.
Daha önce yapmadığım kısımları, çevrimdışı senkron kuyruğunu, push'u, Caddy ile Docker'ı, JWT ayrıntılarını baştan yönettiğim değil öğrendiğim alanlar olarak listeledim ve onları diğerlerinden daha dikkatli okudum. Kendime koyduğum kural: açıklayamadığım dosya commit'lenmez.
Ölçek
Altı depo, 12 Haziran ile 16 Eylül 2026 arasında 168 commit. Backend 28 SQL migration'ı, 15 tablo ve 58 uç nokta; on dört test paketi var, veritabanına dokunanlar gerçek veritabanında çalışmayı reddediyor. Sözleşme bu süreçte on üç revizyon geçirdi, her biri tarihi ve gerekçesiyle kayıtlı. İşin kendisi iki şehirde yaklaşık 300 bina, dört teknisyen ve parayı toplayan bir kişi.
Ne öğrendim
Yaptığım üç şey yanlıştı ve değiştirilmek zorunda kaldı; bana çalışan kısımlardan daha çok şey öğrettiler.
Ödemelerin ilk sürümü bakım aidatını ve tamirat borcunu tek havuza koyuyor, hangisi eskiyse onu kapatıyordu. Test edildi, doğruydu, pratikte babamın kafasını karıştırdı: tamirat için verilen para eski bir bakım ayına gidebiliyordu. Bir gün dayandı. Sonra ödemelere tip geldi, iki borç ayrı defterlere ayrıldı.
Müşteri girişi bina kodu artı zorunlu şifreyle başladı; şifre WhatsApp'tan gönderiliyordu. Çoğu yaşlı ve teknolojiyle arası iyi olmayan yaklaşık 300 yönetici bu şekilde sisteme alınamayacaktı. Giriş yöneticinin telefon numarasına döndü. Şifre, isteyenin eklediği bir şey oldu.
Teknisyen ana ekranı önce günler üzerine kuruldu: bir tarih şeridi, bir güne dokun, o günün işini gör. Teknisyenler güne göre çalışmıyor. İlçeye göre çalışıyorlar. O ekran iki gün dayandı.