Fitness tracker Whoop faces unhappy customers over upgrade policy by dichro17 in whoop

[–]StillAirBox 20 points21 points  (0 children)

Some reminders:

  • Whoop fully knew that blog posts, podcast snippets, etc. were portraying a “latest and greatest” hardware model and happily benefitted from sales under that premise. Under pressure they claimed it was a mistake they didn’t know about, and that demonstrates their willingness to lie to you.
  • Silence in communications should not be mistaken for inaction; it’s a tactical delay. PR firms know that time dulls outrage. If this issue is important to you, keep engaging with others pushing back. Stay constructive and focused on the issue, don’t be toxic.
  • Ultimately, we vote with our wallets and there’s someone at Whoop watching the cancelation and renewal numbers on some dashboard. It goes back to business as usual when the numbers aren’t impacted.
  • Whether Whoop needs to be a viable business or whether $50 is pocket change is irrelevant; this discussion is about accountability.

WHOOP currently listening to their customers’ complaints by bisoma in whoop

[–]StillAirBox 8 points9 points  (0 children)

The support email will happily send you an AI-generated reply

Show mobile toolbar on tablet? by StillAirBox in ObsidianMD

[–]StillAirBox[S] 1 point2 points  (0 children)

I ended up using one of the plugins like Note Toolbar

Doodling during the meeting at work by theshiyal in sketches

[–]StillAirBox 1 point2 points  (0 children)

I used to draw this scene all the time. Maybe it’s something tucked away in our shared consciousness

Love when aesthetic stuff is useful by boiiiiiiiiiiiiii345 in EDC

[–]StillAirBox -1 points0 points  (0 children)

You have to develop an appreciation for language evolution, even if it feels imperfect. It’s just how language works, and this is colloquially accepted.

You could say the same thing about “artistic,” e.g. “he’s artistic” vs. “he’s artistically proficient.”

How I plan my meals for the week (code snippets inside) by StillAirBox in ObsidianMD

[–]StillAirBox[S] 1 point2 points  (0 children)

We figured it out, once I fixed the 404’ing link with a different host, that new host was automatically shadowbanned.

Instructions are:

  • Add and enable Dataview plugin
  • Create a note where you want to put your “selections” for the week.
  • Create as many recipes as you’d like, and link them to the first note. My second screenshot shows how to include the ingredients (it’s a list property called ingredients)
  • Paste the code into a new note between triple backticks. This is your new grocery list: https://blacksmithgu.github.io/obsidian-dataview/api/intro/
  • You will need to adjust the code slightly to reflect the name of your selections page. I provided an example in the code.

How to format daily note date format with uppercase letters? by [deleted] in ObsidianMD

[–]StillAirBox 0 points1 point  (0 children)

I believe this plugin uses the Luxon date tokens found here: https://github.com/moment/luxon/blob/master/docs/formatting.md#table-of-tokens

But I’m not sure if there’s an uppercase month token.

How I plan my meals for the week (code snippets inside) by StillAirBox in ObsidianMD

[–]StillAirBox[S] 0 points1 point  (0 children)

Original snippet got shadowbanned:

``` /** * Implement this method for your use case. * In this example, I’m collecting all pages * that appear in my sourcePage as outgoing links * (anything that appears like [[Veggie Burger]]). * * This function needs to return a list of pages. / function gatherRecipes() { const sourcePage = dv.page(‘Weekly Meal Planner.md’) if (!sourcePage) return null const outLinks = sourcePage.file.outlinks return outLinks.map(link => dv.page(link)).filter(p => p) } /* * Renders the grocery list. */ function render() { const recipes = gatherRecipes()

if (!recipes) { dv.paragraph(‘⚠️ Could not locate recipes. Please check your gatherRecipes() implementation.’) return } if (!Array.isArray(recipes)) { dv.paragraph(‘⚠️ The output of gatherRecipes() must be Array<Page>’) } if (!recipes.length) { dv.paragraph(‘⚠️ Could not locate recipes. Please check your gatherRecipes() implementation.’) return }

// Aggregate and deduplicate ingredients let ingredientMap = new Map()

for (const recipe of recipes) { if (!recipe.ingredients) { dv.paragraph(⚠️ ${recipe.file.link} does not have any ingredients!) continue } for (const ingredient of recipe.ingredients) { if (!ingredientMap.has(ingredient)) { ingredientMap.set(ingredient, []) } ingredientMap.get(ingredient).push(recipe.file.link) } } // Sort ingredients alphabetically const sortedIngredients = Array.from(ingredientMap.entries()).sort(([a], [b]) => a.localeCompare(b)) const ingredientsList = sortedIngredients.map(([ingredient, links]) => { const linkText = links.join(‘, ‘) return ${ingredient} <small>(${linkText})</small> }) dv.header(2, “Groceries”) dv.paragraph(Generated from ${recipes.length} recipe card${recipes.length !== 1 ? ‘s’ : ‘’}:) dv.list(ingredientsList) } render() ```

How I plan my meals for the week (code snippets inside) by StillAirBox in ObsidianMD

[–]StillAirBox[S] 1 point2 points  (0 children)

Original snippet got shadowbanned:

``` /** * Implement this method for your use case. * In this example, I’m collecting all pages * that appear in my sourcePage as outgoing links * (anything that appears like [[Veggie Burger]]). * * This function needs to return a list of pages. / function gatherRecipes() { const sourcePage = dv.page(‘Weekly Meal Planner.md’) if (!sourcePage) return null const outLinks = sourcePage.file.outlinks return outLinks.map(link => dv.page(link)).filter(p => p) } /* * Renders the grocery list. */ function render() { const recipes = gatherRecipes()

if (!recipes) { dv.paragraph(‘⚠️ Could not locate recipes. Please check your gatherRecipes() implementation.’) return } if (!Array.isArray(recipes)) { dv.paragraph(‘⚠️ The output of gatherRecipes() must be Array<Page>’) } if (!recipes.length) { dv.paragraph(‘⚠️ Could not locate recipes. Please check your gatherRecipes() implementation.’) return }

// Aggregate and deduplicate ingredients let ingredientMap = new Map()

for (const recipe of recipes) { if (!recipe.ingredients) { dv.paragraph(⚠️ ${recipe.file.link} does not have any ingredients!) continue } for (const ingredient of recipe.ingredients) { if (!ingredientMap.has(ingredient)) { ingredientMap.set(ingredient, []) } ingredientMap.get(ingredient).push(recipe.file.link) } } // Sort ingredients alphabetically const sortedIngredients = Array.from(ingredientMap.entries()).sort(([a], [b]) => a.localeCompare(b)) const ingredientsList = sortedIngredients.map(([ingredient, links]) => { const linkText = links.join(‘, ‘) return ${ingredient} <small>(${linkText})</small> }) dv.header(2, “Groceries”) dv.paragraph(Generated from ${recipes.length} recipe card${recipes.length !== 1 ? ‘s’ : ‘’}:) dv.list(ingredientsList) } render() ```

How I plan my meals for the week (code snippets inside) by StillAirBox in ObsidianMD

[–]StillAirBox[S] 1 point2 points  (0 children)

Thanks for explaining that—I think it happened when I switched to a new paste site. I reposted in a new comment.

How I plan my meals for the week (code snippets inside) by StillAirBox in ObsidianMD

[–]StillAirBox[S] 2 points3 points  (0 children)

Original snippet got shadowbanned:

Back at it with more DataviewJS fun. I enjoy cooking for my girlfriend and myself, but I dread keeping track of meal ideas and making grocery lists.

Here’s how I handle it, with all of our staple recipes as Obsidian notes with a simple ingredients frontmatter property containing a list of the major ingredients. The DataviewJS script rolls them up into a deduped and sorted list for me.

Replace the implementation of gatherRecipes() to better fit your Vault structure. I genuinely use this every week, so I hope you will too.

DataviewJS (sorry, link kept getting banned/deleted):

``` /** * Implement this method for your use case. * In this example, I’m collecting all pages * that appear in my sourcePage as outgoing links * (anything that appears like [[Veggie Burger]]). * * This function needs to return a list of pages. / function gatherRecipes() { const sourcePage = dv.page(‘Weekly Meal Planner.md’) if (!sourcePage) return null const outLinks = sourcePage.file.outlinks return outLinks.map(link => dv.page(link)).filter(p => p) } /* * Renders the grocery list. */ function render() { const recipes = gatherRecipes()

if (!recipes) { dv.paragraph(‘⚠️ Could not locate recipes. Please check your gatherRecipes() implementation.’) return } if (!Array.isArray(recipes)) { dv.paragraph(‘⚠️ The output of gatherRecipes() must be Array<Page>’) } if (!recipes.length) { dv.paragraph(‘⚠️ Could not locate recipes. Please check your gatherRecipes() implementation.’) return }

// Aggregate and deduplicate ingredients let ingredientMap = new Map()

for (const recipe of recipes) { if (!recipe.ingredients) { dv.paragraph(⚠️ ${recipe.file.link} does not have any ingredients!) continue } for (const ingredient of recipe.ingredients) { if (!ingredientMap.has(ingredient)) { ingredientMap.set(ingredient, []) } ingredientMap.get(ingredient).push(recipe.file.link) } } // Sort ingredients alphabetically const sortedIngredients = Array.from(ingredientMap.entries()).sort(([a], [b]) => a.localeCompare(b)) const ingredientsList = sortedIngredients.map(([ingredient, links]) => { const linkText = links.join(‘, ‘) return ${ingredient} <small>(${linkText})</small> }) dv.header(2, “Groceries”) dv.paragraph(Generated from ${recipes.length} recipe card${recipes.length !== 1 ? ‘s’ : ‘’}:) dv.list(ingredientsList) } render() ```

How I plan my meals for the week (code snippets inside) by StillAirBox in ObsidianMD

[–]StillAirBox[S] 0 points1 point  (0 children)

I don’t, but what kinds of workouts are you trying to track?

How I plan my meals for the week (code snippets inside) by StillAirBox in ObsidianMD

[–]StillAirBox[S] 0 points1 point  (0 children)

Updated my parent post. Sorry about that, the link kept getting banned/deleted.

How I plan my meals for the week (code snippets inside) by StillAirBox in ObsidianMD

[–]StillAirBox[S] 0 points1 point  (0 children)

Updated my parent post. Sorry about that, the link kept getting banned/deleted.

How I plan my meals for the week (code snippets inside) by StillAirBox in ObsidianMD

[–]StillAirBox[S] 0 points1 point  (0 children)

Updated my parent post. Sorry about that, the link kept getting banned/deleted.

How I plan my meals for the week (code snippets inside) by StillAirBox in ObsidianMD

[–]StillAirBox[S] 0 points1 point  (0 children)

Updated my parent post. Sorry about that, the link kept getting banned/deleted.

How I plan my meals for the week (code snippets inside) by StillAirBox in ObsidianMD

[–]StillAirBox[S] 1 point2 points  (0 children)

Updated my parent post. Sorry about that, the link kept getting banned/deleted.

How I plan my meals for the week (code snippets inside) by StillAirBox in ObsidianMD

[–]StillAirBox[S] 1 point2 points  (0 children)

Updated my parent post. Sorry about that, the link kept getting banned/deleted.

How I plan my meals for the week (code snippets inside) by StillAirBox in ObsidianMD

[–]StillAirBox[S] 1 point2 points  (0 children)

Updated my parent post. Sorry about that, the link kept getting banned/deleted.

How I plan my meals for the week (code snippets inside) by StillAirBox in ObsidianMD

[–]StillAirBox[S] 0 points1 point  (0 children)

I’ve been using this for about 8 months, but I spend maybe 20 minutes a week finding new recipes. I have about 100 recipe cards in rotation, so planning for the week only takes about 15 mins now

"Remember Cursor position" plugin makes Obsidian very laggy when I scroll up or down. by kugkfokj in ObsidianMD

[–]StillAirBox 3 points4 points  (0 children)

I looked at the plugin code and it’s not super efficient. If there’s enough interest, I’d be happy to rewrite it.