Sistema avanzado de matching de tonos de piel basado en IA que se integra perfectamente con tu tienda Shopify
Shade Finder AI es una aplicación web que ayuda a tus clientes a encontrar el tono perfecto de maquillaje basándose en análisis científico del color y recomendaciones personalizadas generadas por inteligencia artificial. El sistema utiliza el espacio de color CIELAB y cálculos de Delta E (ΔE) para ofrecer matching preciso de tonos.
- 🎯 Matching Preciso: Algoritmo basado en CIELAB color space con cálculo de Delta E
- 🤖 Recomendaciones IA: Explicaciones personalizadas generadas con OpenAI GPT-4o-mini
- 🛍️ Integración Shopify: Sincronización automática de productos, variantes y metafields
- 📊 Panel Administrativo: Dashboard completo con analytics y gestión de datos
- 🔧 Widget Embebible: JavaScript widget fácil de integrar en cualquier tienda Shopify
- ⚙️ Sistema de Configuración: Settings dinámicos almacenados en base de datos con caché
- 📱 Responsive Design: Interfaz adaptable a todos los dispositivos
- 🌍 Multilenguaje: Soporte para español (fácilmente extensible)
- PHP >= 8.2
- Composer
- Node.js >= 18.x
- npm o yarn
- SQLite (o MySQL/PostgreSQL)
- Cuenta de Shopify con acceso a Admin API
- API Key de OpenAI
- Clonar el repositorio
git clone <tu-repositorio>
cd shadefinder-api- Instalar dependencias de PHP
composer install- Instalar dependencias de Node.js
npm install- Configurar entorno
cp .env.example .env
php artisan key:generate- Configurar base de datos
Edita .env y configura tu conexión a base de datos:
DB_CONNECTION=sqlite
# DB_DATABASE=/ruta/absoluta/database/database.sqlite
# O si usas MySQL:
# DB_CONNECTION=mysql
# DB_HOST=127.0.0.1
# DB_PORT=3306
# DB_DATABASE=shadefinder
# DB_USERNAME=root
# DB_PASSWORD=- Ejecutar migraciones
php artisan migrate- Crear usuario administrador
php artisan tinkerUser::create([
'name' => 'Admin',
'email' => 'admin@example.com',
'password' => Hash::make('password123')
]);- Compilar assets
npm run build- Iniciar servidor de desarrollo
php artisan serveAccede a: http://localhost:8000
- Inicia sesión en el panel administrativo:
http://localhost:8000/login - Ve a Configuración en el menú lateral
- En la pestaña Shopify, ingresa:
- Shopify Store URL:
tu-tienda.myshopify.com(sin https://) - Admin API Access Token: Tu token de acceso (ver abajo cómo obtenerlo)
- API Version:
2024-10(recomendado)
- Shopify Store URL:
- Ve a tu admin de Shopify:
tu-tienda.myshopify.com/admin - Navega a Configuración → Aplicaciones y canales de venta
- Haz clic en Desarrollar aplicaciones
- Crea una nueva aplicación personalizada
- En Configuración de API, selecciona los permisos necesarios:
read_productswrite_productsread_product_listings
- Instala la aplicación y copia el Admin API access token
- En el panel de Configuración, pestaña OpenAI:
- API Key: Tu clave de API de OpenAI (obtenerla aquí)
- Model:
gpt-4o-mini(recomendado) ogpt-4o - Max Tokens: 150-300 (según necesidad)
- Temperature: 0.7 (creatividad media)
-
En Configuración, pestaña Widget:
- Primary Color: Color principal del widget (hex)
- Text Color: Color del texto (hex)
- Background Color: Color de fondo (hex)
-
Copia el código de integración generado automáticamente
- En tu admin de Shopify, ve a Tienda online → Temas
- Haz clic en Acciones → Editar código
- Abre
theme.liquidolayout/theme.liquid - Antes del cierre de
</body>, pega:
<script src="https://tu-dominio.com/widget.js"></script>
<script>
window.ShadeFinder.init({
apiUrl: 'https://tu-dominio.com',
primaryColor: '#7C3AED',
textColor: '#FFFFFF',
backgroundColor: '#1F2937'
});
</script>- Guarda los cambios
Si solo quieres el widget en páginas de productos específicos:
- Edita la plantilla de producto (
sections/product-template.liquid) - Agrega el script del widget antes de
</body>o en la sección deseada - El widget se mostrará automáticamente en productos que tengan tonos configurados
Usa el comando Artisan para sincronizar productos desde Shopify:
php artisan shopify:syncEste comando:
- Importa todos los productos de tu tienda
- Sincroniza variantes con sus metafields
- Detecta automáticamente tonos basados en metafields
shade_name,hex_color,undertone - Actualiza productos existentes
- Configura el cron job en tu servidor:
* * * * * cd /ruta/a/shadefinder-api && php artisan schedule:run >> /dev/null 2>&1-
El scheduler ejecutará automáticamente la sincronización cada 6 horas
-
Verifica que el scheduler esté funcionando:
php artisan schedule:listEncuentra el mejor tono para un color de piel dado.
Request:
{
"skin_color": "#F5D0C5",
"undertone": "warm",
"product_id": 123
}Parameters:
skin_color(string, required): Color hex de la piel (#RRGGBB)undertone(string, optional):warm,cool, oneutralproduct_id(integer, optional): ID del producto Shopify para filtrar variantes
Response:
{
"success": true,
"data": {
"variant": {
"id": 456,
"shopify_variant_id": "gid://shopify/ProductVariant/123456789",
"product_id": 123,
"title": "Medium Beige",
"sku": "FOUND-MB-01",
"shade": {
"id": 10,
"name": "Medium Beige",
"hex_color": "#F4C2A8",
"undertone": "warm",
"lab_l": 75.5,
"lab_a": 12.3,
"lab_b": 25.1
}
},
"delta_e": 8.45,
"match_quality": "Excelente",
"ai_explanation": "Este tono es perfecto para tu piel porque..."
}
}Delta E Quality Ratings:
< 10: Excelente ✅10-20: Bueno 👍20-30: Aceptable⚠️ > 30: Pobre ❌
Lista todos los productos con tonos disponibles.
Response:
{
"success": true,
"data": [
{
"id": 123,
"shopify_product_id": "gid://shopify/Product/987654321",
"title": "Base de Maquillaje HD",
"handle": "base-maquillaje-hd",
"vendor": "BeautyBrand",
"variants_count": 12
}
]
}El sistema convierte colores RGB (hex) al espacio de color CIELAB:
- RGB → XYZ: Transformación usando matriz sRGB
- XYZ → LAB: Conversión a CIELAB con iluminante D65
// Ejemplo simplificado
$rgb = ['r' => 245, 'g' => 208, 'b' => 197];
$lab = ColorUtils::rgbToLab($rgb);
// Resultado: ['l' => 85.2, 'a' => 8.5, 'b' => 12.3]Usamos la fórmula CIE76 para calcular la diferencia perceptual entre colores:
ΔE = √[(L₁ - L₂)² + (a₁ - a₂)² + (b₁ - b₂)²]
Donde:
- L: Luminosidad (0-100)
- a: Eje verde-rojo
- b: Eje azul-amarillo
Si se especifica undertone, el sistema:
- Filtra variantes por undertone coincidente
- Calcula ΔE solo para variantes filtradas
- Selecciona la variante con menor ΔE
OpenAI GPT-4o-mini genera una explicación personalizada considerando:
- Color de piel del usuario
- Undertone preferido
- Propiedades del tono recomendado
- Calidad del match (ΔE)
Accede a /admin/dashboard después de iniciar sesión.
- 📈 Estadísticas: Productos, tonos, análisis mensuales/diarios
- 🏆 Tono más recomendado: Shade con más matches
- 📊 Distribución de subtonos: Gráfico de undertones
- 📉 Análisis de 7 días: Chart de tendencias
- 📝 Últimos matches: Tabla con detalles de color y ΔE
- ✅ Ver todos los productos sincronizados
- 🔄 Sincronizar manualmente desde Shopify
- 📝 Editar información de productos
- 🗑️ Eliminar productos
- 🎨 Ver variantes por producto
- 🔗 Asociar/desasociar tonos (shades)
- ✏️ Editar SKU, título, precio
- 🗑️ Eliminar variantes
- ➕ Crear tonos manualmente
- 🎨 Selector de color visual
- 🔄 Sincronización automática desde metafields
- ✏️ Editar nombre, hex, undertone
- 📊 Ver valores LAB calculados automáticamente
- 📋 Historial completo de análisis
- 🔍 Filtrar por fecha, producto, calidad
- 📊 Ver ΔE y explicaciones IA
- 📈 Analytics de uso
- Configurar servidor (Ubuntu/Debian):
sudo apt update
sudo apt install php8.2 php8.2-fpm php8.2-sqlite3 php8.2-xml php8.2-mbstring nginx- Clonar y configurar:
cd /var/www
git clone <tu-repo> shadefinder
cd shadefinder
composer install --optimize-autoloader --no-dev
npm install && npm run build- Configurar Nginx:
server {
listen 80;
server_name tu-dominio.com;
root /var/www/shadefinder/public;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-Content-Type-Options "nosniff";
index index.php;
charset utf-8;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }
error_page 404 /index.php;
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.(?!well-known).* {
deny all;
}
}- Optimizar Laravel:
php artisan config:cache
php artisan route:cache
php artisan view:cache- Configurar permisos:
sudo chown -R www-data:www-data /var/www/shadefinder
sudo chmod -R 755 /var/www/shadefinder/storage- Configurar SSL con Let's Encrypt:
sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d tu-dominio.com- Conecta tu servidor VPS a Forge
- Crea un nuevo sitio con el repositorio Git
- Configura variables de entorno en Forge UI
- Configura deploy script:
cd /home/forge/tu-dominio.com
git pull origin main
composer install --no-dev --optimize-autoloader
npm install && npm run build
php artisan migrate --force
php artisan config:cache
php artisan route:cache
php artisan view:cache- Activa SSL automático
- Crear Procfile:
web: vendor/bin/heroku-php-nginx public/
- Deploy:
heroku create shadefinder
heroku addons:create heroku-postgresql:mini
heroku config:set APP_KEY=$(php artisan key:generate --show)
git push heroku main
heroku run php artisan migrate --force- Dockerfile (incluido en el proyecto):
FROM php:8.2-fpm
# ... configuración Docker- Docker Compose:
docker-compose up -dshadefinder-api/
├── app/
│ ├── Console/Commands/
│ │ └── SyncShopifyProducts.php # Comando de sincronización
│ ├── Http/
│ │ ├── Controllers/
│ │ │ ├── Admin/ # Controladores admin
│ │ │ └── Api/ # API endpoints
│ │ ├── Middleware/
│ │ └── Requests/
│ ├── Models/
│ │ ├── Product.php # Modelo de productos
│ │ ├── Variant.php # Modelo de variantes
│ │ ├── Shade.php # Modelo de tonos
│ │ ├── MatchLog.php # Logs de matches
│ │ └── Setting.php # Sistema de configuración
│ └── Services/
│ ├── ColorUtils.php # Utilidades de color (RGB→LAB, ΔE)
│ ├── OpenAIService.php # Integración OpenAI
│ └── ShopifyService.php # Integración Shopify
├── config/
│ ├── services.php # Configuración de APIs
│ └── cors.php # Configuración CORS
├── database/
│ ├── migrations/ # Migraciones de BD
│ └── database.sqlite # Base de datos SQLite
├── public/
│ ├── widget.js # Widget embebible
│ └── widget-demo.html # Demo del widget
├── resources/
│ ├── views/
│ │ ├── admin/ # Vistas administrativas
│ │ └── layouts/ # Layouts Blade
│ └── js/
│ └── app.js # JavaScript principal
├── routes/
│ ├── web.php # Rutas web
│ └── api.php # Rutas API
├── .env.example # Ejemplo de configuración
└── README.md # Este archivo
- ✅ Autenticación con Laravel Breeze
- ✅ CSRF Protection en formularios
- ✅ CORS configurado para widget
- ✅ Validación de requests
- ✅ Rate limiting en API
- ✅ Variables sensibles en
.env - ✅ SQL injection protection (Eloquent ORM)
Las contribuciones son bienvenidas. Por favor:
- Fork el proyecto
- Crea una rama para tu feature (
git checkout -b feature/AmazingFeature) - Commit tus cambios (
git commit -m 'Add some AmazingFeature') - Push a la rama (
git push origin feature/AmazingFeature) - Abre un Pull Request
Este proyecto está bajo la licencia MIT. Ver LICENSE para más detalles.
Si tienes preguntas o problemas:
- 📧 Email: soporte@shadefinder.com
- 🐛 Issues: GitHub Issues
- 📖 Docs: Documentación completa
- Laravel - Framework PHP
- OpenAI - API de Inteligencia Artificial
- Shopify - Plataforma de e-commerce
- Tailwind CSS - Framework CSS
- Alpine.js - Framework JavaScript
Hecho con ❤️ para la industria de la belleza