<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0" 
     xmlns:content="http://purl.org/rss/1.0/modules/content/"
     xmlns:dc="http://purl.org/dc/elements/1.1/"
     xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title><![CDATA[Onurhan Demir - Blog]]></title>
    <link>https://onurhan.dev/blog</link>
    <description><![CDATA[Software development articles, tutorials, and insights on React, Next.js, TypeScript, and modern web technologies.]]></description>
    <language>en-us</language>
    <lastBuildDate>Sat, 05 Sep 2026 12:09:45 GMT</lastBuildDate>
    <atom:link href="https://onurhan.dev/feed.xml" rel="self" type="application/rss+xml" />
    <managingEditor>onurhan@onurhan.dev (Onurhan Demir)</managingEditor>
    <webMaster>onurhan@onurhan.dev (Onurhan Demir)</webMaster>
    <copyright>Copyright 2026 Onurhan Demir</copyright>
    <image>
      <url>https://onurhan.dev/logo.svg</url>
      <title>Onurhan Demir</title>
      <link>https://onurhan.dev</link>
    </image>
    
    <item>
      <title><![CDATA[Talking to a Wall in the Age of AI: When Effort Becomes Invisible]]></title>
      <link>https://onurhan.dev/blog/i-need-to-talk-about-ai</link>
      <guid isPermaLink="true">https://onurhan.dev/blog/i-need-to-talk-about-ai</guid>
      <description><![CDATA[The impact of AI on how we consume and create content, and why it's frustrating.]]></description>
      <pubDate>Wed, 31 Dec 2025 00:00:00 GMT</pubDate>
      <dc:creator><![CDATA[Onurhan Demir]]></dc:creator>
      <dc:language>en-us</dc:language>
      <dc:date>2025-12-31T00:00:00.000Z</dc:date>
      <content:encoded><![CDATA[I need to speak up. The problem might not be AI itself, but the effects it brings are creating issues and I'm starting to get tired of it.

I'm someone who loves sharing the code I develop, the articles I read, and the knowledge I learn. One proof of this is that I started blogging 7 years ago. Afte...]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[Kevi: Multi-tenant key-value API for the edge]]></title>
      <link>https://onurhan.dev/blog/kevi-app</link>
      <guid isPermaLink="true">https://onurhan.dev/blog/kevi-app</guid>
      <description><![CDATA[Build secure, isolated key-value storage for multiple services on Cloudflare Workers.]]></description>
      <pubDate>Sat, 27 Dec 2025 00:00:00 GMT</pubDate>
      <dc:creator><![CDATA[Onurhan Demir]]></dc:creator>
      <dc:language>en-us</dc:language>
      <dc:date>2025-12-27T00:00:00.000Z</dc:date>
      <content:encoded><![CDATA[Applications need to store configuration data. Feature flags, settings, and values that change without updating code. When you have multiple services, each one needs its own storage. They should not see each other's data.

Kevi is a key-value API for Cloudflare Workers. It lets you run one API for m...]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[Turning an Idea into a Tool: quzz]]></title>
      <link>https://onurhan.dev/blog/turning-idea-into-tool-quzz</link>
      <guid isPermaLink="true">https://onurhan.dev/blog/turning-idea-into-tool-quzz</guid>
      <description><![CDATA[Building my first npm package. A weekend project that taught me more about JavaScript internals than I expected.]]></description>
      <pubDate>Sat, 25 Oct 2025 00:00:00 GMT</pubDate>
      <dc:creator><![CDATA[Onurhan Demir]]></dc:creator>
      <dc:language>en-us</dc:language>
      <dc:date>2025-10-25T00:00:00.000Z</dc:date>
      <content:encoded><![CDATA[Late night. Terminal full of console.logs. React Server Component refusing to cooperate.

The error message was useless. The stack trace pointed nowhere. React DevTools couldn't help - server components are invisible to it.

I needed to see what was happening inside these components. When they rende...]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[How Realtime Audio Really Works]]></title>
      <link>https://onurhan.dev/blog/realtime-audio</link>
      <guid isPermaLink="true">https://onurhan.dev/blog/realtime-audio</guid>
      <description><![CDATA[Speech → Text → LLM → Text → Speech. Realtime audio is just a chain — cut the delay and it feels alive.]]></description>
      <pubDate>Sun, 21 Sep 2025 00:00:00 GMT</pubDate>
      <dc:creator><![CDATA[Onurhan Demir]]></dc:creator>
      <dc:language>en-us</dc:language>
      <dc:date>2025-09-21T00:00:00.000Z</dc:date>
      <content:encoded><![CDATA[import { Callout } from "components/Callout";

Realtime audio looks simple: **input → process → output**.  
But every step hides real engineering problems. The trick isn’t building the chain. The trick is cutting latency until it feels alive.

## The Flow

<RealtimeAudioFlow />

### 1. Speech Input...]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[markdown2pdf: A Minimal Way to Turn Markdown into PDF]]></title>
      <link>https://onurhan.dev/blog/use-markdown2pdf</link>
      <guid isPermaLink="true">https://onurhan.dev/blog/use-markdown2pdf</guid>
      <description><![CDATA[Exploring a small Rust-based CLI tool to convert Markdown files into styled PDFs, without the overhead.]]></description>
      <pubDate>Tue, 08 Jul 2025 00:00:00 GMT</pubDate>
      <dc:creator><![CDATA[Onurhan Demir]]></dc:creator>
      <dc:language>en-us</dc:language>
      <dc:date>2025-07-08T00:00:00.000Z</dc:date>
      <content:encoded><![CDATA[For years, I've relied on Markdown for notes, documentation, and blog drafts like this one.

But converting `.md` files to polished PDFs is often more complicated than necessary.

I've used Pandoc; it works well but is overkill for simple needs. The Markdown-to-HTML-to-PDF process feels cumbersome a...]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[Understanding Go Channels Through Visualization]]></title>
      <link>https://onurhan.dev/blog/understanding-go-channels</link>
      <guid isPermaLink="true">https://onurhan.dev/blog/understanding-go-channels</guid>
      <description><![CDATA[Learn Go channels through interactive visualizations. See how channels enable safe communication between goroutines and master concurrent programming in Go.]]></description>
      <pubDate>Tue, 31 Dec 2024 00:00:00 GMT</pubDate>
      <dc:creator><![CDATA[Onurhan Demir]]></dc:creator>
      <dc:language>en-us</dc:language>
      <dc:date>2024-12-31T00:00:00.000Z</dc:date>
      <content:encoded><![CDATA[Go's concurrency model is built on two fundamental concepts: goroutines and channels. While goroutines handle concurrent execution, channels provide the means for them to communicate safely. Let's explore channels, with a focus on unbuffered channels, using interactive visualizations.

## Understand...]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[noktaları birleştirmek]]></title>
      <link>https://onurhan.dev/blog/connecting-the-dots</link>
      <guid isPermaLink="true">https://onurhan.dev/blog/connecting-the-dots</guid>
      <description><![CDATA[henüz tamamlanmamış bir yolculuk]]></description>
      <pubDate>Mon, 23 Dec 2024 00:00:00 GMT</pubDate>
      <dc:creator><![CDATA[Onurhan Demir]]></dc:creator>
      <dc:language>tr-tr</dc:language>
      <dc:date>2024-12-23T00:00:00.000Z</dc:date>
      <content:encoded><![CDATA[<Callout>
  "You can't connect the dots looking forward; you can only connect them looking
  backwards. So you have to trust that the dots will somehow connect in your
  future." — Steve Jobs
</Callout>

## 2022

Liseyi bitirmeye yaklaşırken hayatımız eve kapandı. O süreçte sabahın altısında kalkıp...]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[AI Agents: How to Build Goal-Oriented Problem Solvers]]></title>
      <link>https://onurhan.dev/blog/understanding-ai-agents</link>
      <guid isPermaLink="true">https://onurhan.dev/blog/understanding-ai-agents</guid>
      <description><![CDATA[This hands-on guide dives into AI agents and demonstrates building a goal-oriented agent to automate tasks.]]></description>
      <pubDate>Thu, 28 Nov 2024 00:00:00 GMT</pubDate>
      <dc:creator><![CDATA[Onurhan Demir]]></dc:creator>
      <dc:language>en-us</dc:language>
      <dc:date>2024-11-28T00:00:00.000Z</dc:date>
      <content:encoded><![CDATA[Imagine software that thinks, learns, and solves problems like a human. AI agents are making this possible by redefining automation.

## What Are AI Agents?

AI agents are **autonomous software systems** that simulate human decision-making to solve tasks efficiently and intelligently. Unlike traditi...]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[How LLMs Work]]></title>
      <link>https://onurhan.dev/blog/how-llms-work</link>
      <guid isPermaLink="true">https://onurhan.dev/blog/how-llms-work</guid>
      <description><![CDATA[Learn how Large Language Models (LLMs) use tokenization, embeddings, self-attention, and decoding to process.]]></description>
      <pubDate>Tue, 26 Nov 2024 00:00:00 GMT</pubDate>
      <dc:creator><![CDATA[Onurhan Demir]]></dc:creator>
      <dc:language>en-us</dc:language>
      <dc:date>2024-11-26T00:00:00.000Z</dc:date>
      <content:encoded><![CDATA[Large Language Models (LLMs) like GPT are advanced AI systems designed to process and generate human-like text. Here's a comprehensive breakdown of their inner workings:

## 1. Tokenization: Splitting Text into Manageable Units

Tokenization is the first critical step where input text is split into...]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[JavaScript IIFE: A Complete Guide to Immediately Invoked Function Expressions]]></title>
      <link>https://onurhan.dev/blog/mastering-IIFE-in-javascript</link>
      <guid isPermaLink="true">https://onurhan.dev/blog/mastering-IIFE-in-javascript</guid>
      <description><![CDATA[Learn how IIFEs can streamline your JavaScript code, solve scope-related challenges, and when to choose modern alternatives like ES modules.]]></description>
      <pubDate>Sat, 23 Nov 2024 00:00:00 GMT</pubDate>
      <dc:creator><![CDATA[Onurhan Demir]]></dc:creator>
      <dc:language>en-us</dc:language>
      <dc:date>2024-11-23T00:00:00.000Z</dc:date>
      <content:encoded><![CDATA[JavaScript offers various tools for handling scope and execution effectively, and one of the most notable ones is the **Immediately Invoked Function Expression (IIFE)**.

An IIFE is a function that is executed immediately after being defined, providing a private scope for variables and functionality...]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[Automate the tasks]]></title>
      <link>https://onurhan.dev/blog/automate-the-tasks-using-vercel-cron-jobs</link>
      <guid isPermaLink="true">https://onurhan.dev/blog/automate-the-tasks-using-vercel-cron-jobs</guid>
      <description><![CDATA[Automate the tasks using Vercel Cron Jobs.]]></description>
      <pubDate>Wed, 10 Jul 2024 00:00:00 GMT</pubDate>
      <dc:creator><![CDATA[Onurhan Demir]]></dc:creator>
      <dc:language>en-us</dc:language>
      <dc:date>2024-07-10T00:00:00.000Z</dc:date>
      <content:encoded><![CDATA[Cron Jobs are commands that run automatically at specific time intervals (e.g. daily, weekly, hourly).

The Cron job feature can be used for operations performed at specific intervals such as data synchronization, email sending, backup operations, and more.

Vercel, on the other hand, hosts the Cron...]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[Using Zod to validate date range picker]]></title>
      <link>https://onurhan.dev/blog/using-zod-to-validate-date-range-picker</link>
      <guid isPermaLink="true">https://onurhan.dev/blog/using-zod-to-validate-date-range-picker</guid>
      <description><![CDATA[Learn how to use Zod, a TypeScript-first schema declaration and validation library, to validate date range picker in your project.]]></description>
      <pubDate>Sun, 14 Apr 2024 00:00:00 GMT</pubDate>
      <dc:creator><![CDATA[Onurhan Demir]]></dc:creator>
      <dc:language>en-us</dc:language>
      <dc:date>2024-04-14T00:00:00.000Z</dc:date>
      <content:encoded><![CDATA[### What is Zod?

<Callout emoji="🌊">
  <a href="https://github.com/colinhacks/zod">
    <b>Zod</b> is a TypeScript-first schema declaration and validation library.
  </a>
</Callout>

### Prerequisites

I used shadcn/ui for the date range picker component, date-fns for the date format, and zod for...]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[2024 Blog Refresh]]></title>
      <link>https://onurhan.dev/blog/2024-blog-refresh</link>
      <guid isPermaLink="true">https://onurhan.dev/blog/2024-blog-refresh</guid>
      <description><![CDATA[New design, new features, new content.]]></description>
      <pubDate>Sat, 30 Mar 2024 00:00:00 GMT</pubDate>
      <dc:creator><![CDATA[Onurhan Demir]]></dc:creator>
      <dc:language>en-us</dc:language>
      <dc:date>2024-03-30T00:00:00.000Z</dc:date>
      <content:encoded><![CDATA[I updated my blog this weekend and wanted to share some thoughts along the way:

- [Performance](#performance)
- [Markdown Rendering](#markdown-rendering)
- [Outdated dependencies](#outdated-dependencies)

## Performance

Actually my old blog was pretty fast, but I wanted to make sure that t...]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[Supabase & Lemon Squeezy magic link integration]]></title>
      <link>https://onurhan.dev/blog/supabase-lemonsqueezy-magic-link-integration</link>
      <guid isPermaLink="true">https://onurhan.dev/blog/supabase-lemonsqueezy-magic-link-integration</guid>
      <description><![CDATA[Simplify customer access and streamline sales processes.]]></description>
      <pubDate>Thu, 28 Mar 2024 00:00:00 GMT</pubDate>
      <dc:creator><![CDATA[Onurhan Demir]]></dc:creator>
      <dc:language>en-us</dc:language>
      <dc:date>2024-03-28T00:00:00.000Z</dc:date>
      <content:encoded><![CDATA[In the realm of online sales, the journey from seller to buyer is often marked by complexities. However, with the strategic fusion of Supabase and Lemon Squeezy, a new paradigm emerges, simplifying this journey for both parties.

### How it works

To create a plot, a seller (X) puts their product fo...]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[Use an AI text-to-image Generator model in Replicate with Nextjs and TypeScript | Step-by-Step guide]]></title>
      <link>https://onurhan.dev/blog/use-an-ai-text-to-image-generator-model-in-replicate</link>
      <guid isPermaLink="true">https://onurhan.dev/blog/use-an-ai-text-to-image-generator-model-in-replicate</guid>
      <description><![CDATA[A Comprehensive Guide to AI Text-to-Image Generation in Replicate with Next.js and TypeScript.]]></description>
      <pubDate>Sat, 23 Sep 2023 00:00:00 GMT</pubDate>
      <dc:creator><![CDATA[Onurhan Demir]]></dc:creator>
      <dc:language>en-us</dc:language>
      <dc:date>2023-09-23T00:00:00.000Z</dc:date>
      <content:encoded><![CDATA[Hello, today we will develop a simple application with a text-to-image mechanism using the [sdxl](https://replicate.com/stability-ai/sdxl) model and Nextjs in Replicate.

1. Create a Nextjs app

```bash
npx create-next-app@latest
```

2. Run the app locally

Now run your app locally to make sure eve...]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[Kodlamada İfade Edici İsimler Kullanmanın Önemi]]></title>
      <link>https://onurhan.dev/blog/kodlamada-ifade-edici-isimler-kullanmanin-onemi</link>
      <guid isPermaLink="true">https://onurhan.dev/blog/kodlamada-ifade-edici-isimler-kullanmanin-onemi</guid>
      <description><![CDATA[Amacını ortaya koyan isimlendirmeler seçmek hem kodu anlamayı hem de değiştirmeyi çok daha kolay hale getirebilir.]]></description>
      <pubDate>Sun, 13 Aug 2023 00:00:00 GMT</pubDate>
      <dc:creator><![CDATA[Onurhan Demir]]></dc:creator>
      <dc:language>tr-tr</dc:language>
      <dc:date>2023-08-13T00:00:00.000Z</dc:date>
      <content:encoded><![CDATA[İyi bir isim seçmek ilk başta zamanınızı alıyor gibi görünür ancak aldığından daha çoğunu da kazanmanıza olanak tanır. Yani isimlendirmelerinize önem verin ve onları daha iyi bir tanesini keşfettiğinizde onunla değiştirin. Eğer yaparsanız siz dahil kodunuzu okuyan herkes daha mutlu olacaktır.

Bir d...]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[Clean Code nedir?]]></title>
      <link>https://onurhan.dev/blog/clean-code-nedir</link>
      <guid isPermaLink="true">https://onurhan.dev/blog/clean-code-nedir</guid>
      <description><![CDATA[Kariyerinin başında olan insanların sıkça duyduğu, ortalarında olanların ise muzdarip olduğu bir konudur clean code. Peki nedir bu?]]></description>
      <pubDate>Fri, 04 Aug 2023 00:00:00 GMT</pubDate>
      <dc:creator><![CDATA[Onurhan Demir]]></dc:creator>
      <dc:language>tr-tr</dc:language>
      <dc:date>2023-08-04T00:00:00.000Z</dc:date>
      <content:encoded><![CDATA[Eminim ki kariyerinin başında olan insanların sıkça duyduğu, ortalarında olanların ise muzdarip olduğu bir konudur clean code. Peki sürekli bahsedilen ve her yerde konuşulan bu konunun detayları nedir? Bugün bunları konuşacağız.

<Callout>
  Bu yazımda yazdıklarım, Clean Code kitabından aldığım notl...]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[Başlamak]]></title>
      <link>https://onurhan.dev/blog/baslamak</link>
      <guid isPermaLink="true">https://onurhan.dev/blog/baslamak</guid>
      <description><![CDATA[Yazılım sürecinde kişisel notlar.]]></description>
      <pubDate>Fri, 21 Jul 2023 00:00:00 GMT</pubDate>
      <dc:creator><![CDATA[Onurhan Demir]]></dc:creator>
      <dc:language>tr-tr</dc:language>
      <dc:date>2023-07-21T00:00:00.000Z</dc:date>
      <content:encoded><![CDATA[Bu yazıyı yazma motivasyonum; Yazılımcı olmaya karar verdiğimizde veya bir iş arayışındayken bilgimiz, öğrendiklerimiz konusunda sorguluyoruz. Ancak bu süreçte hem gelişirken kaçırdığımız bir çok nokta oluyor. Kendi bilgim ve deneyimim dahilinde herkesin işine yarayabileceğine inandığım maddeleri ya...]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[Building a Component Library from Scratch]]></title>
      <link>https://onurhan.dev/blog/building-a-component-library-from-scratch</link>
      <guid isPermaLink="true">https://onurhan.dev/blog/building-a-component-library-from-scratch</guid>
      <description><![CDATA[Creating a Robust Component Library from Scratch: Simplify Development and Boost Productivity]]></description>
      <pubDate>Tue, 13 Jun 2023 00:00:00 GMT</pubDate>
      <dc:creator><![CDATA[Onurhan Demir]]></dc:creator>
      <dc:language>en-us</dc:language>
      <dc:date>2023-06-13T00:00:00.000Z</dc:date>
      <content:encoded><![CDATA[Before you start developing a component library, you should ask yourself the following question:

**Why should I develop a component library?**
There are several reasons for this. The main one is consistency. When you are going to use it in multiple projects, consistency in design and behavior acros...]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[How to Set Up Cypress for Next.js with TypeScript: A Step-by-Step Guide]]></title>
      <link>https://onurhan.dev/blog/how-to-set-up-cypress-for-nextjs</link>
      <guid isPermaLink="true">https://onurhan.dev/blog/how-to-set-up-cypress-for-nextjs</guid>
      <description><![CDATA[Learn how to configure and integrate Cypress testing framework into your Next.js project using TypeScript, with a comprehensive, easy-to-follow tutorial.]]></description>
      <pubDate>Mon, 06 Mar 2023 00:00:00 GMT</pubDate>
      <dc:creator><![CDATA[Onurhan Demir]]></dc:creator>
      <dc:language>en-us</dc:language>
      <dc:date>2023-03-06T00:00:00.000Z</dc:date>
      <content:encoded><![CDATA[Hello everyone, today I'll talk about how to include Cypress in a nextjs & typescript project and how to write a component test.

## Next.js Project Setup

To create a Next.js Typescript project, use the following code:

```bash
npx create-next-app@latest --typescript
```

## Include Cypress in the...]]></content:encoded>
    </item>
  </channel>
</rss>