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
- Building a color palette library — Use
palette to log color combinations as you discover or create them, then search to find specific palettes later
- Tracking design iterations — Use
preview and generate to record design experiments, then recent to review your latest work
- Color space documentation — Use
convert to log color conversions (HEX → RGB → HSL) for reference in design systems or style guides
- Accessibility audits — Use
contrast to document contrast ratio checks between foreground and background colors for WCAG compliance
- Gradient and swatch management — Use
gradient and swatch to maintain a library of reusable color transitions and named color samples
Examples
# 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
- On every invocation, the tool ensures the data directory exists (
mkdir -p)
- The first argument selects the command via a
case dispatch
- Entry commands append a pipe-delimited line (
timestamp|text) to their category-specific log file
- Every command also appends to
history.log for auditing
stats iterates over all .log files to produce aggregate counts
search uses grep -i across all log files for case-insensitive matching
- All output goes to stdout for easy piping and redirection
Powered by BytesAgain | bytesagain.com | hello@bytesagain.com
1---2name: paint3description: Generate color palettes, gradients, and textures. Use when creating harmonized palettes, previewing schemes, converting color spaces, making patterns.4license: MIT-05---6
7# Paint
8
9A 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.
10
11All operations are logged with timestamps and stored locally in flat files for easy inspection and portability.
12
13## Commands
14
15| Command | Description |
16|---------|-------------|
17| `paint palette <text>` | Record a palette entry (or show recent palettes with no args) |
18| `paint preview <text>` | Log a design preview note |
19| `paint generate <text>` | Record a generated design asset or color scheme |
20| `paint convert <text>` | Log a color space conversion (e.g., HEX to RGB) |
21| `paint harmonize <text>` | Record a color harmony analysis |
22| `paint contrast <text>` | Log a contrast check or accessibility evaluation |
23| `paint export <text>` | Record an export operation or design asset output |
24| `paint random <text>` | Log a randomly generated color or pattern |
25| `paint browse <text>` | Record a browsed design reference or inspiration |
26| `paint mix <text>` | Log a color mixing operation |
27| `paint gradient <text>` | Record a gradient definition or transition |
28| `paint swatch <text>` | Log a swatch entry or named color sample |
29| `paint stats` | Show summary statistics across all categories |
30| `paint search <term>` | Full-text search across all log files |
31| `paint recent` | Show the 20 most recent activity entries |
32| `paint status` | Health check — version, data dir, entry counts, disk usage |
33| `paint help` | Show the built-in help message |
34| `paint version` | Print the current version |
35
36### How Entry Commands Work
37
38Every entry command (`palette`, `preview`, `generate`, `convert`, `harmonize`, `contrast`, `export`, `random`, `browse`, `mix`, `gradient`, `swatch`) follows the same pattern:
39
40- **With arguments:** Appends a timestamped entry (`YYYY-MM-DD HH:MM|<text>`) to the corresponding `.log` file and shows the new total count
41- **Without arguments:** Shows the 20 most recent entries from that category's log file
42
43## Data Storage
44
45All data is stored in `~/.local/share/paint/` by default.
46
47Files created in the data directory:
48
49- **`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
50- **`history.log`** — Audit trail of every command executed with timestamps
51- **`export.json`** / **`export.csv`** / **`export.txt`** — Generated by the stats/export functions
52
53### Export Formats (via internal `_export` function)
54
55- **json** — Array of objects with `type`, `time`, and `value` fields
56- **csv** — Header row (`type,time,value`) followed by data rows
57- **txt** — Human-readable sections grouped by category
58
59## Requirements
60
61- **bash** 4.0 or later (uses `set -euo pipefail`, `local` variables)
62- **grep** — used by the `search` command for case-insensitive matching
63- **Standard POSIX utilities** — `date`, `cat`, `echo`, `mkdir`, `wc`, `du`, `head`, `tail`, `basename`
64- No external API keys or network access required
65- No Python or Node.js dependencies
66
67## When to Use
68
691. **Building a color palette library** — Use `palette` to log color combinations as you discover or create them, then `search` to find specific palettes later
702. **Tracking design iterations** — Use `preview` and `generate` to record design experiments, then `recent` to review your latest work
713. **Color space documentation** — Use `convert` to log color conversions (HEX → RGB → HSL) for reference in design systems or style guides
724. **Accessibility audits** — Use `contrast` to document contrast ratio checks between foreground and background colors for WCAG compliance
735. **Gradient and swatch management** — Use `gradient` and `swatch` to maintain a library of reusable color transitions and named color samples
74
75## Examples
76
77```bash
78# Record a new palette
79paint palette "Sunset: #FF6B35, #F7931E, #FCB040, #FDD835"
80#=> [Paint] palette: Sunset: #FF6B35, #F7931E, #FCB040, #FDD835
81#=> Saved. Total palette entries: 1
82
83# Log a color conversion
84paint convert "Brand blue: #2196F3 → rgb(33,150,243) → hsl(207,90%,54%)"
85#=> [Paint] convert: Brand blue: #2196F3 → rgb(33,150,243) → hsl(207,90%,54%)
86#=> Saved. Total convert entries: 1
87
88# Record a gradient
89paint gradient "Hero section: linear-gradient(135deg, #667eea 0%, #764ba2 100%)"
90#=> [Paint] gradient: Hero section: linear-gradient(135deg, #667eea 0%, #764ba2 100%)
91#=> Saved. Total gradient entries: 1
92
93# Check a contrast ratio
94paint contrast "White #FFF on brand blue #2196F3: ratio 3.2:1 — fails AA for body text"
95#=> [Paint] contrast: White #FFF on brand blue #2196F3: ratio 3.2:1 — fails AA for body text
96#=> Saved. Total contrast entries: 1
97
98# View statistics across all categories
99paint stats
100#=> === Paint Stats ===
101#=> palette: 1 entries
102#=> convert: 1 entries
103#=> gradient: 1 entries
104#=> contrast: 1 entries
105#=> ---
106#=> Total: 4 entries
107#=> Data size: 4.0K
108
109# Search across all logs
110paint search "blue"
111#=> Searching for: blue
112#=> --- convert ---
113#=> 2025-03-18 14:30|Brand blue: #2196F3 → rgb(33,150,243)
114```
115
116## Configuration
117
118The data directory is hardcoded to `~/.local/share/paint/`. To use a custom location, modify the `DATA_DIR` variable in the script.
119
120## How It Works
121
1221. On every invocation, the tool ensures the data directory exists (`mkdir -p`)
1232. The first argument selects the command via a `case` dispatch
1243. Entry commands append a pipe-delimited line (`timestamp|text`) to their category-specific log file
1254. Every command also appends to `history.log` for auditing
1265. `stats` iterates over all `.log` files to produce aggregate counts
1276. `search` uses `grep -i` across all log files for case-insensitive matching
1287. All output goes to stdout for easy piping and redirection
129
130---
131
132Powered by BytesAgain | bytesagain.com | hello@bytesagain.com