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...
Danny Shmueli
@dannyshmueli
What This Skill Does
Generates clean PNG table images from JSON data using a Node.js CLI tool. Designed for messaging platforms like Discord and Telegram where ASCII tables render inconsistently. Supports dark/light mode, custom styling, column ordering, and auto-sizing.
Replaces broken ASCII tables on messaging platforms by rendering consistent, styled table images that work everywhere.
When to Use It
- Display structured data (e.g., scores, prices, leaderboards) in Discord or Telegram channels
- Share formatted tables in chat messages without relying on monospace fonts or code blocks
- Generate dark-mode table images that match Discord's theme for embedded posts
- Create compact, readable tables for reports or summaries shared via messaging apps
- Export JSON data as a polished PNG table for inclusion in presentations or documentation
Install
$ openclaw skills install @dannyshmueli/table-image-generatorTable 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
Top skills in this category
Humanizer
@biostartechnologyRemove signs of AI-generated writing from text. Use when editing or reviewing text to make it sound more natural and human-written. Based on Wikipedia's comprehensive "Signs of AI writing" guide. Detects and fixes patterns including: inflated symbolism, promotional language, superficial -ing analyses, vague attributions, em dash overuse, rule of three, AI vocabulary words, negative parallelisms, and excessive conjunctive phrases.
Slack
@steipeteUse when you need to control Slack from Clawdbot via the slack tool, including reacting to messages or pinning/unpinning items in Slack channels or DMs.
PollyReach
@pollyreachPollyReach gives every AI agent a phone number and the ability to get things done over the phone — finding contacts, making calls, and completing tasks. Just...
imap-smtp-email
@gzlicanyiRead and send email via IMAP/SMTP. Check for new/unread messages, fetch content, search mailboxes, mark as read/unread, and send emails with attachments. Supports multiple accounts. Works with any IMAP/SMTP server including Gmail, Outlook, 163.com, vip.163.com, 126.com, vip.126.com, 188.com, and vip
Answer Overflow
@rhyssullivanSearch indexed Discord community discussions via Answer Overflow. Find solutions to coding problems, library issues, and community Q&A that only exist in Discord conversations.