dev.gramastudio.cl · portafolio técnico

Software a medida,
del sensor a la pantalla.

Construimos sistemas que leen el mundo físico, lo ordenan y lo dejan operable: control industrial, plataformas web y datos en producción.

SvelteKit Bun Python TypeScript PostgreSQL MongoDB MQTT ESP32 Docker Elastic nginx
[01] Hardware · firmware · cloud producto

Termógrafo · cadena de frío · exportación frutícola
Captura de Termógrafo · cadena de frío · exportación frutícola

Trazabilidad térmica por palet, no por contenedor

La fruta fresca de exportación pierde condición en tramos que nadie ve: packing, carga, ruta, puerto, embarque. Los data loggers pasivos miden un punto por contenedor y se descargan recién al final del viaje, cuando el rechazo ya ocurrió.

Tres piezas. Un nodo por palet (ESP32-C3 con temperatura, humedad e impacto) que forma malla ESP-NOW y duerme entre lecturas. Un gateway por contenedor que concentra la malla y sube por NB-IoT con una sola SIM y buffer local. Y una plataforma Bun + Elysia sobre PostgreSQL que ingesta, alerta según el tipo de fruta y deja el registro del viaje. El nodo se provisiona por Bluetooth desde una app Expo y se actualiza por OTA con particiones duales.

  • Malla ESP-NOW Los nodos se concentran en el gateway: una SIM NB-IoT por contenedor, no una por palet.
  • BLE + OTA Provisioning por Bluetooth desde la app y actualización remota versionada por semver.
  • Continuidad Buffer local en el gateway: perder cobertura no corta el registro del viaje.
ESP32-C3ESP-NOWNB-IoTC++ / PlatformIOBun + ElysiaDrizzlePostgreSQLSvelteKitExpo
Arquitectura Termógrafo
Arquitectura de TermógrafoLos nodos sensores de cada palet transmiten por malla ESP-NOW al gateway del contenedor, que guarda 30 días de buffer local y sube por NB-IoT con una sola SIM a la API de ingesta en Bun y Elysia, que persiste en PostgreSQL y alimenta el frontend SvelteKit de trazabilidad. La app Expo provisiona los nodos por Bluetooth.ESP-NOWBLENodo · palet 01temp · humedadNodo · palet 02ESP32-C3 · sleepNodo · palet nfirma por mediciónGatewaybuffer local 30 dNB-IoT1 SIMAPI ingestaBun + ElysiaPostgreSQLDrizzleApp Expoprovisioning BLESvelteKittrazabilidad
TRL 4 prototipo integrado
1 SIM por contenedor
por palet resolución de medición
[02] IoT industrial · on-premise cliente

aplik · ceapro · industrial
Captura de aplik · ceapro · industrial

Equipos de terreno hablando un solo idioma

Cámaras, PLC, radar y GPS Trimble instalados en faena, cada uno con su propio protocolo, su propio software y ningún lugar común donde mirar lo que está pasando.

Un controlador en Python por tipo de equipo publica a un broker MQTT con ACL por tópico. El core consume ese flujo, aplica las reglas de negocio y alertas, y persiste en PostgreSQL. Sobre eso, una API HTTP y un frontend web con WebSocket para ver el estado en vivo. Todo en Docker Compose, desplegado on-premise en la red del cliente.

  • Drivers por equipo Un controlador aislado por dispositivo: agregar hardware nuevo no toca el core.
  • Bus MQTT con ACL Tópicos y permisos explícitos por dispositivo, en vez de integraciones punto a punto.
  • Deploy versionado Imágenes con bump de versión y compose reescrito en cada release, sin pull desde internet.
PythonMQTT / MosquittoPostgreSQLSvelteKitDockerWebSocket
Arquitectura aplik
Arquitectura de aplikCada equipo de terreno tiene su propio controlador en Python que publica a un broker MQTT con ACL por tópico. Desde ahí el core aplica las reglas y alertas y alimenta el frontend por WebSocket, mientras la API persiste en PostgreSQL.CámaraPLCRadarTrimbleControladoresuno por equipoBroker MQTTmosquitto · ACLCorereglas y alertasAPIHTTPFrontendWebSocketPostgreSQL
4 tipos de equipo
24/7 operación continua
on-prem infra del cliente
[03] Control de PLC · alimentación colaboración

ioFish Suite · acuicultura · salmonicultura
Captura de ioFish Suite · acuicultura · salmonicultura

Alimentar según lo que el centro está midiendo

En un centro de cultivo la alimentación decide el costo y el crecimiento. Los datos de ambiente, equipos y consumo llegan tarde y dispersos, y la dosificación termina siendo por criterio y no por medición.

ioFish integra directamente con PLC industriales (WAGO, Phoenix Contact) y ajusta la dosificación por jaula en tiempo real, cruzando ambiente, conducta y pronóstico. Opera de forma autónoma en el borde con buffer local de 30 días, de modo que un corte de enlace no detiene la alimentación ni pierde trazabilidad.

  • ioFeed Alimentación adaptativa y anticipada: adelanta o posterga según condiciones proyectadas.
  • Integración PLC Protocolos industriales sobre WAGO y Phoenix Contact, con ajuste por jaula.
  • Autonomía en el borde 30 días de buffer local: la operación no depende de la conectividad del centro.
PLC WAGOPhoenix ContactEdge computingSvelteKitElasticDocker
Ver sitio iofish.cl
Arquitectura ioFish Suite
Arquitectura de ioFish SuiteLos sensores de ambiente y los PLC WAGO y Phoenix Contact se integran en un controlador de borde que opera de forma autónoma con 30 días de buffer. Ese controlador sube al cloud de ioFish, que alimenta el panel multi-centro y el módulo ioFeed, encargado de bajar la consigna de dosificación a cada jaula.industrialconsignaSensoresO₂ · temperaturaPLCWAGO · PhoenixControlador edgeautónomo · buffer 30 dCloud ioFishingesta y reglasioFeeddosis por jaulaPanelmulti-centroJaulasración kg/h
30 d buffer sin enlace
por jaula dosificación
FCR métrica objetivo

Atribución ioFish Suite es producto de su propio equipo. Mi participación fue como colaborador: frontend y reestructuración de la arquitectura en el ámbito de ioFeed.

[04] Producto social · monorepo producto

ludefi · producto gramastudio
Captura de ludefi · producto gramastudio

Competir con los amigos, con reglas y con historial

Las apuestas entre amigos viven en un grupo de chat: nadie recuerda quién dijo qué, no hay historial y siempre se discute el resultado.

Grupos privados donde se crean actividades, eventos y torneos con apuestas asociadas. API en Bun + Elysia sobre MongoDB, auth con JWT firmado (HS256) e invitaciones con vencimiento. Cada acción relevante queda registrada por un servicio de eventos, así el historial es la fuente de verdad y no la memoria del grupo.

  • Log de eventos Toda acción pasa por un EventService: auditoría y ranking salen del mismo registro.
  • Migraciones idempotentes Scripts que se pueden correr de nuevo sin romper datos existentes.
  • Pruebas en serio Unitarias con Vitest, E2E con Selenium y una batería aparte de pruebas de seguridad.
BunElysiaMongoDBSvelteJWT / joseVitestSelenium
Arquitectura ludefi
Arquitectura de ludefiEl frontend Svelte habla por HTTP con JWT a la API en Bun y Elysia, que persiste en MongoDB vía Mongoose. Toda acción relevante pasa además por un EventService que deja el registro del que salen la auditoría y el ranking. Una batería de pruebas Vitest y Selenium corre contra el mismo esquema.HTTP · JWTMongooseFrontendSvelte · hash routingAPIBun + Elysia · JWTMongoDBgroups · bets · eventsEventServiceauditoría y rankingPruebasVitest · Selenium
6 colecciones de dominio
E2E cobertura Selenium
multipart deploy api / front
[05] Producto web · SvelteKit 5 producto

juntix · producto gramastudio · en producción
Captura de juntix · producto gramastudio · en producción

Todo el evento en un enlace, no en el chat del grupo

Organizar algo entre varios es perseguir confirmaciones, cuadrar cuánta comida comprar, anotar quién puso cuánto y quién trae qué. Todo repartido entre mensajes que se pierden.

El anfitrión arma el evento y comparte un enlace con token: los invitados confirman sin crear cuenta. Sobre esa base hay diecinueve módulos que se encienden según el tipo de evento —invitados, alimentos, presupuesto, gastos y deudas, regalos, colecta, fotos, muro, amigo secreto—. SvelteKit 2 con Svelte 5 en runes resuelve páginas, endpoints y hooks; Drizzle sobre SQLite libSQL persiste en un volumen del contenedor; y dentro del mismo proceso corren tareas node-cron que mandan recordatorios, bloquean los eventos que ya empezaron y purgan las fotos vencidas.

  • Sin contraseñas Better Auth con magic link para el anfitrión; el invitado ni siquiera necesita cuenta.
  • Módulos por evento Un catálogo único decide qué pestañas ve cada evento y cuáles abre el pago con Mercado Pago.
  • Privacidad por defecto Las fotos se purgan a los 14 días; solo cuatro rutas son indexables y el resto va con noindex y CSP.
SvelteKit 2Svelte 5 runesDrizzleSQLite / libSQLBetter AuthMercado Pagonode-cronResend
Ver sitio juntix.cl
Arquitectura juntix
Arquitectura de juntixEl invitado entra por un enlace con token y confirma sin crear cuenta; el anfitrión trabaja en el dashboard. SvelteKit resuelve páginas, endpoints y hooks en el mismo proyecto: consulta con Drizzle sobre SQLite libSQL en un volumen del contenedor, delega la autenticación en Better Auth con magic link enviado por Resend junto al archivo .ics, recibe el webhook de Mercado Pago que habilita los módulos de pago, y guarda las fotos en otro volumen. Dentro del mismo proceso corren tareas node-cron que mandan recordatorios y purgan las fotos vencidas.RSVPpago profotospurgaInvitadolink con tokenAnfitrióndashboardMercado PagowebhookSvelteKithooks + endpointsDrizzleSQLitelibSQL · volumenBetter Authmagic linkResendcorreo · .icsUploadsvolumennode-cronen proceso
19 módulos del dashboard
0 contraseñas
14 d retención de fotos
[06]

Qué hacemos, en concreto

Cuatro frentes que se combinan según el proyecto. La mayoría de las veces empiezan en el mundo físico y terminan en una pantalla que alguien usa todos los días.

01

Hardware y tiempo real

Firmware propio sobre ESP32, PLC industriales y equipos de terreno integrados por malla o bus de mensajería, con operación autónoma cuando se cae el enlace.

ESP-NOWMQTTPLCNB-IoTEdge
02

Aplicaciones web

Productos completos en SvelteKit y Bun: autenticación, dominio, panel de administración y una UI que aguanta uso diario real.

SvelteKitBunTypeScriptSvelte 5
03

Datos y observabilidad

Modelado y migraciones sobre Postgres, Mongo y SQLite, más métricas e índices en Elastic para saber qué está pasando antes de que reclamen.

PostgreSQLMongoDBElasticDrizzle
04

Deploy y operación

Un estándar de despliegue común: build local, imagen versionada, envío al servidor y compose. Mismo procedimiento en todos los proyectos.

DockernginxComposeScripts
[07] Contacto

¿Tienes algo que medir,
controlar o poner en línea?

contacto@gramastudio.cl

Cuéntanos qué equipo, qué dato o qué producto tienes en mente. Respondemos con una idea de alcance, no con un formulario.