Post Panjang Bluesky 2026: Panduan Sisi Baca Kreator
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:
- Pencarian. Arsip Markdown terpadu bisa dicari di editor teks mana pun. UI pencarian platform-platform tidak bisa.
- Portabilitas. Jika sebuah platform mengubah kebijakan post panjangnya besok, Anda tetap punya salinan lokal dari semua yang Anda terbitkan.
- Pelacakan balasan. Post panjang mendapat balasan di kedua platform. Pipeline sisi baca memungkinkan Anda melihat graf percakapan lengkap di satu tempat, yang mustahil dari UI native mana pun sendirian.
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:
- Penemuan post publik. ThreadGrab bisa diarahkan ke handle mana pun, bukan hanya milik Anda, dan akan mendeteksi post panjang baru saat dipublikasikan.
- Graf balasan untuk post publik. Untuk post Bluesky atau X apa pun yang Anda berikan, ThreadGrab mengembalikan pohon balasan lengkap sebagai JSON.
- Normalisasi format. Field
embed.textBluesky menggunakan sintaks facet kustom;note_tweet.textX menggunakan entitas URL. ThreadGrab meratakan keduanya ke Markdown umum, sehingga Anda tidak perlu mempertahankan penerjemah.
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 GratisKapan 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:
- Anda menerbitkan di Bluesky maupun X.
- Anda telah menerbitkan lebih dari 20 tulisan panjang secara total.
- Anda merujuk post Anda sendiri sebelumnya di post baru ("seperti yang saya tulis di Mei...").
- Anda ingin arsip Anda bertahan melampaui satu platform mana pun.
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
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.
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.
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.
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.
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.