1 poin oleh GN⁺ 7 jam lalu | Belum ada komentar. | Bagikan ke WhatsApp
  • Sebuah protokol terminal baru hadir untuk mengatasi masalah lama yang mengharuskan instalasi font yang sudah dipatch (seperti Nerd Font) agar ikon kustom bisa dirender di aplikasi terminal
  • Glyph Protocol menyediakan struktur agar aplikasi dapat mendaftarkan glif vektor langsung ke terminal saat runtime dan menanyakan apakah rendering untuk codepoint tertentu tersedia
  • Data glif menggunakan format glyf milik TrueType, sehingga terminal dapat memanfaatkan rasterizer yang sudah dimilikinya tanpa dependensi baru
  • Codepoint yang boleh didaftarkan dibatasi ke Unicode Private Use Area (PUA) untuk memblokir serangan phishing dan pemalsuan visual dari akarnya
  • Terminal Rio sedang mengerjakan implementasi pertamanya, dan contoh kode untuk framework TUI utama seperti Bubble Tea, Ratatui, dan Ink sudah dipublikasikan

Masalah lama: ketergantungan pada font yang dipatch

  • Agar editor terminal, prompt, dan TUI dapat menampilkan ikon dengan benar, pengguna harus menginstal sendiri font yang dipatch seperti Nerd Font atau Powerline
  • Jika font tidak dipasang, posisi ikon akan menampilkan tofu (□), dan ukuran font patch semacam ini cukup besar, sekitar 6–12MB per file
    • JetBrainsMono Nerd Font Regular sekitar 7.8MB, FiraCode Nerd Font Regular sekitar 10.4MB, dan seluruh arsip simbol sekitar 60MB
  • Pengembang aplikasi tidak punya cara untuk mendistribusikan glif yang diinginkan secara langsung, sehingga hanya bisa berharap pengguna memiliki font, versi, dan pemetaan codepoint yang benar

Fitur inti Glyph Protocol

  • Mendukung dua operasi utama
    • Pendaftaran glif kustom: aplikasi memilih codepoint Unicode PUA lalu mengirim outline vektor langsung ke terminal untuk didaftarkan saat runtime
    • Query codepoint: menanyakan apakah codepoint tertentu dicakup oleh font sistem, oleh pendaftaran dalam sesi, oleh keduanya, atau tidak oleh apa pun
  • Jika pengguna sudah memasang Nerd Font, aplikasi dapat melewati pengiriman glif lewat query ini, dan bila belum terpasang aplikasi tetap bisa mengirim outline langsung agar ikon tampil normal

Struktur protokol

Metode transport

  • Menggunakan APC (Application Program Command) alih-alih OSC
  • APC dirancang untuk perintah yang didefinisikan aplikasi, dan terminal yang belum mengimplementasikannya dapat mengabaikan sequence tersebut dengan aman
  • OSC memakai namespace global dengan satu bilangan bulat desimal sebagai pengenal perintah, sehingga rawan bentrok, sedangkan APC punya struktur identifikasi sendiri sehingga masalah ini tidak ada

Identifier

  • Semua pesan Glyph Protocol diawali dengan codepoint 25a1(U+25A1, WHITE SQUARE)
    • Karakter ini adalah simbol tofu standar yang digambar terminal saat glif tidak ada
  • Format framing: ESC _ 25a1 ; <verb> [ ; key=value ]* [ ; <payload> ] ESC \\
  • Ada 4 verb: s(support), q(query), r(register), c(clear)

Support (s): memeriksa dukungan terminal

  • Digunakan untuk memeriksa format payload dan versi protokol apa yang didukung terminal
  • Ini juga merupakan cara standar untuk mendeteksi keberadaan Glyph Protocol itu sendiri
  • fmt pada respons berbentuk bitfield, dan tiap bit mewakili satu format payload
    • 1 = glyf: glif sederhana TrueType, wajib pada v1
    • 2 = colrv0: glif warna datar berlapis (OpenType COLR v0), ditambahkan pada v1.2
    • 4 = colrv1: paint graph lengkap dengan gradien dan transformasi (OpenType COLR v1), ditambahkan pada v1.2
  • Jika ada respons berarti protokol didukung, jika timeout berarti tidak didukung, dan jika fmt=0 berarti protokol diimplementasikan tetapi tidak mendukung format apa pun yang didefinisikan saat ini

Query (q): menanyakan apakah codepoint bisa dirender

  • Menanyakan apakah codepoint tertentu bisa dirender, lalu menerima respons berupa nilai status
    • 0(free): tidak merender apa pun, menampilkan tofu
    • 1(system): dicakup oleh font sistem
    • 2(glossary): dicakup oleh pendaftaran dalam sesi
    • 3(both): dicakup keduanya, dan pendaftaran akan menimpa rendering font sistem
  • Jika ikon yang dibutuhkan sudah tersedia di sistem, TUI bisa melewati pendaftaran, dan bila tidak ada dapat mendaftarkan codepoint kustom untuk fallback yang elegan

Register (r): mendaftarkan glif

  • Aplikasi memilih codepoint PUA lalu mendaftarkannya dengan mengirim outline glyf yang di-encode base64
  • Parameter utama
    • cp: codepoint target (hex), harus berada dalam salah satu dari 3 rentang Unicode PUA (U+E000U+F8FF, U+F0000U+FFFFD, U+100000U+10FFFD); di luar rentang akan ditolak dengan reason=out_of_namespace
    • fmt: format payload; pada v1 hanya glyf yang didefinisikan dan menjadi default, jadi biasanya bisa dihilangkan
    • upm: units per em, mendefinisikan ruang koordinat outline, default 1000
  • Jika r kedua dikirim untuk cp yang sama, maka pendaftaran sebelumnya akan ditimpa
  • Saat terjadi error (codepoint non-PUA, payload salah, glif komposit, dll.), responsnya berupa status=<nonzero>; reason=<code>

Alasan memilih format glyf

Mengapa vektor

  • Glif bukan foto, jadi tidak punya resolusi tetap: ikon yang sama harus bisa dirender baik di TUI rapat 12px maupun di layar HiDPI 24px
  • Glif raster terikat pada resolusi tertentu sehingga tampak buram di HiDPI atau sulit dibaca di sel kecil

Mengapa secara spesifik memilih glyf

  • Semua terminal yang merender teks sudah menautkan rasterizer glyf (FreeType, swash, ttf-parser, fontdue, allsorts, dll.)
  • Dengan mengadopsi Glyph Protocol, sisi terminal tidak perlu menambah dependensi baru sama sekali
  • Jika memakai SVG, implementasi harus membawa resvg atau menulis parser XML+path baru
  • Ukuran data di wire juga kecil: ikon biasa hanya memerlukan 150–400 byte data glyf, sekitar 2–3 kali lebih kecil daripada SVG setara, bahkan setelah overhead base64
    • Saat mendaftarkan 50 ikon, perbedaannya sekitar 13KB vs 35KB, dan ini terasa pada pipe tmux atau koneksi SSH mobile

Penjelasan singkat glyf

  • Record glyf menyimpan glif sebagai sekumpulan contour tertutup
  • Setiap titik memiliki 1 bit metadata, yaitu on-curve atau off-curve
    • dua titik on-curve berurutan → garis lurus
    • titik off-curve di antara dua titik on-curve → kurva Bézier kuadratik
    • dua titik off-curve berurutan → ada titik on-curve implisit di tengahnya (trik kompresi)
  • Koordinat adalah posisi grid integer di dalam EM square; pada upm=1000, (500, 900) berarti setengah lebar dan 90% tinggi
  • Segitiga tertutup sekitar 30 byte, ikon dengan 30 titik sekitar 200 byte

Subset glyf yang didefinisikan protokol

  • Hanya glif sederhana yang diizinkan: glif komposit, referensi ke glif lain, dan konteks level font tidak didukung
  • Menggunakan encoding flag standar yang didefinisikan di spesifikasi OpenType
  • Tidak ada instruksi hinting: hinting mengasumsikan adanya kumpulan control value seluruh font, yang tidak tersedia di sini
  • Ruang koordinat ditentukan oleh upm, default 1000, dan bisa dioverride per pendaftaran

Warna, penskalaan, dan authoring

  • Outline glyf tidak menyimpan informasi warna dan akan dirender dengan warna foreground saat ini → sama seperti pewarisan pada Nerd Font
  • Glif berwarna didukung lewat format payload terpisah fmt=colrv0 / fmt=colrv1
  • Nilai upm mendefinisikan ruang koordinat glif, lalu terminal memetakannya ke sel saat render → tidak perlu daftar ulang saat ukuran font berubah
  • Sebagian besar pengembang tidak akan menulis byte glyf secara langsung, melainkan mengonversi dari SVG saat build time: antarmuka ttx/pens dari fonttools bisa dipakai, dan helper svg2glyf juga direncanakan didistribusikan bersama implementasi referensi Rio

Masa hidup dan kapasitas

  • Setiap sesi terminal memiliki glossary yang menyimpan maksimal 1024 pendaftaran simultan, dengan key berupa codepoint dalam 3 rentang PUA
  • Pendaftaran berlaku selama sesi berlangsung
  • Saat glif ke-1025 didaftarkan, pendaftaran tertua akan dikeluarkan dengan urutan FIFO → tidak ada error "glossary full"
  • Aplikasi yang tidak bisa menerima eviction diam-diam harus menanyakan codepoint terkait sebelum melakukan output

Contoh nyata: mendaftarkan ikon ke PUA kosong

  • Contoh pipeline lengkap untuk mendaftarkan outline bergaya ke U+100000 (codepoint pertama di Supplementary PUA-B)
  • Menggunakan fontTools sebagai konverter SVG→glyf
  • Outline digambar dengan TTGlyphPen, lalu di-encode ke base64 dan dikirim sebagai sequence APC, kemudian codepoint itu dicetak
  • Payload glyf untuk ikon 20 titik biasa sekitar 150 byte, dan sekitar 250 byte setelah dibungkus APC dan base64
  • Bagi pengembang yang sudah punya aset SVG, helper svg2glyf akan disediakan → pendaftaran selesai hanya dalam 2 baris

Opsi untuk pendaftaran massal: reply=

  • Secara default terminal mengirim respons ACK untuk setiap r, tetapi pada hook startup yang mendaftarkan 100 glif, 100 ACK yang mengantre bisa mengalir ke PTY dan muncul sebagai sampah di shell
  • Ada kontrol 3 tingkat
    • reply=1(default): merespons sukses maupun gagal, untuk pendaftaran interaktif satuan
    • reply=2: hanya merespons jika gagal, sukses diam, digunakan saat pendaftaran massal hanya perlu mendeteksi error
    • reply=0: tidak ada respons sama sekali, fire-and-forget, cocok saat tidak ada pihak yang membaca respons seperti pada hook startup
  • Nilai yang tidak dikenal otomatis fallback ke reply=1, sehingga kompatibilitas ke belakang tetap terjaga untuk ekspansi di masa depan

Clear (c): membatalkan pendaftaran

  • Digunakan saat editor ditutup untuk memulihkan default terminal, saat mengganti tema TUI, atau untuk debugging
  • Melepas satu slot: tentukan codepoint tertentu lewat parameter cp
  • Menghapus seluruh glossary: hilangkan cp
  • Menghapus slot kosong bukan error melainkan no-op, dengan respons status=0
  • cp harus berada dalam rentang PUA; di luar rentang akan mengembalikan reason=out_of_namespace

Fitur yang sengaja tidak dimasukkan ke v1

  • Tidak bisa mendaftarkan codepoint non-PUA: dibatasi ke 3 rentang Unicode PUA
  • Tidak ada ligature: pendaftaran hanya berlaku untuk satu codepoint, penggantian berbasis urutan key di luar cakupan v1, dan ligature pemrograman (->) sudah ditangani font OpenType
  • Tidak ada persistensi antar-sesi: glif dikirim ulang pada setiap eksekusi, untuk mencegah terminal berubah menjadi cache font
  • Tidak ada berbagi lintas-aplikasi: setiap sesi terminal memiliki glossary sendiri, tanpa IPC atau daemon
  • Tidak ada glif warna di payload glyf v1: dirender dengan warna foreground, sedangkan warna dipisah ke colrv0/colrv1 pada v1.2
  • Fitur-fitur ini bisa ditambahkan nanti bila diperlukan, tetapi sekali ditambahkan tidak mudah dihapus, jadi sengaja dikecualikan

Dasar keamanan dari pembatasan PUA

  • Pembatasan PUA bukan soal estetika API, melainkan sifat yang membuat protokol aman meski diaktifkan secara default
  • Jika pendaftaran codepoint arbitrer diizinkan: glif berbentuk o bisa didaftarkan ke U+0061 (a), sehingga bad.com terlihat seperti bod.com
    • Buffer sel tetap berisi bad.com, jadi saat copy-paste byte-nya tetap jujur, tetapi yang dibaca pengguna adalah kebohongan
    • Ini akan memberi primitif phishing ke semua program terminal dan efeknya bertahan untuk program lain yang dijalankan sesudahnya dalam sesi yang sama
  • Dengan membatasi ke PUA, tipe serangan ini menjadi mustahil secara mekanis: pengguna tidak mengetik codepoint PUA, dan nama file, URL, perintah, nama variabel, maupun log tidak memuat codepoint PUA
  • Model kepercayaan yang sudah dibentuk oleh Nerd Font—glif kustom hanya ada di rentang yang dicadangkan dan tidak bisa menimpa teks asli—dipaksakan di level protokol
  • Sifat keamanan tambahan
    • Buffer sel tetap otoritatif: seleksi, copy, pencarian, deteksi hyperlink, riwayat shell, dan lainnya harus mengembalikan codepoint yang benar-benar dioutput aplikasi, sehingga jebakan “yang terlihat berbeda dari yang disalin” tidak bisa dibuat
    • Isolasi per sesi: dua tab dapat mendaftarkan ikon branch yang berbeda ke U+E0A0 secara independen, dan pendaftaran di satu tab tidak akan memengaruhi render di tab lain

Perbandingan dengan pendekatan yang sudah ada

Kitty Image Protocol (KIP) + Unicode Placeholders

  • Secara kasar Glyph Protocol bisa diaproksimasi dengan Unicode placeholder milik KIP, tetapi integrasinya rumit dan terminal yang mengimplementasikan placeholder tersebut baru Kitty, Ghostty, dan Rio
  • KIP adalah protokol gambar, sedangkan glif bukan gambar
    • Biaya per penggunaan: glif yang dipakai ulang 200 kali di layar (misalnya border tabel atau bullet marker) membutuhkan 200 referensi gambar terpisah beserta biaya layout dan compositing. Di Glyph Protocol, setelah codepoint terdaftar ia akan dirender secepat font biasa
    • Tidak ada resolusi native: outline glyf tidak punya ukuran piksel, jadi perubahan ukuran font langsung terakomodasi. KIP mengirim bitmap berukuran tertentu, sehingga saat ukuran berubah ia bisa menjadi buram atau harus diunggah ulang, dan tidak ada mekanisme untuk mendeteksi perubahan ukuran font
    • Mewarisi warna foreground: outline glyf monokrom dirender dengan warna foreground sel saat ini sehingga tema diterapkan otomatis. Gambar punya piksel sendiri dan tidak ikut dalam pewarnaan teks

DEC DECDLD / DRCS

  • Dynamically Redefinable Character Sets yang diperkenalkan VT220 pada 1983 ini secara bentuk mirip dengan Glyph Protocol
  • Ada dua masalah utama
    • Berbasis bitmap: terminal mengunggah grid piksel yang menyesuaikan ukuran sel saat ini, jadi saat ukuran font berubah, berpindah ke HiDPI, atau monitor 4K, piksel blok akan ikut membesar atau mengecil. Pendekatan ini cocok untuk era CRT 10×20 yang tetap, namun tidak pas untuk ukuran sel modern yang beragam
    • Tidak ada batasan namespace: DECDLD dapat menimpa charset yang dipetakan ke rentang GL (wilayah tempat a, b, c berada), sehingga program tak tepercaya bisa mendefinisikan ulang render untuk a → alasan terbesar terminal modern enggan mengaktifkan DECDLD

Status implementasi di terminal Rio

  • Glyph Protocol sudah bisa dipakai di branch main terminal Rio, dan dijadwalkan masuk resmi pada bulan Mei → implementasi pertama
  • Spesifikasi lengkap akan dipublikasikan bersama rilis, termasuk contoh kode untuk pendaftaran glif dan query terminal
  • Contoh yang berjalan bisa dilihat di repositori raphamorim/glyph-protocol-examples: termasuk integrasi contoh untuk Bubble Tea, Ratatui, dan Ink
  • Protokol ini masih mungkin berubah, dan saat lebih banyak aplikasi serta terminal ikut terlibat, bentuk pesan, respons query, dan edge case dapat ikut berubah → untuk saat ini sebaiknya dianggap target yang bergerak dan versi implementasi dipin
  • Diharapkan terminal emulator lain ikut mengadopsinya, karena manfaat untuk seluruh ekosistem besar sementara lingkup implementasinya sengaja dibuat kecil

Pertanyaan terbuka untuk komunitas

  • Perlukah notifikasi perubahan ukuran font masuk dalam cakupan protokol?: Glyph Protocol sendiri menghindari masalah ini karena outline bersifat bebas resolusi, tetapi TUI yang menyusun gambar dan glif bersama tidak punya cara selain polling untuk mengetahui perubahan metrik sel → masih diperdebatkan apakah notifikasi resize atau metrics-changed termasuk cakupan atau justru di luar cakupan
  • Adakah cara yang bertanggung jawab untuk mengizinkan pendaftaran non-PUA?: aturan khusus PUA menjamin keamanan default, tetapi juga memblokir kasus seperti IME CJK yang ingin mengirim glif untuk hanzi yang tidak dicakup, atau tool spesifik bahasa yang ingin menimpa glif tertentu → diminta masukan soal bentuk seperti opt-in eksplisit tingkat pengguna, fitur bertanda tangan, atau flag sumber tepercaya agar kasus ini bisa dibuka tanpa menghidupkan kembali phishing

Belum ada komentar.

Belum ada komentar.