ZenTable Skill
name: zentable
by con2000us · published 2026-03-22
$ claw add gh:con2000us/con2000us-zentable---
name: zentable
description: "Render structured table data as high-quality PNG images using Headless Chrome. Use when: need to visualize tabular data for chat interfaces, reports, or social media. NOT for: simple text tables that don't need visualization."
homepage: https://github.com/con2000us/zenTable
metadata:
openclaw:
emoji: "📊"
requires:
bins: ["python3", "google-chrome"]
allowed-tools: ["exec", "read", "write"]
---
# ZenTable Skill
Render structured table data into high-quality PNG images.
TL;DR
ZenTable turns messy table-like content into readable, decision-ready table outputs for both mobile (Discord-first) and desktop.
**Accepted inputs**
**Core capabilities**
Runtime & security note
This skill runs local scripts and depends on local runtime binaries (`python3`, `google-chrome`).
Review code and dependencies before running in sensitive environments.
Naming convention
When to use
✅ Use this skill when:
❌ Do not use this skill when:
Capability matrix (SkillHub release)
| Capability | Status | Notes |
|---|---|---|
| CSS output | ✅ Stable | Primary release path; default `minimal_ios_mobile + width=450` |
| PIL output | ✅ Stable | Safe fallback when Chrome is unavailable |
| ASCII output | ⚠️ Beta / Experimental | Works, but alignment can drift cross-platform due to font and whitespace behavior |
Known limitations
Zx shorthand policy (project rule)
When user input is `Zx`, treat it as a strong render intent:
1. Execute rendering directly by default (no preliminary Q&A).
2. Default path: CSS + `minimal_ios_mobile` + `width=450`.
3. Ask follow-up only under high uncertainty:
- no usable source data in current/previous context,
- intent does not look like table rendering,
- critical fields are missing and output would likely be wrong.
4. If platform supports images, return the image directly (not link-only).
Data source priority for `Zx`:
1) current message image OCR
2) current message text-to-table
3) previous message image OCR
4) previous message text-to-table
Syntax sugar → canonical mapping
| Sugar | Canonical key | Normalization | Final renderer args |
|---|---|---|---|
| `--width N` / `--w N` | `width` | positive int | `--width N` |
| `--transpose` / `--cc` | `transpose` | boolean | `--transpose` |
| `--tt` | `keep_theme_alpha` | boolean | `--tt` |
| `--per-page N` / `--pp N` | `per_page` | positive int | `--per-page N` |
| `--page ...` / `--p ...` | `page_spec` | `N` / `A-B` / `A-` / `all` | expanded by `table_renderer.py` |
| `--all` | `page_spec` | equivalent to `all` | expanded by `table_renderer.py` |
| `--text-scale V` / `--ts V` | `text_scale` | enum/ratio | `--text-scale V` |
| `--sort SPEC` | `sort_spec` | single/multi-key | `--sort SPEC` |
| `--asc` / `--desc` | `sort_default_dir` | default direction | `--asc` / `--desc` |
| `--f SPEC` / `--filter SPEC` | `filters` | repeatable filter | `--f SPEC` |
| `--smart-wrap` | `smart_wrap` | true | `--smart-wrap` |
| `--no-smart-wrap` / `--nosw` | `smart_wrap` | false | `--no-smart-wrap` |
| `--theme NAME` / `-t NAME` | `theme` | theme id | `--theme NAME` |
| `--both` / `--bo` | `output_both` | boolean | `--both` |
| `--pin KEYS` | `pin_keys` | persist defaults | `--pin` |
| `--pin-reset` | `pin_reset` | reset pinned defaults | `--pin-reset` |
Pinned default baseline:
`page_spec` rules
Canonical payload example
{
"theme": "minimal_ios_mobile",
"width": 900,
"transpose": false,
"keep_theme_alpha": false,
"per_page": 15,
"page_spec": "2-",
"sort_spec": "score:desc,name:asc",
"sort_default_dir": "asc",
"filters": ["col:!note,attachment", "row:status!=disabled;score>=60"],
"text_scale": "auto",
"smart_wrap": true,
"output_both": false
}Command examples
# run from repository root
# basic CSS output
python3 skills/zentable/table_renderer.py - /tmp/out.png --theme minimal_ios_mobile --width 900 --text-scale large --page 1
# transpose + disable smart wrap
python3 skills/zentable/table_renderer.py - /tmp/out.png --theme compact_clean --transpose --no-smart-wrap --page 1
# page range expansion (2-4)
python3 skills/zentable/table_renderer.py - /tmp/out.p2.png --per-page 12 --page 2
python3 skills/zentable/table_renderer.py - /tmp/out.p3.png --per-page 12 --page 3
python3 skills/zentable/table_renderer.py - /tmp/out.p4.png --per-page 12 --page 4
# PNG + ASCII side output
python3 skills/zentable/table_renderer.py - /tmp/out.png --theme mobile_chat --bothValidation checklist (minimum)
Release positioning
Current channel: **beta**.
ASCII remains **beta/experimental** for SkillHub release.
Support / Contact
- input type (text / screenshot / photo / json)
- expected vs actual output
- platform (Discord/mobile/desktop)
- command/options used
More tools from the same signal band
Order food/drinks (点餐) on an Android device paired as an OpenClaw node. Uses in-app menu and cart; add goods, view cart, submit order (demo, no real payment).
Sign plugins, rotate agent credentials without losing identity, and publicly attest to plugin behavior with verifiable claims and authenticated transfers.
The philosophical layer for AI agents. Maps behavior to Spinoza's 48 affects, calculates persistence scores, and generates geometric self-reports. Give your...