Formats and limits#

  • PNG, JPEG, WebP, BMP, TIFF: first frame/page, up to 32 megapixels. Animated WebP and AVIF aren’t supported.
  • GIF: automatic playback with transparency, partial frames, disposal, and the file’s loop count. Space pauses/resumes (or restarts after the last loop); </> select 0.25×, 0.5×, 1×, 2×, or 4× speed; Backspace restores 1×. r reloads from the beginning at 1×. The status bar shows the frame, speed, and playback state. e exports the current full frame as PNG; zoom/pan still work. Canvas size is limited to 32 MP, animation to 1,000 frames and 64 Mi decoded frame pixels in total. Limits are checked before decoding all frames. Delays below 20 ms use 100 ms before the speed multiplier is applied; other delays are scaled directly (minimum 5 ms at 4×). Rendering can slow playback on large images or slow terminals; frames are not queued up. File-list previews, inline Markdown/notebook images, and headless --output use the first frame on the full logical canvas. GIF frames are not --pages.
  • HEIC/HEIF: primary still image, up to 32 megapixels, with container rotation and mirroring. Uses the pure-Go h265 decoder, without CGO or external converters. Unsupported HEVC features report decoder errors. HEIC works in Markdown, previews, PNG exports, and the browser demo.
  • SVG: NTCharts’ pure-Go SVG renderer, rasterized to a 2400-pixel maximum edge. SVG support follows the underlying oksvg renderer, not a full browser engine.
  • PDF: PDFium via embedded WebAssembly; no Poppler, MuPDF, CGO, or external runtime installation. Pages render at 150 DPI by default (--dpi 36..600), with a 32-megapixel raster budget and a 10,000-page limit. Password-protected PDFs aren’t supported. / searches the text layer and jumps to matching pages with excerpts; it does not highlight the raster or perform OCR.
  • STL: ASCII and binary, flat-shaded triangles, up to 932,067 faces: as many as NTCharts3d draws, which is as many as any GPU is sure to hold. Normals are recomputed from vertex winding. GPU rendering falls back to software and then wireframe. Software draws at full size for Kitty output, smaller only while its frames are slow, and samples meshes above 20,000 triangles; wireframe samples above 2,000 triangles, so large models can lose detail in fallback modes.
  • Mesh color: an STL, and the faces of a 3MF its file leaves plain, are drawn in one default blue. C opens a color picker over the mesh: a palette of swatches, one slider per channel, or a hex number typed in, each change painted as it is made; Enter chooses the swatch you have moved to (or keeps the color set) and closes, changing nothing if you have not moved; Esc undoes it. A 3MF with colors of its own is recolored whole, and the picker’s Reset button (or r) gives its colors back; s limits the paint to the faces its file left plain. --color #rrggbb, or a name such as orange, paints the viewer and exports alike.
  • 3MF parts: what the build places is listed by name, from the model or the slicer’s settings, and c opens that list over the mesh: Space shows or hides a part, Enter shows it alone with the camera fitted to it, n keeps only it, a and X bring all back. --parts name,name and --partn 2,4-6 choose parts for the viewer, an export, or --info, so an agent can pose one part of an assembly. The triangle limit applies to the parts shown, so a project too large to draw whole can be seen part by part.
  • 3MF: the core specification’s meshes, components, and build transforms; colors from base materials and color groups; objects kept in separate parts of the package, as slicers write them. Projects from Bambu Studio and its relatives are drawn in their filament colors, which those programs keep in settings of their own; colors painted onto faces are not read. Textures, beam lattices, slices, and encrypted content are not read. The same 932,067-face limit applies: a larger model is shown by its embedded thumbnail, and described by i. A package may hold 4,096 entries and unpack to 128 MiB; one that unpacks to more is shown by its thumbnail too, and described by what its root model says.
  • Plain text (.txt, .text, .log, and any file that is not binary): shown as it is, in the document view, so that no line of it is read as a heading, a list, or emphasis. Returns and a byte order mark are dropped, bytes that are not UTF-8 stand as �, and a file longer than 2 MiB is cut. A file of no known kind is read as text when its first 8 KiB hold no NUL byte, are UTF-8, and are mostly printable, as less would show it; source code and configuration open that way, highlighted by chroma in the language its name or first line says. Only binary files are unsupported.
  • JSON (.json, .jsonl, .ndjson): pretty-printed and highlighted as a fenced block; s shows it as it is in the file. A file with one value to a line, such as a training set, a batch request, or a log export, is shown as numbered records, whatever its name. Malformed JSON is refused with the line it fails on. Extensionless JSON and stdin are recognised by parsing. The view is cut at 2 MiB of pretty-printed text; i says how many records there are.
  • Jupyter notebooks (.ipynb, nbformat 4): Markdown cells as they are, code cells fenced in the kernel’s language after their In [n] count, and each output after its cell: text as it was printed, errors without their colour codes, and PNG, JPEG, GIF, and SVG outputs as pictures. Widgets, HTML, and LaTeX outputs fall back to their text.
  • HTML (.html, .htm): converted to Markdown with html-to-markdown, so saved pages and wiki exports read as documents: headings, lists, tables, links, code, and pictures beside the file are kept; scripts, styles, and layout are not. Nothing is fetched. A page may be 8 MiB.
  • Word (.docx, .docm): turned into Markdown and shown as such, so s shows the Markdown. Headings, lists, tables, links, pictures, and bold, italic, and struck text are kept; page layout, headers and footers, footnotes, comments, and text boxes are not. A document longer than 2 MiB of Markdown is cut.
  • Excel (.xlsx, .xlsm): each sheet is a grid that scrolls by row and column, with n and p turning between sheets. Cells show their values, formulas by their last result, and dates and times where a cell’s style says so. Up to 100,000 rows and 1,024 columns of a sheet are read; the rest are counted. Formatting, merged cells, charts, and pictures are not shown.
  • Grist (.grist): a Grist document is a SQLite database, and each of its tables is shown as a sheet is, with n and p turning between tables. The first row holds the columns’ labels, and rows and columns stand in the order Grist keeps them in; summary tables come after the others, titled as Grist titles them (Sightings [by Site]), what they group by shown as the table summed shows it. Cells show what is stored: formulas by their last result, as Grist saved it, and an error by its name (#TypeError). Dates and times are written out, a reference shows what Grist shows for it, or Table[row] where it shows the row, lists are joined with commas, and attachments are named, not opened. A hyperlink cell shows its words and leads to its address, as an Excel link does. Row ids, the positions rows are sorted by, Grist’s helper columns, and a summary’s list of the rows behind each line are left out. Nothing is worked out anew: no formulas, access rules, widgets, or number formats, and nothing is written. Up to 100,000 rows and 1,024 columns of a table are read. A document in SQLite’s WAL mode is not read, nor is any other SQLite database: gloss is not a database browser.
  • CSV (.csv, .tsv): shown as a sheet is. The separator is read from the file: a comma, tab, semicolon, or pipe, whichever the first lines agree on; a .tsv is read as tabs. Quoted values may hold the separator and line breaks. Only the file’s name says it is a table: text is not sniffed.
  • Columns of a table: x hides the one under the cursor, X brings them all back, and c lists them to tick and untick. Hidden columns keep their letters, and one column always stays. --cols Name,City shows only the columns with those headers (or letters), and --coln 2,4-6 those numbered so, in every table opened; a table with none of them is shown whole.
  • Web addresses in tables: a cell that holds an address or, in Excel and Grist, links to one is marked 🔗, and is a link to the terminal as well: click it as your terminal has links clicked (often with Cmd, Ctrl, or Shift held, since gloss takes plain clicks) and the terminal opens it in your browser. gloss itself starts no browser. A sheet has a cursor, and the status bar shows the address under it. With --fetch, Enter on such a cell downloads what it names and opens it like a dropped file; a picture is shown as one, and Esc closes it and returns to the cell. Only http and https are fetched, of no more than 128 MiB, and only on Enter or a URL drop/paste: gloss never fetches on its own. Fetched files are removed when closed or when gloss exits, unless they were picked.
  • Input files and stdin are limited to 128 MiB. One active document and, when enabled, one independent preview are kept open. Images, SVGs, and PDF pages zoom by cropping the existing raster, up to 64×; use a higher PDF DPI for more detail. There is no file watching, and no fetching unless --fetch is given; even then only Enter on a cell or an explicit URL drop/paste fetches.