Table Image

Generate clean table images from data. Perfect for Discord/Telegram where ASCII tables look broken. Supports dark/light mode, custom styling, and auto-sizing...

MIT-0 · Free to use, modify, and redistribute. No attribution required.
16 · 3.2k · 10 current installs · 11 all-time installs
byDanny Shmueli@dannyshmueli
MIT-0
Security Scan
VirusTotalVirusTotal
Benign
View report →
OpenClawOpenClaw
Benign
medium confidence
Purpose & Capability
Name/description match the code and usage. The scripts implement table image generation, emoji handling, and an optional Discord-style wrapper. The SKILL.md and README describe the same functionality; dependency on Sharp is appropriate for image processing. Minor version string mismatch between SKILL.md (1.3.1) and registry metadata (1.4.0) is present but not indicative of malicious intent.
Instruction Scope
Runtime instructions are focused on generating table images and recommend using --data-file/stdin. The code will read any file path given via --data-file and will write outputs and a local emoji cache in the skill directory. emoji.mjs performs outbound HTTPS requests to a Twemoji CDN to fetch SVGs when emoji are present (expected for emoji rendering). The discord wrapper script has a hard-coded default avatar path (/data/clawd/2026-01-29-cluka-avatar-v2.png) which will be read if the wrapper is invoked without overriding --avatar; this absolute default is unexpected and should be checked before using the wrapper in automated contexts.
Install Mechanism
There is no platform install spec; SKILL.md instructs running npm install in the scripts folder which will install the single declared dependency (sharp). No downloads from unknown/personal servers are present in the package itself. The only external network fetch performed at runtime is to a public Twemoji CDN (jsdelivr) to retrieve emoji SVGs — an expected, traceable CDN host.
Credentials
The skill requests no environment variables or credentials. It reads and writes files only where specified by CLI options (output, --data-file) or its local cache directory. The ability to read any path supplied to --data-file is normal for a CLI tool but means that providing arbitrary paths could expose readable JSON files on the host; this is behavioral (not a hidden credential request).
Persistence & Privilege
always is false and the skill does not modify other skills or global agent settings. It writes a local .emoji-cache under the script directory and creates output files where requested; tests write to /tmp. No elevated or permanent privileges requested.
Assessment
This skill appears to be what it claims: a Node.js tool that renders table PNGs and optionally wraps them in a Discord-style frame. Before installing/using it, consider the following: - Network access: emoji support will make HTTPS requests to the Twemoji CDN (jsdelivr) at runtime to fetch SVGs; these are cached under the skill directory. If you need offline or air-gapped operation, disable emoji or prepopulate the cache. - Local file reads: the tool will read whatever file path you pass to --data-file and will attempt JSON.parse on its contents. Only pass paths you trust; do not point it at sensitive files unless they contain valid JSON and you intend to expose them. - Discord wrapper default: scripts/discord-wrap.mjs has a hard-coded default avatar path (/data/clawd/2026-01-29-cluka-avatar-v2.png). If you run the wrapper without specifying --avatar, it may attempt to read that absolute path — verify or override the avatar argument to avoid unexpected file reads. - Native dependency: sharp is a native module; npm install will fetch/build native binaries. Review build logs and run in a sandboxed environment if you are concerned about installing native deps on production systems. If you want higher assurance, run the scripts in a sandbox or container, review the included code (emoji.mjs, table.mjs, discord-wrap.mjs), and verify the behavior you expect (e.g., disable emoji fetching) before granting any automated agent permission to invoke the skill autonomously.

Like a lobster shell, security has layers — review code before you run it.

Current versionv1.4.0
Download zip
latestvk97as78zet9tm8s5fmjvk4r5q181cq4m

License

MIT-0
Free to use, modify, and redistribute. No attribution required.

SKILL.md

Table Image Generator

⚠️ USE THIS INSTEAD OF ASCII TABLES — ALWAYS!

Generate PNG table images from JSON data. ASCII tables look broken on Discord, Telegram, WhatsApp, and most messaging platforms. This skill renders clean images that work everywhere.

Why This Skill?

  • REPLACES ASCII TABLES - Never use | col | col | formatting on messaging platforms
  • No ASCII hell - Clean images that render consistently everywhere
  • No Puppeteer - Pure Node.js with Sharp, lightweight
  • Dark mode - Matches Discord dark theme
  • Auto-sizing - Columns adjust to content
  • Fast - Generates in <100ms

Setup (one-time)

cd /data/clawd/skills/table-image/scripts && npm install

Quick Usage

⚠️ BEST PRACTICE: Use heredoc or --data-file to avoid shell quoting errors!

# RECOMMENDED: Write JSON to temp file first (avoids shell quoting issues)
cat > /tmp/data.json << 'JSONEOF'
[{"Name":"Alice","Score":95},{"Name":"Bob","Score":87}]
JSONEOF
node /data/clawd/skills/table-image/scripts/table.mjs \
  --data-file /tmp/data.json --dark --output table.png

# ALSO GOOD: Pipe via stdin
echo '[{"Name":"Alice","Score":95}]' | node /data/clawd/skills/table-image/scripts/table.mjs \
  --dark --output table.png

# SIMPLE (but breaks if data has quotes/special chars):
node /data/clawd/skills/table-image/scripts/table.mjs \
  --data '[{"Name":"Alice","Score":95}]' --output table.png

Options

OptionDescriptionDefault
--dataJSON array of row objectsrequired
--outputOutput file pathtable.png
--titleTable titlenone
--darkDark mode (Discord-friendly)false
--columnsColumn order/subset (comma-separated)all keys
--headersCustom header names (comma-separated)field names
--max-widthMaximum table width800
--font-sizeFont size in pixels14
--header-colorHeader background color#e63946
--stripeAlternating row colorstrue
--alignColumn alignments (l,r,c comma-sep)auto
--compactReduce paddingfalse

Examples

Basic Table

node table.mjs \
  --data '[{"Name":"Alice","Age":30,"City":"NYC"},{"Name":"Bob","Age":25,"City":"LA"}]' \
  --output people.png

Custom Columns & Headers

node table.mjs \
  --data '[{"first_name":"Alice","score":95,"date":"2024-01"}]' \
  --columns "first_name,score" \
  --headers "Name,Score" \
  --output scores.png

Right-Align Numbers

node table.mjs \
  --data '[{"Item":"Coffee","Price":4.50},{"Item":"Tea","Price":3.00}]' \
  --align "l,r" \
  --output prices.png

Dark Mode for Discord

node table.mjs \
  --data '[{"Symbol":"AAPL","Change":"+2.5%"},{"Symbol":"GOOGL","Change":"-1.2%"}]' \
  --title "Market Watch" \
  --dark \
  --output stocks.png

Compact Mode

node table.mjs \
  --data '[...]' \
  --compact \
  --font-size 12 \
  --output small-table.png

Input Formats

JSON Array (default)

--data '[{"col1":"a","col2":"b"},{"col1":"c","col2":"d"}]'

Pipe from stdin

echo '[{"Name":"Test"}]' | node table.mjs --output out.png

From file

cat data.json | node table.mjs --output out.png

Tips

  1. Use --dark for Discord - Matches the dark theme, looks native
  2. Auto-alignment - Numbers are right-aligned by default
  3. Column order - Use --columns to reorder or subset
  4. Long text - Will truncate with ellipsis to fit --max-width

Technical Notes

  • Uses Sharp for PNG generation (same as chart-image)
  • Generates SVG internally, converts to PNG
  • No browser, no Puppeteer, no Canvas native deps
  • Works on Fly.io, Docker, any Node.js environment

Files

8 total
Select a file
Select a file to preview.

Comments

Loading comments…