Check whether a fruit or vegetable is in season in France.
Web: estcequecestlasaison.fr — SEO, AdSense Mobile: Expo (iOS/Android) — 100% offline, free, no ads
Fruits and vegetables, static JSON data, French only.
| Directory | Stack |
|---|---|
apps/web/ |
TanStack Start, React 19, Tailwind CSS 4 |
apps/mobile/ |
Expo 55, React Native, HeroUI Native, Uniwind |
packages/shared/ |
Data, types, helpers (Fuse.js, Zod) |
scripts/ |
Image generation and optimization |
Package manager: pnpm 10 — Node: >= 200
| Platform | Host | Status |
|---|---|---|
| Web | Vercel | Live |
| iOS | App Store | Coming soon |
| Android | Google Play | Coming soon |
- Clone the repo
pnpm installcp .env.example .env.localand fill in the values
GOOGLE_API_KEY is only required for pnpm generate-images (not needed for dev/build).
| Command | Description |
|---|---|
pnpm dev |
Web dev server (port 3000) |
pnpm build |
Production web build |
pnpm lint |
TypeScript + OxLint |
pnpm lint:fix |
Lint + auto-fix + OxFormat |
pnpm format |
Format code (OxFormat) |
pnpm format:check |
Check formatting |
pnpm test |
Unit tests (Vitest) |
pnpm generate-images |
Generate produce images (Gemini AI, interactive) |
pnpm optimize-images |
Optimize PNG to WebP (web + mobile) |
pnpm generate-og |
Generate Open Graph images |
For mobile: cd apps/mobile then pnpm ios or pnpm android.
- Add the object to
packages/shared/src/data/produce.json pnpm generate-images— generates the image via Gemini AI with interactive validation (oaccept,nregenerate,sskip)pnpm optimize-images— creates WebP variants for web (256w, 512w) and mobile (1024w)- Add the
require()entry inapps/mobile/constants/produce-images.ts(alphabetical order) pnpm generate-og— creates the Open Graph imagepnpm lint:fix && pnpm test
UNLICENSED