GDD (Giggly-Dazzling-Duckling)

Granja de navegadores controlada por IA: ejecuta N instancias aisladas de Chromium con 36 herramientas MCP para emulación de dispositivos, capturas de pantalla, simulación de red/geolocalización y diagnósticos. Multiplataforma: GUI de Windows + modo con interfaz/sin interfaz en Linux/macOS.

Documentación

GDD

GDD — Giggly-Dazzling-Duckling

Granja de navegadores controlada por IA en tu máquina
Simula múltiples usuarios reales en 22 tipos de dispositivos: prueba tu sitio como si fuera el día del lanzamiento.

Release Platforms MCP MCP Registry License

Claude Code Cursor


Cómo funciona

Tú: Abre 3 iPhones y un escritorio, navega a myapp.com, prueba el formulario de registro en todos los dispositivos

Claude Code crea 4 navegadores con emulación de dispositivos, navega cada uno a tu aplicación, completa el formulario, toma capturas de pantalla y revisa la consola en busca de errores, todo en paralelo.

gdd_add_players(3, device="iPhone 15 Pro")    → players [1, 2, 3]
gdd_add_players(1, device="Desktop 1080p")    → player  [4]
gdd_navigate(1, "https://myapp.com")          → all 4 browsers open your app
gdd_tap(1, "#signup-btn")                     → taps signup on iPhone
gdd_screenshot(1)                             → captures the result
gdd_get_console(1, level="error")             → checks for JS errors

GDD ejecuta N instancias aisladas de Chromium, cada una con su propio perfil, cookies, emulación de dispositivo, geolocalización y condiciones de red. Expone 39 herramientas MCP a través de HTTP en localhost:9700.

GDD Video Wall — 3 devices testing simultaneously


Instalación

GDD viene en dos versiones. El Servidor es headless: es solo el backend MCP, se ejecuta en cualquier lugar (incluidas máquinas sin pantalla) y es todo lo que necesitas para automatización pura con IA. La aplicación de escritorio añade una GUI: una cuadrícula en vivo de miniaturas de navegadores en las que puedes hacer clic para tomar el control de una sesión manualmente. El Servidor se ejecuta en el puerto 9700, la aplicación de escritorio en 9800 — para que puedas ejecutar ambos en paralelo.

Servidor (headless) — el backend MCP:

PlataformaDescargaEjecutar
LinuxGDD-Server-Linux.tar.gzchmod +x GDD.Headless && ./GDD.Headless
macOS ARMGDD-Server-macOS-ARM.tar.gzbash Scripts/setup-macos.sh && ./GDD.Headless
macOS IntelGDD-Server-macOS-Intel.tar.gzbash Scripts/setup-macos.sh && ./GDD.Headless
WindowsGDD-Server-Windows.zip.\GDD.Headless.exe
Dockerghcr.io/cap-of-tea/gdddocker run -p 9700:9700 ghcr.io/cap-of-tea/gdd
Claude DesktopWin / Mac ARM / Mac Intel (.mcpb)Abre el archivo .mcpb — se instala como extensión de escritorio

Aplicación de escritorio (GUI) — una cuadrícula en vivo de miniaturas de navegadores en las que puedes hacer clic:

PlataformaDescargaEjecutar
WindowsGDD-Desktop-Windows.zipExtrae y ejecuta GDD.exe (requiere WebView2)
LinuxGDD-Desktop-Linux.tar.gzbash Scripts/install-deps.sh && ./GDD.Desktop
macOS ARMGDD-Desktop-macOS-ARM.tar.gzbash Scripts/setup-macos.sh && ./GDD.Desktop
macOS IntelGDD-Desktop-macOS-Intel.tar.gzbash Scripts/setup-macos.sh && ./GDD.Desktop

La aplicación de Windows usa WebView2; la aplicación de Linux/macOS (creada con Avalonia) controla ventanas reales de Chromium mantenidas fuera de pantalla. Binario autocontenido, ~70 MB. No se necesita instalación de .NET. Chromium se descarga automáticamente en el primer inicio.

Una línea (Linux):

curl -sL https://github.com/Cap-of-tea/GDD/releases/latest/download/GDD-Server-Linux.tar.gz | tar xz && chmod +x GDD.Headless && ./GDD.Headless
Docker
# Run (headless, port 9700)
docker run -p 9700:9700 ghcr.io/cap-of-tea/gdd

# Or build locally
docker build -t gdd .
docker run -p 9700:9700 gdd

La imagen de Docker se ejecuta en modo headless con todas las dependencias de Chromium preinstaladas.

Por defecto, los navegadores se lanzan en modo headed (ventanas visibles). Añade --headless para CI/CD. Otras banderas: --stealth y --stealth-max para enmascaramiento anti-bot, --update para autoactualización, --version y --help. La sección Configuración a continuación enumera todas las banderas y variables de entorno.


Conéctate a tu cliente de IA

Añade a .mcp.json y reinicia tu cliente de IA:

{
  "mcpServers": {
    "gdd": {
      "url": "http://localhost:9700/mcp"
    }
  }
}

Eso es todo. Inicia GDD, dile a Claude o Cursor que pruebe tu aplicación.

Usuarios de Claude Desktop: Descarga el archivo .mcpb desde Releases y ábrelo: GDD se instala como una extensión de escritorio con un clic. No se necesita configuración manual.

Ubicaciones de archivos de configuración
ClienteConfiguración del proyectoConfiguración global
Claude Code<project>/.mcp.json~/.claude/.mcp.json
Cursor<project>/.cursor/mcp.json~/.cursor/mcp.json
VS Code / Windsurf / Antigravity<project>/.vscode/mcp.jsonIDE settings.json

Las configuraciones global y del proyecto se fusionan: los servidores de ambas están disponibles simultáneamente. Los cambios se aplican solo al reiniciar la sesión del cliente de IA.

IDEs basados en VS Code (Windsurf, Antigravity, Copilot)

Los IDEs basados en VS Code usan un formato de configuración diferente al de Claude Code / Cursor.

Configuración del proyecto — .vscode/mcp.json:

{
  "servers": {
    "gdd": {
      "type": "http",
      "url": "http://localhost:9700/mcp"
    }
  }
}

Configuración global — abre a través de Cmd+Shift+P → "Open User Settings (JSON)":

{
  "mcp": {
    "servers": {
      "gdd": {
        "type": "http",
        "url": "http://localhost:9700/mcp"
      }
    }
  }
}

Ubicación global de settings.json: macOS — ~/Library/Application Support/<IDE>/User/settings.json, Linux — ~/.config/<IDE>/User/settings.json, Windows — %APPDATA%/<IDE>/User/settings.json. Reemplaza <IDE> con el nombre de tu editor (Code, Windsurf, Antigravity, etc.).

Alternativa stdio-proxy (.vscode/mcp.json):

{
  "servers": {
    "gdd": {
      "type": "stdio",
      "command": "bash",
      "args": ["/absolute/path/to/Scripts/mcp-proxy.sh"]
    }
  }
}
Permisos (Claude Code)

Por defecto, Claude Code pide confirmación en cada llamada a una herramienta MCP. Para permitir las herramientas de GDD sin avisos, añade a ~/.claude/settings.json:

{
  "permissions": {
    "allow": [
      "mcp__gdd__*"
    ]
  }
}

Este comodín único cubre las 39 herramientas de GDD. Reinicia Claude Code después de editar.

Inicio automático mediante proxy stdio (alternativa)

Los scripts proxy inician GDD automáticamente cuando tu cliente de IA se conecta:

Windows:

{
  "mcpServers": {
    "gdd": {
      "command": "powershell",
      "args": ["-ExecutionPolicy", "Bypass", "-File", "C:/path/to/Scripts/mcp-proxy.ps1"]
    }
  }
}

Linux / macOS:

{
  "mcpServers": {
    "gdd": {
      "command": "bash",
      "args": ["/path/to/Scripts/mcp-proxy.sh"]
    }
  }
}

Añade "--headless" al array args para CI/CD.

Consejo: En el primer inicio, GDD descarga Chromium (~80 MB). Si tu cliente de IA agota el tiempo de espera, ejecuta GDD manualmente primero y luego vuelve a conectarte.

Inicio automático como servicio (macOS / Linux)

macOS (launchd):

bash Scripts/install-launchd.sh            # headed (default)
bash Scripts/install-launchd.sh --headless  # for CI/CD

Gestionar: launchctl list | grep gdd / bash Scripts/install-launchd.sh --uninstall

Linux (systemd):

mkdir -p ~/.config/systemd/user
cat > ~/.config/systemd/user/gdd.service << 'EOF'
[Unit]
Description=GDD Multi-Browser Testing Server
[Service]
ExecStart=/path/to/GDD.Headless
WorkingDirectory=/path/to/gdd-directory
Restart=on-failure
[Install]
WantedBy=default.target
EOF

systemctl --user daemon-reload
systemctl --user enable --now gdd
HTTP directo (sin cliente de IA)
curl -X POST http://localhost:9700/mcp -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"gdd_add_players","arguments":{"count":1}}}'

GDD usa JSON-RPC 2.0 estándar: funciona con curl, Python, Node.js o cualquier cliente HTTP.


Características

  • Multi-dispositivo — Ejecuta N instancias aisladas de Chromium con 22 ajustes predefinidos de dispositivos (teléfonos, tabletas, escritorios)
  • Nativo para IA — 39 herramientas MCP para Claude Code, Cursor o cualquier cliente compatible con MCP
  • Multiplataforma — GUI nativa con un muro de video en vivo en Windows, Linux y macOS, además de un servidor headless para CI/CD
  • Interacción completa — Navegar, tocar, escribir, presionar teclas y atajos, arrastrar, deslizar, desplazarse, pasar el cursor, manejar diálogos, tomar capturas de pantalla
  • Teclado real — Escribir envía pulsaciones de teclas genuinas y confiables (la cadena completa keydown→input), por lo que las máscaras de entrada, el autocompletado y maxlength se comportan exactamente como para un usuario real, y los editores de texto enriquecido (contenteditable) funcionan; gdd_press maneja teclas individuales y atajos como Enter, Tab, Escape y Ctrl+A
  • Diseños de teclado físicos — Las pulsaciones llevan el code/keyCode real del teclado de la configuración regional emulada: el ruso ЙЦУКЕН coloca «а» en el KeyF físico, el francés AZERTY y el alemán QWERTZ reasignan sus teclas, los acentos de teclas muertas y los símbolos AltGr funcionan. El diseño sigue gdd_set_language automáticamente (US, RU, DE, FR)
  • Entrada similar a la humana — humanize=true impulsa una trayectoria de cursor continua (Bézier cúbico con easing y micro-vibración) que se mantiene entre clics, desplazamientos y arrastres; los toques envían una única entrada apropiada para el dispositivo (táctil o mouse), nunca ambas
  • Sigilo anti-bot — --stealth opcional enmascara las señales habituales de automatización (navigator.webdriver, etc.); --stealth-max añade evasiones de headless/datacenter (user-agent coherente con client hints, un proveedor WebGL plausible, métricas de dispositivo realistas) — en un contenedor headless esto redujo a la mitad la puntuación headless de CreepJS
  • Soporte de proxy — Enruta cada navegador a través de un proxy ascendente con GDD_PROXY (con autenticación opcional)
  • Reescritura de encabezados — gdd_set_headers puede eliminar X-Frame-Options/CSP frame-ancestors para cargar un sitio en un iframe, o agregar/reemplazar encabezados de respuesta
  • Emulación de dispositivos — Tamaño de pantalla, DPR, táctil, user-agent, geolocalización, zona horaria, idioma
  • Control de red — Simula 4G, Fast 3G, Slow 3G o sin conexión por navegador
  • Diagnósticos — Errores de consola, tráfico de red, métricas de rendimiento, notificaciones push
  • Baliza de errores — Cada respuesta de herramienta advierte sobre errores de JS en todos los navegadores automáticamente
  • Listo para Docker — Imagen oficial en GHCR (ghcr.io/cap-of-tea/gdd), listada en el MCP Registry
  • Autoactualizable — Verificación de versión integrada y actualización con un comando

Herramientas MCP (39)

Gestión de jugadores

HerramientaDescripción
gdd_add_playersAgrega N instancias de navegador con ajuste predefinido de dispositivo opcional
gdd_remove_playerElimina una instancia de navegador por ID de jugador
gdd_list_windowsLista todos los navegadores activos con su estado actual

Navegación

HerramientaDescripción
gdd_navigateNavega a una URL
gdd_waitEspera a que aparezca un selector CSS (con tiempo de espera)
gdd_reloadRecarga la página (hard=true omite la caché)
gdd_backNavega hacia atrás
gdd_forwardNavega hacia adelante

Interacción

HerramientaDescripción
gdd_tapToca un elemento por selector CSS o coordenadas; envía una única entrada apropiada para el dispositivo (táctil en dispositivos táctiles, mouse en escritorio), nunca ambas. humanize=true añade una trayectoria de cursor continua similar a la humana
gdd_swipeGesto de deslizamiento (arriba/abajo/izquierda/derecha)
gdd_dragArrastra un elemento a (x, y) o sobre otro elemento mediante eventos de puntero reales (controla dnd-kit y arrastrar y soltar HTML5)
gdd_scrollDesplaza la página o un elemento
gdd_typeEscribe texto con pulsaciones de teclas reales y confiables (CDP dispatchKeyEvent — las máscaras, el autocompletado y maxlength se comportan como para un usuario real; funciona en contenteditable). Los códigos de teclas físicas siguen el diseño emulado (US/RU/DE/FR); humanize=true añade micro-vibración por tecla; paste=true inserta de una sola vez
gdd_pressPresiona una tecla individual o un atajo (Enter, Tab, Escape, teclas de flecha, F1–F12 o un carácter) con modificadores opcionales (Control/Alt/Shift/Meta); las teclas de caracteres siguen el diseño emulado
gdd_hoverPasa el cursor sobre un elemento. humanize=true añade una trayectoria de cursor continua similar a la humana
gdd_selectSelecciona una opción de un menú desplegable <select>
gdd_dialogManeja diálogos JS alert/confirm/prompt

Lectura y capturas de pantalla

HerramientaDescripción
gdd_readLee el contenido de texto de un elemento
gdd_read_allLee el texto de todos los elementos coincidentes
gdd_screenshotCaptura una captura de pantalla JPEG a resolución de píxeles CSS

Emulación

HerramientaDescripción
gdd_set_deviceEstablece un ajuste predefinido de dispositivo (22 dispositivos: teléfonos, tabletas, escritorios)
gdd_set_viewportEstablece dimensiones de viewport personalizadas
gdd_set_locationEstablece geolocalización, zona horaria y configuración regional
gdd_set_networkEstablece condiciones de red (4G, 3G, sin conexión)
gdd_set_languageEstablece el idioma del navegador
gdd_set_headersReescribe encabezados de respuesta: elimina X-Frame-Options/CSP para permitir el enmarcado

Estado y diagnósticos

HerramientaDescripción
gdd_get_stateEstado del navegador: URL, título, dispositivo, estado de autenticación
gdd_get_consoleSalida de consola y excepciones no capturadas
gdd_get_networkSolicitudes de red con tiempo y estado
gdd_get_notificationsNotificaciones push recibidas
gdd_get_performanceMétricas de rendimiento (montón JS, nodos DOM, FPS)
gdd_clear_logsLimpiar registros de consola y/o red

Autenticación y Ejecución

HerramientaDescripción
gdd_quick_authRegistro automático e inicio de sesión con credenciales generadas
gdd_execute_jsEjecutar JavaScript y devolver el resultado

Almacenamiento del Navegador

HerramientaDescripción
gdd_storageLeer/escribir/limpiar localStorage/sessionStorage
gdd_cookiesLeer o limpiar cookies del navegador

Ayuda y Actualizaciones

HerramientaDescripción
gdd_get_manualManual completo de GDD para autoaprendizaje de IA
gdd_check_updateComprobar si hay versiones más recientes
gdd_updateDescargar e instalar actualización (reinicia GDD)

Presets de Dispositivos (22)

Teléfonos (11)

DispositivoResoluciónEscalaTáctil
iPhone SE375 x 6672.0xSí
iPhone 14390 x 8443.0xSí
iPhone 15 Pro393 x 8523.0xSí
iPhone 15 Pro Max430 x 9323.0xSí
iPhone 16 Pro402 x 8743.0xSí
iPhone 16 Pro Max440 x 9563.0xSí
Pixel 9412 x 9152.625xSí
Pixel 9 Pro412 x 9152.625xSí
Galaxy S24360 x 7803.0xSí
Galaxy S24 Ultra412 x 9153.0xSí
OnePlus 12412 x 9153.5xSí

Tabletas (6)

DispositivoResoluciónEscala
iPad Mini744 x 11332.0x
iPad Air820 x 11802.0x
iPad Pro 11"834 x 11942.0x
iPad Pro 13"1024 x 13662.0x
Galaxy Tab S9800 x 12802.0x
Pixel Tablet800 x 12802.0x

Escritorios (5)

DispositivoResoluciónEscala
Laptop HD1366 x 7681.0x
Laptop HiDPI1440 x 9002.0x
Desktop 1080p1920 x 10801.0x
Desktop 1440p2560 x 14401.0x
Desktop 4K3840 x 21602.0x

Arquitectura

Client (AI agent / curl / script)
         │ POST /mcp (JSON-RPC 2.0)
         ▼
    McpServer (:9700)
    Streamable HTTP + SSE
         │
         ▼
    McpToolRegistry (39 tools)
    Player · Navigation · Interaction · Read
    Emulation · Auth · State · Diagnostics
         │
         ▼
    IPlayerManager
    MainViewModel (WPF) / DesktopPlayerManager (Avalonia) / HeadlessPlayerManager
         │
         ▼
    IBrowserEngine Instances
    WebView2 (Win GUI)  |  Playwright (Desktop GUI + headed/headless server)
    Each: own profile, CDP session, emulation

Ediciones

GDD se distribuye como tres aplicaciones sobre un núcleo compartido. Las dos GUI difieren solo en el kit de herramientas de escritorio (WebView2 en Windows, Avalonia en Linux/macOS); las tres exponen las mismas 39 herramientas MCP.

GUI de WindowsGUI de escritorioServidor
BinarioGDD.exeGDD.DesktopGDD.Headless (agrega --headless para sin ventanas)
MotorWebView2Playwright (con interfaz)Playwright (con/sin interfaz)
InterfazMuro de video WPFMuro de video Avalonianinguna — solo API HTTP
Puerto MCP970098009700
PlataformasWindowsLinux, macOSWindows, Linux, macOS

Stack Tecnológico

CapaTecnología
Runtime.NET 8.0 (autocontenido)
UI (Windows)WPF + CommunityToolkit.Mvvm
UI (Linux/macOS)Avalonia + CommunityToolkit.Mvvm
Navegador (GUI de Windows)Microsoft WebView2
Navegador (GUI de escritorio + Servidor)Microsoft Playwright
ProtocoloMCP (Model Context Protocol)
Control del navegadorChrome DevTools Protocol (CDP)
RegistroSerilog
Estructura del Proyecto
BrowserXn.sln
├── src/
│   ├── GDD.Core/              ← Shared library (net8.0)
│   │   ├── Abstractions/      ← IBrowserEngine, IPlayerManager, ...
│   │   ├── Mcp/               ← MCP server, tools, protocol
│   │   ├── Models/            ← Device, Location, Network presets
│   │   ├── Services/          ← CDP, Emulation, Monitoring services
│   │   └── Collections/       ← RingBuffer
│   ├── BrowserXn/             ← Windows GUI (WPF + WebView2)
│   │   ├── Engines/           ← WebView2ControlAdapter
│   │   ├── ViewModels/        ← MVVM (MainViewModel : IPlayerManager)
│   │   ├── Views/             ← XAML + VideoWallPanel
│   │   └── ...
│   ├── GDD.Desktop/           ← Linux/macOS GUI (Avalonia + Playwright)
│   │   ├── Engines/           ← PlaywrightHeadedEngine (headed, parked off-screen)
│   │   ├── ViewModels/        ← MainViewModel (DesktopPlayerManager)
│   │   ├── Views/             ← AXAML + VideoWallPanel
│   │   └── Scripts/           ← mcp-proxy.sh, setup-macos.sh, install-deps.sh
│   └── GDD.Headless/          ← Cross-platform server (Playwright)
│       ├── Engines/           ← PlaywrightEngine
│       ├── Platform/          ← HeadlessPlayerManager
│       └── Scripts/           ← mcp-proxy.sh, mcp-proxy.ps1
└── .github/workflows/         ← CI/CD (8 build targets + auto-release)

Configuración

appsettings.json junto al ejecutable:

{
  "GDD": {
    "FrontendUrl": "about:blank",
    "BackendUrl": "http://localhost:8080/api/v1",
    "BotToken": "",
    "McpPort": 9700,
    "DataFolderRoot": "",
    "Stealth": false
  }
}
ClaveDescripciónPredeterminado
FrontendUrlURL predeterminada para nuevos navegadoresabout:blank
BackendUrlAPI de backend para el servicio de autenticaciónhttp://localhost:8080/api/v1
BotTokenToken de bot de Telegram (para pruebas de TG)—
McpPortPuerto del servidor MCP (respaldo automático +1..+9)9700
DataFolderRootRaíz de almacenamiento de perfiles de navegador%LOCALAPPDATA%\GDD\Profiles (Win), ~/.local/share/GDD/Profiles (Linux/macOS)
HeadedVentanas de navegador visiblestrue (anular con --headless)
StealthEnmascaramiento anti-bot opcional: lanza Chromium con AutomationControlled deshabilitado y oculta las señales habituales de automatización (navigator.webdriver, etc.). Solo motores Playwright (GDD.Desktop, GDD Server)false

Opciones de línea de comandos

OpciónDescripción
--headedVentanas de navegador visibles (predeterminado)
--headlessSin interfaz de usuario — para CI/CD
--stealthHabilitar enmascaramiento anti-bot (igual que GDD_STEALTH=true)
--stealth-maxSigilo total — metadatos de UA client-hints, suplantación de WebGL/dispositivo/zona horaria; implica --stealth (igual que GDD_STEALTH_MAX=true)
--updateComprobar si hay una versión más reciente e instalarla si está disponible
--versionImprimir la versión y salir
--helpMostrar uso y salir

Variables de entorno

Útil para Docker y CI, donde un archivo appsettings.json es incómodo:

VariableDescripción
GDD_STEALTHtrue/1 para habilitar el enmascaramiento anti-bot (igual que --stealth)
GDD_STEALTH_MAXtrue/1 para sigilo total (igual que --stealth-max)
GDD_PROXYProxy ascendente para cada navegador, p. ej. http://host:3128 o socks5://host:1080 (motores Server / Playwright)
GDD_PROXY_USER / GDD_PROXY_PASSCredenciales para un proxy autenticado
GDD_CHROME_CHANNELLanzar una compilación de Chrome instalada (p. ej. chrome, chrome-beta) en lugar del Chromium incluido
GDD_TRACEtrue/1 para registro de trazas detallado
Compilación desde el Código Fuente

Requiere .NET 8 SDK.

# Windows GUI (requires Windows 10/11 + WebView2)
dotnet publish src/BrowserXn/BrowserXn.csproj -c Release -p:PublishSingleFile=true -o ./publish/win-gui

# Cross-platform headless
dotnet publish src/GDD.Headless/GDD.Headless.csproj -c Release -r linux-x64 --self-contained -o ./publish/linux-x64
dotnet publish src/GDD.Headless/GDD.Headless.csproj -c Release -r osx-arm64 --self-contained -o ./publish/osx-arm64
dotnet publish src/GDD.Headless/GDD.Headless.csproj -c Release -r win-x64 --self-contained -o ./publish/win-x64

Chromium se instala automáticamente en la primera ejecución.


Documentación

Privacidad

Política de Privacidad

GDD se ejecuta enteramente en tu máquina local. Sin telemetría, sin análisis, sin recopilación de datos.

  • Ningún dato sale de tu máquina — todos los perfiles de navegador, capturas de pantalla, registros y cookies permanecen en el almacenamiento local
  • Perfiles de navegador — almacenados en %LOCALAPPDATA%\GDD\Profiles (Windows) o ~/.local/share/GDD/Profiles (Linux/macOS)
  • Sin servicios de terceros — GDD no contacta ninguna API externa excepto GitHub Releases para comprobaciones opcionales de actualización
  • Comprobaciones de actualización — gdd_check_update realiza una única solicitud de solo lectura a api.github.com. Puedes optar por no llamar a la herramienta, o establecer CheckForUpdates: false en appsettings.json
  • Servidor MCP — escucha solo en localhost (puerto predeterminado 9700), nunca expuesto a la red

Contacto: 2vsmirnov@gmail.com


Licencia

imVS©, gratuito para uso personal.

Código fuente disponible — No comercial. Gratuito para uso personal, educativo e investigación. El uso comercial requiere una licencia de pago. Consulta LICENSE para los términos completos.

Licencias comerciales: 2vsmirnov@gmail.com