Vendors the anti-slop Oxlint plugin to tools/oxlint/anti-slop and registers it
in .oxlintrc.json via jsPlugins, with all 15 rules at "error". Adds oxlint and
@oxlint/plugins 1.78.0 as dev dependencies. The vendored copy is excluded from
oxlint, oxfmt and tsc, since it ships its own formatting and uses .ts import
specifiers that only Oxlint's loader resolves.
Fixes all 56 violations the rules reported, without suppressions:
Menu payloads are now parsed at their boundary instead of being spot-checked
downstream. isValidWeekMenu became parseWeekMenu, which decodes a JsonValue
into a WeekMenu and, in doing so, upgrades legacy V1 string items to the V2
{ name, tags } shape. That removes the MenuItem | string union from the filter
helpers, MealCard and ComprehensiveWeekView, and lets the two server-side
`JSON.parse(raw) as WeekMenu` casts become real parses. Verified against all 45
bundled week files: every week parses, with no meal or item dropped.
DayMenu.meals is now Partial<Record<MealKey, Meal>>, which is what the data and
every reader already assumed, and MealKey is derived from a new exported
MEAL_KEYS constant so the filter and parser iterate one typed list rather than
casting Object.entries keys.
Also: environment checks use presence detection (`"window" in globalThis`)
rather than typeof; the wrapped stats import decodes its fun-fact kind instead
of casting through unknown; sonner narrows the theme string; InlineSelect uses
an instanceof Node check; and the four casts that genuinely remain — the
persisted query cache, the build-generated manifest, and CSS custom properties
— now carry SAFETY comments stating the invariant.
Lint, format:check, typecheck and build all pass.
|
||
|---|---|---|
| .github/workflows | ||
| archive/2025-wrapped | ||
| public | ||
| scripts | ||
| src | ||
| tools/oxlint/anti-slop | ||
| .gitignore | ||
| .oxlintrc.json | ||
| api-1.json | ||
| bun.lock | ||
| components.json | ||
| CONTRIBUTING.md | ||
| LICENSE | ||
| next.config.ts | ||
| openapi.json | ||
| package.json | ||
| portless.json | ||
| postcss.config.mjs | ||
| README.md | ||
| tsconfig.json | ||
| vercel.json | ||
| wrangler.jsonc | ||
Food Court Menus
Fast, friendly viewer for weekly mess/food-court menus with time-aware highlighting in Indian Standard Time (IST). The app now integrates with the Food Court API to automatically fetch and display the latest menu data.
Contributions, Please
The app now uses an external API for data, so contributions focus on code improvements, UI enhancements, and feature development. Data is managed through the Food Court API at https://tikm.coolstuff.work/docs/reference.
Highlights
- Time-aware: detects current/upcoming meal using device time converted to IST and auto-focuses it
- Minimal “playing card” UI with tasteful icons for Breakfast/Lunch/Snacks/Dinner
- Horizontal carousel: highlights the primary meal, dims the rest, auto-scrolls to the current one
- Inline navigation: click Year / Week / Day in-place to switch context
- Fully responsive for mobile, tablets, and laptops
Tech
- Next.js (App Router), TypeScript
- Tailwind CSS v4
- shadcn-inspired components (Cards)
- lucide-react icons
Getting Started
Prereqs: Node 18+ and Bun.
Development server:
bun run dev
Visit http://localhost:3000.
Production build & start:
bun run build
bun run start
Lint:
bun run lint
Static menu bundle configuration:
MENU_API_URL=https://tikm.coolstuff.work
bun run build fetches menu history from MENU_API_URL, writes a static bundle into public/data/menu-bundle, and then exports the site. The client reads that bundle and chooses the current week using IST dates, so future menus can be deployed early without becoming current early.
Project Structure
src/app/— pages (home, weeks, per-week page) and API routes for week discoverysrc/components/— UI components (cards, carousel, inline selectors)src/data/weeks/— API client functions for fetching menu datasrc/lib/— types and IST/time utilities
Future Work (Scope)
- Adding support for other messes
- User-defined local input for their own mess with a client-side OCR pipeline
Deployment
Any Node-compatible host will work. Build with bun run build and serve with bun run start.