diff --git a/.screenmap/SKILL.md b/.screenmap/SKILL.md
index c5586e3..5452d09 100644
--- a/.screenmap/SKILL.md
+++ b/.screenmap/SKILL.md
@@ -17,7 +17,7 @@ The Methods tab has an "About this guide" row that opens a modal.
## Real params
-- `/brew/:id` → the id is a method id: `v60`, `aeropress` or `french-press`.
+- `/brew/:id` → the id is a method id: `v60`, `aeropress`, `french-press` or `moka-pot`.
Use `v60`. Anything else falls back to the first method rather than erroring.
## Screens worth extra states
diff --git a/README.md b/README.md
index 9ea61a3..b5391d4 100644
--- a/README.md
+++ b/README.md
@@ -14,6 +14,7 @@ on-screen.
| `/method/v60` | Hario V60 — recipe, pour schedule, tips |
| `/method/aeropress` | AeroPress |
| `/method/french-press` | French Press |
+| `/method/moka-pot` | Moka Pot |
| `/brew/[id]` | Brew timer for one method |
| `/grind` | Grind guide |
| `/about` | About, presented as a modal |
diff --git a/src/app/(tabs)/index.tsx b/src/app/(tabs)/index.tsx
index 963fbcc..2ff2e80 100644
--- a/src/app/(tabs)/index.tsx
+++ b/src/app/(tabs)/index.tsx
@@ -30,6 +30,9 @@ export default function MethodsScreen() {
+
+
+
diff --git a/src/app/_layout.tsx b/src/app/_layout.tsx
index 69a9531..68795b8 100644
--- a/src/app/_layout.tsx
+++ b/src/app/_layout.tsx
@@ -20,6 +20,7 @@ export default function RootLayout() {
+
diff --git a/src/app/method/moka-pot.tsx b/src/app/method/moka-pot.tsx
new file mode 100644
index 0000000..337b6b7
--- /dev/null
+++ b/src/app/method/moka-pot.tsx
@@ -0,0 +1,19 @@
+import { Link } from 'expo-router';
+
+import { BrewTimerButton } from '@/components/brew-button';
+import { MethodScreen } from '@/components/method-screen';
+import { methodById } from '@/data/methods';
+
+export default function MokaPotRoute() {
+ const method = methodById('moka-pot')!;
+ return (
+
+
+
+ }
+ />
+ );
+}
diff --git a/src/data/methods.ts b/src/data/methods.ts
index c4eed4a..53b3e48 100644
--- a/src/data/methods.ts
+++ b/src/data/methods.ts
@@ -120,6 +120,33 @@ export const METHODS: Method[] = [
'Coarse means coarse. Fines are what make it muddy.',
],
},
+ {
+ id: 'moka-pot',
+ name: 'Moka Pot',
+ tagline: 'Stovetop, steam pressure',
+ ratio: '1:10',
+ dose: '18 g',
+ grind: 'fine',
+ water: '180 g, already boiling',
+ totalTime: 300,
+ body: 5,
+ clarity: 2,
+ effort: 3,
+ blurb:
+ 'Steam pressure from the bottom chamber pushes water up through the coffee in one continuous shot. It is not espresso and it is not filter — it is thick, dark and closer to a stovetop lungo than either.',
+ steps: [
+ { at: 0, label: 'Fill hot', detail: 'Boiling water to just under the valve. Cold water stews the grounds.' },
+ { at: 30, label: 'Level the basket', detail: 'Fine grind, level, never tamped. Tamping chokes it.' },
+ { at: 60, label: 'Low heat', detail: 'Assemble with a towel, medium-low flame, lid open.' },
+ { at: 210, label: 'Listen', detail: 'A steady gurgle means it is done. A violent splutter means it is over.' },
+ { at: 270, label: 'Kill the heat', detail: 'Off the flame, base into cold water, pour straight away.' },
+ ],
+ tips: [
+ 'Start with boiling water — the shorter the metal sits on the flame, the less scorched it tastes.',
+ 'Never tamp. The basket only needs to be full and flat.',
+ 'Stop at the gurgle. Everything after it is the bitter tail.',
+ ],
+ },
];
export function methodById(id: string): Method | undefined {