Todos los sistemas operativos200+ sitios monitoreadosSLA de respuesta <4h
App · Viajes · En construcción

Lee lo que ya reservaste y arma el día alrededor.

Intiner.ar toma los PDFs, los emails reenviados, las capturas y los archivos .ics que un viaje ya produce, lee los vuelos, hoteles y entradas que hay en ellos, pregunta solo por el dato que cambia el plan y devuelve un cronograma ordenado hora por hora.

Intiner.ar

No hay isotipo que mostrar: no se entregó ninguno, y el sistema de diseño no dibuja uno. Donde iría un logo, el nombre se compone en la tipografía display.

Nuestro rol
Diseño de producto + desarrollo
Superficies
Sitio público · app web · móvil · 20 emails
Etapa
En construcción
Idiomas
Español / inglés
34
Componentes

Núcleo, formularios, viaje y facturación

20
Emails transaccionales

HTML enviable, sin imágenes, sin webfonts

6
Tipos de bloque

El sistema decide dónde va cada uno

5
Pasos del asistente de perfil

Las respuestas pertenecen a la cuenta, no al viaje

Qué es

Un cronograma, no un buscador.

Intiner.ar es una app de viajes bilingüe que convierte la idea de un viaje en un plan que se puede seguir. Puedes empezar de cero, con destino y fechas, o cargar todo lo que ya reservaste: vuelos con escalas, hoteles, traslados, actividades, entradas. La app resuelve qué es cada documento, cuándo ocurre y dónde va en el día.

Lo que no hace define tanto como lo que hace. No vende ni compara vuelos, hoteles ni paquetes. No es un motor de reservas, y nunca compite con uno. Toma lo que el viajero ya tiene y devuelve un cronograma coherente, día por día y hora por hora, que no choca con nada confirmado.

El producto se construye sobre una idea: nada genérico. Cada bloque del itinerario cita el archivo del que se leyó ("Booking-Miraflores.pdf") o la preferencia de la que se sugirió ("sin gluten y comida local, a diez minutos del hotel"). Si una recomendación no puede explicar de dónde salió, no se hace. La misma regla atraviesa los datos: sin pronóstico más allá de los siete días que la API del clima realmente devuelve, sin estado de vuelo inventado, sin foto de stock supliendo un destino del que el sistema no tiene imagen.

Dónde vive
SuperficieDóndeQué
Sitio públicoWeb responsiveHero, cómo funciona, un día de ejemplo, cargar tus reservas, planes y pie. La puerta principal, con el conmutador ES/EN siempre visible en la barra y una sección oscura por página, cerca del cierre.
App webEscritorio primero, barra lateral de 238pxMis viajes · itinerario (día / mapa / documentos) · cargar reservas · mi perfil de viaje · asistente de registro · administración. La línea de tiempo es la pantalla principal; todo lo demás la apoya, y hay un solo botón primario por pantalla.
App móviliPhone, 390×844Las mismas pantallas en una columna, con una barra de pestañas de cuatro destinos y hojas inferiores en lugar de diálogos. La paridad es una regla: una función que existe en web y no en móvil es un bug, no una diferencia de plataforma.
Email transaccional20 archivos HTML autocontenidosBienvenida, verificación, asistente incompleto, itinerario listo, cambio de vuelo, pago fallido, cuota agotada, cuenta suspendida, viaje terminado y el resto; cada uno se abre en un navegador y se pega en cualquier proveedor de envío.
Qué hace

Cuatro cosas que tiene que hacer bien.

Cada una es una regla de producto antes que una pantalla. Rómpela y tendrás una interfaz que el producto no puede sostener.

01

Importar lo que ya está reservado

Cuatro formatos de entrada, un cronograma de salida: PDF, un email reenviado, una captura, un archivo .ics. El sistema lee qué es cada uno y conserva el enlace al archivo.

  • Vuelos con escalas, hoteles, traslados, entradas: clasificados automáticamente
  • Pregunta solo lo que cambia el plan: "el AR 1304 hace escala en Santiago, ¿sales del aeropuerto?"
  • Cada bloque conserva su documento de origen, así el itinerario siempre puede decir de dónde salió una hora
  • Un dato leído de un documento se corrige en el diálogo del bloque, no inline, y se avisa al viajero de que editarlo rompe el enlace al archivo
02

Una programación que se sostiene

El sistema ubica los bloques por sí mismo, y no deja que dos empiecen a la misma hora. Es una restricción dura, no una advertencia.

  • Dos bloques nunca comparten hora de inicio: el campo se marca, se ofrece el primer hueco libre y guardar sigue deshabilitado
  • Ubicación por tipo: un hotel cae en su día de check-in a las 15:00, un vuelo abre su día con el traslado al aeropuerto delante
  • Aceptar una recomendación la deja caer en el hueco real y el toast dice dónde quedó: "17:00, en el hueco libre del día"
  • Entre dos bloques, un tramo de viaje da tiempo puerta a puerta, distancia, tráfico y una alternativa, y se omite por completo cuando la API de rutas no devuelve nada
  • Un traslado o un hotel reservado después de que el itinerario existe se inserta donde corresponde, sin preguntar "¿qué día?"
03

Un perfil que puede explicarse

Cinco preguntas al registrarse (con quién viajas, tu ritmo, restricciones de comida, cuánto caminas, presupuesto por día) y pertenecen a la cuenta, no a un viaje.

  • Las respuestas se guardan una vez y alimentan cada recomendación futura; se editan después en "mi perfil de viaje"
  • Cada sugerencia cita la preferencia de la que salió; si no puede, no se muestra
  • Editable en el lugar: días, notas del día, títulos de actividades y notas personales; Enter confirma, Escape revierte
  • Un destino sin nada cargado ofrece armar el día desde las preferencias de la cuenta en lugar de mostrar una página vacía
04

Datos en vivo, con sus límites a la vista

Cuatro integraciones externas, cada una envuelta en un componente que muestra su propia procedencia y su propio estado de fallo.

  • Estado de vuelo con la hora vieja tachada junto a la nueva, más terminal, puerta, cinta y siempre una línea de frescura: un estado sin marca de tiempo es peor que ninguno
  • Un vocabulario de estados cerrado: a tiempo, demorado, cancelado, cambio de puerta, aterrizó. No se inventan etiquetas nuevas
  • Clima solo dentro de los siete días que la API devuelve; fuera de eso, una nota. Nunca un promedio ni una cifra histórica disfrazada de pronóstico
  • La foto del destino se resuelve una vez desde la API de lugares y se guarda en la base de datos del producto; la interfaz siempre lee la copia guardada, y solo un administrador puede reemplazarla
  • Cualquier integración puede faltar: la pieza muestra su estado honesto y el resto del itinerario sigue funcionando
Guía de estilo y marca

Papel antes que pantalla. Un solo azul para todo lo que se toca.

No se entregó un logo y el sistema no dibuja uno. Todo lo demás (el fondo de lino, el único azul de acción, los tres colores de estado, la serif editorial) es una decisión tomada a partir del brief y escrita junto a la razón por la que se tomó.

Paleta

Paper 1

#FAF6EF

El fondo bajo todo: un lino cálido. No hay blanco puro ni gris frío en ningún lugar del sistema; las tarjetas se apoyan un paso más claras, sobre paper-0 #FFFDF9.

Ink 900

#15130F

Texto primario y la única sección oscura que se permite por página. Un negro tostado en lugar de #000, para que pertenezca al papel.

Azul 600

#1B4DE4

El color de acción. Todo lo que se puede tocar, el número de día en la línea de tiempo y el ".ar" en itálica que hace de logo.

Clay 600

#C2542B

Secundario cálido: énfasis editorial, y el acento que marca los bloques de alojamiento en el itinerario.

Moss 600

#2F7D53

Confirmado. Solo un color de estado: nunca se toma prestado para decorar.

Amber 600

#A8760F

Falta un dato, y el medidor de gasto del admin por encima del 70% de su cuota.

Rust 600

#B3382C

Choque: dos bloques peleando por la misma hora. También el medidor por encima del 90%.

Estos son los colores de Intiner.ar, impresos aquí como documentación. Nada en werun.dev sale de ellos.

Tipografías

Instrument Serif

Display y el logotipo

76 / 54 / 38 / 28px, interlineado de 1.02 a 1.18, tracking negativo en todo. Una palabra azul en itálica es el único énfasis que un titular puede llevar, y nunca dos veces en el mismo titular. Es una sustitución declarada: no se entregaron binarios de fuentes de marca, así que las tres familias son suplentes de Google Fonts hasta que dejen de serlo.

Public Sans

Interfaz y cuerpo

Títulos a 24 / 19 / 16, cuerpo a 17 / 15 / 13. Sentence case en todas partes: las mayúsculas aparecen en exactamente dos lugares, el eyebrow de 12px con tracking de .09em y la línea de fecha del divisor de día.

DM Mono

Horas, códigos de vuelo, distancias y precios

13px con tabular-nums, para que una columna de horas de salida se alinee a lo largo de la página. Cada columna numérica de las pantallas de administración la usa.

Nombradas, no cargadas: esta página compone todas las familias de arriba con la tipografía propia de werun.dev.

Las reglas

Sin logo, y ninguno inventado

No se entregó un isotipo, así que el sistema no dibuja uno. Donde iría un logo, el nombre se compone en Instrument Serif con el ".ar" en itálica azul; sobre azul, la itálica pasa a clay. La carpeta de assets se deja deliberadamente vacía con una lista escrita de lo que todavía se debe: logo.svg y una versión para fondo oscuro, dos o tres fotografías de destinos y un set de iconos propio si alguna vez existe. Dibujar un símbolo que nadie pidió habría sido la respuesta rápida y la equivocada.

#8C8474 no es un color de texto

Mide 3.65:1 sobre papel, así que falla a cualquier tamaño y en cualquier nivel de importancia. El texto atenuado usa ink-450 #6F6657, que supera 4.5:1 en los cuatro tonos de papel; #8C8474 se reserva para rellenos, bordes e iconos decorativos. La regla existe porque el dato que más a menudo se compone demasiado claro es exactamente el que el producto está obligado a mostrar: la línea de frescura de un vuelo, una hora de salida tachada, la dirección postal en el pie de un email de marketing.

Un color de estado nunca es decorativo

Moss, amber y rust significan confirmado, falta un dato y choque, y nada más puede tomarlos prestados. El vocabulario detrás es cerrado (confirmado, falta un dato, se superpone, sugerido), así que ningún estado se transmite solo por el color. En la versión bilingüe la clave semántica queda en español y una prop de etiquetas escribe el texto visible: pasar la cadena en inglés directamente produciría las palabras correctas y un tono neutro, que es el semáforo apagándose en silencio.

Nada se sale de su caja, y la caja se mide a sí misma

Las tarjetas de dominio viven en un panel de 320px, una hoja móvil y una grilla de cuatro columnas, así que el ancho de la ventana no dice nada del espacio que tienen. Se degradan según su propio ancho con container queries: por debajo de 380px un evento del itinerario mueve su riel horario de 64px encima de la tarjeta, por debajo de 300px una tarjeta de vuelo suelta la ruta dibujada y apila los códigos de aeropuerto. Las grillas se escriben minmax(min(Npx,100%),1fr) porque un mínimo duro desborda en cuanto el contenedor es más angosto, y las palabras nunca se cortan: un título se achica un paso antes de partirse letra por letra.

Stack

Con qué está construido.

Next.jsReactPropiedades CSS personalizadasContainer queriesEditor.jsLucideGoogle PlacesGoogle RoutesGoogle WeatherAPI de estado de vuelosAPI de AnthropicEmail HTML

Cada proveedor vive en una variable de entorno

Ningún proveedor, clave o modelo está escrito en el código, incluido el modelo que genera los itinerarios, que se elige por variable para poder cambiarlo sin tocar la app. Es una decisión de diseño tanto como de backend: la interfaz nunca nombra un proveedor ni un modelo a un viajero, y el gasto en APIs de las pantallas de administración se agrupa por servicio (generación, lugares, rutas, clima, estado de vuelos) y no por marca, para que la pantalla siga siendo correcta el día en que cambia un proveedor.

Lo bilingüe cambió la forma de los componentes

Donde una cadena es a la vez una etiqueta visible y la clave que elige un color, la clave queda en español y una prop de etiquetas escribe el texto. Y ninguna prop es nunca una función: son componentes de cliente, y una función no cruza la frontera servidor/cliente; falla en tiempo de ejecución, no al compilar. Así que una tarjeta de viaje recibe "8 días" ya escrito en lugar de un número, el compositor toma las duraciones como un mapa en lugar de un formateador, y las duraciones viajan en minutos con el locale decidiendo cómo imprimirlas.

Las alturas de los emails se midieron, no se estimaron

Veinte archivos enviables, construidos como los clientes de correo exigen y no como la web se acostumbró: tablas de presentación anidadas, cada estilo inline, sin JavaScript, sin hojas externas, sin webfonts y sin imágenes en absoluto. Georgia, Arial y Courier New suplen a las tres familias, y los tokens se escriben como hex literal porque ningún cliente de correo resuelve propiedades personalizadas. Cada altura de vista previa se midió desde la tabla exterior a 640px en lugar de adivinarse, porque un número optimista recorta el pie legal, que es la única parte que no puede faltar.

Una API, dos cargadores

El sistema de diseño se previsualiza sin bundler; la app corre en Next.js con renderizado en servidor. Dos componentes cargan lo mismo de forma distinta a propósito: el envoltorio de iconos lee la geometría de Lucide desde un global aquí e importa desde npm allá, porque durante el renderizado en servidor no hay window, y un fallback dibujado en el servidor contra un glifo dibujado en el cliente es un error de hidratación en cada icono. La API pública y el marcado son idénticos, así que portar un cambio toca el cargador y nada más.

¿Construyes algo que tiene que ser honesto con sus datos?

Cuéntanos qué tiene que hacer y de dónde salen realmente los números. Te diremos qué hace falta y quién lo hace.

Sin compromiso. Solo una conversación.
Preguntas sobre Intiner.ar