Desarrollo web y software a medida

Escrito línea a línea. Para ti.

Webs, paneles y aplicaciones internas construidos en torno a tu proceso. Sin plantillas ni plugins que arrastran peso.

// Fecha de cobro: el último día real del mesexport function chargeDate(key: string, offset = 0): string {  const year = Number(key.slice(0, 4))  const month = Number(key.slice(5, 7))  const charge = new Date(year, month + offset - 1, 1)  const cy = charge.getFullYear()  const cm = charge.getMonth() + 1  // El día 0 del mes siguiente devuelve el último de este,  // así un 31 nunca se desborda al mes que viene.  const lastDay = new Date(cy, cm, 0).getDate()  const mm = String(cm).padStart(2, "0")  return `${cy}-${mm}-${lastDay}`}
// Contador animado. Si el usuario pide reducir// movimiento, se escribe la cifra final y punto.const animateCount = el => {  const target = parseFloat(el.dataset.count)  const t0 = performance.now(), dur = 1400  const tick = now => {    const p = Math.min(1, (now - t0) / dur)    el.textContent = Math.floor((1 - (1 - p) ** 3) * target)    if (p < 1) requestAnimationFrame(tick)  }  requestAnimationFrame(tick)}// Solo arranca cuando la cifra entra en pantalla
// El brillo que sigue al cursor solo se activa donde// hay cursor real. En móvil ni se registra el evento,// que es donde más cuesta cada milisegundo de más.if (matchMedia('(pointer:fine)').matches) {  document.querySelectorAll('[data-spotlight]').forEach(el => {    el.addEventListener('mousemove', e => {      const r = el.getBoundingClientRect()      el.style.setProperty('--mx', (e.clientX - r.left) + 'px')      el.style.setProperty('--my', (e.clientY - r.top) + 'px')    })  })}// El CSS pinta el degradado en esas coordenadas
// Cada persona escribe su móvil de una forma.// Lo normalizamos al formato internacional antes// de enviarlo, para no perder un contacto.function normalizePhone(raw) {  const d = raw.replace(/\D/g, '')  if (d.startsWith('34') && d.length === 11) return '+' + d  if (d.length === 9) return '+34' + d  return '+' + d}// Y solo después se valida, ya normalizadoconst phone = normalizePhone(input.value.trim())if (phone.replace(/\D/g, '').length < 9) {  return show('Introduce un número válido.')

Desde una web corporativa hasta el sistema que mueve tu operativa.

Mismo criterio técnico en todo, tanto si son cinco páginas como si es un panel con usuarios y permisos.

Páginas web a medida Corporativas, landings y sitios de servicio. Rendimiento, accesibilidad y SEO técnico desde el primer día, no como parche final.
Paneles de gestión El cuadro de mando de tu negocio: tus datos, tus estados, tus permisos. Lo que ninguna herramienta de catálogo te deja modelar.
Portales de cliente Área privada donde tus clientes consultan pedidos, facturas o expedientes sin tener que llamarte para preguntarlo.
Apps internas Herramientas para tu equipo: partes de trabajo, inventario, incidencias. Diseñadas sobre cómo trabajáis de verdad.
Integraciones y APIs Conectar tu web con tu ERP, tu CRM o tu facturación. También construir la API que tu propio software necesita exponer.
Tiendas y pagos Comercio con pasarela real, control de stock y los flujos de pedido que tu negocio necesita, no los del plugin de turno.
Detrás de cada línea

Cuatro decisiones que no se ven en una demo.

El código de arriba es real y está en producción. Esto es lo que evita cada fragmento, que es lo que de verdad te acaba importando.

facturacion.ts Cobrar el 31 en un mes de 30

Calcular el último día real del mes evita cobros que no salen o salen tarde. En febrero, ese fallo aparece dos veces al año.

contadores.js Animaciones que respetan al usuario

Si alguien tiene activado reducir movimiento en su sistema, ve la cifra final directamente. La accesibilidad no es una casilla, es código.

spotlight.js No gastar batería en móvil

El efecto que sigue al cursor ni siquiera se registra donde no hay cursor. Menos trabajo para el móvil, más fluidez donde más cuesta.

telefono.js Que el formulario no rechace a un cliente

Cada persona escribe su móvil de una forma. Normalizarlo antes de enviarlo evita perder contactos por un espacio de más.

Todos prometen velocidad. Nosotros la medimos.

Web real que hemos construido, medida con Lighthouse, la herramienta del propio Google. Sin retoques.

Resultado en escritorio Lighthouse · 26 ago 2026
99
RendimientoVelocidad
91
AccesibilidadUso real
100
Buenas prácticasCalidad
100
SEOTécnico
En móvil, el mismo sitio marca 93 en rendimiento y mantiene 100 en buenas prácticas y SEO. Medición de laboratorio: el sitio aún no acumula tráfico suficiente para datos de usuarios reales.

El rendimiento no es un extra que se añade al final. Sale de decidir bien desde el principio: qué carga y cuándo, cuánto pesa cada imagen, qué scripts sobran de verdad.

Por eso una plantilla con quince plugins nunca llega a estos números, por mucho que se le instale un optimizador encima.

Por qué te importa

Tu web compite por dos cosas a la vez: que Google te coloque arriba y que quien entra no se marche antes de leerte. Las dos dependen de que cargue rápido. Por eso lo medimos y te enseñamos el informe, en vez de decirte que quedó muy bonita.

¿Tienes un proceso que ninguna herramienta cubre?

Cuéntanoslo y te decimos qué construiríamos, por fases y qué verías funcionando primero.

Cuéntanos tu caso

Decisiones técnicas que te ahorran dinero en dos años.

  • Tipado estricto donde importa. TypeScript en la lógica de negocio: los errores aparecen al escribir el código, no cuando un cliente intenta pagar.
  • Sin dependencias de más. Cada librería que se añade es peso, superficie de fallo y una actualización futura. Si se resuelve con veinte líneas propias, se escriben.
  • Degradación elegante. Si falla un script externo o el usuario navega con el teclado, la web sigue siendo usable. No es opcional, es parte del trabajo.
  • Datos estructurados y semántica correcta. Lo que hace que Google y las IA entiendan qué eres, en vez de adivinarlo.
  • Todo versionado. Cada cambio queda registrado y es reversible. Si algo se rompe, se sabe qué lo rompió y se vuelve atrás.
Qué te llevas

Todo el mundo dice que el código es tuyo. Esto es lo que significa aquí.

Si un día decides seguir con otro equipo, te vas con todo funcionando. Sin rehenes.

Repositorio a tu nombre

Desde el primer commit, no un ZIP al final del proyecto. Ves cada cambio según se hace, no cuando te lo entregamos.

Documentación de lo construido

Cómo se despliega, cómo se configura y dónde está cada cosa. Para que otro equipo pueda continuar sin arqueología.

Accesos a tu nombre

Dominio, hosting y cuentas de servicio a nombre de tu empresa, no de la agencia. Es tu infraestructura.

Sin permanencia

No hay contrato que te ate ni licencia propietaria que caduque si te vas. Nos quedamos porque quieras, no porque no puedas salir.

Con qué está hecho.

Frontend
ReactReactInterfaces
Next.jsNext.jsWeb y rendimiento
TypeScriptTypeScriptLógica sin sorpresas
Tailwind CSSTailwindDiseño de UI
Backend y datos
Node.jsNode.jsAPIs
PythonPythonLógica e IA
PostgreSQLPostgreSQLBase de datos
SupabaseSupabaseAuth y datos
Infraestructura
GitHubGitHubVersionado y CI
VercelVercelDespliegue
DockerDockerEntornos reproducibles
StripeStripePagos

Elegimos según el problema, no según la moda. Si tu caso pide algo distinto de esta lista, lo decimos.

Lo que suele preguntarse antes de encargar un desarrollo.

¿Hacéis también páginas web, no solo aplicaciones? +
Sí. Webs corporativas, landings y tiendas, con el mismo criterio técnico que un panel interno: rendimiento medido, accesibilidad y SEO técnico desde el primer día, no como parche al final.
¿Por qué a medida y no una plantilla? +
Una plantilla es más barata al principio y más cara después: acabas pagando plugins, arrastrando código que no usas y peleándote con lo que no encaja. A medida se construye solo lo que necesitas, y eso se nota en velocidad y en mantenimiento.
¿El código es mío? +
Sí. El repositorio está a tu nombre desde el primer commit, no es una entrega final. Los accesos, dominios y cuentas de servicio también son tuyos.
¿Cuánto tarda? +
Según el alcance, pero trabajamos por fases: ves una primera versión funcionando en semanas y decides sobre algo real, no sobre un documento.

¿Nos cuentas qué necesitas construir?

En 15 minutos te decimos si tiene sentido hacerlo a medida y cómo lo enfocaríamos. Sin compromiso.

Cuéntanos tu caso