Il framework per la console

Crea app React full-stack renderizzate dentro console.log.

Inizia

Questa pagina è in esecuzione nella tua console. Aprila con ⌘⌥JCtrl+Shift+J⌘⌥KCtrl+Shift+K⌘⌥C (prima attiva le funzionalità per sviluppatori), fai clic sull’anteprima qui sotto e premi ↑ ↓.

1import { useState } from "react";2import { AsciiFont, Box, Text, useInput } from "@textjs/app";34export default function Page() {5  const [count, setCount] = useState(0);6  useInput((e) => {7    if (e.key === "up") setCount((c) => c + 1);8    if (e.key === "down") setCount((c) => c - 1);9  });1011  return (12    <Box className="flex-col gap-1 p-2">13      <AsciiFont text="▼ TEXT.JS" />14      <Text color="muted">React 19 in console.log</Text>15      <Text bold color="accent">count = {count}</Text>16    </Box>17  );18}
viewport:3

React 19

Text.js supporta il rendering concorrente, Suspense e gli error boundary.

App Router

Le cartelle in app/ diventano route e layout, e Indietro, Avanti e i deep link funzionano.

Griglia responsive

La griglia si adatta al pannello DevTools ancorato a qualsiasi zoom della pagina.

Input da tastiera

Tasti, testo incollato e composizione IME raggiungono l’app tramite un unico <textarea> nascosto.

Tabelle, grafici, moduli e scorciatoie

Dal vivo
preview://table:1
↑ ↓ sposta · s ordina · Space seleziona
Documentazione
Layout
  • <Box>
  • <Stack>
  • <Grid>
  • <SplitPane>
  • <ScrollBox>
  • <Center>
Dati
  • <List>
  • <Table>
  • <Tree>
  • <Markdown>
  • <Code>
  • <Diff>
Grafici
  • <LineChart>
  • <BarChart>
  • <Sparkline>
  • <ProgressBar>
  • <Gradient>
  • <Image>
Controlli
  • <Input>
  • <Select>
  • <Checkbox>
  • <Switch>
  • <Slider>
  • <Dialog>
Tastiera
  • useKeymap
  • <KeyHelp>
  • <KeyHints>
  • <CommandPalette>
  • <StatusBar>
  • useFocus

Ogni frame modificato è una chiamata a console.log

Un commit che non modifica celle non raggiunge mai la console.

  1. React 19

    01Commit

    React esegue i commit tramite un reconciler personalizzato.

  2. Yoga

    02Layout

    Yoga dispone i riquadri su celle intere.

  3. CellBuffer

    03Disegno

    Solo le righe modificate vengono ridisegnate.

  4. Hash di riga

    04Filtro modifiche

    I frame invariati si fermano qui.

  5. RLE

    05Codifica

    3200 celle diventano 149 span %c.

  6. console.log

    06Emissione

    I frame vengono accodati a distanza di almeno 66 ms.

Frame modificato Frame invariato, 0 chiamate

Frame accodati

Svuotare la console prima di ogni frame la lascia vuota finché DevTools non disegna il successivo. Turbolog accoda invece ogni frame.

Leggi il post
clear() + log()70.6% vuoto
log(), appended1.0% vuoto
0.163msRidisegno completo (layout, disegno, codifica)
0.011msModifica di una riga, come la pressione di un tasto
0 chiamateFrame inattivo
149 spanArgomenti %c per 3200 celle
Dashboard 100×32, media di 1000 frame · Apple M5 Pro · Bun 1.4.4Documentazione del motore Turbolog

Renderizzare le route sul server

Esporta runtime = "server" per renderizzare una route e i suoi componenti asincroni sul server. Il browser carica un riproduttore di frame da 21 kB (gzip) al posto della tua app.

1import { Suspense } from "react";2import { Box, Text } from "@textjs/app";3import { db } from "@/lib/db";45export const runtime = "server";67async function Deploys() {8  const rows = await db.deploys.latest(5);9  return rows.map((d) => (10    <Text key={d.id}>{`${d.state}  ${d.branch}`}</Text>11  ));12}1314export default function Page() {15  return (16    <Box className="flex-col p-1">17      <Text bold>Deployments</Text>18      <Suspense fallback={<Text color="muted">Loading…</Text>}>19        <Deploys />20      </Suspense>21    </Box>22  );23}

Programmare con OpenCode in DevTools

OpenCode Lite è la TUI di OpenCode ricostruita con Text.js per funzionare nella console del browser.

Sandbox

Un agente con script risponde a qualsiasi prompt, senza nulla da installare.

Un comando

Esegui bunx @textjs/opencode@latest proxy e inserisci il codice che stampa. La pagina si connette a OpenCode sul tuo computer.

I tuoi modelli e le tue sessioni

Scegli con /models un modello configurato sul tuo server. Sessioni, agenti e modelli provengono dal tuo server OpenCode.