import type { Metadata } from "next"; import { getAllSiteSettings, isSignupsDisabled } from "@/lib/site-settings"; import { AdminSettingsForm } from "@/components/admin/admin-settings-form"; import { SignupsToggle } from "@/components/admin/signups-toggle"; import { requireFullAdminPage } from "@/lib/require-admin-page"; export const metadata: Metadata = {}; const SETTING_GROUPS = [ { title: "Push Notifications (VAPID)", description: "Keys for web push notifications. Generate with: npx web-push generate-vapid-keys", keys: ["NEXT_PUBLIC_VAPID_PUBLIC_KEY", "VAPID_PRIVATE_KEY"] as const, }, { title: "Gitea Integration", description: "Support tickets submitted in-app automatically open an issue on this Gitea repo. Setup: " + "GITEA_URL = your Gitea base URL, no trailing slash (e.g. https://git.example.com). " + "GITEA_REPO = owner/repo (e.g. owner/my-app). " + "GITEA_TOKEN = a personal access token — Gitea → Settings → Applications → Generate New Token — " + "with the \"issue\" scope (read + write) only; nothing broader is needed since this integration " + "never touches code or repo settings, just creates issues.", keys: ["GITEA_URL", "GITEA_TOKEN", "GITEA_REPO"] as const, }, { title: "USDA FoodData Central", description: "Improves recipe nutrition estimates with real per-ingredient data instead of AI-only guesses, " + "for ingredients whose quantity/unit can be converted to grams. Free — get a key at " + "fdc.nal.usda.gov/api-key-signup. Unset falls back to the previous AI-only estimation for every ingredient.", keys: ["USDA_API_KEY"] as const, }, ]; export default async function AdminSettingsPage() { await requireFullAdminPage(); const settings = await getAllSiteSettings(); const signupsDisabled = await isSignupsDisabled(); return (

Site Settings

Override .env values at runtime. DB values take precedence over environment variables. Clear a value to fall back to the environment variable. AI provider keys and model defaults have moved to AI Config.

{SETTING_GROUPS.map((group) => ( ))}
); }