Skip to content

Instantly share code, notes, and snippets.

View hkulekci's full-sized avatar
⛰️
Remote

Haydar KÜLEKCİ hkulekci

⛰️
Remote
View GitHub Profile
@hkulekci
hkulekci / comparison-headless-cms.md
Created December 26, 2025 07:04
Comparison of Headless CMS

Headless CMS comparison for multi-tenant website builders

Payload CMS emerges as the clear winner for building a website platform serving thousands of tenants. Its native multi-tenancy plugin enables a single deployment to serve unlimited tenants efficiently, while most competitors either lack multi-tenancy entirely or become prohibitively expensive at scale. For teams prioritizing full control and cost efficiency, self-hosted Directus ranks second; Firebase/Firestore offers a viable path for those willing to build custom CMS features on top of proven infrastructure.

The fundamental challenge is that most headless CMS solutions were designed for single-tenant use cases. Strapi, Ghost, and even enterprise platforms like Contentful hit architectural walls when scaled to thousands of separate tenant websites. The comparison below reveals which platforms can actually handle this demanding use case.

Multi-tenancy is the decisive factor

The website builder use case fundamentally requires true multi-ten

POST _bulk
{"index": {"_index": "accounts2", "_id": "1"}}
{"id": 1, "name": "AHMET", "surname": "MERT EKİNCİOĞLU", "iban": "TR910006200000100001234567", "balance": 15, "created_at": "2020-08-19T00:00:00Z"}
{"index": {"_index": "accounts2", "_id": "2"}}
{"id": 2, "name": "GÜLNAME", "surname": "KINDIR", "iban": "TR910006200000100001234568", "balance": 27, "created_at": "2020-08-19T00:00:00Z"}
{"index": {"_index": "accounts2", "_id": "3"}}
{"id": 3, "name": "SALİM", "surname": "İLTEMİZ", "iban": "TR910006200000100001234569", "balance": 54, "created_at": "2020-08-19T00:00:00Z"}
{"index": {"_index": "accounts2", "_id": "4"}}
{"id": 4, "name": "MÜBERRA", "surname": "GÜVEN MEŞE", "iban": "TR910006200000100001234570", "balance": 81, "created_at": "2020-08-19T00:00:00Z"}
@hkulekci
hkulekci / training.md
Created November 20, 2025 08:48
Training Elasticsearch

Elasticsearch Presentation

Indexing Document and Retriving

POST accounts/_doc
{
  "id": 1,
@hkulekci
hkulekci / QdrantServiceProvider.php
Created February 24, 2024 05:14
Qdrant Laravel
<?php
/**
* @since Apr 2023
* @author Haydar KULEKCI <haydarkulekci@gmail.com>
*/
namespace App\Providers;
use Illuminate\Contracts\Support\DeferrableProvider;
use Illuminate\Support\ServiceProvider;
@hkulekci
hkulekci / 01 - Readme.md
Last active December 28, 2023 19:35
Download Folder Recursively for Box Cloud

Usage

Create an app through developer platform :

https://<your-account>.app.box.com/developers/console

Then later, get the service account email from the general settings :

@hkulekci
hkulekci / terms_set_query.md
Last active September 9, 2023 09:00
terms_set Query
DELETE job-candidates

PUT job-candidates
{
  "mappings": {
    "properties": {
      "name": {
        "type": "keyword"
      },
@hkulekci
hkulekci / percolator.md
Last active September 9, 2023 04:53
Percolator Field with Nested Query
PUT testindex1
{
  "mappings": {
    "properties": {
      "search": {
        "properties": {
          "query": { 
            "type": "percolator" 
          }
@hkulekci
hkulekci / sample.md
Created June 28, 2023 14:08
Some Sample Data
The clear, refreshing taste of tap water quenches my thirst on hot summer days.
Please make sure to filter the tap water before drinking it.
The tap in the kitchen was leaking, causing the water to drip incessantly.
After a long hike, we refilled our water bottles with tap water from the nearby fountain.
It's important to conserve tap water and use it wisely to protect our natural resources.
The tap water in this area has a slightly metallic taste, which can be off-putting to some people.
The plumber fixed the broken tap, ensuring a steady flow of water throughout the house.
My grandma always used to boil tap water before using it in cooking or drinking.
The city council implemented a new filtration system to improve the quality of tap water.
@hkulekci
hkulekci / kinesis.py
Last active April 29, 2023 08:04
Kinesis Queue Check
import boto3
def check_kinesis_stream_data(stream_name):
# Create a Kinesis client using your AWS credentials
kinesis_client = boto3.client('kinesis')
# Get the shard iterator for the specified stream
shard_response = kinesis_client.describe_stream(StreamName=stream_name)
shard_id = shard_response['StreamDescription']['Shards'][0]['ShardId']
shard_iterator_response = kinesis_client.get_shard_iterator(
@hkulekci
hkulekci / 01.md
Created December 11, 2022 06:21
Long named Aggregation test
GET idx_test/_search
{
  "size": 0,
  "aggs": {
    "Lorem-ipsum-dolor-sit-amet--consectetur-adipiscing-elit--Fusce-lacinia-lacus-dignissim--sollicitudin-est-a--rhoncus-velit--Nulla-ut-tortor-at-diam-suscipit-vestibulum--Praesent-dignissim--tellus-sed-tempus-scelerisque--velit-ligula-vestibulum-ante--non-sodales-risus-elit-at-orci--Morbi-at-lectus-quam--Vivamus-mattis--enim-eget-congue-viverra--nulla-dui-fermentum-tortor--nec-scelerisque-libero-tortor-luctus-nisl--Pellentesque-vel-metus-venenatis--gravida-libero-feugiat--tincidunt-ligula-pharetra-Lorem-ipsum-dolor-sit-amet--consectetur-adipiscing-elit--Fusce-lacinia-lacus-dignissim--sollicitudin-est-a--rhoncus-velit--Nulla-ut-tortor-at-diam-suscipit-vestibulum--Praesent-dignissim--tellus-sed-tempus-scelerisque--velit-ligula-vestibulum-ante--non-sodales-risus-elit-at-orci--Morbi-at-lectus-quam--Vivamus-mattis--enim-eget-congue-viverra--nulla-dui-fermentum-tortor--nec-scelerisque-libero-tortor-luctus-nisl--Pellentesque-vel-metus-venenatis--gravida-libero-fe