Saltar al contenido

Abierto a oportunidades

Alfredo Mejía.

Construyo el backend y el frontend, y también el framework que los sostiene.

Ingeniero en Sistemas Computacionales. Escribo TypeScript sobre Bun y PostgreSQL. Publiqué Veloce-TS en npm y lo uso para construir lo que ves más abajo.

ubicación
Morelia, MX · remoto
ahora
Full-Stack en CustomsCity
publicado
veloce-ts@3.5.1 en npm
marketplace/checkout.service.ts
// el stock no se vende dos veces
const taken = await tx
  .update(variants)
  .set({ stock: sql`stock - ${qty}` })
  .where(
    and(
      eq(variants.id, line.variantId),
      gte(variants.stock, qty),
    ),
  )
  .returning({ id: variants.id })

if (taken.length === 0) {
  throw new Conflict('out_of_stock')
}
● 355 pruebas end-to-end en verde

01 Playground

Úsalo tú mismo, sin registrarte

Casi todos los portafolios enseñan capturas de pantalla. Aquí puedes usar la aplicación, y además ver el tráfico que genera contra la API.

proyectolos demás entran aquí conforme se terminan

Catálogo, carrito, checkout, pagos al vendedor y chat en vivo.

https://demo.alfredomejia.com.mx/demo?rol=comprador

La aplicación completa corre aquí dentro. Escoge con qué par de ojos quieres verla.

Sin registro, sin contraseña, sin tarjeta.

Y esto es lo que pasa por debajo

Un iframe enseña el frontend. Esta consola enseña el backend: 9 peticiones reales contra la misma API, encadenadas, con la respuesta tal como llega. Incluidas las que fallan a propósito.

consola de API
sesión sin iniciar
  1. 01GET/api/categories

    Listar categorías. Ruta pública. Sin sesión, sin encabezados especiales.

  2. 02GET/api/products?q=talavera&limit=3

    Buscar "talavera". Búsqueda de texto completo en PostgreSQL. La columna de búsqueda es generada y pasa por unaccent, así que "piñata" y "pinata" caen en el mismo lugar.

  3. 03GET/api/products/sin-resultado

    Abrir la ficha del primer resultado. El slug sale de la respuesta anterior: la consola encadena peticiones reales.

  4. 04GET/api/cart

    Pedir el carrito sin sesión. El guard corta antes de que la petición toque la base de datos.

  5. 05POST/api/demo/session

    Pedir una sesión de comprador. La demostración entrega la sesión sin contraseña, y solo porque corre con DEMO_MODE encendido. En la API normal ese endpoint no existe: responde 404.

  6. 06GET/api/cart

    Pedir el carrito, ya con sesión. Mismo endpoint que falló hace dos pasos. Ahora responde, y el total trae el envío por separado.

  7. 07POST/api/cart/items

    Agregar una pieza al carrito. El precio se congela al momento de agregar. Si la tienda sube el precio después, se cobra el menor de los dos.

  8. 08GET/api/seller/sales

    Asomarse al panel de vendedor. La sesión es de comprador y el panel pide rol de vendedor. El guard corta en la puerta, antes del handler.

  9. 09GET/api/orders/3f2b9a1c-7d84-4e26-9b05-2a6c18f4e7d3

    Pedir un pedido que no es tuyo. Aquí sí hay recurso de por medio, y la respuesta es 404. Un pedido de otra persona contesta lo mismo que un id inventado: un 403 delataría que ese pedido existe.

02 Proyectos

Lo que he construido

Seis cosas que construí de punta a punta. La primera es el framework sobre el que corren casi todas las demás.

Framework open source · 2025 — hoy · en desarrollo activo

Veloce-TS

Un framework web de TypeScript con decoradores, DI y OpenAPI, publicado en npm.

Escribí el framework que quería usar: controladores declarativos con decoradores, inyección de dependencias, validación con Zod y un esquema OpenAPI 3.1 que se genera solo a partir de los tipos. Corre sobre Bun, Node, Deno y Workers.

3.5.1
versión en npm
4
runtimes
MIT
licencia
  • Decoradores de controlador, ruta, guard y middleware con tipos completos.
  • Contenedor de inyección de dependencias por constructor.
  • Documentación OpenAPI derivada de los esquemas Zod, no escrita a mano.
  • Gateways de WebSocket con el mismo modelo de decoradores que el HTTP.
  • TypeScript
  • Bun
  • Hono
  • Zod
  • OpenAPI 3.1

Aplicación full-stack · 2026 · terminado

Marketplace multivendedor

pruébalo arriba

Un marketplace completo: catálogo, carrito, checkout, pagos al vendedor, disputas y chat en vivo.

Varias tiendas venden en un mismo sitio. Un pedido se parte en subpedidos, uno por vendedor, y cada uno sigue su propio camino: se envía, se recibe, se opina y se le paga al vendedor. El dinero no se mueve hasta que el comprador confirma que recibió. Vive en tres repos: la API, la interfaz y los esquemas de Zod que ambas comparten, para que un cambio de contrato rompa la compilación y no la producción.

79
rutas HTTP
22
tablas
355
pruebas e2e
  • El checkout concurrente no vende de más: el stock se descuenta con un UPDATE condicional dentro de la transacción.
  • Un índice único parcial impide que el mismo comprador tenga dos pedidos pendientes de pago a la vez.
  • El webhook de pago es idempotente por id de evento; los reintentos del proveedor no duplican nada.
  • La autorización nunca sale del token: cada petición de vendedor relee su tienda en la base.
  • Pedir un recurso de otra persona responde 404, no 403: un 403 confirmaría que ese id existe.
  • Chat por WebSocket con boleto de un minuto, en vez de mandar el token en la URL.
  • React
  • TypeScript
  • Veloce-TS
  • PostgreSQL
  • Drizzle
  • WebSocket

SaaS multi-tenant · 2025 — hoy · en desarrollo activo

Pensum

Plataforma para escuelas privadas: aulas, calificaciones, reportes SEP y avisos por WhatsApp.

Cada escuela vive en su propio subdominio con sus datos aislados. Los profesores capturan calificaciones, el sistema arma las boletas en PDF y los concentrados en Excel, y avisa a los padres por WhatsApp sin pagar la API de Meta.

por tenant
aislamiento
pg-boss
cola de jobs
Stripe
pagos
  • Multi-tenant por subdominio, con el tenant resuelto antes de que la consulta toque la base.
  • Notificaciones por WhatsApp con Baileys sobre WebSocket, sin costo por mensaje.
  • Boletas en PDF y concentrados en Excel generados en el servidor.
  • Suscripciones y webhooks de Stripe para el cobro de cada escuela.
  • Bun
  • Veloce-TS
  • PostgreSQL
  • Drizzle
  • React
  • Stripe
  • pg-boss
código privado

Bot de scraping · 2026 · en desarrollo activo

GPU Hunter

Vigila siete tiendas de México y Estados Unidos y avisa por Discord cuando baja una GPU.

Cada tienda expone sus precios de una forma distinta: feed Atom, JSON-LD, GraphQL de Magento, Store API de WooCommerce, HTML renderizado en servidor. El bot habla el idioma de cada una, guarda el histórico en SQLite y solo avisa cuando algo cambió de verdad.

7
fuentes
1
dependencias
MX + USA
países
  • Siete adaptadores distintos bajo una sola interfaz de fuente.
  • Avisa por baja de precio, vuelta de stock o entrada bajo el tope, nunca por repetición.
  • Respeta los límites de cada tienda; las que piden reto de Cloudflare quedan desactivadas, no rodeadas.
  • Bun
  • TypeScript
  • SQLite
  • Discord webhooks
código privado

Aplicación full-stack · 2026 · terminado

Chat con IA en streaming

pruébalo arriba

La respuesta llega token a token, se puede cortar a media frase, y cada turno deja contados sus tokens y su costo.

Un chat sobre la API de un modelo, con conversaciones persistidas y documentos adjuntos que entran al contexto. Lo construí para contestar una pregunta concreta sobre mi propio framework: si sus piezas de streaming y cancelación aguantan un caso real. Aguantan, y el camino dejó tres hallazgos escritos en el README.

23
rutas HTTP
8
tablas
44
aserciones
  • Cancelar corta la generación, no solo la pantalla: si solo se cierra el canal, el servidor sigue produciendo tokens que ya nadie va a leer pero que sí se cobran.
  • Lo difícil de eso fue que el bucle del proveedor termine no quiere decir que la respuesta terminara: un adaptador que corta limpio al abortar sale por el mismo camino que uno que acabó. Lo que distingue los dos casos es la señal.
  • El mensaje del asistente se inserta vacío antes del primer token. Si el proceso se cae a media respuesta queda el parcial, y no un hueco donde el usuario cree que escribió algo que nunca existió.
  • El tope de gasto se revisa antes de llamar al modelo y contando los documentos adjuntos, que viajan en cada turno. Un bucle aquí no es un error de log: es una factura.
  • Un yield por token hace que React re-renderice por carácter y el chat se traba justo cuando debería verse vivo; se agrupa por cuadro de 16 ms y se vuelca lo que quede al final.
  • El modelo vive detrás de una interfaz con dos adaptadores. La demostración pública habla con Gemini de verdad, y lo que la hace sostenible no es la confianza sino el tope: el gasto se revisa antes de cada llamada y el adaptador falso sigue ahí para las pruebas, que no deberían costar dinero.
  • React 19
  • assistant-ui
  • Veloce-TS
  • PostgreSQL
  • Drizzle
  • shiki
  • Docker

Aplicación full-stack · 2025 — 2026 · terminado

Sistema de citas médicas

pruébalo arriba

Agenda clínica: el paciente ve en el mapa dónde queda el consultorio y reserva; el doctor atiende y escribe el historial.

Tres roles con vistas distintas sobre los mismos datos. El paciente busca especialista, ve los consultorios sobre un mapa y agenda; el doctor publica sus horarios, atiende y registra la consulta; el administrador mira el conjunto. Nació como un backend en Express y está portado a Veloce-TS con Drizzle.

34
rutas HTTP
7
tablas
35
aserciones
  • Un horario no se reserva dos veces: un índice único sobre doctor, fecha y hora lo impide en la base, no solo en el código.
  • El rol no basta para autorizar: ser doctor no da acceso a la cita de otro, así que cada handler comprueba la pertenencia.
  • El mapa es Leaflet sobre OpenStreetMap, no Google: una llave de Google viajaría en el JavaScript del navegador.
  • Las coordenadas admiten nulo; un consultorio sin geocodificar no rompe el mapa, y la interfaz lo dice.
  • Los adjuntos no se sirven en abierto: la descarga va por el id del documento, que es lo único que dice de qué paciente es el archivo.
  • Cancelar pide el motivo y lo guarda: quien recibe el aviso se entera de por qué, no solo de que la cita desapareció.
  • La tabla de citas se vuelve tarjetas en el teléfono: cinco columnas a 390 px obligan a arrastrar de lado para alcanzar las acciones.
  • Recordatorios por correo a las 08:00, con el límite conocido de que viven en el proceso.
  • React 19
  • Mantine
  • Veloce-TS
  • PostgreSQL
  • Drizzle
  • Leaflet
  • Docker

03 Stack

Con qué trabajo

Herramientas que uso a diario, no una lista de todo lo que he tocado una vez.

Lenguajes

  • TypeScript
  • JavaScript
  • Java
  • Python
  • PHP
  • C#
  • SQL

Backend

  • Bun
  • Node.js
  • Veloce-TS
  • Hono
  • Drizzle
  • Prisma
  • Zod
  • WebSocket

Frontend

  • React
  • Next.js
  • Astro
  • Tailwind CSS
  • React Query
  • Vite

Datos e infraestructura

  • PostgreSQL
  • MongoDB
  • Redis
  • RabbitMQ
  • SQLite
  • Docker
  • Nginx
  • Git

Práctica

  • Pruebas e2e
  • OpenAPI
  • Código seguro
  • Pentesting web
  • CI/CD

04 Trayectoria

Por dónde he pasado

De soporte técnico a construir plataformas completas, y a publicar las herramientas que uso para hacerlo.

  1. Sep 2025 — Actualidad

    Desarrollador Full-Stack · CustomsCity

    • Desarrollo y mantenimiento de aplicaciones web completas, de la base de datos a la interfaz.
    • Diseño e implementación de funcionalidades en frontend y backend, con foco en código mantenible.
    • Optimización de consultas e integración de APIs entre sistemas.
  2. Ene 2025 — Ago 2025

    Soporte técnico · Facturación Móvil

    • Asistencia a clientes en la implementación de facturación electrónica (CFDI).
    • Diagnóstico de problemas técnicos y capacitación de usuarios.
    • Cumplimiento de normativa fiscal del SAT en los procesos internos.
  3. Feb 2022 — Jul 2022

    Desarrollador web · EpoxyMax

    • Sitio web en WordPress para una empresa de diseño de interiores.
    • Gestión de contenido y promoción de cursos; 200 seguidores en 3 meses, 30% convertido a cliente.

Formación

Ingeniería en Sistemas Computacionales

Instituto Tecnológico Superior de Huetamo · titulado

Reconocimientos

  • 01 Primer lugar — Concurso de programación, Día del Programador 2020
  • 02 veloce-ts en npm — Framework TypeScript multi-runtime, open source, MIT
  • 03 INNOVATEC · HACKATEC · CODING CUP — Participante TecNM 2022

05 Contacto

Hablemos

Estoy abierto a oportunidades como desarrollador full-stack, de preferencia donde el backend pese tanto como la interfaz.

Morelia, Michoacán, MX · trabajo remoto sin problema. Español nativo, inglés técnico.

GitHub
ExcessHawk ↗
npm
veloce-ts ↗
LinkedIn
excesshawk ↗
Disponibilidad
abierto a propuestas