Takip et

Mintlify Ignored This Feature Request for 6 Months. Here’s Our Solution.

Modern yazılım geliştirme dünyasında, kaliteli ve güncel dokümantasyon, başarılı bir ürünün olmazsa olmazıdır. Mintlify gibi platformlar, geliştiricilere şık ve kullanıcı dostu dokümantasyon siteleri oluşturma konusunda büyük kolaylıklar sunar. Ancak, ya kritik bir iş ihtiyacınız için gerekli olan temel bir özellik aylarca göz ardı edilirse? İşte tam da bu noktada, geliştirici ekibimizin karşılaştığı zorluğun hikayesi başlıyor. Bu makalede, altı ay boyunca Mintlify’dan yanıt alamadığımız bir özellik isteği karşısında nasıl kendi çözümümüzü geliştirdiğimizi, bu sürecin teknik detaylarını ve elde ettiğimiz sonuçları adım adım inceleyeceğiz. Bu yolculuk, sadece bir problemi çözmekle kalmayıp, aynı zamanda esneklik ve kontrolün gücünü keşfetmemizi sağladı.

Mintlify, teknik dokümantasyon oluşturma ve yayınlama süreçlerini basitleştirmeyi hedefleyen modern bir platform olarak, son zamanlarda geliştiriciler arasında oldukça popüler hale geldi. Birçok şirket, hızlı kurulumu, göz alıcı temaları, Markdown tabanlı içeriği kolayca yayınlama yeteneği ve entegre arama özellikleriyle Mintlify’ı tercih ediyor. Geliştiriciler, genellikle birkaç komutla sıfırdan profesyonel görünümlü bir dokümantasyon sitesi kurabilmenin ve içeriklerini GitHub üzerinden yönetebilmenin rahatlığını yaşıyorlar. Özellikle küçük ve orta ölçekli ekipler için, ürünlerini hızla pazara sürme veya geliştirici deneyimini artırma noktasında büyük bir zaman kazancı sağlıyor.

Ancak, her araç gibi Mintlify’ın da belirli sınırlılıkları mevcut. Genel kullanım senaryoları için harika olsa da, bazı niş veya gelişmiş ihtiyaçlar ortaya çıktığında esneklik konusunda zorluklar yaşanabiliyor. Bizim durumumuzda, dinamik veri kaynaklarından (örneğin, sürekli değişen bir ürün API’si veya bir veritabanı) otomatik olarak çekilen içeriğin dokümantasyona entegre edilmesi gerekiyordu. Mevcut Mintlify yapısı, statik Markdown dosyalarına dayalı olduğu için, bu tür dinamik içeriklerin güncel ve hatasız bir şekilde sunulması konusunda bizi çıkmaza soktu. Örneğin, X Şirketi’nin sunduğu çok sayıda mikroservis, her birinin kendi API tanımına ve kullanım kılavuzuna sahipti. Bu API’ler sık sık güncelleniyor, yeni uç noktalar ekleniyor veya mevcut olanlar değiştiriliyordu. Her bir güncelleme sonrası dokümantasyonu manuel olarak düzenlemek, hem zaman alıcı hem de hata yapmaya açık bir süreçti. İşte tam da bu noktada, Mintlify’ın “özel bir veri kaynağını doğrudan entegre etme ve bu verileri belirli şablonlar aracılığıyla otomatik olarak sayfalar halinde render etme” özelliği eksikliği, iş akışımızı ciddi şekilde aksatmaya başladı.

Buna ek olarak, bazı özel UI bileşenlerinin (örneğin, etkileşimli kod örnekleri, özel uyarı kutuları veya dinamik grafikler) kolayca entegre edilememesi de bir başka sınırlamayı teşkil ediyordu. Bizim için geliştirici deneyimi, sadece okunabilir bir metin sunmakla kalmıyor, aynı zamanda kullanıcıların kod örneklerini doğrudan denemelerine olanak tanıyan etkileşimli öğeleri de içeriyordu. Mintlify’ın sunduğu özelleştirme seçenekleri genel hatlarıyla yeterli olsa da, MDX (Markdown + JSX) benzeri bir yaklaşım sunarak içeriğin içine React bileşenleri gömmek gibi ileri düzey senaryolarda kısıtlı kalıyordu. Bu durum, dokümantasyonumuzu daha zengin ve işlevsel hale getirme çabalarımızı engelliyordu. Dolayısıyla, mevcut durum, ya Mintlify’ın sunduğuyla yetinmeyi ya da kendi ihtiyaçlarımıza uygun bir alternatif geliştirmeyi gerektiriyordu.

Aylarca Yanıtsız Kalan Özellik İsteği: Sabrın Sonu Nereye Varır?

Teknik dokümantasyon platformu Mintlify’ı aktif olarak kullandığımız dönemde, iş akışımız için kritik öneme sahip olduğunu düşündüğümüz bir özellik talebini ilettik. İsteğimiz, temelde, dinamik API verilerini doğrudan dokümantasyon içeriğimize entegre edebilme ve bu veriler üzerinden otomatik olarak güncellenen sayfalar oluşturabilme yeteneğiydi. Bu, özellikle sürekli değişen ürün veya hizmetler için dokümantasyonun manuel güncellemelerden kaynaklanan hatalarını ve gecikmelerini ortadan kaldıracaktı. Beklentimiz, bir Headless CMS’den veya doğrudan bir API uç noktasından çekilen verilerin, belirli Markdown şablonlarına göre otomatik olarak işlenerek dokümantasyon sayfalarına dönüştürülmesiydi. Bu sayede, ürünlerimizdeki değişiklikler anında dokümantasyona yansıyacak, geliştirici ekiplerimizin üzerindeki yük azalacak ve her zaman güncel bilgi sunulabilecekti.

Bu isteği ilk olarak Mintlify’ın resmi destek kanalları üzerinden, ardından GitHub issue’ları aracılığıyla ve son olarak da topluluk forumlarında dile getirdik. Her seferinde, isteğimizin değerlendirmeye alındığına dair otomatik yanıtlar aldık veya belirsiz bir “yol haritasına eklendi” mesajıyla karşılaştık. İlk birkaç hafta umutluyduk; sonuçta her geliştirme ekibi kendi önceliklerine sahiptir ve hemen aksiyon alınamayabilir. Ancak, haftalar ayları kovaladığında ve altı ay gibi uzun bir süre geçmesine rağmen ne somut bir geri bildirim ne de herhangi bir gelişme gözlemleyebildik. Bu durum, projemizin ilerleyişi üzerinde ciddi bir baskı oluşturmaya başladı. Dokümantasyon süreçlerimiz aksıyor, manuel müdahaleler nedeniyle hatalar artıyor ve geliştirici ekibimizin değerli zamanı verimsiz işlere harcanıyordu. Bu gecikmeler, sadece şirket içinde değil, aynı zamanda müşterilerimiz ve iş ortaklarımız nezdinde de bilgiye erişim sorunlarına yol açıyordu.

Mintlify’ın bu önemli talebimizi göz ardı etmesi veya önceliklendirememesi karşısında, sabrımız tükendi. Mevcut alternatifleri değerlendirdik; ancak hiçbir hazır çözüm, bizim spesifik ve entegre ihtiyaçlarımızı tam olarak karşılamıyordu. Bir yandan zaman kısıtlamaları, diğer yandan da projemizin doğası gereği bu dinamik dokümantasyon özelliğinin vazgeçilmez olması, bizi kendi çözümümüzü geliştirmeye itti. Bu karar, sadece bir özellik eksikliğini gidermekle kalmayacak, aynı zamanda dokümantasyon süreçlerimiz üzerinde tam kontrol sahibi olmamızı sağlayacaktı. Kendi çözümümüzü oluşturmak, ilk başta daha fazla emek ve kaynak gerektirse de, uzun vadede esneklik, sürdürülebilirlik ve bağımsızlık açısından çok daha değerli olacağına karar verdik. Bu, bir nevi “kendi kaderimizi kendimiz tayin etme” anıydı ve biz de bu kararı büyük bir motivasyonla hayata geçirmeye koyulduk.

Kendi Çözümümüzü Geliştirme Yolculuğu: Hangi Adımları İzledik?

Mintlify’ın pasif kalması üzerine, kendi dinamik dokümantasyon platformumuzu oluşturma kararı aldık. Bu yolculuk, dikkatli bir planlama ve aşamalı bir yaklaşımla şekillendi. Amacımız, sadece kayıp bir özelliği yerine koymak değil, aynı zamanda mevcut kısıtlamaları aşan, tamamen özelleştirilebilir ve geleceğe dönük bir çözüm inşa etmekti. İlk olarak, mevcut tüm ihtiyaçlarımızı ve gelecekteki potansiyel gereksinimlerimizi kapsayan detaylı bir analiz gerçekleştirdik. Bu süreçte, projenin kapsamını belirledik, kullanılacak teknolojileri seçtik ve mimari tasarım üzerinde yoğunlaştık. Her bir adım, hem teknik ekibimizin yetkinliklerini en üst düzeyde kullanmayı hem de projenin hedeflerine ulaşmasını sağlamayı amaçlıyordu.

Adım 1: İhtiyaç Analizi ve Mimari Tasarım

Projenin başlangıcında, iş birimlerimizden ve geliştirici ekiplerimizden gelen tüm geri bildirimleri topladık. Temel gereksinimler arasında dinamik API verilerini çekebilme, bu verileri görsel olarak zenginleştiren özel React/MDX bileşenleri kullanabilme, dokümantasyonun birden fazla versiyonunu yönetebilme ve CI/CD süreçleriyle otomatik yayınlama yeteneği bulunuyordu. Mimari tasarım için, Next.js’in statik site oluşturma (SSG) yeteneklerinden faydalanmaya karar verdik. Bu, hem hızlı yükleme süreleri hem de SEO dostu bir yapı sunacaktı. İçerik yönetimi için Headless CMS (örneğin Strapi veya Sanity.io) kullanma fikri ortaya çıktı, böylece teknik olmayan kullanıcılar da içerikleri kolayca yönetebilecekti. Verilerin alınması için basit bir GraphQL veya REST API katmanı oluşturulması planlandı. Bu aşama, projenin sağlam temellerini atmak ve gelecekteki genişlemeler için esnek bir yapı kurmak açısından hayati önem taşıyordu.

Adım 2: Çekirdek Yapının İnşası ve Dinamik İçerik Entegrasyonu

Mimari onaylandıktan sonra, Next.js tabanlı dokümantasyon uygulamasının çekirdeğini inşa etmeye başladık. Markdown ve MDX entegrasyonu için next-mdx-remote gibi kütüphaneleri kullandık. Bu sayede, Markdown dosyalarının içine doğrudan React bileşenleri gömebildik ve içeriklerimizi çok daha etkileşimli hale getirdik. Dinamik içerik entegrasyonu için, Next.js’in getStaticProps ve getStaticPaths fonksiyonlarını kullanarak API’lerden veri çekme mekanizmalarını kurduk. Örneğin, ürün özellik listelerini veya API uç nokta tanımlarını bir harici API’den çekip, bunları otomatik olarak dokümantasyon sayfalarına dönüştüren bir yapı oluşturduk. Aşağıda, basit bir API verisini çekip MDX içeriğine aktaran bir kod örneği bulunmaktadır:


// pages/docs/[slug].js
import { serialize } from 'next-mdx-remote/serialize';
import { MDXRemote } from 'next-mdx-remote';

// Özel React bileşenleri
const components = {
  Alert: ({ children }) => 
{children}
, }; export default function Post({ source }) { return ; } export async function getStaticProps({ params }) { // Örnek: Dinamik veri çekme const res = await fetch(https://api.example.com/docs/${params.slug}); const { content, dynamicData } = await res.json(); // MDX içeriğine dinamik veriyi gömme const mdxSource = await serialize(content, { scope: { dynamicData } }); return { props: { source: mdxSource, }, }; } export async function getStaticPaths() { // Örnek: Tüm doküman slug'larını çekme const res = await fetch('https://api.example.com/docs/slugs'); const slugs = await res.json(); const paths = slugs.map((slug) => ({ params: { slug } })); return { paths, fallback: false }; }

Bu kod bloğu sayesinde, her bir dokümantasyon sayfası için statik olarak önceden oluşturulmuş HTML dosyaları elde ederken, aynı zamanda bu sayfaların içeriğine dinamik verileri entegre edebildik. İçerik güncellendiğinde veya yeni API verileri geldiğinde, build süreci yeniden tetiklenerek dokümantasyonun otomatik olarak güncellenmesi sağlandı.

Adım 3: Otomatik Yayınlama ve CI/CD Entegrasyonu

Geliştirdiğimiz çözümün en güçlü yanlarından biri, otomatik yayınlama yeteneğiydi. Dokümantasyon içeriğimizin veya bağlı API'lerimizin güncellenmesi durumunda, manuel müdahale olmaksızın platformun otomatik olarak yeniden derlenip yayınlanmasını sağlamak için CI/CD (Sürekli Entegrasyon/Sürekli Dağıtım) boru hatları kurduk. GitHub Actions kullanarak, ana branşa yapılan her bir birleşme (merge) veya belirlenmiş bir API'nin güncellenmesi gibi olaylarda, dokümantasyonun otomatik olarak yeniden oluşturulmasını ve Vercel veya Netlify gibi bir CDN'e dağıtılmasını tetikledik. Bu, dokümantasyonumuzun her zaman en güncel bilgiyi yansıtmasını garanti altına aldı ve geliştirici ekibimizin manuel yayınlama yükünü ortadan kaldırdı. Basit bir GitHub Actions yapılandırması aşağıda gösterilmiştir:


# .github/workflows/deploy.yml
name: Dokümantasyon Dağıtımı

on:
  push:
    branches:
      - main
  # API güncellemelerini tetiklemek için web kancası da eklenebilir

jobs:
  build-and-deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Kodları Çek
        uses: actions/checkout@v2

      - name: Node.js Kurulumu
        uses: actions/setup-node@v2
        with:
          node-version: '16'

      - name: Bağımlılıkları Yükle
        run: npm install

      - name: Dokümantasyonu Oluştur (Next.js Build)
        run: npm run build

      - name: Vercel'e Dağıt
        uses: amondnet/vercel-action@v20
        with:
          vercel-token: ${{ secrets.VERCEL_TOKEN }}
          vercel-project-id: ${{ secrets.VERCEL_PROJECT_ID }}
          vercel-org-id: ${{ secrets.VERCEL_ORG_ID }}
          # prod değişkeni, ana branşta her zaman production ortamına dağıtımı sağlar
          vercel-scope: 'production'
    

Bu otomasyon sayesinde, içerik yöneticileri Headless CMS üzerinden veya geliştiriciler API tanımında bir değişiklik yaptığında, dokümantasyon platformumuz hızlı ve güvenilir bir şekilde güncellenerek yeni bilgileri anında kullanıcılara sunar. Bu tam otomasyon, yalnızca zaman tasarrufu sağlamakla kalmadı, aynı zamanda dokümantasyonun kalitesini ve tutarlılığını da önemli ölçüde artırdı.

Çözümümüzün Teknik Detayları ve Uygulamalı Örnekler

Geliştirdiğimiz dokümantasyon platformu, sadece bir özellik eksikliğini gidermekle kalmayıp, aynı zamanda esneklik ve gelişmiş işlevsellik sunan bir yapıya büründü. Çözümümüz, Next.js'in gücüyle MDX (Markdown + JSX) entegrasyonunu birleştirerek, statik dokümantasyonun sınırlılıklarını aşmayı hedefledi. Bu bölümde, çözümümüzün en önemli teknik detaylarını ve gerçek dünya senaryolarında nasıl uygulandığını inceleyeceğiz. Özellikle özel Markdown/MDX bileşenleri oluşturma, API verilerini doğrudan dokümantasyona entegre etme ve mobil cihazlarda kusursuz bir deneyim sunma konularına odaklanacağız.

Özel Markdown/MDX Bileşenleri Nasıl Oluşturulur?

Mintlify gibi platformlar genellikle belirli bir dizi önceden tanımlanmış bileşenle gelir. Ancak, bizim ihtiyacımız, dokümantasyon içeriğimize özgü, markamıza uygun veya daha etkileşimli öğeler ekleyebilmekti. MDX sayesinde, Markdown dosyalarımızın içine doğrudan React bileşenleri yazabildik. Bu, örneğin, özel bir "Uyarı" kutusu, bir "Kodu Kopyala" düğmesi içeren bir kod bloğu veya dinamik olarak güncellenen bir ürün tablosu gibi bileşenler oluşturmamıza olanak tanıdı. Aşağıda, basit bir uyarı kutusu bileşeni (Alert) ve bunun MDX içinde nasıl kullanıldığına dair bir örnek bulunmaktadır:


// components/Alert.js
import React from 'react';

const Alert = ({ children, type = 'info' }) => {
  const getStyles = () => {
    switch (type) {
      case 'warning':
        return { backgroundColor: '#fffbe6', borderLeft: '4px solid #ffe58f' };
      case 'error':
        return { backgroundColor: '#fff1f0', borderLeft: '4px solid #ffccc7' };
      case 'success':
        return { backgroundColor: '#f6ffed', borderLeft: '4px solid #b7eb8f' };
      case 'info':
      default:
        return { backgroundColor: '#e6f7ff', borderLeft: '4px solid #91d5ff' };
    }
  };

  return (
    
{children}
); }; export default Alert;

Bu bileşeni MDX içeriğimizde kullanmak için:


// example-doc.mdx
import Alert from '../components/Alert';

# Yeni Özellikler Duyurusu


  Bu özellik, son güncelleme ile birlikte kullanıma sunulmuştur.



  Lütfen bu özelliği kullanmadan önce uyumluluk belgelerini kontrol edin.

    

Bu yaklaşım, dokümantasyon yazarlarının içeriği zenginleştirmek için standart Markdown'ın ötesine geçmesine olanak tanır ve geliştiricilere, kullanıcı deneyimini iyileştiren özel UI öğeleri oluşturma konusunda tam kontrol sağlar. Görsel olarak, bu uyarı kutuları standart metin bloklarından ayrılarak okuyucunun dikkatini önemli bilgilere çekmeye yardımcı olur.

API Verilerini Dokümantasyona Nasıl Entegre Ederiz?

Dinamik içerik entegrasyonu, Mintlify'da eksikliğini hissettiğimiz en kritik özellikti. Kendi çözümümüzle, bu sorunu Next.js'in statik oluşturma (SSG) ve sunucu tarafı oluşturma (SSR) yeteneklerini kullanarak aştık. Örneğin, bir ürün API'sinden çekilen özellikleri veya hizmet durumlarını doğrudan dokümantasyon sayfalarımıza entegre edebiliriz. Bu, özellikle hızla gelişen ürünler için manuel güncellemelerin önüne geçerek, her zaman güncel bir dokümantasyon sunulmasını sağlar.

Örnek senaryo: Bir ürün API'sinden çekilen dinamik bir özellik listesini bir tablo olarak dokümantasyonda göstermek. İlk olarak, Next.js'in getStaticProps fonksiyonunda API çağrısı yaparız:


// pages/features.js
import { serialize } from 'next-mdx-remote/serialize';
import { MDXRemote } from 'next-mdx-remote';

const FeatureTable = ({ features }) => (
  
      {features.map((feature) => (
        
      ))}
    
Özellik Adı Açıklama Durum
{feature.name} {feature.description} {feature.status}
); const components = { FeatureTable }; // MDX'te kullanılacak özel bileşen export default function FeaturesPage({ source }) { return ; } export async function getStaticProps() { const res = await fetch('https://api.example.com/product-features'); const features = await res.json(); // API'den gelen dinamik özellikler // MDX içeriği, dinamik veriyi kullanmak için özel bir bileşen çağırıyor const mdxContent = # Ürün Özellikleri ; const mdxSource = await serialize(mdxContent, { scope: { dynamicFeatures: features } }); return { props: { source: mdxSource, }, revalidate: 60, // 60 saniyede bir veriyi tekrar çekip sayfayı oluştur }; }

Bu örnekte, FeatureTable adında bir React bileşeni oluşturarak API'den gelen verileri doğrudan MDX içeriğine aktarıyoruz. revalidate: 60 parametresi sayesinde, sayfa her 60 saniyede bir arka planda yeniden oluşturularak en güncel verilerle yayınlanır. Bu, hem performans hem de veri tutarlılığı açısından oldukça etkili bir yöntemdir.

Mobilde Kusursuz Deneyim İçin Ne Yapmalıyız?

Günümüzde kullanıcıların büyük çoğunluğu dokümantasyonlara mobil cihazlar üzerinden eriştiği için, mobil uyumluluk vazgeçilmez bir gerekliliktir. Kendi çözümümüzü geliştirirken, responsive tasarım prensiplerini baştan sona uyguladık. Flexbox ve CSS Grid gibi modern CSS yaklaşımlarını kullanarak sayfa düzenimizi her ekran boyutuna adapte ettik. Küçük ekranlarda navigasyon menüsünün hamburger menüye dönüşmesi, içerik sütunlarının tek sütuna inmesi ve yazı tiplerinin boyutlarının otomatik olarak ayarlanması gibi özellikler standart olarak uygulandı. İşte basit bir media query örneği:


/* styles/globals.css */
.container {
  padding: 1rem;
}

.sidebar {
  width: 250px;
  float: left;
}

.main-content {
  margin-left: 270px;
}

@media (max-width: 768px) {
  .sidebar {
    width: 100%;
    float: none;
    order: -1; /* Mobil görünümde menüyü üste taşı */
  }

  .main-content {
    margin-left: 0;
    width: 100%;
  }

  /* Örneğin, hamburger menü görünür hale getirilebilir */
  .mobile-menu-toggle {
    display: block;
  }
}
    

Bu tür medya sorguları, dokümantasyonun farklı cihazlarda estetik ve işlevsel kalmasını sağlar. Ayrıca, mobil performansı artırmak için resim optimizasyonu (WebP formatı, sıkıştırma), lazy loading ve önbellekleme stratejileri de uygulandı. Bu detaylar, dokümantasyon platformumuzun her kullanıcıya, kullandığı cihazdan bağımsız olarak, sorunsuz bir deneyim sunmasını garantiledi.

İleri Düzey Kullanım İpuçları ve Performans Optimizasyonu

Kendi dokümantasyon çözümümüzü geliştirme sürecinde, sadece temel ihtiyaçları karşılamakla kalmayıp, aynı zamanda deneyimli kullanıcılar için de ileri düzey özellikler ve performans iyileştirmeleri sunmayı hedefledik. Bu kısım, mevcut platformunuzu daha da güçlendirecek ve kullanıcı deneyimini zirveye taşıyacak ipuçları ve püf noktalarını içermektedir. Unutmayın, iyi bir dokümantasyon platformu sadece bilgiyi sunmakla kalmaz, aynı zamanda bu bilgiyi hızlı, erişilebilir ve etkili bir şekilde sunar.

Uzman İpucu: Statik site oluşturucular (SSG) ile dinamik verileri birleştirirken, verinin güncellenme sıklığına göre revalidate süresini ayarlamak performansı ve veri tutarlılığını dengeler. Çok sık güncellenen veriler için kısa (örneğin 60 saniye), nadiren güncellenenler için uzun süreler tercih edilebilir.

Gelişmiş Tema Özelleştirmeleri: Kendi çözümümüzün en büyük avantajlarından biri, tasarıma tam kontrol sağlamasıdır. CSS değişkenleri, Tailwind CSS gibi yardımcı araçlar veya doğrudan SCSS/Less gibi ön işlemciler kullanarak, markanızın kurumsal kimliğine tamamen uygun, benzersiz bir görünüm yaratabilirsiniz. Örneğin, tema renklerini, yazı tiplerini, gölgeleri veya düğme stillerini global olarak tanımlayarak, dokümantasyonunuzun her yerinde tutarlı bir estetik sağlayabilirsiniz. Dark mode (karanlık mod) desteğini entegre etmek de, özellikle uzun süreli okumalar için kullanıcı deneyimini önemli ölçüde iyileştiren bir özelliktir.

SEO İpuçları ve Yapısal Veri İşaretleme: Dokümantasyonunuzun arama motorlarında iyi sıralanması, kullanıcıların doğru bilgiye ulaşması için kritik öneme sahiptir. Next.js gibi bir çerçeve kullanırken, her sayfa için dinamik olarak </code>, <code><meta description></code> ve Open Graph etiketleri (<code>og:image</code>, <code>og:title</code> vb.) oluşturabilirsiniz. Ayrıca, Schema.org üzerinden yapısal veri işaretlemeleri (örneğin, <code>Article</code> veya <code>BreadcrumbList</code> şeması) eklemek, arama motorlarının içeriğinizi daha iyi anlamasına ve zengin snippet'ler göstermesine yardımcı olur. Bir <code>sitemap.xml</code> ve <code>robots.txt</code> dosyası oluşturarak, arama motorlarının sitenizi doğru bir şekilde dizine eklemesini sağlayın. Bu, dokümantasyonunuzun görünürlüğünü %40'a kadar artırabilir.</p> <p><strong>Performans Optimizasyonu ve Hız:</strong> Hızlı yüklenen bir dokümantasyon sitesi, kullanıcı memnuniyetini artırır ve SEO sıralamalarını olumlu etkiler. İşte bazı temel optimizasyon teknikleri:</p> <ul> <li><strong>Resim Optimizasyonu:</strong> Görselleri WebP gibi modern formatlarda kullanın ve boyutlarını optimize edin. Next.js'in <code>Image</code> bileşeni, otomatik optimizasyon ve lazy loading gibi özellikler sunar.</li> <li><strong>Kod Bölümleme (Code Splitting):</strong> Next.js, varsayılan olarak kod bölümleme yapar. Ancak, büyük bileşenleri veya kütüphaneleri dinamik olarak yüklemek (<code>React.lazy</code> veya <code>next/dynamic</code> ile) ilk yükleme süresini daha da kısaltabilir.</li> <li><strong>Önbellekleme Stratejileri:</strong> CDN'ler (İçerik Dağıtım Ağları) kullanarak dokümantasyonunuzu coğrafi olarak kullanıcılara yakın sunun. Tarayıcı önbellekleme (HTTP başlıkları aracılığıyla) statik varlıkların tekrar indirilmesini engeller.</li> <li><strong>Gereksiz JavaScript ve CSS'i Kaldırma:</strong> Kullanılmayan kodları temizleyin. PurgeCSS gibi araçlar, kullanılmayan CSS'i kaldırarak dosya boyutlarını küçültebilir.</li> </ul> <p>Bu ileri düzey teknikleri uygulayarak, dokümantasyon platformunuzu sadece işlevsel değil, aynı zamanda kullanıcı dostu, hızlı ve arama motorları için optimize edilmiş hale getirebilirsiniz. Unutmayın, sürekli iyileştirme, uzun vadeli başarı için anahtardır.</p> <h2>Sonuç</h2> <p>Bu makalede, Mintlify'dan altı ay boyunca yanıtsız kalan kritik bir özellik isteği karşısında nasıl kendi dinamik dokümantasyon çözümümüzü geliştirdiğimizi detaylı bir şekilde inceledik. Başlangıçta Mintlify gibi hazır bir platformun sunduğu kolaylıklardan faydalanırken, iş akışımız için hayati öneme sahip olan dinamik içerik entegrasyonu ve tam özelleştirme yeteneği gibi ihtiyaçlarımızda yetersiz kaldığını gördük. Bu durum, bizi bağımsız bir yola iterek, Next.js, MDX ve CI/CD otomasyonu gibi modern web teknolojilerini kullanarak kendi platformumuzu inşa etmeye yönlendirdi.</p> <p>Geliştirdiğimiz çözüm, sadece Mintlify'daki boşluğu doldurmakla kalmadı, aynı zamanda dokümantasyon süreçlerimiz üzerinde tam kontrol ve esneklik sağladı. Dinamik API verilerini otomatik olarak çekme, özel React bileşenlerini Markdown içeriğine entegre etme ve GitHub Actions ile tam otomatik dağıtım gibi yetenekler sayesinde, dokümantasyonumuz her zaman güncel, tutarlı ve etkileşimli hale geldi. Ayrıca, SEO optimizasyonu ve mobil uyumluluk gibi ileri düzey uygulamalarla, kullanıcı deneyimini önemli ölçüde iyileştirdik. Bu proje, bir üçüncü taraf bağımlılığından kurtularak, kendi teknolojik kapasitemizi geliştirme ve iş ihtiyaçlarımıza tam olarak yanıt veren özel bir çözüm yaratma gücümüzü gösterdi. Bu yolculuk, geliştirme süreçlerinde karşılaşabilecek zorluklara karşı proaktif ve yaratıcı çözümler üretmenin ne kadar önemli olduğunu bir kez daha kanıtladı.</p> <h3>Sıkça Sorulan Sorular (SSS)</h3> <ol> <li> <strong>S: Bu kendi geliştirilen çözüm herkes için uygun mu?</strong><br /> C: Küçük projeler ve temel dokümantasyon ihtiyaçları için Mintlify gibi hazır platformlar genellikle yeterlidir. Ancak, spesifik entegrasyonlar, dinamik veri kaynakları, yoğun özelleştirme veya tam kontrol gerektiren karmaşık projeler için kendi çözümünüzü geliştirmek daha uygun olabilir. Bu, projenizin ölçeğine ve teknik kaynaklarınıza bağlıdır. </li> <li> <strong>S: Mevcut Mintlify dokümantasyonumu bu sisteme taşıyabilir miyim?</strong><br /> C: Evet, çoğu durumda mümkündür. Mintlify da Markdown tabanlı çalıştığı için, mevcut Markdown (veya MDX) dosyalarınızı yeni sisteminize kolayca aktarabilirsiniz. Özel bileşenleriniz varsa, bunları React/MDX olarak yeniden yazmanız gerekebilir. API entegrasyonları için ise, veri çekme mantığını ve şablonları sıfırdan oluşturmanız gerekecektir. </li> <li> <strong>S: Bu tür bir çözümün geliştirme maliyeti ne kadar?</strong><br /> C: Geliştirme maliyeti, projenin karmaşıklığına, özellik setine ve geliştirme ekibinin büyüklüğüne göre büyük ölçüde değişir. Bir geliştiricinin birkaç hafta veya ay süren tam zamanlı çalışması gerekebilir. Başlangıçta hazır bir çözüme göre daha yüksek maliyetli gibi görünse de, uzun vadede lisans ücretlerinden tasarruf etme, tam kontrol ve iş akışına özel entegrasyonlar sayesinde yatırım getirisi yüksek olabilir. </li> <li> <strong>S: Bu çözüm açık kaynak olacak mı?</strong><br /> C: Şu an için şirket içi bir çözüm olarak geliştirildi. Ancak, topluluktan gelen ilgiye göre veya belirli modüllerin genel kullanım potansiyeli olursa, ilerleyen dönemlerde açık kaynak olarak yayınlanması değerlendirilebilir. Amacımız, benzer zorluklar yaşayan diğer geliştiricilere de ilham vermek ve yardımcı olmaktır. </li> </ol> <p></body></p> </div> <div class="cs-entry__footer"> <div class="cs-entry__footer-left"> <div class="cs-entry__post-meta" ><div class="cs-meta-author"><a class="cs-meta-author-link url fn n" href="https://fatihsoysal.com/blog/author/fatihsoysal/"><span class="cs-meta-author-by">by</span><span class="cs-meta-author-name">Fatih Soysal</span></a></div><div class="cs-meta-comments"><a href="https://fatihsoysal.com/blog/mintlify-ignored-this-feature-request-for-6-months-heres-our-solution/#respond" class="comments-link" >0</a></div></div> </div> <div class="cs-entry__footer-right"> <div class="cs-share"> <a class="cs-share__link" target="_blank" href="https://www.facebook.com/sharer.php?text=Mintlify%20Ignored%20This%20Feature%20Request%20for%206%20Months.%20Here%E2%80%99s%20Our%20Solution.&u=https://fatihsoysal.com/blog/mintlify-ignored-this-feature-request-for-6-months-heres-our-solution/"> <i class="cs-icon cs-icon-facebook"></i> </a> <a class="cs-share__link" target="_blank" href="https://twitter.com/share?t=Mintlify%20Ignored%20This%20Feature%20Request%20for%206%20Months.%20Here%E2%80%99s%20Our%20Solution.&url=https://fatihsoysal.com/blog/mintlify-ignored-this-feature-request-for-6-months-heres-our-solution/"> <i class="cs-icon cs-icon-twitter-x"></i> </a> <a class="cs-share__link" target="_blank" href="https://t.me/share/url?url=%5BURL%5D&text=https://fatihsoysal.com/blog/mintlify-ignored-this-feature-request-for-6-months-heres-our-solution/"> <i class="cs-icon cs-icon-telegram"></i> </a> <a class="cs-share__link cs-share__copy-link" target="_blank" href="https://fatihsoysal.com/blog/mintlify-ignored-this-feature-request-for-6-months-heres-our-solution/"> <i class="cs-icon cs-icon-link"></i> </a> </div> </div> </div> <div class="cs-entry__comments" id="comments"> <div class="cs-entry__comments-header"> <div class="cs-entry__comments-left"> <div class="cs-entry__comments-heading">Yorumlar</div> <div class="cs-entry__comments-description h2">İçeriği beğendiniz mi? Bir tartışma başlatın veya görüşlerinizi paylaşın.</div> </div> <div class="cs-entry__comments-right"> <div class="cs-entry__comments-toggle"> <span class="cs-button" role="button" aria-label="Yorumlar"> <span>Yorum Yaz</span> </span> </div> </div> </div> <div class="cs-entry__comments-inner"> <div id="respond" class="comment-respond"> <h2 id="reply-title" class="comment-reply-title">Bir yanıt yazın <small><a rel="nofollow" id="cancel-comment-reply-link" href="/blog/mintlify-ignored-this-feature-request-for-6-months-heres-our-solution/#respond" style="display:none;">Yanıtı iptal et</a></small></h2><form action="https://fatihsoysal.com/blog/wp-comments-post.php" method="post" id="commentform" class="comment-form" novalidate><p class="comment-notes"><span id="email-notes">E-posta adresiniz yayınlanmayacak.</span> <span class="required-field-message">Gerekli alanlar <span class="required">*</span> ile işaretlenmişlerdir</span></p><p class="comment-form-comment"><textarea id="comment" name="comment" cols="45" rows="8" maxlength="65525" required="required" aria-required="true" placeholder="Your Comment *"></textarea></p><p class="comment-form-author"><input id="author" name="author" type="text" value="" size="30" aria-required='true' placeholder="Your Name *" /></p> <p class="comment-form-email"><input id="email" name="email" type="email" value="" size="30" aria-required='true' placeholder="Your E-mail *" /></p> <p class="comment-form-cookies-consent"><input id="wp-comment-cookies-consent" name="wp-comment-cookies-consent" type="checkbox" value="yes"><label for="wp-comment-cookies-consent">Save my name and email in this browser for the next time I comment.</label></p> <p class="form-submit"><button name="submit" type="submit" id="submit" class="submit" value="Yorum gönder" />Gönder </button> <input type='hidden' name='comment_post_ID' value='34867' id='comment_post_ID' /> <input type='hidden' name='comment_parent' id='comment_parent' value='0' /> </p><p style="display: none;"><input type="hidden" id="akismet_comment_nonce" name="akismet_comment_nonce" value="6cdd008316" /></p><p style="display: none !important;" class="akismet-fields-container" data-prefix="ak_"><label>Δ<textarea name="ak_hp_textarea" cols="45" rows="8" maxlength="100"></textarea></label><input type="hidden" id="ak_js_1" name="ak_js" value="221"/><script> document.getElementById( "ak_js_1" ).setAttribute( "value", ( new Date() ).getTime() ); </script> </p></form> </div><!-- #respond --> </div> </div> </div> </div> </div> </div> </div> <section class="cs-read-next"> <h2 class="cs-read-next__heading"> Aşağıdaki içerikler de ilgilinizi çekebilir: </h2> <div class="cs-read-next__list cs-posts-area__archive"> <article class="cs-read-next__item post-34870 post type-post status-publish format-standard category-genel cs-entry cs-video-wrap"> <div class="cs-entry__outer"> <div class="cs-entry__inner cs-entry__content"> <div class="cs-entry__info"> <h2 class="cs-entry__title"><a href="https://fatihsoysal.com/blog/kexp-canli-performanslarinin-perde-arkasi-yin-yin-golden-lion/">KEXP Canlı Performanslarının Perde Arkası: Yin Yin – Golden Lion<div class="cs-entry__post-meta" ><div class="cs-meta-date">23 Kasım 2025</div></div></a></h2> </div> </div> </div> </article> <article class="cs-read-next__item post-34871 post type-post status-publish format-standard category-genel cs-entry cs-video-wrap"> <div class="cs-entry__outer"> <div class="cs-entry__inner cs-entry__content"> <div class="cs-entry__info"> <h2 class="cs-entry__title"><a href="https://fatihsoysal.com/blog/arama-motorlari-sorularinizi-gercekten-nasil-cevaplar/">Arama Motorları Sorularınızı Gerçekten Nasıl Cevaplar?<div class="cs-entry__post-meta" ><div class="cs-meta-date">23 Kasım 2025</div></div></a></h2> </div> </div> </div> </article> <article class="cs-read-next__item post-34872 post type-post status-publish format-standard category-genel cs-entry cs-video-wrap"> <div class="cs-entry__outer"> <div class="cs-entry__inner cs-entry__content"> <div class="cs-entry__info"> <h2 class="cs-entry__title"><a href="https://fatihsoysal.com/blog/uxin-gelecegi-robotik-telepresence-ve-insan-odakli-tasarimin-yukselisi/">UX’in Geleceği: Robotik, Telepresence ve İnsan-Odaklı Tasarımın Yükselişi<div class="cs-entry__post-meta" ><div class="cs-meta-date">23 Kasım 2025</div></div></a></h2> </div> </div> </div> </article> <article class="cs-read-next__item post-34875 post type-post status-publish format-standard category-genel cs-entry cs-video-wrap"> <div class="cs-entry__outer"> <div class="cs-entry__inner cs-entry__content"> <div class="cs-entry__info"> <h2 class="cs-entry__title"><a href="https://fatihsoysal.com/blog/web-temelleri-neden-surekli-framework-dongusunden-ustundur/">Web Temelleri Neden Sürekli Framework Döngüsünden Üstündür?<div class="cs-entry__post-meta" ><div class="cs-meta-date">23 Kasım 2025</div></div></a></h2> </div> </div> </div> </article> </div> </section> <div class="cs-subscribe"> <div class="cs-subscribe__content"> <div class="cs-subscribe__header"> <div class="cs-subscribe__heading h2"> E-posta Bülteni </div> <div class="cs-subscribe__subheading h2"> Yazılım Topluluğuna Katılın </div> <div class="cs-subscribe__description"> En son güncellemeleri, yaratıcı ipuçlarını ve özel kaynakları doğrudan e-posta kutunuza alın. Tasarım ve inovasyonun geleceğini birlikte keşfedelim. </div> </div> <form class="cs-subscribe__form" action="https://codesupply.us13.list-manage.com/subscribe/post?u=41845cb8908fb4302a4df512f&id=b5a5e9c757" method="post" target="_blank" novalidate> <div class="cs-form-group cs-subscribe__form-group"> <input type="email" placeholder="Your E-mail" name="EMAIL" required> <button type="submit" value="Abone Ol" aria-label="Abone Ol" name="subscribe"> <span>Abone Ol</span> </button> </div> </form> </div> </div> </div> </div> </main> </div> </div> <footer class="cs-footer" data-scheme="auto" data-l="light" data-d="dark"> <div class="cs-footer__item cs-footer__item-top-bar"> <div class="cs-container"> <div class="cs-footer__item-inner"> <div class="cs-footer__col cs-col-left"> <div class="cs-footer-columns__nav-menu"> <ul id="menu-menu-5" class="cs-footer-columns__nav "><li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-19194 csco-menu-item-style-none"><a href="https://fatihsoysal.com/"><span>Anasayfa</span></a></li> <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-11 csco-menu-item-style-none"><a href="https://fatihsoysal.com/blog/hakkimda/"><span>Hakkımda</span></a></li> <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-25363 csco-menu-item-style-none"><a href="#"><span>Eğitimler</span></a></li> <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-30019 csco-menu-item-style-none"><a href="#"><span>Makaleler</span></a></li> <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-home menu-item-69 csco-menu-item-style-none"><a href="https://fatihsoysal.com/blog"><span>Blog</span></a></li> <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-35075 csco-menu-item-style-none"><a href="#"><span>Kategoriler</span></a></li> <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-257 csco-menu-item-style-none"><a href="https://fatihsoysal.com/blog/iletisim/"><span>Bana Ulaşın</span></a></li> </ul> </div> </div> <div class="cs-footer__col cs-col-right"> <div class="cs-social"> <a class="cs-social__link" href="https://www.linkedin.com/in/fatihsoysal/" target="_blank" title="Linkedin"> <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><path d="M16.8169 2.00011H3.1831C3.02984 1.998 2.87767 2.02591 2.73526 2.08226C2.59286 2.13861 2.46302 2.22229 2.35316 2.32852C2.24329 2.43475 2.15556 2.56145 2.09496 2.70139C2.03437 2.84133 2.0021 2.99176 2 3.1441V16.8559C2.0021 17.0082 2.03437 17.1587 2.09496 17.2986C2.15556 17.4385 2.24329 17.5653 2.35316 17.6715C2.46302 17.7777 2.59286 17.8614 2.73526 17.9177C2.87767 17.9741 3.02984 18.002 3.1831 17.9999H16.8169C16.9702 18.002 17.1223 17.9741 17.2647 17.9177C17.4071 17.8614 17.537 17.7777 17.6468 17.6715C17.7567 17.5653 17.8444 17.4385 17.905 17.2986C17.9656 17.1587 17.9979 17.0082 18 16.8559V3.1441C17.9979 2.99176 17.9656 2.84133 17.905 2.70139C17.8444 2.56145 17.7567 2.43475 17.6468 2.32852C17.537 2.22229 17.4071 2.13861 17.2647 2.08226C17.1223 2.02591 16.9702 1.998 16.8169 2.00011ZM6.85312 15.3919H4.43863V8.19203H6.85312V15.3919ZM5.64588 7.18404C5.31289 7.18404 4.99354 7.05256 4.75808 6.81851C4.52262 6.58447 4.39034 6.26704 4.39034 5.93606C4.39034 5.60507 4.52262 5.28764 4.75808 5.0536C4.99354 4.81956 5.31289 4.68807 5.64588 4.68807C5.82269 4.66814 6.00175 4.68556 6.17133 4.73918C6.3409 4.7928 6.49717 4.88142 6.6299 4.99924C6.76264 5.11706 6.86883 5.26141 6.94155 5.42285C7.01426 5.58429 7.05185 5.75918 7.05185 5.93606C7.05185 6.11294 7.01426 6.28782 6.94155 6.44926C6.86883 6.6107 6.76264 6.75506 6.6299 6.87287C6.49717 6.99069 6.3409 7.07931 6.17133 7.13293C6.00175 7.18656 5.82269 7.20397 5.64588 7.18404ZM15.5614 15.3919H13.1469V11.528C13.1469 10.56 12.8008 9.928 11.9235 9.928C11.652 9.92998 11.3877 10.0146 11.1661 10.1705C10.9445 10.3264 10.7762 10.5461 10.6841 10.8C10.6211 10.988 10.5938 11.186 10.6036 11.384V15.3839H8.18913V8.18402H10.6036V9.20001C10.823 8.8217 11.142 8.51004 11.5263 8.29859C11.9106 8.08713 12.3457 7.98391 12.7847 8.00003C14.3944 8.00003 15.5614 9.03201 15.5614 11.248V15.3919Z"/></svg> </a> </div> </div> </div> </div> </div> <div class="cs-footer__item cs-footer__item-bottom-bar"> <div class="cs-container"> <div class="cs-footer__item-inner"> <div class="cs-footer__col cs-col-left"> <div class="cs-footer__nav-menu"> <ul id="menu-footer" class="cs-footer__nav "><li id="menu-item-39737" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-39737"><a href="https://fatihsoysal.com/blog/category/ai/"><span>AI</span></a></li> <li id="menu-item-39739" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-39739"><a href="https://fatihsoysal.com/blog/category/akademik-ve-bilimsel/"><span>Akademik ve Bilimsel</span></a></li> <li id="menu-item-39740" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-39740"><a href="https://fatihsoysal.com/blog/category/angular/"><span>Angular</span></a></li> <li id="menu-item-39741" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-39741"><a href="https://fatihsoysal.com/blog/category/aws/"><span>AWS</span></a></li> <li id="menu-item-39742" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-39742"><a href="https://fatihsoysal.com/blog/category/azure/"><span>Azure</span></a></li> <li id="menu-item-39743" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-39743"><a href="https://fatihsoysal.com/blog/category/bash/"><span>Bash</span></a></li> <li id="menu-item-39745" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-39745"><a href="https://fatihsoysal.com/blog/category/c-2/"><span>C++</span></a></li> <li id="menu-item-39746" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-39746"><a href="https://fatihsoysal.com/blog/category/cloud/"><span>Cloud</span></a></li> <li id="menu-item-39748" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-39748"><a href="https://fatihsoysal.com/blog/category/devops/"><span>Devops</span></a></li> <li id="menu-item-39749" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-39749"><a href="https://fatihsoysal.com/blog/category/docker/"><span>Docker</span></a></li> <li id="menu-item-39750" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-39750"><a href="https://fatihsoysal.com/blog/category/dusunsel-ve-kisisel/"><span>Düşünsel ve Kişisel</span></a></li> <li id="menu-item-39751" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-39751"><a href="https://fatihsoysal.com/blog/category/egitim/"><span>Eğitim</span></a></li> <li id="menu-item-39752" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-39752"><a href="https://fatihsoysal.com/blog/category/flutter/"><span>Flutter</span></a></li> <li id="menu-item-39754" class="menu-item menu-item-type-taxonomy menu-item-object-category current-post-ancestor current-menu-parent current-post-parent menu-item-39754"><a href="https://fatihsoysal.com/blog/category/genel/"><span>Genel</span></a></li> <li id="menu-item-39755" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-39755"><a href="https://fatihsoysal.com/blog/category/git/"><span>Git</span></a></li> <li id="menu-item-39758" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-39758"><a href="https://fatihsoysal.com/blog/category/is-dunyasi/"><span>İş Dünyası</span></a></li> <li id="menu-item-39759" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-39759"><a href="https://fatihsoysal.com/blog/category/java/"><span>Java</span></a></li> <li id="menu-item-39760" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-39760"><a href="https://fatihsoysal.com/blog/category/kubernetes/"><span>Kubernetes</span></a></li> <li id="menu-item-39761" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-39761"><a href="https://fatihsoysal.com/blog/category/mobile/"><span>Mobile</span></a></li> <li id="menu-item-39762" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-39762"><a href="https://fatihsoysal.com/blog/category/mongodb/"><span>MongoDB</span></a></li> <li id="menu-item-39763" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-39763"><a href="https://fatihsoysal.com/blog/category/mvc/"><span>MVC</span></a></li> <li id="menu-item-39764" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-39764"><a href="https://fatihsoysal.com/blog/category/nextjs/"><span>NextJS</span></a></li> <li id="menu-item-39765" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-39765"><a href="https://fatihsoysal.com/blog/category/nginx/"><span>Nginx</span></a></li> <li id="menu-item-39766" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-39766"><a href="https://fatihsoysal.com/blog/category/powershell/"><span>PowerShell</span></a></li> <li id="menu-item-39767" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-39767"><a href="https://fatihsoysal.com/blog/category/programming-patterns/"><span>Programming Patterns</span></a></li> <li id="menu-item-39768" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-39768"><a href="https://fatihsoysal.com/blog/category/python/"><span>Python</span></a></li> <li id="menu-item-39769" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-39769"><a href="https://fatihsoysal.com/blog/category/redis/"><span>Redis</span></a></li> <li id="menu-item-39770" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-39770"><a href="https://fatihsoysal.com/blog/category/sed/"><span>Sed</span></a></li> <li id="menu-item-39771" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-39771"><a href="https://fatihsoysal.com/blog/category/server/"><span>Server</span></a></li> <li id="menu-item-39772" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-39772"><a href="https://fatihsoysal.com/blog/category/yazilim/net/"><span>.NET</span></a></li> <li id="menu-item-39773" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-39773"><a href="https://fatihsoysal.com/blog/category/yazilim/ajax/"><span>AJAX</span></a></li> <li id="menu-item-39774" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-39774"><a href="https://fatihsoysal.com/blog/category/yazilim/asp-net/"><span>ASP.NET</span></a></li> <li id="menu-item-39775" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-39775"><a href="https://fatihsoysal.com/blog/category/yazilim/c/"><span>C#</span></a></li> <li id="menu-item-39776" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-39776"><a href="https://fatihsoysal.com/blog/category/yazilim/css3-html5/"><span>CSS3 – HTML5</span></a></li> <li id="menu-item-39777" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-39777"><a href="https://fatihsoysal.com/blog/category/yazilim/java-android-development/"><span>JAVA – Android</span></a></li> <li id="menu-item-39778" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-39778"><a href="https://fatihsoysal.com/blog/category/yazilim/javascript/"><span>Javascript</span></a></li> <li id="menu-item-39779" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-39779"><a href="https://fatihsoysal.com/blog/category/yazilim/linux/"><span>Linux</span></a></li> <li id="menu-item-39780" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-39780"><a href="https://fatihsoysal.com/blog/category/yazilim/php/"><span>PHP</span></a></li> <li id="menu-item-39781" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-39781"><a href="https://fatihsoysal.com/blog/category/yazilim/javascript/jquery/"><span>jQuery</span></a></li> <li id="menu-item-39782" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-39782"><a href="https://fatihsoysal.com/blog/category/yazilim/javascript/node-js/"><span>Node.js</span></a></li> <li id="menu-item-39783" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-39783"><a href="https://fatihsoysal.com/blog/category/yazilim/javascript/react/"><span>React</span></a></li> <li id="menu-item-39784" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-39784"><a href="https://fatihsoysal.com/blog/category/yazilim/sql/ms-sql-server/"><span>MS SQL Server</span></a></li> <li id="menu-item-39785" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-39785"><a href="https://fatihsoysal.com/blog/category/yazilim/sql/mysql/"><span>MySQL</span></a></li> <li id="menu-item-39786" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-39786"><a href="https://fatihsoysal.com/blog/category/yazilim/sql/postgresql/"><span>PostgreSQL</span></a></li> </ul> </div> </div> <div class="cs-footer__col cs-col-right"> <div class="cs-footer__copyright"> © 2026 Fatih Soysal 💻🚀 All rights reserved. Built with passion & caffeine ☕ </div> </div> </div> </div> </div> </footer> <button class="cs-scroll-top" role="button" aria-label="Scroll to top button"> <i class="cs-icon cs-icon-chevron-up"></i> <div class="cs-scroll-top-border"> <svg width="52" height="52" viewBox="0 0 52 52"> <path d="M26,2 a24,24 0 0,1 0,48 a24,24 0 0,1 0,-48" style="stroke-width: 2; fill: none;"></path> </svg> </div> <div class="cs-scroll-top-progress"> <svg width="52" height="52" viewBox="0 0 52 52"> <path d="M26,2 a24,24 0 0,1 0,48 a24,24 0 0,1 0,-48" style="stroke-width: 2; fill: none;"></path> </svg> </div> </button> <script type="text/javascript"> var CF7AppsLoadhCaptcha = function() { var hcaptcha = document.querySelectorAll( '.h-captcha' ); for (var i = 0; i < hcaptcha.length; i++) { hcaptcha[i].setAttribute( 'data-sitekey', '' ); hcaptcha[i].setAttribute( 'data-callback', 'cf7apps_hcaptcha_callback' ); } }; </script> <script src="https://js.hcaptcha.com/1/api.js?onload=CF7AppsLoadhCaptcha" async defer ></script> <script> const lazyloadRunObserver = () => { const lazyloadBackgrounds = document.querySelectorAll( `.e-con.e-parent:not(.e-lazyloaded)` ); const lazyloadBackgroundObserver = new IntersectionObserver( ( entries ) => { entries.forEach( ( entry ) => { if ( entry.isIntersecting ) { let lazyloadBackground = entry.target; if( lazyloadBackground ) { lazyloadBackground.classList.add( 'e-lazyloaded' ); } lazyloadBackgroundObserver.unobserve( entry.target ); } }); }, { rootMargin: '200px 0px 200px 0px' } ); lazyloadBackgrounds.forEach( ( lazyloadBackground ) => { lazyloadBackgroundObserver.observe( lazyloadBackground ); } ); }; const events = [ 'DOMContentLoaded', 'elementor/lazyload/observe', ]; events.forEach( ( event ) => { document.addEventListener( event, lazyloadRunObserver ); } ); </script> <script src="https://fatihsoysal.com/blog/wp-content/plugins/embed-any-document/js/pdfobject.min.js?ver=2.7.12" id="awsm-ead-pdf-object-js"></script> <script id="awsm-ead-public-js-extra"> var eadPublic = []; </script> <script src="https://fatihsoysal.com/blog/wp-content/plugins/embed-any-document/js/embed-public.min.js?ver=2.7.12" id="awsm-ead-public-js"></script> <script src="https://fatihsoysal.com/blog/wp-includes/js/dist/hooks.min.js?ver=4d63a3d491d11ffd8ac6" id="wp-hooks-js"></script> <script src="https://fatihsoysal.com/blog/wp-includes/js/dist/i18n.min.js?ver=5e580eb46a90c2b997e6" id="wp-i18n-js"></script> <script id="wp-i18n-js-after"> wp.i18n.setLocaleData( { 'text direction\u0004ltr': [ 'ltr' ] } ); </script> <script src="https://fatihsoysal.com/blog/wp-content/plugins/contact-form-7/includes/swv/js/index.js?ver=6.1.5" id="swv-js"></script> <script id="contact-form-7-js-translations"> ( function( domain, translations ) { var localeData = translations.locale_data[ domain ] || translations.locale_data.messages; localeData[""].domain = domain; wp.i18n.setLocaleData( localeData, domain ); } )( "contact-form-7", {"translation-revision-date":"2026-01-19 21:19:08+0000","generator":"GlotPress\/4.0.3","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n > 1;","lang":"tr"},"This contact form is placed in the wrong place.":["Bu ileti\u015fim formu yanl\u0131\u015f yere yerle\u015ftirilmi\u015f."],"Error:":["Hata:"]}},"comment":{"reference":"includes\/js\/index.js"}} ); </script> <script id="contact-form-7-js-before"> var wpcf7 = { "api": { "root": "https:\/\/fatihsoysal.com\/blog\/wp-json\/", "namespace": "contact-form-7\/v1" } }; </script> <script src="https://fatihsoysal.com/blog/wp-content/plugins/contact-form-7/includes/js/index.js?ver=6.1.5" id="contact-form-7-js"></script> <script src="https://fatihsoysal.com/blog/wp-includes/js/imagesloaded.min.js?ver=5.0.0" id="imagesloaded-js"></script> <script src="https://fatihsoysal.com/blog/wp-content/plugins/sight/render/js/jquery.magnific-popup.min.js?ver=1777452259" id="magnific-popup-js"></script> <script id="sight-block-script-js-extra"> var sight_lightbox_localize = {"text_previous":"Previous","text_next":"Next","text_close":"Close","text_loading":"Loading","text_counter":"of"}; </script> <script src="https://fatihsoysal.com/blog/wp-content/plugins/sight/render/js/sight.js?ver=1777452259" id="sight-block-script-js"></script> <script src="https://fatihsoysal.com/blog/wp-content/plugins/easy-syntax-highlighter/assets/js/highlight.min.js?ver=11.9.0" id="esh-highlight-js-js"></script> <script id="esh-highlight-js-js-after"> document.addEventListener("DOMContentLoaded", () => { hljs.highlightAll(); }); </script> <script id="esh-frontend-js-extra"> var esh_i18n = {"copied":"\u5df2\u590d\u5236\uff01","copy_failed":"\u590d\u5236\u5931\u8d25"}; </script> <script src="https://fatihsoysal.com/blog/wp-content/plugins/easy-syntax-highlighter/assets/js/frontend.js?ver=2.0.0" id="esh-frontend-js"></script> <script src="https://www.google.com/recaptcha/api.js?render=6Lfq6JMsAAAAAFwFocaWCzv-A3znzOaIyo9ACOYg&ver=3.0" id="google-recaptcha-js"></script> <script src="https://fatihsoysal.com/blog/wp-includes/js/dist/vendor/wp-polyfill.min.js?ver=3.15.0" id="wp-polyfill-js"></script> <script id="wpcf7-recaptcha-js-before"> var wpcf7_recaptcha = { "sitekey": "6Lfq6JMsAAAAAFwFocaWCzv-A3znzOaIyo9ACOYg", "actions": { "homepage": "homepage", "contactform": "contactform" } }; </script> <script src="https://fatihsoysal.com/blog/wp-content/plugins/contact-form-7/modules/recaptcha/index.js?ver=6.1.5" id="wpcf7-recaptcha-js"></script> <script id="csco-scripts-js-extra"> var csLocalize = {"siteSchemeMode":"system","siteSchemeToogle":"1","shareCopiedText":"URL copied","subscribeProcess":"Processing your subscription...","subscribeSuccess":"Thank you for subscribing!","subscribeError":"Form submission error"}; </script> <script src="https://fatihsoysal.com/blog/wp-content/themes/intro/assets/js/scripts.js?ver=6.7.9" id="csco-scripts-js"></script> <script src="https://fatihsoysal.com/blog/wp-content/themes/intro/assets/static/js/comment-reply.js?ver=6.7.9" id="csco-comment-reply-js"></script> <script defer src="https://fatihsoysal.com/blog/wp-content/plugins/akismet/_inc/akismet-frontend.js?ver=1777452205" id="akismet-frontend-js"></script> </div> </body> </html>