<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Bora Ocaker — Tezgâhtan notlar</title>
    <link>https://boraocaker.com/tr/blog</link>
    <atom:link href="https://boraocaker.com/tr/rss.xml" rel="self" type="application/rss+xml" />
    <description>React, performans, GSAP ve gerçek hayatta web teslim etmenin dağınık tarafı üzerine kısa teknik notlar.</description>
    <language>tr-TR</language>
    <lastBuildDate>Tue, 02 Jun 2026 15:10:32 GMT</lastBuildDate>
    <generator>Hand-rolled at boraocaker.com</generator>
    <item>
      <title>Satori ile build sırasında OG görselleri üretmek</title>
      <link>https://boraocaker.com/tr/blog/og-images-with-satori</link>
      <guid isPermaLink="true">https://boraocaker.com/tr/blog/og-images-with-satori</guid>
      <pubDate>Mon, 01 Jun 2026 00:00:00 GMT</pubDate>
      <description>Bu sitedeki her yazı kendi 1200×630 sosyal kartını alıyor — build sırasında Satori ve resvg ile JSX&apos;ten PNG&apos;ye render ediliyor. Headless Chrome yok, ekran görüntüsü servisi yok, runtime maliyeti yok.</description>
      <enclosure url="https://boraocaker.com/og/blog/tr/og-images-with-satori.png" type="image/png" />
      <category>og</category>
      <category>satori</category>
      <category>build</category>
      <category>seo</category>
      <author>boraocaker38@gmail.com (Bora Ocaker)</author>
    </item>
    <item>
      <title>Bir Vite SPA&apos;yı SSR&apos;a geçmeden SEO için prerender etmek</title>
      <link>https://boraocaker.com/tr/blog/prerendering-a-vite-spa</link>
      <guid isPermaLink="true">https://boraocaker.com/tr/blog/prerendering-a-vite-spa</guid>
      <pubDate>Sun, 31 May 2026 00:00:00 GMT</pubDate>
      <description>Sitem client-render edilen bir React SPA. Bir crawler&apos;a göre bu neredeyse boş bir body demek. İşte Next ya da bir sunucu benimsemeden, route başına gerçek HTML yazan 200 satırlık post-build script&apos;i.</description>
      <enclosure url="https://boraocaker.com/og/blog/tr/prerendering-a-vite-spa.png" type="image/png" />
      <category>seo</category>
      <category>vite</category>
      <category>prerender</category>
      <author>boraocaker38@gmail.com (Bora Ocaker)</author>
    </item>
    <item>
      <title>CMS&apos;siz bir markdown blog — sadece import.meta.glob</title>
      <link>https://boraocaker.com/tr/blog/markdown-blog-with-vite-glob</link>
      <guid isPermaLink="true">https://boraocaker.com/tr/blog/markdown-blog-with-vite-glob</guid>
      <pubDate>Sat, 30 May 2026 00:00:00 GMT</pubDate>
      <description>Bu blogun veritabanı yok, headless CMS&apos;i yok, içerik API&apos;si yok. Yazılar bir klasördeki markdown dosyaları, build sırasında tek bir Vite özelliğiyle bundle&apos;a çekiliyor. İşte tüm kurulum.</description>
      <enclosure url="https://boraocaker.com/og/blog/tr/markdown-blog-with-vite-glob.png" type="image/png" />
      <category>vite</category>
      <category>markdown</category>
      <category>react</category>
      <author>boraocaker38@gmail.com (Bora Ocaker)</author>
    </item>
    <item>
      <title>Hiç göndermediğim 700 KB — bir syntax highlighter&apos;ı kırpmak</title>
      <link>https://boraocaker.com/tr/blog/trimming-syntax-highlighter</link>
      <guid isPermaLink="true">https://boraocaker.com/tr/blog/trimming-syntax-highlighter</guid>
      <pubDate>Fri, 29 May 2026 00:00:00 GMT</pubDate>
      <description>react-syntax-highlighter, beraberinde geldiği her Prism grammar&apos;ını seve seve bundle&apos;lar. Bu, asla kullanmayacağım yüzlerce kilobayt dil demek. İşte bu blogun ihtiyaç duyduğu birkaçını nasıl kaydettim.</description>
      <enclosure url="https://boraocaker.com/og/blog/tr/trimming-syntax-highlighter.png" type="image/png" />
      <category>performance</category>
      <category>bundle</category>
      <category>react</category>
      <author>boraocaker38@gmail.com (Bora Ocaker)</author>
    </item>
    <item>
      <title>RSS ve JSON feed&apos;leri build sırasında elle yazmak</title>
      <link>https://boraocaker.com/tr/blog/hand-rolling-rss-and-json-feeds</link>
      <guid isPermaLink="true">https://boraocaker.com/tr/blog/hand-rolling-rss-and-json-feeds</guid>
      <pubDate>Thu, 28 May 2026 00:00:00 GMT</pubDate>
      <description>RSS ölmedi, sadece sessiz. Bu bloga feed eklemek bir build script&apos;i, sıfır kütüphane ve iki spec okumak için bir saat sürdü. İşte RSS 2.0 ve JSON Feed&apos;i elle yazarken öğrendiklerim.</description>
      <enclosure url="https://boraocaker.com/og/blog/tr/hand-rolling-rss-and-json-feeds.png" type="image/png" />
      <category>rss</category>
      <category>build</category>
      <category>seo</category>
      <author>boraocaker38@gmail.com (Bora Ocaker)</author>
    </item>
    <item>
      <title>Bir React sitesine router&apos;ı bozmadan i18n eklemek</title>
      <link>https://boraocaker.com/tr/blog/react-i18n-without-routing</link>
      <guid isPermaLink="true">https://boraocaker.com/tr/blog/react-i18n-without-routing</guid>
      <pubDate>Tue, 26 May 2026 00:00:00 GMT</pubDate>
      <description>Bir öğleden sonra portföyüme Türkçeyi nasıl ekledim — react-i18next, sabit sol üst toggle ve router&apos;a tek bir bağımlılık eklemeden.</description>
      <enclosure url="https://boraocaker.com/og/blog/tr/react-i18n-without-routing.png" type="image/png" />
      <category>react</category>
      <category>i18n</category>
      <category>vite</category>
      <author>boraocaker38@gmail.com (Bora Ocaker)</author>
    </item>
    <item>
      <title>Hero LCP&apos;mi yarıya indiren tek bir attribute</title>
      <link>https://boraocaker.com/tr/blog/hero-lcp-fetchpriority</link>
      <guid isPermaLink="true">https://boraocaker.com/tr/blog/hero-lcp-fetchpriority</guid>
      <pubDate>Sun, 24 May 2026 00:00:00 GMT</pubDate>
      <description>Background-image içeren bir div, preload tarayıcısına görünmez. fetchpriority=&quot;high&quot; taşıyan bir &lt;img&gt; görünür. Geçişi yaptığımda neler değişti.</description>
      <enclosure url="https://boraocaker.com/og/blog/tr/hero-lcp-fetchpriority.png" type="image/png" />
      <category>performance</category>
      <category>lighthouse</category>
      <category>react</category>
      <author>boraocaker38@gmail.com (Bora Ocaker)</author>
    </item>
    <item>
      <title>Tek bir observer ile kritik yoldan çıkardığım 80 KB</title>
      <link>https://boraocaker.com/tr/blog/lazy-third-party-scripts</link>
      <guid isPermaLink="true">https://boraocaker.com/tr/blog/lazy-third-party-scripts</guid>
      <pubDate>Fri, 22 May 2026 00:00:00 GMT</pubDate>
      <description>hCaptcha ve Web3Forms sadece birisi gerçekten iletişim formunu doldurursa önemli. Her ikisini de form ekrana gelene kadar nasıl geciktirdiğimi — ve Lighthouse puanıma neler kattığını anlatıyorum.</description>
      <enclosure url="https://boraocaker.com/og/blog/tr/lazy-third-party-scripts.png" type="image/png" />
      <category>performance</category>
      <category>react</category>
      <category>lighthouse</category>
      <author>boraocaker38@gmail.com (Bora Ocaker)</author>
    </item>
    <item>
      <title>Lenis smooth scroll&apos;u GSAP ScrollTrigger ile senkronlamak</title>
      <link>https://boraocaker.com/tr/blog/lenis-gsap-scrolltrigger</link>
      <guid isPermaLink="true">https://boraocaker.com/tr/blog/lenis-gsap-scrolltrigger</guid>
      <pubDate>Mon, 18 May 2026 00:00:00 GMT</pubDate>
      <description>Lenis scroll pozisyonunu ele geçirir. ScrollTrigger scroll pozisyonunu okur. Onları birbirine tanıtmazsan, scrub animasyonların tam kırık hissedecek kadar geri kalır.</description>
      <enclosure url="https://boraocaker.com/og/blog/tr/lenis-gsap-scrolltrigger.png" type="image/png" />
      <category>gsap</category>
      <category>lenis</category>
      <category>scroll</category>
      <category>react</category>
      <author>boraocaker38@gmail.com (Bora Ocaker)</author>
    </item>
    <item>
      <title>WebGL ne zaman yanlış — ve CSS gradient ne zaman doğru</title>
      <link>https://boraocaker.com/tr/blog/webgl-vs-css-mobile</link>
      <guid isPermaLink="true">https://boraocaker.com/tr/blog/webgl-vs-css-mobile</guid>
      <pubDate>Fri, 15 May 2026 00:00:00 GMT</pubDate>
      <description>Projects sayfam arka plan olarak animasyonlu bir WebGL ASCII ızgarası kullanıyordu. Harika görünüyordu. 3 yıllık bir Android&apos;de bataryayı yiyor, kareleri düşürüyordu. Mobilde neyle değiştirdim ve neden suçluluk hissetmiyorum.</description>
      <enclosure url="https://boraocaker.com/og/blog/tr/webgl-vs-css-mobile.png" type="image/png" />
      <category>performance</category>
      <category>webgl</category>
      <category>css</category>
      <category>mobile</category>
      <author>boraocaker38@gmail.com (Bora Ocaker)</author>
    </item>
    <item>
      <title>Aynı hafta inşa edip sildiğim şeyler</title>
      <link>https://boraocaker.com/tr/blog/things-i-built-and-deleted</link>
      <guid isPermaLink="true">https://boraocaker.com/tr/blog/things-i-built-and-deleted</guid>
      <pubDate>Tue, 12 May 2026 00:00:00 GMT</pubDate>
      <description>Bir branch&apos;e gönderdiğim, bir iki gün yaşadığım ve sonra sessizce kaldırdığım özelliklerin kısa bir listesi. Her biri bu portföyün gerçekte ne için olduğunu bana öğretti.</description>
      <enclosure url="https://boraocaker.com/og/blog/tr/things-i-built-and-deleted.png" type="image/png" />
      <category>design</category>
      <category>restraint</category>
      <category>decisions</category>
      <author>boraocaker38@gmail.com (Bora Ocaker)</author>
    </item>
  </channel>
</rss>
