diff --git a/app/(aspects)/coffee/cupping/page.mdx b/app/(aspects)/coffee/cupping/page.mdx index 568256db..52a34488 100644 --- a/app/(aspects)/coffee/cupping/page.mdx +++ b/app/(aspects)/coffee/cupping/page.mdx @@ -15,6 +15,7 @@ from a cupping spoon aspirating the coffee over the palate to obtain the organoleptic (flavor) profile of each coffee. The goal is to evaluate several aspects: + - Fragrance of the dry grounds - Aroma of the coffee brew - Acidity in the tongue (a.k.a brightness, sourness) @@ -28,7 +29,9 @@ The goal is to evaluate several aspects: - Astringency? #TODO https://coffeeadastra.com/2022/08/01/the-mechanism-behind-astringency-in-coffee/ ## Protocol + Materials: + - Coffee - Grinder - Kettle @@ -36,6 +39,7 @@ Materials: - Spoon (two is best) Method: + 1. Weigh 9 g of coffee beans 2. Grind the coffees, purging between samples (@7.0/P100) 3. Evaluate its fragrances diff --git a/app/(aspects)/coffee/percolation/page.mdx b/app/(aspects)/coffee/percolation/page.mdx index 9cd6f006..afccc278 100644 --- a/app/(aspects)/coffee/percolation/page.mdx +++ b/app/(aspects)/coffee/percolation/page.mdx @@ -1,6 +1,7 @@ # Percolation Brewing ## Bloom + The main goal of blooming is to degass the coffee. The bubbling up of CO2 insulates solubles (decreasing yield) and contributes to channeling (decreasing uniformity of extraction). The blooming pour doesn't need to prioritize high @@ -10,6 +11,7 @@ advocate for a cooler bloom. [SamoBloom]: https://www.youtube.com/watch?v=eVF7DOxOUFA ## Bypass + It's when water goes around the beans, instead of through. The higher the water level relative to the coffee bed, the more bypass in a regular filter. No-Bypass Filters @@ -32,6 +34,7 @@ Next Level ## Recipes ### Matt Winton's Five Pours ~ James Hoffman's Single Cup V60 + A simple 5-pour recipe for medium-coarse grinds that makes use of high agitation. Popularized by Matt Winston ([MW1][], [MW2]) and recommended for single-cup brews by James Hoffman ([JH1][]). @@ -51,6 +54,7 @@ single-cup brews by James Hoffman ([JH1][]). 5. Pour the remaining 50 g and swirl ### Lance Hedrick's Vibrant V60 + A recipe that prioritizes vibrancy and fruity notes instead of clarity and high extractions. According to [Lance](https://www.youtube.com/watch?v=rAdgJNK0csc), it's also forgiving of conical burrs because it aims to capture fines on the @@ -69,6 +73,7 @@ sides of the filter through controlled agitation. 5. Gently stir the upper layer of the liquid until it finishes draining ### Kissaten Coffee Dome - 喫茶店 コーヒードーム + An unnamed and very pretty technique traditional in Japanese coffee shops, divulged by [Brewing Habits](https://www.youtube.com/watch?v=kqQDYf8BmIA). Sometimes called Osmotic Flow by [CAFEC](https://cafec-jp.com/brewing-guide/)'s diff --git a/app/(aspects)/food/rice/page.mdx b/app/(aspects)/food/rice/page.mdx index c6be15a5..febdd16c 100644 --- a/app/(aspects)/food/rice/page.mdx +++ b/app/(aspects)/food/rice/page.mdx @@ -31,4 +31,3 @@ After gelatinization, continued heating or agitation begins to break down those swollen starch granules, leaching amylose and increasing the viscosity of the surrounding liquid. This process known as pasting results in sticky and mushy rice (overcooked). - diff --git a/app/(aspects)/words/life/page.tsx b/app/(aspects)/words/life/page.tsx index f548c927..836fe45b 100644 --- a/app/(aspects)/words/life/page.tsx +++ b/app/(aspects)/words/life/page.tsx @@ -23,7 +23,7 @@ const LifeWasAStronglyPurposed = stretchable( hereinafter described. That was the purpose of LIFE - an - + , ); const idealizedByHenryLuceAndPortrayedInABenStillerMovie = stretchable( @@ -55,7 +55,7 @@ const idealizedByHenryLuceAndPortrayedInABenStillerMovie = stretchable( the original vision of the real world iconic LIFE, it was even more touching. I vowed to never lose sight of that aspiration. - + , ); const InspiredByHenryLucesLIFE = stretchable( @@ -72,7 +72,7 @@ const InspiredByHenryLucesLIFE = stretchable( that resonates with my own daydreaming. I want to - + , ); const ThatIsThePurposeOfLife = stretchable( @@ -87,7 +87,7 @@ const ThatIsThePurposeOfLife = stretchable( complete. Yours doesn't have to be the same. It probably shouldn't be the same. - + , ); export default function Page() { diff --git a/components/factory-old.ts b/components/factory-old.ts index f667317f..57ecd059 100644 --- a/components/factory-old.ts +++ b/components/factory-old.ts @@ -22,7 +22,7 @@ export interface Note { } export async function getAllNotes( - notesPath: string = NOTES_PATH + notesPath: string = NOTES_PATH, ): Promise { if (NOTES_CACHE) return NOTES_CACHE; const subpaths = await fs.readdir(notesPath); @@ -32,7 +32,7 @@ export async function getAllNotes( return (await fs.stat(relativeSubpath)).isDirectory() ? getAllNotes(relativeSubpath) : [await loadNote(relativeSubpath)]; - }) + }), ); return (NOTES_CACHE = files.flat()); } diff --git a/components/factory.tsx b/components/factory.tsx index e40a382a..4c28eda8 100644 --- a/components/factory.tsx +++ b/components/factory.tsx @@ -18,7 +18,7 @@ const NEXT_PAGE_FILES = ["page.tsx", "page.mdx"]; export async function listPages( basePath: string, relativePath: string, - skipLevel: number + skipLevel: number, ): Promise { const children = await fs.readdir(path.join(basePath, relativePath)); const pages = await Promise.all( @@ -29,14 +29,14 @@ export async function listPages( : NEXT_PAGE_FILES.includes(fileName) && skipLevel <= 0 ? [await loadPage({ basePath, relativePath, fileName })] : []; - }) + }), ); return pages.flat(); } async function getPageTitle( filePath: string, - content: string + content: string, ): Promise { if (filePath.endsWith("mdx")) { return getPageTitleFromMarkdown(filePath); @@ -52,7 +52,7 @@ async function getPageTitle( const mdxRelativePath = mdxMatch[1]; const mdxPath = path.join( path.dirname(filePath), - mdxRelativePath + ".mdx" + mdxRelativePath + ".mdx", ); return getPageTitleFromMarkdown(mdxPath); } @@ -60,7 +60,7 @@ async function getPageTitle( } async function getPageTitleFromMarkdown( - filePath: string + filePath: string, ): Promise { const markdown = await fs.readFile(filePath, { encoding: "utf-8" }); const titles = markdown.match(/(?<=^#\s+)[^\n]*/m); diff --git a/next.config.js b/next.config.js index 61e87268..1b84f488 100644 --- a/next.config.js +++ b/next.config.js @@ -7,10 +7,10 @@ const withBundleAnalyzer = require("@next/bundle-analyzer")({ /** @type {import('next').NextConfig} */ const nextConfig = { output: "export", - pageExtensions: ['js', 'jsx', 'mdx', 'ts', 'tsx'], + pageExtensions: ["js", "jsx", "mdx", "ts", "tsx"], }; module.exports = [withMDX, withBundleAnalyzer].reduce( (config, plugin) => plugin(config), - nextConfig + nextConfig, );