A flight metasearch platform that lets travelers compare and book flights across hundreds of airlines and travel agencies in a single search. The name “Paglipat” comes from Tagalog, meaning “to transfer” or “to move,” reflecting the essence of travel.
Originally built on Next.js, Paglipat was rebuilt from the ground up as a static-first, edge-optimized site: faster to load, cheaper to run, and indexable in 15 locales worldwide. Instead of rendering pages on demand behind a server, I precompute them at build time and serve them from the edge, so the first paint does not wait on a runtime. The metasearch itself still queries live fares, but everything around it (the landing pages, the multilingual content, the routing) is static and cached close to the user.
Features
- Multi-Source Flight Search: Aggregates fares from hundreds of airlines and travel agencies, surfacing the cheapest first
- Flexible Trip Planning: One-way, round-trip, and multi-city searches with adults, children, and infants across cabin classes
- Full Travel Stack: Flights plus hotels, eSIM data plans, and airport transfers
- Global By Default: 15-locale routing (including RTL Arabic) with hreflang, per-locale sitemaps, and currency handling
- Edge Localization: Geo-aware locale detection and apex-to-www redirects handled at the CDN edge
The search covers the shapes people actually book: a quick one-way, a round-trip, or a stitched multi-city itinerary, each with passenger mixes of adults, children, and infants and a choice of cabin class. Because Paglipat is a full travel stack rather than flights alone, the same trip can carry over into hotels, an eSIM data plan for the destination, and an airport transfer, so the booking flow does not stop at the boarding pass.
Being global is the default rather than an add-on. Fifteen locales are wired through the routing layer, including right-to-left Arabic, and each one ships proper hreflang annotations, its own sitemap, and currency handling so search engines and travelers both land on the correct localized page. Locale detection and the apex-to-www redirect run at the CDN edge, which keeps that logic off the origin and out of the critical path.
Mobile apps
The Flutter app is live on Google Play and the App Store. Cheap flights sit on top. Monthly hotel stays sit next to short trips. A price calendar shows cheaper dates on the same route. Saved deals and recent searches persist without an account.
Paglipat is a search app. It compares fares and hotel rates, then sends you to a booking partner to pay. The card never goes through Paglipat. Ticket changes, refunds, and booking support stay with the partner.
The website remains the full product, including the concierge.
AI relocation concierge
The site runs a live assistant that answers visa, accommodation, and flight questions. It is a tool-calling agent rather than a chat window bolted onto a landing page: the model is not trusted to remember a visa rule, only to decide which tool can look it up.
- Five tools, not a chatbot:
check_visa,get_checklist,read_guide,search_hotels, andflight_prices. Each tool description states when to call it, not only what it does, because recent models reach for tools conservatively by default - Two models, routed: a fast model classifies the turn and a stronger one answers only when the turn earns it, so simple questions do not pay for expensive reasoning
- Grounding over recall: no day count, fee, or eligibility rule may come from model memory. Every rule is returned with the date it was verified, and the model may only offer articles that exist in the catalog, so a retired post never turns into a dead link inside an answer
- Prompt caching as an invariant: the cached system prefix takes no clock, locale, or session id. A volatile byte there does not raise an error, it silently drops cache reads to zero and pays full input price on every turn, so a test asserts the invariant and a future edit fails CI instead of quietly costing ten times more
- Guardrails ordered by cost: parse, then daily budget, then IP rate, and only then the bot-defence round trip, so an abuser is rejected before spending a network subrequest. Caps run at five dollars a day, twenty messages per IP per hour, and thirty turns or sixty thousand output tokens per session
- Retention with code behind it: the privacy page promises visitors in every locale that transcripts are deleted after ninety days, so a purge job enforces it rather than a runbook step somebody remembers to run
The cost ledger is deliberately exempt from that purge. It stores token counts and prices, no question text and no IP hash, which is what makes long-run spend reconcilable without holding anything personal. The whole chat layer is covered by tests over the prompt assembly, the tool schemas, the guardrails, the routing decision, and the tool handlers.
Live product: paglipat.com.
Applied AI portfolio (how this case study fits)
Paglipat is the deepest public AI engineering proof I ship. Multi tool agent, model routing, grounding, budgets, retention, and tests on a real product domain.
I also built two smaller AI surfaces independently. They solve different jobs:
- davthecoder.com site assistant: visitor facing chat on my personal site (Worker, curated knowledge, guardrails, contact handoff). A live demo of a marketing site assistant, not a travel agent.
- ElTarot.es readings: one contained generation feature with strict validation. Sometimes the right design is not five tools.
None of these are client AI engagements. Together they are the evidence base for the applied AI product features service: ship contained production AI with cost, safety, and tests. Not model training. Not MLOps as a service.
Tech Stack
- Astro 7 with TypeScript (strict), output as a fully static site (~1,500 pages)
- Tailwind CSS v4 for styling
- MDX for the multilingual blog and legal/help content
- Cloudflare Worker for edge redirects, geo locale detection, and path-aware caching
- Anthropic SDK running on the Worker, streaming responses to the browser over SSE
- Cloudflare D1 for chat sessions, turns, and a per-token cost ledger
- Turnstile for bot defence on the chat endpoint
- astro-seo and sitemap-index for hreflang, canonicals, and structured data
- Deployed on DigitalOcean App Platform (static), fronted by Cloudflare
Astro 7 does the heavy lifting here. With TypeScript in strict mode and a fully static output, the build emits roughly 1,500 pages, which is what makes 15 locales of content feasible without a server rendering each request. Tailwind CSS v4 keeps the styling consistent across all of those pages, and MDX backs the multilingual blog plus the legal and help content so writing stays close to markdown while still allowing components where a page needs them.
The Cloudflare Worker carries the live logic in the stack. It handles edge redirects, geo-based locale detection, and path-aware caching, deciding what gets served from cache and what locale a visitor should see before the request ever reaches the origin, and it also hosts the concierge endpoint with its D1-backed sessions and cost ledger. On the SEO side, astro-seo and sitemap-index generate the hreflang tags, canonicals, and structured data that a multilingual site needs to avoid duplicate-content problems. The static build is deployed on DigitalOcean App Platform and fronted by Cloudflare, which is what keeps it cheap to run and quick to serve.
Design Philosophy
Static-first for speed and resilience, with an editorial hero and an emphasis on transparency, accessibility, and a fast path from search to booking on every device. Static-first also means fewer moving parts to break: with the pages precomputed and cached, a spike in traffic hits the CDN rather than an origin server. The editorial hero sets the tone, but the real goal is getting someone from a search box to a booking with as little friction as possible, on a phone as readily as a desktop.
Frequently Asked Questions
What is Paglipat?
Paglipat is a multi-airline flight metasearch and travel booking platform. It lets travelers compare and book flights across hundreds of airlines and travel agencies in a single search, and it also covers hotels, eSIM data plans, and airport transfers. The name comes from Tagalog and means “to transfer” or “to move.”
What is Paglipat built with?
It runs on Astro 7 with TypeScript in strict mode, output as a fully static site of around 1,500 pages. Styling is Tailwind CSS v4, the multilingual blog and legal/help content use MDX, and a Cloudflare Worker handles edge redirects, geo locale detection, and path-aware caching, and also runs the AI concierge, backed by D1 for sessions and cost. astro-seo and sitemap-index generate hreflang, canonicals, and structured data.
Where is Paglipat deployed?
The static build is deployed on DigitalOcean App Platform and fronted by Cloudflare, with a Cloudflare Worker running the edge logic. It was originally built on Next.js and rebuilt as a static-first, edge-optimized site.
How many languages does Paglipat support?
Fifteen locales, including right-to-left Arabic. Each locale has hreflang annotations, per-locale sitemaps, and currency handling, and locale detection is geo-aware and handled at the CDN edge.
Is there a mobile app?
Yes. Android is on Google Play, and iOS is on the App Store. The website remains the full product, including the concierge.
Una plataforma de metabúsqueda de vuelos que permite comparar y reservar vuelos de cientos de aerolíneas y agencias de viajes en una sola búsqueda. El nombre «Paglipat» viene del tagalo y significa «transferir» o «mudarse», y recoge la esencia del viaje.
Construido al principio sobre Next.js, Paglipat se rehízo desde cero como un sitio estático primero y optimizado para el edge: más rápido de cargar, más barato de operar e indexable en 15 locales de todo el mundo. En lugar de renderizar las páginas bajo demanda detrás de un servidor, las precalculo en tiempo de construcción y las sirvo desde el edge, de modo que el primer pintado no espera a un runtime. La metabúsqueda sigue consultando tarifas en vivo, pero todo lo que la rodea (las páginas de aterrizaje, el contenido multilingüe, el enrutado) es estático y está en caché cerca de quien visita.
Funciones
- Búsqueda de vuelos de varias fuentes: agrega tarifas de cientos de aerolíneas y agencias de viajes, y enseña primero la más barata
- Planificación flexible del viaje: búsquedas de solo ida, ida y vuelta y multiciudad, con adultos, niños y bebés, y distintas clases de cabina
- Pila de viaje completa: vuelos, más hoteles, planes de datos eSIM y traslados de aeropuerto
- Global por defecto: enrutado de 15 locales (incluido el árabe de derecha a izquierda), con hreflang, mapas del sitio por locale y gestión de divisas
- Localización en el edge: detección de locale según la geografía y redirecciones del dominio raíz a www, resueltas en el edge de la CDN
La búsqueda cubre las formas en las que la gente reserva de verdad: una ida rápida, una ida y vuelta o un itinerario multiciudad cosido, cada uno con mezclas de pasajeros de adultos, niños y bebés y una clase de cabina a elegir. Como Paglipat es una pila de viaje completa y no solo vuelos, el mismo viaje puede seguir hacia hoteles, un plan de datos eSIM para el destino y un traslado de aeropuerto, de modo que el flujo de reserva no se detiene en la tarjeta de embarque.
Ser global es el valor por defecto, no un añadido. Quince locales están cableados en la capa de enrutado, incluido el árabe de derecha a izquierda, y cada uno lleva anotaciones hreflang correctas, su propio mapa del sitio y gestión de divisas, para que los buscadores y quien viaja aterricen en la página localizada que toca. La detección de locale y la redirección del dominio raíz a www corren en el edge de la CDN, lo que saca esa lógica del origen y del camino crítico.
Aplicaciones móviles
La app en Flutter está en Google Play y en el App Store. Los vuelos baratos van encima. Las estancias de hotel por meses se sientan al lado de los viajes cortos. Un calendario de precios enseña las fechas más baratas de la misma ruta. Las ofertas guardadas y las búsquedas recientes persisten sin cuenta.
Paglipat es una app de búsqueda. Compara tarifas de vuelo y de hotel, y después te envía a un socio de reserva para pagar. La tarjeta no pasa nunca por Paglipat. Los cambios de billete, los reembolsos y el soporte de la reserva se quedan en el socio.
El sitio web sigue siendo el producto completo, incluido el conserje.
Conserje de IA para la reubicación
El sitio ejecuta un asistente en vivo que responde preguntas de visados, alojamiento y vuelos. Es un agente con llamada a herramientas, no una ventana de chat pegada a una página de aterrizaje: al modelo no se le fía que recuerde una norma de visado, solo que decida qué herramienta puede consultarla.
- Cinco herramientas, no un chatbot:
check_visa,get_checklist,read_guide,search_hotelsyflight_prices. La descripción de cada herramienta dice cuándo llamarla, no solo qué hace, porque los modelos recientes tiran de las herramientas con conservadurismo por defecto - Dos modelos, con enrutado: una clase de modelo rápido clasifica el turno y uno más capaz responde solo cuando el turno se lo gana, así que las preguntas sencillas no pagan un razonamiento caro
- Anclaje por encima del recuerdo: ningún número de días, tasa ni norma de elegibilidad puede salir de la memoria del modelo. Cada norma se devuelve con la fecha en la que se verificó, y el modelo solo puede ofrecer artículos que existan en el catálogo, de modo que un texto retirado no se convierte en un enlace muerto dentro de una respuesta
- La caché del prompt como invariante: el prefijo de sistema cacheado no lleva reloj, locale ni identificador de sesión. Un byte volátil ahí no levanta un error: deja en silencio las lecturas de caché a cero y cobra el precio completo de entrada en cada turno, así que un test afirma el invariante y una edición futura rompe la CI en lugar de costar diez veces más sin que nadie lo note
- Barreras ordenadas por coste: primero el parseo, después el presupuesto diario, después la tasa por IP y solo entonces la ida y vuelta de defensa contra bots, de modo que un abuso se rechaza antes de gastar una subpetición de red. Los topes son cinco dólares al día, veinte mensajes por IP y hora, y treinta turnos o sesenta mil tokens de salida por sesión
- Retención con código detrás: la página de privacidad promete, en todos los locales, que las transcripciones se borran a los noventa días, así que lo exige un trabajo de purga y no un paso de un runbook que alguien se acuerde de ejecutar
El libro de costes queda a propósito fuera de esa purga. Guarda recuentos de tokens y precios, ni el texto de la pregunta ni un hash de IP, que es lo que permite conciliar el gasto a largo plazo sin conservar nada personal. Toda la capa de chat está cubierta por pruebas de ensamblado del prompt, de los esquemas de las herramientas, de las barreras, de la decisión de enrutado y de los manejadores de las herramientas.
Producto en vivo: paglipat.com.
Portfolio de IA aplicada (cómo encaja este caso)
Paglipat es la prueba pública más profunda de ingeniería de IA que publico. Agente de varias herramientas, enrutado de modelos, anclaje, presupuestos, retención y pruebas, sobre un dominio de producto real.
También construí por mi cuenta dos superficies de IA más pequeñas. Resuelven trabajos distintos:
- Asistente del sitio davthecoder.com: chat de cara a quien visita mi sitio personal (Worker, conocimiento curado, barreras, traspaso al contacto). Una demostración en vivo de un asistente de sitio de marketing, no un agente de viajes.
- Lecturas de ElTarot.es: una función de generación contenida, con validación estricta. A veces el diseño correcto es no usar cinco herramientas.
Ninguno de estos es un encargo de IA para un cliente. Juntos son la base de evidencia del servicio de funciones de producto de IA aplicada: publicar IA de producción contenida, con coste, seguridad y pruebas. No es entrenamiento de modelos. No es MLOps como servicio.
Pila técnica
- Astro 7 con TypeScript (estricto), con salida de sitio totalmente estático (unas 1.500 páginas)
- Tailwind CSS v4 para los estilos
- MDX para el blog multilingüe y el contenido legal y de ayuda
- Cloudflare Worker para redirecciones en el edge, detección de locale por geografía y caché consciente de la ruta
- SDK de Anthropic ejecutándose en el Worker, con respuestas en streaming hacia el navegador por SSE
- Cloudflare D1 para las sesiones de chat, los turnos y un libro de costes por token
- Turnstile para la defensa contra bots en el endpoint de chat
- astro-seo y sitemap-index para hreflang, canonicals y datos estructurados
- Desplegado en DigitalOcean App Platform (estático), con Cloudflare delante
Astro 7 hace aquí el trabajo pesado. Con TypeScript en modo estricto y una salida totalmente estática, la construcción emite unas 1.500 páginas, que es lo que hace viables 15 locales de contenido sin un servidor que renderice cada petición. Tailwind CSS v4 mantiene el estilo coherente en todas esas páginas, y MDX sostiene el blog multilingüe y el contenido legal y de ayuda, de modo que escribir se queda cerca de Markdown y aun así admite componentes donde una página los necesita.
El Cloudflare Worker lleva la lógica en vivo de la pila. Se ocupa de las redirecciones en el edge, de la detección de locale por geografía y de la caché consciente de la ruta: decide qué se sirve desde la caché y qué locale debería ver quien visita, antes de que la petición llegue siquiera al origen, y también aloja el endpoint del conserje, con sus sesiones y su libro de costes respaldados por D1. En el lado del SEO, astro-seo y sitemap-index generan las etiquetas hreflang, los canonicals y los datos estructurados que un sitio multilingüe necesita para no caer en problemas de contenido duplicado. La construcción estática se despliega en DigitalOcean App Platform y Cloudflare va delante, que es lo que la mantiene barata de operar y rápida de servir.
Filosofía de diseño
Estático primero, por velocidad y resistencia, con un héroe editorial y un énfasis en la transparencia, la accesibilidad y un camino rápido de la búsqueda a la reserva en cualquier dispositivo. Estático primero también significa menos piezas móviles que se puedan romper: con las páginas precalculadas y en caché, un pico de tráfico golpea la CDN y no un servidor de origen. El héroe editorial marca el tono, pero el objetivo real es llevar a alguien de un cuadro de búsqueda a una reserva con la menor fricción posible, en un móvil igual que en un ordenador de sobremesa.
Preguntas frecuentes
¿Qué es Paglipat?
Paglipat es una plataforma de metabúsqueda de vuelos de varias aerolíneas y de reserva de viajes. Permite comparar y reservar vuelos de cientos de aerolíneas y agencias de viajes en una sola búsqueda, y también cubre hoteles, planes de datos eSIM y traslados de aeropuerto. El nombre viene del tagalo y significa «transferir» o «mudarse».
¿Con qué está hecho Paglipat?
Corre sobre Astro 7 con TypeScript en modo estricto, con salida de sitio totalmente estático de unas 1.500 páginas. Los estilos son Tailwind CSS v4, el blog multilingüe y el contenido legal y de ayuda usan MDX, y un Cloudflare Worker se ocupa de las redirecciones en el edge, de la detección de locale por geografía y de la caché consciente de la ruta, y también ejecuta el conserje de IA, respaldado por D1 para las sesiones y el coste. astro-seo y sitemap-index generan hreflang, canonicals y datos estructurados.
¿Dónde está desplegado Paglipat?
La construcción estática está desplegada en DigitalOcean App Platform, con Cloudflare delante y un Cloudflare Worker ejecutando la lógica del edge. Al principio se construyó sobre Next.js y se rehizo como un sitio estático primero y optimizado para el edge.
¿Cuántos idiomas admite Paglipat?
Quince locales, incluido el árabe de derecha a izquierda. Cada locale tiene anotaciones hreflang, mapas del sitio propios y gestión de divisas, y la detección de locale es consciente de la geografía y se resuelve en el edge de la CDN.
¿Hay aplicación móvil?
Sí. Android está en Google Play e iOS está en el App Store. El sitio web sigue siendo el producto completo, incluido el conserje.


