From open-itin
Generate travel itineraries in the Open Itinerary format. Use when the user asks to plan a trip, create an itinerary, or generate a .oitinerary.kdl file.
How this skill is triggered — by the user, by Claude, or both
Slash command
/open-itin:open-itinThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
You generate travel itineraries in the **Open Itinerary** format (file extension: `.oitinerary.kdl`)
You generate travel itineraries in the Open Itinerary format (file extension: .oitinerary.kdl)
When asked to create an itinerary, follow this process:
Ask the user (or infer from the prompt):
If any of these are missing, ask the user before proceeding.
Spawn subagents to research simultaneously. Each subagent should return structured data:
Stops agent — Research 3-8 stops per day. For each stop return:
Routes agent — For each leg between stops:
Days agent — Assemble the day-by-day timeline:
Run all three agents in parallel. Each must return data conforming to the types below — no freeform responses.
After collecting research, assemble the full itinerary document (see Format Reference below). Then validate it:
cd agent-format && bun run src/cli.ts validate <file>
If validation fails, fix the errors and re-validate.
Write the validated itinerary to examples/<slug>.oitinerary.kdl. Also print a human-readable summary.
It's an open format based off of KDL.
itinerary "<name>" {
summary "<one-sentence description>"
tz "<IANA timezone>" // e.g. "America/Los_Angeles"
cur "<ISO 4217>" // e.g. "USD"
tags "<tag1>, <tag2>" // comma-separated
generated_by "<model-name>"
created_at "<ISO 8601>"
{stop} // 1+ stops
{route} // 0+ routes
{day} // 1+ days
}
stop "<id>" {
name "<display name>"
goal "<purpose — one sentence>"
cat "<category>" // optional
addr "<address>" // optional
coord <lat> <lng> // optional, 2 positional values
place_id "<ns:id>" // optional, e.g. "gplaces:ChIJ..."
tz "<IANA>" // optional
dur min=<hours> max=<hours> // optional, decimal hours
cost amt=<number> cur="<ISO 4217>" // optional
dep "<HH:MM>" // optional
arr "<HH:MM>" // optional
url "<url>" // optional
note "<text>" // optional
{alt} // optional
}
Categories: accommodation | food | drink | attraction | nature | viewpoint | transport | rest | shopping | activity | other
alt {
name "<name>"
goal "<purpose>"
cat "<category>" // optional
addr "<address>" // optional
dur min=<hours> max=<hours> // optional
note "<text>" // optional
}
route "<id>" {
from "<stop-id>"
to "<stop-id>"
mode "<mode>"
dur min=<hours> max=<hours> // optional
dist <km> // optional
dep "<HH:MM>" // optional
arr "<HH:MM>" // optional
cost amt=<number> cur="<ISO 4217>" // optional
url "<url>" // optional
note "<text>" // optional
}
Modes: drive | fly | train | bus | walk | bike | transit | ferry | other
day date="<YYYY-MM-DD>" {
note "<text>" // optional
tz "<IANA>" // optional
{item} // timeline items
{flex} // flex blocks
}
item type="stop" ref="<stop-id>"
item type="route" ref="<route-id>"
item type="note" txt="<text>"
flex pick=<n> {
option type="stop" ref="<id>"
option type="route" ref="<id>"
option type="note" txt="<text>"
}
name, goal, and a practical notemode and note (traffic tips, scenic options, logistics)from and to must match stop idsmin=1.5 max=2.5 (not minutes)"golden-gate-bridge", not "goldenGateBridge"flex block per day for optional choicesalt blocks as alternativesWhen spawning the Stops agent:
Research stops for a {N}-day trip to {destination}. For each day, find 3-6 stops covering accommodation, food, attractions, and viewpoints. Return as a structured list with: id (kebab-case), name, goal, category, address, duration (min/max hours), cost (amt + cur), url, and a practical one-sentence note. For 2-3 major stops per day, include 1-3 alternatives. Categories must be one of: accommodation, food, drink, attraction, nature, viewpoint, transport, rest, shopping, activity, other.
When spawning the Routes agent:
Given these stops: [list stop ids], plan routes between consecutive stops. For each leg: id (kebab-case from-to), from/to (stop ids), mode, duration (min/max hours), distance (km), and a practical one-sentence note about the route.
When spawning the Days agent:
Given these stops and routes, assemble a day-by-day timeline. Each day must have: items (stops and routes in order), 1-2 inline notes for meals/tips, and at least one flex block with 2-3 options. Morning starts around 8-9am, evening ends by 10pm.
The KDL format saves 60-80% tokens vs JSON. The agent-format/src/cli.ts tokens command shows exact savings:
cd agent-format && bun run src/cli.ts tokens <file>
Creates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.
npx claudepluginhub thatxliner/claude-plugins --plugin open-itin