尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證GenAI planning assistant for Indian weddings, birthdays and community events: budgets, timelines, vendor checklists and personalized ideas.
翻譯準備中
取自儲存庫 README
正在載入完整 README。
檢視完整 README ↗An AI planning assistant for Indian weddings, birthdays and community events. It builds the budget, timeline and vendor checklist in seconds, adds personalized ideas with a reason for each, and keeps the whole plan consistent when something changes: describe the change in your own words, see exactly what it affects, then approve or reject it.
Live app: https://utsav-planner.vercel.app. No sign-up: each browser gets its own private plans.
Families and volunteers plan celebrations in spreadsheets and WhatsApp threads. Every change ("the budget dropped", "ten more guests", "the muhurat moved") means recalculating by hand, and something always gets missed: a deadline that is now too close, a vendor who needed to hear about the new date, a line that was meant to stay untouched.
.ics): the event day, unfinished tasks and vendors still to book, as all-day entries. Print the plan or save it as a PDF: the
printout shows the budget, ideas, timeline and vendors in black on white, without buttons.Every AI result has a "How this was generated" panel: the model, the prompt version, every attempt, the data sent and the validated answer. If every model is unavailable, the app still works and labels its standard suggestions "not AI-generated".
| Wedding | Birthday | Community event | |
|---|---|---|---|
| Budgets | Venue, catering, decor, photography, music, attire and makeup, rituals, gifts, transport, contingency; scales with guests and functions | Venue, catering, cake, decor, entertainment, return gifts, photography, contingency | Pandal, permits, sound and lighting, prasad, decor, rituals, cultural programme, volunteers, cleanup, contingency |
| Timelines | From months ahead (venue, photographer) to the day; per-function tasks | From about a month ahead (venue, invitations, cake) to the day | Police and municipal permissions early; volunteer roster; cleanup after |
| Vendor checklists | Venue, pandit, caterer, photographer, decorator, makeup, DJ, band or nadaswaram, invitations, transport; mehendi artist and choreographer when those functions are chosen | Venue, caterer, entertainer, decorator, photographer, cake shop | Pandal contractor, sound and lighting, decorator, caterer, waste management |
| Personalized ideas | Theme, regional customs, season, cost-saving swaps | Theme by age and interests, home or venue | Inclusive activities, eco-friendly choices, sponsorship |
AI interprets, reasons and generates. Code calculates and enforces. The user approves.
flowchart LR
U[Browser: HTML + htmx] -->|form or htmx POST + CSRF token| W[FastAPI on Vercel]
W --> S[Services]
S --> D[Domain: budget, timeline, vendors, change engine]
S --> A[AI layer]
A -->|1st| G1[Groq gpt-oss-120b]
A -->|2nd| G2[Gemini 3.5 Flash-Lite]
A -->|3rd| G3[Gemini 3.1 Flash-Lite]
A -->|all down| F[Labelled non-AI fallback]
S --> P[(Neon Postgres)]
adjust_guest_count(+10); code computes 50, rescales the guest-dependent lines and keeps
the total exact.Details: docs/ARCHITECTURE.md (binding design and decision log),
docs/SPEC.md (features and must-pass scenarios),
docs/UI_CONTRACT.md (templates and data).
| Task | When | The model | Code |
|---|---|---|---|
personalize | Right after an event is created, and on "Suggest different ideas" | Suggests ideas, budget emphasis, extra tasks and vendor notes for this city, date and preferences, each with a reason | Bounds every suggestion, turns emphasis into exact rupees, dates the tasks, drops anything invalid |
interpret_change | A change request in plain words | Turns it into structured operations, asks one question, or declines | Validates every operation against the plan, computes the full effect, waits for approval |
alternatives | "Suggest ways to save" on a shortfall | Picks lines and how much to trim, with reasons | Refuses protected lines, never cuts below money already spent, and computes each saving and the gap left from the real preview |
openai/gpt-oss-120b, then Gemini 3.5 Flash-Lite, then Gemini 3.1
Flash-Lite, then a labelled non-AI fallback. The order comes from the evals below. Each
call has 10 s and the chain 25 s; a timeout skips the same vendor's next model, quota
refusals cool a model down, and two outages in a row rest it for 30 s.app/ai/prompts/ with versions and worked
examples. The build log of prompts used to develop the app is in PROMPTS.md.evals/ holds 63 cases run against the real models: 41 change requests (lakh and
"45k" amounts, Hinglish, relative changes, dates, keep-as-is, several changes at once,
details such as a cake flavour, vague and off-topic requests, prompt injection), 12 personalizations (Bengali, Tamil, Punjabi and
Jain weddings, a dry wedding, Ganeshotsav, Durga Puja, garba night and more, with dietary
rules that must be respected), 4 requests for different ideas (no repeats, preferences still
honoured) and 6 over-budget plans.
Every answer is scored by code, not by another model: a change answer is applied through the app's own guardrails and change engine, and the resulting plan is checked. Equivalent operations pass; changes nobody asked for fail.
Results from 22–24 Oct 2026, counted as passed out of answered. Cases with no answer
(Google's capacity problems, or Groq's free daily quota running out) are listed separately
in the results, so they never count as wrong answers. Each figure is the latest run in
which the model answered at least 80% of that task's cases. Columns name the prompt
version measured; the app runs personalize-v3, interpret-change-v7 and alternatives-v6. An
alternatives answer passes only if the savings the app would actually apply cover at
least half the gap.
| Model | Change requests | Personalization | Alternatives | Median time, change |
|---|---|---|---|---|
Groq openai/gpt-oss-120b (first in the chain) | 41/41 (v7) | 15/16 (v3) | 5/6 (v6) | 1.0 s |
| Gemini 3.5 Flash-Lite (second) | 35/36 (v6) | 15/16 (v3) | 6/6 (v5) | 1.9 s |
| Gemini 3.1 Flash-Lite (third) | 33/33 (v6) | 16/16 (v3) | 6/6 (v5) | 2.1 s |
What the evals changed:
interpret-change-v6. Groq read "postponed by 10 days" as 10 days earlier, so
v5 spells out the sign of a date shift. The alternatives prompt sizes cuts to the gap,
after the models undershot a gap of half the budget. v3 stopped suggestions on lines
whose money was already paid (seen in a live test). v4 gives the model the rupees each
option would free, computed by the app, instead of percentages it had to multiply, and
v5 asks for at least two options: Gemini 3.5 went from 4/6 on v3 to 6/6, and Groq from
3/6 on v2 to 5/6. v6 never offers removing a line the celebration needs (food, venue,
cake, rituals, permits): a live option titled "Trim catering" had removed the food line
entirely. Code turns any such removal into the deepest cut. Groq stays at 5/6 on v6; its
one miss covers 46% of a gap of half the budget, against the 50% needed. The Gemini
alternatives figures are from v5. For change requests, v7 turns a plain detail ("cake
flavour butterscotch") into a task for the vendor instead of a question the user could not
answer; Groq passed all three new cases and the vague requests that should still get a
question. The Gemini change figures are from v6.Full results, every failure with its reason, and the run history:
evals/RESULTS.md. Run them with
uv run python -m evals.run --model groq:openai/gpt-oss-120b.
nosniff, frame and
referrer policies; Jinja autoescaping, so model output is never rendered as HTML.The look borrows from two Indian textiles and keeps them quiet. From Kalamkari chintz come the ivory cotton ground, the indigo of the leaves and the madder red of the flowers. From Phulkari comes the one ornament, a band of embroidered diamonds under the header and the event banner. Headings use a serif, and there are no web fonts and no images beyond the celebration photos: one hand-written stylesheet. Budget lines show planned against spent as bars, the timeline runs along a stitched thread by month, and the printout drops the colour for black on white.
On wide displays the home page's headline and new-plan form scroll on the left while a column of celebration photos stays pinned to the right edge, cycling slowly; it pauses under the pointer or from the keyboard, and stays still with reduced motion; "My Plans" lists your plans on a page of its own. The theme follows the device, and a switch in the header sets Light or Dark for this browser. On wide screens the dashboard keeps a full-height side menu of its sections that fills, like a progress line, up to the one in view. The new-plan form runs in three steps, with the event type chosen on cards and a sample for each type. The event page eases in, and new answers fade in; with reduced motion set on the device, nothing moves.
The Diwali, birthday and Ganeshotsav photos are from Pexels, free to use under the Pexels licence.
h1 per page, labelled controls, error
messages linked to their fields, captions and header scopes on every table, and an
aria-live region announcing updates.| Layer | What | How to run |
|---|---|---|
| Unit and property | Money, budget, timeline, vendors, change engine (Hypothesis checks exact totals and protection over thousands of generated plans), AI chain, providers, prompts, guardrails, services, persistence | uv run pytest |
| Web | Every route through HTTP with and without htmx: CSRF, ownership, rate limits, validation, label audit of every page | uv run pytest |
| Browser | Playwright journeys (one with JavaScript off), axe, phone width, keyboard, clean console | uv run pytest -m e2e |
| AI evals | 63 cases against the real models | uv run python -m evals.run --model … |
The AI is always faked in tests. A 95% branch-coverage gate applies to app/, and
mypy --strict covers the app, tests and evals. GitHub Actions runs the pre-commit hooks,
the tests, the browser tests and the security checks on every push.
Requirements: Python 3.12 and uv.
uv sync
cp .env.example .env # add your keys, a Postgres URL and a session secret
uv run python -m scripts.init_db
uv run uvicorn app.index:app --reload
Checks before committing (also run by the pre-commit hooks):
uv run ruff check . && uv run ruff format --check .
uv run mypy app tests evals
uv run pytest -W error --cov=app
uv run playwright install chromium && uv run pytest -m e2e
app/
domain/ pure logic, no I/O: catalog/ (one module per event type), budget, expenses,
rebalance, savings, timeline, vendors, planning, calendar, and the change
engine (change_set -> changes.propose, which runs change_steps -> proposal)
ai/ providers, fallback chain, cache, prompts, schemas, guardrails, fallbacks
services/ use cases: planning, change manager, edits, alternatives
persistence/ one module per store (events, proposals, cache, rate limits) and the
unit of work (repositories.Database)
web/ routes, a shared request context (deps.Visit), security middleware,
sessions, views/ (one module per page or concern), templates
public/static/ CSS, small scripts, photos, vendored htmx (checksum-tested)
tests/ unit, integration and browser tests
evals/ AI evaluation cases, scoring, runner and results
docs/ architecture, spec, UI contract
app/domain/catalog/). Users can change the total, guest count,
event date, any line's planned amount and every expense; task and vendor dates follow the
event date.Built with Google Antigravity and Claude Code working in separate lanes under one rules
file, AGENTS.md. PROMPTS.md records the prompts, outcomes and
corrections of each step; CHANGELOG.md lists user-visible changes.
MIT. The photos are from Pexels and follow the Pexels licence (see Design).