# Poreia

> A travel planner that turns one sentence into a multi-day itinerary with costs, a map, and an editable day-by-day plan. The model's answer has to pass a schema and a destination check before anyone sees it.

- Author: Benjamin Zhuang
- Category: AI travel planner
- Context: Independent product
- Years: 2026
- Stack: Next.js, React, TypeScript, Hono, Cloudflare Workers, Supabase, PostgreSQL, Drizzle, Zod, Leaflet
- Source: https://github.com/Benjaminnnnnn/poreia
- Demo: https://poreia-five.vercel.app
- Web page: https://benjaminnnnnn.github.io/portfolio/poreia/

**One sentence in. A trip you can edit out.**

## Key figures

- 1 sentence: is enough to start a trip
- Zod: schema every model reply must pass
- 1 retry: correction pass when the destination drifts

## Start from a sentence.

The home screen asks for one sentence: a place, a mood, a length, or a budget. The result is a day-by-day plan with times, places, cost estimates, and a budget breakdown, drawn on a map and open to drag-and-drop reordering.

Trips are saved to an account, can be refined with follow-up requests, and can be shared.

## Treat the model's answer as untrusted input.

A Hono service on Cloudflare Workers sends the request to an OpenAI model through Pollinations, with a fixed JSON shape and a low temperature. The reply is parsed and validated with Zod. Anything that fails becomes an error instead of a half-built trip.

The service then compares the itinerary's destination with the place the user named. If the model wandered elsewhere, it asks once more with an explicit correction. A refinement has to stay in the current trip's destination, and the notes a traveller wrote for each day survive regeneration.

## One model, checked by code.

The checks are ordinary code, not a second model. The repository includes integration tests for the trips API and a rate limit on trip requests. The quality of the itineraries themselves has not been evaluated.
