viewinline 0.3.2__tar.gz → 0.5.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- viewinline-0.5.0/CITATION.cff +45 -0
- {viewinline-0.3.2 → viewinline-0.5.0}/PKG-INFO +107 -2
- {viewinline-0.3.2 → viewinline-0.5.0}/README.md +105 -0
- viewinline-0.5.0/context7.json +20 -0
- viewinline-0.5.0/llms.txt +247 -0
- {viewinline-0.3.2 → viewinline-0.5.0}/pyproject.toml +1 -1
- {viewinline-0.3.2 → viewinline-0.5.0}/src/viewinline/viewinline.py +472 -21
- viewinline-0.5.0/viewinline/SKILL.md +200 -0
- viewinline-0.5.0/viewinline_gif2.jpg +0 -0
- {viewinline-0.3.2 → viewinline-0.5.0}/.github/FUNDING.yml +0 -0
- {viewinline-0.3.2 → viewinline-0.5.0}/.gitignore +0 -0
- {viewinline-0.3.2 → viewinline-0.5.0}/LICENSE +0 -0
- {viewinline-0.3.2 → viewinline-0.5.0}/src/viewinline/__init__.py +0 -0
- {viewinline-0.3.2 → viewinline-0.5.0}/viewinline_gif1.gif +0 -0
- {viewinline-0.3.2 → viewinline-0.5.0}/viewinline_gif2.gif +0 -0
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
cff-version: 1.2.0
|
|
2
|
+
message: "If you use this software, please cite it using the metadata from this file."
|
|
3
|
+
title: "viewinline"
|
|
4
|
+
abstract: >-
|
|
5
|
+
A tiny, non-interactive command-line viewer that displays rasters/photos,
|
|
6
|
+
vectors, and tabular data (CSV/Parquet) inline in the terminal — no GUI,
|
|
7
|
+
no X11, and no file downloads. Designed for quick visual inspection at the
|
|
8
|
+
command line, and especially useful on HPC systems and remote servers over
|
|
9
|
+
SSH, where images render on the local terminal.
|
|
10
|
+
type: software
|
|
11
|
+
authors:
|
|
12
|
+
- given-names: Keiko
|
|
13
|
+
family-names: Nomura
|
|
14
|
+
orcid: "https://orcid.org/0000-0002-5218-3414"
|
|
15
|
+
- given-names: Filip
|
|
16
|
+
family-names: Kral
|
|
17
|
+
- given-names: Luis
|
|
18
|
+
family-names: Manrique Ruiz
|
|
19
|
+
repository-code: "https://github.com/nkeikon/inlineviewer"
|
|
20
|
+
url: "https://github.com/nkeikon/inlineviewer"
|
|
21
|
+
license: Apache-2.0
|
|
22
|
+
version: 0.5.0
|
|
23
|
+
date-released: 2026-10-21
|
|
24
|
+
# ---------------------------------------------------------------------------
|
|
25
|
+
# The DOI below is the VERSION DOI for v0.3.2 (a specific archived snapshot).
|
|
26
|
+
# To make citations always resolve to your LATEST release, replace it with the
|
|
27
|
+
# Zenodo CONCEPT / "all versions" DOI, shown on the record under "Cite all
|
|
28
|
+
# versions". The version DOI stays useful in `identifiers` for reproducibility.
|
|
29
|
+
# ---------------------------------------------------------------------------
|
|
30
|
+
doi: "10.5281/zenodo.19700943"
|
|
31
|
+
identifiers:
|
|
32
|
+
- type: doi
|
|
33
|
+
value: "10.5281/zenodo.19700943"
|
|
34
|
+
description: "Zenodo archive"
|
|
35
|
+
keywords:
|
|
36
|
+
- geospatial
|
|
37
|
+
- raster
|
|
38
|
+
- vector
|
|
39
|
+
- terminal
|
|
40
|
+
- command-line
|
|
41
|
+
- visualization
|
|
42
|
+
- GeoTIFF
|
|
43
|
+
- NetCDF
|
|
44
|
+
- GeoParquet
|
|
45
|
+
- remote-sensing
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
2
|
Name: viewinline
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.5.0
|
|
4
4
|
Summary: Quick look geospatial viewer for the terminal, with inline image previews
|
|
5
5
|
Project-URL: Homepage, https://github.com/nkeikon/viewinline
|
|
6
6
|
Project-URL: Repository, https://github.com/nkeikon/viewinline
|
|
@@ -81,6 +81,17 @@ viewinline hyperspectral.nc --subset 22 --bands 10-54 --gallery 5x11
|
|
|
81
81
|
viewinline path/to/vector.geojson
|
|
82
82
|
viewinline boundaries.geoparquet --color-by population --colormap viridis
|
|
83
83
|
|
|
84
|
+
# Save to file
|
|
85
|
+
viewinline path/to/file.tif --export out.png # save the rendered image as PNG (or .jpg)
|
|
86
|
+
viewinline scene.tif --rgb 4 3 2 --export rgb.png
|
|
87
|
+
viewinline dem.tif --colormap terrain --display 1 --export dem.png # full-res with colormap
|
|
88
|
+
|
|
89
|
+
# Axis and grid overlay
|
|
90
|
+
viewinline path/to/file.tif --grid # ticks + grid in the raster's CRS units (5 divisions)
|
|
91
|
+
viewinline path/to/file.tif --grid 10 # 10 divisions instead of the default 5
|
|
92
|
+
viewinline boundaries.geoparquet --grid # ticks + grid in the vector's CRS units
|
|
93
|
+
viewinline photo.png --grid # pixel positions (no CRS)
|
|
94
|
+
|
|
84
95
|
# CSV and Parquet
|
|
85
96
|
viewinline data.csv # preview rows and columns
|
|
86
97
|
viewinline data.parquet --describe # summary statistics
|
|
@@ -134,6 +145,7 @@ You can also force the chafa path on any terminal by setting `INLINE_VIEWER_ENGI
|
|
|
134
145
|
- **NetCDF/HDF Support:** Display variables from NetCDF (.nc) and HDF5 (.h5, .hdf5) files with automatic nodata detection and multi-slice navigation
|
|
135
146
|
- **Parquet/GeoParquet:** Render GeoParquet as vector maps or view as tabular data
|
|
136
147
|
- **Tabular View for Vectors:** Use `--table` to access CSV-style operations (filter, sort, describe, hist) on any vector file
|
|
148
|
+
- **AI-agent inspection:** `--info` returns file metadata and statistics as JSON; `--export` saves a quick-look image for an agent to inspect. Designed for AI coding-agent workflows.
|
|
137
149
|
|
|
138
150
|
## Supported formats
|
|
139
151
|
**Rasters**
|
|
@@ -180,6 +192,7 @@ You can also force the chafa path on any terminal by setting `INLINE_VIEWER_ENGI
|
|
|
180
192
|
- Variables with 4+ dimensions are not supported
|
|
181
193
|
- For a complete variable list, use `ncdump -h file.nc` or `viewtif`
|
|
182
194
|
|
|
195
|
+
|
|
183
196
|
## Dependencies
|
|
184
197
|
|
|
185
198
|
**Core dependencies** (installed automatically):
|
|
@@ -213,6 +226,9 @@ You can also force the chafa path on any terminal by setting `INLINE_VIEWER_ENGI
|
|
|
213
226
|
```
|
|
214
227
|
General:
|
|
215
228
|
--display DISPLAY Resize only the displayed image (0.5=smaller, 2=bigger). Default: auto-fit to terminal.
|
|
229
|
+
--info Print file metadata and statistics as JSON, then exit (agent-facing). For NetCDF/HDF, lists variables; combine with --subset N to inspect one. Always returns JSON, including on error.
|
|
230
|
+
--export PATH Save the rendered image to PATH (.png/.jpg) and open it. Works with any display flag. Prints {"path": "..."} as the final line.
|
|
231
|
+
--grid [N] Overlay axis ticks and a light grid (N divisions, default 5). Labels are in the file's CRS units (degrees or metres) for georeferenced rasters and vectors; pixel positions for PNG/JPG, NetCDF, and non-georeferenced files.
|
|
216
232
|
|
|
217
233
|
Raster:
|
|
218
234
|
--band BAND Band number to display (single raster), or slice number for NetCDF. (default: 1)
|
|
@@ -249,6 +265,95 @@ CSV and Parquet:
|
|
|
249
265
|
--select COLUMNS Select specific columns (space separated). Example: --select Country City
|
|
250
266
|
--sql QUERY Execute full DuckDB SQL query. Use 'data' as table name. Example: --sql "SELECT * FROM data WHERE Poverty > 40"
|
|
251
267
|
```
|
|
268
|
+
## AI-agent inspection (`--info`, `--export`)
|
|
269
|
+
|
|
270
|
+
An optional command aimed at AI coding-agent workflows (Claude Code, Codex, Cursor, and similar). An agent can confirm its code *ran*, but not whether the geospatial file it produced is *sensible* — wrong CRS, unexpected dimensions, all-NoData, NaN/Inf values, or a flipped output. `--info` answers **"what did I create?"** as machine-readable JSON.
|
|
271
|
+
|
|
272
|
+
```bash
|
|
273
|
+
viewinline result.tif --info # metadata + statistics as JSON, then exit
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
It reports facts, not judgments: format, dimensions, bands, dtype, CRS, resolution, bounds, nodata, and per-band statistics. For NetCDF/HDF it lists variables; add `--subset N` to inspect one:
|
|
277
|
+
|
|
278
|
+
```bash
|
|
279
|
+
viewinline data.nc --info # list variables
|
|
280
|
+
viewinline data.nc --subset 7 --info # inspect variable 7
|
|
281
|
+
viewinline scene.hdf --subset 1 --info # inspect HDF subdataset 1
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
`--info` always returns JSON, including a `{"readable": false, "error": ...}` object on unreadable input, so an agent can always parse the result. Pairs well with `--export` (see Usage) when the agent wants to *see* the output too, not just read its metadata.
|
|
285
|
+
|
|
286
|
+
### `--info` — structured inspection
|
|
287
|
+
|
|
288
|
+
Prints file metadata as JSON and exits (no image is drawn). Reports facts, not judgments — the agent interprets them in context.
|
|
289
|
+
|
|
290
|
+
```bash
|
|
291
|
+
viewinline result.tif --info
|
|
292
|
+
```
|
|
293
|
+
```json
|
|
294
|
+
{
|
|
295
|
+
"format": "GTiff",
|
|
296
|
+
"filename": "result.tif",
|
|
297
|
+
"dimensions": [1001, 1001],
|
|
298
|
+
"bands": 3,
|
|
299
|
+
"dtype": "uint16",
|
|
300
|
+
"crs": "EPSG:32631",
|
|
301
|
+
"resolution": [10.0, 10.0],
|
|
302
|
+
"bounds": [590520.0, 5780620.0, 600530.0, 5790630.0],
|
|
303
|
+
"nodata": null,
|
|
304
|
+
"statistics": {
|
|
305
|
+
"method": "full",
|
|
306
|
+
"bands_total": 3,
|
|
307
|
+
"bands_reported": 3,
|
|
308
|
+
"per_band": [
|
|
309
|
+
{"band": 1, "min": 0.0, "max": 10964.0, "mean": 1009.32, "valid_fraction": 1.0, "naninf_fraction": 0.0}
|
|
310
|
+
]
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
For **NetCDF and HDF**, `--info` lists the file's variables/subdatasets; add `--subset N` to inspect one:
|
|
316
|
+
|
|
317
|
+
```bash
|
|
318
|
+
viewinline data.nc --info # list variables
|
|
319
|
+
viewinline data.nc --subset 7 --info # inspect variable 7 (dims, dtype, units, stats)
|
|
320
|
+
viewinline scene.hdf --subset 1 --info # inspect HDF subdataset 1
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
`--info` **always returns JSON**, including on failure. Unsupported or unreadable inputs return a structured error rather than crashing, so an agent can always parse the result:
|
|
324
|
+
|
|
325
|
+
```json
|
|
326
|
+
{"error": "no directly-readable bands (file has subdatasets)", "readable": false, "subdataset_count": 22}
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
Notes on the output:
|
|
330
|
+
- `crs` is an `EPSG:code` when one can be resolved, the full WKT string when the CRS has no EPSG code (e.g. MODIS Sinusoidal), or `null` when the file has no CRS.
|
|
331
|
+
- Statistics exclude NoData and non-finite pixels; `valid_fraction` and `naninf_fraction` report how much was excluded.
|
|
332
|
+
- For files with many bands, per-band stats are capped (a `bands_reported` < `bands_total` and a `note` indicate truncation — absence of a band's stats does **not** imply a problem).
|
|
333
|
+
- Large rasters are sampled for statistics (`"method": "sampled"`); small ones use every pixel (`"method": "full"`).
|
|
334
|
+
|
|
335
|
+
### `--export` — visual inspection
|
|
336
|
+
|
|
337
|
+
Saves the rendered image to a file (PNG or JPEG, chosen by extension) so an agent can also inspect it with its vision capabilities, then prints the path as JSON:
|
|
338
|
+
|
|
339
|
+
```bash
|
|
340
|
+
viewinline result.tif --export out.png
|
|
341
|
+
```
|
|
342
|
+
```json
|
|
343
|
+
{"path": "/abs/path/out.png"}
|
|
344
|
+
```
|
|
345
|
+
|
|
346
|
+
`--export` works with **any display option** — the saved image is exactly what viewinline would render, after all flags are applied:
|
|
347
|
+
|
|
348
|
+
```bash
|
|
349
|
+
viewinline scene.tif --rgb 4 3 2 --export rgb.png
|
|
350
|
+
viewinline dem.tif --colormap terrain --export dem.png
|
|
351
|
+
viewinline result.tif --display 1 --export full_res.png # full resolution instead of terminal-fit
|
|
352
|
+
```
|
|
353
|
+
|
|
354
|
+
The exported image is a quick-look representation for catching problems metadata can't reveal — blank output, stripes, artifacts, holes, wrong orientation, unexpected extent, or bad color scaling — **not** a publication-quality rendering.
|
|
355
|
+
|
|
356
|
+
> **Scope:** `--info` and `--export` tell you what a file *is* and what it *looks like*. Neither claims the scientific result is *correct* — that judgment stays with the agent.
|
|
252
357
|
|
|
253
358
|
## Need help?
|
|
254
359
|
NASA staff can ask questions about usage via the documentation-based assistant 'viewtif + viewgeom + viewinline Helper' via the ChatGSFC Agent Marketplace.
|
|
@@ -48,6 +48,17 @@ viewinline hyperspectral.nc --subset 22 --bands 10-54 --gallery 5x11
|
|
|
48
48
|
viewinline path/to/vector.geojson
|
|
49
49
|
viewinline boundaries.geoparquet --color-by population --colormap viridis
|
|
50
50
|
|
|
51
|
+
# Save to file
|
|
52
|
+
viewinline path/to/file.tif --export out.png # save the rendered image as PNG (or .jpg)
|
|
53
|
+
viewinline scene.tif --rgb 4 3 2 --export rgb.png
|
|
54
|
+
viewinline dem.tif --colormap terrain --display 1 --export dem.png # full-res with colormap
|
|
55
|
+
|
|
56
|
+
# Axis and grid overlay
|
|
57
|
+
viewinline path/to/file.tif --grid # ticks + grid in the raster's CRS units (5 divisions)
|
|
58
|
+
viewinline path/to/file.tif --grid 10 # 10 divisions instead of the default 5
|
|
59
|
+
viewinline boundaries.geoparquet --grid # ticks + grid in the vector's CRS units
|
|
60
|
+
viewinline photo.png --grid # pixel positions (no CRS)
|
|
61
|
+
|
|
51
62
|
# CSV and Parquet
|
|
52
63
|
viewinline data.csv # preview rows and columns
|
|
53
64
|
viewinline data.parquet --describe # summary statistics
|
|
@@ -101,6 +112,7 @@ You can also force the chafa path on any terminal by setting `INLINE_VIEWER_ENGI
|
|
|
101
112
|
- **NetCDF/HDF Support:** Display variables from NetCDF (.nc) and HDF5 (.h5, .hdf5) files with automatic nodata detection and multi-slice navigation
|
|
102
113
|
- **Parquet/GeoParquet:** Render GeoParquet as vector maps or view as tabular data
|
|
103
114
|
- **Tabular View for Vectors:** Use `--table` to access CSV-style operations (filter, sort, describe, hist) on any vector file
|
|
115
|
+
- **AI-agent inspection:** `--info` returns file metadata and statistics as JSON; `--export` saves a quick-look image for an agent to inspect. Designed for AI coding-agent workflows.
|
|
104
116
|
|
|
105
117
|
## Supported formats
|
|
106
118
|
**Rasters**
|
|
@@ -147,6 +159,7 @@ You can also force the chafa path on any terminal by setting `INLINE_VIEWER_ENGI
|
|
|
147
159
|
- Variables with 4+ dimensions are not supported
|
|
148
160
|
- For a complete variable list, use `ncdump -h file.nc` or `viewtif`
|
|
149
161
|
|
|
162
|
+
|
|
150
163
|
## Dependencies
|
|
151
164
|
|
|
152
165
|
**Core dependencies** (installed automatically):
|
|
@@ -180,6 +193,9 @@ You can also force the chafa path on any terminal by setting `INLINE_VIEWER_ENGI
|
|
|
180
193
|
```
|
|
181
194
|
General:
|
|
182
195
|
--display DISPLAY Resize only the displayed image (0.5=smaller, 2=bigger). Default: auto-fit to terminal.
|
|
196
|
+
--info Print file metadata and statistics as JSON, then exit (agent-facing). For NetCDF/HDF, lists variables; combine with --subset N to inspect one. Always returns JSON, including on error.
|
|
197
|
+
--export PATH Save the rendered image to PATH (.png/.jpg) and open it. Works with any display flag. Prints {"path": "..."} as the final line.
|
|
198
|
+
--grid [N] Overlay axis ticks and a light grid (N divisions, default 5). Labels are in the file's CRS units (degrees or metres) for georeferenced rasters and vectors; pixel positions for PNG/JPG, NetCDF, and non-georeferenced files.
|
|
183
199
|
|
|
184
200
|
Raster:
|
|
185
201
|
--band BAND Band number to display (single raster), or slice number for NetCDF. (default: 1)
|
|
@@ -216,6 +232,95 @@ CSV and Parquet:
|
|
|
216
232
|
--select COLUMNS Select specific columns (space separated). Example: --select Country City
|
|
217
233
|
--sql QUERY Execute full DuckDB SQL query. Use 'data' as table name. Example: --sql "SELECT * FROM data WHERE Poverty > 40"
|
|
218
234
|
```
|
|
235
|
+
## AI-agent inspection (`--info`, `--export`)
|
|
236
|
+
|
|
237
|
+
An optional command aimed at AI coding-agent workflows (Claude Code, Codex, Cursor, and similar). An agent can confirm its code *ran*, but not whether the geospatial file it produced is *sensible* — wrong CRS, unexpected dimensions, all-NoData, NaN/Inf values, or a flipped output. `--info` answers **"what did I create?"** as machine-readable JSON.
|
|
238
|
+
|
|
239
|
+
```bash
|
|
240
|
+
viewinline result.tif --info # metadata + statistics as JSON, then exit
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
It reports facts, not judgments: format, dimensions, bands, dtype, CRS, resolution, bounds, nodata, and per-band statistics. For NetCDF/HDF it lists variables; add `--subset N` to inspect one:
|
|
244
|
+
|
|
245
|
+
```bash
|
|
246
|
+
viewinline data.nc --info # list variables
|
|
247
|
+
viewinline data.nc --subset 7 --info # inspect variable 7
|
|
248
|
+
viewinline scene.hdf --subset 1 --info # inspect HDF subdataset 1
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
`--info` always returns JSON, including a `{"readable": false, "error": ...}` object on unreadable input, so an agent can always parse the result. Pairs well with `--export` (see Usage) when the agent wants to *see* the output too, not just read its metadata.
|
|
252
|
+
|
|
253
|
+
### `--info` — structured inspection
|
|
254
|
+
|
|
255
|
+
Prints file metadata as JSON and exits (no image is drawn). Reports facts, not judgments — the agent interprets them in context.
|
|
256
|
+
|
|
257
|
+
```bash
|
|
258
|
+
viewinline result.tif --info
|
|
259
|
+
```
|
|
260
|
+
```json
|
|
261
|
+
{
|
|
262
|
+
"format": "GTiff",
|
|
263
|
+
"filename": "result.tif",
|
|
264
|
+
"dimensions": [1001, 1001],
|
|
265
|
+
"bands": 3,
|
|
266
|
+
"dtype": "uint16",
|
|
267
|
+
"crs": "EPSG:32631",
|
|
268
|
+
"resolution": [10.0, 10.0],
|
|
269
|
+
"bounds": [590520.0, 5780620.0, 600530.0, 5790630.0],
|
|
270
|
+
"nodata": null,
|
|
271
|
+
"statistics": {
|
|
272
|
+
"method": "full",
|
|
273
|
+
"bands_total": 3,
|
|
274
|
+
"bands_reported": 3,
|
|
275
|
+
"per_band": [
|
|
276
|
+
{"band": 1, "min": 0.0, "max": 10964.0, "mean": 1009.32, "valid_fraction": 1.0, "naninf_fraction": 0.0}
|
|
277
|
+
]
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
For **NetCDF and HDF**, `--info` lists the file's variables/subdatasets; add `--subset N` to inspect one:
|
|
283
|
+
|
|
284
|
+
```bash
|
|
285
|
+
viewinline data.nc --info # list variables
|
|
286
|
+
viewinline data.nc --subset 7 --info # inspect variable 7 (dims, dtype, units, stats)
|
|
287
|
+
viewinline scene.hdf --subset 1 --info # inspect HDF subdataset 1
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
`--info` **always returns JSON**, including on failure. Unsupported or unreadable inputs return a structured error rather than crashing, so an agent can always parse the result:
|
|
291
|
+
|
|
292
|
+
```json
|
|
293
|
+
{"error": "no directly-readable bands (file has subdatasets)", "readable": false, "subdataset_count": 22}
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
Notes on the output:
|
|
297
|
+
- `crs` is an `EPSG:code` when one can be resolved, the full WKT string when the CRS has no EPSG code (e.g. MODIS Sinusoidal), or `null` when the file has no CRS.
|
|
298
|
+
- Statistics exclude NoData and non-finite pixels; `valid_fraction` and `naninf_fraction` report how much was excluded.
|
|
299
|
+
- For files with many bands, per-band stats are capped (a `bands_reported` < `bands_total` and a `note` indicate truncation — absence of a band's stats does **not** imply a problem).
|
|
300
|
+
- Large rasters are sampled for statistics (`"method": "sampled"`); small ones use every pixel (`"method": "full"`).
|
|
301
|
+
|
|
302
|
+
### `--export` — visual inspection
|
|
303
|
+
|
|
304
|
+
Saves the rendered image to a file (PNG or JPEG, chosen by extension) so an agent can also inspect it with its vision capabilities, then prints the path as JSON:
|
|
305
|
+
|
|
306
|
+
```bash
|
|
307
|
+
viewinline result.tif --export out.png
|
|
308
|
+
```
|
|
309
|
+
```json
|
|
310
|
+
{"path": "/abs/path/out.png"}
|
|
311
|
+
```
|
|
312
|
+
|
|
313
|
+
`--export` works with **any display option** — the saved image is exactly what viewinline would render, after all flags are applied:
|
|
314
|
+
|
|
315
|
+
```bash
|
|
316
|
+
viewinline scene.tif --rgb 4 3 2 --export rgb.png
|
|
317
|
+
viewinline dem.tif --colormap terrain --export dem.png
|
|
318
|
+
viewinline result.tif --display 1 --export full_res.png # full resolution instead of terminal-fit
|
|
319
|
+
```
|
|
320
|
+
|
|
321
|
+
The exported image is a quick-look representation for catching problems metadata can't reveal — blank output, stripes, artifacts, holes, wrong orientation, unexpected extent, or bad color scaling — **not** a publication-quality rendering.
|
|
322
|
+
|
|
323
|
+
> **Scope:** `--info` and `--export` tell you what a file *is* and what it *looks like*. Neither claims the scientific result is *correct* — that judgment stays with the agent.
|
|
219
324
|
|
|
220
325
|
## Need help?
|
|
221
326
|
NASA staff can ask questions about usage via the documentation-based assistant 'viewtif + viewgeom + viewinline Helper' via the ChatGSFC Agent Marketplace.
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
```json
|
|
2
|
+
{
|
|
3
|
+
"$schema": "https://context7.com/schema/context7.json",
|
|
4
|
+
"projectTitle": "viewinline",
|
|
5
|
+
"description": "Terminal inline geospatial preview tool for rasters and vectors over SSH and HPC workflows, with machine-readable --info and --export for AI-agent file inspection.",
|
|
6
|
+
"excludeFolders": [
|
|
7
|
+
"tests",
|
|
8
|
+
"examples/large-data",
|
|
9
|
+
"build",
|
|
10
|
+
"dist"
|
|
11
|
+
],
|
|
12
|
+
"rules": [
|
|
13
|
+
"Prefer SSH and terminal-based workflows in examples.",
|
|
14
|
+
"Use inline terminal image rendering instead of GUI workflows.",
|
|
15
|
+
"Highlight support for GeoTIFF, NetCDF, GeoJSON, and GeoParquet.",
|
|
16
|
+
"Emphasize compatibility limitations for terminal graphics protocols.",
|
|
17
|
+
"For programmatic or AI-agent use, note --info (JSON metadata) and --export (save rendered image)."
|
|
18
|
+
]
|
|
19
|
+
}
|
|
20
|
+
```
|
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
# viewinline
|
|
2
|
+
|
|
3
|
+
> A tiny, non-interactive command-line viewer that displays rasters/photos, vectors, and tabular data (CSV/Parquet) inline in your terminal — no GUI, no X11, no file downloads. Think of it as `ls` for geospatial files: built for quick visual inspection at the command line, not a replacement for QGIS/ArcGIS or analytical workflows. Especially useful on HPC systems and remote servers over SSH, where images render on your *local* terminal. Also provides agent-facing `--info` (metadata as JSON) and `--export` (save the rendered image) for AI coding-agent workflows.
|
|
4
|
+
|
|
5
|
+
- Package: `viewinline` (PyPI: https://pypi.org/project/viewinline/)
|
|
6
|
+
- Repo: https://github.com/nkeikon/inlineviewer
|
|
7
|
+
- Command name: `viewinline`
|
|
8
|
+
- Requires: Python 3.9+
|
|
9
|
+
- License: Apache-2.0 © 2026 Keiko Nomura
|
|
10
|
+
- Latest release: v0.5.0 (2026-10-21)
|
|
11
|
+
- Combines the core display logic of `viewtif` and `viewgeom`, but is **non-interactive**: no zoom/pan/colormap-switching on the fly. Everything is controlled via CLI options (e.g. `--display`, `--color-by`, `--colormap`).
|
|
12
|
+
|
|
13
|
+
## Installation
|
|
14
|
+
|
|
15
|
+
```
|
|
16
|
+
pip install viewinline
|
|
17
|
+
pip install --upgrade viewinline # upgrade
|
|
18
|
+
pip install --upgrade "viewinline[netcdf]" # with hyperspectral/NetCDF extras
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
Optional extras (install only if needed):
|
|
22
|
+
- `duckdb` — required for `--where`, `--sort`, `--select`, `--limit`, `--sql`. `pip install duckdb`
|
|
23
|
+
- `pyarrow` — required for Parquet/GeoParquet. `pip install pyarrow`
|
|
24
|
+
- `h5py` — fallback for HDF5 if GDAL lacks HDF5 support (usually unnecessary). `pip install h5py`
|
|
25
|
+
- `chafa` — system binary (not a Python package); strongly recommended for terminal coverage beyond the native list. See "Terminals".
|
|
26
|
+
|
|
27
|
+
## How display works (rendering engines)
|
|
28
|
+
|
|
29
|
+
- Uses the **iTerm2 inline image protocol (OSC 1337)** natively in supported terminals.
|
|
30
|
+
- Falls back to **`chafa`** elsewhere, which routes through each terminal's best protocol: real high-res images via the kitty graphics protocol or sixel in some terminals, and 24-bit colored block-art (ASCII-art) previews in others.
|
|
31
|
+
- Without `chafa`, terminals outside the native list show an info message instead of an image.
|
|
32
|
+
- Force the chafa path on any terminal with the env var `INLINE_VIEWER_ENGINE=chafa`.
|
|
33
|
+
|
|
34
|
+
## Terminals
|
|
35
|
+
|
|
36
|
+
Native (no extra install, via OSC 1337): iTerm2 (macOS), WezTerm, Konsole (KDE), Rio, Contour.
|
|
37
|
+
|
|
38
|
+
Via `chafa` (recommended for everyone else):
|
|
39
|
+
- Real high-res images (kitty graphics protocol / sixel): kitty, Ghostty, foot.
|
|
40
|
+
- Colored block-art previews (24-bit color): Terminal.app, VS Code, GNOME Terminal, Alacritty, Warp, Hyper, most Linux terminals.
|
|
41
|
+
|
|
42
|
+
Install chafa once (system binary, works across all conda/virtualenv environments):
|
|
43
|
+
```
|
|
44
|
+
brew install chafa # macOS
|
|
45
|
+
sudo apt install chafa # Debian/Ubuntu
|
|
46
|
+
sudo dnf install chafa # Fedora
|
|
47
|
+
scoop install chafa # Windows
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
- **SSH/HPC:** Works over SSH when connecting from a compatible terminal. Images render on the *local* machine, not the remote server. No X11 forwarding or VNC required.
|
|
51
|
+
- **tmux/screen:** Full inline images work inside tmux only when the *outer* terminal is iTerm2 (or WezTerm/Konsole/Rio/Contour). With other outer terminals (kitty, Terminal.app, etc.), viewinline shows ASCII/block-art previews instead.
|
|
52
|
+
- **Windows:** For real images, use Windows Terminal (v1.22+) or WezTerm. Stock PuTTY can show block-art via chafa.
|
|
53
|
+
|
|
54
|
+
### Terminal detection & image-support logic
|
|
55
|
+
|
|
56
|
+
viewinline decides how to render by detecting the terminal, then routing native-OSC-1337 terminals one way and everything else through chafa.
|
|
57
|
+
|
|
58
|
+
Detection checks these environment variables (in order): `TERM_PROGRAM`, `KONSOLE_VERSION`, `KONSOLE_PROFILE_NAME`, `VTE_VERSION`, `TERMINATOR_UUID`, `ALACRITTY_SOCKET`, `WEZTERM_EXECUTABLE`, `ITERM_SESSION_ID`, and `TERM`. If none are set, it falls back to inspecting the parent process name (via `ps`).
|
|
59
|
+
|
|
60
|
+
Override: setting `INLINE_VIEWER_ENGINE=chafa` forces the chafa path on any terminal, bypassing detection.
|
|
61
|
+
|
|
62
|
+
Important nuance — terminals NOT on the native OSC-1337 list still get images via chafa; "not native" does **not** mean "no images." chafa auto-detects the terminal and picks the best output:
|
|
63
|
+
- `xterm-kitty` (kitty) → real images via the kitty graphics protocol
|
|
64
|
+
- foot, Ghostty, and similar → may render real images via sixel or the kitty protocol, depending on chafa's detection
|
|
65
|
+
- most others (Terminal.app, VS Code, GNOME Terminal, Alacritty, Warp, etc.) → Unicode block-art preview with 24-bit color
|
|
66
|
+
|
|
67
|
+
Only terminals **without chafa installed** (and outside the native OSC-1337 set) see no rendering at all — just an info message.
|
|
68
|
+
|
|
69
|
+
Terminals routed through chafa rather than native OSC 1337 (these are the values matched during detection): `Apple_Terminal` (Terminal.app), `xterm-kitty` (kitty), `screen`/`screen-256color`, `tmux`/`tmux-256color` (the `TMUX` env var also signals tmux), `vscode` (VS Code integrated terminal), `alacritty`, `foot`, `ghostty`/`xterm-ghostty`, `WarpTerminal` (Warp), `Hyper`, `unknown`, `cygwin`, `rxvt`/`rxvt-unicode`/`rxvt-unicode-256color`, `st-256color` (suckless st), `gnome-terminal`, `xfce4-terminal`, `lxterminal`, `terminator`, `tilix`, `sakura`, `terminology`, `guake`, `tilda`, `deepin-terminal`, `eterm`, `putty`, and `Windows Terminal`. (Most Linux desktop terminals are VTE-based and lack OSC 1337.) Terminals using native OSC 1337 — iTerm2, WezTerm, Konsole, Rio, Contour — are deliberately absent from this list.
|
|
70
|
+
|
|
71
|
+
## Supported formats
|
|
72
|
+
|
|
73
|
+
Rasters: GeoTIFF (.tif, .tiff); PNG, JPEG (.png, .jpg, .jpeg); NetCDF (.nc); HDF5 (.h5, .hdf5); HDF4 (.hdf, requires GDAL with HDF4 support); single-band or multi-band composites.
|
|
74
|
+
|
|
75
|
+
Vectors: GeoJSON (.geojson), Shapefile (.shp), GeoPackage (.gpkg), Parquet/GeoParquet (.parquet, .geoparquet).
|
|
76
|
+
|
|
77
|
+
Tabular: CSV (.csv), Parquet (.parquet, requires pyarrow). All CSV operations work on Parquet.
|
|
78
|
+
|
|
79
|
+
HDF/NetCDF notes:
|
|
80
|
+
- HDF5 (.h5/.hdf5): via rasterio if GDAL has HDF5 support (most installs).
|
|
81
|
+
- HDF4 (.hdf): requires GDAL compiled with HDF4 support (legacy MODIS / older NASA products).
|
|
82
|
+
- NetCDF (.nc): via rasterio (GDAL's NetCDF driver).
|
|
83
|
+
- viewinline lists only variables displayable as 2D or 3D arrays. 3D variables with time or known spatial dims are auto-handled (sliced along the non-spatial axis). Variables with 4+ dimensions are not supported. For a full variable list, use `ncdump -h file.nc` or `viewtif`.
|
|
84
|
+
|
|
85
|
+
## Usage examples
|
|
86
|
+
|
|
87
|
+
Rasters:
|
|
88
|
+
```
|
|
89
|
+
viewinline path/to/file.tif
|
|
90
|
+
viewinline R.tif G.tif B.tif # RGB composite (also via --rgbfiles)
|
|
91
|
+
viewinline path/to/multiband.tif --rgb 3 2 1
|
|
92
|
+
viewinline path/to/folder --gallery 4x3 # gallery of all images in a folder
|
|
93
|
+
viewinline path/to/hyperspectral.tif --bands 10-50 # gallery of selected bands (also --bands 11,15,30,45)
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
NetCDF / HDF:
|
|
97
|
+
```
|
|
98
|
+
viewinline file.nc # list variables
|
|
99
|
+
viewinline file.nc --subset 2 # display variable 2
|
|
100
|
+
viewinline file.nc --subset 1 --band 10 # variable 1, timestep 10 (--band or --timestep)
|
|
101
|
+
viewinline temp.nc --subset 1 --colormap plasma --vmin 273 --vmax 310
|
|
102
|
+
viewinline hyperspectral.nc --subset 1 --reduce NumberOfScanlines # override auto-detected axis
|
|
103
|
+
viewinline hyperspectral.nc --subset 22 --band 50
|
|
104
|
+
viewinline hyperspectral.nc --subset 22 --bands 10-54 --gallery 5x11
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
Vectors:
|
|
108
|
+
```
|
|
109
|
+
viewinline path/to/vector.geojson
|
|
110
|
+
viewinline boundaries.geoparquet --color-by population --colormap viridis
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
CSV / Parquet:
|
|
114
|
+
```
|
|
115
|
+
viewinline data.csv # preview rows and columns
|
|
116
|
+
viewinline data.parquet --describe # summary statistics
|
|
117
|
+
viewinline data.csv --hist # histograms for all numeric columns
|
|
118
|
+
viewinline data.csv --hist area_km2 # histogram for one column
|
|
119
|
+
viewinline data.csv --scatter X Y # scatter plot
|
|
120
|
+
viewinline data.csv --where "year > 2010" # filter rows (DuckDB)
|
|
121
|
+
viewinline data.csv --sort population --desc # sort rows
|
|
122
|
+
viewinline data.csv --sql "SELECT * FROM data WHERE area > 100 ORDER BY year" # full SQL; table name is 'data'
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
Tabular view of vectors (`--table` unlocks CSV-style ops on any vector file):
|
|
126
|
+
```
|
|
127
|
+
viewinline counties.shp --table
|
|
128
|
+
viewinline counties.shp --table --describe
|
|
129
|
+
viewinline counties.shp --table --unique STATE_NAME
|
|
130
|
+
viewinline data.geoparquet --table --where "POP > 100000" --sort POP --desc
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
## CLI options
|
|
134
|
+
|
|
135
|
+
General:
|
|
136
|
+
- `--display DISPLAY` — resize only the displayed image (0.5 = smaller, 2 = bigger). Default: auto-fit to terminal.
|
|
137
|
+
- `--info` — print file metadata as JSON, then exit (no image drawn). Works with rasters (GeoTIFF, NetCDF, HDF) and vectors (GeoJSON, Shapefile, GeoPackage, GeoParquet). For NetCDF/HDF, lists variables; combine with `--subset N` to inspect one. Always returns JSON, including a `{"readable": false, "error": ...}` object on unreadable input. Aimed at AI coding agents.
|
|
138
|
+
- `--export PATH` — save the rendered image to PATH (`.png`/`.jpg`, chosen by extension) and open it; prints `{"path": "..."}` as the final line. Works with any display flag (`--rgb`, `--colormap`, `--band`, `--display`), saving exactly what viewinline would render. Useful for saving quick-looks and for AI agents inspecting outputs visually.
|
|
139
|
+
- `--grid [N]` — overlay axis ticks and a light grid (N divisions, default 5). Labels are in the file's CRS units (degrees or metres) for georeferenced rasters and vectors; pixel positions for PNG/JPG, NetCDF, and non-georeferenced files. Works with `--export`.
|
|
140
|
+
|
|
141
|
+
Raster:
|
|
142
|
+
- `--band BAND` — band number for a single raster, or slice number for NetCDF (default: 1).
|
|
143
|
+
- `--bands BANDS` — display multiple bands as a grid. Accepts ranges (`30-40`), lists (`3,4,5`), or mixed (`1,5,10-15`).
|
|
144
|
+
- `--rgb R G B` — three band numbers for RGB display (e.g. `--rgb 4 3 2`); overrides default `1 2 3`. Accepts space- or comma-separated values (`--rgb 4 3 2` or `--rgb 4,3,2`).
|
|
145
|
+
- `--rgbfiles R G B` — three single-band rasters for an RGB composite (can also be given as positional args).
|
|
146
|
+
- `--timestep INTEGER` — alias for `--band` with NetCDF files.
|
|
147
|
+
- `--subset INTEGER` — variable index for NetCDF/HDF files (e.g. `--subset 1`).
|
|
148
|
+
- `--reduce DIM_NAME` — for 3D NetCDF variables, choose which dimension is the band/slider axis. Auto-detected if omitted.
|
|
149
|
+
- `--colormap` — apply colormap to single-band rasters; flag with no value → `terrain`.
|
|
150
|
+
- `--vmin VMIN` / `--vmax VMAX` — pixel value range for display scaling (each works independently).
|
|
151
|
+
- `--nodata NODATA` — override nodata value when dataset metadata is missing/incorrect.
|
|
152
|
+
- `--gallery [GRID]` — display all PNG/JPG/TIF images in a folder as thumbnails (e.g. `5x5`).
|
|
153
|
+
|
|
154
|
+
Vector:
|
|
155
|
+
- `--color-by COLUMN` — color features by a column.
|
|
156
|
+
- `--colormap` — apply colormap to vector coloring; flag with no value → `terrain`.
|
|
157
|
+
- `--width WIDTH` — line width for vector boundaries (default: 0.7).
|
|
158
|
+
- `--edgecolor COLOR` — edge color for outlines, hex or named (default: white).
|
|
159
|
+
- `--layer LAYER` — layer name for GeoPackage/multi-layer files, or variable name for NetCDF.
|
|
160
|
+
- `--table` — display a vector/parquet file as tabular data instead of rendering geometry.
|
|
161
|
+
|
|
162
|
+
CSV / Parquet:
|
|
163
|
+
- `--describe [COLUMN]` — summary statistics for all numeric columns or one named column.
|
|
164
|
+
- `--hist [COLUMN]` — histograms for all numeric columns or one named column.
|
|
165
|
+
- `--bins BINS` — number of histogram bins (with `--hist`; default: 20).
|
|
166
|
+
- `--scatter X Y` — scatter plot of two numeric columns.
|
|
167
|
+
- `--unique COLUMN` — unique values for a categorical column.
|
|
168
|
+
- `--where EXPR` — filter rows with a SQL WHERE clause (DuckDB). Example: `--where "year > 2010"`.
|
|
169
|
+
- `--sort COLUMN` — sort by column (ascending by default; use `--desc`).
|
|
170
|
+
- `--desc` — descending sort (with `--sort`).
|
|
171
|
+
- `--limit N` — limit number of rows shown.
|
|
172
|
+
- `--select COLUMNS` — select specific columns, space-separated. Example: `--select Country City`.
|
|
173
|
+
- `--sql QUERY` — full DuckDB SQL query; use `data` as the table name. Example: `--sql "SELECT * FROM data WHERE Poverty > 40"`.
|
|
174
|
+
|
|
175
|
+
Help text is grouped into sections: General, Raster, Vector, and Tabular.
|
|
176
|
+
|
|
177
|
+
## AI-agent inspection (`--info`, `--export`)
|
|
178
|
+
|
|
179
|
+
Two commands for AI coding-agent workflows (Claude Code, Codex, Cursor, and similar): an agent can confirm its code *ran* but not whether the geospatial file it produced is *sensible* (wrong CRS, unexpected dimensions, all-NoData, NaN/Inf values, flipped output). These answer "what did I create?" and "what does it look like?" as machine-readable JSON. Both are deterministic and local — no LLM dependency, no external API calls.
|
|
180
|
+
|
|
181
|
+
`--info` reports facts, not judgments, choosing fields per format:
|
|
182
|
+
- Rasters (GeoTIFF, NetCDF, HDF): format, dimensions, bands, dtype, CRS, resolution, bounds, nodata, per-band statistics (min/max/mean, valid_fraction, naninf_fraction).
|
|
183
|
+
- Vectors (GeoJSON, Shapefile, GeoPackage, GeoParquet): feature count, geometry type, CRS, bounds, columns.
|
|
184
|
+
|
|
185
|
+
viewinline result.tif --info # raster metadata + stats as JSON
|
|
186
|
+
viewinline boundaries.geojson --info # vector: features, geometry, CRS, columns
|
|
187
|
+
viewinline data.nc --info # list NetCDF variables
|
|
188
|
+
viewinline data.nc --subset 7 --info # inspect variable 7 (dims, dtype, units, stats)
|
|
189
|
+
viewinline scene.hdf --subset 1 --info # inspect HDF subdataset 1
|
|
190
|
+
|
|
191
|
+
Output notes:
|
|
192
|
+
- `crs` is an `EPSG:code` when one can be resolved, WKT when the CRS has no EPSG code (e.g. MODIS Sinusoidal), or `null` when absent.
|
|
193
|
+
- Statistics exclude NoData and non-finite pixels; large rasters are sampled (`"method": "sampled"`), small ones read in full (`"method": "full"`).
|
|
194
|
+
- Files with many bands report a capped subset (`bands_reported` < `bands_total`, plus a `note`); missing per-band stats do not imply a problem.
|
|
195
|
+
- Errors return structured JSON (`{"readable": false, "error": ...}`) rather than crashing, so callers can always parse the result.
|
|
196
|
+
|
|
197
|
+
`--export` saves what viewinline would render to PNG/JPEG and prints `{"path": "..."}`:
|
|
198
|
+
viewinline result.tif --export out.png
|
|
199
|
+
viewinline scene.tif --rgb 4 3 2 --export rgb.png
|
|
200
|
+
viewinline dem.tif --colormap terrain --display 1 --export dem.png # full-res with colormap
|
|
201
|
+
|
|
202
|
+
Neither command claims the scientific result is *correct* — that judgment stays with the agent.
|
|
203
|
+
|
|
204
|
+
## Behavior notes (current)
|
|
205
|
+
|
|
206
|
+
- Multi-band rasters (multispectral, hyperspectral, embeddings) are NOT auto-composited as RGB. Band 1 is shown in grayscale by default (consistent with NetCDF). Use `--rgb` to composite explicitly. `--band N` shows any single band N (including band 1).
|
|
207
|
+
- `--gallery` silently skips incompatible/non-image files instead of failing the whole run.
|
|
208
|
+
- In chafa/ASCII terminals, band labels and gallery filenames are printed as a text grid *after* the image (labels drawn on the canvas are unreadable there), so you can tell tiles/files apart.
|
|
209
|
+
- `--bands` tiles are labeled with their band number; default colormap for `--bands` is viridis (override with `--colormap`). Works with GeoTIFF and NetCDF.
|
|
210
|
+
- For large CSV or filtered results, viewinline prompts `Show first N or all? [first/all]`.
|
|
211
|
+
- `--vmin` and `--vmax` are independent — setting only one no longer falls back to auto-scaling on both ends.
|
|
212
|
+
|
|
213
|
+
## Hyperspectral / non-standard NetCDF
|
|
214
|
+
|
|
215
|
+
viewinline can open NetCDF files that organize variables under hierarchical groups (e.g. `/radiometric_data/CalibratedRadianceData`), use non-standard dimension names (`NumberOfChannels`, `NumberOfScanlines`, etc.), or have malformed CF attributes (e.g. per-band `scale_factor` arrays that xarray's default decoding can't handle).
|
|
216
|
+
|
|
217
|
+
Band-axis detection for 3D variables is tiered: user override (`--reduce`) → standard convention (lat/lon detected) → smallest-dimension fallback. If auto-detection picks the wrong axis, set it explicitly:
|
|
218
|
+
```
|
|
219
|
+
viewinline PICARDL1B.nc --subset 22 --band 50
|
|
220
|
+
viewinline file.nc --subset 1 --reduce DIM_NAME
|
|
221
|
+
```
|
|
222
|
+
Tested on NASA PICARD L1B; the same pattern should apply to AVIRIS, EMIT, and similar instruments.
|
|
223
|
+
|
|
224
|
+
## Dependencies
|
|
225
|
+
|
|
226
|
+
Core (installed automatically): `rasterio` (raster reading, includes GDAL), `geopandas` + `pyogrio` (vector reading), `matplotlib` (vector rendering), `Pillow` (image encoding), `numpy`, `pandas`.
|
|
227
|
+
|
|
228
|
+
Optional: `chafa` (terminal coverage; system binary), `duckdb` (filter/sort/SQL), `pyarrow` (Parquet/GeoParquet), `h5py` (HDF5 fallback).
|
|
229
|
+
|
|
230
|
+
## Version history (selected)
|
|
231
|
+
|
|
232
|
+
- **v0.3.2 (2026-06-06):** Band labels and gallery filenames shown as a text grid after the image in chafa/ASCII terminals; `--gallery NxM` now works with `--bands` for NetCDF; `--rgb` works with NetCDF when used with `--subset`; `--vmin`/`--vmax` work independently; `--rgb` accepts comma-separated values; help text grouped into sections; large-CSV prompt changed to `Show first N or all? [first/all]`.
|
|
233
|
+
- **v0.3.1 (2026-06-02):** New `--bands` flag (gallery grid of multiple bands; ranges/lists/mixed; per-tile band-number labels; viridis default); `--gallery` now silently skips incompatible files; multi-band rasters no longer auto-composite as RGB (band 1 grayscale by default — use `--rgb`).
|
|
234
|
+
- **v0.3.0 (2026-05-15):** Hyperspectral NetCDF support (hierarchical groups, non-standard dimension names, malformed CF attributes); new `--reduce` flag; tiered dimension detection; fixed `--band 1` being overridden by RGB auto-composite on multi-band TIFFs; consistent `(downsampled)` label; `[netcdf]` install extra.
|
|
235
|
+
- **v0.2.3 (2026-05-13):** Broad terminal support via chafa (real high-res on kitty/foot; block-art elsewhere); fixed Apple_Terminal / `xterm-kitty` misdetection; reliable block-art inside tmux. chafa fallback contributed by @filipkral.
|
|
236
|
+
- **v0.2.2 (2026-04-22):** Added Zenodo DOI for citation.
|
|
237
|
+
- **v0.2.1 (2026-02-21):** NetCDF/HDF support (`--subset`, `--band`/`--timestep`, auto nodata, HDF4 via GDAL); Parquet/GeoParquet; `--table` for vectors; `--rgb 3 2 1` syntax + `--rgbfiles`; auto edge-color removal when coloring by column.
|
|
238
|
+
- **v0.2.0 (2026-02-17):** Inline-only display (OSC 1337); removed ANSI fallback and /tmp save; DuckDB integration for `--where`/`--sort`/`--select`/`--limit`/`--sql`; license switched MIT → Apache-2.0.
|
|
239
|
+
- **v0.1.5 (2026-02-13):** Fixed duplicate band-display prints; optimized uint8 normalization; minor perf.
|
|
240
|
+
- **v0.4.0 (2026-08-23):** New agent-facing inspection commands: `--info` (file metadata + statistics as JSON, for rasters and vectors; lists variables for NetCDF/HDF with `--subset`; always returns JSON including structured errors) and `--export` (save the rendered image to PNG/JPEG, works with any display flag). Existing viewer behavior unchanged.
|
|
241
|
+
- **v0.5.0 (2026-10-21):** New `--grid [N]` flag: axis ticks and a light grid overlay. Georeferenced rasters and vectors are labelled in real CRS coordinates; photos, NetCDF, and non-georeferenced files in pixel positions. Grid contributed by @luismanriqueruiz.
|
|
242
|
+
|
|
243
|
+
## Support & links
|
|
244
|
+
|
|
245
|
+
- NASA staff can ask usage questions via the documentation-based assistant "viewtif + viewgeom + viewinline Helper" in the ChatGSFC Agent Marketplace.
|
|
246
|
+
- YouTube demo playlist: https://www.youtube.com/playlist?list=PLP9MNCMgJIHj6FvahJ6Tembp1rCyhLtR4
|
|
247
|
+
- Releases: https://github.com/nkeikon/inlineviewer/releases
|