{"id":33670,"date":"2025-11-05T18:01:37","date_gmt":"2025-11-05T15:01:37","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/cursor-appwrite-ve-tanstack-ile-modern-not-uygulamasi-gelistirme-rehberi\/"},"modified":"2025-11-05T18:01:37","modified_gmt":"2025-11-05T15:01:37","slug":"cursor-appwrite-ve-tanstack-ile-modern-not-uygulamasi-gelistirme-rehberi","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/cursor-appwrite-ve-tanstack-ile-modern-not-uygulamasi-gelistirme-rehberi\/","title":{"rendered":"Cursor, Appwrite ve TanStack ile Modern Not Uygulamas\u0131 Geli\u015ftirme Rehberi"},"content":{"rendered":"<p><body><\/p>\n<p>G\u00fcn\u00fcm\u00fcz yaz\u0131l\u0131m geli\u015ftirme d\u00fcnyas\u0131nda, karma\u015f\u0131k tam y\u0131\u011f\u0131n (full-stack) uygulamalar\u0131 h\u0131zl\u0131 ve verimli bir \u015fekilde hayata ge\u00e7irmek b\u00fcy\u00fck bir meydan okumad\u0131r. Ancak, yapay zeka destekli kodlama ara\u00e7lar\u0131, g\u00fc\u00e7l\u00fc arka u\u00e7 servisleri ve modern \u00f6n u\u00e7 \u00e7er\u00e7evelerinin birle\u015fimiyle bu s\u00fcre\u00e7 art\u0131k \u00e7ok daha eri\u015filebilir. Bu rehberde, Cursor&#8217;\u0131n yapay zeka yeteneklerini, Appwrite&#8217;\u0131n sa\u011flam arka u\u00e7 hizmetlerini ve TanStack Start&#8217;\u0131n yenilik\u00e7i \u00f6n u\u00e7 mimarisini kullanarak nas\u0131l eksiksiz bir not uygulamas\u0131 geli\u015ftirebilece\u011fimizi ad\u0131m ad\u0131m inceleyece\u011fiz.<\/p>\n<p>Modern web uygulamalar\u0131 geli\u015ftirmek, genellikle front-end, back-end ve veritaban\u0131 gibi bir\u00e7ok farkl\u0131 bile\u015feni bir araya getirmeyi gerektirir. Geli\u015ftiriciler bu s\u00fcre\u00e7te s\u00fcrekli yeni teknolojiler \u00f6\u011frenmek, altyap\u0131y\u0131 kurmak ve maintain etmek gibi zorluklarla kar\u015f\u0131la\u015f\u0131r. \u0130\u015fte tam da bu noktada, ak\u0131ll\u0131 teknoloji se\u00e7imleri devreye girerek hem geli\u015ftirme h\u0131z\u0131n\u0131 art\u0131r\u0131r hem de nihai \u00fcr\u00fcn\u00fcn kalitesini y\u00fckseltir. Cursor, Appwrite ve TanStack Start \u00fc\u00e7l\u00fcs\u00fc, bu zorluklar\u0131n \u00fcstesinden gelmek i\u00e7in tasarlanm\u0131\u015f, birbirini tamamlayan ara\u00e7lar ve platformlardan olu\u015fur. Her biri kendi alan\u0131nda \u00e7\u0131\u011f\u0131r a\u00e7\u0131c\u0131 yenilikler sunarak geli\u015ftiricilere benzersiz avantajlar sa\u011flar.<\/p>\n<p>\u00d6rne\u011fin, bir not uygulamas\u0131 geli\u015ftirdi\u011fimizi d\u00fc\u015f\u00fcnelim. Kullan\u0131c\u0131lar\u0131n notlar\u0131n\u0131 g\u00fcvenle saklamas\u0131, bunlara eri\u015fmesi, g\u00fcncellemesi ve silmesi gerekir. Ayr\u0131ca, uygulaman\u0131n farkl\u0131 cihazlarda ve ekran boyutlar\u0131nda sorunsuz \u00e7al\u0131\u015fmas\u0131, h\u0131zl\u0131 tepki vermesi ve modern bir kullan\u0131c\u0131 deneyimi sunmas\u0131 beklenir. Geleneksel yakla\u015f\u0131mlarla t\u00fcm bu gereksinimleri kar\u015f\u0131lamak haftalar s\u00fcrebilirken, bu teknoloji y\u0131\u011f\u0131n\u0131 ile geli\u015ftirme s\u00fcresi \u00f6nemli \u00f6l\u00e7\u00fcde k\u0131salabilir. Cursor, tekrarlayan kod yazma g\u00f6revlerini otomatize ederken, Appwrite sunucu taraf\u0131 mant\u0131\u011f\u0131na odaklanman\u0131z\u0131 engellemeden kimlik do\u011frulama, veritaban\u0131 ve depolama gibi kritik arka u\u00e7 fonksiyonlar\u0131n\u0131 y\u00f6netir. \u00d6te yandan, TanStack Start, React ekosisteminin g\u00fcc\u00fcn\u00fc kullanarak performans odakl\u0131, SEO dostu ve kolay \u00f6l\u00e7eklenebilir \u00f6n u\u00e7lar in\u015fa etmenizi sa\u011flar. Dolay\u0131s\u0131yla, bu \u00fc\u00e7l\u00fcy\u00fc tercih etmek, projenizi s\u0131f\u0131rdan olu\u015ftururken kar\u015f\u0131la\u015fabilece\u011finiz karma\u015f\u0131kl\u0131\u011f\u0131 azalt\u0131r ve size uygulaman\u0131z\u0131n temel mant\u0131\u011f\u0131na odaklanma f\u0131rsat\u0131 verir. Bu sinerjik yakla\u015f\u0131m, geli\u015ftirme s\u00fcrecini daha keyifli ve verimli hale getirirken, ayn\u0131 zamanda daha sa\u011flam ve \u00f6l\u00e7eklenebilir uygulamalar yaratman\u0131za olanak tan\u0131r.<\/p>\n<h2>Not Uygulamam\u0131z \u0130\u00e7in Temel Ta\u015flar: Cursor, Appwrite ve TanStack Start&#8217;\u0131 Tan\u0131yal\u0131m<\/h2>\n<p>Tam y\u0131\u011f\u0131n bir uygulama geli\u015ftirmeden \u00f6nce, kulland\u0131\u011f\u0131m\u0131z her bir teknolojinin temelini ve bize ne gibi avantajlar sundu\u011funu anlamak kritik \u00f6neme sahiptir. Bu b\u00f6l\u00fcmde, projemizin temel yap\u0131 ta\u015flar\u0131 olan Cursor, Appwrite ve TanStack Start&#8217;\u0131 yak\u0131ndan tan\u0131yaca\u011f\u0131z.<\/p>\n<h3>Cursor: AI Destekli Kodlama Deneyimi Nas\u0131l Fark Yarat\u0131r?<\/h3>\n<p>Yapay zeka, yaz\u0131l\u0131m geli\u015ftirme alan\u0131nda h\u0131zla kendine yer ediniyor ve Cursor bu d\u00f6n\u00fc\u015f\u00fcm\u00fcn \u00f6nc\u00fclerinden biri. Cursor, VS Code tabanl\u0131 bir IDE olup, geli\u015ftiricilerin kod yazma, hata ay\u0131klama ve refactoring s\u00fcre\u00e7lerini yapay zeka ile destekler. Geleneksel IDE&#8217;lerin \u00f6tesine ge\u00e7erek, do\u011frudan kodunuzun i\u00e7inde veya yeni dosya olu\u015ftururken ba\u011flam\u0131 anlayan ve buna g\u00f6re \u00f6neriler sunan bir yapay zeka asistan\u0131 olarak \u00e7al\u0131\u015f\u0131r. \u00d6rne\u011fin, belirli bir i\u015flevselli\u011fi a\u00e7\u0131klaman\u0131z yeterlidir; Cursor sizin i\u00e7in uygun kod blo\u011funu olu\u015fturabilir.<\/p>\n<p>Bir not uygulamas\u0131 ba\u011flam\u0131nda, Cursor&#8217;\u0131n faydalar\u0131 saymakla bitmez. Appwrite SDK&#8217;s\u0131n\u0131 kullanarak notlar\u0131 veritaban\u0131na kaydetme veya getirme gibi karma\u015f\u0131k API \u00e7a\u011fr\u0131lar\u0131 i\u00e7in boilerplate kodlar\u0131 h\u0131zl\u0131ca olu\u015fturabilirsiniz. Veya belirli bir React bile\u015feni i\u00e7in kullan\u0131c\u0131 aray\u00fcz\u00fc tasla\u011f\u0131na ihtiyac\u0131n\u0131z oldu\u011funda, Cursor&#8217;a ne istedi\u011finizi s\u00f6ylemeniz yeterlidir; saniyeler i\u00e7inde size bir ba\u015flang\u0131\u00e7 noktas\u0131 sunar. Bu, \u00f6zellikle tekrar eden veya standart g\u00f6revler i\u00e7in harcanan zaman\u0131 \u00f6nemli \u00f6l\u00e7\u00fcde azalt\u0131r. Ayr\u0131ca, yazd\u0131\u011f\u0131n\u0131z kodu optimize etme, olas\u0131 hatalar\u0131 tespit etme veya daha a\u00e7\u0131klay\u0131c\u0131 yorumlar ekleme gibi konularda da aktif olarak destek sa\u011flar. Bu sayede, geli\u015ftiriciler daha \u00e7ok problem \u00e7\u00f6zmeye ve inovasyona odaklanabilirken, AI asistan\u0131 kodlama y\u00fck\u00fcn\u00fcn bir k\u0131sm\u0131n\u0131 \u00fcstlenir. Cursor, kodlama prati\u011finizi d\u00f6n\u00fc\u015ft\u00fcrerek sizi daha \u00fcretken ve verimli bir geli\u015ftirici yapar.<\/p>\n<h3>Appwrite: Arka U\u00e7 Geli\u015ftirmeyi Basitle\u015ftiren G\u00fc\u00e7l\u00fc Bir Platform<\/h3>\n<p>Appwrite, modern bir a\u00e7\u0131k kaynak BaaS (Backend as a Service) platformudur. Geli\u015ftiricilerin, arka u\u00e7 olu\u015fturmakla u\u011fra\u015fmak yerine do\u011frudan uygulamalar\u0131n\u0131n \u00e7ekirdek \u00f6zelliklerine odaklanmas\u0131n\u0131 sa\u011flar. Kimlik do\u011frulama, veritabanlar\u0131, depolama, fonksiyonlar ve ger\u00e7ek zamanl\u0131 g\u00fcncellemeler gibi temel arka u\u00e7 hizmetlerini tek bir \u00e7at\u0131 alt\u0131nda sunar. Geli\u015ftiriciler, Appwrite&#8217;\u0131 kendi sunucular\u0131na kurarak veya bulut tabanl\u0131 bir servis olarak kullanarak uygulamalar\u0131n\u0131n arka ucunu dakikalar i\u00e7inde haz\u0131r hale getirebilirler. Bu esneklik, Appwrite&#8217;\u0131 k\u00fc\u00e7\u00fck projelerden b\u00fcy\u00fck \u00f6l\u00e7ekli uygulamalara kadar geni\u015f bir yelpazede kullan\u0131labilir k\u0131lar.<\/p>\n<p>Not uygulamam\u0131z i\u00e7in Appwrite, vazge\u00e7ilmez bir bile\u015fendir. Kullan\u0131c\u0131lar\u0131n g\u00fcvenli bir \u015fekilde hesap olu\u015fturup oturum a\u00e7mas\u0131n\u0131 sa\u011flayan kimlik do\u011frulama sistemi (Authentication) sunar. Notlar\u0131m\u0131z\u0131 depolayaca\u011f\u0131m\u0131z NoSQL veritaban\u0131 (Databases) ile kolayca etkile\u015fim kurabiliriz. Her bir notun ba\u015fl\u0131\u011f\u0131, i\u00e7eri\u011fi, olu\u015fturulma tarihi gibi bilgileri burada saklan\u0131r. Ayr\u0131ca, e\u011fer notlar\u0131m\u0131zla birlikte resim veya dosya eklemek istersek, Appwrite&#8217;\u0131n depolama servisini (Storage) kullanabiliriz. Ger\u00e7ek zamanl\u0131 \u00f6zellikler sayesinde, birden fazla cihazda ayn\u0131 anda bir notu d\u00fczenleyen kullan\u0131c\u0131lar\u0131n de\u011fi\u015fiklikleri an\u0131nda g\u00f6rmesi sa\u011flanabilir. Appwrite&#8217;\u0131n kullan\u0131m\u0131 kolay SDK&#8217;lar\u0131 ve kapsaml\u0131 API&#8217;si, \u00f6n u\u00e7 geli\u015ftiricilerinin arka u\u00e7 ile sorunsuz bir \u015fekilde entegrasyon kurmas\u0131n\u0131 sa\u011flar. Bu sayede, karma\u015f\u0131k sunucu mant\u0131\u011f\u0131 yazmak yerine, yaln\u0131zca API \u00e7a\u011fr\u0131lar\u0131 yaparak uygulaman\u0131z\u0131n arka u\u00e7 ihtiya\u00e7lar\u0131n\u0131 kar\u015f\u0131layabilirsiniz.<\/p>\n<h3>TanStack Start: React Ekosisteminde Tam Y\u0131\u011f\u0131n Geli\u015fimin Yeni Y\u0131ld\u0131z\u0131<\/h3>\n<p>TanStack Start, React ekosisteminde tam y\u0131\u011f\u0131n uygulamalar geli\u015ftirmek i\u00e7in tasarlanm\u0131\u015f yenilik\u00e7i bir \u00e7er\u00e7evedir. Dosya tabanl\u0131 y\u00f6nlendirme (file-based routing), sunucu bile\u015fenleri (server components) ve g\u00fc\u00e7l\u00fc veri \u00e7ekme (data fetching) mekanizmalar\u0131 gibi modern React \u00f6zelliklerini bir araya getirir. Amac\u0131, hem geli\u015ftirici deneyimini iyile\u015ftirmek hem de son kullan\u0131c\u0131ya y\u00fcksek performansl\u0131, SEO dostu ve h\u0131zl\u0131 uygulamalar sunmakt\u0131r. Next.js, Remix gibi pop\u00fcler \u00e7er\u00e7evelerle benzerlikler g\u00f6sterse de, TanStack k\u00fct\u00fcphanelerinin (React Query, React Table vb.) yarat\u0131c\u0131lar\u0131 taraf\u0131ndan geli\u015ftirilmesiyle kendi \u00f6zg\u00fcn avantajlar\u0131n\u0131 sunar.<\/p>\n<p>Not uygulamam\u0131zda TanStack Start kullanmak, bize bir\u00e7ok avantaj sa\u011flar. \u00d6ncelikle, dosya tabanl\u0131 y\u00f6nlendirme sayesinde, her bir not sayfas\u0131, not listesi veya kullan\u0131c\u0131 paneli gibi rotalar\u0131 tan\u0131mlamak \u00e7ok kolayla\u015f\u0131r; sadece uygun klas\u00f6r yap\u0131s\u0131n\u0131 olu\u015fturman\u0131z yeterlidir. Sunucu bile\u015fenleri, veri \u00e7ekme i\u015flemlerini do\u011frudan sunucuda ger\u00e7ekle\u015ftirerek, client taraf\u0131ndaki JavaScript y\u00fck\u00fcn\u00fc azalt\u0131r ve uygulaman\u0131n ilk y\u00fcklenme s\u00fcresini (TTFB) h\u0131zland\u0131r\u0131r. Bu, \u00f6zellikle mobil kullan\u0131c\u0131lar i\u00e7in kritik bir performans art\u0131\u015f\u0131d\u0131r. Ayr\u0131ca, yerle\u015fik veri y\u00f6netim mekanizmalar\u0131, Appwrite&#8217;dan notlar\u0131 \u00e7ekme, \u00f6nbelle\u011fe alma ve g\u00fcncellemeleri y\u00f6netme s\u00fcre\u00e7lerini basitle\u015ftirir. TanStack Start&#8217;\u0131n mod\u00fcler yap\u0131s\u0131, gelecekte uygulaman\u0131za yeni \u00f6zellikler eklerken veya mevcut bile\u015fenleri \u00f6l\u00e7eklendirirken size b\u00fcy\u00fck esneklik sa\u011flar. Bu \u00e7er\u00e7eve, React geli\u015ftiricilerine tan\u0131d\u0131k bir ortam sunarken, tam y\u0131\u011f\u0131n geli\u015ftirmenin getirdi\u011fi zorluklar\u0131 modern \u00e7\u00f6z\u00fcmlerle a\u015fmalar\u0131na yard\u0131mc\u0131 olur.<\/p>\n<div class=\"expert-tip\">\n    Uzman \u0130pucu: Bu \u00fc\u00e7l\u00fcn\u00fcn her bir bile\u015feni kendi ba\u015f\u0131na g\u00fc\u00e7l\u00fc olsa da, birlikte kullan\u0131ld\u0131\u011f\u0131nda ortaya \u00e7\u0131kan sinerji, geli\u015ftirme s\u00fcrecinizi katlanarak h\u0131zland\u0131r\u0131r. Appwrite&#8217;\u0131n sa\u011flam arka ucu, TanStack Start&#8217;\u0131n dinamik \u00f6n ucu ve Cursor&#8217;\u0131n ak\u0131ll\u0131 deste\u011fi, ger\u00e7ekten de gelece\u011fin uygulamalar\u0131n\u0131 bug\u00fcn in\u015fa etmenizi sa\u011flar.\n  <\/div>\n<h2>Kurulum ve Proje Ba\u015flatma: \u0130lk Ad\u0131mlar Nelerdir?<\/h2>\n<p>Herhangi bir yaz\u0131l\u0131m geli\u015ftirme projesinde, do\u011fru ba\u015flang\u0131\u00e7 yapmak ve uygun geli\u015ftirme ortam\u0131n\u0131 kurmak, projenin geri kalan\u0131n\u0131n ba\u015far\u0131s\u0131 i\u00e7in temel te\u015fkil eder. Not uygulamam\u0131z i\u00e7in Cursor, Appwrite ve TanStack Start&#8217;\u0131 entegre etmeye ba\u015flamadan \u00f6nce, gerekli ara\u00e7lar\u0131 kurmal\u0131 ve projelerimizi ba\u015flatmal\u0131y\u0131z. Bu b\u00f6l\u00fcm, t\u00fcm bu ilk ad\u0131mlar\u0131 ad\u0131m ad\u0131m a\u00e7\u0131klayacakt\u0131r.<\/p>\n<ol>\n<li>\n      <strong>Node.js ve npm\/Yarn Kurulumu:<\/strong> TanStack Start, Node.js tabanl\u0131 bir \u00e7er\u00e7eve oldu\u011fu i\u00e7in, \u00f6ncelikle sisteminizde Node.js&#8217;in kurulu olmas\u0131 gerekir. Node.js&#8217;in resmi web sitesinden (nodejs.org) en son LTS (Uzun S\u00fcreli Destek) s\u00fcr\u00fcm\u00fcn\u00fc indirip kurabilirsiniz. Kurulumla birlikte npm (Node Package Manager) de otomatik olarak y\u00fcklenecektir. \u0130sterseniz alternatif olarak Yarn veya pnpm gibi farkl\u0131 paket y\u00f6neticilerini de kullanabilirsiniz.\n    <\/li>\n<li>\n      <strong>TanStack Start Projesi Ba\u015flatma:<\/strong> Gerekli paket y\u00f6neticisi kurulduktan sonra, TanStack Start projenizi ba\u015flatmak i\u00e7in komut sat\u0131r\u0131n\u0131z\u0131 a\u00e7\u0131n ve a\u015fa\u011f\u0131daki komutu \u00e7al\u0131\u015ft\u0131r\u0131n:<\/p>\n<pre><code>\n        npm create tanstack-start@latest my-notes-app --template react-ts\n      <\/pre>\n<p><\/code><\/p>\n<p>Bu komut, <code>my-notes-app<\/code> ad\u0131nda yeni bir dizin olu\u015fturacak ve i\u00e7erisine temel bir TanStack Start projesi kuracakt\u0131r. <code>--template react-ts<\/code>, TypeScript destekli React \u015fablonunu kullanaca\u011f\u0131m\u0131z\u0131 belirtir, ki bu da modern ve daha g\u00fcvenli bir geli\u015ftirme deneyimi i\u00e7in \u00f6nerilir. Kurulum tamamland\u0131\u011f\u0131nda, projenin dizinine gidin ve ba\u011f\u0131ml\u0131l\u0131klar\u0131 y\u00fckleyin:<\/p>\n<pre><code>\n        cd my-notes-app\n        npm install\n      <\/pre>\n<p><\/code><\/p>\n<p>Projenin d\u00fczg\u00fcn \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan emin olmak i\u00e7in geli\u015ftirme sunucusunu ba\u015flatabilirsiniz:<\/p>\n<pre><code>\n        npm run dev\n      <\/pre>\n<p><\/code><\/p>\n<p>Taray\u0131c\u0131n\u0131zda <code>http:\/\/localhost:5173<\/code> adresine giderek \u00f6rnek sayfay\u0131 g\u00f6rmeniz gerekir.<\/p>\n<\/li>\n<li>\n      <strong>Appwrite Bulut Hesab\u0131 ve Proje Olu\u015fturma:<\/strong><\/p>\n<ul>\n<li>\u00d6ncelikle, <a href=\"https:\/\/cloud.appwrite.io\/\">Appwrite Cloud<\/a> adresine gidin ve yeni bir hesap olu\u015fturun veya mevcut hesab\u0131n\u0131zla oturum a\u00e7\u0131n.<\/li>\n<li>Kontrol panelinize ula\u015ft\u0131\u011f\u0131n\u0131zda, \"Create Project\" butonuna t\u0131klay\u0131n ve projenize \"My Notes App\" gibi anlaml\u0131 bir isim verin.<\/li>\n<li>Projeniz olu\u015fturulduktan sonra, projenizin ana sayfas\u0131nda size \u00f6zel \"Project ID\" ve \"API Endpoint\" bilgilerini g\u00f6receksiniz. Bu bilgiler, uygulaman\u0131z\u0131n Appwrite ile ileti\u015fim kurmas\u0131 i\u00e7in gerekli olacakt\u0131r. Bu de\u011ferleri bir yere not edin.<\/li>\n<li>Son olarak, uygulaman\u0131z\u0131n Appwrite ile g\u00fcvenli bir \u015fekilde ileti\u015fim kurabilmesi i\u00e7in \"Platforms\" b\u00f6l\u00fcm\u00fcne giderek yeni bir Web platformu eklemeniz gerekecek. \"Add Platform\" ve ard\u0131ndan \"Web\" se\u00e7ene\u011fini t\u0131klay\u0131n. \"Host Name\" alan\u0131na <code>localhost<\/code> ve \"Port\" alan\u0131na <code>5173<\/code> (TanStack Start'\u0131n varsay\u0131lan portu) yaz\u0131n. Geli\u015ftirme ortam\u0131n\u0131zda uygulaman\u0131z\u0131n Appwrite'a eri\u015fmesine izin verecektir.<\/li>\n<\/ul>\n<\/li>\n<li>\n      <strong>Cursor IDE Kurulumu:<\/strong> Cursor, VS Code tabanl\u0131 bir d\u00fczenleyici oldu\u011fundan, kurulumu olduk\u00e7a basittir. Cursor'\u0131n resmi web sitesinden (cursor.sh) i\u015fletim sisteminize uygun s\u00fcr\u00fcm\u00fc indirin ve y\u00fckleyin. Kurulumdan sonra, <code>my-notes-app<\/code> projenizi Cursor i\u00e7inde a\u00e7\u0131n. \u0130lk kez kulland\u0131\u011f\u0131n\u0131zda, Cursor size yapay zeka \u00f6zelliklerini nas\u0131l etkinle\u015ftirece\u011finize dair talimatlar sunacakt\u0131r. Bu ad\u0131mlar\u0131 takip ederek Cursor'\u0131n tam potansiyelinden yararlanmaya haz\u0131r hale gelebilirsiniz. Cursor, sizin i\u00e7in otomatik olarak uzant\u0131lar\u0131 \u00f6nerebilir ve kod tamamlama, kod olu\u015fturma gibi \u00f6zellikleri entegre edecektir.<\/li>\n<\/ol>\n<p>Bu ad\u0131mlar\u0131 tamamlad\u0131ktan sonra, not uygulamam\u0131z\u0131 geli\u015ftirmeye ba\u015flamak i\u00e7in gerekli t\u00fcm ara\u00e7lara ve projelere sahip olacaks\u0131n\u0131z. Her bir bile\u015fenin do\u011fru \u015fekilde kuruldu\u011fundan emin olmak, ileride ya\u015fanabilecek potansiyel sorunlar\u0131n \u00f6n\u00fcne ge\u00e7ecektir.<\/p>\n<h2>Appwrite ile Arka U\u00e7 Kurulumu: Veritaban\u0131 ve Kimlik Do\u011frulama Nas\u0131l Yap\u0131l\u0131r?<\/h2>\n<p>Not uygulamam\u0131z\u0131n temel i\u015flevselli\u011fi, kullan\u0131c\u0131lar\u0131n notlar\u0131n\u0131 g\u00fcvenli bir \u015fekilde saklamas\u0131na ve y\u00f6netmesine dayan\u0131r. Bu i\u015flevselli\u011fi sa\u011flamak i\u00e7in Appwrite'\u0131n veritaban\u0131 ve kimlik do\u011frulama servislerini kullanaca\u011f\u0131z. Bu b\u00f6l\u00fcmde, Appwrite panelinde gerekli yap\u0131land\u0131rmalar\u0131 nas\u0131l yapaca\u011f\u0131m\u0131z\u0131 ve bunlar\u0131 TanStack Start projemizle nas\u0131l entegre edece\u011fimizi ad\u0131m ad\u0131m g\u00f6sterece\u011fiz.<\/p>\n<h3>1. Kimlik Do\u011frulama (Authentication) Kurulumu<\/h3>\n<p>Appwrite, kullan\u0131c\u0131 y\u00f6netimi i\u00e7in g\u00fc\u00e7l\u00fc ve esnek bir kimlik do\u011frulama sistemi sunar. Kullan\u0131c\u0131lar\u0131n e-posta ve \u015fifre ile kay\u0131t olmas\u0131n\u0131 ve oturum a\u00e7mas\u0131n\u0131 sa\u011flayaca\u011f\u0131z.<\/p>\n<ul>\n<li>\n      <strong>Appwrite Panelinde:<\/strong> Projenizin kontrol panelinde sol men\u00fcden \"Auth\" b\u00f6l\u00fcm\u00fcne gidin. Varsay\u0131lan olarak \"Email\/Password\" sa\u011flay\u0131c\u0131s\u0131 etkin olmal\u0131d\u0131r. De\u011filse, bunu etkinle\u015ftirin. Gerekirse, yeni kullan\u0131c\u0131lar\u0131n otomatik olarak do\u011fruland\u0131\u011f\u0131 \"Users\" sekmesindeki \"Self Registration\" ayarlar\u0131n\u0131 kontrol edebilirsiniz. Genellikle, not uygulamalar\u0131 i\u00e7in e-posta do\u011frulama gereksinimi ba\u015flang\u0131\u00e7ta kapat\u0131labilir ve daha sonra eklenebilir.\n    <\/li>\n<\/ul>\n<h3>2. Veritaban\u0131 ve Koleksiyon (Collection) Olu\u015fturma<\/h3>\n<p>Notlar\u0131m\u0131z\u0131 depolamak i\u00e7in Appwrite'\u0131n veritaban\u0131 servisini kullanaca\u011f\u0131z. Her bir not, bir \"document\" olarak saklanacak ve bu document'lar bir \"collection\" i\u00e7inde yer alacak.<\/p>\n<ul>\n<li>\n      <strong>Veritaban\u0131 Olu\u015fturma:<\/strong> Appwrite kontrol panelinde sol men\u00fcden \"Databases\" b\u00f6l\u00fcm\u00fcne gidin. \"Create database\" butonuna t\u0131klay\u0131n ve veritaban\u0131n\u0131za \"NotesDB\" gibi bir isim verin. Olu\u015fturulan veritaban\u0131na t\u0131klayarak i\u00e7ine girin.\n    <\/li>\n<li>\n      <strong>Koleksiyon Olu\u015fturma:<\/strong> \"Create collection\" butonuna t\u0131klay\u0131n. Koleksiyonunuza \"notes\" ad\u0131n\u0131 verin.\n    <\/li>\n<li>\n      <strong>\u00d6znitelikler (Attributes) Tan\u0131mlama:<\/strong> Koleksiyonunuzun i\u00e7ine girdikten sonra \"Attributes\" sekmesine gidin. Notlar\u0131m\u0131z i\u00e7in gerekli \u00f6znitelikleri tan\u0131mlamam\u0131z gerekiyor:<\/p>\n<ul>\n<li><code>title<\/code>: String, Gerekli (Required), Maksimum 255 karakter.<\/li>\n<li><code>content<\/code>: String, Gerekli (Required), Uzun metinler i\u00e7in daha b\u00fcy\u00fck boyut (\u00f6rne\u011fin 10000 karakter).<\/li>\n<li><code>userId<\/code>: String, Gerekli (Required), Notun hangi kullan\u0131c\u0131ya ait oldu\u011funu belirtir. Bu \u00f6znitelik, Appwrite'\u0131n kullan\u0131c\u0131 kimliklerini saklayacakt\u0131r.<\/li>\n<li><code>createdAt<\/code>: Datetime, Gerekli (Required), Varsay\u0131lan de\u011fer olarak <code>Current Time<\/code> se\u00e7ilebilir.<\/li>\n<\/ul>\n<p>Her \u00f6zniteli\u011fi eklerken, ilgili veri tipini (String, Datetime vb.) ve gerekli olup olmad\u0131\u011f\u0131n\u0131 (Required) do\u011fru \u015fekilde se\u00e7ti\u011finizden emin olun.<\/p>\n<\/li>\n<li>\n      <strong>\u0130zinler (Permissions) Ayarlama:<\/strong> \"Permissions\" sekmesine gidin. Bu k\u0131s\u0131m \u00e7ok \u00f6nemlidir. Kimin not olu\u015fturabilece\u011fini, okuyabilece\u011fini, g\u00fcncelleyebilece\u011fini ve silebilece\u011fini belirleyece\u011fiz.<\/p>\n<ul>\n<li><strong>Create:<\/strong> <code>role:member<\/code> (Sadece oturum a\u00e7m\u0131\u015f kullan\u0131c\u0131lar not olu\u015fturabilir).<\/li>\n<li><strong>Read:<\/strong> <code>user:[USER_ID]<\/code> (Her kullan\u0131c\u0131 sadece kendi notlar\u0131n\u0131 okuyabilir).<\/li>\n<li><strong>Update:<\/strong> <code>user:[USER_ID]<\/code> (Her kullan\u0131c\u0131 sadece kendi notlar\u0131n\u0131 g\u00fcncelleyebilir).<\/li>\n<li><strong>Delete:<\/strong> <code>user:[USER_ID]<\/code> (Her kullan\u0131c\u0131 sadece kendi notlar\u0131n\u0131 silebilir).<\/li>\n<\/ul>\n<p>Bu ayarlar, kullan\u0131c\u0131 gizlili\u011fini ve veri g\u00fcvenli\u011fini sa\u011flamak i\u00e7in kritik \u00f6neme sahiptir.<\/p>\n<\/li>\n<\/ul>\n<h3>3. TanStack Start Projesine Appwrite SDK Entegrasyonu<\/h3>\n<p>\u015eimdi Appwrite SDK's\u0131n\u0131 TanStack Start projemize eklememiz ve Appwrite ile ileti\u015fim kuracak temel bir servis olu\u015fturmam\u0131z gerekiyor.<\/p>\n<ul>\n<li>\n      <strong>Appwrite SDK Kurulumu:<\/strong> Projenizin k\u00f6k dizininde terminali a\u00e7\u0131n ve Appwrite SDK's\u0131n\u0131 y\u00fckleyin:<\/p>\n<pre><code>\n        npm install appwrite\n      <\/pre>\n<p><\/code>\n    <\/li>\n<li>\n      <strong>Appwrite \u0130stemci Olu\u015fturma:<\/strong> <code>src\/lib\/appwrite.ts<\/code> gibi bir dosya olu\u015fturarak Appwrite istemcisini ve servislerini yap\u0131land\u0131r\u0131n.<\/p>\n<pre><code>\n        \/\/ src\/lib\/appwrite.ts\n        import { Client, Account, Databases } from 'appwrite';\n\n        const client = new Client();\n\n        client\n            .setEndpoint(import.meta.env.VITE_APPWRITE_ENDPOINT) \/\/ Your Appwrite Endpoint\n            .setProject(import.meta.env.VITE_APPWRITE_PROJECT_ID); \/\/ Your project ID\n\n        export const account = new Account(client);\n        export const databases = new Databases(client);\n\n        export default client;\n      <\/pre>\n<p><\/code><\/p>\n<p><code>import.meta.env<\/code> ile eri\u015filen de\u011fi\u015fkenler, Vite'\u0131n ortam de\u011fi\u015fkenlerini kullanma \u015feklidir. Bu de\u011fi\u015fkenleri tan\u0131mlamak i\u00e7in projenizin k\u00f6k dizininde bir <code>.env<\/code> dosyas\u0131 olu\u015fturman\u0131z gerekecek:<\/p>\n<pre><code>\n        # .env\n        VITE_APPWRITE_ENDPOINT=\"[Appwrite API Endpoint]\" # \u00d6rnek: https:\/\/cloud.appwrite.io\/v1\n        VITE_APPWRITE_PROJECT_ID=\"[Your Project ID]\"     # \u00d6rnek: 654321abcdef\n        VITE_APPWRITE_DATABASE_ID=\"[Your Database ID]\"   # Olu\u015fturdu\u011funuz veritaban\u0131n\u0131n ID'si\n        VITE_APPWRITE_COLLECTION_ID=\"[Your Collection ID]\" # Olu\u015fturdu\u011funuz koleksiyonun ID'si\n      <\/pre>\n<p><\/code><\/p>\n<p>Appwrite panelinden veritaban\u0131 ve koleksiyon ID'lerini almay\u0131 unutmay\u0131n. Bu ad\u0131mlar\u0131 tamamlad\u0131\u011f\u0131n\u0131zda, TanStack Start uygulaman\u0131z Appwrite ile g\u00fcvenli ve verimli bir \u015fekilde etkile\u015fime girmeye haz\u0131r olacakt\u0131r. Arka u\u00e7 taraf\u0131nda yap\u0131lmas\u0131 gereken temel kurulumlar\u0131 ba\u015far\u0131yla tamamlam\u0131\u015f bulunmaktay\u0131z.<\/p>\n<\/ul>\n<h2>TanStack Start ile \u00d6n U\u00e7 Geli\u015ftirme: Notlar\u0131 Y\u00f6netmek \u0130\u00e7in UI Nas\u0131l Olu\u015fturulur?<\/h2>\n<p>Arka u\u00e7 altyap\u0131m\u0131z\u0131 Appwrite ile kurduktan sonra, s\u0131ra kullan\u0131c\u0131lar\u0131n notlar\u0131n\u0131 g\u00f6r\u00fcnt\u00fcleyebilece\u011fi, olu\u015fturabilece\u011fi, d\u00fczenleyebilece\u011fi ve silebilece\u011fi \u00f6n u\u00e7 aray\u00fcz\u00fcn\u00fc geli\u015ftirmeye geldi. TanStack Start'\u0131n sundu\u011fu dosya tabanl\u0131 y\u00f6nlendirme ve React bile\u015fenlerini kullanarak modern ve etkile\u015fimli bir aray\u00fcz in\u015fa edece\u011fiz. Bu k\u0131s\u0131m, uygulaman\u0131z\u0131n kullan\u0131c\u0131larla do\u011frudan etkile\u015fim kurdu\u011fu yerdir, bu nedenle kullan\u0131c\u0131 deneyimine \u00f6zen g\u00f6stermek \u00f6nemlidir.<\/p>\n<h3>1. Temel Uygulama Yap\u0131s\u0131 ve Y\u00f6nlendirme<\/h3>\n<p>TanStack Start, <code>src\/routes<\/code> dizini alt\u0131ndaki dosya ve klas\u00f6r yap\u0131s\u0131na g\u00f6re otomatik olarak y\u00f6nlendirme (routing) yapar. Not uygulamam\u0131z i\u00e7in a\u015fa\u011f\u0131daki gibi bir yap\u0131 olu\u015fturabiliriz:<\/p>\n<pre><code>\n    src\/\n    \u251c\u2500\u2500 routes\/\n    \u2502   \u251c\u2500\u2500 _auth\/          \/\/ Kimlik do\u011frulama ile ilgili rotalar\n    \u2502   \u2502   \u251c\u2500\u2500 register.tsx\n    \u2502   \u2502   \u251c\u2500\u2500 login.tsx\n    \u2502   \u2502   \u2514\u2500\u2500 route.tsx   \/\/ Auth layout'u (\u00f6rne\u011fin header\/footer olmadan)\n    \u2502   \u251c\u2500\u2500 _dashboard\/     \/\/ Oturum a\u00e7m\u0131\u015f kullan\u0131c\u0131lar\u0131n g\u00f6rece\u011fi rotalar\n    \u2502   \u2502   \u251c\u2500\u2500 index.tsx   \/\/ Not listesi sayfas\u0131\n    \u2502   \u2502   \u251c\u2500\u2500 new.tsx     \/\/ Yeni not olu\u015fturma sayfas\u0131\n    \u2502   \u2502   \u251c\u2500\u2500 $noteId.tsx \/\/ Not detay\/d\u00fczenleme sayfas\u0131\n    \u2502   \u2502   \u2514\u2500\u2500 route.tsx   \/\/ Dashboard layout'u (\u00f6rne\u011fin sidebar, header ile)\n    \u2502   \u2514\u2500\u2500 index.tsx       \/\/ Ana sayfa (varsay\u0131lan olarak _auth\/login'e y\u00f6nlendirebilir)\n    \u2514\u2500\u2500 components\/\n    \u2502   \u251c\u2500\u2500 NoteCard.tsx\n    \u2502   \u2514\u2500\u2500 AuthForm.tsx\n    \u2514\u2500\u2500 lib\/\n    \u2502   \u2514\u2500\u2500 appwrite.ts\n    \u2514\u2500\u2500 utils\/\n        \u2514\u2500\u2500 authMiddleware.ts \/\/ Rota korumas\u0131 i\u00e7in\n  <\/pre>\n<p><\/code><\/p>\n<p>Bu yap\u0131, hem okunabilirli\u011fi art\u0131r\u0131r hem de uygulaman\u0131n geni\u015flemesini kolayla\u015ft\u0131r\u0131r. \u00d6rne\u011fin, <code>_auth\/route.tsx<\/code> dosyas\u0131, kay\u0131t ve giri\u015f sayfalar\u0131 i\u00e7in ortak bir d\u00fczen (layout) sa\u011flayabilirken, <code>_dashboard\/route.tsx<\/code> oturum a\u00e7m\u0131\u015f kullan\u0131c\u0131lar i\u00e7in farkl\u0131 bir d\u00fczen sunar. <code>$noteId.tsx<\/code> ise dinamik bir rota olu\u015fturarak URL'deki ID'ye g\u00f6re belirli bir notu getirmemizi sa\u011flar.<\/p>\n<h3>2. Kimlik Do\u011frulama Aray\u00fczleri (Kay\u0131t ve Giri\u015f)<\/h3>\n<p>\u00d6ncelikle kullan\u0131c\u0131lar\u0131n kay\u0131t olabilece\u011fi ve giri\u015f yapabilece\u011fi sayfalar\u0131 olu\u015ftural\u0131m. <code>src\/routes\/_auth\/register.tsx<\/code> ve <code>src\/routes\/_auth\/login.tsx<\/code> dosyalar\u0131nda basit formlar olu\u015fturaca\u011f\u0131z.<\/p>\n<pre><code>\n    \/\/ src\/routes\/_auth\/login.tsx\n    import { account } from '..\/..\/lib\/appwrite';\n    import { useNavigate } from '@tanstack\/react-router';\n    import React, { useState } from 'react';\n\n    export default function LoginPage() {\n      const [email, setEmail] = useState('');\n      const [password, setPassword] = useState('');\n      const navigate = useNavigate();\n\n      const handleSubmit = async (e: React.FormEvent) => {\n        e.preventDefault();\n        try {\n          await account.createEmailPasswordSession(email, password);\n          navigate({ to: '\/dashboard' }); \/\/ Giri\u015f ba\u015far\u0131l\u0131, dashboard'a y\u00f6nlendir\n        } catch (error) {\n          console.error('Login error:', error);\n          alert('Giri\u015f ba\u015far\u0131s\u0131z oldu: ' + error.message);\n        }\n      };\n\n      return (\n        <div className=\"flex justify-center items-center min-h-screen bg-gray-100\">\n          <form onSubmit={handleSubmit} className=\"bg-white p-8 rounded shadow-md w-full max-w-sm\">\n            <h2 className=\"text-2xl font-bold mb-6 text-center\">Giri\u015f Yap<\/h2>\n            <div className=\"mb-4\">\n              <label htmlFor=\"email\" className=\"block text-gray-700 text-sm font-bold mb-2\">E-posta<\/label>\n              <input\n                type=\"email\"\n                id=\"email\"\n                className=\"shadow appearance-none border rounded w-full py-2 px-3 text-gray-700 leading-tight focus:outline-none focus:shadow-outline\"\n                value={email}\n                onChange={(e) => setEmail(e.target.value)}\n                required\n              \/>\n            <\/div>\n            <div className=\"mb-6\">\n              <label htmlFor=\"password\" className=\"block text-gray-700 text-sm font-bold mb-2\">\u015eifre<\/label>\n              <input\n                type=\"password\"\n                id=\"password\"\n                className=\"shadow appearance-none border rounded w-full py-2 px-3 text-gray-700 mb-3 leading-tight focus:outline-none focus:shadow-outline\"\n                value={password}\n                onChange={(e) => setPassword(e.target.value)}\n                required\n              \/>\n            <\/div>\n            <button\n              type=\"submit\"\n              className=\"bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded focus:outline-none focus:shadow-outline w-full\"\n            >\n              Giri\u015f Yap\n            <\/button>\n            <p className=\"text-center text-sm mt-4\">\n              Hesab\u0131n yok mu? <a href=\"\/auth\/register\" className=\"text-blue-500 hover:text-blue-800\">Kay\u0131t Ol<\/a>\n            <\/p>\n          <\/form>\n        <\/div>\n      );\n    }\n  <\/pre>\n<p><\/code><\/p>\n<div class=\"expert-tip\">\n    Uzman \u0130pucu: Bu formlar\u0131n CSS'ini Tailwind CSS gibi bir utility-first \u00e7er\u00e7eve ile d\u00fczenleyerek h\u0131zl\u0131ca modern bir g\u00f6r\u00fcn\u00fcm kazand\u0131rabilirsiniz. TanStack Start projenize Tailwind'i eklemek i\u00e7in ilgili dok\u00fcmantasyona g\u00f6z at\u0131n.\n  <\/div>\n<p>Kay\u0131t sayfas\u0131 (<code>register.tsx<\/code>) benzer bir yap\u0131ya sahip olacak, ancak <code>account.create()<\/code> metodunu kullanacakt\u0131r.<\/p>\n<h3>3. Not Listesi ve Yeni Not Olu\u015fturma<\/h3>\n<p>Kullan\u0131c\u0131 giri\u015f yapt\u0131ktan sonra <code>\/dashboard<\/code> sayfas\u0131na y\u00f6nlendirilecek. Bu sayfada kullan\u0131c\u0131n\u0131n notlar\u0131n\u0131 listeleyecek ve yeni not eklemesi i\u00e7in bir d\u00fc\u011fme sunaca\u011f\u0131z. Notlar\u0131 \u00e7ekerken TanStack Start'\u0131n veri \u00e7ekme mekanizmalar\u0131ndan yararlanabiliriz.<\/p>\n<pre><code>\n    \/\/ src\/routes\/_dashboard\/index.tsx\n    import { createFileRoute, Link } from '@tanstack\/react-router';\n    import { databases, account } from '..\/..\/lib\/appwrite';\n    import { Query } from 'appwrite';\n    import { useQuery } from '@tanstack\/react-query'; \/\/ TanStack Query'yi kullan\u0131yoruz\n\n    \/\/ Bu, TanStack Start'\u0131n veri \u00e7ekme tan\u0131m\u0131n\u0131 i\u00e7erir\n    export const Route = createFileRoute('\/_dashboard\/')({\n      loader: async () => {\n        const user = await account.get(); \/\/ Aktif kullan\u0131c\u0131y\u0131 al\n        if (!user) return { notes: [] }; \/\/ Kullan\u0131c\u0131 yoksa bo\u015f d\u00f6nd\u00fcr\n\n        const response = await databases.listDocuments(\n          import.meta.env.VITE_APPWRITE_DATABASE_ID,\n          import.meta.env.VITE_APPWRITE_COLLECTION_ID,\n          [Query.equal('userId', user.$id), Query.orderDesc('createdAt')] \/\/ Sadece kullan\u0131c\u0131n\u0131n notlar\u0131n\u0131 \u00e7ek\n        );\n        return { notes: response.documents };\n      },\n    });\n\n    export default function NotesListPage() {\n      const { notes } = Route.useLoaderData();\n\n      return (\n        <div className=\"container mx-auto p-4\">\n          <div className=\"flex justify-between items-center mb-6\">\n            <h2 className=\"text-3xl font-bold\">Notlar\u0131m<\/h2>\n            <Link to=\"\/dashboard\/new\" className=\"bg-green-500 hover:bg-green-600 text-white font-bold py-2 px-4 rounded\">\n              Yeni Not Ekle\n            <\/Link>\n          <\/div>\n          {notes.length === 0 ? (\n            <p className=\"text-gray-600 text-center mt-10\">Hen\u00fcz hi\u00e7 notunuz yok. Yeni bir not ekleyin!<\/p>\n          ) : (\n            <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6\">\n              {notes.map((note) => (\n                <Link to={<code>\/dashboard\/${note.$id}<\/code>} key={note.$id} className=\"block\">\n                  <div className=\"bg-white p-6 rounded-lg shadow-md hover:shadow-lg transition-shadow duration-200\">\n                    <h3 className=\"text-xl font-semibold mb-2\">{note.title}<\/h3>\n                    <p className=\"text-gray-700 text-sm line-clamp-3\">{note.content}<\/p>\n                    <p className=\"text-gray-500 text-xs mt-4\">\n                      {new Date(note.createdAt).toLocaleDateString()}\n                    <\/p>\n                  <\/div>\n                <\/Link>\n              ))}\n            <\/div>\n          )}\n        <\/div>\n      );\n    }\n  <\/pre>\n<p><\/code><\/p>\n<p><code>new.tsx<\/code> sayfas\u0131, bir not ba\u015fl\u0131\u011f\u0131 ve i\u00e7eri\u011fi girmek i\u00e7in bir form i\u00e7erecek ve bu verileri Appwrite'a g\u00f6nderecektir. Appwrite SDK's\u0131n\u0131n <code>databases.createDocument()<\/code> metodunu kullanaca\u011f\u0131z.<\/p>\n<h3>4. Not Detay ve D\u00fczenleme<\/h3>\n<p><code>src\/routes\/_dashboard\/$noteId.tsx<\/code> dosyas\u0131, belirli bir notun detaylar\u0131n\u0131 g\u00f6stermek ve d\u00fczenlemek i\u00e7in kullan\u0131lacak. URL'den <code>$noteId<\/code> parametresini alarak Appwrite'dan ilgili notu \u00e7ekece\u011fiz.<\/p>\n<pre><code>\n    \/\/ src\/routes\/_dashboard\/$noteId.tsx\n    import { createFileRoute, useNavigate } from '@tanstack\/react-router';\n    import { databases, account } from '..\/..\/lib\/appwrite';\n    import { useState } from 'react';\n\n    export const Route = createFileRoute('\/_dashboard\/$noteId')({\n      loader: async ({ params }) => {\n        const user = await account.get();\n        if (!user) throw new Error(\"Unauthorized\");\n        const note = await databases.getDocument(\n          import.meta.env.VITE_APPWRITE_DATABASE_ID,\n          import.meta.env.VITE_APPWRITE_COLLECTION_ID,\n          params.noteId\n        );\n        if (note.userId !== user.$id) throw new Error(\"Forbidden\"); \/\/ Notun kullan\u0131c\u0131ya ait oldu\u011funu kontrol et\n        return { note };\n      },\n    });\n\n    export default function NoteDetailPage() {\n      const { note } = Route.useLoaderData();\n      const [title, setTitle] = useState(note.title);\n      const [content, setContent] = useState(note.content);\n      const navigate = useNavigate();\n\n      const handleUpdate = async (e: React.FormEvent) => {\n        e.preventDefault();\n        try {\n          await databases.updateDocument(\n            import.meta.env.VITE_APPWRITE_DATABASE_ID,\n            import.meta.env.VITE_APPWRITE_COLLECTION_ID,\n            note.$id,\n            { title, content }\n          );\n          navigate({ to: '\/dashboard' });\n        } catch (error) {\n          console.error('Not g\u00fcncelleme hatas\u0131:', error);\n          alert('Not g\u00fcncellenirken bir hata olu\u015ftu.');\n        }\n      };\n\n      const handleDelete = async () => {\n        if (!confirm('Bu notu silmek istedi\u011finizden emin misiniz?')) return;\n        try {\n          await databases.deleteDocument(\n            import.meta.env.VITE_APPWRITE_DATABASE_ID,\n            import.meta.env.VITE_APPWRITE_COLLECTION_ID,\n            note.$id\n          );\n          navigate({ to: '\/dashboard' });\n        } catch (error) {\n          console.error('Not silme hatas\u0131:', error);\n          alert('Not silinirken bir hata olu\u015ftu.');\n        }\n      };\n\n      return (\n        <div className=\"container mx-auto p-4 max-w-2xl\">\n          <form onSubmit={handleUpdate} className=\"bg-white p-8 rounded shadow-md\">\n            <h2 className=\"text-3xl font-bold mb-6 text-center\">Notu D\u00fczenle<\/h2>\n            <div className=\"mb-4\">\n              <label htmlFor=\"title\" className=\"block text-gray-700 text-sm font-bold mb-2\">Ba\u015fl\u0131k<\/label>\n              <input\n                type=\"text\"\n                id=\"title\"\n                className=\"shadow appearance-none border rounded w-full py-2 px-3 text-gray-700 leading-tight focus:outline-none focus:shadow-outline\"\n                value={title}\n                onChange={(e) => setTitle(e.target.value)}\n                required\n              \/>\n            <\/div>\n            <div className=\"mb-6\">\n              <label htmlFor=\"content\" className=\"block text-gray-700 text-sm font-bold mb-2\">\u0130\u00e7erik<\/label>\n              <textarea\n                id=\"content\"\n                className=\"shadow appearance-none border rounded w-full py-2 px-3 text-gray-700 leading-tight focus:outline-none focus:shadow-outline h-48 resize-none\"\n                value={content}\n                onChange={(e) => setContent(e.target.value)}\n                required\n              ><\/textarea>\n            <\/div>\n            <div className=\"flex justify-between\">\n              <button\n                type=\"submit\"\n                className=\"bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded focus:outline-none focus:shadow-outline\"\n              >\n                Kaydet\n              <\/button>\n              <button\n                type=\"button\"\n                onClick={handleDelete}\n                className=\"bg-red-500 hover:bg-red-700 text-white font-bold py-2 px-4 rounded focus:outline-none focus:shadow-outline\"\n              >\n                Sil\n              <\/button>\n            <\/div>\n          <\/form>\n        <\/div>\n      );\n    }\n  <\/pre>\n<p><\/code><\/p>\n<p>Bu kod bloklar\u0131, TanStack Start ve Appwrite SDK's\u0131n\u0131 kullanarak not uygulamam\u0131z\u0131n temel \u00f6n u\u00e7 i\u015flevselli\u011fini nas\u0131l olu\u015fturaca\u011f\u0131m\u0131za dair size sa\u011flam bir ba\u015flang\u0131\u00e7 noktas\u0131 sunar. Bu yap\u0131y\u0131 geni\u015fleterek daha karma\u015f\u0131k \u00f6zellikler (\u00f6rne\u011fin, not arama, etiketleme) ekleyebilirsiniz.<\/p>\n<h2>Yapay Zeka Deste\u011fi ile Kodlama: Cursor Not Uygulaman\u0131za Nas\u0131l Yard\u0131mc\u0131 Olur?<\/h2>\n<p>\u015eimdiye kadar Appwrite ile arka ucu ve TanStack Start ile \u00f6n ucu manuel olarak in\u015fa ettik. Ancak, Cursor gibi bir yapay zeka destekli kodlama arac\u0131, bu s\u00fcre\u00e7leri \u00e7ok daha verimli hale getirebilir. Cursor, kod yazma, hata ay\u0131klama ve mevcut kodu iyile\u015ftirme konusunda size rehberlik ederek geli\u015ftirme h\u0131z\u0131n\u0131z\u0131 art\u0131r\u0131r.<\/p>\n<h3>1. Boilerplate Kod Olu\u015fturma<\/h3>\n<p>Not uygulamas\u0131 gibi standart CRUD (Create, Read, Update, Delete) operasyonlar\u0131 i\u00e7eren projelerde, belirli bir yap\u0131y\u0131 takip eden bir\u00e7ok tekrarlayan kod blo\u011fu bulunur. Cursor, bu t\u00fcr boilerplate kodlar\u0131 saniyeler i\u00e7inde olu\u015fturarak size zaman kazand\u0131rabilir.<\/p>\n<p><strong>Vaka Analizi: Yeni Not Formu Olu\u015fturma<\/strong><\/p>\n<p><code>src\/routes\/_dashboard\/new.tsx<\/code> dosyas\u0131nda yeni bir not olu\u015fturma formu yazman\u0131z gerekti\u011fini varsayal\u0131m. Cursor'\u0131 kullanarak bu s\u00fcreci h\u0131zland\u0131rabiliriz:<\/p>\n<ol>\n<li><code>new.tsx<\/code> dosyas\u0131n\u0131 a\u00e7\u0131n.<\/li>\n<li>Cursor'\u0131n sohbet aray\u00fcz\u00fcn\u00fc (genellikle Ctrl\/Cmd + K tu\u015f kombinasyonuyla a\u00e7\u0131l\u0131r) a\u00e7\u0131n.<\/li>\n<li>\u015eu komutu girin: \"Appwrite SDK kullanarak bir not olu\u015fturma formu i\u00e7in React bile\u015feni olu\u015ftur. Formda ba\u015fl\u0131k ve i\u00e7erik alanlar\u0131 olsun. Ba\u015far\u0131l\u0131 olursa kullan\u0131c\u0131y\u0131 \/dashboard'a y\u00f6nlendir.\"<\/li>\n<\/ol>\n<p>Cursor, b\u00fcy\u00fck olas\u0131l\u0131kla a\u015fa\u011f\u0131daki gibi bir kod iskeleti \u00fcretecektir. \u00dcretilen kodun tam olarak Appwrite SDK's\u0131na entegre olmas\u0131 i\u00e7in k\u00fc\u00e7\u00fck d\u00fczenlemeler yapman\u0131z gerekebilir, ancak ba\u015flang\u0131\u00e7 i\u00e7in harika bir temel sunar:<\/p>\n<pre><code>\n    \/\/ Cursor taraf\u0131ndan \u00fcretilen taslak\n    import React, { useState } from 'react';\n    import { useNavigate } from '@tanstack\/react-router';\n    \/\/ Buraya Appwrite import'lar\u0131n\u0131z\u0131 ve fonksiyonlar\u0131n\u0131z\u0131 eklemelisiniz\n    import { databases, account } from '..\/..\/lib\/appwrite';\n    import { ID } from 'appwrite'; \/\/ Appwrite ID'si i\u00e7in\n\n    export default function NewNotePage() {\n      const [title, setTitle] = useState('');\n      const [content, setContent] = useState('');\n      const navigate = useNavigate();\n\n      const handleSubmit = async (e: React.FormEvent) => {\n        e.preventDefault();\n        try {\n          const user = await account.get(); \/\/ Aktif kullan\u0131c\u0131y\u0131 al\n          if (!user) {\n            alert(\"L\u00fctfen giri\u015f yap\u0131n.\");\n            return;\n          }\n\n          await databases.createDocument(\n            import.meta.env.VITE_APPWRITE_DATABASE_ID,\n            import.meta.env.VITE_APPWRITE_COLLECTION_ID,\n            ID.unique(), \/\/ Otomatik ID olu\u015ftur\n            {\n              title,\n              content,\n              userId: user.$id,\n              createdAt: new Date().toISOString(),\n            }\n          );\n          navigate({ to: '\/dashboard' });\n        } catch (error) {\n          console.error('Not olu\u015fturma hatas\u0131:', error);\n          alert('Not olu\u015fturulurken bir hata olu\u015ftu: ' + error.message);\n        }\n      };\n\n      return (\n        <div className=\"container mx-auto p-4 max-w-2xl\">\n          <form onSubmit={handleSubmit} className=\"bg-white p-8 rounded shadow-md\">\n            <h2 className=\"text-3xl font-bold mb-6 text-center\">Yeni Not Olu\u015ftur<\/h2>\n            <div className=\"mb-4\">\n              <label htmlFor=\"title\" className=\"block text-gray-700 text-sm font-bold mb-2\">Ba\u015fl\u0131k<\/label>\n              <input\n                type=\"text\"\n                id=\"title\"\n                className=\"shadow appearance-none border rounded w-full py-2 px-3 text-gray-700 leading-tight focus:outline-none focus:shadow-outline\"\n                value={title}\n                onChange={(e) => setTitle(e.target.value)}\n                required\n              \/>\n            <\/div>\n            <div className=\"mb-6\">\n              <label htmlFor=\"content\" className=\"block text-gray-700 text-sm font-bold mb-2\">\u0130\u00e7erik<\/label>\n              <textarea\n                id=\"content\"\n                className=\"shadow appearance-none border rounded w-full py-2 px-3 text-gray-700 leading-tight focus:outline-none focus:shadow-outline h-48 resize-none\"\n                value={content}\n                onChange={(e) => setContent(e.target.value)}\n                required\n              ><\/textarea>\n            <\/div>\n            <button\n              type=\"submit\"\n              className=\"bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded focus:outline-none focus:shadow-outline w-full\"\n            >\n              Notu Kaydet\n            <\/button>\n          <\/form>\n        <\/div>\n      );\n    }\n  <\/pre>\n<p><\/code><\/p>\n<h3>2. Hata Ay\u0131klama (Debugging) ve Kod \u0130yile\u015ftirme<\/h3>\n<p>Cursor, sadece kod yazmakla kalmaz, ayn\u0131 zamanda mevcut kodunuzdaki hatalar\u0131 bulman\u0131za ve iyile\u015ftirmeler yapman\u0131za da yard\u0131mc\u0131 olur. Uygulaman\u0131zda bir hata ile kar\u015f\u0131la\u015ft\u0131\u011f\u0131n\u0131zda (\u00f6rne\u011fin, notlar\u0131n listelenmemesi), Cursor'a sorunu a\u00e7\u0131klayarak \u00e7\u00f6z\u00fcm \u00f6nerileri alabilirsiniz.<\/p>\n<p><strong>Vaka Analizi: Not Listeleme Hatas\u0131n\u0131 Ay\u0131klama<\/strong><\/p>\n<p>Diyelim ki not listeleme sayfan\u0131zda notlar g\u00f6r\u00fcnm\u00fcyor ve konsolda bir hata al\u0131yorsunuz. Cursor'\u0131 kullanarak bu sorunu \u00e7\u00f6zmeye \u00e7al\u0131\u015fal\u0131m:<\/p>\n<ol>\n<li>Hata veren kod blo\u011funu se\u00e7in (<code>NotesListPage<\/code> bile\u015feni veya <code>loader<\/code> fonksiyonu).<\/li>\n<li>Cursor'\u0131n sohbet aray\u00fcz\u00fcn\u00fc a\u00e7\u0131n.<\/li>\n<li>\u015eu komutu girin: \"Bu kod neden notlar\u0131 listelemiyor? Konsolda 'Error: Permission denied' hatas\u0131n\u0131 g\u00f6r\u00fcyorum.\"<\/li>\n<\/ol>\n<p>Cursor, Appwrite izin ayarlar\u0131n\u0131z\u0131 kontrol etmenizi, <code>userId<\/code> filtresinin do\u011fru oldu\u011fundan emin olman\u0131z\u0131 veya Appwrite SDK \u00e7a\u011fr\u0131lar\u0131n\u0131n hatas\u0131z oldu\u011fundan emin olman\u0131z\u0131 \u00f6nerebilir. Ayr\u0131ca, kodu daha verimli hale getirmek i\u00e7in farkl\u0131 sorgu yakla\u015f\u0131mlar\u0131 veya veri \u00f6nbellekleme stratejileri \u00f6nerebilir.<\/p>\n<p>\u00d6rne\u011fin, not listeleme loader'\u0131ndaki <code>Query.equal('userId', user.$id)<\/code> k\u0131sm\u0131n\u0131 g\u00f6zden ge\u00e7irmenizi ve Appwrite koleksiyonunuzdaki izinlerin (ACL) do\u011fru bir \u015fekilde <code>user:[USER_ID]<\/code> olarak ayarland\u0131\u011f\u0131ndan emin olman\u0131z\u0131 \u00f6nerebilir. E\u011fer <code>userId<\/code> alan\u0131 yanl\u0131\u015f tan\u0131mlanm\u0131\u015fsa veya Appwrite'ta eksik izin varsa, Cursor bu t\u00fcr sorunlar\u0131 h\u0131zl\u0131ca tespit etmenize yard\u0131mc\u0131 olabilir.<\/p>\n<h3>3. Kod Refactoring ve Optimizasyon<\/h3>\n<p>Uygulama b\u00fcy\u00fcd\u00fck\u00e7e kodunuzu yeniden yap\u0131land\u0131rmak (refactoring) ve optimize etmek \u00f6nemlidir. Cursor, bu s\u00fcre\u00e7te de size destek olabilir.<\/p>\n<p><strong>Vaka Analizi: Yard\u0131mc\u0131 Fonksiyon Olu\u015fturma<\/strong><\/p>\n<p>Appwrite veritaban\u0131 ID'si ve koleksiyon ID'si gibi bilgileri her yerde tekrarlamak yerine, bunlar\u0131 merkezi bir yere ta\u015f\u0131yan bir yard\u0131mc\u0131 fonksiyon olu\u015fturmak isteyebilirsiniz:<\/p>\n<ol>\n<li>\u0130lgili Appwrite \u00e7a\u011fr\u0131lar\u0131n\u0131 i\u00e7eren bir kodu se\u00e7in.<\/li>\n<li>Cursor'a \"Bu Appwrite \u00e7a\u011fr\u0131lar\u0131n\u0131 basitle\u015ftirmek i\u00e7in bir yard\u0131mc\u0131 fonksiyon olu\u015fturabilir misin? Veritaban\u0131 ve koleksiyon ID'leri ortam de\u011fi\u015fkenlerinden gelsin.\" deyin.<\/li>\n<\/ol>\n<p>Cursor, <code>src\/utils\/appwriteHelpers.ts<\/code> gibi bir dosyada \u015fu t\u00fcr bir fonksiyon \u00f6nerebilir:<\/p>\n<pre><code>\n    \/\/ src\/utils\/appwriteHelpers.ts\n    import { databases, account } from '..\/lib\/appwrite';\n    import { ID, Query } from 'appwrite';\n\n    const DB_ID = import.meta.env.VITE_APPWRITE_DATABASE_ID;\n    const COLLECTION_ID = import.meta.env.VITE_APPWRITE_COLLECTION_ID;\n\n    export async function getNotesForCurrentUser() {\n      try {\n        const user = await account.get();\n        if (!user) return [];\n        const response = await databases.listDocuments(\n          DB_ID,\n          COLLECTION_ID,\n          [Query.equal('userId', user.$id), Query.orderDesc('createdAt')]\n        );\n        return response.documents;\n      } catch (error) {\n        console.error('Kullan\u0131c\u0131 notlar\u0131 getirilirken hata olu\u015ftu:', error);\n        return [];\n      }\n    }\n\n    export async function createNote(title: string, content: string) {\n      try {\n        const user = await account.get();\n        if (!user) throw new Error(\"Kullan\u0131c\u0131 giri\u015fi yap\u0131lmad\u0131.\");\n        const newNote = await databases.createDocument(\n          DB_ID,\n          COLLECTION_ID,\n          ID.unique(),\n          {\n            title,\n            content,\n            userId: user.$id,\n            createdAt: new Date().toISOString(),\n          }\n        );\n        return newNote;\n      } catch (error) {\n        console.error('Not olu\u015fturulurken hata olu\u015ftu:', error);\n        throw error;\n      }\n    }\n\n    \/\/ Di\u011fer CRUD fonksiyonlar\u0131 (updateNote, deleteNote) da buraya eklenebilir.\n  <\/pre>\n<p><\/code><\/p>\n<p>Ard\u0131ndan, \u00f6n u\u00e7 bile\u015fenlerinizde bu yard\u0131mc\u0131 fonksiyonlar\u0131 i\u00e7e aktararak kodunuzu daha temiz ve y\u00f6netilebilir hale getirebilirsiniz. Cursor, bu t\u00fcr yap\u0131sal iyile\u015ftirmeler i\u00e7in size ak\u0131ll\u0131ca \u00f6neriler sunarak kod kalitenizi art\u0131rman\u0131za yard\u0131mc\u0131 olur. Yapay zeka deste\u011fiyle, geli\u015ftiriciler daha h\u0131zl\u0131 prototip olu\u015fturabilir, daha az hata yapabilir ve daha y\u00fcksek kaliteli kod yazabilirler.<\/p>\n<h2>\u0130leri D\u00fczey Optimizasyonlar ve En \u0130yi Uygulamalar<\/h2>\n<p>Uygulamam\u0131z\u0131n temel i\u015flevselli\u011fini olu\u015ftursak da, ger\u00e7ek d\u00fcnya senaryolar\u0131nda bir uygulaman\u0131n sadece \u00e7al\u0131\u015fmas\u0131 yeterli de\u011fildir. Performans, kullan\u0131c\u0131 deneyimi, g\u00fcvenlik ve \u00f6l\u00e7eklenebilirlik gibi fakt\u00f6rler, bir uygulaman\u0131n ba\u015far\u0131s\u0131 i\u00e7in hayati \u00f6neme sahiptir. Bu b\u00f6l\u00fcmde, not uygulamam\u0131z\u0131 daha ileriye ta\u015f\u0131mak i\u00e7in baz\u0131 optimizasyonlar ve en iyi uygulamalar\u0131 inceleyece\u011fiz.<\/p>\n<h3>1. Performans ve Kullan\u0131c\u0131 Deneyimi \u0130\u00e7in \u0130pu\u00e7lar\u0131<\/h3>\n<ul>\n<li>\n      <strong>Veri \u00d6nbellekleme (Caching) ve Tekrar Do\u011frulama (Revalidation):<\/strong> TanStack Start, React Query (eski ad\u0131yla TanStack Query) ile derinlemesine entegredir. Not listesini \u00e7ekti\u011fimizde, bu veriler varsay\u0131lan olarak \u00f6nbelle\u011fe al\u0131n\u0131r. Ancak, notlar g\u00fcncellendi\u011finde veya silindi\u011finde \u00f6nbelle\u011fi ge\u00e7ersiz k\u0131lmak ve verileri yeniden \u00e7ekmek \u00f6nemlidir. Appwrite'\u0131n ger\u00e7ek zamanl\u0131 (realtime) \u00f6zellikleri, bu s\u00fcreci otomatikle\u015ftirmek i\u00e7in kullan\u0131labilir. Appwrite'\u0131n real-time API'sini kullanarak, bir not g\u00fcncellendi\u011finde veya silindi\u011finde \u00f6n u\u00e7ta ilgili \u00f6nbelle\u011fi ge\u00e7ersiz k\u0131labiliriz.<\/p>\n<pre><code>\n        \/\/ Appwrite ger\u00e7ek zamanl\u0131 dinleyici \u00f6rne\u011fi (k\u0131smi)\n        import { client } from '..\/..\/lib\/appwrite';\n        import { QueryClient } from '@tanstack\/react-query'; \/\/ E\u011fer react-query kullan\u0131yorsan\u0131z\n\n        const queryClient = new QueryClient(); \/\/ \u00d6nbelle\u011fi y\u00f6netmek i\u00e7in\n\n        client.subscribe(<code>databases.${import.meta.env.VITE_APPWRITE_DATABASE_ID}.collections.${import.meta.env.VITE_APPWRITE_COLLECTION_ID}.documents<\/code>, (response) => {\n          if (response.events.includes('databases.*.collections.*.documents.*.update') ||\n              response.events.includes('databases.*.collections.*.documents.*.delete')) {\n            queryClient.invalidateQueries(['notes']); \/\/ 'notes' sorgusunun \u00f6nbelle\u011fini ge\u00e7ersiz k\u0131l\n          }\n        });\n      <\/pre>\n<p><\/code><\/p>\n<p>Bu, kullan\u0131c\u0131lar\u0131n her zaman en g\u00fcncel veriyi g\u00f6rmesini sa\u011flar ve gereksiz API \u00e7a\u011fr\u0131lar\u0131n\u0131 \u00f6nler.<\/p>\n<\/li>\n<li>\n      <strong>Sayfalama (Pagination) ve Sonsuz Kayd\u0131rma (Infinite Scrolling):<\/strong> E\u011fer kullan\u0131c\u0131n\u0131n \u00e7ok fazla notu varsa, hepsini ayn\u0131 anda y\u00fcklemek performans\u0131 d\u00fc\u015f\u00fcrebilir. Appwrite'\u0131n <code>listDocuments<\/code> metodu, <code>limit<\/code> ve <code>offset<\/code> (veya <code>cursor<\/code>) se\u00e7enekleriyle sayfalama yapmay\u0131 destekler. Not listeleme sayfan\u0131zda bu \u00f6zelliklerden yararlanarak sadece belirli say\u0131da notu y\u00fckleyebilir, kullan\u0131c\u0131 daha fazla not g\u00f6rmek istedi\u011finde ek notlar\u0131 \u00e7ekebilirsiniz. Bu, uygulaman\u0131n daha h\u0131zl\u0131 y\u00fcklenmesini ve daha ak\u0131c\u0131 bir kullan\u0131c\u0131 deneyimi sunmas\u0131n\u0131 sa\u011flar.<\/p>\n<pre><code>\n        \/\/ Sayfalama \u00f6rne\u011fi (loader i\u00e7inde)\n        \/\/ [Query.limit(10), Query.offset(0)] \/\/ \u0130lk 10 notu getir\n        \/\/ Bir sonraki 10 not i\u00e7in offset'i 10 art\u0131r\u0131n.\n      <\/pre>\n<p><\/code>\n    <\/li>\n<li>\n      <strong>Optimistik G\u00fcncellemeler (Optimistic Updates):<\/strong> Kullan\u0131c\u0131 bir notu g\u00fcncelledi\u011finde veya sildi\u011finde, API \u00e7a\u011fr\u0131s\u0131 tamamlanmadan \u00f6nce UI'\u0131 g\u00fcncellemek, uygulamay\u0131 daha duyarl\u0131 hissettirir. \u0130\u015flem ba\u015far\u0131l\u0131 olmazsa, UI eski durumuna geri d\u00f6nd\u00fcr\u00fclebilir. React Query bu t\u00fcr optimistik g\u00fcncellemeler i\u00e7in harika ara\u00e7lar sunar.\n    <\/li>\n<\/ul>\n<h3>2. Mobil Uyumluluk: Responsive Tasar\u0131m\u0131 Nas\u0131l Sa\u011flars\u0131n\u0131z?<\/h3>\n<p>G\u00fcn\u00fcm\u00fczde mobil cihazlardan eri\u015fim, masa\u00fcst\u00fc eri\u015fiminden \u00e7ok daha yayg\u0131n hale gelmi\u015ftir. Bu nedenle not uygulamam\u0131z\u0131n her t\u00fcrl\u00fc cihazda harika g\u00f6r\u00fcnmesi ve \u00e7al\u0131\u015fmas\u0131 kritik \u00f6neme sahiptir.<\/p>\n<ul>\n<li>\n      <strong>Meta Viewport Etiketi:<\/strong> HTML'inizin <code><head><\/code> b\u00f6l\u00fcm\u00fcne a\u015fa\u011f\u0131daki meta etiketini eklemek, taray\u0131c\u0131n\u0131n sayfay\u0131 cihaz\u0131n geni\u015fli\u011fine g\u00f6re do\u011fru bir \u015fekilde \u00f6l\u00e7eklendirmesini sa\u011flar:<\/p>\n<pre><code>\n        <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n      <\/pre>\n<p><\/code>\n    <\/li>\n<li>\n      <strong>Esnek D\u00fczenler ve Ak\u0131\u015fkan Birimler:<\/strong> CSS Flexbox ve Grid, responsive d\u00fczenler olu\u015fturmak i\u00e7in m\u00fckemmel ara\u00e7lard\u0131r. Bile\u015fenlerinizin geni\u015fliklerini y\u00fczde (%) birimleri, <code>vw<\/code>\/<code>vh<\/code> veya <code>rem<\/code>\/<code>em<\/code> gibi ak\u0131\u015fkan birimlerle tan\u0131mlay\u0131n.\n    <\/li>\n<li>\n      <strong>Medya Sorgular\u0131 (Media Queries):<\/strong> Belirli ekran boyutlar\u0131na g\u00f6re farkl\u0131 stiller uygulamak i\u00e7in medya sorgular\u0131n\u0131 kullan\u0131n. \u00d6rne\u011fin, k\u00fc\u00e7\u00fck ekranlarda not kartlar\u0131n\u0131n tek s\u00fctunlu olmas\u0131n\u0131, daha b\u00fcy\u00fck ekranlarda ise birden fazla s\u00fctuna yay\u0131lmas\u0131n\u0131 sa\u011flayabilirsiniz.<\/p>\n<pre><code>\n        <style>\n          .note-grid {\n            display: grid;\n            grid-template-columns: 1fr; \/* Mobil: Tek s\u00fctun *\/\n            gap: 1.5rem;\n          }\n\n          @media (min-width: 768px) { \/* Tablet ve \u00fczeri *\/\n            .note-grid {\n              grid-template-columns: repeat(2, 1fr); \/* Tablet: \u0130ki s\u00fctun *\/\n            }\n          }\n\n          @media (min-width: 1024px) { \/* Masa\u00fcst\u00fc *\/\n            .note-grid {\n              grid-template-columns: repeat(3, 1fr); \/* Masa\u00fcst\u00fc: \u00dc\u00e7 s\u00fctun *\/\n            }\n          }\n        <\/style>\n      <\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki \u00f6rnekte Tailwind CSS s\u0131n\u0131flar\u0131n\u0131 kullanmasak da, temel prensibi anlamak \u00f6nemlidir. Tailwind CSS gibi \u00e7er\u00e7eveler, bu medya sorgular\u0131n\u0131 utility s\u0131n\u0131flar\u0131 arac\u0131l\u0131\u011f\u0131yla zaten soyutlayarak geli\u015ftirme s\u00fcrecini daha da kolayla\u015ft\u0131r\u0131r (\u00f6rne\u011fin, <code>grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3<\/code>).<\/p>\n<\/li>\n<\/ul>\n<h3>3. G\u00fcvenlik \u00d6nlemleri ve Appwrite \u0130pu\u00e7lar\u0131<\/h3>\n<ul>\n<li>\n      <strong>Appwrite \u0130zinleri (ACL - Access Control List):<\/strong> Not koleksiyonumuzda belirledi\u011fimiz izinler (<code>user:[USER_ID]<\/code>), her kullan\u0131c\u0131n\u0131n sadece kendi notlar\u0131na eri\u015fmesini sa\u011flayarak temel veri g\u00fcvenli\u011fini sa\u011flar. Bu, en \u00f6nemli g\u00fcvenlik \u00f6nlemlerinden biridir ve dikkatlice ayarlanmal\u0131d\u0131r. Asla frontend'den gelebilecek verilere k\u00f6r\u00fc k\u00f6r\u00fcne g\u00fcvenmeyin; Appwrite'\u0131n arka u\u00e7 izin mekanizmas\u0131 her zaman devrede olmal\u0131d\u0131r.\n    <\/li>\n<li>\n      <strong>Sunucu Taraf\u0131 Do\u011frulama (Server-Side Validation):<\/strong> Frontend taraf\u0131nda form do\u011frulama yapmak iyi bir kullan\u0131c\u0131 deneyimi sa\u011flasa da, nihai do\u011frulama her zaman arka u\u00e7ta yap\u0131lmal\u0131d\u0131r. Appwrite, koleksiyon \u00f6zniteliklerini tan\u0131mlarken belirledi\u011fimiz veri tipleri ve gereklilik k\u0131s\u0131tlamalar\u0131 (required, max length vb.) ile otomatik do\u011frulama yapar. Bu, ge\u00e7ersiz veya k\u00f6t\u00fc niyetli verilerin veritaban\u0131na kaydedilmesini \u00f6nler.\n    <\/li>\n<li>\n      <strong>Ortam De\u011fi\u015fkenlerinin G\u00fcvenli\u011fi:<\/strong> Appwrite API endpoint ve proje ID'si gibi hassas bilgileri do\u011frudan kodunuzda b\u0131rakmak yerine, <code>.env<\/code> dosyalar\u0131 veya sunucu taraf\u0131 ortam de\u011fi\u015fkenleri arac\u0131l\u0131\u011f\u0131yla y\u00f6netin. Vite (TanStack Start'\u0131n kulland\u0131\u011f\u0131 ara\u00e7), <code>import.meta.env<\/code> ile bu de\u011fi\u015fkenlere eri\u015fmenizi sa\u011flar. Ancak bu de\u011fi\u015fkenler client taraf\u0131nda g\u00f6r\u00fcn\u00fcr olaca\u011f\u0131ndan, <em>API gizli anahtarlar\u0131n\u0131 asla bu \u015fekilde kullanmay\u0131n<\/em>. Client-side SDK'lar i\u00e7in sadece public ID'ler kullan\u0131lmal\u0131d\u0131r.\n    <\/li>\n<li>\n      <strong>HTTPS Kullan\u0131m\u0131:<\/strong> Uygulaman\u0131z\u0131n canl\u0131ya al\u0131nd\u0131\u011f\u0131nda her zaman HTTPS \u00fczerinden yay\u0131nland\u0131\u011f\u0131ndan emin olun. Appwrite Cloud otomatik olarak HTTPS kullan\u0131r. Kendi sunucunuzda Appwrite kuruyorsan\u0131z, bir ters proxy (Nginx, Caddy) ile SSL\/TLS sertifikalar\u0131n\u0131 yap\u0131land\u0131rmal\u0131s\u0131n\u0131z.\n    <\/li>\n<\/ul>\n<p>Bu ileri d\u00fczey konulara odaklanarak, sadece \u00e7al\u0131\u015fan de\u011fil, ayn\u0131 zamanda h\u0131zl\u0131, g\u00fcvenli ve kullan\u0131c\u0131 dostu bir not uygulamas\u0131 geli\u015ftirebilirsiniz.<\/p>\n<h2>Sonu\u00e7: Gelece\u011fin Uygulamalar\u0131n\u0131 Bug\u00fcn \u0130n\u015fa Etmek<\/h2>\n<p>Bu kapsaml\u0131 rehber boyunca, Cursor'\u0131n yapay zeka destekli kodlama yeteneklerini, Appwrite'\u0131n g\u00fc\u00e7l\u00fc ve y\u00f6netimi kolay arka u\u00e7 servislerini ve TanStack Start'\u0131n modern \u00f6n u\u00e7 mimarisini bir araya getirerek nas\u0131l eksiksiz bir tam y\u0131\u011f\u0131n not uygulamas\u0131 geli\u015ftirebilece\u011fimizi ad\u0131m ad\u0131m inceledik. Geleneksel geli\u015ftirme s\u00fcre\u00e7lerinin karma\u015f\u0131kl\u0131\u011f\u0131n\u0131 basitle\u015ftirerek, bu teknoloji y\u0131\u011f\u0131n\u0131n\u0131n geli\u015ftiricilere sa\u011flad\u0131\u011f\u0131 h\u0131z\u0131, verimlili\u011fi ve \u00f6l\u00e7eklenebilirli\u011fi net bir \u015fekilde g\u00f6rd\u00fck.<\/p>\n<p>Ba\u015flang\u0131\u00e7ta temel kavramlar\u0131 tan\u0131d\u0131k, ard\u0131ndan Appwrite \u00fczerinde g\u00fcvenli kimlik do\u011frulama ve veritaban\u0131 yap\u0131s\u0131n\u0131 kurduk. Sonras\u0131nda, TanStack Start'\u0131n esnek y\u00f6nlendirme ve veri \u00e7ekme yetenekleriyle kullan\u0131c\u0131 aray\u00fcz\u00fcn\u00fc in\u015fa ettik. En \u00f6nemlisi, Cursor'\u0131n yapay zeka deste\u011fiyle boilerplate kodlar\u0131 nas\u0131l h\u0131zla olu\u015fturabilece\u011fimizi, hata ay\u0131klama s\u00fcre\u00e7lerini nas\u0131l kolayla\u015ft\u0131rabilece\u011fimizi ve kodumuzu nas\u0131l iyile\u015ftirebilece\u011fimizi deneyimledik. Bu sinerjik yakla\u015f\u0131m, sadece geli\u015ftirme s\u00fcresini k\u0131saltmakla kalmaz, ayn\u0131 zamanda daha az hatayla daha kaliteli kod yazmam\u0131za olanak tan\u0131r. \u0130leri d\u00fczey optimizasyonlar ve g\u00fcvenlik ipu\u00e7lar\u0131yla da uygulaman\u0131n ger\u00e7ek d\u00fcnya standartlar\u0131nda bir performans ve g\u00fcvenli\u011fe sahip olmas\u0131n\u0131 sa\u011flad\u0131k. Art\u0131k, bu bilgiler \u0131\u015f\u0131\u011f\u0131nda kendi yarat\u0131c\u0131 fikirlerinizi hayata ge\u00e7irmek i\u00e7in g\u00fc\u00e7l\u00fc bir temeliniz var.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular<\/h3>\n<ul>\n<li>\n      <strong>S: Cursor kullanmak zorunlu mu? Kodu kendim yazamaz m\u0131y\u0131m?<\/strong><\/p>\n<p>C: Hay\u0131r, Cursor kullanmak zorunlu de\u011fildir. Makale boyunca g\u00f6sterilen t\u00fcm kodlar\u0131 kendiniz de yazabilirsiniz. Cursor, bir yapay zeka kod asistan\u0131 olarak, geli\u015ftirme h\u0131z\u0131n\u0131z\u0131 art\u0131rmak ve tekrarlayan g\u00f6revleri otomatikle\u015ftirmek i\u00e7in bir ara\u00e7t\u0131r. \u00d6zellikle yeni bir teknoloji \u00f6\u011frenirken veya h\u0131zl\u0131 prototipleme yaparken \u00e7ok faydal\u0131 olabilir.<\/p>\n<\/li>\n<li>\n      <strong>S: Appwrite yerine ba\u015fka bir BaaS (Backend as a Service) kullanabilir miyim?<\/strong><\/p>\n<p>C: Evet, Appwrite a\u00e7\u0131k kaynakl\u0131 ve g\u00fc\u00e7l\u00fc bir BaaS alternatifi olsa da, Firebase, Supabase veya AWS Amplify gibi di\u011fer BaaS platformlar\u0131n\u0131 da kullanabilirsiniz. Ancak, Appwrite'\u0131n sundu\u011fu \u00f6zellikler ve SDK'lar bu makalede g\u00f6sterildi\u011fi gibi sorunsuz bir entegrasyon sa\u011flar. Farkl\u0131 bir BaaS se\u00e7meniz durumunda, SDK entegrasyon kodlar\u0131n\u0131 ve Appwrite panelindeki yap\u0131land\u0131rmalar\u0131 o servisin dok\u00fcmantasyonuna g\u00f6re ayarlaman\u0131z gerekecektir.<\/p>\n<\/li>\n<li>\n      <strong>S: TanStack Start neden Next.js veya Remix gibi di\u011fer React \u00e7er\u00e7evelerine tercih edilmeli?<\/strong><\/p>\n<p>C: TanStack Start, hen\u00fcz yeni bir \u00e7er\u00e7eve olmas\u0131na ra\u011fmen, TanStack ekosisteminin (React Query, React Table vb.) yarat\u0131c\u0131lar\u0131 taraf\u0131ndan geli\u015ftirildi\u011fi i\u00e7in bu k\u00fct\u00fcphanelerle derinlemesine entegrasyon sunar. Dosya tabanl\u0131 y\u00f6nlendirme ve sunucu bile\u015fenleri gibi modern yakla\u015f\u0131mlara sahiptir. Next.js ve Remix de harika se\u00e7eneklerdir; se\u00e7im genellikle projenizin spesifik gereksinimlerine, ekip tercihlerine ve ekosistemdeki yeniliklere ne kadar a\u00e7\u0131k oldu\u011funuza ba\u011fl\u0131d\u0131r. TanStack Start, React Query'ye a\u015fina olanlar i\u00e7in \u00f6zellikle \u00e7ekici olabilir.<\/p>\n<\/li>\n<li>\n      <strong>S: Uygulamay\u0131 canl\u0131ya nas\u0131l alabilirim (deploy)?<\/strong><\/p>\n<p>C: TanStack Start ile geli\u015ftirilen uygulamalar, genellikle Vercel, Netlify veya Render gibi modern statik site bar\u0131nd\u0131rma platformlar\u0131nda kolayca da\u011f\u0131t\u0131labilir. TanStack Start'\u0131n da\u011f\u0131t\u0131m dok\u00fcmantasyonunu inceleyerek, projenizi nas\u0131l derleyece\u011finizi (<code>npm run build<\/code>) ve se\u00e7ti\u011finiz platforma nas\u0131l y\u00fckleyece\u011finizi \u00f6\u011frenebilirsiniz. Appwrite Cloud kullan\u0131yorsan\u0131z, arka ucunuz zaten canl\u0131dad\u0131r ve do\u011frudan uygulamalar\u0131n\u0131zdan eri\u015filebilir.<\/p>\n<\/li>\n<li>\n      <strong>S: Not uygulamas\u0131na daha fazla \u00f6zellik eklemek istersem ne yapmal\u0131y\u0131m?<\/strong><\/p>\n<p>C: Not uygulamas\u0131na etiketleme, arama, notlar\u0131 payla\u015fma, zengin metin d\u00fczenleyici entegrasyonu gibi bir\u00e7ok \u00f6zellik ekleyebilirsiniz. Appwrite'\u0131n fonksiyonlar\u0131 (Functions) servisini kullanarak sunucu taraf\u0131nda \u00f6zel mant\u0131k \u00e7al\u0131\u015ft\u0131rabilir, depolama (Storage) servisi ile notlara g\u00f6rseller ekleyebilir veya Appwrite'\u0131n ger\u00e7ek zamanl\u0131 yeteneklerini daha derinlemesine kullanarak anl\u0131k bildirimler g\u00f6nderebilirsiniz. TanStack Start'\u0131n mod\u00fcler yap\u0131s\u0131 ve React ekosisteminin geni\u015f k\u00fct\u00fcphane deste\u011fi, bu t\u00fcr geni\u015fletmeleri kolayca yapman\u0131za olanak tan\u0131r.<\/p>\n<\/li>\n<\/ul>\n<p><\/body><br \/>\n<\/html><\/p>\n","protected":false},"excerpt":{"rendered":"G\u00fcn\u00fcm\u00fcz yaz\u0131l\u0131m geli\u015ftirme d\u00fcnyas\u0131nda, karma\u015f\u0131k tam y\u0131\u011f\u0131n (full-stack) uygulamalar\u0131 h\u0131zl\u0131 ve verimli bir \u015fekilde hayata ge\u00e7irmek b\u00fcy\u00fck bir&hellip;","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-33670","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>Cursor, Appwrite ve TanStack ile Modern Not Uygulamas\u0131 Geli\u015ftirme Rehberi<\/title>\n<meta name=\"description\" content=\"G\u00fcn\u00fcm\u00fcz yaz\u0131l\u0131m geli\u015ftirme d\u00fcnyas\u0131nda, karma\u015f\u0131k tam y\u0131\u011f\u0131n (full-stack) uygulamalar\u0131 h\u0131zl\u0131 ve verimli bir \u015fekilde hayata ge\u00e7irmek b\u00fcy\u00fck bir meydan okumad\u0131r. Ancak, yapay zeka destekli kodlama ara\u00e7lar\u0131, g\u00fc\u00e7l\u00fc arka u\u00e7 servisleri ve modern \u00f6n u\u00e7 \u00e7er\u00e7evelerinin birle\u015fimiyle bu s\u00fcre\u00e7 art\u0131k \u00e7ok daha eri\u015filebilir. Bu rehberde, Cursor&#039;\u0131n yapay zeka yeteneklerini, Appwrite&#039;\u0131n sa\u011flam arka u\u00e7 hizmetlerini ve TanStack Start&#039;\u0131n yenilik\u00e7i \u00f6n u\u00e7 mimarisini kullanarak nas\u0131l eksiksiz bir not uygulamas\u0131 geli\u015ftirebilece\u011fimizi ad\u0131m ad\u0131m inceleyece\u011fiz.\" \/>\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\/cursor-appwrite-ve-tanstack-ile-modern-not-uygulamasi-gelistirme-rehberi\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Cursor, Appwrite ve TanStack ile Modern Not Uygulamas\u0131 Geli\u015ftirme Rehberi\" \/>\n<meta property=\"og:description\" content=\"G\u00fcn\u00fcm\u00fcz yaz\u0131l\u0131m geli\u015ftirme d\u00fcnyas\u0131nda, karma\u015f\u0131k tam y\u0131\u011f\u0131n (full-stack) uygulamalar\u0131 h\u0131zl\u0131 ve verimli bir \u015fekilde hayata ge\u00e7irmek b\u00fcy\u00fck bir meydan okumad\u0131r. Ancak, yapay zeka destekli kodlama ara\u00e7lar\u0131, g\u00fc\u00e7l\u00fc arka u\u00e7 servisleri ve modern \u00f6n u\u00e7 \u00e7er\u00e7evelerinin birle\u015fimiyle bu s\u00fcre\u00e7 art\u0131k \u00e7ok daha eri\u015filebilir. Bu rehberde, Cursor&#039;\u0131n yapay zeka yeteneklerini, Appwrite&#039;\u0131n sa\u011flam arka u\u00e7 hizmetlerini ve TanStack Start&#039;\u0131n yenilik\u00e7i \u00f6n u\u00e7 mimarisini kullanarak nas\u0131l eksiksiz bir not uygulamas\u0131 geli\u015ftirebilece\u011fimizi ad\u0131m ad\u0131m inceleyece\u011fiz.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/cursor-appwrite-ve-tanstack-ile-modern-not-uygulamasi-gelistirme-rehberi\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-05T15:01:37+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=\"32 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/cursor-appwrite-ve-tanstack-ile-modern-not-uygulamasi-gelistirme-rehberi\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/cursor-appwrite-ve-tanstack-ile-modern-not-uygulamasi-gelistirme-rehberi\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Cursor, Appwrite ve TanStack ile Modern Not Uygulamas\u0131 Geli\u015ftirme Rehberi\",\"datePublished\":\"2025-11-05T15:01:37+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/cursor-appwrite-ve-tanstack-ile-modern-not-uygulamasi-gelistirme-rehberi\/\"},\"wordCount\":5198,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/cursor-appwrite-ve-tanstack-ile-modern-not-uygulamasi-gelistirme-rehberi\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/cursor-appwrite-ve-tanstack-ile-modern-not-uygulamasi-gelistirme-rehberi\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/cursor-appwrite-ve-tanstack-ile-modern-not-uygulamasi-gelistirme-rehberi\/\",\"name\":\"Cursor, Appwrite ve TanStack ile Modern Not Uygulamas\u0131 Geli\u015ftirme Rehberi\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-11-05T15:01:37+00:00\",\"description\":\"G\u00fcn\u00fcm\u00fcz yaz\u0131l\u0131m geli\u015ftirme d\u00fcnyas\u0131nda, karma\u015f\u0131k tam y\u0131\u011f\u0131n (full-stack) uygulamalar\u0131 h\u0131zl\u0131 ve verimli bir \u015fekilde hayata ge\u00e7irmek b\u00fcy\u00fck bir meydan okumad\u0131r. Ancak, yapay zeka destekli kodlama ara\u00e7lar\u0131, g\u00fc\u00e7l\u00fc arka u\u00e7 servisleri ve modern \u00f6n u\u00e7 \u00e7er\u00e7evelerinin birle\u015fimiyle bu s\u00fcre\u00e7 art\u0131k \u00e7ok daha eri\u015filebilir. Bu rehberde, Cursor'\u0131n yapay zeka yeteneklerini, Appwrite'\u0131n sa\u011flam arka u\u00e7 hizmetlerini ve TanStack Start'\u0131n yenilik\u00e7i \u00f6n u\u00e7 mimarisini kullanarak nas\u0131l eksiksiz bir not uygulamas\u0131 geli\u015ftirebilece\u011fimizi ad\u0131m ad\u0131m inceleyece\u011fiz.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/cursor-appwrite-ve-tanstack-ile-modern-not-uygulamasi-gelistirme-rehberi\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/cursor-appwrite-ve-tanstack-ile-modern-not-uygulamasi-gelistirme-rehberi\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/cursor-appwrite-ve-tanstack-ile-modern-not-uygulamasi-gelistirme-rehberi\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Cursor, Appwrite ve TanStack ile Modern Not Uygulamas\u0131 Geli\u015ftirme Rehberi\"}]},{\"@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":"Cursor, Appwrite ve TanStack ile Modern Not Uygulamas\u0131 Geli\u015ftirme Rehberi","description":"G\u00fcn\u00fcm\u00fcz yaz\u0131l\u0131m geli\u015ftirme d\u00fcnyas\u0131nda, karma\u015f\u0131k tam y\u0131\u011f\u0131n (full-stack) uygulamalar\u0131 h\u0131zl\u0131 ve verimli bir \u015fekilde hayata ge\u00e7irmek b\u00fcy\u00fck bir meydan okumad\u0131r. Ancak, yapay zeka destekli kodlama ara\u00e7lar\u0131, g\u00fc\u00e7l\u00fc arka u\u00e7 servisleri ve modern \u00f6n u\u00e7 \u00e7er\u00e7evelerinin birle\u015fimiyle bu s\u00fcre\u00e7 art\u0131k \u00e7ok daha eri\u015filebilir. Bu rehberde, Cursor'\u0131n yapay zeka yeteneklerini, Appwrite'\u0131n sa\u011flam arka u\u00e7 hizmetlerini ve TanStack Start'\u0131n yenilik\u00e7i \u00f6n u\u00e7 mimarisini kullanarak nas\u0131l eksiksiz bir not uygulamas\u0131 geli\u015ftirebilece\u011fimizi ad\u0131m ad\u0131m inceleyece\u011fiz.","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\/cursor-appwrite-ve-tanstack-ile-modern-not-uygulamasi-gelistirme-rehberi\/","og_locale":"tr_TR","og_type":"article","og_title":"Cursor, Appwrite ve TanStack ile Modern Not Uygulamas\u0131 Geli\u015ftirme Rehberi","og_description":"G\u00fcn\u00fcm\u00fcz yaz\u0131l\u0131m geli\u015ftirme d\u00fcnyas\u0131nda, karma\u015f\u0131k tam y\u0131\u011f\u0131n (full-stack) uygulamalar\u0131 h\u0131zl\u0131 ve verimli bir \u015fekilde hayata ge\u00e7irmek b\u00fcy\u00fck bir meydan okumad\u0131r. Ancak, yapay zeka destekli kodlama ara\u00e7lar\u0131, g\u00fc\u00e7l\u00fc arka u\u00e7 servisleri ve modern \u00f6n u\u00e7 \u00e7er\u00e7evelerinin birle\u015fimiyle bu s\u00fcre\u00e7 art\u0131k \u00e7ok daha eri\u015filebilir. Bu rehberde, Cursor'\u0131n yapay zeka yeteneklerini, Appwrite'\u0131n sa\u011flam arka u\u00e7 hizmetlerini ve TanStack Start'\u0131n yenilik\u00e7i \u00f6n u\u00e7 mimarisini kullanarak nas\u0131l eksiksiz bir not uygulamas\u0131 geli\u015ftirebilece\u011fimizi ad\u0131m ad\u0131m inceleyece\u011fiz.","og_url":"https:\/\/fatihsoysal.com\/blog\/cursor-appwrite-ve-tanstack-ile-modern-not-uygulamasi-gelistirme-rehberi\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-11-05T15:01:37+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"32 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/cursor-appwrite-ve-tanstack-ile-modern-not-uygulamasi-gelistirme-rehberi\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/cursor-appwrite-ve-tanstack-ile-modern-not-uygulamasi-gelistirme-rehberi\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Cursor, Appwrite ve TanStack ile Modern Not Uygulamas\u0131 Geli\u015ftirme Rehberi","datePublished":"2025-11-05T15:01:37+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/cursor-appwrite-ve-tanstack-ile-modern-not-uygulamasi-gelistirme-rehberi\/"},"wordCount":5198,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/cursor-appwrite-ve-tanstack-ile-modern-not-uygulamasi-gelistirme-rehberi\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/cursor-appwrite-ve-tanstack-ile-modern-not-uygulamasi-gelistirme-rehberi\/","url":"https:\/\/fatihsoysal.com\/blog\/cursor-appwrite-ve-tanstack-ile-modern-not-uygulamasi-gelistirme-rehberi\/","name":"Cursor, Appwrite ve TanStack ile Modern Not Uygulamas\u0131 Geli\u015ftirme Rehberi","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-11-05T15:01:37+00:00","description":"G\u00fcn\u00fcm\u00fcz yaz\u0131l\u0131m geli\u015ftirme d\u00fcnyas\u0131nda, karma\u015f\u0131k tam y\u0131\u011f\u0131n (full-stack) uygulamalar\u0131 h\u0131zl\u0131 ve verimli bir \u015fekilde hayata ge\u00e7irmek b\u00fcy\u00fck bir meydan okumad\u0131r. Ancak, yapay zeka destekli kodlama ara\u00e7lar\u0131, g\u00fc\u00e7l\u00fc arka u\u00e7 servisleri ve modern \u00f6n u\u00e7 \u00e7er\u00e7evelerinin birle\u015fimiyle bu s\u00fcre\u00e7 art\u0131k \u00e7ok daha eri\u015filebilir. Bu rehberde, Cursor'\u0131n yapay zeka yeteneklerini, Appwrite'\u0131n sa\u011flam arka u\u00e7 hizmetlerini ve TanStack Start'\u0131n yenilik\u00e7i \u00f6n u\u00e7 mimarisini kullanarak nas\u0131l eksiksiz bir not uygulamas\u0131 geli\u015ftirebilece\u011fimizi ad\u0131m ad\u0131m inceleyece\u011fiz.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/cursor-appwrite-ve-tanstack-ile-modern-not-uygulamasi-gelistirme-rehberi\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/cursor-appwrite-ve-tanstack-ile-modern-not-uygulamasi-gelistirme-rehberi\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/cursor-appwrite-ve-tanstack-ile-modern-not-uygulamasi-gelistirme-rehberi\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Cursor, Appwrite ve TanStack ile Modern Not Uygulamas\u0131 Geli\u015ftirme Rehberi"}]},{"@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\/33670","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=33670"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/33670\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=33670"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=33670"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=33670"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}