EN PT ID

Post Panjang Bluesky 2026: Panduan Sisi Baca Kreator

6 Juli 2026 · 11 min read · Guide

Bluesky merilis format post panjang pada akhir Mei 2026, dan sisi baca dari web sosial tidak pernah sama lagi. Selama dua tahun, X Articles adalah satu-satunya platform besar di mana Anda bisa menerbitkan tulisan 5.000 kata secara native dan tetap diindeks oleh mesin pencari. Sekarang Bluesky menyamai permukaan itu, dan kreator yang menerbitkan di kedua platform menghadapi dua skema berbeda, dua graf balasan berbeda, dan nol alat bawaan untuk menyatukan apa yang Anda tulis.

Panduan ini adalah playbook sisi baca untuk dunia tersebut. Ini adalah alur kerja yang kami bangun di tim ThreadGrab setelah peluncuran Mei 2026, dan yang sama yang kami rekomendasikan untuk kreator mana pun yang sekarang menerbitkan post panjang di Bluesky dan X secara paralel. Empat langkah di bawah ini mengasumsikan Anda sudah menulis di kedua platform. Jika belum, playbook tetap bekerja sebagai setup satu platform, tapi routing multi-platform adalah tempat penghematan waktu benar-benar terkumpul.

Ringkasan: Bluesky meluncurkan post panjang Mei 2026. Alur kerja sisi baca punya empat langkah: mendeteksi post panjang, menariknya ke satu kotak masuk terpadu, mengonversi ke Markdown, dan menghubungkan apa yang Anda tulis dengan apa yang Anda balas. Pipa-nya adalah API publik dan skrip kecil, tanpa vendor lock-in, dan ThreadGrab menangani konversi Markdown sisi baca untuk bagian publik arsip Anda.

Apa yang berubah di Mei 2026

Fitur post panjang Bluesky dikirim ke semua pengguna pada akhir Mei 2026. Mekanikanya bukan X Articles -- fitur ini hidup di atas AT Protocol, yang berarti setiap post panjang tetap sebuah record di PDS, tapi tipe record-nya adalah app.bsky.feed.post dengan field embeds baru yang menunjuk ke struktur app.bsky.embed.recordWithMedia yang membawa body Markdown. Klien resmi Bluesky merender body itu dalam kartu scroll panjang; klien pihak ketiga seperti Skylight, Graysky, dan Ozone menanganinya secara berbeda, dan beberapa masih menghapus format saat dibaca.

Di sisi X, Articles tetap satu-satunya format panjang native sepanjang jendela yang sama. Pola URL X Articles stabil: https://x.com/<user>/status/<id> dengan /article/<id> sebagai alternatif. URL post panjang Bluesky mengikuti bentuk yang sama seperti post lainnya: https://bsky.app/profile/<handle>/post/<rkey>, dengan body di dalam record.embed alih-alih field saudara. Jika Anda scraping salah satu tapi bukan yang lain, Anda kehilangan setengah dari tempat konten panjang berada di 2026.

Mengapa playbook sisi baca penting sekarang

Menerbitkan post panjang di dua platform itu mudah. Membaca apa yang Anda tulis enam bulan kemudian tidak. Tiap platform punya UI sendiri, pencarian sendiri, dan aturan retensi arsip sendiri. X akan menyimpan Articles Anda tanpa batas selama akun Anda aktif; PDS Bluesky bisa dimigrasi, tapi akun yang dinonaktifkan bisa mengunci Anda dari post panjang Anda sendiri jika Anda tidak mengekspornya.

Playbook di bawah ini ada untuk tiga alasan yang tidak teoritis:

Alur kerja sisi baca 4 langkah

Alur kerja lengkap adalah empat langkah, masing-masing satu alat atau skrip. Tak satu pun memerlukan akun berbayar, dan semuanya berjalan di bawah 200 baris Python jika Anda merakitnya secara manual. Versi hosted ThreadGrab menggabungkan langkah 2 dan 3 menjadi satu panggilan, tapi versi manual adalah referensi kanoniknya.

Langkah 1: mendeteksi post panjang di kedua platform

Langkah pertama adalah identifikasi. Anda butuh daftar post mana (post Anda sendiri atau post yang Anda ikuti) yang panjang. Cara paling bersih untuk melakukan ini adalah polling periodik dari feed authoring Anda sendiri, difilter berdasarkan panjang post dan tipe embed.

# Pseudo-code untuk "apa yang dihitung sebagai post panjang di tiap platform"
def is_long_form_bluesky(post):
    embed = post.get("record", {}).get("embed", {})
    return (
        embed.get("$type") == "app.bsky.embed.recordWithMedia"
        and "app.bsky.richtext.facet" in str(embed)
        and len(embed.get("text", "")) > 1500
    )

def is_long_form_x(post):
    text = post.get("text", "") or post.get("note_tweet", {}).get("text", "")
    has_article = "/article/" in post.get("permalink", "")
    return has_article or len(text) > 4000

Ambang batas Bluesky kira-kira 1.500 grapheme sebelum kartu panjang ditampilkan; X Articles mulai dari panjang berapa pun tapi UI platform berbeda secara signifikan di atas 4.000 karakter. Logika deteksi tidak harus sempurna; tujuannya adalah filter lintasan pertama yang bisa Anda koreksi secara manual.

Langkah 2: menarik konten panjang ke kotak masuk terpadu

Setelah Anda punya daftar, tarik body-nya. Bluesky mengekspos ini melalui endpoint publik AppView getPostThread; X masih memerlukan endpoint GET /2/tweets/:id dengan OAuth bearer token untuk Articles yang lebih panjang dari 4.000 karakter. Skrip di bawah ini menunjukkan penarikan paralel untuk keduanya.

import requests, json, pathlib, datetime

OUT = pathlib.Path("./inbox/longform")
OUT.mkdir(parents=True, exist_ok=True)

def pull_bluesky(rkey, handle):
    r = requests.get(
        f"https://public.api.bsky.app/xrpc/app.bsky.feed.getPostThread",
        params={"uri": f"at://{handle}/app.bsky.post/{rkey}", "depth": 0},
        timeout=15,
    )
    r.raise_for_status()
    thread = r.json()["thread"]["post"]
    embed = thread["record"].get("embed", {})
    body = embed.get("text", "") or thread["record"].get("text", "")
    return {"platform": "bluesky", "id": rkey, "body": body, "ts": thread["indexedAt"]}

def pull_x(article_id, token):
    r = requests.get(
        f"https://api.x.com/2/tweets/{article_id}",
        params={"tweet.fields": "text,note_tweet,entities,created_at"},
        headers={"Authorization": f"Bearer {token}"},
        timeout=15,
    )
    r.raise_for_status()
    body = r.json()["data"].get("note_tweet", {}).get("text") or r.json()["data"]["text"]
    return {"platform": "x", "id": article_id, "body": body, "ts": r.json()["data"]["created_at"]}

# Contoh: arsipkan dua post
for path in OUT.glob("*.json"):
    pass
out1 = pull_bluesky("3l5xabc123", "anda.bsky.social")
out2 = pull_x("1800000000000000000", "X_BEARER_TOKEN_ANDA")
for entry in (out1, out2):
    stamp = datetime.datetime.fromisoformat(entry["ts"].replace("Z", "+00:00")).strftime("%Y%m%dT%H%M%SZ")
    (OUT / f"{stamp}_{entry['platform']}_{entry['id']}.json").write_text(json.dumps(entry, indent=2))

Output-nya adalah satu file JSON per post panjang dalam satu direktori ./inbox/longform/. Nama file bisa diurutkan berdasarkan tanggal, jadi direktori sudah menjadi arsip terurut kronologis tanpa basis data apa pun.

Langkah 3: konversi ke Markdown untuk pembacaan ulang dan pencarian

Blob JSON bukan yang ingin Anda baca jam 2 pagi enam bulan dari sekarang. Konversi masing-masing ke file Markdown dengan frontmatter, dan Anda punya arsip yang ramah-grep, ramah-editor, dapat-diversi-kontrol. Versi hosted ThreadGrab melakukan ini untuk bacaan publik; skrip di bawah ini adalah yang kami gunakan secara internal untuk arsip sisi penulis privat.

def json_to_markdown(entry):
    fm = [
        "---",
        f"platform: {entry['platform']}",
        f"id: {entry['id']}",
        f"published: {entry['ts']}",
        f"url: " + (
            f"https://bsky.app/profile/anda.bsky.social/post/{entry['id']}"
            if entry["platform"] == "bluesky"
            else f"https://x.com/anda/status/{entry['id']}"
        ),
        "---",
    ]
    body_md = entry["body"]
    if entry["platform"] == "bluesky":
        body_md = body_md.replace("

", "

")
    return "
".join(fm) + "

" + body_md + "
"

import json, pathlib
for src in pathlib.Path("./inbox/longform").glob("*.json"):
    entry = json.loads(src.read_text())
    (pathlib.Path("./archive") / src.with_suffix(".md").name).write_text(json_to_markdown(entry))

Setelah dijalankan, Anda punya direktori file .md yang bisa Anda baca di editor mana pun, cari dengan ripgrep, commit ke Git, atau umpan balik ke LLM di masa depan sebagai materi korpus. Frontmatter mempertahankan tag platform dan URL kanonik sehingga Anda selalu bisa menavigasi kembali ke versi live.

Langkah 4: menghubungkan post Anda sendiri dengan balasan

Langkah terakhir adalah yang kebanyakan kreator lewati: graf percakapan terpadu. Untuk setiap post panjang yang Anda tulis, Anda ingin melihat semua balasan di kedua platform di satu tempat. Ini tidak dibangun ke dalam UI mana pun; ini adalah skrip.

def replies_for(post):
    if post["platform"] == "bluesky":
        r = requests.get(
            "https://public.api.bsky.app/xrpc/app.bsky.feed.getReplies",
            params={"uri": post["embed_uri"], "limit": 100},
            timeout=15,
        )
        return [r["post"]["record"]["text"] for r in r.json().get("replies", [])]
    if post["platform"] == "x":
        r = requests.get(
            f"https://api.x.com/2/tweets/search/recent",
            params={"query": f"conversation_id:{post['id']}", "tweet.fields": "text,author_id"},
            headers={"Authorization": f"Bearer {post['token']}"},
            timeout=15,
        )
        return [t["text"] for t in r.json().get("data", [])]
    return []

Output-nya adalah satu file teks per post panjang: 20260701T090000Z_x_1800000000000000000.md dengan bagian ## Replies yang mendaftar setiap balasan dari kedua platform. Jika Anda menerbitkan tulisan di Mei 2026 dan ingin tahu apa kata pembaca tentangnya di Juli, Anda membuka satu file, bukan dua tab browser.

Bagaimana ThreadGrab masuk

Layanan hosted ThreadGrab melakukan langkah 2, 3, dan 4 untuk post panjang publik apa pun di Bluesky atau X. Jika Anda punya URL post panjang, ThreadGrab mengembalikan body Markdown dengan frontmatter, URL kanonik platform, dan graf balasan. Layanan hosted gratis untuk post publik, tidak memerlukan token X, dan tidak menulis ke PDS Anda.

Untuk arsip authoring privat (post Anda sendiri, sebelum menjadi publik), Anda masih memerlukan skrip di atas. Layanan hosted melengkapi, bukan menggantikan, arsip lokal. Pemisahan ini disengaja: sisi baca publik adalah apa yang ThreadGrab lakukan terbaik, dan sisi penulis privat adalah apa yang Anda lakukan terbaik karena hanya Anda yang tahu draf mana yang ingin disimpan.

Tiga hal spesifik yang ThreadGrab tangani yang tidak dilakukan skrip di atas:

Arahkan ThreadGrab ke URL post panjang Bluesky atau X mana pun. Anda mendapatkan body Markdown, tautan kanonik platform, dan graf balasan dalam satu panggilan. Tanpa token X, tanpa PDS, tanpa instalasi.

Coba ThreadGrab Gratis

Kapan tidak membangun playbook sisi baca

Tidak setiap kreator membutuhkan ini. Jika Anda menerbitkan post panjang di tepat satu platform dan membaca post Anda sendiri di UI native, playbook itu berlebihan. Alur kerja empat langkah terbayar ketika setidaknya dua dari ini benar:

Jika hanya satu yang berlaku, setup paling sederhana adalah ThreadGrab publik untuk post publik dan satu vault Obsidian untuk draf privat. Jika dua atau lebih berlaku, skrip empat langkah di atas worth akhir pekan yang diperlukan untuk merakitnya.

Pertanyaan yang sering diajukan

Kapan tepatnya Bluesky meluncurkan post panjang?

Bluesky mengirim format post panjang ke semua pengguna pada akhir Mei 2026. Fitur ini tersedia di klien resmi Bluesky, Skylight, Graysky, dan Ozone. Beberapa klien pihak ketiga masih belum merender kartu panjang dengan benar; jika Anda membaca Bluesky di salah satu klien itu, post akan muncul terpotong.

Apakah saya memerlukan akun berbayar X atau Bluesky untuk menggunakan alur kerja ini?

Tidak. Endpoint AppView publik Bluesky terbuka dan tidak memerlukan autentikasi untuk akses baca-saja. Endpoint GET /2/tweets/:id X memerlukan akun developer gratis dengan bearer token, tapi Anda tidak memerlukan X Premium atau tier berbayar API X untuk akses baca-saja ke Articles Anda sendiri.

Bisakah saya menggunakan ini untuk mengarsipkan post panjang orang lain?

Bisa untuk yang publik. Endpoint publik ThreadGrab menerima URL panjang Bluesky atau X apa pun. Untuk post privat atau draf yang tidak Anda miliki, skrip di atas tidak akan bekerja -- platform mengekspos hanya endpoint sisi penulis kepada penulis.

Apakah playbook ini bekerja untuk Threads atau LinkedIn Newsletter?

Tidak secara langsung. Threads tidak punya fitur panjang native di 2026; Threads post panjang runtuh ke satu thread. LinkedIn Newsletter punya feed RSS publik yang bisa Anda langgani, tapi body artikel tidak bisa dicari melalui API publik dengan cara yang sama seperti Bluesky dan X mengekspos. Jika Anda menerbitkan di salah satunya, tambahkan langkah kelima untuk menarik feed RSS dan mengonversinya.

Bagaimana jika PDS Bluesky saya bermigrasi atau akun saya dinonaktifkan?

Itu persis alasan playbook ini ada. Arsip Markdown adalah cadangan portabel Anda. Jika PDS Anda bermigrasi, URL kanonik di PDS baru masih menunjuk ke rkey yang sama, dan salinan arsip bersifat independen. Jika akun Anda dinonaktifkan, cache publik ThreadGrab mungkin masih memegang post untuk beberapa waktu, tapi arsip Markdown adalah jaminan jangka panjang.