hair-color-changer
Change hair color in photos using each::sense AI. Transform hair to any color including natural shades, fantasy colors, ombre effects, highlights, and more.
Packaged view
This page reorganizes the original catalog entry around fit, installability, and workflow context first. The original raw source lives below.
Install command
npx @skill-hub/cli install openclaw-skills-hair-color-changer
Repository
Skill path: skills/eftalyurtseven/hair-color-changer
Change hair color in photos using each::sense AI. Transform hair to any color including natural shades, fantasy colors, ombre effects, highlights, and more.
Open repositoryBest for
Primary workflow: Analyze Data & AI.
Technical facets: Full Stack, Data / AI.
Target audience: everyone.
License: Unknown.
Original source
Catalog source: SkillHub Club.
Repository owner: openclaw.
This is still a mirrored public skill entry. Review the repository before installing into production workflows.
What it helps with
- Install hair-color-changer into Claude Code, Codex CLI, Gemini CLI, or OpenCode workflows
- Review https://github.com/openclaw/skills before adding hair-color-changer to shared team environments
- Use hair-color-changer for development workflows
Works across
Favorites: 0.
Sub-skills: 0.
Aggregator: No.
Original source / Raw SKILL.md
---
name: hair-color-changer
description: Change hair color in photos using each::sense AI. Transform hair to any color including natural shades, fantasy colors, ombre effects, highlights, and more.
metadata:
author: eachlabs
version: "1.0"
---
# Hair Color Changer
Transform hair color in photos using each::sense. This skill enables realistic hair color changes from subtle natural variations to bold fantasy colors, with support for complex effects like ombre, highlights, and multi-tone styling.
## Features
- **Natural Colors**: Blonde, brunette, black, red, auburn
- **Fantasy Colors**: Purple, blue, pink, green, and more
- **Ombre & Gradient**: Smooth color transitions from roots to tips
- **Highlights & Lowlights**: Multi-dimensional color effects
- **Gray & Silver**: Elegant silver, platinum, and gray tones
- **Color Correction**: Fix or enhance existing hair color
- **Multi-Turn Sessions**: Iterate on results and try different colors
## Quick Start
```bash
curl -X POST https://sense.eachlabs.run/chat \
-H "Content-Type: application/json" \
-H "X-API-Key: $EACHLABS_API_KEY" \
-H "Accept: text/event-stream" \
-d '{
"message": "Change the hair color to platinum blonde, keep it looking natural and shiny",
"image_urls": ["https://example.com/portrait.jpg"],
"mode": "max"
}'
```
## Use Case Examples
### 1. Change Hair to Blonde
```bash
curl -X POST https://sense.eachlabs.run/chat \
-H "Content-Type: application/json" \
-H "X-API-Key: $EACHLABS_API_KEY" \
-H "Accept: text/event-stream" \
-d '{
"message": "Change the hair to a warm honey blonde color. Keep the hair texture and shine natural, maintain realistic highlights throughout.",
"image_urls": ["https://example.com/original-photo.jpg"],
"mode": "max"
}'
```
### 2. Change Hair to Brunette
```bash
curl -X POST https://sense.eachlabs.run/chat \
-H "Content-Type: application/json" \
-H "X-API-Key: $EACHLABS_API_KEY" \
-H "Accept: text/event-stream" \
-d '{
"message": "Transform the hair to a rich chocolate brown color. Add subtle warm undertones and natural-looking dimension to the brunette shade.",
"image_urls": ["https://example.com/portrait.jpg"],
"mode": "max"
}'
```
### 3. Change Hair to Red/Auburn
```bash
curl -X POST https://sense.eachlabs.run/chat \
-H "Content-Type: application/json" \
-H "X-API-Key: $EACHLABS_API_KEY" \
-H "Accept: text/event-stream" \
-d '{
"message": "Change the hair color to a vibrant auburn red. Make it look like natural ginger hair with copper highlights that catch the light.",
"image_urls": ["https://example.com/model-photo.jpg"],
"mode": "max"
}'
```
### 4. Fantasy Colors (Purple, Blue, Pink)
```bash
curl -X POST https://sense.eachlabs.run/chat \
-H "Content-Type: application/json" \
-H "X-API-Key: $EACHLABS_API_KEY" \
-H "Accept: text/event-stream" \
-d '{
"message": "Transform the hair to a vivid galaxy purple color. Make it look like professionally dyed hair with deep violet tones and subtle blue undertones. Keep the hair healthy and shiny looking.",
"image_urls": ["https://example.com/portrait.jpg"],
"mode": "max"
}'
```
```bash
# Electric blue hair
curl -X POST https://sense.eachlabs.run/chat \
-H "Content-Type: application/json" \
-H "X-API-Key: $EACHLABS_API_KEY" \
-H "Accept: text/event-stream" \
-d '{
"message": "Change the hair to electric blue color, like a bold fashion statement. Mix of deep blue and bright cyan tones throughout.",
"image_urls": ["https://example.com/photo.jpg"],
"mode": "max"
}'
```
```bash
# Pastel pink hair
curl -X POST https://sense.eachlabs.run/chat \
-H "Content-Type: application/json" \
-H "X-API-Key: $EACHLABS_API_KEY" \
-H "Accept: text/event-stream" \
-d '{
"message": "Transform the hair to a soft pastel pink color. Think rose gold meets cotton candy - delicate, feminine, and Instagram-worthy.",
"image_urls": ["https://example.com/headshot.jpg"],
"mode": "max"
}'
```
### 5. Ombre/Gradient Effect
```bash
curl -X POST https://sense.eachlabs.run/chat \
-H "Content-Type: application/json" \
-H "X-API-Key: $EACHLABS_API_KEY" \
-H "Accept: text/event-stream" \
-d '{
"message": "Create an ombre hair effect - dark brown roots transitioning smoothly to caramel blonde at the ends. Make the gradient look natural and well-blended like salon balayage.",
"image_urls": ["https://example.com/full-portrait.jpg"],
"mode": "max"
}'
```
```bash
# Fantasy ombre
curl -X POST https://sense.eachlabs.run/chat \
-H "Content-Type: application/json" \
-H "X-API-Key: $EACHLABS_API_KEY" \
-H "Accept: text/event-stream" \
-d '{
"message": "Create a fantasy ombre effect with dark purple roots fading into bright pink, then to peachy coral at the tips. Smooth gradient transitions like a sunset.",
"image_urls": ["https://example.com/model.jpg"],
"mode": "max"
}'
```
### 6. Highlights and Lowlights
```bash
curl -X POST https://sense.eachlabs.run/chat \
-H "Content-Type: application/json" \
-H "X-API-Key: $EACHLABS_API_KEY" \
-H "Accept: text/event-stream" \
-d '{
"message": "Add dimensional highlights and lowlights to the hair. Keep the base color but add face-framing blonde highlights and subtle caramel lowlights throughout for depth and dimension.",
"image_urls": ["https://example.com/brunette-photo.jpg"],
"mode": "max"
}'
```
```bash
# Babylights effect
curl -X POST https://sense.eachlabs.run/chat \
-H "Content-Type: application/json" \
-H "X-API-Key: $EACHLABS_API_KEY" \
-H "Accept: text/event-stream" \
-d '{
"message": "Add subtle babylights throughout the hair - very fine, delicate highlights like sun-kissed natural lightening. Keep it soft and natural looking.",
"image_urls": ["https://example.com/portrait.jpg"],
"mode": "max"
}'
```
### 7. Gray/Silver Hair
```bash
curl -X POST https://sense.eachlabs.run/chat \
-H "Content-Type: application/json" \
-H "X-API-Key: $EACHLABS_API_KEY" \
-H "Accept: text/event-stream" \
-d '{
"message": "Transform the hair to an elegant silver gray color. Make it look like intentional fashion-forward silver hair, not aging gray - metallic, shiny, and well-maintained.",
"image_urls": ["https://example.com/fashion-photo.jpg"],
"mode": "max"
}'
```
```bash
# Platinum silver
curl -X POST https://sense.eachlabs.run/chat \
-H "Content-Type: application/json" \
-H "X-API-Key: $EACHLABS_API_KEY" \
-H "Accept: text/event-stream" \
-d '{
"message": "Change hair to platinum silver with icy undertones. Think high fashion editorial silver - cool-toned, luminous, and striking.",
"image_urls": ["https://example.com/model-headshot.jpg"],
"mode": "max"
}'
```
### 8. Natural Color Variations
```bash
curl -X POST https://sense.eachlabs.run/chat \
-H "Content-Type: application/json" \
-H "X-API-Key: $EACHLABS_API_KEY" \
-H "Accept: text/event-stream" \
-d '{
"message": "Adjust the hair color to be 2 shades darker, turning it from medium brown to a deep espresso brown. Keep all the natural texture and shine.",
"image_urls": ["https://example.com/natural-photo.jpg"],
"mode": "max"
}'
```
```bash
# Warm up cool tones
curl -X POST https://sense.eachlabs.run/chat \
-H "Content-Type: application/json" \
-H "X-API-Key: $EACHLABS_API_KEY" \
-H "Accept: text/event-stream" \
-d '{
"message": "Add warm golden undertones to the existing hair color. Keep the same overall shade but remove any ashy tones and make it warmer and more vibrant.",
"image_urls": ["https://example.com/portrait.jpg"],
"mode": "eco"
}'
```
### 9. Multiple Color Options from Same Photo
Use `session_id` to try different colors on the same photo:
```bash
# First option - Blonde
curl -X POST https://sense.eachlabs.run/chat \
-H "Content-Type: application/json" \
-H "X-API-Key: $EACHLABS_API_KEY" \
-H "Accept: text/event-stream" \
-d '{
"message": "Change my hair to platinum blonde. I want to see how I would look with this color.",
"image_urls": ["https://example.com/my-photo.jpg"],
"session_id": "hair-color-tryout-001",
"mode": "eco"
}'
# Second option - Red (same session)
curl -X POST https://sense.eachlabs.run/chat \
-H "Content-Type: application/json" \
-H "X-API-Key: $EACHLABS_API_KEY" \
-H "Accept: text/event-stream" \
-d '{
"message": "Now show me the same photo but with fiery red hair instead.",
"session_id": "hair-color-tryout-001",
"mode": "eco"
}'
# Third option - Black (same session)
curl -X POST https://sense.eachlabs.run/chat \
-H "Content-Type: application/json" \
-H "X-API-Key: $EACHLABS_API_KEY" \
-H "Accept: text/event-stream" \
-d '{
"message": "And one more variation with jet black hair please.",
"session_id": "hair-color-tryout-001",
"mode": "eco"
}'
```
### 10. Before/After Comparison
```bash
curl -X POST https://sense.eachlabs.run/chat \
-H "Content-Type: application/json" \
-H "X-API-Key: $EACHLABS_API_KEY" \
-H "Accept: text/event-stream" \
-d '{
"message": "Change the hair to rose gold color, then create a side-by-side before and after comparison showing the original on the left and the new color on the right.",
"image_urls": ["https://example.com/original-portrait.jpg"],
"mode": "max"
}'
```
```bash
# Iterative refinement for comparison
curl -X POST https://sense.eachlabs.run/chat \
-H "Content-Type: application/json" \
-H "X-API-Key: $EACHLABS_API_KEY" \
-H "Accept: text/event-stream" \
-d '{
"message": "Transform the hair to strawberry blonde.",
"image_urls": ["https://example.com/client-photo.jpg"],
"session_id": "client-consultation-001",
"mode": "max"
}'
# Follow-up to adjust
curl -X POST https://sense.eachlabs.run/chat \
-H "Content-Type: application/json" \
-H "X-API-Key: $EACHLABS_API_KEY" \
-H "Accept: text/event-stream" \
-d '{
"message": "Make the strawberry blonde a bit more pink and less orange. Also make it slightly lighter overall.",
"session_id": "client-consultation-001",
"mode": "max"
}'
```
## Best Practices
### Getting Realistic Results
- **Good Lighting**: Use photos with clear, even lighting on the hair
- **Hair Visibility**: Ensure the hair is clearly visible and not obscured
- **Face Forward**: Front-facing or 3/4 angle photos work best
- **High Resolution**: Higher quality source images yield better results
### Prompt Tips
1. **Be Specific**: Describe the exact shade you want (e.g., "warm honey blonde" vs just "blonde")
2. **Reference Tones**: Mention undertones (warm, cool, neutral, ashy, golden)
3. **Texture Preservation**: Request to maintain natural texture and shine
4. **Realistic Expectations**: Fantasy colors may look more vibrant on lighter base colors
### Example Prompt Structure
```
"Change the hair to [specific color with undertones].
[Additional details about dimension, highlights, or effects].
Keep the hair looking [natural/healthy/shiny/textured]."
```
## Mode Selection
**"Do you want fast results or highest quality?"**
| Mode | Best For | Speed | Quality |
|------|----------|-------|---------|
| `max` | Final results, client presentations, portfolio work | Slower | Highest |
| `eco` | Quick previews, trying multiple colors, concept exploration | Faster | Good |
## Multi-Turn Color Exploration
Use `session_id` to iterate and explore colors:
```bash
# Start with a base change
curl -X POST https://sense.eachlabs.run/chat \
-H "Content-Type: application/json" \
-H "X-API-Key: $EACHLABS_API_KEY" \
-H "Accept: text/event-stream" \
-d '{
"message": "Change my hair to copper red",
"image_urls": ["https://example.com/selfie.jpg"],
"session_id": "hair-exploration"
}'
# Request adjustment
curl -X POST https://sense.eachlabs.run/chat \
-H "Content-Type: application/json" \
-H "X-API-Key: $EACHLABS_API_KEY" \
-H "Accept: text/event-stream" \
-d '{
"message": "Make it more auburn and less orange, add some brown lowlights",
"session_id": "hair-exploration"
}'
# Try a completely different direction
curl -X POST https://sense.eachlabs.run/chat \
-H "Content-Type: application/json" \
-H "X-API-Key: $EACHLABS_API_KEY" \
-H "Accept: text/event-stream" \
-d '{
"message": "Actually, let me see the original photo with silver gray hair instead",
"session_id": "hair-exploration"
}'
```
## Error Handling
| Error | Cause | Solution |
|-------|-------|----------|
| `Failed to create prediction: HTTP 422` | Insufficient balance | Top up at eachlabs.ai |
| No hair detected | Hair not visible in image | Use a clearer photo with visible hair |
| Unnatural results | Low quality source image | Use higher resolution photo with good lighting |
| Timeout | Complex generation | Set client timeout to minimum 10 minutes |
## Related Skills
- `each-sense` - Core API documentation
- `face-swap` - Face swapping capabilities
- `image-edit` - General image editing
- `product-photo-generation` - E-commerce product shots
---
## Skill Companion Files
> Additional files collected from the skill directory layout.
### _meta.json
```json
{
"owner": "eftalyurtseven",
"slug": "hair-color-changer",
"displayName": "Hair Color Changer",
"latest": {
"version": "1.0.0",
"publishedAt": 1772561228831,
"commit": "https://github.com/openclaw/skills/commit/88cbdca98eae10c0dafac5d8dd287ae0bbfd44d4"
},
"history": []
}
```
### references/SSE-EVENTS.md
```markdown
# SSE Event Reference
Detailed documentation for all Server-Sent Events (SSE) returned by the each::sense `/chat` endpoint.
## Event Format
Each event follows this format:
```
data: {"type": "event_type", ...fields}\n\n
```
Stream ends with:
```
data: [DONE]\n\n
```
---
## Event Types
### thinking_delta
Claude's reasoning as it streams in real-time. Use this to show users what the AI is thinking.
```json
{
"type": "thinking_delta",
"content": "Let me find the best model for portrait generation..."
}
```
| Field | Type | Description |
|-------|------|-------------|
| `content` | string | Incremental thinking text |
---
### status
Current operation being executed. Shows tool usage and parameters.
```json
{
"type": "status",
"message": "Searching for image generation models...",
"tool_name": "search_models",
"parameters": {"use_case": "text to image portrait"}
}
```
| Field | Type | Description |
|-------|------|-------------|
| `message` | string | Human-readable status message |
| `tool_name` | string | Internal tool being used |
| `parameters` | object | Tool parameters (optional) |
---
### text_response
Text content from the AI (explanations, answers, plans).
```json
{
"type": "text_response",
"content": "I'll create a stunning portrait for you with cinematic lighting and a warm mood."
}
```
| Field | Type | Description |
|-------|------|-------------|
| `content` | string | Text response content |
---
### generation_response
Generated media URL (image or video). This is the primary output event.
```json
{
"type": "generation_response",
"url": "https://storage.eachlabs.ai/outputs/abc123.png",
"generations": ["https://storage.eachlabs.ai/outputs/abc123.png"],
"total": 1,
"tool_name": "execute_model",
"model": "nano-banana-pro"
}
```
| Field | Type | Description |
|-------|------|-------------|
| `url` | string | Primary output URL |
| `generations` | array | All generated URLs |
| `total` | number | Total number of generations |
| `tool_name` | string | Tool that generated output |
| `model` | string | Model used for generation |
---
### clarification_needed
AI needs more information to proceed. Present options to the user.
```json
{
"type": "clarification_needed",
"question": "What type of edit would you like to make to this image?",
"options": [
"Remove the background",
"Apply a style transfer",
"Upscale to higher resolution",
"Add or modify elements"
],
"context": "I can see you've uploaded an image, but I need to understand what changes you'd like."
}
```
| Field | Type | Description |
|-------|------|-------------|
| `question` | string | The question to ask the user |
| `options` | array | Suggested options (can be displayed as buttons) |
| `context` | string | Additional context about the clarification |
**Handling:** Display the question and options to the user. Send their response in a follow-up request with the same `session_id`.
---
### web_search_query
Web search being executed.
```json
{
"type": "web_search_query",
"query": "best AI video generation models 2024",
"recency": "month"
}
```
| Field | Type | Description |
|-------|------|-------------|
| `query` | string | Search query |
| `recency` | string | Time filter (day, week, month, year) |
---
### web_search_citations
Citations from web search results.
```json
{
"type": "web_search_citations",
"citations": [
"https://example.com/ai-video-comparison",
"https://techblog.com/veo3-review"
],
"count": 2
}
```
| Field | Type | Description |
|-------|------|-------------|
| `citations` | array | URLs of sources cited |
| `count` | number | Number of citations |
---
### workflow_created
New workflow was created for complex multi-step generation.
```json
{
"type": "workflow_created",
"workflow_id": "wf_abc123",
"version_id": "v1",
"input_schema": {
"properties": {
"character_description": {
"type": "text",
"required": true,
"default_value": ""
}
}
},
"steps_count": 5
}
```
| Field | Type | Description |
|-------|------|-------------|
| `workflow_id` | string | Unique workflow identifier |
| `version_id` | string | Workflow version |
| `input_schema` | object | Schema for workflow inputs |
| `steps_count` | number | Number of steps in workflow |
---
### workflow_fetched
Existing workflow was loaded (when `workflow_id` is provided in request).
```json
{
"type": "workflow_fetched",
"workflow_name": "Product Video Generator",
"existing_steps": 3,
"existing_definition": {...}
}
```
| Field | Type | Description |
|-------|------|-------------|
| `workflow_name` | string | Name of the workflow |
| `existing_steps` | number | Number of existing steps |
| `existing_definition` | object | Current workflow definition |
---
### workflow_built
Workflow definition was constructed.
```json
{
"type": "workflow_built",
"steps_count": 4,
"definition": {
"version": "v1",
"input_schema": {...},
"steps": [...]
}
}
```
| Field | Type | Description |
|-------|------|-------------|
| `steps_count` | number | Number of steps |
| `definition` | object | Full workflow definition |
---
### workflow_updated
Workflow was pushed to the EachLabs API.
```json
{
"type": "workflow_updated",
"success": true,
"workflow_id": "wf_abc123",
"version_id": "v1",
"definition": {...}
}
```
| Field | Type | Description |
|-------|------|-------------|
| `success` | boolean | Whether update succeeded |
| `workflow_id` | string | Workflow identifier |
| `version_id` | string | Version identifier |
| `definition` | object | Updated definition |
---
### execution_started
Workflow execution has begun.
```json
{
"type": "execution_started",
"execution_id": "exec_xyz789",
"workflow_id": "wf_abc123"
}
```
| Field | Type | Description |
|-------|------|-------------|
| `execution_id` | string | Unique execution identifier |
| `workflow_id` | string | Workflow being executed |
---
### execution_progress
Progress update during workflow execution. Sent approximately every 5 seconds.
```json
{
"type": "execution_progress",
"step_id": "step2",
"step_status": "completed",
"output": "https://storage.eachlabs.ai/outputs/step2.png",
"model": "nano-banana-pro",
"completed_steps": 2,
"total_steps": 5
}
```
| Field | Type | Description |
|-------|------|-------------|
| `step_id` | string | Current step identifier |
| `step_status` | string | Step status (running, completed, failed) |
| `output` | string | Step output URL (if available) |
| `model` | string | Model used for this step |
| `completed_steps` | number | Steps completed so far |
| `total_steps` | number | Total steps in workflow |
---
### execution_completed
Workflow execution finished successfully.
```json
{
"type": "execution_completed",
"execution_id": "exec_xyz789",
"status": "completed",
"output": "https://storage.eachlabs.ai/outputs/final.mp4",
"all_outputs": {
"step1": "https://storage.eachlabs.ai/outputs/step1.png",
"step2": "https://storage.eachlabs.ai/outputs/step2.png",
"step3": "https://storage.eachlabs.ai/outputs/final.mp4"
}
}
```
| Field | Type | Description |
|-------|------|-------------|
| `execution_id` | string | Execution identifier |
| `status` | string | Final status (completed, failed) |
| `output` | string | Final output URL |
| `all_outputs` | object | All step outputs keyed by step_id |
---
### tool_call
Details of a tool being called. Useful for debugging and transparency.
```json
{
"type": "tool_call",
"name": "execute_model",
"input": {
"model_name": "nano-banana-pro",
"inputs": {
"prompt": "A beautiful woman portrait...",
"aspect_ratio": "1:1"
}
}
}
```
| Field | Type | Description |
|-------|------|-------------|
| `name` | string | Tool name |
| `input` | object | Tool input parameters |
---
### message
Informational message from the agent.
```json
{
"type": "message",
"content": "Your video is being processed. This typically takes 2-3 minutes."
}
```
| Field | Type | Description |
|-------|------|-------------|
| `content` | string | Message content |
---
### complete
Final event with summary. Always sent when stream completes successfully.
```json
{
"type": "complete",
"task_id": "chat_1708345678901",
"status": "ok",
"tool_calls": [
{"name": "search_models", "result": "success"},
{"name": "get_model_details", "result": "success"},
{"name": "execute_model", "result": "success", "model": "nano-banana-pro"}
],
"generations": ["https://storage.eachlabs.ai/outputs/abc123.png"],
"model": "nano-banana-pro"
}
```
| Field | Type | Description |
|-------|------|-------------|
| `task_id` | string | Unique task identifier |
| `status` | string | Final status (ok, awaiting_input, error) |
| `tool_calls` | array | Summary of all tool calls |
| `generations` | array | All generated output URLs |
| `model` | string | Primary model used |
**Status values:**
- `ok` - Completed successfully
- `awaiting_input` - Waiting for user clarification
- `error` - An error occurred
---
### error
An error occurred during processing.
```json
{
"type": "error",
"message": "Failed to generate image: Invalid aspect ratio"
}
```
| Field | Type | Description |
|-------|------|-------------|
| `message` | string | Error message |
---
## Event Flow Examples
### Simple Image Generation
```
thinking_delta → "I'll create a beautiful portrait..."
status → "Searching for models..."
status → "Getting model details..."
status → "Generating with nano-banana-pro..."
generation_response → {url: "https://..."}
complete → {status: "ok", generations: [...]}
[DONE]
```
### Clarification Flow
```
thinking_delta → "I see an image, but need to know what edit..."
clarification_needed → {question: "What edit?", options: [...]}
complete → {status: "awaiting_input"}
[DONE]
```
### Workflow Execution
```
thinking_delta → "Creating a multi-step workflow..."
status → "Searching for models..."
workflow_created → {workflow_id: "wf_123", steps_count: 5}
execution_started → {execution_id: "exec_456"}
execution_progress → {completed_steps: 1, total_steps: 5}
execution_progress → {completed_steps: 2, total_steps: 5}
execution_progress → {completed_steps: 3, total_steps: 5}
execution_progress → {completed_steps: 4, total_steps: 5}
execution_completed → {output: "https://...", all_outputs: {...}}
complete → {status: "ok"}
[DONE]
```
### Web Search
```
thinking_delta → "Let me search for current information..."
web_search_query → {query: "best AI models 2024"}
status → "Searching the web..."
web_search_citations → {citations: [...], count: 3}
text_response → "Based on current information..."
complete → {status: "ok"}
[DONE]
```
```