Previews
Hyperfile renders rich previews for many file types directly in the browser.
Supported Formats
Images
JPEG, PNG, GIF, WebP, SVG, TIFF, and BMP.
Documents
PDF, DOCX, and plain text / Markdown. Markdown files can draw charts from your data files — see Charts in Markdown.
Code
Syntax-highlighted previews for JavaScript, TypeScript, Python, Go, Rust, Java, C/C++, PHP, HTML, CSS, SQL, JSON, XML, Markdown, and more.
Tabular Data
CSV, TSV, XLSX, and XLS files render as interactive data tables with sorting and filtering.
Audio & Video
MP3, WAV, FLAC, OGG, MP4, WebM, and MOV with native playback controls and waveform visualization for audio.
Preview Panel
Click any file to open the preview panel on the right side of the screen. The panel adapts to the file type and provides download, version history, and metadata controls.
Charts in Markdown
A code block that opens with ```chart in a Markdown file draws a chart from a CSV, TSV, XLSX, XLS, JSON or JSONL file in the same filesystem. CSV, TSV and JSONL files can be any size, since they are read as they download. JSON, XLSX and XLS files are read whole in your browser, so a very large one can be slow to draw. Charts draw in the file preview and in the editor's preview pane, and they print.
Quick form
type: bar
sources:
sales: ../data/sales.csv
x: sales.Month
y:
- sales.Revenue
- sales.Cost
title: Sales by month
sources names each file once. x and y always start with a source name, like sales.Month, and y can be one column or a list of them. type is line (the default), bar, scatter, pie, doughnut or area, which is a filled line.
Paths are relative to the Markdown file (./, ../) or from the top of the filesystem (/data/sales.csv). Unlike an image link, a source path is a plain file path rather than a URL: %, # and ? are ordinary characters, so ./50%.csv and ./Q1#2.csv name exactly those files, and %20 stays %20 rather than becoming a space.
Full form
For more control, write a Chart.js config and put references where the data goes:
type: line
sources:
sales: ../data/sales.csv
forecast:
path: ../data/forecast.xlsx
sheet: FY26
data:
labels: sales.Month
datasets:
- label: Revenue
data: sales.Revenue
- label: Forecast
data: forecast[C2:C13]
options:
plugins:
legend:
position: bottom
References are read at data.labels and at each dataset's data. A value there that is not a reference, like sales report, stays as written. A source name followed by . or [ is always read as a reference, so a label like sales.Q1 (est) is reported as a bad reference rather than drawn as text. Everything else goes to Chart.js as written, so any Chart.js option works, with two additions: a dataset that sets no colours gets the theme's, and a long line chart of sorted number points on a linear x axis is thinned out (Chart.js decimation) so it draws quickly. Setting your own parsing or decimation option, or parsing on any dataset, turns the thinning off. The config is YAML or JSON, so options that need a function (callbacks) are not possible.
A chart in its own file
Put either form in a .yaml or .json file and point the block at it:
../charts/sales.chart.yaml
Paths inside that file are relative to the file itself, not to the Markdown file. A chart file can be up to 1 MB.
References
| By name | Means |
|---|---|
sales |
The whole table |
sales.Revenue |
The column headed "Revenue" |
sales["Unit Price"] |
A heading with spaces, dots or brackets |
forecast.FY26.Revenue |
Sheet FY26, then its column "Revenue" |
stats.monthly.visits |
JSON: into monthly, then the column "visits" |
| Spreadsheet ranges | Means |
|---|---|
sales[B] |
Column B |
sales[A2:A13] |
Cells A2 to A13 |
sales[2:2] |
Row 2 |
sales[A1:C13] |
Columns A to C, rows 1 to 13, without the header row |
forecast.FY26[C2:C13] |
A range on sheet FY26 |
| Index slices | Means |
|---|---|
sales[:,0] |
The first column |
sales[0,:] |
The first data row |
sales[1:,0] |
The first column, from the second data row on |
sales[:,0:2] |
The first two columns |
sales[-12:,1] |
The last twelve rows of the second column |
- The header row is never data. It is the first row that is not empty, usually row 1. It names the columns, so
sales[B]andsales.Revenueboth start on the row after it. - A comma inside the brackets means
[rows, columns]. These count from 0 over the data rows, like Python, and a negative number counts from the end. When the header is on row 1,sales[A2:A13]andsales[0:12,0]are the same cells. - Inside brackets, a letter is a column.
sales[B]is always column B, whilesales.Bis the column headed "B".
Source options
A source can be a map instead of a path:
sources:
forecast:
path: ../data/forecast.xlsx
sheet: FY26
raw:
path: ./readings.csv
header: false
sheetpicks a workbook sheet by name, or by number counting from 1. Without it, write the sheet in the reference (forecast.FY26.Revenue), or leave it out to read the first sheet.header: falseis for a file with no header row. Every row is then data, and the columns are named A, B, C and so on.
JSON and JSONL
- An array of objects is a table, with the keys as its columns.
- Reach nested data by its keys:
stats.monthly.visitsis thevisitscolumn of themonthlyarray. - With a source named
myDatapointing at a file that holds{"x": [1, 2, 3]},myData.xis that list, read as one column. - A JSONL file is one object per line, and reads like an array of objects. It is already a list, so there are no keys to descend: a JSONL reference takes at most one column name after the source, like
events.visits.
Shapes
- One column (or one row) is a series of values, or the labels along the axis.
- On a
scatterorbubblechart, two columns, or a list of two references, become points (x, y). On atype: bubblechart, which needs the full form, a third column sets each bubble's size. On any other chart a data position takes one column. - Blank cells are gaps in the line.
- Numbers stored as text become numbers. A number written with a thousands comma, like
1,000, stays text.
Lists of references
Write a list of references in block form, one - item per line. Inside a short [a, b] list, the [ and , in a reference confuse YAML.
type: scatter
sources:
stats: /data/stats.json
data:
datasets:
- label: Signups per visit
data:
- stats.monthly.visits
- stats.monthly.signups
If a chart does not render
The block shows its source, with the reason underneath. The usual causes are:
- A path that names no file — "no file at …".
- A column name that is not in the file. The message lists the columns the file does have.
- An
xorythat does not start with a source name, likex: Monthinstead ofx: sales.Month.
Checking a chart
Agents connected to Hyperfile over MCP have a lint_file tool. It checks every chart block in a file, along with its frontmatter, code blocks and links, and names the line of each problem. If it reports a YAML error on a short [a, b] list of references, an item in it holds [, ], {, } or " — like [sales[B], sales[C]]. Quote that item, or write the list in block form instead — see Lists of references.