curl and Terminal Clients

curl, Wget, HTTPie and xh get a page's first frame as truecolor ANSI text. Configure its size or turn it off.

Klien HTTP terminal menerima frame pertama halaman sebagai teks ANSI truecolor, bukan dokumen HTML. Anda tidak perlu mengonfigurasi apa pun.

curl https://my-app.example.com/about

Permintaan yang menerima frame

Permintaan menerima frame ketika semua syarat berikut terpenuhi:

  • metodenya GET atau HEAD;
  • User-Agent diawali dengan curl/, Wget/, wget2/, HTTPie/ atau xh/;
  • header Accept tidak ada atau tidak menyebutkan text/html.

Browser, crawler, dan pratinjau tautan menerima halaman HTML. Untuk mendapatkan HTML dari curl, minta secara eksplisit:

curl -H 'Accept: text/html' https://my-app.example.com/about

Frame dipilih pada tahap halaman akan disajikan: setelah middleware, rewrites dan route handler, dan tidak pernah untuk file atau path yang segmen terakhirnya mengandung titik. Pengalihan middleware, 401, header, dan rewrite berlaku untuk curl seperti halnya untuk browser. /api/health tetap menjalankan handler-nya dan /robots.txt tetap menyajikan file.

Isi frame

Frame adalah hasil render pertama halaman, seperti pada shell yang di-prerender: setiap batas <Suspense> yang masih menunggu menampilkan fallback-nya. Komponen server asinkron tidak berjalan, dan fetch() tidak pernah selesai, sehingga data yang dimuat dalam effect tetap dalam status pemuatan.

  • Ukuran: 80 × 24 sel. Aplikasi dengan viewport tetap (viewport.responsive: false) menggunakan viewport.width × viewport.height sebagai gantinya.
  • Warna: Kode escape SGR 24-bit dalam viewport.theme aplikasi. Setiap baris diakhiri dengan reset, dan frame diakhiri dengan karakter baris baru.
  • Status: 200, atau 404 dengan halaman tidak ditemukan milik aplikasi ketika tidak ada halaman yang cocok atau halaman memanggil notFound(). Halaman yang memanggil redirect() saat rendering menyajikan HTML.

Respons berupa text/plain; charset=utf-8 dengan Vary: User-Agent, Accept dan Cache-Control: private, no-cache, no-store, max-age=0, must-revalidate, sehingga cache bersama tidak pernah menyimpan frame lalu menyajikannya ke browser. Halaman HTML pada path tempat curl menerima frame membawa header Vary yang sama.

Dukungan host

HostHalaman statisHalaman dinamis, path tidak dikenal
text devDi-render saat dimintaDi-render saat diminta
text start, bunDi-prerender oleh text buildDi-render saat diminta
vercel, cloudflareDi-prerender oleh text buildHalaman HTML
staticHalaman HTMLHalaman HTML

Halaman yang di-render di server memerlukan text start atau bun (lihat Deploy).

Host statis tidak bisa memberikan respons berbeda untuk setiap klien, sehingga adapter static tidak mendukung frame. Di Vercel dan Cloudflare, frame untuk halaman statis disertakan dalam build. Halaman dinamis ([id], force-dynamic) menyajikan HTML di sana, karena adapter vercel dan cloudflare tidak me-deploy renderer.

text start dan bun dist/server.js me-render halaman yang tersisa saat diminta dengan .text/server/live.mjs, dan menyimpan 128 frame terakhir selama 10 detik. Setiap server me-render paling banyak 20 halaman yang belum di-cache per 10 detik. Setelah batas itu, curl menerima halaman HTML hingga kuota terisi kembali. Jika live.mjs tidak bisa dimuat di server, misalnya karena modul halaman membaca window pada tingkat teratas, halaman tersebut menyajikan HTML.

text build melaporkan frame yang di-prerender:

 ✓ Prerendering curl frames (5/5)

Konfigurasi

Ubah ukuran untuk seluruh aplikasi, atau nonaktifkan frame:

text.config.tsts
import { defineConfig } from "@textjs/app";export default defineConfig({  ansi: { cols: 100, rows: 30 },  // ansi: false,});

Halaman dapat mengubah ukurannya sendiri, atau menyajikan HTML ke terminal juga:

app/dashboard/page.tsxtsx
export const ansi = { cols: 120, rows: 40 };// export const ansi = false;

Ukuran dibatasi pada 1–500 sel. Dengan ansi: false dalam text.config.ts, ekspor halaman diabaikan.

HTTP biasa

curl tidak mengikuti pengalihan kecuali Anda menyertakan -L. Vercel mengalihkan permintaan http:// ke https://, begitu pula Cloudflare jika Selalu gunakan HTTPS aktif, sehingga curl http://… mencetak pengalihan, bukan frame. Bagikan URL https://.

Server kustom

@textjs/app/ansi mengekspor helper deteksi dan respons, untuk server dan fungsi yang tidak menjalankan text start atau adapter:

import { ansiResponse, wantsAnsi } from "@textjs/app/ansi";import { frameToAnsi } from "@textjs/react";if (wantsAnsi(request)) return ansiResponse(frameToAnsi(buffer, { theme: "geistDark" }), request.method);

wantsAnsi(request) juga menerima (method, headers) dengan Web Headers atau IncomingHttpHeaders milik Node. frameToAnsi(buffer, { theme }) mengodekan CellBuffer yang telah di-render dengan cara yang sama seperti framework.

Edit halaman ini di GitHub