diff --git a/CHANGELOG.md b/CHANGELOG.md index 7000b7c..9be3153 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,15 @@ All notable changes to Epicure are documented here. This file is mirrored in-app at `/changelog` (and in the admin dashboard) via `apps/web/lib/changelog.ts` — update both together. +## 0.64.0 — 2026-07-21 00:30 + +### Fixed +- The web app manifest was never actually linked into the page (pointed at `/manifest.json`, but the real route is `/manifest.webmanifest`) and its icons referenced PNGs that don't exist in the repo — both silently broke install eligibility on Chrome/Android. Manifest now links correctly and icons point at the existing SVGs. + +### Added +- Added apple-mobile-web-app meta tags and a `viewport-fit=cover` safe-area setting for iOS home-screen installs. +- Added an install-app banner (Chrome/Edge/Android only, via the standard `beforeinstallprompt` event) so the PWA install prompt is a first-class, dismissible UI element instead of relying on the browser's own icon. + ## 0.63.0 — 2026-07-21 00:15 ### Added diff --git a/apps/web/app/layout.tsx b/apps/web/app/layout.tsx index f8147ab..18a6eac 100644 --- a/apps/web/app/layout.tsx +++ b/apps/web/app/layout.tsx @@ -5,6 +5,7 @@ import { Providers } from "@/components/providers"; import { auth } from "@/lib/auth/server"; import type { Locale } from "@/lib/i18n/provider"; import { SwRegister } from "@/components/pwa/sw-register"; +import { InstallPrompt } from "@/components/pwa/install-prompt"; import { getMarketingLocale } from "@/lib/marketing-locale"; import "./globals.css"; @@ -22,11 +23,21 @@ const geistMono = Geist_Mono({ export const metadata: Metadata = { title: "Epicure", description: "Your personal AI-powered recipe book.", - manifest: "/manifest.json", + manifest: "/manifest.webmanifest", + icons: { + icon: "/icon.svg", + apple: "/icon.svg", + }, + appleWebApp: { + capable: true, + statusBarStyle: "default", + title: "Epicure", + }, }; export const viewport: Viewport = { themeColor: "#18181b", + viewportFit: "cover", }; export default async function RootLayout({ @@ -47,6 +58,7 @@ export default async function RootLayout({