diff --git a/CHANGELOG.md b/CHANGELOG.md
index e73d291..b6b7904 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,11 @@
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.20.0 — 2026-07-13 22:26
+
+### Added
+- **Duplicate your own recipe** — same one-click copy used for forking others' recipes, now also on your own, for making variations without touching version history.
+
## 0.19.0 — 2026-07-13 22:21
### Added
diff --git a/apps/web/app/(app)/recipes/[id]/page.tsx b/apps/web/app/(app)/recipes/[id]/page.tsx
index 5eff044..ccd0f28 100644
--- a/apps/web/app/(app)/recipes/[id]/page.tsx
+++ b/apps/web/app/(app)/recipes/[id]/page.tsx
@@ -222,7 +222,7 @@ export default async function RecipePage({ params }: Params) {
order: s.order,
}))}
/>
- {!isOwner && }
+
{ void handleFork(); }} disabled={forking} aria-label={t("forkTooltip")}>
- {forking ? : }
+
} />
- {t("forkTooltip")}
+ {label}
);
diff --git a/apps/web/lib/changelog.ts b/apps/web/lib/changelog.ts
index 68b6d2d..8652fc9 100644
--- a/apps/web/lib/changelog.ts
+++ b/apps/web/lib/changelog.ts
@@ -1,5 +1,5 @@
// Mirrors CHANGELOG.md at the repo root — update both together.
-export const APP_VERSION = "0.19.0";
+export const APP_VERSION = "0.20.0";
export type ChangelogEntry = {
version: string;
@@ -11,6 +11,13 @@ export type ChangelogEntry = {
};
export const CHANGELOG: ChangelogEntry[] = [
+ {
+ version: "0.20.0",
+ date: "2026-07-13 22:26",
+ added: [
+ "**Duplicate your own recipe** — same one-click copy used for forking others' recipes, now also on your own, for making variations without touching version history.",
+ ],
+ },
{
version: "0.19.0",
date: "2026-07-13 22:21",
diff --git a/apps/web/messages/en.json b/apps/web/messages/en.json
index 8c7d22e..1810466 100644
--- a/apps/web/messages/en.json
+++ b/apps/web/messages/en.json
@@ -121,6 +121,8 @@
"forked": "Recipe forked to your library",
"forkFailed": "Failed to fork recipe",
"forkLimitReached": "Recipe limit reached for your tier",
+ "duplicateTooltip": "Duplicate this recipe",
+ "duplicated": "Recipe duplicated",
"forkedFrom": "Forked from {title}",
"pairingFindingLabel": "Finding perfect pairings…",
"pairingSuggestButton": "Suggest pairings",
diff --git a/apps/web/messages/fr.json b/apps/web/messages/fr.json
index 9ecd691..15e1f67 100644
--- a/apps/web/messages/fr.json
+++ b/apps/web/messages/fr.json
@@ -122,6 +122,8 @@
"forked": "Recette copiée dans votre bibliothèque",
"forkFailed": "Échec de la copie de la recette",
"forkLimitReached": "Limite de recettes atteinte pour votre offre",
+ "duplicateTooltip": "Dupliquer cette recette",
+ "duplicated": "Recette dupliquée",
"forkedFrom": "Copiée depuis {title}",
"pairingFindingLabel": "Recherche des meilleurs accords…",
"pairingSuggestButton": "Suggérer des accompagnements",
diff --git a/apps/web/package.json b/apps/web/package.json
index ea79e48..4c34a3f 100644
--- a/apps/web/package.json
+++ b/apps/web/package.json
@@ -1,6 +1,6 @@
{
"name": "@epicure/web",
- "version": "0.19.0",
+ "version": "0.20.0",
"private": true,
"scripts": {
"dev": "next dev",
diff --git a/package.json b/package.json
index ea62b8a..56e7584 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "epicure",
- "version": "0.19.0",
+ "version": "0.20.0",
"private": true,
"scripts": {
"dev": "pnpm --filter web dev",