cardstream
Código abierto Con tecnología de Ximilar Versión beta

La mejor identificación de cartas para directos. Hecha para breaks, aperturas y shows en vivo.

cardstream sigue tu break, tu apertura o tu show e identifica cada carta coleccionable en el instante en que entra en el encuadre: nombre, set y confianza, en directo. Analiza tus directos de venta con un sistema de seguimiento de cartas, pensado para streamers que quieren saber más de lo que pasa en su mesa.

Qué identifica

De Pokémon a Magic: The Gathering

Cambia de categoría en cada show y todo el motor va detrás: detección, compuertas y llamada de identificación apuntan al endpoint correcto. Cada coincidencia vuelve con nombre, set, código de set, número de carta, serie y año.

🃏

Juegos de cartas coleccionables

collectibles/v2/tcg_id
Ximilar Disponible

Cartas sueltas de TCG, modernas y vintage, directamente desde el vídeo. El endpoint lee la ilustración, el marco y el texto, así que la carta se identifica a partir de la misma imagen que ven tus espectadores: sin buscar el símbolo del set ni forzar la vista con el número de coleccionista.

  • Pokémon
  • Magic: The Gathering
  • Yu-Gi-Oh!
  • One Piece
  • Lorcana
  • Digimon
  • Dragon Ball Super
  • Flesh and Blood
  • Star Wars Unlimited
  • Star Wars Destiny
  • MetaZoo
  • Riftbound
  • Weiss Schwarz
  • Union Arena
  • Force of Will
  • Grand Archive
  • Vanguard
  • Marvel Champions
  • Sorcery
  • Final Fantasy
  • Gundam
  • Duel Masters
  • Naruto Mythos
  • Hololive
  • Garbage Pail Kids
🏅

Cartas deportivas sport_id

Rookies, paralelas, inserts y autógrafos de todos los grandes deportes (béisbol, baloncesto, fútbol americano, fútbol, hockey y más): la carta exacta, el set exacto, el año exacto.

Próximamente
🧊

Cartas graduadas (slabs) slab_id

Lee la etiqueta de la funda de graduación: la carta dentro de un slab de PSA, BGS o CGC, identificada sin abrirlo.

Próximamente
📚

Cómics comics_id

Portadas identificadas igual que las cartas: título, número y año, a partir de un solo fotograma quieto.

Próximamente
Sin atarte a un proveedor

Conecta un reconocedor propietario, o el tuyo propio

Todo lo que decide si llamar ocurre antes de la identificación en sí: la detección, la compuerta de movimiento y la compuerta de misma carta son locales e independientes del proveedor. La llamada es un único paso intercambiable: Ximilar de serie, un servicio propietario de identificación de cartas, o un modelo que hayas entrenado tú y alojes en tu propio hardware.

Es una interfaz mínima: entra un recorte de la carta, sale una coincidencia. Implementa IdentifyTarget y todas las compuertas, limitadores y umbrales que van delante siguen funcionando exactamente igual: un recorte por carta distinta, responda quien responda.

# tu propio reconocedor, el mismo motor
class HouseIdentifier(IdentifyTarget):
    def identify(self, crop_bgr):
        return my_service.match(crop_bgr)

# un recorte por carta distinta, en cualquiera de los dos casos
$ cardstream-web --detector rfdetr
¿Por qué cardstream.ai?

Una llamada por carta, no por fotograma

La idea es reducir el análisis del directo a las llamadas que de verdad aportan algo nuevo. La alternativa de código abierto al SaaS cerrado de reconocimiento de cartas: sin plataforma intermediaria ni licencias por puesto. Tu hardware, tu clave de API y una máquina de estados que solo llama fuera cuando la carta en pantalla es realmente nueva.

54,000 → ~100
llamadas a la API por hora

Un pipeline ingenuo que procesa cada fotograma a 15 fps dispara 54.000 identificaciones por hora. cardstream dispara una por cada carta distinta que muestras: alrededor de cien en esa misma hora.

540×
menos llamadas de identificación

La misma hora, el mismo vídeo, las mismas cartas: 54.000 llamadas frente a unas 100. Las compuertas de movimiento e identidad se ejecutan en local, en tu propio hardware, y solo sale una llamada cuando una carta realmente nueva se queda quieta en el encuadre.

$0
de comisión de plataforma

Sin suscripción SaaS, sin precio por puesto, sin dependencia de un proveedor. Autoaloja todo el stack, identificación incluida, o conéctate a la API de Ximilar.

Funciones

Todo lo que necesita un show de cartas en directo

Un copresentador al que no se le escapa ni una carta: para vendedores de live commerce en plataformas tipo Whatnot o Fanatics Live, box breaks, directos de tiendas de cartas y catalogación de colecciones. Donde haya una cámara y cartón, sirve.

⚡

Identificada al entrar en el encuadre

Sin botón de escanear. Sin esperas. Solo muestra la carta: nombre, set y confianza pasan del cartón al nombre en pantalla en medio segundo, en pleno directo.

🎯

Una llamada por carta

Una compuerta de movimiento y una compuerta de identidad por embedding se ejecutan en local, en tu propia CPU. Mantén una carta quieta: cero llamadas repetidas. Cambia de carta: exactamente una llamada nueva.

📡

Cualquier fuente de vídeo

Webcam, archivos de vídeo, RTSP, RTMP y SRT, tanto en modo pull como recibidos directamente desde OBS con --listen. Feeds JPEG por WebSocket para montajes a medida.

🔌

Cualquier backend de identificación

Ximilar collectibles/v2 listo para usar, o apunta el mismo motor a un reconocedor de cartas propietario, o a uno que hayas entrenado y alojes tú mismo.

🧠

Trae tus propios modelos

Los pesos del localizador son nuestros: un modelo de segmentación RF-DETR ajustado, con licencia Apache-2.0, que descarga el instalador. También se admiten detectores de cajas (RF-DETR, RT-DETRv2) si prefieres traer tu propia exportación.

🔓

Código abierto, autoalojado

Un solo paquete de Python con licencia permisiva. Léelo, haz un fork y ejecútalo en tu propio hardware. Tu clave, tus datos, tu infraestructura.

Cómo funciona

Lo bastante listo para saber cuándo no llamar a la API

Entre tu directo y la API hay una máquina de estados. Cada fotograma pasa por DecisionCore, una única máquina de estados que se ejecuta en local, y tres compuertas locales deciden cuándo está justificado el único paso que llama a la API.

1

Detectar

local · sin llamada a la API

Encuentra el cuadrilátero de la carta y endereza un recorte limpio. La compuerta de movimiento local lo regula en tres niveles: en movimiento, quieto con carta, vacío.

2

Compuerta de movimiento

local · sin llamada a la API

Una diferencia media entre fotogramas, barata de calcular. Solo cuando la escena lleva N fotogramas quieta merece la pena mirar la carta de cerca. ¿Sigue moviéndose? Espera.

3

Compuerta de identidad

local · sin llamada a la API

Una comparación de embeddings responde a una sola pregunta: ¿es la misma carta de antes? Si lo es, se reenvía el resultado guardado en caché.

4

Identificar

ximilar · 1 llamada

Solo una carta realmente nueva y quieta dispara una identificación de Ximilar: asíncrona, con debounce y fuera del bucle de fotogramas. El resultado vuelve al directo al instante.

Para streamers, breakers y tiendas

¿Haces directos por tu cuenta?

Una persona, una cámara y una larga noche de breaks: no deberías necesitar un equipo de ingenieros para saber qué carta hay en pantalla. Conecta el directo que ya estás emitiendo y deja que cardstream lo analice en vivo, tanto si vendes en un marketplace como directamente desde tu propio canal.

  • Whatnot
  • Fanatics Live
  • eBay Live
  • TikTok Shop
  • Twitch
  • YouTube Live
  • tu propia web

Sin acceso a tu cuenta, sin claves de API del marketplace, sin bots en tu chat, y sin ninguna relación con estas plataformas. cardstream lee tu vídeo y nada más.

01

Ya transmites desde OBS

Añade una salida más junto a la que alimenta tu show. Tus compradores ven exactamente lo mismo que antes; una copia de la misma señal llega a cardstream y cada carta que pasa por la mesa queda identificada al vuelo. El modo escucha de abajo necesita el binario ffmpeg del sistema. O sáltate la segunda salida por completo y deja que cardstream lea la cámara virtual de OBS como una webcam normal.

$ cardstream-web --listen \
      --source rtmp://0.0.0.0:1935/live
# apunta aquí el segundo destino de OBS
02

O la cámara que ya tienes sobre la mesa

Cámara cenital, capturadora, el móvil como webcam: lo que uses para abrir y mostrar las cartas. El análisis corre en el equipo que está junto a la cámara, así que, por defecto, de la habitación no sale más que un recorte por carta.

$ cardstream-web --source 0
# webcam · interfaz en el navegador en localhost
03

O cualquier cosa con una URL

Codificadores, mezcladores, restreamers, un segundo estudio al otro lado de la ciudad. Pull por RTSP, RTMP y SRT, más feeds JPEG por WebSocket cuando el montaje es casero.

$ cardstream-web \
      --source rtsp://studio/stream1

Overlay en directo

Nombre, set y confianza aparecen en cuanto la carta se queda quieta, listos para leerlos en voz alta o para componerlos de vuelta en tu escena.

Cada carta, registrada

Un historial continuo de todo lo que has mostrado: una miniatura de cada carta y cuánto tiempo estuvo en pantalla. Guárdalo en tu cuenta de Ximilar y revisa el show a la mañana siguiente: qué se vendió y cuánto valía.

A la medida de una sola persona

Sin comisión de plataforma ni licencia por puesto. Un show de tres horas son un puñado de llamadas de identificación, no una por fotograma.

Cardstream Cloud

Tu show, guardado y listo para revisar

cardstream se ejecuta en tu equipo y, por defecto, no guarda nada. Añade una opción y cada carta que muestres se guardará también en una sesión de tu cuenta de Ximilar, con su precio, su tiempo en pantalla y el recorte a partir del cual se identificó. Abre la app de Ximilar después del show y mira cuánto valió.

$ cardstream-web --price-stats \
    --ximilar-stream NEW
# muestra el id de la sesión y guarda durante el show
Una sesión guardada en la app de Ximilar: productos mostrados, llamadas de pago a la API, valor de mercado, tiempo medio en pantalla, los productos más valiosos y los sets más frecuentes.

El show en cifras

Productos mostrados, llamadas de pago a la API, valor de mercado y tiempo medio en pantalla de cada sesión, junto a los productos más valiosos y los sets más frecuentes.

Cada carta, con su imagen

Cada fila conserva la carta, el set, el número, el precio y el recorte a partir del cual se identificó. Busca en la lista por producto o set y filtra tus sesiones por estado, plataforma y fecha.

Conviértelo en tu registro

Marca lo que se vendió, añade una nota, corrige una coincidencia equivocada o su precio y borra una falsa. Ponle nombre a la sesión y añade tus propios metadatos: un número de lote, costes, compradores.

Continúa donde lo dejaste

¿Se reinició a mitad del show? Pasa el id de la sesión en lugar de NEW y el show sigue en la misma sesión, aunque se hubiera cerrado. --ximilar-workspace la guarda en un espacio de trabajo de equipo.

Desactivado por defecto: sin --ximilar-stream, la llamada de identificación es lo único que sale de tu equipo. Para guardar, tu cuenta de Ximilar necesita el servicio Cardstream; solo se cobra el inicio de una sesión, y --no-ximilar-stream-images guarda únicamente el texto.

Inicio rápido

De cero a identificar en directo en 3 pasos

1

Instálalo

Un entorno virtual, el wheel de la versión publicada (con checksum verificado), los pesos de los modelos y los dos comandos en tu PATH. Usa el script, instala el mismo wheel desde PyPI con pip (los pesos se descargan aparte) o clona el repositorio y compílalo tú mismo. Docker y Windows están en la página de descarga.

$ curl -fsSL https://raw.githubusercontent.com/Ximilar-com/cardstream/main/scripts/install.sh | sh
# otras formas de instalar → cardstream.ai/download
$ pip install 'cardstream[client,onnx]'   # o bien: uv tool install 'cardstream[client,onnx]'
# el wheel no incluye los pesos: descomprime los dos tarballs de cardstream.ai/models
# y apunta los flags hacia ellos:
$ cardstream-web --segmentor-model segmentation_model/onnx/model.onnx \
    --embed-model similarity_model/onnx/model.onnx
$ git clone https://github.com/Ximilar-com/cardstream && cd cardstream
$ ./scripts/build-from-source.sh --models
$ source .venv/bin/activate
2

Conecta un sistema de identificación

Ximilar collectibles/v2 viene listo para usar: una clave de ximilar.com es la única credencial que necesita todo el sistema. O apunta ese mismo paso a tu propio reconocedor.

$ export XIMILAR_API_KEY=your-key
3

Apunta una cámara a una carta

Abre la interfaz en el navegador con tu webcam, o pásale tu show: pull por RTSP, o deja que OBS le envíe RTMP directamente. ¿Vas a abrir un solo set toda la noche? Preajústalo y el endpoint deja de adivinar: Pokémon en inglés de CRI son tres cosas menos en las que fallar. Indica --alphabet siempre que indiques --game, porque preajustar el juego desactiva la detección de sistema de escritura del propio endpoint. Añade --price-stats y cada coincidencia trae además precios de mercado en USD (mediana, rango y última venta) tanto en la carta como en el historial. Añade --ximilar-stream NEW para guardar el show en tu cuenta de Ximilar y revisarlo después.

$ cardstream-web
# → http://127.0.0.1:8001 — muestra una carta a la cámara

# Cartas Pokémon en inglés, un solo set (CRI - Chaos Rising), con precios de mercado en USD:
$ cardstream-web --game Pokemon --set-code CRI --alphabet latin --price-stats

Código abierto. Autoalojado. Tu directo, tu stack.

Sin plataforma intermediaria ni licencias por puesto: conecta la API de Ximilar o tu propio sistema de identificación y cardstream lo llama una vez por cada carta distinta, no una vez por fotograma. Da igual si haces breaks en Whatnot, llevas un show al estilo de Fanatics Live o transmites tu propio live commerce: pon cardstream en marcha esta misma noche con el hardware que ya tienes.