Browsing tables

VERSION a9b38ce
Browsing tables

A file node with display="table" shows its target as an interactive, read-only table instead of a link or a block of text — a CSV, a TSV, a Parquet file, JSON lines, anything the duckdb command-line tool can read (also compressed: .csv.gz). The file is never loaded into the page: meshfox asks duckdb for the rows on screen, so a file with millions of rows opens as quickly as one with twenty.

Needs the duckdb executable. meshfox never installs it for you: put it on PATH, or set duckdb_path under [tables] in .meshfox/config.toml (or the MESHFOX_DUCKDB environment variable). Without it a table node says so instead of showing a table.

What you can do with a table, in the browser and — full screen, with Enter — in the terminal viewer (meshfox tui):

  • Sort — click a column header (none → ascending → descending), Shift-click to add a second key; s/S in the terminal.
  • Filter a column — type into the box under its header (f in the terminal): plain text contains it (numbers: equals); >10, >=10, <10, =x, !=x; ^start, $end, ~anywhere; null, !null.
  • Search every column at once.
  • Look at one cell — click it to read the whole value (Enter in the terminal), y/Cmd-C copies it.

The table is read-only: edit the file with any editor and the node notices the change and reloads. meshfox static and meshfox pdf print the first 100 rows as a plain grid — and fail if a table can't be read (no duckdb, no file), rather than quietly leaving it out.

A small CSV

Twenty-four products, committed next to this canvas. Try filtering price with >=50, category with kitchen, or note with !null. Empty cells are NULL.

24 rows × 6 cols

#skuvarcharnamevarcharcategoryvarcharpricedoublestockbigintnotevarchar
1A-1001Desk lamp, brasslighting39.9120NULL
2A-1002Floor lamplighting89.035ships in 2 boxes
3A-1003LED bulb 4-packlighting12.5980NULL
4B-2001Oak shelf 80 cmfurniture59.044NULL
5B-2002Oak shelf 120 cmfurniture79.018NULL
6B-2003Writing deskfurniture249.07assembly required
7B-2004Office chairfurniture189.00back in stock in March
8C-3001Ceramic mugkitchen8.9640NULL
9C-3002Mug set, 6 pcskitchen44.090NULL
10C-3003Cast-iron pan 26 cmkitchen64.052NULL
11C-3004Chef's knifekitchen72.531hand wash only
12C-3005Cutting boardkitchen23.0210NULL
13D-4001Wool blankettextiles69.060NULL
14D-4002Linen cushiontextiles28.0150NULL
15D-4003Cotton toweltextiles14.0420NULL
16D-4004Curtain, 140x250textiles52.026NULL
17E-5001Notebook A5stationery4.51500NULL
18E-5002Fountain penstationery34.075blue ink included
19E-5003Ink refillstationery6.00NULL
20E-5004Desk organiserstationery19.088NULL
21F-6001Plant pot 20 cmgarden11.0330NULL
22F-6002Watering cangarden17.595NULL
23F-6003Garden shearsgarden26.040NULL
24F-6004Seed mixgarden3.81200sow in spring
A million rows, generated

The big files below don't live in the repository — this block makes one. Run it (r in the terminal, the run button in the browser), then watch events.csv in the next node fill in: a million rows, sorted, filtered and searched in a fraction of a second after the first, one-time import (which meshfox keeps in .meshfox/tables/, capped by [tables] cache_max_bytes, 4 GiB by default).

mkdir -p tables-data
awk 'BEGIN {
  srand(42)
  n = split("EU US APAC LATAM MEA", regions, " ")
  print "id,ts,region,amount,note"
  for (i = 1; i <= 1000000; i++) {
    printf "%d,2026-%02d-%02d %02d:%02d,%s,%.2f,%s\n", i, int(rand()*12)+1, \
      int(rand()*28)+1, int(rand()*24), int(rand()*60), \
      regions[int(rand()*n)+1], rand()*1000, (i % 7 == 0 ? "" : "order " i)
  }
}' > tables-data/events.csv
echo "wrote $(wc -l < tables-data/events.csv) lines"
events.csv

Until generate has run this says the file is missing; afterwards, sort amount descending, filter region with APAC and ts with 2026-06, or scroll to the very last row with G in the terminal. A column's type (bigint, varchar, double, ...) is detected from the data and shown under its name; numbers are right-aligned.

1,000,000 rows × 5 cols · first 100 shown

#idbiginttstimestampregionvarcharamountdoublenotevarchar
112026-01-01 17:02:00APAC927.11order 1
222026-08-21 11:24:00LATAM479.97order 2
332026-01-09 05:17:00EU119.8order 3
442026-04-09 10:23:00APAC158.64order 4
552026-11-21 03:04:00EU42.1order 5
662026-03-21 17:43:00APAC551.66order 6
772026-06-20 16:37:00US219.67NULL
882026-08-24 12:54:00EU314.91order 8
992026-04-03 10:33:00MEA688.91order 9
10102026-04-20 19:32:00MEA706.41order 10
11112026-01-05 00:18:00LATAM852.9order 11
12122026-06-01 10:40:00APAC118.86order 12
13132026-02-21 12:07:00EU157.41order 13
14142026-08-18 20:59:00EU992.06NULL
15152026-01-16 14:27:00US602.42order 15
16162026-10-28 07:25:00APAC408.81order 16
17172026-10-24 14:56:00LATAM542.12order 17
18182026-04-20 00:21:00LATAM553.21order 18
19192026-05-12 07:37:00EU687.69order 19
20202026-08-19 08:05:00LATAM584.9order 20
21212026-06-19 05:49:00LATAM374.52NULL
22222026-03-19 05:00:00US344.75order 22
23232026-11-18 05:22:00MEA526.33order 23
24242026-09-03 20:27:00APAC654.97order 24
25252026-09-10 08:06:00APAC44.2order 25
26262026-08-01 18:02:00MEA524.6order 26
27272026-08-17 13:58:00US85.99order 27
28282026-02-18 23:12:00APAC798.64NULL
29292026-10-18 07:21:00US529.19order 29
30302026-07-16 07:24:00LATAM308.25order 30
31312026-11-26 22:18:00MEA330.35order 31
32322026-10-06 16:59:00LATAM709.31order 32
33332026-06-16 09:50:00MEA107.05order 33
34342026-02-18 12:28:00EU305.49order 34
35352026-02-17 07:23:00LATAM526.44NULL
36362026-09-12 23:02:00LATAM337.21order 36
37372026-09-06 08:54:00APAC917.01order 37
38382026-12-09 08:13:00US284.02order 38
39392026-08-23 02:23:00APAC970.46order 39
40402026-01-26 06:50:00US303.29order 40
41412026-01-09 01:35:00LATAM372.8order 41
42422026-09-16 09:27:00APAC175.31NULL
43432026-04-15 07:55:00APAC234.81order 43
44442026-04-27 04:08:00EU122.07order 44
45452026-05-20 04:16:00LATAM458.64order 45
46462026-04-26 14:06:00APAC483.62order 46
47472026-10-09 00:18:00APAC439.14order 47
48482026-12-07 21:20:00EU320.82order 48
49492026-06-26 06:40:00EU238.76NULL
50502026-02-03 04:00:00US128.31order 50
51512026-06-09 23:21:00EU110.91order 51
52522026-08-22 03:23:00LATAM815.8order 52
53532026-04-24 17:21:00MEA872.34order 53
54542026-05-08 07:14:00EU137.67order 54
55552026-02-22 00:40:00MEA524.28order 55
56562026-11-10 04:17:00APAC776.46NULL
57572026-06-03 08:22:00EU103.79order 57
58582026-12-10 09:26:00MEA979.93order 58
59592026-10-06 19:16:00LATAM532.92order 59
60602026-10-19 04:06:00EU669.93order 60
61612026-01-04 13:50:00US951.65order 61
62622026-12-04 13:09:00MEA144.89order 62
63632026-04-16 12:57:00MEA390.37NULL
64642026-02-20 22:54:00EU4.54order 64
65652026-02-27 15:04:00US170.61order 65
66662026-02-19 06:13:00US39.05order 66
67672026-11-28 20:55:00MEA404.27order 67
68682026-02-06 23:36:00US977.78order 68
69692026-02-27 12:27:00LATAM381.12order 69
70702026-05-12 07:52:00LATAM960.97NULL
71712026-07-28 04:54:00APAC224.52order 71
72722026-11-05 20:54:00LATAM31.71order 72
73732026-06-06 06:20:00APAC539.13order 73
74742026-11-18 01:41:00US366.22order 74
75752026-12-13 23:51:00MEA686.86order 75
76762026-09-02 10:57:00EU491.02order 76
77772026-09-08 19:52:00APAC458.42NULL
78782026-01-26 10:25:00LATAM961.21order 78
79792026-06-20 20:50:00APAC917.5order 79
80802026-05-18 05:34:00MEA479.26order 80
81812026-04-05 12:49:00US216.17order 81
82822026-02-19 21:24:00US481.58order 82
83832026-10-27 11:53:00EU140.92order 83
84842026-03-12 21:12:00US66.71NULL
85852026-12-01 10:10:00LATAM400.53order 85
86862026-03-26 23:54:00APAC696.72order 86
87872026-12-26 19:11:00US173.96order 87
88882026-05-02 15:00:00MEA315.46order 88
89892026-08-16 02:33:00EU778.54order 89
90902026-08-23 13:36:00US267.05order 90
91912026-05-16 06:43:00EU388.23NULL
92922026-12-03 13:02:00US901.39order 92
93932026-06-04 14:10:00LATAM591.3order 93
94942026-12-03 04:07:00LATAM989.06order 94
95952026-08-22 07:12:00EU893.4order 95
96962026-02-06 15:59:00EU888.43order 96
97972026-03-14 01:00:00LATAM86.62order 97
98982026-12-18 13:25:00US120.41NULL
99992026-03-16 15:04:00EU389.16order 99
1001002026-06-22 17:29:00EU367.37order 100
The same data as Parquet

Parquet needs no import at all — meshfox reads it in place — so it's the cheapest format for really big data. This block turns the CSV into one with duckdb itself (the same tool the table view uses):

duckdb -c "COPY (SELECT * FROM 'tables-data/events.csv') TO 'tables-data/events.parquet' (FORMAT parquet)"
events.parquet

Same rows, a fraction of the disk space — compare the file size in the status bar tooltip with the CSV's.

1,000,000 rows × 5 cols · first 100 shown

#idbiginttstimestampregionvarcharamountdoublenotevarchar
112026-01-01 17:02:00APAC927.11order 1
222026-08-21 11:24:00LATAM479.97order 2
332026-01-09 05:17:00EU119.8order 3
442026-04-09 10:23:00APAC158.64order 4
552026-11-21 03:04:00EU42.1order 5
662026-03-21 17:43:00APAC551.66order 6
772026-06-20 16:37:00US219.67NULL
882026-08-24 12:54:00EU314.91order 8
992026-04-03 10:33:00MEA688.91order 9
10102026-04-20 19:32:00MEA706.41order 10
11112026-01-05 00:18:00LATAM852.9order 11
12122026-06-01 10:40:00APAC118.86order 12
13132026-02-21 12:07:00EU157.41order 13
14142026-08-18 20:59:00EU992.06NULL
15152026-01-16 14:27:00US602.42order 15
16162026-10-28 07:25:00APAC408.81order 16
17172026-10-24 14:56:00LATAM542.12order 17
18182026-04-20 00:21:00LATAM553.21order 18
19192026-05-12 07:37:00EU687.69order 19
20202026-08-19 08:05:00LATAM584.9order 20
21212026-06-19 05:49:00LATAM374.52NULL
22222026-03-19 05:00:00US344.75order 22
23232026-11-18 05:22:00MEA526.33order 23
24242026-09-03 20:27:00APAC654.97order 24
25252026-09-10 08:06:00APAC44.2order 25
26262026-08-01 18:02:00MEA524.6order 26
27272026-08-17 13:58:00US85.99order 27
28282026-02-18 23:12:00APAC798.64NULL
29292026-10-18 07:21:00US529.19order 29
30302026-07-16 07:24:00LATAM308.25order 30
31312026-11-26 22:18:00MEA330.35order 31
32322026-10-06 16:59:00LATAM709.31order 32
33332026-06-16 09:50:00MEA107.05order 33
34342026-02-18 12:28:00EU305.49order 34
35352026-02-17 07:23:00LATAM526.44NULL
36362026-09-12 23:02:00LATAM337.21order 36
37372026-09-06 08:54:00APAC917.01order 37
38382026-12-09 08:13:00US284.02order 38
39392026-08-23 02:23:00APAC970.46order 39
40402026-01-26 06:50:00US303.29order 40
41412026-01-09 01:35:00LATAM372.8order 41
42422026-09-16 09:27:00APAC175.31NULL
43432026-04-15 07:55:00APAC234.81order 43
44442026-04-27 04:08:00EU122.07order 44
45452026-05-20 04:16:00LATAM458.64order 45
46462026-04-26 14:06:00APAC483.62order 46
47472026-10-09 00:18:00APAC439.14order 47
48482026-12-07 21:20:00EU320.82order 48
49492026-06-26 06:40:00EU238.76NULL
50502026-02-03 04:00:00US128.31order 50
51512026-06-09 23:21:00EU110.91order 51
52522026-08-22 03:23:00LATAM815.8order 52
53532026-04-24 17:21:00MEA872.34order 53
54542026-05-08 07:14:00EU137.67order 54
55552026-02-22 00:40:00MEA524.28order 55
56562026-11-10 04:17:00APAC776.46NULL
57572026-06-03 08:22:00EU103.79order 57
58582026-12-10 09:26:00MEA979.93order 58
59592026-10-06 19:16:00LATAM532.92order 59
60602026-10-19 04:06:00EU669.93order 60
61612026-01-04 13:50:00US951.65order 61
62622026-12-04 13:09:00MEA144.89order 62
63632026-04-16 12:57:00MEA390.37NULL
64642026-02-20 22:54:00EU4.54order 64
65652026-02-27 15:04:00US170.61order 65
66662026-02-19 06:13:00US39.05order 66
67672026-11-28 20:55:00MEA404.27order 67
68682026-02-06 23:36:00US977.78order 68
69692026-02-27 12:27:00LATAM381.12order 69
70702026-05-12 07:52:00LATAM960.97NULL
71712026-07-28 04:54:00APAC224.52order 71
72722026-11-05 20:54:00LATAM31.71order 72
73732026-06-06 06:20:00APAC539.13order 73
74742026-11-18 01:41:00US366.22order 74
75752026-12-13 23:51:00MEA686.86order 75
76762026-09-02 10:57:00EU491.02order 76
77772026-09-08 19:52:00APAC458.42NULL
78782026-01-26 10:25:00LATAM961.21order 78
79792026-06-20 20:50:00APAC917.5order 79
80802026-05-18 05:34:00MEA479.26order 80
81812026-04-05 12:49:00US216.17order 81
82822026-02-19 21:24:00US481.58order 82
83832026-10-27 11:53:00EU140.92order 83
84842026-03-12 21:12:00US66.71NULL
85852026-12-01 10:10:00LATAM400.53order 85
86862026-03-26 23:54:00APAC696.72order 86
87872026-12-26 19:11:00US173.96order 87
88882026-05-02 15:00:00MEA315.46order 88
89892026-08-16 02:33:00EU778.54order 89
90902026-08-23 13:36:00US267.05order 90
91912026-05-16 06:43:00EU388.23NULL
92922026-12-03 13:02:00US901.39order 92
93932026-06-04 14:10:00LATAM591.3order 93
94942026-12-03 04:07:00LATAM989.06order 94
95952026-08-22 07:12:00EU893.4order 95
96962026-02-06 15:59:00EU888.43order 96
97972026-03-14 01:00:00LATAM86.62order 97
98982026-12-18 13:25:00US120.41NULL
99992026-03-16 15:04:00EU389.16order 99
1001002026-06-22 17:29:00EU367.37order 100