# Paint

> Generate color palettes, gradients, and textures. Use when creating harmonized palettes, previewing schemes, converting color spaces, making patterns.

- Skill: `bytesagain/paint` (Agent Skill, multi-file: 2 files)
- Install (CLI): `npx skillmds@latest add bytesagain/paint`
- Raw SKILL.md: https://api.skillmd.com/api/skills/bytesagain/paint/raw
- Safety review: pending (external: skill-scanner PASS, skillspector PASS)
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- License: MIT-0
- Author: bytesagain (https://skillmd.com/u/bytesagain)
- Updated: 2026-09-09
- Page: https://skillmd.com/skills/bytesagain/paint

---


# Paint

A design toolkit for managing color palettes, gradients, swatches, and design assets. Each command category maintains its own timestamped log file, so you can organize design entries by purpose — palettes, previews, color conversions, harmonies, contrasts, gradients, swatches, and more. Includes built-in statistics, multi-format export, full-text search, and activity history.

All operations are logged with timestamps and stored locally in flat files for easy inspection and portability.

## Commands

| Command | Description |
|---------|-------------|
| `paint palette <text>` | Record a palette entry (or show recent palettes with no args) |
| `paint preview <text>` | Log a design preview note |
| `paint generate <text>` | Record a generated design asset or color scheme |
| `paint convert <text>` | Log a color space conversion (e.g., HEX to RGB) |
| `paint harmonize <text>` | Record a color harmony analysis |
| `paint contrast <text>` | Log a contrast check or accessibility evaluation |
| `paint export <text>` | Record an export operation or design asset output |
| `paint random <text>` | Log a randomly generated color or pattern |
| `paint browse <text>` | Record a browsed design reference or inspiration |
| `paint mix <text>` | Log a color mixing operation |
| `paint gradient <text>` | Record a gradient definition or transition |
| `paint swatch <text>` | Log a swatch entry or named color sample |
| `paint stats` | Show summary statistics across all categories |
| `paint search <term>` | Full-text search across all log files |
| `paint recent` | Show the 20 most recent activity entries |
| `paint status` | Health check — version, data dir, entry counts, disk usage |
| `paint help` | Show the built-in help message |
| `paint version` | Print the current version |

### How Entry Commands Work

Every entry command (`palette`, `preview`, `generate`, `convert`, `harmonize`, `contrast`, `export`, `random`, `browse`, `mix`, `gradient`, `swatch`) follows the same pattern:

- **With arguments:** Appends a timestamped entry (`YYYY-MM-DD HH:MM|<text>`) to the corresponding `.log` file and shows the new total count
- **Without arguments:** Shows the 20 most recent entries from that category's log file

## Data Storage

All data is stored in `~/.local/share/paint/` by default.

Files created in the data directory:

- **`palette.log`**, **`preview.log`**, **`generate.log`**, **`convert.log`**, **`harmonize.log`**, **`contrast.log`**, **`export.log`**, **`random.log`**, **`browse.log`**, **`mix.log`**, **`gradient.log`**, **`swatch.log`** — One log file per command category, each containing timestamped entries in `YYYY-MM-DD HH:MM|<text>` format
- **`history.log`** — Audit trail of every command executed with timestamps
- **`export.json`** / **`export.csv`** / **`export.txt`** — Generated by the stats/export functions

### Export Formats (via internal `_export` function)

- **json** — Array of objects with `type`, `time`, and `value` fields
- **csv** — Header row (`type,time,value`) followed by data rows
- **txt** — Human-readable sections grouped by category

## Requirements

- **bash** 4.0 or later (uses `set -euo pipefail`, `local` variables)
- **grep** — used by the `search` command for case-insensitive matching
- **Standard POSIX utilities** — `date`, `cat`, `echo`, `mkdir`, `wc`, `du`, `head`, `tail`, `basename`
- No external API keys or network access required
- No Python or Node.js dependencies

## When to Use

1. **Building a color palette library** — Use `palette` to log color combinations as you discover or create them, then `search` to find specific palettes later
2. **Tracking design iterations** — Use `preview` and `generate` to record design experiments, then `recent` to review your latest work
3. **Color space documentation** — Use `convert` to log color conversions (HEX → RGB → HSL) for reference in design systems or style guides
4. **Accessibility audits** — Use `contrast` to document contrast ratio checks between foreground and background colors for WCAG compliance
5. **Gradient and swatch management** — Use `gradient` and `swatch` to maintain a library of reusable color transitions and named color samples

## Examples

```bash
# Record a new palette
paint palette "Sunset: #FF6B35, #F7931E, #FCB040, #FDD835"
#=> [Paint] palette: Sunset: #FF6B35, #F7931E, #FCB040, #FDD835
#=> Saved. Total palette entries: 1

# Log a color conversion
paint convert "Brand blue: #2196F3 → rgb(33,150,243) → hsl(207,90%,54%)"
#=> [Paint] convert: Brand blue: #2196F3 → rgb(33,150,243) → hsl(207,90%,54%)
#=> Saved. Total convert entries: 1

# Record a gradient
paint gradient "Hero section: linear-gradient(135deg, #667eea 0%, #764ba2 100%)"
#=> [Paint] gradient: Hero section: linear-gradient(135deg, #667eea 0%, #764ba2 100%)
#=> Saved. Total gradient entries: 1

# Check a contrast ratio
paint contrast "White #FFF on brand blue #2196F3: ratio 3.2:1 — fails AA for body text"
#=> [Paint] contrast: White #FFF on brand blue #2196F3: ratio 3.2:1 — fails AA for body text
#=> Saved. Total contrast entries: 1

# View statistics across all categories
paint stats
#=> === Paint Stats ===
#=>   palette: 1 entries
#=>   convert: 1 entries
#=>   gradient: 1 entries
#=>   contrast: 1 entries
#=>   ---
#=>   Total: 4 entries
#=>   Data size: 4.0K

# Search across all logs
paint search "blue"
#=> Searching for: blue
#=>   --- convert ---
#=>     2025-03-18 14:30|Brand blue: #2196F3 → rgb(33,150,243)
```

## Configuration

The data directory is hardcoded to `~/.local/share/paint/`. To use a custom location, modify the `DATA_DIR` variable in the script.

## How It Works

1. On every invocation, the tool ensures the data directory exists (`mkdir -p`)
2. The first argument selects the command via a `case` dispatch
3. Entry commands append a pipe-delimited line (`timestamp|text`) to their category-specific log file
4. Every command also appends to `history.log` for auditing
5. `stats` iterates over all `.log` files to produce aggregate counts
6. `search` uses `grep -i` across all log files for case-insensitive matching
7. All output goes to stdout for easy piping and redirection

---

Powered by BytesAgain | bytesagain.com | hello@bytesagain.com

