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
OpenClaw
Benign
medium confidencePurpose & 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 ziplatest
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
| Option | Description | Default |
|---|---|---|
--data | JSON array of row objects | required |
--output | Output file path | table.png |
--title | Table title | none |
--dark | Dark mode (Discord-friendly) | false |
--columns | Column order/subset (comma-separated) | all keys |
--headers | Custom header names (comma-separated) | field names |
--max-width | Maximum table width | 800 |
--font-size | Font size in pixels | 14 |
--header-color | Header background color | #e63946 |
--stripe | Alternating row colors | true |
--align | Column alignments (l,r,c comma-sep) | auto |
--compact | Reduce padding | false |
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
- Use
--darkfor Discord - Matches the dark theme, looks native - Auto-alignment - Numbers are right-aligned by default
- Column order - Use
--columnsto reorder or subset - 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 totalSelect a file
Select a file to preview.
Comments
Loading comments…
