Examples
today-panel
A daily almanac panel for a city and a date: the five limbs of the panchang, the sunrise-to-sunrise inauspicious bands, 16 choghadiya periods, 24 planetary hours, and the Moon's current sub lord. Five tools, zero PII, no birth data anywhere in the request.
Tool chain
Five tools, all independent, called together rather than in sequence: get_panchang (KP: the five limbs, sunrise and sunset, and the three inauspicious bands), get_choghadiya_today and get_hora_today (Vedic muhurta adjuncts, not orthodox KP, presented side by side with the KP layer but never described as a KP finding), get_moon_transit (KP: the Moon's sign, star lord, sub lord and minutes left in it, the fastest hand on the KP clock), and get_sublord_changes (KP: hours until each planet's sub lord changes, no location needed at all).
get_panchang and get_moon_transit are declared with birth-data-shaped field names, but the values carried are the query moment and place, never a person, which is what makes this whole app free of personal data.
Inputs
city, free text (e.g. "Colombo, Sri Lanka"), resolved by the modelutcOffsetMinutes, required, not inferred. The astrological day runs sunrise to sunrise, so the offset decides which civil day is meant; getting it wrong lands the whole panel a day early east of Greenwichdate(YYYY-MM-DD), defaults to the visitor's today
Call it
const ALLOWED_TOOLS = [
"get_panchang",
"get_choghadiya_today",
"get_hora_today",
"get_moon_transit",
"get_sublord_changes",
] as const;
const result = await runLumin({
allowedTools: ALLOWED_TOOLS,
system: buildSystemPrompt(),
user: buildUserPrompt(input),
// Five tool calls plus a 16-period and 24-hour payload. Costs nothing when
// the answer is shorter, because the client streams.
maxTokens: 16000,
// This is a lookup, not an investigation. High is enough and it is faster.
effort: "high",
signal: req.signal,
});
const data = ensureShape(
parseJsonBlock<TodayResponse>(result.text),
validateShape,
);Response shape
{
"place": { "label": "Colombo, Sri Lanka", "latitude": 6.9271, "longitude": 79.8612, "utcOffsetMinutes": 330 },
"date": "2027-05-01",
"panchang": {
"tithi": "Shukla Panchami", "nakshatra": "Rohini", "yoga": "Siddhi", "karana": "Balava",
"weekday": "Saturday",
"sunriseUTC": "2027-05-01T00:03:00Z", "sunsetUTC": "2027-04-30T12:47:00Z",
"rahuKaal": { "startUTC": "2027-05-01T03:15:00Z", "endUTC": "2027-05-01T04:45:00Z" },
"yamagandaKaal": { "startUTC": "2027-05-01T06:15:00Z", "endUTC": "2027-05-01T07:45:00Z" },
"gulikaiKaal": { "startUTC": "2027-05-01T09:15:00Z", "endUTC": "2027-05-01T10:45:00Z" }
},
"choghadiya": [
{ "name": "Amrit", "lord": "Moon", "quality": "auspicious", "startUTC": "2027-05-01T00:03:00Z", "endUTC": "2027-05-01T01:32:00Z", "interpretation": "Favourable for new beginnings.", "isCurrent": false }
],
"hora": [
{ "lord": "Saturn", "quality": "inauspicious", "startUTC": "2027-05-01T00:03:00Z", "endUTC": "2027-05-01T01:03:00Z", "interpretation": "A slower, disciplined hour.", "isCurrent": true }
],
"moon": { "sign": "Taurus", "starLord": "Rohini (Moon)", "subLord": "Mercury", "minutesRemainingInSub": 42, "nextSubLord": "Ketu" },
"nextChanges": [
{ "planet": "Moon", "currentSubLord": "Mercury", "nextSubLord": "Ketu", "hoursUntilChange": 0.7 }
],
"summary": "A settled Saturday with the Moon nearing a sub-lord change in Rohini.",
"disclaimer": "A traditional almanac panel, computed for the place and date you chose. It describes conventional timing categories, not advice."
}Screens
- A city and date form with the UTC offset resolved alongside the free-text city
- A panchang card: the five limbs, sunrise and sunset, the three inauspicious bands
- Two scrolling period strips, choghadiya and hora, each with the current period highlighted
- A moon-now card: sign, star lord, sub lord, minutes remaining
- A next-changes list: what shifts next and in how many hours
Validation the route enforces before it responds
auspicious, neutral or inauspicious, lowercase.The interesting engineering detail
The system prompt sets effort: "high" rather than the xhigh every other example in this repo uses. This is a lookup, not an investigation: five independent, unconditional tool calls with no branching logic between them, so the model does not need the extra reasoning budget an investigative reading spends deciding what to call next. Matching effort to the shape of the task, not defaulting it everywhere, is what keeps a zero-PII, cacheable-per-city product fast.
Where to next
- Scheduling and electional use cases for the panchang widget and focus-hour planner rows this app implements.
- horary-desk is the other zero-PII, no-birth-data example.