{"id":43531,"date":"2026-07-22T21:02:34","date_gmt":"2026-07-22T18:02:34","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/hayalimdeki-cok-platformlu-nostr-masaustu-istemcisini-nasil-gelistirdim\/"},"modified":"2026-07-22T21:02:54","modified_gmt":"2026-07-22T18:02:54","slug":"hayalimdeki-cok-platformlu-nostr-masaustu-istemcisini-nasil-gelistirdim","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/hayalimdeki-cok-platformlu-nostr-masaustu-istemcisini-nasil-gelistirdim\/","title":{"rendered":"Hayalimdeki \u00c7ok Platformlu Nostr Masa\u00fcst\u00fc \u0130stemcisini Nas\u0131l Geli\u015ftirdim?"},"content":{"rendered":"<h2>Hayalimdeki \u00c7ok Platformlu Nostr Masa\u00fcst\u00fc \u0130stemcisini Nas\u0131l Geli\u015ftirdim?<\/h2>\n<p>Nostr protokol\u00fc ile \u00e7al\u0131\u015fan, h\u0131zl\u0131 ve g\u00fcvenli bir masa\u00fcst\u00fc istemcisi geli\u015ftirme s\u00fcrecimi, mimari kararlar\u0131m\u0131 ve t\u00fcm teknik detaylar\u0131 bu rehberde ke\u015ffedin.<\/p>\n<h2>Nostr Protokol\u00fc Nedir ve Neden Yeni Bir Masa\u00fcst\u00fc \u0130stemcisine \u0130htiya\u00e7 Duydum?<\/h2>\n<p>Geleneksel sosyal medya platformlar\u0131, verilerimizi merkezi sunucularda toplayarak sans\u00fcr ve veri m\u00fclkiyeti sorunlar\u0131n\u0131 beraberinde getirmektedir. Ancak merkeziyetsiz sosyal a\u011flar bu tabloyu tamamen de\u011fi\u015ftiriyor. Bu alanda \u00f6ne \u00e7\u0131kan Nostr (Notes and Other Stuff Transmitted by Relays), a\u00e7\u0131k kaynakl\u0131 ve sans\u00fcre dayan\u0131kl\u0131 bir ileti\u015fim protokol\u00fcd\u00fcr. Kullan\u0131c\u0131lar, kriptografik anahtar \u00e7iftleri (a\u00e7\u0131k ve gizli anahtar) arac\u0131l\u0131\u011f\u0131yla kimliklerini do\u011frular. B\u00f6ylece herhangi bir merkezi otoriteye ba\u011fl\u0131 kalmadan mesaj iletimi ger\u00e7ekle\u015ftirirler.<\/p>\n<p>Piyasada birden fazla web ve mobil Nostr istemcisi (client) bulunmas\u0131na ra\u011fmen, masa\u00fcst\u00fc taraf\u0131nda ciddi bir performans ve deneyim eksikli\u011fi mevcuttu. Web istemcileri taran\u0131c\u0131 sekmesine s\u0131k\u0131\u015ft\u0131\u011f\u0131 i\u00e7in sistem kaynaklar\u0131n\u0131 verimsiz kullan\u0131yordu. Bununla birlikte mobil uygulamalar da klavye odakl\u0131, \u00e7oklu pencere destekleyen ve performansl\u0131 bir masa\u00fcst\u00fc deneyimi sunam\u0131yordu. Tam da bu noktada, kendi ihtiya\u00e7lar\u0131m\u0131 kar\u015f\u0131layacak \u00e7ok platformlu (cross-platform) bir masa\u00fcst\u00fc istemcisi in\u015fa etmeye karar verdim.<\/p>\n<p>Projenin temel amac\u0131; d\u00fc\u015f\u00fck bellek t\u00fcketimi sa\u011flayan, arka planda r\u00f6le (relay) ba\u011flant\u0131lar\u0131n\u0131 koparmayan ve bildirim entegrasyonu g\u00fc\u00e7l\u00fc bir masa\u00fcst\u00fc yaz\u0131l\u0131m\u0131 ortaya \u00e7\u0131karmakt\u0131. Ayr\u0131ca platform ba\u011f\u0131ms\u0131z olarak Windows, macOS ve Linux \u00fczerinde tam performans \u00e7al\u0131\u015fmas\u0131 gerekiyordu.<\/p>\n<h2>Teknolojik Altyap\u0131y\u0131 Nas\u0131l Se\u00e7tim: Tauri, Electron ve Flutter Kar\u015f\u0131la\u015ft\u0131rmas\u0131<\/h2>\n<p>Masa\u00fcst\u00fc uygulamas\u0131 geli\u015ftirirken mimari bir \u00e7er\u00e7eve (framework) se\u00e7mek en kritik karard\u0131r. \u0130lk a\u015famada \u00f6n\u00fcmde \u00fc\u00e7 b\u00fcy\u00fck se\u00e7enek vard\u0131: Electron, Flutter ve Tauri. \u0130htiya\u00e7lar\u0131m\u0131 do\u011fru belirlemek ad\u0131na bu \u00fc\u00e7 teknolojiyi detayl\u0131 bir \u015fekilde k\u0131yaslad\u0131m.<\/p>\n<p>Electron, Node.js ve Chromium paketledi\u011fi i\u00e7in y\u00fcksek bellek kullan\u0131r. Dolay\u0131s\u0131yla masa\u00fcst\u00fcnde hafif bir istemci hedefiyle uyu\u015fmuyordu. Flutter harika bir kullan\u0131c\u0131 aray\u00fcz\u00fc (UI) sunsa da masa\u00fcst\u00fc platformlar\u0131nda yerel sistem entegrasyonlar\u0131 taraf\u0131nda bazen ek eklentilere ihtiya\u00e7 duyuyordu. Sonu\u00e7 olarak terci\u011fimi Tauri y\u00f6n\u00fcnde kulland\u0131m.<\/p>\n<p>Tauri, arka planda Rust dilini kullan\u0131rken \u00f6n y\u00fczde istedi\u011finiz web teknolojisini (React, Vue veya Svelte) \u00e7al\u0131\u015ft\u0131rman\u0131za imkan tan\u0131r. Sistem taray\u0131c\u0131s\u0131n\u0131n yerel g\u00f6r\u00fcnt\u00fcleyicisinden (WebView) yararland\u0131\u011f\u0131 i\u00e7in uygulama boyutu olduk\u00e7a k\u00fc\u00e7\u00fckt\u00fcr (yakla\u015f\u0131k 10-15 MB). Bu durum, bellek kullan\u0131m\u0131n\u0131 da minimum seviyeye indirir.<\/p>\n<table>\n<thead>\n<tr>\n<th>Kriter<\/th>\n<th>Electron<\/th>\n<th>Flutter<\/th>\n<th>Tauri (Se\u00e7ilen)<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Bellek (RAM) Kullan\u0131m\u0131<\/td>\n<td>Y\u00fcksek (~200MB+)<\/td>\n<td>Orta (~80MB)<\/td>\n<td>\u00c7ok D\u00fc\u015f\u00fck (~30-50MB)<\/td>\n<\/tr>\n<tr>\n<td>Paket Boyutu<\/td>\n<td>B\u00fcy\u00fck (80-120MB)<\/td>\n<td>Orta (30-50MB)<\/td>\n<td>\u00c7ok K\u00fc\u00e7\u00fck (10-15MB)<\/td>\n<\/tr>\n<tr>\n<td>G\u00fcvenlik Mimarisi<\/td>\n<td>Karma\u015f\u0131k IPC Yap\u0131s\u0131<\/td>\n<td>Kendi Ekosistemi<\/td>\n<td>G\u00fc\u00e7l\u00fc Rust \u0130zolasyonu<\/td>\n<\/tr>\n<tr>\n<td>Arka Plan Dili<\/td>\n<td>JavaScript \/ Node.js<\/td>\n<td>Dart<\/td>\n<td>Rust<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Tauri sayesinde hem Rust dilinin sa\u011flad\u0131\u011f\u0131 bellek g\u00fcvenli\u011fini ve h\u0131z\u0131n\u0131 elde ettim hem de \u00f6n y\u00fczde TypeScript ve React kullanarak esnek bir aray\u00fcz tasarlad\u0131m. Bu bile\u015fim, projenin performans hedeflerine ula\u015fmas\u0131nda anahtar rol oynad\u0131.<\/p>\n<h2>Nostr \u0130stemci Mimarisini S\u0131f\u0131rdan Nas\u0131l Kurgulad\u0131m?<\/h2>\n<p>Nostr istemcisi geli\u015ftirmek, geleneksel REST API tabanl\u0131 uygulamalardan farkl\u0131 bir d\u00fc\u015f\u00fcnce yap\u0131s\u0131 gerektirir. \u00c7\u00fcnk\u00fc Nostr protokol\u00fcnde veriler sunucularda saklanmaz; mesajlar &#8220;R\u00f6le&#8221; (Relay) ad\u0131 verilen WebSocket sunucular\u0131 \u00fczerinden da\u011f\u0131t\u0131l\u0131r. Bu nedenle mimarimi olay odakl\u0131 (event-driven) bir model \u00fczerine kurdum.<\/p>\n<p>\u0130stemci mimarisini \u00fc\u00e7 temel katmana ay\u0131rd\u0131m:<\/p>\n<ul>\n<li><strong>Ba\u011flant\u0131 ve A\u011f Katman\u0131 (Rust &#038; WebSockets):<\/strong> R\u00f6leler ile s\u00fcrekli WebSocket ba\u011flant\u0131s\u0131 kuran, abonelikleri (subscriptions) y\u00f6neten katmand\u0131r.<\/li>\n<li><strong>\u0130\u015f Mant\u0131\u011f\u0131 ve Do\u011frulama Katman\u0131 (Crypto &#038; State):<\/strong> Gelen verilerin Schorr imzalar\u0131n\u0131 do\u011frulayan, yerel \u00f6nbelle\u011fe kaydeden yap\u0131d\u0131r.<\/li>\n<li><strong>Aray\u00fcz Katman\u0131 (React &#038; TypeScript):<\/strong> Kullan\u0131c\u0131ya ak\u0131\u015f\u0131 g\u00f6steren, etkile\u015fimleri alan ve grafiksel bile\u015fenleri bar\u0131nd\u0131ran katmand\u0131r.<\/li>\n<\/ul>\n<p>A\u015fa\u011f\u0131daki diyagram niteli\u011findeki mant\u0131ksal ak\u0131\u015f, bir mesaj\u0131n (event) istemciye geli\u015f s\u00fcrecini \u00f6zetlemektedir:<\/p>\n<p><code>[Nostr R\u00f6lesi] --(WebSocket JSON)--> [Rust A\u011f Katman\u0131] --(\u0130mza Do\u011frulama)--> [Yerel SQLite \u00d6nbellek] --(IPC Bridge)--> [React Aray\u00fcz\u00fc]<\/code><\/p>\n<p>Bu mimari sayesinde aray\u00fcz\u00fcn kilitlenmesini engelledim. \u00c7\u00fcnk\u00fc t\u00fcm veri \u00e7ekme ve do\u011frulama i\u015flemleri arka planda Rust bile\u015fenleri \u00fczerinde ger\u00e7ekle\u015fir. B\u00f6ylelikle \u00f6n y\u00fcz her zaman 60 FPS h\u0131z\u0131nda ak\u0131c\u0131 kal\u0131r.<\/p>\n<h2>Kriptografik Anahtar Y\u00f6netimi ve G\u00fcvenli\u011fi Nas\u0131l Sa\u011flad\u0131m?<\/h2>\n<p>Nostr ekosisteminde \u015fifreniz veya e-postan\u0131z yoktur; sadece gizli anahtar\u0131n\u0131z (nsec) ve a\u00e7\u0131k anahtar\u0131n\u0131z (npub) bulunur. E\u011fer gizli anahtar\u0131n\u0131z\u0131 kaybederseniz hesab\u0131n\u0131z\u0131 kurtaramazs\u0131n\u0131z. Bu anahtar \u00fc\u00e7\u00fcnc\u00fc taraf yaz\u0131l\u0131mlar taraf\u0131ndan \u00e7al\u0131n\u0131rsa kimli\u011finiz tamamen ele ge\u00e7irilir. Dolay\u0131s\u0131yla g\u00fcvenlik tasar\u0131m\u0131 projenin en hassas noktas\u0131yd\u0131.<\/p>\n<p>Gizli anahtarlar\u0131 asla taray\u0131c\u0131n\u0131n <code>localStorage<\/code> veya <code>sessionStorage<\/code> alan\u0131nda saklamad\u0131m. Bu alanlar zararl\u0131 XSS sald\u0131r\u0131lar\u0131na kar\u015f\u0131 savunmas\u0131zd\u0131r. Bunun yerine platformlar\u0131n yerel kasa mekanizmalar\u0131n\u0131 entegre ettim:<\/p>\n<ul>\n<li><strong>Windows:<\/strong> Credential Manager<\/li>\n<li><strong>macOS:<\/strong> Keychain Access<\/li>\n<li><strong>Linux:<\/strong> Secret Service API \/ Freedesktop Keyring<\/li>\n<\/ul>\n<p>Tauri&#8217;nin Rust kanad\u0131nda yazd\u0131\u011f\u0131m g\u00fcvenli eklenti vas\u0131tas\u0131yla, kullan\u0131c\u0131n\u0131n anahtar\u0131 i\u015fletim sisteminin \u015fifreli kasas\u0131nda saklan\u0131r. Aray\u00fcz taraf\u0131 bir imzalama i\u015flemi yapaca\u011f\u0131 zaman Rust taraf\u0131na mesaj g\u00f6nderir (<code>invoke<\/code>) ve imzalama i\u015flemi bellek \u00fczerinde g\u00fcvenle yap\u0131l\u0131r. B\u00f6ylece anahtar hi\u00e7bir zaman JavaScript ortam\u0131na s\u0131zmaz.<\/p>\n<h2>WebSocket ve R\u00f6le Ba\u011flant\u0131lar\u0131n\u0131 H\u0131zl\u0131ca Nas\u0131l Y\u00f6netirsiniz?<\/h2>\n<p>Nostr istemcilerinin kar\u015f\u0131la\u015ft\u0131\u011f\u0131 en b\u00fcy\u00fck teknik zorluk \u00e7oklu WebSocket y\u00f6netimidir. Bir kullan\u0131c\u0131 ayn\u0131 anda 10 farkl\u0131 r\u00f6leye ba\u011fl\u0131 olabilir. Her r\u00f6le ayn\u0131 mesaj\u0131 g\u00f6nderebilir veya ba\u011flant\u0131 aniden kopabilir. Bu durumu y\u00f6netmek i\u00e7in etkin bir ba\u011flant\u0131 havuzu (connection pool) olu\u015fturdum.<\/p>\n<p>A\u015fa\u011f\u0131daki TypeScript \u00f6rne\u011fi, temel bir Nostr olay\u0131n\u0131n (Event &#8211; Kind 1) veri yap\u0131s\u0131n\u0131 ve imzalanma bi\u00e7imini g\u00f6stermektedir:<\/p>\n<div class=\"code-container\">\n<pre><code>interface NostrEvent {\n  id: string;\n  pubkey: string;\n  created_at: number;\n  kind: number;\n  tags: string[][];\n  content: string;\n  sig: string;\n}\n\n\/\/ \u00d6rnek bir Kind 1 (Metin G\u00f6nderisi) olu\u015fturma fonksiyonu\nfunction createNostrNote(content: string, pubkey: string): Omit&lt;NostrEvent, 'id' | 'sig'&gt; {\n  return {\n    pubkey: pubkey,\n    created_at: Math.floor(Date.now() \/ 1000),\n    kind: 1,\n    tags: [],\n    content: content\n  };\n}\n\nconsole.log(\"Nostr Olay\u0131 Haz\u0131rland\u0131:\", createNostrNote(\"Merhaba T\u00fcrkiye Nostr Toplulu\u011fu!\", \"npub1...\"));\n<\/code><\/pre>\n<\/div>\n<p>R\u00f6lelerden gelen verilerin m\u00fckerrer (duplicate) olmas\u0131n\u0131 \u00f6nlemek ad\u0131na gelen her olay\u0131n <code>id<\/code> de\u011ferini s\u00fczge\u00e7ten ge\u00e7iren bir LRU (Least Recently Used) \u00f6nbellek algoritmas\u0131 kulland\u0131m. B\u00f6ylece ayn\u0131 g\u00f6nderi farkl\u0131 r\u00f6lelerden gelse dahi ekrana yaln\u0131zca bir kez yans\u0131t\u0131l\u0131r.<\/p>\n<p>Ba\u011flant\u0131 koptu\u011funda ise \u00fcssel geri \u00e7ekilme (exponential backoff) stratejisi uygulad\u0131m. Yani kopan bir sunucuya hemen s\u00fcrekli istek atmak yerine 1sn, 2sn, 4sn, 8sn \u015feklinde artan aral\u0131klarla yeniden ba\u011flanma denemesi kurgulad\u0131m. Bu y\u00f6ntem masa\u00fcst\u00fc uygulamas\u0131n\u0131n a\u011f kaynaklar\u0131n\u0131 l\u00fczumsuz t\u00fcketmesini \u00f6nledi.<\/p>\n<h2>Yerel Kullan\u0131c\u0131 Deneyimini Art\u0131ran Ger\u00e7ek Bir Vaka Analizi<\/h2>\n<p>Geli\u015ftirme s\u00fcrecinde kar\u015f\u0131la\u015ft\u0131\u011f\u0131m somut bir vaka \u00fczerinden konuyu derinle\u015ftirelim. T\u00fcrkiye&#8217;deki Nostr kullan\u0131c\u0131lar\u0131n\u0131n olu\u015fturdu\u011fu bir grupta, b\u00f6lgesel internet yava\u015flamalar\u0131 s\u0131ras\u0131nda istemcilerin kilitlendi\u011fi ve g\u00f6nderilerin y\u00fcklenmedi\u011fi bildirildi. Kullan\u0131c\u0131lar web istemcilerini yenilediklerinde t\u00fcm veriler kayboluyor ve r\u00f6lelere tekrar ba\u011flanmak uzun zaman al\u0131yordu.<\/p>\n<p>Bu problemi \u00e7\u00f6zmek i\u00e7in &#8220;\u00c7evrimd\u0131\u015f\u0131 \u00d6ncelikli&#8221; (Offline-First) bir mimariye ge\u00e7i\u015f yapt\u0131m. Senaryoyu \u015fu ad\u0131mlarla \u00e7\u00f6z\u00fcme kavu\u015fturdum:<\/p>\n<ol>\n<li><strong>SQLite Entegrasyonu:<\/strong> Tauri \u00fczerine g\u00f6m\u00fcl\u00fc bir SQLite veritaban\u0131 ekledim. A\u011fdan gelen t\u00fcm do\u011frulanan g\u00f6nderiler an\u0131nda yerel veritaban\u0131na yaz\u0131ld\u0131.<\/li>\n<li><strong>\u00c7ift Y\u00f6nl\u00fc \u00d6nbellekleme:<\/strong> Uygulama a\u00e7\u0131ld\u0131\u011f\u0131nda WebSocket ba\u011flant\u0131s\u0131n\u0131n kurulmas\u0131 beklenmeden yerel veritaban\u0131ndaki son 100 g\u00f6nderi an\u0131nda ekrana bas\u0131ld\u0131.<\/li>\n<li><strong>Arka Plan Senkronizasyonu:<\/strong> Ba\u011flant\u0131 kuruldu\u011fu anda <code>since<\/code> filtresi kullan\u0131larak sadece kal\u0131nan zamandan sonraki yeni veriler r\u00f6lelerden talep edildi.<\/li>\n<\/ol>\n<p>Bu iyile\u015ftirme sonucunda uygulaman\u0131n a\u00e7\u0131l\u0131\u015f ve veri g\u00f6sterme s\u00fcresi 3.5 saniyeden 120 milisaniyeye geriledi. \u0130nternet ba\u011flant\u0131s\u0131 kopsa dahi kullan\u0131c\u0131lar ge\u00e7mi\u015f ak\u0131\u015f\u0131 okumaya ve taslak g\u00f6nderi yazmaya devam edebildi. Ba\u011flant\u0131 tekrar sa\u011fland\u0131\u011f\u0131nda taslaklar otomatik olarak r\u00f6lelere f\u0131rlat\u0131ld\u0131.<\/p>\n<h2>\u0130leri D\u00fczey \u0130pu\u00e7lar\u0131: Bellek S\u0131z\u0131nt\u0131lar\u0131n\u0131 ve Performans Darbo\u011fazlar\u0131n\u0131 Nas\u0131l Engelledim?<\/h2>\n<p>Uzun s\u00fcre a\u00e7\u0131k kalan masa\u00fcst\u00fc uygulamalar\u0131nda en s\u0131k ya\u015fanan sorun bellek s\u0131z\u0131nt\u0131lar\u0131d\u0131r (memory leak). \u00d6zellikle binlerce g\u00f6nderinin akt\u0131\u011f\u0131 canl\u0131 bir Nostr ak\u0131\u015f\u0131nda DOM elemanlar\u0131n\u0131n kontrols\u00fcz b\u00fcy\u00fcmesi uygulamay\u0131 birka\u00e7 saat i\u00e7inde kullan\u0131lmaz hale getirebilir.<\/p>\n<p>Bu teknik darbo\u011faz\u0131 a\u015fmak i\u00e7in uygulad\u0131\u011f\u0131m ileri d\u00fczey y\u00f6ntemler \u015funlard\u0131r:<\/p>\n<ul>\n<li><strong>Sanal Listeleme (Virtual Scrolling):<\/strong> Ekranda ayn\u0131 anda 10.000 g\u00f6nderi olsa dahi yaln\u0131zca kullan\u0131c\u0131n\u0131n g\u00f6rd\u00fc\u011f\u00fc 10-15 bile\u015feni DOM \u00fczerinde render ettim. G\u00f6r\u00fcnmeyen elemanlar\u0131 bellekten d\u00fc\u015f\u00fcrerek DOM y\u00fck\u00fcn\u00fc sabitledim.<\/li>\n<li><strong>Rust Web-Worker Benzeri Kanallar:<\/strong> Kriptografik imza do\u011frulamalar\u0131n\u0131 ana aray\u00fcz i\u015f par\u00e7ac\u0131\u011f\u0131 (main thread) yerine Rust taraf\u0131ndaki paralel i\u015f par\u00e7ac\u0131klar\u0131na (tokio async tasks) y\u00fckledim. B\u00f6ylece aray\u00fcz donmalar\u0131n\u0131 tamamen engelledim.<\/li>\n<li><strong>Resim ve Medya \u00d6nbellekleme:<\/strong> G\u00f6nderilerdeki g\u00f6rselleri do\u011frudan uzak sunucudan \u00e7ekmek yerine, yerel disk \u00fczerinde boyutland\u0131r\u0131p \u00f6nbelle\u011fe alan bir ortam sunucusu katman\u0131 kurgulad\u0131m.<\/li>\n<\/ul>\n<p>Bu optimizasyonlar sayesinde uygulama g\u00fcnlerce a\u00e7\u0131k kalsa dahi bellek kullan\u0131m\u0131 60 megabayt seviyesini a\u015fmad\u0131. B\u00f6ylece hayalimdeki hafif ve h\u0131zl\u0131 masa\u00fcst\u00fc deneyimini tam anlam\u0131yla yakalam\u0131\u015f oldum.<\/p>\n<h2>S\u0131k\u00e7a Sorulan Sorular<\/h2>\n<div>\n<h3>Nostr istemcisini kullanmak i\u00e7in bir hesap a\u00e7mak paral\u0131 m\u0131d\u0131r?<\/h3>\n<p>Hay\u0131r, Nostr protokol\u00fc tamamen \u00fccretsizdir. Kendi anahtar \u00e7iftinizi (public\/private key) olu\u015fturarak herhangi bir kay\u0131t formu doldurmadan istemciyi hemen kullanmaya ba\u015flayabilirsiniz.<\/p>\n<\/div>\n<div>\n<h3>Tauri ile geli\u015ftirilen masa\u00fcst\u00fc uygulamas\u0131 g\u00fcvenli midir?<\/h3>\n<p>Evet, Tauri g\u00fcvenlik odakl\u0131 tasarlanm\u0131\u015f bir \u00e7er\u00e7evedir. Varsay\u0131lan olarak t\u00fcm sistem yetkileri kapal\u0131d\u0131r. Ayr\u0131ca i\u00e7erik g\u00fcvenlik politikalar\u0131 (CSP) ve Rust dilinin bellek g\u00fcvenli\u011fi sayesinde Electron&#8217;a k\u0131yasla \u00e7ok daha dar bir sald\u0131r\u0131 y\u00fczeyi sunar.<\/p>\n<\/div>\n<div>\n<h3>Gizli anahtar\u0131m\u0131 (nsec) bu istemciye girmek g\u00fcvenli mi?<\/h3>\n<p>\u0130stemci a\u00e7\u0131k kaynakl\u0131 oldu\u011fu i\u00e7in kodlar\u0131 inceleyebilirsiniz. Ayr\u0131ca anahtarlar\u0131n\u0131z i\u015fletim sisteminizin g\u00fcvenli kasas\u0131nda (Keychain\/Credential Manager) \u015fifrelenerek saklan\u0131r, kesinlikle uzak sunuculara aktar\u0131lmaz.<\/p>\n<\/div>\n<div>\n<h3>Farkl\u0131 r\u00f6leler kapand\u0131\u011f\u0131nda mesajlar\u0131m silinir mi?<\/h3>\n<p>Mesajlar\u0131n\u0131z birden fazla r\u00f6leye ayn\u0131 anda yay\u0131nland\u0131\u011f\u0131 i\u00e7in tek bir r\u00f6lenin kapanmas\u0131 verilerinizin kaybolmas\u0131na yol a\u00e7maz. \u0130stemci, mesajlar\u0131n\u0131z\u0131 di\u011fer aktif r\u00f6lelerden \u00e7ekmeye devam eder.<\/p>\n<\/div>\n<h2>Masa\u00fcst\u00fc Nostr Deneyiminde Son S\u00f6zler<\/h2>\n<p>Kendi ihtiyac\u0131mdan yola \u00e7\u0131karak geli\u015ftirdi\u011fim \u00e7ok platformlu Nostr masa\u00fcst\u00fc istemcisi, merkeziyetsiz sosyal a\u011flar\u0131n gelecekte ne kadar h\u0131zl\u0131 ve kullan\u0131c\u0131 dostu olabilece\u011fini kan\u0131tl\u0131yor. Tauri ve Rust mimarisinin sa\u011flad\u0131\u011f\u0131 d\u00fc\u015f\u00fck kaynak kullan\u0131m\u0131, React&#8217;in esnek aray\u00fcz\u00fc ile birle\u015fti\u011finde ortaya hayalimdeki ak\u0131c\u0131 uygulama \u00e7\u0131kt\u0131. A\u00e7\u0131k kaynak kodlu olarak geli\u015ftirdi\u011fim bu projeyi topluluk geri bildirimleri do\u011frultusunda g\u00fcncelliyor ve yeni NIP (Nostr Implementation Possibilities) standartlar\u0131na uyumlu hale getirmeye devam ediyorum.<\/p>\n<p>#Nostr #Masa\u00fcst\u00fcUygulama #WebGeli\u015ftirme #A\u00e7\u0131kKaynak #Kriptografi<\/p>\n<div class=\"github-example-link\"><strong>\u00d6rnek kod:<\/strong> <a href=\"https:\/\/github.com\/fatihsoysalcom\/nostr-basic-event-creation\" target=\"_blank\" rel=\"noopener noreferrer\">github.com\/fatihsoysalcom\/nostr-basic-event-creation<\/a><\/div>\n","protected":false},"excerpt":{"rendered":"Nostr protokol\u00fc ile \u00e7al\u0131\u015fan, h\u0131zl\u0131 ve g\u00fcvenli bir masa\u00fcst\u00fc istemcisi geli\u015ftirme s\u00fcrecimi, mimari kararlar\u0131m\u0131 ve t\u00fcm teknik detaylar\u0131 bu rehberde ke\u015ffedin.","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1],"tags":[],"class_list":{"0":"post-43531","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-genel","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Hayalimdeki \u00c7ok Platformlu Nostr Masa\u00fcst\u00fc \u0130stemcisini Nas\u0131l Geli\u015ftirdim? - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/hayalimdeki-cok-platformlu-nostr-masaustu-istemcisini-nasil-gelistirdim\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Hayalimdeki \u00c7ok Platformlu Nostr Masa\u00fcst\u00fc \u0130stemcisini Nas\u0131l Geli\u015ftirdim?\" \/>\n<meta property=\"og:description\" content=\"Nostr protokol\u00fc ile \u00e7al\u0131\u015fan, h\u0131zl\u0131 ve g\u00fcvenli bir masa\u00fcst\u00fc istemcisi geli\u015ftirme s\u00fcrecimi, mimari kararlar\u0131m\u0131 ve t\u00fcm teknik detaylar\u0131 bu rehberde ke\u015ffedin.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/hayalimdeki-cok-platformlu-nostr-masaustu-istemcisini-nasil-gelistirdim\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-07-22T18:02:34+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-07-22T18:02:54+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"10 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/hayalimdeki-cok-platformlu-nostr-masaustu-istemcisini-nasil-gelistirdim\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/hayalimdeki-cok-platformlu-nostr-masaustu-istemcisini-nasil-gelistirdim\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Hayalimdeki \u00c7ok Platformlu Nostr Masa\u00fcst\u00fc \u0130stemcisini Nas\u0131l Geli\u015ftirdim?\",\"datePublished\":\"2026-07-22T18:02:34+00:00\",\"dateModified\":\"2026-07-22T18:02:54+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/hayalimdeki-cok-platformlu-nostr-masaustu-istemcisini-nasil-gelistirdim\/\"},\"wordCount\":1889,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/hayalimdeki-cok-platformlu-nostr-masaustu-istemcisini-nasil-gelistirdim\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/hayalimdeki-cok-platformlu-nostr-masaustu-istemcisini-nasil-gelistirdim\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/hayalimdeki-cok-platformlu-nostr-masaustu-istemcisini-nasil-gelistirdim\/\",\"name\":\"Hayalimdeki \u00c7ok Platformlu Nostr Masa\u00fcst\u00fc \u0130stemcisini Nas\u0131l Geli\u015ftirdim? - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-07-22T18:02:34+00:00\",\"dateModified\":\"2026-07-22T18:02:54+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/hayalimdeki-cok-platformlu-nostr-masaustu-istemcisini-nasil-gelistirdim\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/hayalimdeki-cok-platformlu-nostr-masaustu-istemcisini-nasil-gelistirdim\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/hayalimdeki-cok-platformlu-nostr-masaustu-istemcisini-nasil-gelistirdim\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Hayalimdeki \u00c7ok Platformlu Nostr Masa\u00fcst\u00fc \u0130stemcisini Nas\u0131l Geli\u015ftirdim?\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Hayalimdeki \u00c7ok Platformlu Nostr Masa\u00fcst\u00fc \u0130stemcisini Nas\u0131l Geli\u015ftirdim? - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/hayalimdeki-cok-platformlu-nostr-masaustu-istemcisini-nasil-gelistirdim\/","og_locale":"tr_TR","og_type":"article","og_title":"Hayalimdeki \u00c7ok Platformlu Nostr Masa\u00fcst\u00fc \u0130stemcisini Nas\u0131l Geli\u015ftirdim?","og_description":"Nostr protokol\u00fc ile \u00e7al\u0131\u015fan, h\u0131zl\u0131 ve g\u00fcvenli bir masa\u00fcst\u00fc istemcisi geli\u015ftirme s\u00fcrecimi, mimari kararlar\u0131m\u0131 ve t\u00fcm teknik detaylar\u0131 bu rehberde ke\u015ffedin.","og_url":"https:\/\/fatihsoysal.com\/blog\/hayalimdeki-cok-platformlu-nostr-masaustu-istemcisini-nasil-gelistirdim\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-07-22T18:02:34+00:00","article_modified_time":"2026-07-22T18:02:54+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"10 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/hayalimdeki-cok-platformlu-nostr-masaustu-istemcisini-nasil-gelistirdim\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/hayalimdeki-cok-platformlu-nostr-masaustu-istemcisini-nasil-gelistirdim\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Hayalimdeki \u00c7ok Platformlu Nostr Masa\u00fcst\u00fc \u0130stemcisini Nas\u0131l Geli\u015ftirdim?","datePublished":"2026-07-22T18:02:34+00:00","dateModified":"2026-07-22T18:02:54+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/hayalimdeki-cok-platformlu-nostr-masaustu-istemcisini-nasil-gelistirdim\/"},"wordCount":1889,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/hayalimdeki-cok-platformlu-nostr-masaustu-istemcisini-nasil-gelistirdim\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/hayalimdeki-cok-platformlu-nostr-masaustu-istemcisini-nasil-gelistirdim\/","url":"https:\/\/fatihsoysal.com\/blog\/hayalimdeki-cok-platformlu-nostr-masaustu-istemcisini-nasil-gelistirdim\/","name":"Hayalimdeki \u00c7ok Platformlu Nostr Masa\u00fcst\u00fc \u0130stemcisini Nas\u0131l Geli\u015ftirdim? - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-07-22T18:02:34+00:00","dateModified":"2026-07-22T18:02:54+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/hayalimdeki-cok-platformlu-nostr-masaustu-istemcisini-nasil-gelistirdim\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/hayalimdeki-cok-platformlu-nostr-masaustu-istemcisini-nasil-gelistirdim\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/hayalimdeki-cok-platformlu-nostr-masaustu-istemcisini-nasil-gelistirdim\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Hayalimdeki \u00c7ok Platformlu Nostr Masa\u00fcst\u00fc \u0130stemcisini Nas\u0131l Geli\u015ftirdim?"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/43531","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=43531"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/43531\/revisions"}],"predecessor-version":[{"id":43532,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/43531\/revisions\/43532"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=43531"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=43531"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=43531"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}