<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>jpshlk.com</title><description>A blog about things I find useful, and want to remember.</description><link>https://jpshlk.com/</link><item><title>Tags as Content: Why I Made Each Tag an MDX Page</title><link>https://jpshlk.com/blog/tags-as-content-why-i-made-each-tag-an-mdx-page/</link><guid isPermaLink="true">https://jpshlk.com/blog/tags-as-content-why-i-made-each-tag-an-mdx-page/</guid><description>Every tag on this site is its own MDX page with a name, a description, and real content. Why that beats a plain string array.</description><pubDate>Mon, 03 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;img src=&quot;https://jpshlk.com/_astro/tags-as-content-why-i-made-each-tag-an-mdx-page.BoIvpbBC_LaGPk.webp&quot; alt=&quot;A flat diagram on a dark navy background where a column of four blue tag pills and one empty dashed pill outline connect by thin cream lines to a large cream file panel with a blue title bar, a grey description bar, ruled body lines, and an orange folded corner, while a crumpled grey scrap in the lower left sits outside the system, its dashed line ending at an orange warning dot.&quot; width=&quot;1400&quot; height=&quot;733&quot;&gt;&lt;p&gt;&lt;em&gt;This is part 6 of my &lt;a href=&quot;https://jpshlk.com/tags/rebuild/&quot;&gt;rebuild series&lt;/a&gt;. In &lt;a href=&quot;https://jpshlk.com/blog/turning-my-homepage-into-a-landing-page/&quot;&gt;part 5&lt;/a&gt; I turned the homepage into a landing page.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;On the old site, tags were whatever strings I happened to type into a post’s frontmatter (the metadata block at the top of the file). Nothing stopped &lt;code&gt;mac&lt;/code&gt;, &lt;code&gt;Mac&lt;/code&gt;, and &lt;code&gt;macs&lt;/code&gt; from quietly becoming three different topics. On the rebuild, tags became their own content collection: every tag on this site is a small MDX file with a name, a description, and room to grow.&lt;/p&gt;
&lt;p&gt;That sounds like overkill for a personal blog. It stopped sounding like overkill the first time I typo’d a tag and the build failed instead of silently shipping a broken tag page.&lt;/p&gt;
&lt;h2 id=&quot;tags-as-a-content-collection-not-strings&quot;&gt;Tags as a content collection, not strings&lt;/h2&gt;
&lt;p&gt;In Astro, a content collection is a folder of files with a schema: the build reads every file and type-checks its frontmatter before anything renders. The tags collection sits right next to the blog in &lt;code&gt;content.config.ts&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; tags&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; defineCollection&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  loader: &lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;glob&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;({ pattern: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;#39;**/*.mdx&amp;#39;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, base: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;#39;./src/content/tags&amp;#39;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; }),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  schema: z.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;object&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    name: z.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;string&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    description: z.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;string&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;().&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;optional&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  }),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The important half lives on the blog side. Posts don’t declare their tags as plain strings; they declare references into that collection:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;tags&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: z.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;array&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;reference&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;#39;tags&amp;#39;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)).&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;default&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;([]),&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;reference(&amp;#39;tags&amp;#39;)&lt;/code&gt; means every tag in a post’s frontmatter has to match a real file in &lt;code&gt;src/content/tags/&lt;/code&gt;. Write &lt;code&gt;tags: [&amp;#39;astr&amp;#39;]&lt;/code&gt; and the build stops with an error naming the post and the bogus tag. The typo that used to become a ghost page is now a compile error.&lt;/p&gt;
&lt;h2 id=&quot;what-a-real-tag-page-buys-you&quot;&gt;What a real tag page buys you&lt;/h2&gt;
&lt;p&gt;A slug like &lt;code&gt;ios&lt;/code&gt; can’t tell you it should be displayed as “iOS” and not “Ios”. A file can. Every tag carries a proper display name and a one sentence description:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;mdx&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;Rebuild&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;description&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;Documenting the 2026 rebuild of this site with Astro 7, Tailwind 4, and a lot of help from AI.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;---&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The tag page template reads both. The name becomes the heading and the breadcrumb, correctly capitalized, and the description renders right under the heading and doubles as the page’s SEO description. So a tag page opens with an actual sentence about the topic instead of a bare slug floating over a list:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://jpshlk.com/_astro/tags-as-content-mac-tag-page.BMsBOxHI_Z1wFtD.webp&quot; alt=&quot;The Mac tag page opening with the heading Mac and the sentence Posts about Macs and Mac Apps, above the list of tagged posts with their cards.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1280&quot; height=&quot;800&quot;&gt;&lt;/p&gt;
&lt;p&gt;Two smaller wins ride along. A tag with zero published posts gets no page at all (the route only generates when something actually uses it), so there are no empty stubs for crawlers to find. And because the files are MDX, each tag has a body waiting for the day I want tag pages to open with a real intro; the rebuild tag already has one written, sitting in its file until I wire it up.&lt;/p&gt;
&lt;h2 id=&quot;the-cost-side&quot;&gt;The cost side&lt;/h2&gt;
&lt;p&gt;The price is one small file per tag, and you pay it up front: a tag can’t exist until its file does. Tagging a post with something new means stopping to create &lt;code&gt;src/content/tags/whatever.mdx&lt;/code&gt; first.&lt;/p&gt;
&lt;p&gt;That friction annoyed me for about a day. Then I noticed it was doing exactly what a taxonomy needs: making me decide whether a topic really deserves a tag before it exists. Is it &lt;code&gt;webdev&lt;/code&gt;, &lt;code&gt;web-dev&lt;/code&gt;, or &lt;code&gt;web-development&lt;/code&gt;? There’s one file, so there’s one answer. The site has seventeen tags with real names and descriptions, and that beats forty misspelled strings every time.&lt;/p&gt;
&lt;p&gt;If your tags are strings that occasionally typo into ghost pages, give them files. It’s the rare bit of structure that costs one folder and pays you back on every post. 🤙&lt;/p&gt;</content:encoded><category>astro</category><category>rebuild</category><category>web-development</category></item><item><title>Turning My Homepage Into a Landing Page</title><link>https://jpshlk.com/blog/turning-my-homepage-into-a-landing-page/</link><guid isPermaLink="true">https://jpshlk.com/blog/turning-my-homepage-into-a-landing-page/</guid><description>The homepage used to be a wall of blog posts. Now it leads with who I am and what I do, with the blog one click away. Here&apos;s how it&apos;s put together.</description><pubDate>Thu, 30 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;img src=&quot;https://jpshlk.com/_astro/turning-my-homepage-into-a-landing-page.DnuIduKx_296kXn.webp&quot; alt=&quot;Two browser windows on a near-black background, with a dashed arrow pointing from the dim, faded one on the left, which shows nothing but five identical rows of a blog post list, to the larger lit one on the right, where a bright blue header band holds a circular profile photo, a name, and two buttons above a bio paragraph, a row of three project cards, a row of four post cards, and a quote bar at the bottom.&quot; width=&quot;1400&quot; height=&quot;734&quot;&gt;&lt;p&gt;&lt;em&gt;This is part 5 of my &lt;a href=&quot;https://jpshlk.com/tags/rebuild/&quot;&gt;rebuild series&lt;/a&gt;. In &lt;a href=&quot;https://jpshlk.com/blog/a-tiny-design-system-and-dark-mode-that-works/&quot;&gt;part 4&lt;/a&gt; I built the design system these pieces are made of.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The single biggest reason for this rebuild wasn’t technical. It was that my homepage said nothing about &lt;em&gt;me&lt;/em&gt;. You landed on a list of posts and had to click “About” to learn whose site you were on. Most personal sites work like that because most blog themes work like that.&lt;/p&gt;
&lt;p&gt;The new homepage flips it: &lt;strong&gt;who I am first, blog second.&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&quot;the-anatomy&quot;&gt;The anatomy&lt;/h2&gt;
&lt;p&gt;The page is three sections, each its own component in &lt;code&gt;src/components/home/&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;astro&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;// src/pages/index.astro (the important part)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;BaseLayout&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; title&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;={&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;AUTHOR&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.name} &lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;description&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;={&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;SITE&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.description}&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;Hero&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;WorkSection&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;LatestPosts&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;BaseLayout&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Hero&lt;/strong&gt;: photo, a big ”👋 I’m Josh,” the “Digital Duct Tape @ Plantonix” line (pulled from &lt;code&gt;src/config.ts&lt;/code&gt;, not hardcoded), a short intro, and two buttons (read the blog / see my work). It also owns my favorite flourish on the whole site: the faint code snippets peeking in from the margins. Those are real snippets from this site’s source, syntax-highlighted at build time into a little pool, and a script deals a random pair on every visit.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;WorkSection&lt;/strong&gt;: cards for CocoCalcs, my iOS Shortcuts on RoutineHub, and QuartFlow. These come from a tiny &lt;em&gt;projects&lt;/em&gt; content collection (part 6 explains collections) where each project has a &lt;code&gt;featured&lt;/code&gt; flag, so changing what’s on the homepage is a one-line frontmatter edit, not code.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LatestPosts&lt;/strong&gt;: the five newest posts, reusing the same &lt;code&gt;PostCard&lt;/code&gt; component the blog page uses.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Sections have anchor IDs (like &lt;code&gt;#work&lt;/code&gt;), so the hero’s “See my work” button can jump straight down the page, and WorkSection links out to the full &lt;a href=&quot;https://jpshlk.com/projects/&quot;&gt;/projects/&lt;/a&gt; page for everything that didn’t make the featured cut. Fun fact: the first version of this page had more sections, including a Hobbies grid with emoji cards. I cut it the next day. Getting to delete your own ideas cheaply is half the point of building from components. And if you want to see how these components nest inside the layout, the full visual map lives at &lt;a href=&quot;https://jpshlk.com/how-this-site-works/&quot;&gt;how this site works&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;the-about-page-stays-with-a-smaller-job&quot;&gt;The About page stays (with a smaller job)&lt;/h2&gt;
&lt;p&gt;My original plan, and an early draft of this very post, had the landing page &lt;em&gt;replacing&lt;/em&gt; the About page entirely. I talked myself out of it. “Who is this person” and “tell me everything” are different questions, and cramming the long answer onto the homepage would have rebuilt the exact wall of stuff I was tearing down.&lt;/p&gt;
&lt;p&gt;So the split is: the homepage introduces me in ten seconds, and &lt;a href=&quot;https://jpshlk.com/about/&quot;&gt;/about/&lt;/a&gt; is for people who want the long version. That page also absorbed two things that briefly lived as their own pages, a “What I’m doing now” section at &lt;code&gt;/about/#now&lt;/code&gt; and a “What I use” section at &lt;code&gt;/about/#uses&lt;/code&gt;. One page to keep fresh instead of three.&lt;/p&gt;
&lt;p&gt;The old URLs can’t 404, because links to them exist in the wild. Astro handles that in config:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// astro.config.ts&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;redirects&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;  &amp;#39;/aboutme&amp;#39;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;#39;/about/&amp;#39;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;  &amp;#39;/uses&amp;#39;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;#39;/about/#uses&amp;#39;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;  &amp;#39;/now&amp;#39;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;#39;/about/#now&amp;#39;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;},&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;(These get mirrored in &lt;code&gt;public/_redirects&lt;/code&gt; with a &lt;code&gt;301!&lt;/code&gt; force flag, because Astro also emits meta-refresh stub pages at those paths that would otherwise shadow the real redirect. Ask me how I know. 😅)&lt;/p&gt;
&lt;p&gt;That &lt;code&gt;/aboutme&lt;/code&gt; one is fun: an SEO validation tool (part 7) scanned every link in every built page and found one of my &lt;em&gt;old posts&lt;/em&gt; linking to &lt;code&gt;/aboutme&lt;/code&gt;, a page that hadn’t existed for years. A dead link I’d never have noticed, caught by a robot. 🤖&lt;/p&gt;
&lt;h2 id=&quot;the-random-quote-bug-part-4s-rule-striking-again&quot;&gt;The random quote bug (part 4’s rule, striking again)&lt;/h2&gt;
&lt;p&gt;The old homepage had a widget that showed a random quote on each visit. Porting it uncovered the exact bug class from part 4: the old script ran once, as a module, on initial page load. With view transitions, navigating &lt;em&gt;back&lt;/em&gt; to the homepage doesn’t re-run module scripts, so the widget silently died and showed nothing.&lt;/p&gt;
&lt;p&gt;The rebuilt version does a few things differently. The quotes are bundled into the page at build time (no fetch at all; they’re just JSON in the HTML). The widget got a promotion out of the homepage and into the footer, so every page shows one. And the picking logic lives in &lt;code&gt;BaseLayout.astro&lt;/code&gt; instead of the component, listening for &lt;code&gt;astro:before-swap&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// src/layouts/BaseLayout.astro&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; showRandomQuote&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;doc&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; Document&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; container&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; doc.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;querySelector&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;#39;[data-random-quote]&amp;#39;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; data&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; doc.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;querySelector&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;#39;[data-quotes]&amp;#39;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;container &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;||&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; !&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;data?.textContent) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; quotes&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; Array&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;lt;{ &lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;text&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; string&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;author&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; string&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; }&amp;gt; &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; JSON&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;parse&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(data.textContent);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; quote&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; quotes[Math.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;floor&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(Math.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;random&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;() &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; quotes.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;length&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;quote) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  container.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;querySelector&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;#39;[data-quote-text]&amp;#39;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.textContent &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; `“${&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;quote&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;text&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;}”`&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  container.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;querySelector&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;#39;[data-quote-author]&amp;#39;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.textContent &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; `— ${&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;quote&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;author&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;}`&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;showRandomQuote&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(document);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;document.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;addEventListener&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;#39;astro:before-swap&amp;#39;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, (&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;e&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; doc&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (e &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;as&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; Event&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; { &lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;newDocument&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; Document&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; }).newDocument;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  showRandomQuote&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(doc);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Why &lt;code&gt;astro:before-swap&lt;/code&gt; and not the &lt;code&gt;astro:page-load&lt;/code&gt; event from part 4? Timing. &lt;code&gt;page-load&lt;/code&gt; fires after the new page is already visible, so the quote would pop in a beat after the crossfade. &lt;code&gt;before-swap&lt;/code&gt; hands you the &lt;em&gt;incoming&lt;/em&gt; document before it’s shown, so the quote is already sitting there when the page appears. (The first load has no swap, hence the direct call.)&lt;/p&gt;
&lt;p&gt;Bonus: every page you visit now deals you a fresh quote, which is honestly how a random quote widget should have worked all along.&lt;/p&gt;
&lt;h2 id=&quot;one-small-seo-note&quot;&gt;One small SEO note&lt;/h2&gt;
&lt;p&gt;The homepage &lt;code&gt;&amp;lt;title&amp;gt;&lt;/code&gt; used to be just &lt;code&gt;jpshlk.com&lt;/code&gt;. It’s now my name, because the title is what shows up in a Google result, and “Josh Pasholk” tells a searcher more than my domain repeated back at them. Little stuff like this comes from the SEO tooling nagging me, which is part 7’s whole story.&lt;/p&gt;
&lt;p&gt;Next up: &lt;a href=&quot;https://jpshlk.com/blog/migrating-22-posts-without-editing-a-single-one/&quot;&gt;migrating 22 posts without editing a single one&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Thanks for reading and have a good one! 🤙&lt;/p&gt;</content:encoded><category>rebuild</category><category>astro</category><category>web-development</category></item><item><title>A Tiny Design System and a Dark Mode That Works</title><link>https://jpshlk.com/blog/a-tiny-design-system-and-dark-mode-that-works/</link><guid isPermaLink="true">https://jpshlk.com/blog/a-tiny-design-system-and-dark-mode-that-works/</guid><description>My old theme toggle was broken in two educational ways. Building a small design system and a dark mode that survives page transitions fixed both.</description><pubDate>Sun, 26 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;img src=&quot;https://jpshlk.com/_astro/a-tiny-design-system-and-dark-mode-that-works.BIsaDcdc_1tmGJo.webp&quot; alt=&quot;Night workbench lit by a desk lamp with two proof boards clipped side by side, each showing the same set of interface pieces: cards, a pill button, tag chips, and a toggle. The left board is cream with orange elements, the right is dark navy with blue ones. A builder in orange overalls and a hard hat stands between them holding a clipboard, with a warmly lit house in the distance.&quot; width=&quot;1400&quot; height=&quot;732&quot;&gt;&lt;p&gt;&lt;em&gt;This is part 4 of my &lt;a href=&quot;https://jpshlk.com/tags/rebuild/&quot;&gt;rebuild series&lt;/a&gt;. In &lt;a href=&quot;https://jpshlk.com/blog/starting-clean-with-astro-7-and-tailwind-4/&quot;&gt;part 3&lt;/a&gt; I scaffolded the empty Astro 7 project.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Before building any real pages, we built the &lt;em&gt;pieces&lt;/em&gt; pages are made of. And in the process, finally fixed the dark mode toggle that had been quietly broken on the old site for as long as I can remember. The old config literally had a comment next to the theme setting that said “Does not work yet.” 😅&lt;/p&gt;
&lt;h2 id=&quot;what-design-system-means-for-a-blog&quot;&gt;What “design system” means for a blog&lt;/h2&gt;
&lt;p&gt;Forget the enterprise version of that phrase. At personal-site scale, a design system is three things:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Tokens&lt;/strong&gt;: the named values everything uses. A &lt;code&gt;primary&lt;/code&gt; color scale, one font (Inter), consistent grays. They live in the &lt;code&gt;@theme&lt;/code&gt; block from part 3.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A handful of components.&lt;/strong&gt; Mine has eight: &lt;code&gt;Link&lt;/code&gt;, &lt;code&gt;Button&lt;/code&gt;, &lt;code&gt;Card&lt;/code&gt;, &lt;code&gt;TagPill&lt;/code&gt;, &lt;code&gt;Prose&lt;/code&gt; (styles post content), &lt;code&gt;Header&lt;/code&gt;, &lt;code&gt;Footer&lt;/code&gt;, &lt;code&gt;ThemeToggle&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A styleguide page&lt;/strong&gt;: a private &lt;code&gt;/styleguide&lt;/code&gt; route that renders every token and component in both light and dark mode. When I tweak the design, I look at one page instead of clicking through the whole site. It’s marked &lt;code&gt;noindex&lt;/code&gt; and left out of the sitemap, so it’s for my eyes only.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The point of building this &lt;em&gt;before&lt;/em&gt; the homepage: every later page is just arranging pieces that already look right.&lt;/p&gt;
&lt;p&gt;If you want the visual version of how all these pieces compose (layouts, slots, the whole component tree), I keep a living diagram at &lt;a href=&quot;https://jpshlk.com/how-this-site-works/&quot;&gt;how this site works&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;why-dark-mode-toggles-break&quot;&gt;Why dark mode toggles break&lt;/h2&gt;
&lt;p&gt;Here’s what I learned about why my old toggle failed: two separate bugs, both classics.&lt;/p&gt;
&lt;h3 id=&quot;bug-1-the-flash-fouc&quot;&gt;Bug 1: the flash (FOUC)&lt;/h3&gt;
&lt;p&gt;The theme choice lives in &lt;code&gt;localStorage&lt;/code&gt;, which only JavaScript can read. If that JavaScript runs &lt;em&gt;after&lt;/em&gt; the page paints, dark-mode users get a blinding white flash on every load. That’s called FOUC, short for flash of unstyled content.&lt;/p&gt;
&lt;p&gt;The fix: a tiny script in the &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; marked &lt;code&gt;is:inline&lt;/code&gt;, which tells Astro “don’t optimize or move this, run it right here, before anything renders”:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;astro&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;&amp;lt;!-- src/layouts/BaseLayout.astro --&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; is:inline&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  (() &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    const&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; apply&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; () &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;      const&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; stored&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; localStorage.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;getItem&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;#39;theme&amp;#39;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;      const&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; dark&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; stored&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        ?&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; stored &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;===&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &amp;#39;dark&amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        :&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; window.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;matchMedia&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;#39;(prefers-color-scheme: dark)&amp;#39;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;).matches;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      document.documentElement.classList.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;toggle&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;#39;dark&amp;#39;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, dark);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    };&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;    apply&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    document.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;addEventListener&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;#39;astro:after-swap&amp;#39;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, apply);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  })();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In plain words: check for a saved choice; if there isn’t one, follow the system setting; apply the &lt;code&gt;dark&lt;/code&gt; class before the first pixel paints.&lt;/p&gt;
&lt;h3 id=&quot;bug-2-view-transitions-eat-your-javascript&quot;&gt;Bug 2: view transitions eat your JavaScript&lt;/h3&gt;
&lt;p&gt;This site uses Astro’s view transitions (the &lt;code&gt;&amp;lt;ClientRouter /&amp;gt;&lt;/code&gt; component) for those smooth animated page changes. Under the hood, clicking a link doesn’t do a full page load. Instead, Astro fetches the next page and &lt;em&gt;swaps the document&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;That swap is where naive theme code dies twice over: the fresh document arrives without your &lt;code&gt;dark&lt;/code&gt; class (instant un-theming), and your click handlers were attached to elements that just got thrown away (the toggle goes dead after one navigation). &lt;strong&gt;That was my old site’s bug.&lt;/strong&gt; The toggle worked until you clicked a link. Then, nothing.&lt;/p&gt;
&lt;p&gt;Astro provides events for exactly this. &lt;code&gt;astro:after-swap&lt;/code&gt; fires right after the new document lands; that’s the &lt;code&gt;apply&lt;/code&gt; listener in the snippet above, re-applying the theme mid-swap. And &lt;code&gt;astro:page-load&lt;/code&gt; fires after every navigation, which is where the button wires itself up:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;astro&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;&amp;lt;!-- src/components/ThemeToggle.astro --&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  function&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; bindThemeToggles&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; button&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; of&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; document.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;querySelectorAll&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;#39;[data-theme-toggle]&amp;#39;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      button.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;addEventListener&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;#39;click&amp;#39;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, () &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        const&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; dark&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; !&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;document.documentElement.classList.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;contains&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;#39;dark&amp;#39;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        document.documentElement.classList.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;toggle&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;#39;dark&amp;#39;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, dark);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        localStorage.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;setItem&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;#39;theme&amp;#39;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, dark &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;?&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &amp;#39;dark&amp;#39;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; :&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &amp;#39;light&amp;#39;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  document.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;addEventListener&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;#39;astro:page-load&amp;#39;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, bindThemeToggles);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The rule of thumb I took away: &lt;strong&gt;on a view-transitions site, any JavaScript that touches the page must run on &lt;code&gt;astro:page-load&lt;/code&gt;, not just once at startup.&lt;/strong&gt; This one rule explains the theme toggle, the mobile menu, and a random-quote widget bug coming up in part 5.&lt;/p&gt;
&lt;h2 id=&quot;did-it-actually-work&quot;&gt;Did it actually work?&lt;/h2&gt;
&lt;p&gt;We tested it with an automated browser: load the site with dark system settings (no flash), toggle to light, navigate through five pages (stays light), toggle again (still responds). All green. The styleguide got screenshotted in both themes for a visual once-over.&lt;/p&gt;
&lt;p&gt;Next up: &lt;a href=&quot;https://jpshlk.com/blog/turning-my-homepage-into-a-landing-page/&quot;&gt;turning the homepage into an actual landing page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Thanks for reading and have a good one! 🤙&lt;/p&gt;</content:encoded><category>rebuild</category><category>astro</category><category>web-development</category></item><item><title>Starting Clean With Astro 7 and Tailwind 4</title><link>https://jpshlk.com/blog/starting-clean-with-astro-7-and-tailwind-4/</link><guid isPermaLink="true">https://jpshlk.com/blog/starting-clean-with-astro-7-and-tailwind-4/</guid><description>What a from-scratch Astro project looks like in 2026: the dependencies I actually needed, why Astro 7 was safe to bet on, and Tailwind with no config file.</description><pubDate>Thu, 23 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;img src=&quot;https://jpshlk.com/_astro/starting-clean-with-astro-7-and-tailwind-4.Bl3gMIwY_BIYUt.webp&quot; alt=&quot;Dark blueprint-style illustration of a multi-story building rising from a clean foundation at night, its scaffold drawn in glowing blue code, with floating panels of Astro config code and stacked crates of preserved content beside it.&quot; width=&quot;1400&quot; height=&quot;732&quot;&gt;&lt;p&gt;&lt;em&gt;This is part 3 of my &lt;a href=&quot;https://jpshlk.com/tags/rebuild/&quot;&gt;rebuild series&lt;/a&gt;. In &lt;a href=&quot;https://jpshlk.com/blog/back-up-your-site-with-a-git-branch/&quot;&gt;part 2&lt;/a&gt; I backed up the old site to a git branch.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;With the backup in place, it was demolition day. Everything in &lt;code&gt;src/&lt;/code&gt; got deleted except two folders: &lt;code&gt;src/content/&lt;/code&gt; (my actual posts) and &lt;code&gt;src/assets/&lt;/code&gt; (my images). Content is cargo; code is the ship. We were only replacing the ship.&lt;/p&gt;
&lt;h2 id=&quot;the-entire-dependency-list&quot;&gt;The entire dependency list&lt;/h2&gt;
&lt;p&gt;One thing I love about this rebuild: I can explain every single package. Here’s the new &lt;code&gt;package.json&lt;/code&gt;, dependencies only:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &amp;quot;dependencies&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    &amp;quot;@astrojs/mdx&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;^7.0.2&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    &amp;quot;@astrojs/rss&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;^4.0.19&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    &amp;quot;@astrojs/sitemap&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;^3.7.3&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    &amp;quot;@fontsource-variable/inter&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;^5.2.8&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    &amp;quot;@jdevalk/astro-seo-graph&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;^2.2.0&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    &amp;quot;@jdevalk/seo-graph-core&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;^0.7.0&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    &amp;quot;astro&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;^7.0.7&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &amp;quot;devDependencies&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    &amp;quot;@astrojs/check&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;^0.9.6&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    &amp;quot;@tailwindcss/typography&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;^0.5.20&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    &amp;quot;@tailwindcss/vite&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;^4.3.2&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    &amp;quot;tailwindcss&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;^4.3.2&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    &amp;quot;typescript&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;^5.8.0&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Line by line: &lt;strong&gt;mdx&lt;/strong&gt; lets my posts mix components into markdown. &lt;strong&gt;rss&lt;/strong&gt; and &lt;strong&gt;sitemap&lt;/strong&gt; generate the feed and sitemap. &lt;strong&gt;fontsource&lt;/strong&gt; self-hosts my font (no more Google Fonts slowing down first paint). The two &lt;strong&gt;@jdevalk&lt;/strong&gt; packages are the SEO suite from Yoast’s founder (that’s part 7). &lt;strong&gt;astro&lt;/strong&gt; is the framework. Dev side: type checking, Tailwind, and its typography plugin for styling post content.&lt;/p&gt;
&lt;p&gt;No React. No UI framework at all. A blog is mostly HTML. Astro renders it at build time, and the few interactive bits (theme toggle, mobile menu) are small vanilla JavaScript.&lt;/p&gt;
&lt;h2 id=&quot;why-astro-7-was-the-right-risk&quot;&gt;Why Astro 7 was the right risk&lt;/h2&gt;
&lt;p&gt;Astro 7 was about three weeks old when we started, and my first instinct was to play it safe with 6. Here’s what changed my mind.&lt;/p&gt;
&lt;p&gt;Astro 7’s headline change is a new Rust compiler that’s &lt;em&gt;stricter&lt;/em&gt;: unclosed HTML tags are now build errors instead of silently accepted. That’s a real migration hazard &lt;strong&gt;for existing codebases&lt;/strong&gt;. Old code full of sloppy markup breaks. But we were writing every file from scratch, so we’d just… write valid HTML from day one. The strictness only ever helped us.&lt;/p&gt;
&lt;p&gt;The lesson generalizes: a “risky” upgrade is often only risky for code you already have. A clean slate is the cheapest possible time to be on the newest major version, because it means no forced migration six months later.&lt;/p&gt;
&lt;p&gt;One real requirement to know about: Astro 7 needs &lt;strong&gt;Node 22.12 or newer&lt;/strong&gt;. This matters again at deploy time (part 8).&lt;/p&gt;
&lt;h2 id=&quot;the-config-in-typescript&quot;&gt;The config, in TypeScript&lt;/h2&gt;
&lt;p&gt;Astro configs can be TypeScript files, which means typo-checking and autocomplete on your own config:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// astro.config.ts&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; mdx &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &amp;#39;@astrojs/mdx&amp;#39;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; sitemap &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &amp;#39;@astrojs/sitemap&amp;#39;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; tailwindcss &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &amp;#39;@tailwindcss/vite&amp;#39;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; { defineConfig } &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &amp;#39;astro/config&amp;#39;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; default&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; defineConfig&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  site: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;#39;https://jpshlk.com&amp;#39;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  prefetch: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;true&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  integrations: [&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;mdx&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(), &lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;sitemap&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;()],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  vite: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    plugins: [&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;tailwindcss&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;()],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Two things worth noticing. The &lt;code&gt;site&lt;/code&gt; value is my canonical domain, and setting it forced me to fix a typo (&lt;code&gt;jshlk.com&lt;/code&gt;) that had been quietly poisoning my old sitemap and canonical URLs. And Tailwind is now a &lt;strong&gt;Vite plugin&lt;/strong&gt;, not an Astro integration, which brings me to the fun part.&lt;/p&gt;
&lt;h2 id=&quot;tailwind-4-the-config-file-is-gone&quot;&gt;Tailwind 4: the config file is gone&lt;/h2&gt;
&lt;p&gt;If you learned Tailwind before v4, you knew &lt;code&gt;tailwind.config.js&lt;/code&gt;, a JavaScript file describing your colors, fonts, and plugins. Tailwind 4 deleted the whole concept. Configuration now lives &lt;em&gt;in your CSS&lt;/em&gt;:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;/* src/styles/global.css */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;@import&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &amp;#39;tailwindcss&amp;#39;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;@plugin&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; &amp;#39;@tailwindcss/typography&amp;#39;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;@theme&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; inline {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  --font-sans: &amp;#39;Inter Variable&amp;#39;, &lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;ui-sans-serif&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;system-ui&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;sans-serif&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  --color-primary-500: var(--color-sky-500);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;  /* ...the full 50–950 primary scale... */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;@theme&lt;/code&gt; block replaces the old config: define a CSS variable, get utility classes for free. Declare &lt;code&gt;--color-primary-500&lt;/code&gt; and &lt;code&gt;text-primary-500&lt;/code&gt; just exists. It sounds like a small change, but it makes the design system feel like &lt;em&gt;CSS&lt;/em&gt; instead of a JavaScript puzzle, which is exactly where part 4 picks up.&lt;/p&gt;
&lt;p&gt;At this point the site built successfully and rendered one nearly-empty page. Felt amazing anyway. Every rebuild needs its “hello world” moment.&lt;/p&gt;
&lt;p&gt;Next up: &lt;a href=&quot;https://jpshlk.com/blog/a-tiny-design-system-and-dark-mode-that-works/&quot;&gt;a tiny design system, and a dark mode toggle that finally works&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Thanks for reading and have a good one! 🤙&lt;/p&gt;</content:encoded><category>rebuild</category><category>astro</category><category>web-development</category></item><item><title>Don&apos;t Keep Your Git Repos in iCloud</title><link>https://jpshlk.com/blog/dont-keep-your-git-repos-in-icloud/</link><guid isPermaLink="true">https://jpshlk.com/blog/dont-keep-your-git-repos-in-icloud/</guid><description>Duplicate posts, a git index that wiped itself, and a pull that died with mmap failed. Three weird bugs, one cause: my repo lived in iCloud Drive.</description><pubDate>Sun, 19 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;img src=&quot;https://jpshlk.com/_astro/dont-keep-your-git-repos-in-icloud.Q-D3cnX-_1y0bbO.webp&quot; alt=&quot;Dark illustration of a grinning cloud with glowing eyes looming over a laptop at night, its tendrils lifting ghostly duplicate files out of the file tree on the screen while one tendril dangles a padlocked folder.&quot; width=&quot;1400&quot; height=&quot;732&quot;&gt;&lt;p&gt;Today my site’s repo found three completely different ways to ruin my afternoon. It took me an embarrassingly long time to notice they were all the same bug wearing different hats.&lt;/p&gt;
&lt;p&gt;The culprit: my code lived in &lt;code&gt;~/Documents&lt;/code&gt;, and &lt;code&gt;~/Documents&lt;/code&gt; syncs to iCloud.&lt;/p&gt;
&lt;p&gt;If you keep git repos in iCloud Drive (or Dropbox, or Google Drive), this one’s for you. 🤙&lt;/p&gt;
&lt;h2 id=&quot;bug-1-my-blog-grew-duplicate-posts&quot;&gt;Bug 1: my blog grew duplicate posts&lt;/h2&gt;
&lt;p&gt;First symptom: my blog list had posts showing up twice. Not a rendering bug, actual duplicates.&lt;/p&gt;
&lt;p&gt;The cause was sitting in my repo:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;src/content/blog/static-site-search-with-pagefind 2.mdx&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;src/content/blog/web-development-am-i-an-imposter 2.mdx&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;src/components/ProjectCard 2.astro&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That &lt;code&gt; 2&lt;/code&gt; suffix is iCloud’s conflict resolution. When it thinks a file changed in two places, it doesn’t ask, it just quietly makes a copy with a number on the end. There were 21 of them, every single one byte-for-byte identical to its original.&lt;/p&gt;
&lt;p&gt;My blog builds its post list by globbing &lt;code&gt;src/content/blog/*.mdx&lt;/code&gt;. So Astro found &lt;code&gt;pagefind.mdx&lt;/code&gt; and &lt;code&gt;pagefind 2.mdx&lt;/code&gt;, and dutifully built both. iCloud invented content for my site.&lt;/p&gt;
&lt;h2 id=&quot;bug-2-git-said-i-deleted-my-entire-website&quot;&gt;Bug 2: git said I deleted my entire website&lt;/h2&gt;
&lt;p&gt;Next, &lt;code&gt;git status&lt;/code&gt; told me I had deleted basically everything:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;deleted:    src/content/blog/rebuilding-my-blog-with-ai.mdx&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;deleted:    astro.config.ts&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;deleted:    package.json&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;... 200 more&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Except every one of those files was sitting right there on disk. I could open them.&lt;/p&gt;
&lt;p&gt;Here’s what happened. Git keeps a file at &lt;code&gt;.git/index&lt;/code&gt; that tracks everything in your repo (it’s what &lt;code&gt;git add&lt;/code&gt; writes to, the staging area). Mine was &lt;strong&gt;gone&lt;/strong&gt;. Deleted. In its place was a leftover &lt;code&gt;.git/index.lock&lt;/code&gt;, the temporary file git writes to before swapping it into place.&lt;/p&gt;
&lt;p&gt;So some git process had started writing a new index, and something killed it mid-write. Git compared “nothing in the index” against “202 files in the last commit” and concluded I’d nuked my site.&lt;/p&gt;
&lt;p&gt;The fix was gentler than it looked, because the working files and the commit history were both fine:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;rm&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -f&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; .git/index.lock&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;git&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; reset&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;git reset&lt;/code&gt; (no &lt;code&gt;--hard&lt;/code&gt;, never &lt;code&gt;--hard&lt;/code&gt; here) rebuilds the index from your last commit and touches nothing else. 202 files came right back. Nothing was ever actually lost.&lt;/p&gt;
&lt;h2 id=&quot;bug-3-fatal-mmap-failed&quot;&gt;Bug 3: fatal: mmap failed&lt;/h2&gt;
&lt;p&gt;Then &lt;code&gt;git pull&lt;/code&gt; started doing this:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;fatal: mmap failed: Operation timed out&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This one is a great clue, because it rules things out. It’s not a network problem: a pull moments earlier had said “Already up to date,” so GitHub was reachable. &lt;code&gt;mmap&lt;/code&gt; is memory-mapping, which is how git reads its bigger files by pointing at them on disk instead of loading them into memory. It’s a purely &lt;strong&gt;local&lt;/strong&gt; file operation.&lt;/p&gt;
&lt;p&gt;Git was trying to read a file on my own hard drive, and my own hard drive timed out.&lt;/p&gt;
&lt;h2 id=&quot;one-cause-behind-all-three&quot;&gt;One cause behind all three&lt;/h2&gt;
&lt;p&gt;Everything clicked when I ran &lt;code&gt;brctl status&lt;/code&gt;, the command line tool for iCloud Drive:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Client Truth Unclean Items:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Under /Documents/GitHub/jpshlk-blog/.git/objects/49&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;There it is. iCloud was actively syncing the inside of my &lt;code&gt;.git&lt;/code&gt; folder.&lt;/p&gt;
&lt;p&gt;That’s all three bugs at once:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It made conflict copies of my posts (the &lt;code&gt; 2&lt;/code&gt; files).&lt;/li&gt;
&lt;li&gt;It was writing to git’s internals while git was writing to them, which is how an index gets destroyed mid-write.&lt;/li&gt;
&lt;li&gt;It had &lt;strong&gt;evicted&lt;/strong&gt; some files to the cloud, replacing the local copy with a stub, so when git tried to &lt;code&gt;mmap&lt;/code&gt; a file, macOS had to go download it first. That download stalled, and git got a timeout.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;git-and-file-sync-cant-share-a-folder&quot;&gt;Git and file sync can’t share a folder&lt;/h2&gt;
&lt;p&gt;The realization that should have come to me hours earlier: &lt;strong&gt;git already is your sync.&lt;/strong&gt; That’s the entire point of it. Layering iCloud on top isn’t belt and suspenders, it’s two systems fighting over the same files.&lt;/p&gt;
&lt;p&gt;And &lt;code&gt;.git&lt;/code&gt; is the worst possible thing to hand a file syncer. It’s thousands of tiny files that change constantly, get rewritten in place, and depend on exact timing (write a temp file, then atomically swap it in). iCloud sees churn and tries to helpfully sync every step. Git sees its files moving under it and falls over.&lt;/p&gt;
&lt;p&gt;Cloud sync is built for documents you edit occasionally. A git repo is the opposite of that.&lt;/p&gt;
&lt;h2 id=&quot;getting-out-was-worse-than-getting-in&quot;&gt;Getting out was worse than getting in&lt;/h2&gt;
&lt;p&gt;Fine, I thought. I’ll just move the folder out of &lt;code&gt;~/Documents&lt;/code&gt;. This took the rest of the afternoon.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Finder stalled.&lt;/strong&gt; Dragging the folder did nothing, forever, because Finder waits on iCloud’s sync engine, and the sync engine was stuck.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;cp&lt;/code&gt; stalled.&lt;/strong&gt; It’s also silent, so you can’t tell if it’s working or hung. (Tip I wish I’d known sooner: press &lt;strong&gt;Ctrl-T&lt;/strong&gt; during a running &lt;code&gt;cp&lt;/code&gt; and it prints the file it’s on. It was fine, just grinding through &lt;code&gt;node_modules&lt;/code&gt;.)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;rsync&lt;/code&gt; got further,&lt;/strong&gt; because it’s the better tool here: it can skip stuff (&lt;code&gt;--exclude=&amp;#39;node_modules&amp;#39;&lt;/code&gt;) and it resumes where it left off if it dies. But it kept dying:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;rsync: Bug-Daddy/launch-site/.git/HEAD: mmap: Operation canceled&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Same &lt;code&gt;mmap&lt;/code&gt; error, now on a &lt;code&gt;.git/HEAD&lt;/code&gt; that iCloud would not cough up. I wrapped rsync in a retry loop and came back an hour later to find it still failing on the same file. (Bonus lesson: a &lt;code&gt;until ... done&lt;/code&gt; loop swallows Ctrl-C, since each press only kills the current command and the loop starts the next one. Just close the terminal window.)&lt;/p&gt;
&lt;p&gt;I checked “Optimize Mac Storage,” the setting that lets iCloud evict local files to save space. It was &lt;strong&gt;already off&lt;/strong&gt;. iCloud was evicting my files anyway.&lt;/p&gt;
&lt;p&gt;At that point I stopped trying to reason with it.&lt;/p&gt;
&lt;h2 id=&quot;what-actually-worked&quot;&gt;What actually worked&lt;/h2&gt;
&lt;p&gt;The answer was sitting there the whole time: &lt;strong&gt;GitHub already had a perfect copy of my repo.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I didn’t need to rescue those local files at all. I needed the repo, and the repo lives on GitHub. So:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;git&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; clone&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; https://github.com/jpasholk/jpshlk-blog.git&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ~/Developer/GitHub/jpshlk-blog&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;cd&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ~/Developer/GitHub/jpshlk-blog&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;npm&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; install&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ten seconds. A clean, complete, iCloud-free repo, and I was back to work.&lt;/p&gt;
&lt;p&gt;That’s the quiet upside of pushing your work: when your local copy gets held hostage, you can just walk away from it. The only thing a fresh clone can’t recover is work you never committed, which is its own argument for committing more often.&lt;/p&gt;
&lt;h2 id=&quot;where-repos-belong&quot;&gt;Where repos belong&lt;/h2&gt;
&lt;p&gt;Anywhere that isn’t &lt;code&gt;~/Documents&lt;/code&gt; or &lt;code&gt;~/Desktop&lt;/code&gt;, since those are the two folders iCloud syncs. I moved mine to:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;~/Developer&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Apple gives that folder a little hammer icon and Xcode expects it, so it may as well be the standard. &lt;code&gt;~/code&lt;/code&gt; or &lt;code&gt;~/Projects&lt;/code&gt; work exactly as well. The only rule is to stay out of any folder a sync service is watching.&lt;/p&gt;
&lt;p&gt;If you’re reading this from a repo in your Documents folder: it’s working &lt;em&gt;right now&lt;/em&gt;, sure. It was working for me too, for months. Then one afternoon it made duplicate blog posts, deleted its own index, and refused to read its own files.&lt;/p&gt;
&lt;p&gt;Move it. It takes ten seconds and it’ll save your afternoon.&lt;/p&gt;
&lt;p&gt;Thanks for reading and have a good one! 🤙&lt;/p&gt;</content:encoded><category>git</category><category>web-development</category><category>mac</category><category>bugs</category></item><item><title>Back Up Your Site With a Git Branch</title><link>https://jpshlk.com/blog/back-up-your-site-with-a-git-branch/</link><guid isPermaLink="true">https://jpshlk.com/blog/back-up-your-site-with-a-git-branch/</guid><description>Before deleting my entire site for the rebuild, I made a one-command backup that keeps the old code browsable forever. Here&apos;s the five-minute git trick.</description><pubDate>Wed, 15 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;img src=&quot;https://jpshlk.com/_astro/back-up-your-site-with-a-git-branch.Dr6aj44R_13t2SF.webp&quot; alt=&quot;Flat night scene of a git commit graph where a side branch lifts the old site, drawn as a small house under a protective dome, safely above the ground while a hard-hat builder plants a branch flag below.&quot; width=&quot;1400&quot; height=&quot;732&quot;&gt;&lt;p&gt;&lt;em&gt;This is part 2 of my &lt;a href=&quot;https://jpshlk.com/tags/rebuild/&quot;&gt;rebuild series&lt;/a&gt;. Part 1 is &lt;a href=&quot;https://jpshlk.com/blog/rebuilding-my-blog-with-ai/&quot;&gt;the story of the whole project&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Step one of rebuilding my site from scratch was deleting almost everything in it. That’s terrifying. This post is about the one-command safety net that made it not terrifying.&lt;/p&gt;
&lt;h2 id=&quot;isnt-git-already-a-backup&quot;&gt;”Isn’t git already a backup?”&lt;/h2&gt;
&lt;p&gt;Technically, yes. Git keeps the full history of every file, so nothing committed is ever really gone. But here’s the practical problem: once you delete files and pile new commits on top, &lt;em&gt;finding&lt;/em&gt; the old stuff means digging through history with commands you have to look up every time.&lt;/p&gt;
&lt;p&gt;A &lt;strong&gt;branch&lt;/strong&gt; fixes that. A branch is just a named pointer to a specific moment in your repo’s history. Point one at your site as it exists today, and the entire old codebase stays one click away on GitHub. Forever, no digging.&lt;/p&gt;
&lt;h2 id=&quot;the-whole-backup&quot;&gt;The whole backup&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;git&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; branch&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; legacy-site&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; origin/main&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;git&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; push&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -u&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; origin&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; legacy-site&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That’s it. The first line creates a branch called &lt;code&gt;legacy-site&lt;/code&gt; pointing at the current state of &lt;code&gt;main&lt;/code&gt; (the old site). The second pushes it to GitHub. Nothing about your live site changes; you’ve just planted a flag that says “the old site lives here.”&lt;/p&gt;
&lt;p&gt;Now you can delete files on your working branch with total confidence.&lt;/p&gt;
&lt;h2 id=&quot;actually-using-the-backup&quot;&gt;Actually using the backup&lt;/h2&gt;
&lt;p&gt;Here’s the part I didn’t know before this project. You don’t have to &lt;em&gt;switch&lt;/em&gt; branches to look at old code. &lt;code&gt;git show&lt;/code&gt; can read any file from any branch directly:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;git&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; show&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; legacy-site:src/components/BaseHead.astro&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That prints the old &lt;code&gt;BaseHead&lt;/code&gt; component to your terminal without touching your working files. During the rebuild we used this constantly. “What props did the old social icons take?” was one &lt;code&gt;git show&lt;/code&gt; away, while the new code stayed untouched in the editor.&lt;/p&gt;
&lt;p&gt;You can also just browse the branch on GitHub with the branch picker dropdown. Old site, fully intact, read-only.&lt;/p&gt;
&lt;h2 id=&quot;branches-vs-tags-two-sentence-version&quot;&gt;Branches vs. tags (two-sentence version)&lt;/h2&gt;
&lt;p&gt;A &lt;strong&gt;tag&lt;/strong&gt; is like a branch except it’s meant to never move: a permanent label like &lt;code&gt;v1-legacy&lt;/code&gt;. A &lt;strong&gt;branch&lt;/strong&gt; can accept new commits; a tag is a snapshot. For a backup, either works; I did both, because they’re free:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;git&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; tag&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; v1-legacy&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; origin/main&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;git&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; push&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; origin&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; v1-legacy&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;the-mindset-shift&quot;&gt;The mindset shift&lt;/h2&gt;
&lt;p&gt;The real value here isn’t technical, it’s psychological. Every destructive step in the rebuild (deleting the layouts, the components, the old configs) felt fine, because “undo” was always available. If the rebuild had gone sideways I could have walked away with nothing lost.&lt;/p&gt;
&lt;p&gt;If you’re about to do anything drastic to a project: branch first. It costs five seconds and buys unlimited courage. 💪&lt;/p&gt;

&lt;p&gt;Thanks for reading and have a good one! 🤙&lt;/p&gt;</content:encoded><category>rebuild</category><category>web-development</category><category>git</category></item><item><title>How I Rebuilt My Blog From Scratch With AI</title><link>https://jpshlk.com/blog/rebuilding-my-blog-with-ai/</link><guid isPermaLink="true">https://jpshlk.com/blog/rebuilding-my-blog-with-ai/</guid><description>I tore this entire site down to the studs and rebuilt it with Astro 7, with an AI doing the heavy lifting. Here&apos;s the story, and the start of a series.</description><pubDate>Fri, 10 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;img src=&quot;https://jpshlk.com/_astro/rebuilding-my-blog-with-ai.BeTNPTFl_Y8KcS.webp&quot; alt=&quot;Illustration of a house being rebuilt at night: a crane lowers dark code panels into the wooden framing on one side while the finished side glows with browser windows, and a small builder with a blueprint and coffee stands by the front door.&quot; width=&quot;1400&quot; height=&quot;732&quot;&gt;&lt;p&gt;&lt;em&gt;This is part 1 of my &lt;a href=&quot;https://jpshlk.com/tags/rebuild/&quot;&gt;rebuild series&lt;/a&gt;, where I document tearing this site down and rebuilding it from scratch.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;If you’re reading this, you’re looking at a brand new website. Same posts, same me, but every single line of code under the hood was rewritten from scratch. And I’ll be honest with you: I didn’t write most of it. An AI did. I just told it what I wanted, made the decisions, and learned a ton along the way. 🤙&lt;/p&gt;
&lt;p&gt;This post kicks off a series documenting the whole thing, in pieces simple enough that I could have followed them a couple years ago.&lt;/p&gt;
&lt;h2 id=&quot;why-rebuild-at-all&quot;&gt;Why rebuild at all?&lt;/h2&gt;
&lt;p&gt;The old version of this site was a port of a popular theme, &lt;a href=&quot;https://github.com/timlrx/tailwind-nextjs-starter-blog&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; class=&quot;underline-offset-2 hover:underline&quot;&gt;tailwind-nextjs-starter-blog&lt;/a&gt;, adapted to &lt;a href=&quot;https://astro.build&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; class=&quot;underline-offset-2 hover:underline&quot;&gt;Astro&lt;/a&gt;. It served me well while I was learning, but it had problems:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It was somebody else’s design with my name on it.&lt;/li&gt;
&lt;li&gt;It was stuck on Astro 3, several major versions behind.&lt;/li&gt;
&lt;li&gt;The homepage was just a list of posts. I wanted a &lt;strong&gt;landing page&lt;/strong&gt; (about me, my work, my hobbies) with the blog one click away.&lt;/li&gt;
&lt;li&gt;The dark mode toggle was broken. (More on that in part 4. It was broken in a &lt;em&gt;really&lt;/em&gt; educational way. 😜)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I also wanted serious SEO, and it turns out the founder of Yoast (the WordPress SEO plugin that runs half the internet) has been building &lt;a href=&quot;https://joost.blog/astro-seo-complete-guide/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; class=&quot;underline-offset-2 hover:underline&quot;&gt;SEO tools for Astro&lt;/a&gt;. That sealed it.&lt;/p&gt;
&lt;h2 id=&quot;how-the-ai-part-actually-worked&quot;&gt;How the AI part actually worked&lt;/h2&gt;
&lt;p&gt;I used Claude Code, and the part that surprised me most wasn’t the code. It was the &lt;em&gt;planning&lt;/em&gt;. Before touching anything, it:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Explored my repo&lt;/strong&gt; and figured out how the old site worked, including things I’d forgotten about.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Researched the tools.&lt;/strong&gt; It looked up the actual npm versions and discovered that the SEO package I wanted required Astro 6 or 7, which changed the whole plan.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Asked me real questions.&lt;/strong&gt; Not “are you sure?” busywork; actual decisions: Netlify or Cloudflare? Keep the projects page or fold it into the landing page? And my favorite: &lt;em&gt;“Your config says &lt;code&gt;jshlk.com&lt;/code&gt; but your site title says &lt;code&gt;jpshlk.com&lt;/code&gt;. Which one is right?”&lt;/em&gt; It found a typo in my canonical domain that had been sitting there the entire time.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Then it wrote a phased plan, and I pushed back on it. The first version was a “refactor.” I said no: complete rewrite, build the design system first, then the landing page, then bring the content over. It threw away the old plan and made a new one. That back-and-forth is the actual skill of working with AI, as far as I can tell: it does the labor, but &lt;em&gt;you&lt;/em&gt; have to know what you want.&lt;/p&gt;
&lt;h2 id=&quot;the-plan-we-landed-on&quot;&gt;The plan we landed on&lt;/h2&gt;
&lt;p&gt;Six phases, each one a working checkpoint:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Back up the old site&lt;/strong&gt; to a git branch (part 2)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Clean-slate scaffold:&lt;/strong&gt; Astro 7, Tailwind CSS v4, TypeScript, no UI framework (part 3)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Design system:&lt;/strong&gt; colors, type, components, and a dark mode that finally works (part 4)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Landing page:&lt;/strong&gt; hero, about, work, hobbies (part 5)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Content migration:&lt;/strong&gt; all my posts, without editing a single one (part 6)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SEO layer + launch:&lt;/strong&gt; the Yoast founder’s toolkit, then launch day (parts 7 and 8)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Plus bonus parts on teaching the AI my writing voice (part 9) and the MCP servers that make AI dev tools way smarter (part 10).&lt;/p&gt;
&lt;h2 id=&quot;the-plan-kept-growing&quot;&gt;The plan kept growing&lt;/h2&gt;
&lt;p&gt;Once the six phases were done, the site kept sprouting features, and each one turned into its own short post. Parts 11 through 17 are already written:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Every post gets its own &lt;strong&gt;share image&lt;/strong&gt; (part 11)&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;related posts&lt;/strong&gt; section with no database (part 12)&lt;/li&gt;
&lt;li&gt;The little &lt;strong&gt;reading time&lt;/strong&gt; label (part 13)&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;copy button&lt;/strong&gt; on every code block (part 14)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Full posts in the RSS feed&lt;/strong&gt;, not summaries (part 15)&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;/uses page&lt;/strong&gt; built by grepping my own posts (part 16)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Privacy-friendly analytics&lt;/strong&gt; with GoatCounter (part 17)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And the rebuild doesn’t stop at launch. Five more parts are on the roadmap, each one a feature this site doesn’t have yet:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;/now page&lt;/strong&gt; for what I’m into lately (part 18)&lt;/li&gt;
&lt;li&gt;My &lt;strong&gt;RoutineHub shortcuts&lt;/strong&gt; as first-class content here, not just links (part 19)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Static site search&lt;/strong&gt; with Pagefind (part 20)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Comments&lt;/strong&gt; (part 21). The old site ran Giscus, and I’m deciding between bringing it back or wiring comments to Bluesky or Mastodon replies instead. That decision is the post.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Generated share images&lt;/strong&gt;, built per post at build time (part 22)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Build the thing, then write about the thing. That’s the whole model.&lt;/p&gt;
&lt;h2 id=&quot;what-id-tell-past-me&quot;&gt;What I’d tell past me&lt;/h2&gt;
&lt;p&gt;You don’t need to be an expert to do this. You need to be able to &lt;em&gt;read&lt;/em&gt; code well enough to sanity-check it, describe what you want clearly, and make decisions when asked. The AI handled Astro’s breaking changes, the Tailwind 4 migration, and a hundred details I’d have tripped on. I handled the taste, the priorities, and the “wait, that’s not what I meant.”&lt;/p&gt;
&lt;p&gt;That division of labor felt fair. And I understand my own site far better than when it was a theme I’d ported and half-understood.&lt;/p&gt;
&lt;p&gt;Next up: &lt;a href=&quot;https://jpshlk.com/blog/back-up-your-site-with-a-git-branch/&quot;&gt;the five-minute git trick&lt;/a&gt; that made deleting my entire site feel safe.&lt;/p&gt;
&lt;p&gt;Thanks for reading and have a good one! 🤙&lt;/p&gt;</content:encoded><category>rebuild</category><category>ai</category><category>astro</category><category>web-development</category></item><item><title>I Guest-Host A Podcast About Shortcuts</title><link>https://jpshlk.com/blog/routinehub-podcast-live-review-sessions-5/</link><guid isPermaLink="true">https://jpshlk.com/blog/routinehub-podcast-live-review-sessions-5/</guid><description>I recently started co-hosting a podcast for RoutineHub, check out Episode 5!</description><pubDate>Thu, 09 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;img src=&quot;https://jpshlk.com/_astro/routinehub-podcast.D5Bw0FeJ_28y0xJ.webp&quot; alt=&quot;Flat night scene of a podcast microphone beside floating Shortcuts style app tiles, with a small character taking review notes on a clipboard.&quot; width=&quot;1400&quot; height=&quot;732&quot;&gt;&lt;p&gt;I started helping out with the RoutineHub Live Review Sessions Podcast sort of by accident a little while back. To make a long story short, I tuned into an episode and discovered they were discussing a Shortcut I created. I ended up joining the conversation and it went from there.&lt;/p&gt;
&lt;p&gt;Now I try and help out with every episode I can. It’s a lot of fun, and I hope we are able to do them more often soon!&lt;/p&gt;
&lt;h2 id=&quot;routinehub-live-review-sessions---episode-5-focusing-on-simplicity&quot;&gt;RoutineHub Live Review Sessions - Episode 5: Focusing On Simplicity&lt;/h2&gt;
&lt;iframe class=&quot;block mx-auto&quot; width=&quot;100%&quot; height=&quot;315&quot; src=&quot;https://www.youtube-nocookie.com/embed/45ssmmBut7c?si=JZ4oDa6nXkx57_2c&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; referrerpolicy=&quot;strict-origin-when-cross-origin&quot; allowfullscreen&gt;&lt;/iframe&gt;
&lt;p&gt;In this episode we cover some simple Shortcuts that are fun to use or perform a simple task quickly. The idea is to show something to people who aren’t into automation in general and make them go, “How did you do that?”&lt;/p&gt;
&lt;h2 id=&quot;show-notes&quot;&gt;Show Notes&lt;/h2&gt;
&lt;p&gt;Here are the Shortcuts we reviewed, along with a few notes on how they work. We start with some very simple Shortcuts, and move on to others that are a bit more complicated, yet still conceptually easy to understand.&lt;/p&gt;
&lt;h3 id=&quot;1-speak-text&quot;&gt;&lt;a href=&quot;https://www.icloud.com/shortcuts/4fb21e0af6a34b02abe4dd39a77c2b92&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; class=&quot;underline-offset-2 hover:underline text-primary-500 hover:text-sky-600 dark:hover:text-primary-400&quot;&gt;1. Speak Text&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Sets Media Volume to 100%.&lt;/li&gt;
&lt;li&gt;Asks for text as input, then has Siri Speak what you entered.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;2-sag-greg-trombone&quot;&gt;&lt;a href=&quot;https://www.icloud.com/shortcuts/1b61fdcf753b418b83b87e77b65865d9&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; class=&quot;underline-offset-2 hover:underline text-primary-500 hover:text-sky-600 dark:hover:text-primary-400&quot;&gt;2. Sag Greg (Trombone)&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Sets Media Volume at 100%.&lt;/li&gt;
&lt;li&gt;Text action with a base64 string of the Sad Trombone Sound.&lt;/li&gt;
&lt;li&gt;Decodes the base64.&lt;/li&gt;
&lt;li&gt;Plays sound.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;3-qr-wifi&quot;&gt;&lt;a href=&quot;https://www.icloud.com/shortcuts/2701c96294d94a188e49ff0b1f85881f&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; class=&quot;underline-offset-2 hover:underline text-primary-500 hover:text-sky-600 dark:hover:text-primary-400&quot;&gt;3. QR Wifi&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Text action with your WIFI Name and Password in a specific string for QR codes.&lt;/li&gt;
&lt;li&gt;Generate QR Code.&lt;/li&gt;
&lt;li&gt;Show QR Code.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;4-calculate-tip&quot;&gt;&lt;a href=&quot;https://www.icloud.com/shortcuts/a403ae8a226e452c85ac596dee8c60f3&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; class=&quot;underline-offset-2 hover:underline text-primary-500 hover:text-sky-600 dark:hover:text-primary-400&quot;&gt;4. Calculate Tip&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Asks for a number with the prompt “What is the bill amount?”&lt;/li&gt;
&lt;li&gt;Choose from menu with tip percentages:
&lt;ul&gt;
&lt;li&gt;12%&lt;/li&gt;
&lt;li&gt;15%&lt;/li&gt;
&lt;li&gt;18%&lt;/li&gt;
&lt;li&gt;20%&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Then multiplies the bill by the the chosen percentage.&lt;/li&gt;
&lt;li&gt;Shows an alert with the tip and the total.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;5-combine-photos&quot;&gt;&lt;a href=&quot;https://www.icloud.com/shortcuts/1703d8d04ca443babfcc44660f08e551&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; class=&quot;underline-offset-2 hover:underline text-primary-500 hover:text-sky-600 dark:hover:text-primary-400&quot;&gt;5. Combine Photos&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Select Photos.&lt;/li&gt;
&lt;li&gt;Combines them horizontally or vertically.&lt;/li&gt;
&lt;li&gt;Shows it in Quick Look.&lt;/li&gt;
&lt;li&gt;I did add share sheet functionality to make it easier to use from the Photos app.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;6-grab-photo-link&quot;&gt;&lt;a href=&quot;https://routinehub.co/shortcut/16614/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; class=&quot;underline-offset-2 hover:underline text-primary-500 hover:text-sky-600 dark:hover:text-primary-400&quot;&gt;6. Grab Photo Link&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Let’s you easily upload a photo to imgbb (requires an API key).&lt;/li&gt;
&lt;li&gt;Generates a markdown link with optional placeholder and alt text.&lt;/li&gt;
&lt;li&gt;Copies the link to your clipboard.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;7-shortcut-calculator&quot;&gt;&lt;a href=&quot;https://routinehub.co/shortcut/17529/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; class=&quot;underline-offset-2 hover:underline text-primary-500 hover:text-sky-600 dark:hover:text-primary-400&quot;&gt;7. Shortcut Calculator&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;A complex-yet-simple Shortcut to calculate a lot of different things quickly and easily.&lt;/li&gt;
&lt;li&gt;Some of the features are:
&lt;ul&gt;
&lt;li&gt;Calculate An Expression&lt;/li&gt;
&lt;li&gt;Generate Random number&lt;/li&gt;
&lt;li&gt;Round Number&lt;/li&gt;
&lt;li&gt;Convert Time Zones&lt;/li&gt;
&lt;li&gt;Calculate Tip&lt;/li&gt;
&lt;li&gt;Calculate Interest&lt;/li&gt;
&lt;li&gt;Fractions To Deimals&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;8-psswd---protected-book&quot;&gt;&lt;a href=&quot;https://routinehub.co/shortcut/18409/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; class=&quot;underline-offset-2 hover:underline text-primary-500 hover:text-sky-600 dark:hover:text-primary-400&quot;&gt;8. Psswd - Protected Book&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Create text-file-based notes that are password protected. (Text files are stored in iCloud)&lt;/li&gt;
&lt;li&gt;Search or view notes.&lt;/li&gt;
&lt;li&gt;Delete notes.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you like this sort of thing and want to learn more, check out the &lt;a href=&quot;https://discord.gg/routinehub-503976650439131183&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; class=&quot;underline-offset-2 hover:underline text-primary-500 hover:text-sky-600 dark:hover:text-primary-400&quot;&gt;RoutineHub Discord&lt;/a&gt;. There a lot of nice and helpful people who love talking about Shortcuts.&lt;/p&gt;
&lt;hr/&gt;
&lt;p&gt;As always, thanks for stopping by and I hope you check out this episode. If you enjoyed it let me know what you think in the comments below.&lt;/p&gt;
&lt;p&gt;Have a good one, peace! 🤙&lt;/p&gt;</content:encoded><category>podcast</category><category>shortcuts</category></item><item><title>UI Actions Beta - First Impressions</title><link>https://jpshlk.com/blog/ui-actions-beta/</link><guid isPermaLink="true">https://jpshlk.com/blog/ui-actions-beta/</guid><description>Use macOS Shortcuts to control any app that has menus, buttons, or accepts keyboard input.</description><pubDate>Tue, 07 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;img src=&quot;https://jpshlk.com/_astro/ui-actions-beta-test.Ee6O_Ir3_Zq7dpo.webp&quot; alt=&quot;Gif of a UI Actions Beta creating a Stickies note, bolding the text and then changing the color, then typing a message.&quot; width=&quot;600&quot; height=&quot;338&quot;&gt;&lt;p&gt;I saw this after signing up and browsing Mastodon this weekend, and it looks amazing for an early beta!&lt;/p&gt;
&lt;h2 id=&quot;what-is-shortcuts-and-why-should-you-care&quot;&gt;What Is Shortcuts And Why Should You Care?&lt;/h2&gt;
&lt;p&gt;Shortcuts was released in September 2018 as a part of iOS 12 after Apple purchased Workflow, which allowed users to create powerful automations by connecting different apps and services without needing to understand how to code.&lt;/p&gt;
&lt;p&gt;Victor Sanchez has &lt;a href=&quot;https://blog.routinehub.co/the-comprehensive-history-of-apple-shortcuts/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; class=&quot;underline-offset-2 hover:underline text-primary-500 hover:text-sky-600 dark:hover:text-primary-400&quot;&gt;a great write-up&lt;/a&gt; on the history of Shortcuts on RoutineHub’s blog. It is a must-read, so go check that out!&lt;/p&gt;
&lt;p&gt;In October of 2021, Apple finally brought Shortcuts to macOS with the release of Monterey. Shortcuts can sync over iCloud, allowing users to build Shortcuts on their Mac with a lot of crossover functionality.&lt;/p&gt;
&lt;p&gt;While it is really good, &lt;em&gt;when the UI doesn’t completely lag-out from scrolling through large Shortcuts&lt;/em&gt;, there are many things left to be desired.&lt;/p&gt;
&lt;h2 id=&quot;enter-ui-actions---control-mac-apps-with-shortcuts&quot;&gt;Enter UI Actions - Control Mac Apps With Shortcuts&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://jpshlk.com/_astro/ui-actions-beta.DgkSi5HZ_2bPN8c.webp&quot; alt=&quot;Screenshots of UI Actions Beta after setting it up.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2220&quot; height=&quot;1308&quot;&gt;&lt;/p&gt;
&lt;p&gt;UI Actions is currently in beta and under active development, with version &lt;code&gt;0.9.1&lt;/code&gt; being the latest release as of this writing. So far, I am very impressed with the potential of this project.&lt;/p&gt;
&lt;p&gt;While I’ve only had the time to build a few Shortcuts using it, the experience has been quite good. The actions are intuitive and easy to understand, even for someone who may not be seasoned with automation.&lt;/p&gt;
&lt;p&gt;I would hope that most people understand how to click &lt;code&gt;File &amp;gt; Save&lt;/code&gt; or &lt;code&gt;Edit &amp;gt; Paste&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://jpshlk.com/_astro/ui-actions-beta-actions.sZoxbqsy_2g8bsQ.webp&quot; alt=&quot;UI Actions Beta&apos;s included actions&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1256&quot; height=&quot;1003&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;the-actions-included-are-quite-good-and-have-the-potential-to-automate-a-lot-of-tasks&quot;&gt;The actions included are quite good and have the potential to automate a lot of tasks:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Get App Reference:&lt;/strong&gt; References other apps for use in other actions.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Click Button:&lt;/strong&gt; Tries to click a button by title.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Simulate Specific Key:&lt;/strong&gt; Simulates pressing certain keys like &lt;code&gt;Home&lt;/code&gt;, &lt;code&gt;Escape&lt;/code&gt;, or &lt;code&gt;Return&lt;/code&gt; with modifiers like &lt;code&gt;Cmd&lt;/code&gt;, &lt;code&gt;Opt&lt;/code&gt;, etc.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Simulate Typing:&lt;/strong&gt; Simulates typing text on the keyboard, like the example in the gif above.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Get Menu Item Reference:&lt;/strong&gt; Tries to find a UI menu item, and returns it as text like so: &lt;code&gt;App Name: Menu Item Name&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Is Menu Item Enabled?:&lt;/strong&gt; Returns a boolean value for the state of a menu item.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Select Menu Item:&lt;/strong&gt; Tries to find a menu item and trigger it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Select Menu Item Either/ Or:&lt;/strong&gt; Useful for menu items that can change state.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;setting-up-ui-actions&quot;&gt;Setting Up UI Actions&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://jpshlk.com/_astro/ui-actions-beta-setup.Cgd9WUQc_Z1awv9s.webp&quot; alt=&quot;UI Actions Beta&apos;s setup screens&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;3786&quot; height=&quot;1308&quot;&gt;&lt;/p&gt;
&lt;p&gt;After installing you’ll need to go through setting up the proper permissions for UI Actions to work; this includes &lt;code&gt;Allow Assitive Access&lt;/code&gt; and &lt;code&gt;Allow Controlling The User Interface&lt;/code&gt; for obvious reasons.&lt;/p&gt;
&lt;p&gt;Once you allow those permissions, it should be all set up and ready to go.&lt;/p&gt;
&lt;h2 id=&quot;download-the-beta-and-check-out-the-forum&quot;&gt;Download The Beta And Check Out The Forum&lt;/h2&gt;
&lt;p&gt;If this looks like something you’d like to try out, head over to &lt;a href=&quot;https://actions.work/ui-actions&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; class=&quot;underline-offset-2 hover:underline text-primary-500 hover:text-sky-600 dark:hover:text-primary-400&quot;&gt;ActionsDotWork&lt;/a&gt; to download the public beta, and check out the &lt;a href=&quot;https://forum.actions.work/c/ui-actions/11&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; class=&quot;underline-offset-2 hover:underline text-primary-500 hover:text-sky-600 dark:hover:text-primary-400&quot;&gt;forum&lt;/a&gt; to learn more and report any bugs you find.&lt;/p&gt;
&lt;p&gt;While you’re at it, give him a &lt;a href=&quot;https://norden.social/@czottmann&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; class=&quot;underline-offset-2 hover:underline text-primary-500 hover:text-sky-600 dark:hover:text-primary-400&quot;&gt;follow on Mastodon&lt;/a&gt; and take a look at some of his other projects as well!&lt;/p&gt;
&lt;hr/&gt;
&lt;p&gt;As always, thanks for stopping by and I hope you check out UI Actions. If you enjoyed reading about it let me know what you think in the comments below.&lt;/p&gt;
&lt;p&gt;Have a good one, peace! 🤙&lt;/p&gt;</content:encoded><category>apps</category><category>mac</category><category>shortcuts</category></item><item><title>There&apos;s A New Scam In Town - And It&apos;s Very Sophisticated</title><link>https://jpshlk.com/blog/new-scam-bank-notification/</link><guid isPermaLink="true">https://jpshlk.com/blog/new-scam-bank-notification/</guid><description>Scammers team up to pretend they&apos;re your bank.</description><pubDate>Sun, 05 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;img src=&quot;https://jpshlk.com/_astro/hacker-hoodie-login.DMkcPIQ2_Z2vcLWM.webp&quot; alt=&quot;Hacker in a hoodie with login overlay&quot; width=&quot;1400&quot; height=&quot;933&quot;&gt;&lt;h2 id=&quot;i-saw-this-today-on-mastodon&quot;&gt;I Saw This Today On Mastodon&lt;/h2&gt;
&lt;p&gt;Today on Mastodon, I came across a scarry new scam that cleverly manipulates both phone-based and digital banking safeguards. &lt;em&gt;Remember, If you think your bank is calling you, always hang up and call back.&lt;/em&gt;&lt;/p&gt;
&lt;iframe src=&quot;https://mastodon.social/@Edent/112372412442888807/embed&quot; class=&quot;mastodon-embed mx-auto&quot; style=&quot;max-width: 100%; border: 0&quot; width=&quot;400&quot; allowfullscreen&gt;&lt;/iframe&gt;
&lt;script src=&quot;https://mastodon.social/embed.js&quot; async&gt;&lt;/script&gt;
&lt;h2 id=&quot;he-goes-on-to-mention-just-how-sophisticated-this-attack-is&quot;&gt;He Goes On To Mention Just How Sophisticated This Attack Is&lt;/h2&gt;
&lt;p&gt;Here’s how it works: You receive a phone call from someone claiming to be from your bank, alerting you to suspected fraudulent activity on your account.&lt;/p&gt;
&lt;p&gt;This might immediately raise your suspicions as a potential scam, but then the caller offers to send you an in-app notification as proof of their legitimacy.&lt;/p&gt;
&lt;iframe src=&quot;https://mastodon.social/@Edent/112372420335925276/embed&quot; class=&quot;mastodon-embed mx-auto&quot; style=&quot;max-width: 100%; border: 0&quot; width=&quot;400&quot; allowfullscreen&gt;&lt;/iframe&gt;
&lt;script src=&quot;https://mastodon.social/embed.js&quot; async&gt;&lt;/script&gt;
&lt;h2 id=&quot;some-steps-you-can-take-to-protect-yourself&quot;&gt;Some Steps You Can Take To Protect Yourself&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Verify Independently:&lt;/strong&gt; Never trust caller ID or an incoming phone number. If you receive a call from someone claiming to be from your bank, hang up and call back using the official number from your bank’s website or your bank card.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Do Not Share Personal Information:&lt;/strong&gt; During the call, do not share personal information or enter any details into your phone unless you have initiated the call and are certain of the recipient’s identity.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Be Wary of Pressure:&lt;/strong&gt; Scammers often create a sense of urgency to prompt hasty decisions. Take your time and consult with someone you trust if you feel pressured.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use Two-Factor Authentication:&lt;/strong&gt; Enable two-factor authentication for your bank and other sensitive accounts, which adds an extra layer of security beyond just a username and password.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Employ Complex Passwords:&lt;/strong&gt; Use a tool like &lt;a href=&quot;https://links.jpshlk.com/bitwarden&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; class=&quot;underline-offset-2 hover:underline text-primary-500 hover:text-sky-600 dark:hover:text-primary-400&quot;&gt;Bitwarden’s&lt;/a&gt; free version to generate and manage complex passwords, adding another layer of security against unauthorized access.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Stay Informed:&lt;/strong&gt; Keep up to date on the latest scam tactics. Banks often inform customers of common fraud techniques through their websites or emails.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;staying-safe-means-being-smart---and-it-takes-work&quot;&gt;Staying Safe Means Being Smart - And It Takes Work&lt;/h2&gt;
&lt;p&gt;There you have it—a glimpse into the crafty world of modern scams that may hit closer to home than we’d like!&lt;/p&gt;
&lt;p&gt;Keeping our digital lives secure isn’t just smart; it’s necessary. Remember, it’s all about staying vigilant, using strong passwords with tools like Bitwarden, and keeping informed. Let’s keep our online environments safe and scam-free.&lt;/p&gt;
&lt;p&gt;Spread the word, stay curious, and as always, make your digital footprint a secure one!&lt;/p&gt;
&lt;h2 id=&quot;update-from-terence&quot;&gt;Update From Terence&lt;/h2&gt;
&lt;p&gt;Terence also did a great &lt;a href=&quot;https://shkspr.mobi/blog/2024/05/bank-scammers-using-genuine-push-notifications-to-trick-their-victims/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; class=&quot;underline-offset-2 hover:underline text-primary-500 hover:text-sky-600 dark:hover:text-primary-400&quot;&gt;write up&lt;/a&gt; on his site. Head on over and give his post a read.&lt;/p&gt;
&lt;p&gt;Here is the original Reddit post:&lt;/p&gt;
&lt;blockquote class=&quot;reddit-embed-bq&quot; style=&quot;height:316px&quot; data-embed-theme=&quot;dark&quot; data-embed-height=&quot;316&quot;&gt;&lt;a href=&quot;https://www.reddit.com/r/UKPersonalFinance/comments/1cih3kd/been_scammed_over_18000_through_my_chase_account/&quot;&gt;Been scammed over £18,000 through my Chase account which is an extremely significant amount, around two years of savings.&lt;/a&gt; by&lt;a href=&quot;https://www.reddit.com/user/Captain_Levi_00/&quot;&gt;u/Captain_Levi_00&lt;/a&gt; in&lt;a href=&quot;https://www.reddit.com/r/UKPersonalFinance/&quot;&gt;UKPersonalFinance&lt;/a&gt;&lt;/blockquote&gt;
&lt;script src=&quot;https://embed.reddit.com/widgets.js&quot; charset=&quot;UTF-8&quot;&gt;&lt;/script&gt;
&lt;hr/&gt;
&lt;p&gt;As always, thanks for stopping by and I hope you take this stuff seriously. If you enjoyed reading about it let me know what you think in the comments below.&lt;/p&gt;
&lt;p&gt;Have a good one, peace! 🤙&lt;/p&gt;</content:encoded><category>scams</category><category>news</category></item><item><title>Setapp - Powerful Apps For Powerful Workflows</title><link>https://jpshlk.com/blog/settapp-apps-for-power-users/</link><guid isPermaLink="true">https://jpshlk.com/blog/settapp-apps-for-power-users/</guid><description>Yet another subscription, but is it worth it?</description><pubDate>Thu, 02 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;img src=&quot;https://jpshlk.com/_astro/setapp-welcome.Drukh0lN_1LM0kR.webp&quot; alt=&quot;Setapp Welcome Screen&quot; width=&quot;1212&quot; height=&quot;752&quot;&gt;&lt;p&gt;I finally checked out Setapp, and I don’t know what I was waiting for.&lt;/p&gt;
&lt;h2 id=&quot;dozens-of-powerful-apps-under-one-subscription&quot;&gt;Dozens Of Powerful Apps Under One Subscription&lt;/h2&gt;
&lt;p&gt;Subscriptions have become a bad word in recent times—and for good reason. From streaming your favorite movies and TV shows to online gaming; hell, there are even food deliveries services for both you and your pets, it seems there’s a subscription for everything. But what about for software?&lt;/p&gt;
&lt;p&gt;Enter Setapp, a subscription service that promises to simplify your digital life without cluttering it with unnecessary expenses.&lt;/p&gt;
&lt;p&gt;Whether you are a power user or a casual, Setapp is worth at least checking out. It couldn’t hurt with a free 7-day trial.&lt;/p&gt;
&lt;h2 id=&quot;is-the-value-proposition-worth-it&quot;&gt;Is The Value Proposition Worth It?&lt;/h2&gt;
&lt;p&gt;Before you shy away from the ten-dollar-per-month cost, I’ll walk you through what I’ve calculated so far.&lt;/p&gt;
&lt;p&gt;I have installed a total of ten apps within the few weeks that I’ve been testing Setapp, some of which don’t have free trials on their own. The total cost of purchasing or subscribing to these would be almost $190 US. So, $9.99 per month starts to sound pretty good when you do the math.&lt;/p&gt;
&lt;p&gt;Now, I’ll admit the value proposition does get a bit more tricky to work out the longer you are subscribed. A few of those apps are subscription-only, or the one-time purchase only guarantees one year of updates.&lt;/p&gt;
&lt;p&gt;This is also only taking into account the fact that I’ve barely scratched the surface of their impressive collection. I’m sure that I likely won’t ever use even a quarter of the apps that they offer, but it is nice to have a curated selection to choose from when needed.&lt;/p&gt;
&lt;h2 id=&quot;heres-a-quick-breakdown-of-the-apps-the-cost-and-some-notes&quot;&gt;Here’s A Quick Breakdown Of The Apps, The Cost, And Some Notes:&lt;/h2&gt;
&lt;p&gt;I’m not going to add up the cost of all ten apps, but here are my favorites that I use multiple times daily at work and when working on my own personal projects.&lt;/p&gt;
&lt;h3 id=&quot;bartender-5---16&quot;&gt;&lt;a href=&quot;https://links.jpshlk.com/bartender&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; class=&quot;underline-offset-2 hover:underline text-primary-500 hover:text-sky-600 dark:hover:text-primary-400&quot;&gt;Bartender 5 - $16:&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id=&quot;a-menu-bar-manager-that-offers-a-lot-of-features-and-customization&quot;&gt;A menu bar manager that offers a lot of features and customization.&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;4 week trial&lt;/li&gt;
&lt;li&gt;Bartender 4 was released in April of 2021 for $15.&lt;/li&gt;
&lt;li&gt;Upgrade from 4 for 50% off.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;cleanshot-x---29&quot;&gt;&lt;a href=&quot;https://links.jpshlk.com/cleanshotx&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; class=&quot;underline-offset-2 hover:underline text-primary-500 hover:text-sky-600 dark:hover:text-primary-400&quot;&gt;CleanShot X - $29:&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id=&quot;adds-a-ton-of-screenshot-features-over-macoss-built-in-functionality&quot;&gt;Adds a ton of screenshot features over macOs’s built-in functionality.&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;30-day money back guarantee.&lt;/li&gt;
&lt;li&gt;One year of updates, optionally renew at $19 annually for updates.&lt;/li&gt;
&lt;li&gt;$10 per month, or $8 per month if paying for a year.&lt;/li&gt;
&lt;li&gt;Comes with cloud storage, and a custom domain if that’s your thing!&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;pixelsnap-2---39&quot;&gt;&lt;a href=&quot;https://links.jpshlk.com/pixelsnap2&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; class=&quot;underline-offset-2 hover:underline text-primary-500 hover:text-sky-600 dark:hover:text-primary-400&quot;&gt;PixelSnap 2 - $39:&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id=&quot;a-tiny-app-that-will-accurately-measure-anything-on-your-screen-within-any-app&quot;&gt;A tiny app that will accurately measure anything on your screen, within any app.&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;No trial, 30-day money back guarentee.&lt;/li&gt;
&lt;li&gt;Discounts on multiple licenses.&lt;/li&gt;
&lt;li&gt;Integrates with CleanShot X!&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;sip---20&quot;&gt;&lt;a href=&quot;https://links.jpshlk.com/sip&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; class=&quot;underline-offset-2 hover:underline text-primary-500 hover:text-sky-600 dark:hover:text-primary-400&quot;&gt;Sip - $20:&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id=&quot;another-tiny-app-that-lets-you-grab-color-values-from-anything-on-your-screen&quot;&gt;Another tiny app that lets you grab color values from anything on your screen.&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;1 year of updates.&lt;/li&gt;
&lt;li&gt;50% off on licence exension.&lt;/li&gt;
&lt;li&gt;Can grab more than just hex values, and organize color pallets.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;istatmenus-6---1199&quot;&gt;&lt;a href=&quot;https://links.jpshlk.com/istatmenus&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; class=&quot;underline-offset-2 hover:underline text-primary-500 hover:text-sky-600 dark:hover:text-primary-400&quot;&gt;iStatMenus 6 - $11.99:&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id=&quot;a-powerful-mac-system-monitor-that-provides-detailed-stats-in-the-menu-bar&quot;&gt;A powerful Mac system monitor that provides detailed stats in the menu bar.&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;No trial, Mac App Store (Feature Limited).&lt;/li&gt;
&lt;li&gt;$9.99 to upgrade.&lt;/li&gt;
&lt;li&gt;Tons of features I’ve yet to explore.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All of those apps are a cup of coffee away from totaling what it costs to pay for Setapp for a year. If you use your Mac like I do, and you don’t see value there then I’m not sure what to tell you.&lt;/p&gt;
&lt;h2 id=&quot;some-final-thoughts&quot;&gt;Some Final Thoughts&lt;/h2&gt;
&lt;p&gt;Setapp certainly offers a strong value for designers, developers, or power users, or anyone who wants to get the most out of their Mac. Adding yet another subscription is always a difficult choice, but once you take a look at a few of the apps it offers, it starts to pencil out quickly.&lt;/p&gt;
&lt;p&gt;At the end of the day, there’s no risk to try the 7-day trial. You may find that there are apps you didn’t know you needed. So go ahead and check it out by tapping the badge below—what could it hurt?&lt;/p&gt;
&lt;a href=&quot;https://links.jpshlk.com/setapp&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; aria-label=&quot;setappbadge&quot; class=&quot;inline-block transition-colors&quot;&gt;&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&lt;svg width=&quot;122px&quot; height=&quot;40px&quot; viewBox=&quot;0 0 122 40&quot; version=&quot;1.1&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; xmlns:xlink=&quot;http://www.w3.org/1999/xlink&quot;&gt;&lt;!-- Generator: Sketch 53.2 (72643) - https://sketchapp.com --&gt;&lt;title&gt;Setapp Button&lt;/title&gt;&lt;desc&gt;Created with Sketch.&lt;/desc&gt;&lt;defs&gt;&lt;rect id=&quot;path-1&quot; x=&quot;-5.68434189e-14&quot; y=&quot;0&quot; width=&quot;122&quot; height=&quot;40&quot; rx=&quot;5&quot;&gt;&lt;/rect&gt;&lt;/defs&gt;&lt;g id=&quot;Media-Kit&quot; stroke=&quot;none&quot; stroke-width=&quot;1&quot; fill=&quot;none&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;g id=&quot;Setapp-Button&quot;&gt;&lt;g id=&quot;Rectangle-Copy&quot;&gt;&lt;g id=&quot;path-1-Clipped&quot;&gt;&lt;mask id=&quot;mask-2&quot; fill=&quot;white&quot;&gt;&lt;use xlink:href=&quot;#path-1&quot;&gt;&lt;/use&gt;&lt;/mask&gt;&lt;g id=&quot;path-1&quot;&gt;&lt;/g&gt;&lt;rect id=&quot;path-1&quot; stroke=&quot;#A6A6A6&quot; stroke-width=&quot;2&quot; fill=&quot;#000000&quot; fill-rule=&quot;nonzero&quot; mask=&quot;url(#mask-2)&quot; x=&quot;-5.68434189e-14&quot; y=&quot;0&quot; width=&quot;122&quot; height=&quot;40&quot; rx=&quot;5&quot;&gt;&lt;/rect&gt;&lt;/g&gt;&lt;/g&gt;&lt;path d=&quot;M23.5667311,16.1331246 C23.3313955,15.8916413 23.3313955,15.4999752 23.5667311,15.2578303 L26.2682546,12.4857343 C26.504235,12.2435894 26.8852852,12.2435894 27.1219103,12.4857343 L29.8227891,15.2578303 C30.0587694,15.4999752 30.0587694,15.8916413 29.8227891,16.1331246 L27.1219103,18.9052206 C26.8852852,19.1473655 26.504235,19.1473655 26.2682546,18.9052206 L23.5667311,16.1331246 Z M22.0732205,14.6012603 L19.3723417,11.8291643 C19.1357166,11.5870194 19.1357166,11.1953534 19.3723417,10.9532085 L22.0732205,8.18111248 C22.3092009,7.93962917 22.6908958,7.93962917 22.9262314,8.18111248 L25.6283997,10.9532085 C25.8643801,11.1953534 25.8643801,11.5870194 25.6283997,11.8291643 L22.9262314,14.6012603 C22.6908958,14.8427436 22.3092009,14.8427436 22.0732205,14.6012603 Z M22.0732205,16.7902238 C22.3092009,16.5487405 22.6908958,16.5487405 22.9262314,16.7902238 L25.6283997,19.5623198 C25.8643801,19.8044647 25.8643801,20.1954692 25.6283997,20.4382757 L22.9262314,23.2097101 C22.6908958,23.451855 22.3092009,23.451855 22.0732205,23.2097101 L19.3723417,20.4382757 C19.1357166,20.1954692 19.1357166,19.8044647 19.3723417,19.5623198 L22.0732205,16.7902238 Z M17.8785088,18.9054852 L15.1769853,16.1333892 C14.9410049,15.8912443 14.9410049,15.5002398 15.1769853,15.2574333 L17.8785088,12.4859989 C18.1138444,12.243854 18.4961841,12.243854 18.7315197,12.4859989 L21.433688,15.2574333 C21.6690236,15.5002398 21.6690236,15.8912443 21.433688,16.1333892 L18.7315197,18.9054852 C18.4961841,19.1469685 18.1138444,19.1469685 17.8785088,18.9054852 Z M27.1216524,21.0944486 L29.8225312,23.8665446 C30.0591563,24.1086895 30.0591563,24.5003556 29.8225312,24.7425005 L27.1216524,27.5145965 C26.885672,27.7560798 26.5039771,27.7560798 26.2686415,27.5145965 L23.5664732,24.7425005 C23.3311376,24.5003556 23.3311376,24.1086895 23.5664732,23.8665446 L26.2686415,21.0944486 C26.5039771,20.8529653 26.885672,20.8529653 27.1216524,21.0944486 Z M22.9263604,25.3987397 L25.6278839,28.1708357 C25.864509,28.4129806 25.864509,28.8046466 25.6278839,29.0467915 L22.9263604,31.8188875 C22.6910248,32.0603708 22.3093298,32.0603708 22.0733495,31.8188875 L19.3718259,29.0467915 C19.1358456,28.8046466 19.1358456,28.4129806 19.3718259,28.1708357 L22.0733495,25.3987397 C22.3093298,25.1572564 22.6910248,25.1572564 22.9263604,25.3987397 Z M21.4334946,23.8668754 C21.6688302,24.1083587 21.6688302,24.5006864 21.4334946,24.7421697 L18.731971,27.5149273 C18.4959907,27.7564106 18.1142957,27.7564106 17.8783154,27.5149273 L15.1767918,24.7421697 C14.9414562,24.5006864 14.9414562,24.1083587 15.1767918,23.8668754 L17.8783154,21.0947794 C18.1142957,20.8526345 18.4959907,20.8526345 18.731971,21.0947794 L21.4334946,23.8668754 Z&quot; id=&quot;Logo_symbol&quot; fill=&quot;#E6C3A5&quot;&gt;&lt;/path&gt;&lt;g id=&quot;Logo_text-2&quot; transform=&quot;translate(43.000000, 20.000000)&quot; fill=&quot;#FFFFFF&quot;&gt;&lt;path d=&quot;M6.31826028,8.93310811 C6.31826028,8.65227799 6.26207109,8.40457529 6.14896298,8.19150579 C6.03585487,7.9769305 5.87677379,7.78870656 5.66880082,7.62758687 C5.4622873,7.46496139 5.21563865,7.32266409 4.93031433,7.20069498 C4.64426028,7.07947876 4.33339541,6.9672973 3.99771974,6.86415058 C3.54674676,6.72862934 3.10307109,6.56148649 2.66450352,6.36121622 C2.22739541,6.16094595 1.83626028,5.91625483 1.4932873,5.62638996 C1.1495846,5.33803089 0.871557573,4.9992278 0.659206222,4.61299228 C0.44685487,4.22600386 0.341044059,3.77803089 0.341044059,3.26982625 C0.341044059,2.76162162 0.44685487,2.3053668 0.659206222,1.90256757 C0.871557573,1.49901544 1.15615217,1.15720077 1.51299001,0.875617761 C1.86909811,0.594787645 2.2835846,0.378706564 2.75499001,0.227374517 C3.22712514,0.0752895753 3.71969271,-7.10542736e-15 4.23415217,-7.10542736e-15 C4.78436838,-7.10542736e-15 5.29955757,0.0873359073 5.77971974,0.262760618 C6.25915217,0.438938224 6.67874676,0.685135135 7.03777379,1.00210425 C7.39680082,1.31832046 7.68139541,1.69702703 7.89082784,2.13822394 C8.07982784,2.5342471 8.18563865,2.96866795 8.20899001,3.44148649 C8.21336838,3.52882239 8.1425846,3.60260618 8.05793595,3.60260618 L6.45909811,3.60260618 C6.38320622,3.60260618 6.32117919,3.54312741 6.31096298,3.46482625 C6.2795846,3.22013514 6.22266568,2.99426641 6.14093595,2.78646718 C6.0438819,2.54102317 5.90815217,2.32870656 5.7322873,2.14951737 C5.55642244,1.97108108 5.34261163,1.83330116 5.09085487,1.73542471 C4.83982784,1.63905405 4.54866568,1.59011583 4.21809811,1.59011583 C3.93496298,1.59011583 3.67299001,1.62776062 3.43144946,1.70305019 C3.19063865,1.77909266 2.98266568,1.89052124 2.80680082,2.03658301 C2.63093595,2.18189189 2.49301703,2.3580695 2.39377379,2.56361004 C2.29380082,2.76915058 2.24417919,3.00179537 2.24417919,3.2615444 C2.24417919,3.53710425 2.31277379,3.7765251 2.44850352,3.97980695 C2.58496298,4.18233591 2.76301703,4.36001931 2.98339541,4.51135135 C3.20304406,4.6626834 3.45626028,4.79368726 3.74231433,4.90436293 C4.02763865,5.01579151 4.32609811,5.11743243 4.63477379,5.20928571 C5.11201703,5.35459459 5.56882784,5.53453668 6.00301703,5.74911197 C6.43866568,5.96218147 6.82104406,6.21967181 7.15234136,6.51932432 C7.48217919,6.81897683 7.74415217,7.16681467 7.93826028,7.56208494 C8.13163865,7.95660232 8.22942244,8.40909266 8.22942244,8.9172973 C8.22942244,9.44206564 8.12215217,9.90434363 7.9068819,10.3048842 C7.69161163,10.7054247 7.40336838,11.0404633 7.04142244,11.3107529 C6.67947649,11.5817954 6.26061163,11.7858301 5.78336838,11.92361 C5.30612514,12.06139 4.80844946,12.1306564 4.2888819,12.1306564 C3.93715217,12.1306564 3.58907109,12.0952703 3.24317919,12.0244981 C2.8972873,11.9552317 2.56526028,11.8490734 2.24782784,11.7090347 C1.93039541,11.5674903 1.63631433,11.3935714 1.36339541,11.1850193 C1.09047649,10.9772201 0.85331433,10.7362934 0.651179195,10.4629923 C0.449773789,10.1896911 0.290692708,9.88401544 0.175395411,9.54596525 C0.0754224378,9.2530888 0.0170440594,8.9353668 0.000260275589,8.59204633 C-0.00484783252,8.50395753 0.0659359513,8.43017375 0.1505846,8.43017375 L1.76182784,8.43017375 C1.83480082,8.43017375 1.89463865,8.48814672 1.90266568,8.5626834 C1.93623325,8.86459459 2.00847649,9.13187259 2.11793595,9.36301158 C2.24417919,9.62878378 2.4112873,9.84938224 2.62217919,10.0248069 C2.83161163,10.2009846 3.07680082,10.3327413 3.35701703,10.4230888 C3.63723325,10.5119305 3.94809811,10.5563514 4.2888819,10.5563514 C4.57201703,10.5563514 4.83690892,10.5209653 5.08355757,10.4509459 C5.33020622,10.3809266 5.54401703,10.2762741 5.72790892,10.1384942 C5.91180082,10.0007143 6.0562873,9.82980695 6.16063865,9.62727799 C6.26571974,9.42399614 6.31826028,9.19361004 6.31826028,8.93310811 L6.31826028,8.93310811 Z M17.7246657,6.67743243 L13.1594765,6.67743243 L13.1594765,10.3861969 L18.5259089,10.3861969 C18.6076387,10.3861969 18.6725846,10.4539575 18.6725846,10.5367761 L18.6725846,11.8257336 C18.6725846,11.9085521 18.6076387,11.9763127 18.5259089,11.9763127 L11.4103143,11.9763127 C11.3293143,11.9763127 11.2636387,11.9085521 11.2636387,11.8257336 L11.2636387,0.312451737 C11.2636387,0.228880309 11.3293143,0.161872587 11.4103143,0.161872587 L18.4711792,0.161872587 C18.5521792,0.161872587 18.6171251,0.228880309 18.6171251,0.312451737 L18.6171251,1.61797297 C18.6171251,1.7015444 18.5521792,1.76779923 18.4711792,1.76779923 L13.1594765,1.76779923 L13.1594765,5.10312741 L17.7246657,5.10312741 C17.804936,5.10312741 17.8706116,5.17088803 17.8706116,5.25370656 L17.8706116,6.52760618 C17.8706116,6.61042471 17.804936,6.67743243 17.7246657,6.67743243 L17.7246657,6.67743243 Z M29.9140711,1.76779923 L26.5441792,1.76779923 L26.5441792,11.8257336 C26.5441792,11.9085521 26.4785035,11.9763127 26.3982332,11.9763127 L24.8103414,11.9763127 C24.7293414,11.9763127 24.6651251,11.9085521 24.6651251,11.8257336 L24.6651251,1.76779923 L21.3185846,1.76779923 C21.2375846,1.76779923 21.1719089,1.7015444 21.1719089,1.61797297 L21.1719089,0.312451737 C21.1719089,0.228880309 21.2375846,0.161872587 21.3185846,0.161872587 L29.9140711,0.161872587 C29.9943414,0.161872587 30.0592873,0.228880309 30.0592873,0.312451737 L30.0592873,1.61797297 C30.0592873,1.7015444 29.9943414,1.76779923 29.9140711,1.76779923 L29.9140711,1.76779923 Z M38.2928278,9.23351351 L34.714963,9.23351351 L33.958963,11.8678958 C33.9414495,11.9318919 33.8838008,11.9763127 33.8195846,11.9763127 L32.1784224,11.9763127 C32.0799089,11.9763127 32.0091251,11.8761776 32.0397738,11.7790541 L35.6650711,0.265772201 C35.6847738,0.203281853 35.7402332,0.161872587 35.8037197,0.161872587 L37.2507738,0.161872587 C37.3142603,0.161872587 37.3704495,0.204034749 37.3894224,0.266525097 L40.9453954,11.7798069 C40.9753143,11.8769305 40.9052603,11.9763127 40.8067468,11.9763127 L39.1728819,11.9763127 C39.1086657,11.9763127 39.051017,11.9318919 39.0335035,11.8671429 L38.2928278,9.23351351 Z M35.1943954,7.5696139 L37.8214224,7.5696139 L36.523963,2.93704633 L35.1943954,7.5696139 Z M45.9338278,7.44839768 L45.9338278,11.8257336 C45.9338278,11.9085521 45.8681522,11.9763127 45.7878819,11.9763127 L44.191963,11.9763127 C44.1116927,11.9763127 44.046017,11.9085521 44.046017,11.8257336 L44.046017,0.312451737 C44.046017,0.228880309 44.1116927,0.161872587 44.191963,0.161872587 L47.8763684,0.161872587 C48.4477468,0.167142857 48.9760711,0.25523166 49.4606116,0.4253861 C49.9458819,0.596293436 50.364017,0.839478764 50.7157468,1.15569498 C51.0667468,1.47266409 51.3403954,1.85664093 51.5374224,2.30762548 C51.7337197,2.76011583 51.8322332,3.26982625 51.8322332,3.83750965 C51.8322332,4.38938224 51.7337197,4.88704633 51.5374224,5.33050193 C51.3403954,5.77471042 51.0667468,6.15341699 50.7157468,6.46662162 C50.364017,6.78057915 49.9458819,7.02150579 49.4606116,7.18940154 C48.9760711,7.3565444 48.4477468,7.44312741 47.8763684,7.44839768 L45.9338278,7.44839768 Z M45.9338278,5.87484556 L47.8763684,5.87484556 C48.1967197,5.87484556 48.4813143,5.82440154 48.7338008,5.72426641 C48.9855576,5.62413127 49.2000981,5.48484556 49.3788819,5.30640927 C49.556936,5.12722008 49.6926657,4.91415058 49.7868008,4.66494208 C49.8816657,4.41648649 49.9290981,4.14619691 49.9290981,3.85407336 C49.9290981,3.5453861 49.8816657,3.2615444 49.7868008,3.00179537 C49.6926657,2.74204633 49.556936,2.51843629 49.3788819,2.33171815 C49.2000981,2.1457529 48.9855576,2.00119691 48.7338008,1.89805019 C48.4813143,1.79565637 48.1967197,1.74144788 47.8763684,1.73542471 L45.9338278,1.73542471 L45.9338278,5.87484556 Z M56.3485305,7.44839768 L56.3485305,11.750444 C56.3485305,11.8746718 56.2507468,11.9763127 56.1296116,11.9763127 L54.6796387,11.9763127 C54.5585035,11.9763127 54.4614495,11.8746718 54.4614495,11.750444 L54.4614495,0.387741313 C54.4614495,0.262760618 54.5585035,0.161872587 54.6796387,0.161872587 L58.2910711,0.161872587 C58.8624495,0.167142857 59.3907738,0.25523166 59.8760441,0.4253861 C60.3613143,0.596293436 60.7794495,0.839478764 61.1304495,1.15569498 C61.4821792,1.47266409 61.7558278,1.85664093 61.9521251,2.30762548 C62.1491522,2.76011583 62.2476657,3.26982625 62.2476657,3.83750965 C62.2476657,4.38938224 62.1491522,4.88704633 61.9521251,5.33050193 C61.7558278,5.77471042 61.4821792,6.15341699 61.1304495,6.46662162 C60.7794495,6.78057915 60.3613143,7.02150579 59.8760441,7.18940154 C59.3907738,7.3565444 58.8624495,7.44312741 58.2910711,7.44839768 L56.3485305,7.44839768 Z M56.3485305,5.87484556 L58.2910711,5.87484556 C58.6106927,5.87484556 58.8967468,5.82440154 59.1477738,5.72426641 C59.4002603,5.62413127 59.6148008,5.48484556 59.7928549,5.30640927 C59.9709089,5.12722008 60.1080981,4.91415058 60.2022332,4.66494208 C60.2970981,4.41648649 60.3438008,4.14619691 60.3438008,3.85407336 C60.3438008,3.5453861 60.2970981,3.2615444 60.2022332,3.00179537 C60.1080981,2.74204633 59.9709089,2.51843629 59.7928549,2.33171815 C59.6148008,2.1457529 59.4002603,2.00119691 59.1477738,1.89805019 C58.8967468,1.79565637 58.6106927,1.74144788 58.2910711,1.73542471 L56.3485305,1.73542471 L56.3485305,5.87484556 Z&quot; id=&quot;Logo_text&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g id=&quot;Available-on-2&quot; transform=&quot;translate(43.000000, 7.000000)&quot; fill=&quot;#FFFFFF&quot; fill-rule=&quot;nonzero&quot;&gt;&lt;path d=&quot;M4.8339844,6.83789062 L4.1923828,5.05371092 L1.7358398,5.05371092 L1.1074219,6.83789062 L7.10542736e-15,6.83789062 L2.4038086,0.38671874 L3.5463867,0.38671874 L5.9501953,6.83789062 L4.8339844,6.83789062 Z M3.9155273,4.14843752 L3.3134766,2.39941406 C3.269531,2.28222597 3.2087406,2.0976575 3.1311035,1.84570312 C3.0534664,1.59374874 3.0000001,1.40918027 2.9707031,1.29199218 C2.8916012,1.65234555 2.7758797,2.04638458 2.6235352,2.47412109 L2.043457,4.14843752 L3.9155273,4.14843752 Z M8.2958984,6.83789062 L6.4501953,1.97753906 L7.5400391,1.97753906 L8.5288086,4.80322262 C8.6987313,5.27783442 8.8012694,5.66161962 8.8364258,5.95458982 L8.871582,5.95458982 C8.8979494,5.74365132 9.0004874,5.35986602 9.1791992,4.80322262 L10.1679688,1.97753906 L11.2666016,1.97753906 L9.4121094,6.83789062 L8.2958984,6.83789062 Z M15.5458984,6.83789062 L15.3393555,6.16113282 L15.3041992,6.16113282 C15.069823,6.45703272 14.8339856,6.65844672 14.5966797,6.76538082 C14.3593738,6.87231502 14.0546894,6.92578122 13.6826172,6.92578122 C13.2050757,6.92578122 12.8322767,6.79687632 12.564209,6.53906252 C12.2961412,6.28124872 12.1621094,5.91650622 12.1621094,5.44482422 C12.1621094,4.94384512 12.3481427,4.56591922 12.7202148,4.31103512 C13.092287,4.05615102 13.6591759,3.91699232 14.4208984,3.89355472 L15.2602539,3.86718752 L15.2602539,3.60791012 C15.2602539,3.29736172 15.1877449,3.06518632 15.0427246,2.91137692 C14.8977044,2.75756759 14.6728531,2.68066406 14.3681641,2.68066406 C14.1191394,2.68066406 13.8803722,2.71728479 13.6518555,2.79052734 C13.4233387,2.86376992 13.2036143,2.95019482 12.9926758,3.04980472 L12.6586914,2.31152343 C12.9223646,2.17382743 13.2109359,2.06909215 13.5244141,1.99731445 C13.8378922,1.92553675 14.1337877,1.88964843 14.4121094,1.88964843 C15.0302765,1.88964843 15.4968246,2.02441271 15.8117676,2.29394531 C16.1267106,2.56347791 16.2841797,2.98681352 16.2841797,3.56396482 L16.2841797,6.83789062 L15.5458984,6.83789062 Z M14.0078125,6.13476562 C14.3828144,6.13476562 14.6838368,6.03003032 14.9108887,5.82055662 C15.1379406,5.61108292 15.2514648,5.31738472 15.2514648,4.93945312 L15.2514648,4.51757812 L14.6274414,4.54394532 C14.1411108,4.56152352 13.7873546,4.64282152 13.5661621,4.78784182 C13.3449696,4.93286202 13.234375,5.15478362 13.234375,5.45361332 C13.234375,5.67041122 13.2988275,5.83813412 13.4277344,5.95678712 C13.5566413,6.07544002 13.7499987,6.13476562 14.0078125,6.13476562 L14.0078125,6.13476562 Z M19.2583008,6.83789062 L18.2255859,6.83789062 L18.2255859,1.97753906 L19.2583008,1.97753906 L19.2583008,6.83789062 Z M18.1640625,0.6899414 C18.1640625,0.50537017 18.2145991,0.36328174 18.3156738,0.26367187 C18.4167486,0.164062 18.5610342,0.11425781 18.7485352,0.11425781 C18.9301767,0.11425781 19.0715327,0.164062 19.1726074,0.26367187 C19.2736821,0.36328174 19.3242188,0.50537017 19.3242188,0.6899414 C19.3242188,0.86572353 19.2736821,1.00414988 19.1726074,1.1052246 C19.0715327,1.20629933 18.9301767,1.25683593 18.7485352,1.25683593 C18.5610342,1.25683593 18.4167486,1.20629933 18.3156738,1.1052246 C18.2145991,1.00414988 18.1640625,0.86572353 18.1640625,0.6899414 L18.1640625,0.6899414 Z M22.2675781,6.83789062 L21.2348633,6.83789062 L21.2348633,2.22044605e-15 L22.2675781,2.22044605e-15 L22.2675781,6.83789062 Z M27.2851562,6.83789062 L27.0786133,6.16113282 L27.043457,6.16113282 C26.8090809,6.45703272 26.5732434,6.65844672 26.3359375,6.76538082 C26.0986316,6.87231502 25.7939472,6.92578122 25.421875,6.92578122 C24.9443335,6.92578122 24.5715345,6.79687632 24.3034668,6.53906252 C24.0353991,6.28124872 23.9013672,5.91650622 23.9013672,5.44482422 C23.9013672,4.94384512 24.0874005,4.56591922 24.4594727,4.31103512 C24.8315448,4.05615102 25.3984337,3.91699232 26.1601562,3.89355472 L26.9995117,3.86718752 L26.9995117,3.60791012 C26.9995117,3.29736172 26.9270027,3.06518632 26.7819824,2.91137692 C26.6369622,2.75756759 26.4121109,2.68066406 26.1074219,2.68066406 C25.8583972,2.68066406 25.61963,2.71728479 25.3911133,2.79052734 C25.1625965,2.86376992 24.9428721,2.95019482 24.7319336,3.04980472 L24.3979492,2.31152343 C24.6616224,2.17382743 24.9501937,2.06909215 25.2636719,1.99731445 C25.57715,1.92553675 25.8730455,1.88964843 26.1513672,1.88964843 C26.7695343,1.88964843 27.2360824,2.02441271 27.5510254,2.29394531 C27.8659684,2.56347791 28.0234375,2.98681352 28.0234375,3.56396482 L28.0234375,6.83789062 L27.2851562,6.83789062 Z M25.7470703,6.13476562 C26.1220722,6.13476562 26.4230946,6.03003032 26.6501465,5.82055662 C26.8771984,5.61108292 26.9907227,5.31738472 26.9907227,4.93945312 L26.9907227,4.51757812 L26.3666992,4.54394532 C25.8803687,4.56152352 25.5266124,4.64282152 25.3054199,4.78784182 C25.0842274,4.93286202 24.9736328,5.15478362 24.9736328,5.45361332 C24.9736328,5.67041122 25.0380853,5.83813412 25.1669922,5.95678712 C25.2958991,6.07544002 25.4892565,6.13476562 25.7470703,6.13476562 L25.7470703,6.13476562 Z M32.4477539,1.88964843 C33.0542023,1.88964843 33.5266096,2.1093728 33.8649902,2.54882812 C34.2033708,2.98828342 34.3725586,3.60497652 34.3725586,4.39892582 C34.3725586,5.19580472 34.2011736,5.81615992 33.8583984,6.26000972 C33.5156233,6.70385962 33.0395538,6.92578122 32.4301758,6.92578122 C31.8149383,6.92578122 31.337404,6.70459202 30.9975586,6.26220702 L30.9272461,6.26220702 L30.7382812,6.83789062 L29.9648438,6.83789062 L29.9648438,2.22044605e-15 L30.9975586,2.22044605e-15 L30.9975586,1.62597656 C30.9975586,1.74609435 30.9916993,1.9248035 30.9799805,2.16210937 C30.9682617,2.39941524 30.9594727,2.55029264 30.9536133,2.61474609 L30.9975586,2.61474609 C31.3256852,2.13134523 31.8090788,1.88964843 32.4477539,1.88964843 L32.4477539,1.88964843 Z M32.1796875,2.73339843 C31.7636698,2.73339843 31.4641122,2.85571162 31.2810059,3.10034182 C31.0978995,3.34497192 31.003418,3.75439162 30.9975586,4.32861332 L30.9975586,4.39892582 C30.9975586,4.99072562 31.0913077,5.41918812 31.2788086,5.68432612 C31.4663095,5.94946422 31.7724588,6.08203122 32.1972656,6.08203122 C32.5634784,6.08203122 32.8410635,5.93701312 33.0300293,5.64697262 C33.2189951,5.35693212 33.3134766,4.93799102 33.3134766,4.39013672 C33.3134766,3.28563902 32.9355507,2.73339843 32.1796875,2.73339843 L32.1796875,2.73339843 Z M37.1049805,6.83789062 L36.0722656,6.83789062 L36.0722656,2.22044605e-15 L37.1049805,2.22044605e-15 L37.1049805,6.83789062 Z M41.2041016,6.92578122 C40.4482384,6.92578122 39.8571799,6.70532442 39.4309082,6.26440432 C39.0046365,5.82348412 38.7915039,5.21631242 38.7915039,4.44287112 C38.7915039,3.64892182 38.9892558,3.02490462 39.3847656,2.57080078 C39.7802754,2.11669694 40.323727,1.88964843 41.0151367,1.88964843 C41.6567415,1.88964843 42.1635724,2.0844707 42.5356445,2.47412109 C42.9077167,2.86377152 43.09375,3.39989892 43.09375,4.08251952 L43.09375,4.64062502 L39.8549805,4.64062502 C39.869629,5.11230702 39.9970691,5.47485222 40.2373047,5.72827152 C40.4775403,5.98169072 40.8159158,6.10839842 41.2524414,6.10839842 C41.5395522,6.10839842 41.8068835,6.08129912 42.0544434,6.02709962 C42.3020032,5.97290012 42.5678697,5.88281312 42.8520508,5.75683592 L42.8520508,6.59619142 C42.6000964,6.71630922 42.3452161,6.80126932 42.0874023,6.85107422 C41.8295886,6.90087912 41.5351579,6.92578122 41.2041016,6.92578122 L41.2041016,6.92578122 Z M41.0151367,2.671875 C40.6870101,2.671875 40.4240733,2.77587786 40.2263184,2.98388672 C40.0285635,3.19189552 39.9106447,3.49511522 39.8725586,3.89355472 L42.0786133,3.89355472 C42.0727539,3.49218552 41.9760752,3.18823342 41.7885742,2.98168942 C41.6010733,2.77514545 41.3432634,2.671875 41.0151367,2.671875 L41.0151367,2.671875 Z M51.9160156,4.39892582 C51.9160156,5.19287502 51.7124044,5.81249772 51.3051758,6.25781252 C50.8979472,6.70312722 50.3310583,6.92578122 49.6044922,6.92578122 C49.1503884,6.92578122 48.7490252,6.82324322 48.4003906,6.61816402 C48.0517561,6.41308492 47.7836923,6.11865422 47.5961914,5.73486332 C47.4086905,5.35107232 47.3149414,4.90576422 47.3149414,4.39892582 C47.3149414,3.61083592 47.5170878,2.99560772 47.9213867,2.55322265 C48.3256856,2.11083763 48.8955041,1.88964843 49.6308594,1.88964843 C50.3339879,1.88964843 50.8906229,2.11596453 51.3007812,2.56860351 C51.7109396,3.02124252 51.9160156,3.63134382 51.9160156,4.39892582 L51.9160156,4.39892582 Z M48.378418,4.39892582 C48.378418,5.52100172 48.7929646,6.08203122 49.6220703,6.08203122 C50.4423869,6.08203122 50.8525391,5.52100172 50.8525391,4.39892582 C50.8525391,3.28856862 50.4394573,2.73339843 49.6132812,2.73339843 C49.1796853,2.73339843 48.8654795,2.87695172 48.6706543,3.16406252 C48.4758291,3.45117332 48.378418,3.86279032 48.378418,4.39892582 L48.378418,4.39892582 Z M57.878418,6.83789062 L56.8413086,6.83789062 L56.8413086,3.84960942 C56.8413086,3.47460752 56.7658699,3.19482512 56.6149902,3.01025392 C56.4641106,2.82568267 56.224611,2.73339843 55.8964844,2.73339843 C55.4599588,2.73339843 55.140626,2.86230342 54.9384766,3.12011722 C54.7363271,3.37793102 54.6352539,3.81005552 54.6352539,4.41650392 L54.6352539,6.83789062 L53.6025391,6.83789062 L53.6025391,1.97753906 L54.4111328,1.97753906 L54.5561523,2.61474609 L54.6088867,2.61474609 C54.7553718,2.38329962 54.9633776,2.20459047 55.2329102,2.07861328 C55.5024428,1.95263608 55.8012679,1.88964843 56.1293945,1.88964843 C57.295416,1.88964843 57.878418,2.48290422 57.878418,3.66943362 L57.878418,6.83789062 Z&quot; id=&quot;Available-on&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Full disclosure:&lt;/strong&gt; I recently joined the Setapp Affiliate Program, so if you join through my link, I’ll get a kickback.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&quot;still-thinking-about-it&quot;&gt;Still Thinking About It?&lt;/h2&gt;
&lt;p&gt;Check out this post on Reddit where /u/jkazz18 breaks it down pretty well and even provides a handy calculator spreadsheet to see if it’s worth it!&lt;/p&gt;
&lt;p&gt;Based on a quick scan, my total savings in the first year would be over 300 dollars!&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://www.reddit.com/r/macapps/comments/1abqzoe/is_set_app_worth_it/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; class=&quot;underline-offset-2 hover:underline text-primary-500 hover:text-sky-600 dark:hover:text-primary-400&quot;&gt;Is Set App Worth It?&lt;/a&gt;, posted by u/jkazz18 in r/macapps.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr/&gt;
&lt;p&gt;As always, thanks for stopping by and I hope you check out Setapp. If you enjoyed reading about it let me know what you think in the comments below.&lt;/p&gt;
&lt;p&gt;Have a good one, peace! 🤙&lt;/p&gt;</content:encoded><category>apps</category><category>mac</category></item><item><title>Darksun - A Dark Sky-Inspired Weather App</title><link>https://jpshlk.com/blog/darksun-a-darksky-inspired-weather-app/</link><guid isPermaLink="true">https://jpshlk.com/blog/darksun-a-darksky-inspired-weather-app/</guid><description>A &quot;spiritual-successor&quot; to the sorely-missed weather app shows lot of promise.</description><pubDate>Fri, 26 Apr 2024 00:00:00 GMT</pubDate><content:encoded>&lt;img src=&quot;https://jpshlk.com/_astro/darksun-screenshots.CvxF6Mhq_Z1rMh0M.webp&quot; alt=&quot;Darksun iOS Screenshots&quot; width=&quot;1400&quot; height=&quot;699&quot;&gt;&lt;p&gt;Last weekend, I saw a &lt;a href=&quot;https://www.reddit.com/r/apple/comments/1c9dsov/darksun_weather_a_free_spiritualsuccessor_to_dark/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; class=&quot;underline-offset-2 hover:underline text-primary-500 hover:text-sky-600 dark:hover:text-primary-400&quot;&gt;post on the Apple subreddit&lt;/a&gt; about a new weather app that immediately piqued my interest.&lt;/p&gt;
&lt;h2 id=&quot;an-homage-to-the-former-weather-king&quot;&gt;An Homage To The Former Weather King&lt;/h2&gt;
&lt;p&gt;The developer, &lt;a href=&quot;https://iconof.com&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; class=&quot;underline-offset-2 hover:underline text-primary-500 hover:text-sky-600 dark:hover:text-primary-400&quot;&gt;Kostas Mavropalias&lt;/a&gt;, sums it up best in his own words:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;TL;DR: I loved Dark Sky’s UI, features, and no-subscription model. I built Darksun Weather as an homage to what made Dark Sky great, bringing in new ideas and modern features, while keeping it free (sorry, no weather alerts &amp;amp; radar!), without ads/tracking/data collection/subscription.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The fact that it is free with zero ads or data collection is really nice, although that comes at the expense of a less feature-rich app, which makes sense. Anyone who expects premium features should expect to pay a premium price.&lt;/p&gt;
&lt;h2 id=&quot;weather-at-a-glance&quot;&gt;Weather At A Glance&lt;/h2&gt;
&lt;p&gt;In the Reddit post, he mentions that he aims to make weather data useful for daily life. The idea is to allow users to glance at the app for a few seconds and understand the current weather. After using it for a few days, I think he’s mostly achieved that.&lt;/p&gt;
&lt;p&gt;The only thing that’s holding it back is some of the icon choices, and the UI being a combination of “dumbed down and detailed,” as mentioned by &lt;a href=&quot;https://www.reddit.com/r/apple/comments/1c9dsov/comment/l0n1rm8/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; class=&quot;underline-offset-2 hover:underline text-primary-500 hover:text-sky-600 dark:hover:text-primary-400&quot;&gt;a commenter&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This is definitely some good feedback and I hope the developer considers adding more complexity to rain data.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://jpshlk.com/_astro/darksun-helper-alerts.CkNIjAte_Z2vFDSE.webp&quot; alt=&quot;Darksun iOS Screenshots&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;4506&quot; height=&quot;3000&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;minimal-settings-with-helpful-tips&quot;&gt;Minimal Settings With Helpful Tips&lt;/h2&gt;
&lt;p&gt;Darksun stands out for its minimalist approach, particularly in the settings department, which aligns with its goal of simplicity and ease of use. The app smartly introduces users to its interface through helpful alerts and guides, easing them into the UI without overwhelming them with options.&lt;/p&gt;
&lt;p&gt;You can access these anytime after dismissing them by tapping the question mark at the top left of the app in case you need a reminder of what certain UI elements mean.&lt;/p&gt;
&lt;p&gt;This approach not only streamlines the user experience but also subtly educates on how to interpret the nuanced weather data presented.&lt;/p&gt;
&lt;h2 id=&quot;dark-mode-needs-a-little-work&quot;&gt;Dark Mode Needs A Little Work&lt;/h2&gt;
&lt;p&gt;One feature that needs some polish is the dark mode implementation. It’s not obvious on how to toggle it on or off, and it doesn’t inherit the user’s preference set by iOS. To toggle dark mode you tap the anywhere right under the navigation bar, which is a little unintuitive.&lt;/p&gt;
&lt;p&gt;While not a deal-breaker, I hope that he at least adds in a system dark mode, it shouldn’t be more than a half a dozen or so &lt;a href=&quot;https://medium.com/@mammadowr/how-to-support-dark-mode-in-an-ios-app-swift-swiftui-objective-c-e83bdf06d22c&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; class=&quot;underline-offset-2 hover:underline text-primary-500 hover:text-sky-600 dark:hover:text-primary-400&quot;&gt;lines of code&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;powered-by-open-source-data&quot;&gt;Powered By Open-Source Data&lt;/h2&gt;
&lt;p&gt;To keep Darksun free, he is using a few open-source data providers.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Open-Mateo and MET Norway:&lt;/strong&gt; Both of which look like really awesome weather services that provide data for free.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href=&quot;https://open-meteo.com&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; class=&quot;underline-offset-2 hover:underline text-primary-500 hover:text-sky-600 dark:hover:text-primary-400&quot;&gt;Open-Meteo&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.met.no/en/About-us&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; class=&quot;underline-offset-2 hover:underline text-primary-500 hover:text-sky-600 dark:hover:text-primary-400&quot;&gt;MET Norway&lt;/a&gt;:&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;OpenStreetMap’s Weather API:&lt;/strong&gt; Who provides a free API to access weather data with a limit of 1000 API calls per day.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href=&quot;https://openweathermap.org/api&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; class=&quot;underline-offset-2 hover:underline text-primary-500 hover:text-sky-600 dark:hover:text-primary-400&quot;&gt;OpenWeather&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It would be interesting to see how he keeps that OpenWeather load under the limit.&lt;/p&gt;
&lt;h2 id=&quot;hinting-at-more-features&quot;&gt;Hinting At More Features&lt;/h2&gt;
&lt;p&gt;He later suggests that a private version of Darksun, currently available only to friends and family, incorporates Apple’s Weather API, offering minute-by-minute precipitation alerts.&lt;/p&gt;
&lt;p&gt;He indicates the possibility of making this version publicly available in the future, potentially with a subscription fee to offset operational costs. I personally hope there is sufficient interest to encourage him to proceed with this plan, and will support him one hundred percent.&lt;/p&gt;
&lt;h2 id=&quot;free-forever-with-optional-in-app-purchases-or-subscriptions&quot;&gt;Free Forever With Optional In-app Purchases Or Subscriptions&lt;/h2&gt;
&lt;p&gt;In keeping with the principles of open-source development, the creator of Darksun is committed to keeping the core application free for all users. This ensures that everyone can access reliable weather forecasts without financial barriers.&lt;/p&gt;
&lt;p&gt;However, to accommodate the needs of users who desire more detailed information and advanced features, Darksun will have optional in-app purchases. Additionally, for those who require even more robust weather data, premium sources would be accessed through subscriptions.&lt;/p&gt;
&lt;p&gt;These options are designed not only to cater to varying user preferences but also to support the ongoing development and improvement of the app, balancing accessibility with advanced capabilities.&lt;/p&gt;
&lt;h2 id=&quot;only-time-will-tell-if-darksun-can-weather-the-future&quot;&gt;Only Time Will Tell If Darksun Can Weather The Future&lt;/h2&gt;
&lt;p&gt;The app is still very new, but it looks like there are good things in store if he remains committed.&lt;/p&gt;
&lt;p&gt;Dark Sky’s shadow is quite large and difficult to shine through, but perhaps it will stand the test of time and gain enough popularity for him to justify devoting the time and resources it would take to become a worthy successor.&lt;/p&gt;
&lt;h2 id=&quot;download-darksun-on-the-app-store&quot;&gt;Download Darksun On The App Store&lt;/h2&gt;
&lt;p&gt;If you’re looking for an alternative to the Apple Weather app, go ahead and tap the badge to download Darksun on the App Store, and be sure to check out the &lt;a href=&quot;https://darksunapp.com&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; class=&quot;underline-offset-2 hover:underline text-primary-500 hover:text-sky-600 dark:hover:text-primary-400&quot;&gt;app’s website&lt;/a&gt; as well!&lt;/p&gt;
&lt;a href=&quot;https://apps.apple.com/us/app/darksun-weather/id1670009547&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; aria-label=&quot;appstorebadge&quot; class=&quot;inline-block transition-colors&quot;&gt;&lt;svg id=&quot;livetype&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;119.66407&quot; height=&quot;40&quot; viewBox=&quot;0 0 125 40&quot;&gt;&lt;title&gt;Download_on_the_App_Store_Badge_US-UK_RGB_blk_4SVG_092917&lt;/title&gt;&lt;g&gt;&lt;g&gt;&lt;g&gt;&lt;path d=&quot;M110.13477,0H9.53468c-.3667,0-.729,0-1.09473.002-.30615.002-.60986.00781-.91895.0127A13.21476,13.21476,0,0,0,5.5171.19141a6.66509,6.66509,0,0,0-1.90088.627A6.43779,6.43779,0,0,0,1.99757,1.99707,6.25844,6.25844,0,0,0,.81935,3.61816a6.60119,6.60119,0,0,0-.625,1.90332,12.993,12.993,0,0,0-.1792,2.002C.00587,7.83008.00489,8.1377,0,8.44434V31.5586c.00489.3105.00587.6113.01515.9219a12.99232,12.99232,0,0,0,.1792,2.0019,6.58756,6.58756,0,0,0,.625,1.9043A6.20778,6.20778,0,0,0,1.99757,38.001a6.27445,6.27445,0,0,0,1.61865,1.1787,6.70082,6.70082,0,0,0,1.90088.6308,13.45514,13.45514,0,0,0,2.0039.1768c.30909.0068.6128.0107.91895.0107C8.80567,40,9.168,40,9.53468,40H110.13477c.3594,0,.7246,0,1.084-.002.3047,0,.6172-.0039.9219-.0107a13.279,13.279,0,0,0,2-.1768,6.80432,6.80432,0,0,0,1.9082-.6308,6.27742,6.27742,0,0,0,1.6172-1.1787,6.39482,6.39482,0,0,0,1.1816-1.6143,6.60413,6.60413,0,0,0,.6191-1.9043,13.50643,13.50643,0,0,0,.1856-2.0019c.0039-.3106.0039-.6114.0039-.9219.0078-.3633.0078-.7246.0078-1.0938V9.53613c0-.36621,0-.72949-.0078-1.09179,0-.30664,0-.61426-.0039-.9209a13.5071,13.5071,0,0,0-.1856-2.002,6.6177,6.6177,0,0,0-.6191-1.90332,6.46619,6.46619,0,0,0-2.7988-2.7998,6.76754,6.76754,0,0,0-1.9082-.627,13.04394,13.04394,0,0,0-2-.17676c-.3047-.00488-.6172-.01074-.9219-.01269-.3594-.002-.7246-.002-1.084-.002Z&quot; style=&quot;fill: #a6a6a6&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M8.44483,39.125c-.30468,0-.602-.0039-.90429-.0107a12.68714,12.68714,0,0,1-1.86914-.1631,5.88381,5.88381,0,0,1-1.65674-.5479,5.40573,5.40573,0,0,1-1.397-1.0166,5.32082,5.32082,0,0,1-1.02051-1.3965,5.72186,5.72186,0,0,1-.543-1.6572,12.41351,12.41351,0,0,1-.1665-1.875c-.00634-.2109-.01464-.9131-.01464-.9131V8.44434S.88185,7.75293.8877,7.5498a12.37039,12.37039,0,0,1,.16553-1.87207,5.7555,5.7555,0,0,1,.54346-1.6621A5.37349,5.37349,0,0,1,2.61183,2.61768,5.56543,5.56543,0,0,1,4.01417,1.59521a5.82309,5.82309,0,0,1,1.65332-.54394A12.58589,12.58589,0,0,1,7.543.88721L8.44532.875H111.21387l.9131.0127a12.38493,12.38493,0,0,1,1.8584.16259,5.93833,5.93833,0,0,1,1.6709.54785,5.59374,5.59374,0,0,1,2.415,2.41993,5.76267,5.76267,0,0,1,.5352,1.64892,12.995,12.995,0,0,1,.1738,1.88721c.0029.2832.0029.5874.0029.89014.0079.375.0079.73193.0079,1.09179V30.4648c0,.3633,0,.7178-.0079,1.0752,0,.3252,0,.6231-.0039.9297a12.73126,12.73126,0,0,1-.1709,1.8535,5.739,5.739,0,0,1-.54,1.67,5.48029,5.48029,0,0,1-1.0156,1.3857,5.4129,5.4129,0,0,1-1.3994,1.0225,5.86168,5.86168,0,0,1-1.668.5498,12.54218,12.54218,0,0,1-1.8692.1631c-.2929.0068-.5996.0107-.8974.0107l-1.084.002Z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g id=&quot;_Group_&quot; data-name=&quot;&amp;lt;Group&amp;gt;&quot;&gt;&lt;g id=&quot;_Group_2&quot; data-name=&quot;&amp;lt;Group&amp;gt;&quot;&gt;&lt;g id=&quot;_Group_3&quot; data-name=&quot;&amp;lt;Group&amp;gt;&quot;&gt;&lt;path id=&quot;_Path_&quot; data-name=&quot;&amp;lt;Path&amp;gt;&quot; d=&quot;M24.76888,20.30068a4.94881,4.94881,0,0,1,2.35656-4.15206,5.06566,5.06566,0,0,0-3.99116-2.15768c-1.67924-.17626-3.30719,1.00483-4.1629,1.00483-.87227,0-2.18977-.98733-3.6085-.95814a5.31529,5.31529,0,0,0-4.47292,2.72787c-1.934,3.34842-.49141,8.26947,1.3612,10.97608.9269,1.32535,2.01018,2.8058,3.42763,2.7533,1.38706-.05753,1.9051-.88448,3.5794-.88448,1.65876,0,2.14479.88448,3.591.8511,1.48838-.02416,2.42613-1.33124,3.32051-2.66914a10.962,10.962,0,0,0,1.51842-3.09251A4.78205,4.78205,0,0,1,24.76888,20.30068Z&quot; style=&quot;fill: #fff&quot;&gt;&lt;/path&gt;&lt;path id=&quot;_Path_2&quot; data-name=&quot;&amp;lt;Path&amp;gt;&quot; d=&quot;M22.03725,12.21089a4.87248,4.87248,0,0,0,1.11452-3.49062,4.95746,4.95746,0,0,0-3.20758,1.65961,4.63634,4.63634,0,0,0-1.14371,3.36139A4.09905,4.09905,0,0,0,22.03725,12.21089Z&quot; style=&quot;fill: #fff&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/g&gt;&lt;g&gt;&lt;path d=&quot;M42.30227,27.13965h-4.7334l-1.13672,3.35645H34.42727l4.4834-12.418h2.083l4.4834,12.418H43.438ZM38.0591,25.59082h3.752l-1.84961-5.44727h-.05176Z&quot; style=&quot;fill: #fff&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M55.15969,25.96973c0,2.81348-1.50586,4.62109-3.77832,4.62109a3.0693,3.0693,0,0,1-2.84863-1.584h-.043v4.48438h-1.8584V21.44238H48.4302v1.50586h.03418a3.21162,3.21162,0,0,1,2.88281-1.60059C53.645,21.34766,55.15969,23.16406,55.15969,25.96973Zm-1.91016,0c0-1.833-.94727-3.03809-2.39258-3.03809-1.41992,0-2.375,1.23047-2.375,3.03809,0,1.82422.95508,3.0459,2.375,3.0459C52.30227,29.01563,53.24953,27.81934,53.24953,25.96973Z&quot; style=&quot;fill: #fff&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M65.12453,25.96973c0,2.81348-1.50586,4.62109-3.77832,4.62109a3.0693,3.0693,0,0,1-2.84863-1.584h-.043v4.48438h-1.8584V21.44238H58.395v1.50586h.03418A3.21162,3.21162,0,0,1,61.312,21.34766C63.60988,21.34766,65.12453,23.16406,65.12453,25.96973Zm-1.91016,0c0-1.833-.94727-3.03809-2.39258-3.03809-1.41992,0-2.375,1.23047-2.375,3.03809,0,1.82422.95508,3.0459,2.375,3.0459C62.26711,29.01563,63.21438,27.81934,63.21438,25.96973Z&quot; style=&quot;fill: #fff&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M71.71047,27.03613c.1377,1.23145,1.334,2.04,2.96875,2.04,1.56641,0,2.69336-.80859,2.69336-1.91895,0-.96387-.67969-1.541-2.28906-1.93652l-1.60937-.3877c-2.28027-.55078-3.33887-1.61719-3.33887-3.34766,0-2.14258,1.86719-3.61426,4.51855-3.61426,2.624,0,4.42285,1.47168,4.4834,3.61426h-1.876c-.1123-1.23926-1.13672-1.9873-2.63379-1.9873s-2.52148.75684-2.52148,1.8584c0,.87793.6543,1.39453,2.25488,1.79l1.36816.33594c2.54785.60254,3.60645,1.626,3.60645,3.44238,0,2.32324-1.85059,3.77832-4.79395,3.77832-2.75391,0-4.61328-1.4209-4.7334-3.667Z&quot; style=&quot;fill: #fff&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M83.34621,19.2998v2.14258h1.72168v1.47168H83.34621v4.99121c0,.77539.34473,1.13672,1.10156,1.13672a5.80752,5.80752,0,0,0,.61133-.043v1.46289a5.10351,5.10351,0,0,1-1.03223.08594c-1.833,0-2.54785-.68848-2.54785-2.44434V22.91406H80.16262V21.44238H81.479V19.2998Z&quot; style=&quot;fill: #fff&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M86.065,25.96973c0-2.84863,1.67773-4.63867,4.29395-4.63867,2.625,0,4.29492,1.79,4.29492,4.63867,0,2.85645-1.66113,4.63867-4.29492,4.63867C87.72609,30.6084,86.065,28.82617,86.065,25.96973Zm6.69531,0c0-1.9541-.89551-3.10742-2.40137-3.10742s-2.40039,1.16211-2.40039,3.10742c0,1.96191.89453,3.10645,2.40039,3.10645S92.76027,27.93164,92.76027,25.96973Z&quot; style=&quot;fill: #fff&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M96.18606,21.44238h1.77246v1.541h.043a2.1594,2.1594,0,0,1,2.17773-1.63574,2.86616,2.86616,0,0,1,.63672.06934v1.73828a2.59794,2.59794,0,0,0-.835-.1123,1.87264,1.87264,0,0,0-1.93652,2.083v5.37012h-1.8584Z&quot; style=&quot;fill: #fff&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M109.3843,27.83691c-.25,1.64355-1.85059,2.77148-3.89844,2.77148-2.63379,0-4.26855-1.76465-4.26855-4.5957,0-2.83984,1.64355-4.68164,4.19043-4.68164,2.50488,0,4.08008,1.7207,4.08008,4.46582v.63672h-6.39453v.1123a2.358,2.358,0,0,0,2.43555,2.56445,2.04834,2.04834,0,0,0,2.09082-1.27344Zm-6.28223-2.70215h4.52637a2.1773,2.1773,0,0,0-2.2207-2.29785A2.292,2.292,0,0,0,103.10207,25.13477Z&quot; style=&quot;fill: #fff&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g id=&quot;_Group_4&quot; data-name=&quot;&amp;lt;Group&amp;gt;&quot;&gt;&lt;g&gt;&lt;path d=&quot;M37.82619,8.731a2.63964,2.63964,0,0,1,2.80762,2.96484c0,1.90625-1.03027,3.002-2.80762,3.002H35.67092V8.731Zm-1.22852,5.123h1.125a1.87588,1.87588,0,0,0,1.96777-2.146,1.881,1.881,0,0,0-1.96777-2.13379h-1.125Z&quot; style=&quot;fill: #fff&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M41.68068,12.44434a2.13323,2.13323,0,1,1,4.24707,0,2.13358,2.13358,0,1,1-4.24707,0Zm3.333,0c0-.97607-.43848-1.54687-1.208-1.54687-.77246,0-1.207.5708-1.207,1.54688,0,.98389.43457,1.55029,1.207,1.55029C44.57522,13.99463,45.01369,13.42432,45.01369,12.44434Z&quot; style=&quot;fill: #fff&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M51.57326,14.69775h-.92187l-.93066-3.31641h-.07031l-.92676,3.31641h-.91309l-1.24121-4.50293h.90137l.80664,3.436h.06641l.92578-3.436h.85254l.92578,3.436h.07031l.80273-3.436h.88867Z&quot; style=&quot;fill: #fff&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M53.85354,10.19482H54.709v.71533h.06641a1.348,1.348,0,0,1,1.34375-.80225,1.46456,1.46456,0,0,1,1.55859,1.6748v2.915h-.88867V12.00586c0-.72363-.31445-1.0835-.97168-1.0835a1.03294,1.03294,0,0,0-1.0752,1.14111v2.63428h-.88867Z&quot; style=&quot;fill: #fff&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M59.09377,8.437h.88867v6.26074h-.88867Z&quot; style=&quot;fill: #fff&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M61.21779,12.44434a2.13346,2.13346,0,1,1,4.24756,0,2.1338,2.1338,0,1,1-4.24756,0Zm3.333,0c0-.97607-.43848-1.54687-1.208-1.54687-.77246,0-1.207.5708-1.207,1.54688,0,.98389.43457,1.55029,1.207,1.55029C64.11232,13.99463,64.5508,13.42432,64.5508,12.44434Z&quot; style=&quot;fill: #fff&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M66.4009,13.42432c0-.81055.60352-1.27783,1.6748-1.34424l1.21973-.07031v-.38867c0-.47559-.31445-.74414-.92187-.74414-.49609,0-.83984.18213-.93848.50049h-.86035c.09082-.77344.81836-1.26953,1.83984-1.26953,1.12891,0,1.76563.562,1.76563,1.51318v3.07666h-.85547v-.63281h-.07031a1.515,1.515,0,0,1-1.35254.707A1.36026,1.36026,0,0,1,66.4009,13.42432Zm2.89453-.38477v-.37646l-1.09961.07031c-.62012.0415-.90137.25244-.90137.64941,0,.40527.35156.64111.835.64111A1.0615,1.0615,0,0,0,69.29543,13.03955Z&quot; style=&quot;fill: #fff&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M71.34816,12.44434c0-1.42285.73145-2.32422,1.86914-2.32422a1.484,1.484,0,0,1,1.38086.79h.06641V8.437h.88867v6.26074h-.85156v-.71143h-.07031a1.56284,1.56284,0,0,1-1.41406.78564C72.0718,14.772,71.34816,13.87061,71.34816,12.44434Zm.918,0c0,.95508.4502,1.52979,1.20313,1.52979.749,0,1.21191-.583,1.21191-1.52588,0-.93848-.46777-1.52979-1.21191-1.52979C72.72121,10.91846,72.26613,11.49707,72.26613,12.44434Z&quot; style=&quot;fill: #fff&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M79.23,12.44434a2.13323,2.13323,0,1,1,4.24707,0,2.13358,2.13358,0,1,1-4.24707,0Zm3.333,0c0-.97607-.43848-1.54687-1.208-1.54687-.77246,0-1.207.5708-1.207,1.54688,0,.98389.43457,1.55029,1.207,1.55029C82.12453,13.99463,82.563,13.42432,82.563,12.44434Z&quot; style=&quot;fill: #fff&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M84.66945,10.19482h.85547v.71533h.06641a1.348,1.348,0,0,1,1.34375-.80225,1.46456,1.46456,0,0,1,1.55859,1.6748v2.915H87.605V12.00586c0-.72363-.31445-1.0835-.97168-1.0835a1.03294,1.03294,0,0,0-1.0752,1.14111v2.63428h-.88867Z&quot; style=&quot;fill: #fff&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M93.51516,9.07373v1.1416h.97559v.74854h-.97559V13.2793c0,.47168.19434.67822.63672.67822a2.96657,2.96657,0,0,0,.33887-.02051v.74023a2.9155,2.9155,0,0,1-.4834.04541c-.98828,0-1.38184-.34766-1.38184-1.21582v-2.543h-.71484v-.74854h.71484V9.07373Z&quot; style=&quot;fill: #fff&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M95.70461,8.437h.88086v2.48145h.07031a1.3856,1.3856,0,0,1,1.373-.80664,1.48339,1.48339,0,0,1,1.55078,1.67871v2.90723H98.69v-2.688c0-.71924-.335-1.0835-.96289-1.0835a1.05194,1.05194,0,0,0-1.13379,1.1416v2.62988h-.88867Z&quot; style=&quot;fill: #fff&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M104.76125,13.48193a1.828,1.828,0,0,1-1.95117,1.30273A2.04531,2.04531,0,0,1,100.73,12.46045a2.07685,2.07685,0,0,1,2.07617-2.35254c1.25293,0,2.00879.856,2.00879,2.27V12.688h-3.17969v.0498a1.1902,1.1902,0,0,0,1.19922,1.29,1.07934,1.07934,0,0,0,1.07129-.5459Zm-3.126-1.45117h2.27441a1.08647,1.08647,0,0,0-1.1084-1.1665A1.15162,1.15162,0,0,0,101.63527,12.03076Z&quot; style=&quot;fill: #fff&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;
&lt;hr/&gt;
&lt;h2 id=&quot;thanks-for-reading&quot;&gt;Thanks For Reading!&lt;/h2&gt;
&lt;p&gt;As always, thanks for stopping by and I hope you check out this app. If you enjoyed reading about it let me know what you think in the comments below.&lt;/p&gt;
&lt;p&gt;Have a good one, peace! 🤙&lt;/p&gt;</content:encoded><category>apps</category><category>ios</category></item><item><title>Ice - A MacOS Menu Bar Manager</title><link>https://jpshlk.com/blog/ice-macos-menu-bar-manager/</link><guid isPermaLink="true">https://jpshlk.com/blog/ice-macos-menu-bar-manager/</guid><description>A new menu bar manager to rival Bartender 5.</description><pubDate>Sat, 13 Apr 2024 00:00:00 GMT</pubDate><content:encoded>&lt;img src=&quot;https://jpshlk.com/_astro/ice-menu-bar-manager.BV0mXAOb_1C5z0o.webp&quot; alt=&quot;Ice MacOS Menu Bar Manaer Screenshot&quot; width=&quot;1400&quot; height=&quot;909&quot;&gt;&lt;a class=&quot;github-button&quot; href=&quot;https://github.com/jordanbaird&quot; data-color-scheme=&quot;no-preference: light; light: light; dark: dark;&quot; data-size=&quot;large&quot; data-show-count=&quot;true&quot; aria-label=&quot;Follow @jordanbaird on GitHub&quot;&gt;Follow @jordanbaird&lt;/a&gt;
&lt;a class=&quot;github-button&quot; href=&quot;https://github.com/jordanbaird/ice&quot; data-color-scheme=&quot;no-preference: light; light: light; dark: dark;&quot; data-icon=&quot;octicon-star&quot; data-size=&quot;large&quot; data-show-count=&quot;true&quot; aria-label=&quot;Star jordanbaird/ice on GitHub&quot;&gt;Star&lt;/a&gt;
&lt;a class=&quot;github-button&quot; href=&quot;https://github.com/jordanbaird/ice/issues&quot; data-color-scheme=&quot;no-preference: light; light: light; dark: dark;&quot; data-icon=&quot;octicon-issue-opened&quot; data-size=&quot;large&quot; data-show-count=&quot;true&quot; aria-label=&quot;Issue jordanbaird/ice on GitHub&quot;&gt;Issue&lt;/a&gt;
&lt;h2 id=&quot;an-open-source-menu-bar-manager&quot;&gt;An Open Source Menu Bar Manager&lt;/h2&gt;
&lt;p&gt;Meet Ice, an open-source menu bar manager that offers robust features and customization options tailored for MacOS users. Designed with both simplicity and functionality in mind, Ice allows you to declutter your desktop and access your most-used applications and services with ease.&lt;/p&gt;
&lt;p&gt;Whether you’re a power user or just looking for a more organized workspace, Ice introduces an elegant solution to enhance your daily computing tasks.&lt;/p&gt;
&lt;h2 id=&quot;installing-ice-by-jordan-baird-from-github&quot;&gt;Installing &lt;a href=&quot;https://github.com/jordanbaird/Ice/releases&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; class=&quot;underline-offset-2 hover:underline text-primary-500 hover:text-sky-600 dark:hover:text-primary-400&quot;&gt;Ice By Jordan Baird&lt;/a&gt; From GitHub&lt;/h2&gt;
&lt;p&gt;To install Ice, head on over to the GitHub repo linked above and grab the latest release, which is &lt;code&gt;0.8.0&lt;/code&gt; as of this post.&lt;/p&gt;
&lt;p&gt;In case you’ve never installed anything from GitHub before:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Click on the zip file under the Assets heading and it will prompt you to allow downloads from &lt;code&gt;objects.githubusercontent.com&lt;/code&gt;. Click “Allow”.&lt;/li&gt;
&lt;li&gt;After the file is downloaded, double-click to unzip the file and move it to your Applications folder.&lt;/li&gt;
&lt;li&gt;Then launch Ice by clicking on the icon in your Applications folder or with Spotlight.&lt;/li&gt;
&lt;li&gt;Ice will open and you’ll see a screen like the below screenshot.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://jpshlk.com/_astro/ice-general-settings.CQTDjhGo_Z2nUel1.webp&quot; alt=&quot;Ice General Settings Screenshot&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2024&quot; height=&quot;1424&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;ices-features-and-functionality&quot;&gt;Ice’s Features And Functionality&lt;/h2&gt;
&lt;p&gt;Ice’s general settings reveal a user-friendly approach to MacOS menu bar management. It offers customizable visibility options like ‘Show on click’, ‘Show on hover’, and ‘Show on scroll’, along with ‘Automatically rehide’ to keep the desktop uncluttered.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Launch at login:&lt;/strong&gt; This setting should be enabled at all times, what would be the point of having to enable it every time?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Show Ice icon:&lt;/strong&gt; Same as above, it’s nice to see an icon that indicates that Ice is actively hiding your icons.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ice icon:&lt;/strong&gt; Ice provides some nice icons to choose from and also allows you to use your own, which is very nice.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://jpshlk.com/_astro/ice-icon-options.DvV8mG2p_Z1AxTtD.webp&quot; alt=&quot;Ice icon options&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1024&quot; height=&quot;486&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Show on click &amp;amp; Show on hover:&lt;/strong&gt; I have both of these enabled in case Ice doesn’t recognize me hovering fast enough. It enables you to click to hide them as well.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Show on scroll:&lt;/strong&gt; This one is nice as well, you swipe with two fingers to show or hide icons.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Automatically rehide:&lt;/strong&gt; For now I have this one on as well, just in case I forget to swipe or click to hide everything.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Strategy:&lt;/strong&gt; This feature employs a ‘smart algorithm’ to organize menu bar items efficiently. I have only been using it since this morning so I’m not really sure how it works in practice.&lt;/p&gt;
&lt;p&gt;This suite of features positions Ice as an intuitive tool designed to enhance user experience through simplicity and smart design.&lt;/p&gt;
&lt;p&gt;I will be putting it through its paces and likely reporting some bugs I’ve already experienced, but so far, this seems like a great free alternative to &lt;a href=&quot;https://www.macbartender.com&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; class=&quot;underline-offset-2 hover:underline text-primary-500 hover:text-sky-600 dark:hover:text-primary-400&quot;&gt;Bartender $(16.00)&lt;/a&gt;, at least for minimal functionality.&lt;/p&gt;
&lt;p&gt;You can also get Bartender as part of &lt;a href=&quot;https://setapp.sjv.io/c/5403212/443665/5114&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; class=&quot;underline-offset-2 hover:underline text-primary-500 hover:text-sky-600 dark:hover:text-primary-400&quot;&gt;SetApp&lt;/a&gt;, which is an awesome subscription service to get a bunch of different apps for once price.&lt;/p&gt;
&lt;p&gt;Thanks for stopping by! I’d love to hear your experiences with Ice or any questions you might have — drop a comment below!&lt;/p&gt;</content:encoded><category>apps</category><category>mac</category></item><item><title>Scroll Reverser - A Tiny Mac App To Manage How Scrolling Works</title><link>https://jpshlk.com/blog/scroll-reverser-a-tiny-mac-app/</link><guid isPermaLink="true">https://jpshlk.com/blog/scroll-reverser-a-tiny-mac-app/</guid><description>This app should 100% be a native feature...</description><pubDate>Mon, 08 Apr 2024 00:00:00 GMT</pubDate><content:encoded>&lt;img src=&quot;https://jpshlk.com/_astro/scroll-reverser.DeeX-_xc_Z12QjNL.webp&quot; alt=&quot;Scroll Reverser Screenshot&quot; width=&quot;960&quot; height=&quot;432&quot;&gt;&lt;h2 id=&quot;theres-literally-zero-reason-why-this-isnt-a-native-feature&quot;&gt;There’s Literally Zero Reason Why This Isn’t A Native Feature&lt;/h2&gt;
&lt;p&gt;There are a lot of things that Apple gets right, and a lot of them are under-the-hood so to speak. However, occasionally there are some things that make me scratch my head. I ran into a little problem when I wanted to use a Mouse and the Magic Trackpad in tandem, but have the scrolling set differently per device.&lt;/p&gt;
&lt;p&gt;I want to be able to have the Trackpad settings similar to how an iPhone or iPad work, where I push with two fingers up and it scrolls up, and pull down to scroll down. Then for the mouse, I want it to scroll normally, like a sane person…&lt;/p&gt;
&lt;h2 id=&quot;enter-scroll-reverser-by-nick-moore&quot;&gt;Enter &lt;a href=&quot;https://pilotmoon.com/scrollreverser/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; class=&quot;underline-offset-2 hover:underline text-primary-500 hover:text-sky-600 dark:hover:text-primary-400&quot;&gt;Scroll Reverser&lt;/a&gt; By Nick Moore&lt;/h2&gt;
&lt;p&gt;This tiny app completely solves this edge-case issue. You can download it from the link above, or check out the &lt;a href=&quot;https://github.com/pilotmoon/Scroll-Reverser&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; class=&quot;underline-offset-2 hover:underline text-primary-500 hover:text-sky-600 dark:hover:text-primary-400&quot;&gt;GitHub repo&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The settings are minimal and self-explanatory. Check it out and give it a star if you’d like!&lt;/p&gt;
&lt;a class=&quot;github-button&quot; href=&quot;https://github.com/pilotmoon/Scroll-Reverser&quot; data-color-scheme=&quot;no-preference: light; light: light; dark: dark_high_contrast;&quot; data-icon=&quot;octicon-star&quot; data-size=&quot;large&quot; data-show-count=&quot;true&quot; aria-label=&quot;Star pilotmoon/Scroll-Reverser on GitHub&quot;&gt;Star&lt;/a&gt;</content:encoded><category>apps</category><category>mac</category></item><item><title>I Dug Up An Old Jailbreak Podcast Episode With Siguza And tihmstar</title><link>https://jpshlk.com/blog/jailcast-siguza-tihmstar/</link><guid isPermaLink="true">https://jpshlk.com/blog/jailcast-siguza-tihmstar/</guid><description>Back in 2017 I interviewed the developers of the Phoenix jailbreak.</description><pubDate>Sun, 07 Apr 2024 00:00:00 GMT</pubDate><content:encoded>&lt;img src=&quot;https://jpshlk.com/_astro/jailcast-siguza-tihmstar.DiQOReP8_2q89W.webp&quot; alt=&quot;Flat night scene of a podcast desk with a microphone, headphones, and a phone, while an orange phoenix rises above them.&quot; width=&quot;1400&quot; height=&quot;732&quot;&gt;&lt;p&gt;I used to run a podcast way back in the day called Jailcast. It was a lot of fun and I got the pleasure of chatting with a lot of very talented people in the community.&lt;/p&gt;
&lt;p&gt;My favorite episode was the one where I interviewed two jailbreak developers who created &lt;a href=&quot;https://phoenixpwn.com&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; class=&quot;underline-offset-2 hover:underline text-primary-500 hover:text-sky-600 dark:hover:text-primary-400&quot;&gt;The Phoenix Jailbreak&lt;/a&gt;, a &lt;em&gt;semi-untethered&lt;/em&gt; jailbreak for iOS 9.3.5-9.3.6.&lt;/p&gt;
&lt;p&gt;In the episode I interviewed Siguza and tihmstar and asked questions from the community.&lt;/p&gt;
&lt;figure&gt;&lt;audio controls src=&quot;http://jpshlk.com/static/siguza-tihmstar_1.mp3&quot;&gt;&lt;/audio&gt;&lt;/figure&gt;
&lt;p&gt;Enjoy!&lt;/p&gt;</content:encoded><category>podcast</category></item><item><title>Odd Behavior With Transitions</title><link>https://jpshlk.com/blog/odd-behavior-with-transitions/</link><guid isPermaLink="true">https://jpshlk.com/blog/odd-behavior-with-transitions/</guid><description>After forking the theme and adding my own content, there&apos;s super glitchy transitions when the site is live.</description><pubDate>Sat, 25 Nov 2023 00:00:00 GMT</pubDate><content:encoded>&lt;img src=&quot;https://jpshlk.com/_astro/black-glitch.BIGiF6f0_102xVu.webp&quot; alt=&quot;Black Glitch Image&quot; width=&quot;1400&quot; height=&quot;933&quot;&gt;&lt;h2 id=&quot;whats-with-the-glitchy-transitions&quot;&gt;What’s with the glitchy transitions?&lt;/h2&gt;
&lt;p&gt;After forking this awesome theme from &lt;a href=&quot;https://github.com/wanoo21/tailwind-astro-starting-blog&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; class=&quot;underline-offset-2 hover:underline&quot;&gt;here&lt;/a&gt;, then throwing it at Netlify, I noticed some odd issues with the animation for page transitions. Sometimes the site would glitch out when clicking through to another page.&lt;/p&gt;
&lt;p&gt;After looking into it a bit I posted about it in the &lt;a href=&quot;https://discord.com/channels/830184174198718474/1178031437216235571&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; class=&quot;underline-offset-2 hover:underline&quot;&gt;Astro Discord&lt;/a&gt;, and someone mentioned that there isn’t a &lt;code&gt;&amp;lt;ViewTransitions /&amp;gt;&lt;/code&gt; tag in the &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; of the site, as per &lt;a href=&quot;https://docs.astro.build/en/guides/view-transitions/#adding-view-transitions-to-a-page&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; class=&quot;underline-offset-2 hover:underline&quot;&gt;Astro’s Docs&lt;/a&gt;. That seemed to make sense, so I started looking through the repo code and noticed that there actually isn’t a &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; tag anywhere to be found. This is incredibly odd because the generated &lt;code&gt;HTML&lt;/code&gt; definitely contains a &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt;. 🤨&lt;/p&gt;
&lt;p&gt;I know that I am super new to Astro and still learning when it comes to web development, but I know that the &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; tag is coming from &lt;em&gt;somewhere&lt;/em&gt;… My best guess is that either there’s something I don’t know about how Astro generates the markup, or that if you happen to throw meta tags at a browser it will try and wrap them in a head tag anyway.&lt;/p&gt;
&lt;p&gt;After some more troubleshooting, I noticed that certain pages weren’t affected by the glitch…&lt;/p&gt;
&lt;h2 id=&quot;looks-like-images-may-be-the-problem&quot;&gt;Looks like images may be the problem.&lt;/h2&gt;
&lt;p&gt;Wait… How come this post didn’t do that then?&lt;/p&gt;
&lt;p&gt;I put that image in the &lt;code&gt;public&lt;/code&gt; folder instead of the &lt;code&gt;src/assets&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;My guess is it’s something to do with &lt;code&gt;&amp;lt;ViewTransitions /&amp;gt;&lt;/code&gt;, and how Astro imports the image in &lt;code&gt;src&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&quot;reporting-the-bug&quot;&gt;Reporting the bug&lt;/h2&gt;
&lt;p&gt;I reported as an issue &lt;a href=&quot;https://github.com/wanoo21/tailwind-astro-starting-blog/issues/12&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; class=&quot;underline-offset-2 hover:underline&quot;&gt;here&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Describe the bug&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Okay, this is a wierd one…&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;After forking the theme and starting to add my own content I noticed some odd behavior. When clicking on a link to a post or page that has an image in it the transition animations glitch out, causing the page to flicker in Safari and the mobile nav to fly by. In Chrome it doesn’t flash, just does the nav thing…&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;To Reproduce&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;ol&gt;
&lt;li&gt;Fork the theme.&lt;/li&gt;
&lt;li&gt;Add a new page with an image in &lt;code&gt;src&lt;/code&gt;, in my case &lt;code&gt;src/assets&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;Then either build it through Netlify or run &lt;code&gt;npm run build&lt;/code&gt;, then run &lt;code&gt;npm run preview&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Click a link to one of those pages.&lt;/li&gt;
&lt;li&gt;It should glitch like I described.&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Expected behavior&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Images should be able to be put in &lt;code&gt;src&lt;/code&gt; so Astro can process them with the &lt;code&gt;&amp;lt;Image /&amp;gt;&lt;/code&gt; component.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Screenshots&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;https://jpshlk.com/trasition-glitch.gif&quot; alt=&quot;Bug in action&quot;/&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Desktop (please complete the following information):&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;OS: MacOS - Ventura 13.5&lt;/li&gt;
&lt;li&gt;Browser: Safari - 16.6 (18615.3.12.11.2), Chrome - 119.0.6045.159&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Smartphone (please complete the following information):&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Device: iPhone 13 Pro Max&lt;/li&gt;
&lt;li&gt;OS: iOS 17.2&lt;/li&gt;
&lt;li&gt;Browser Safari - 17&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Additional context&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;I documented this for my ongoing journey about learning webdev as a complete noob &lt;a href=&quot;https://jpshlk.com/blog/odd-behavior-with-transitions/&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Also, I couldn’t find the &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; to check if the &lt;code&gt;&amp;lt;ViewTransitions /&amp;gt;&lt;/code&gt; component was in there. I found it under the &lt;code&gt;html&lt;/code&gt; tag in &lt;code&gt;RootLayout&lt;/code&gt; though. I thought it was supposed to go in the head, per the &lt;a href=&quot;https://docs.astro.build/en/guides/view-transitions/#adding-view-transitions-to-a-page&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; class=&quot;underline-offset-2 hover:underline&quot;&gt;Astro Docs&lt;/a&gt;. Any insight on this?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Thanks again for the awesome theme and for fixing the last issue I reported!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I hope he has some time to check it out soon, because I’m kinda stumped on how to proceed.&lt;/p&gt;
&lt;p&gt;If I add another &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; tag to the &lt;code&gt;BaseHead&lt;/code&gt; component would it produce two different heads and then mess things up? 🤔&lt;/p&gt;
&lt;h2 id=&quot;update&quot;&gt;Update&lt;/h2&gt;
&lt;p&gt;What I ended up having to do was wrapping the &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; tag around both &lt;code&gt;&amp;lt;ViewTransitions /&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;BaseHead ?&amp;gt;&lt;/code&gt; and then everything worked, like this:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;html&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;head&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#FDAEB7;font-style:italic&quot;&gt;ViewTransitions&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#FDAEB7;font-style:italic&quot;&gt;BaseHead&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; title&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;{title}&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; description&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;{description}&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;head&lt;/span&gt;&lt;span style=&quot;color:#FDAEB7;font-style:italic&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If I didn’t include the &lt;code&gt;&amp;lt;BaseHead /&amp;gt;&lt;/code&gt; component, then the layout didn’t work right on mobile.  For some reason, it zoomed the page out and the content shank down to about 60% of the window. Now I can proceed to move my images to &lt;code&gt;src&lt;/code&gt; then Astro can properly process them with the &lt;code&gt;&amp;lt;Image /&amp;gt;&lt;/code&gt; component.&lt;/p&gt;
&lt;h2 id=&quot;another-update&quot;&gt;Another Update&lt;/h2&gt;
&lt;p&gt;He fixed it with this &lt;a href=&quot;https://github.com/wanoo21/tailwind-astro-starting-blog/commit/6f8d02e8a4742d23e721f28aa11e0316167499c7&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; class=&quot;underline-offset-2 hover:underline&quot;&gt;commit here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Thanks for reading and I hope this helps. I’ll definetly let this post stay up as part of my journey relearning web development.&lt;/p&gt;
&lt;p&gt;Peace! ✌️&lt;/p&gt;</content:encoded><category>web-development</category><category>astro</category><category>bugs</category></item><item><title>OpenAI Staff Alarmed by Q*</title><link>https://jpshlk.com/blog/openai-staff-alarmed/</link><guid isPermaLink="true">https://jpshlk.com/blog/openai-staff-alarmed/</guid><description>OpenAi&apos;s staff alarmed by how powerful their new Q* model is.</description><pubDate>Fri, 24 Nov 2023 00:00:00 GMT</pubDate><content:encoded>&lt;img src=&quot;https://jpshlk.com/_astro/robot-handshake-human.DmIfjgRQ_NXAhm.webp&quot; alt=&quot;Robot human handshake&quot; width=&quot;1400&quot; height=&quot;933&quot;&gt;&lt;h2 id=&quot;what-does-it-mean-when-an-ai-can-do-math&quot;&gt;What does it mean when an AI can do math?&lt;/h2&gt;
&lt;p&gt;The Guardian &lt;a href=&quot;https://www.theguardian.com/business/2023/nov/23/openai-was-working-on-advanced-model-so-powerful-it-alarmed-staff&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; class=&quot;underline-offset-2 hover:underline&quot;&gt;reported&lt;/a&gt; how “OpenAI ‘was working on an advanced model so powerful it alarmed staff’” yesterday.&lt;/p&gt;
&lt;p&gt;A lot of people don’t know what these ‘AI’ tools even are, let alone how potentially dangerous they could be. In a comment in &lt;a href=&quot;https://www.reddit.com/r/news/comments/1826d8c/comment/kagrdul/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; class=&quot;underline-offset-2 hover:underline&quot;&gt;this Reddit&lt;/a&gt; thread, Literature-South breaks it down pretty well:&lt;/p&gt;
&lt;blockquote class=&quot;reddit-embed-bq&quot; data-embed-showtitle=&quot;true&quot; data-embed-context=&quot;1&quot; data-embed-depth=&quot;2&quot; data-embed-theme=&quot;dark&quot; data-embed-height=&quot;634&quot;&gt;&lt;a href=&quot;https://www.reddit.com/r/news/comments/1826d8c/comment/kagrdul/&quot;&gt;Comment&lt;/a&gt; by&lt;a href=&quot;https://www.reddit.com/user/jchacakan/&quot;&gt;u/jchacakan&lt;/a&gt; from discussion&lt;a href=&quot;https://www.reddit.com/r/news/comments/1826d8c/openai_was_working_on_advanced_model_so_powerful/&quot;&gt;&lt;no value&gt;&lt;/no&gt;&lt;/a&gt; in&lt;a href=&quot;https://www.reddit.com/r/news/&quot;&gt;news&lt;/a&gt;&lt;/blockquote&gt;
&lt;script src=&quot;https://embed.reddit.com/widgets.js&quot; charset=&quot;UTF-8&quot;&gt;&lt;/script&gt;</content:encoded><category>news</category><category>ai</category></item><item><title>Learning Astro</title><link>https://jpshlk.com/blog/learning-astro/</link><guid isPermaLink="true">https://jpshlk.com/blog/learning-astro/</guid><description>Documenting my initial dive into my journey learning Astro!</description><pubDate>Thu, 23 Nov 2023 00:00:00 GMT</pubDate><content:encoded>&lt;img src=&quot;https://jpshlk.com/_astro/Astro-logo.DPCQ9IeB_Z2fPkiH.webp&quot; alt=&quot;The Astro logo&quot; width=&quot;1400&quot; height=&quot;795&quot;&gt;&lt;p&gt;I’ll be slowly updating this post with notes about my initial experience with Astro.&lt;/p&gt;
&lt;h2 id=&quot;following-this-tutorial&quot;&gt;Following this tutorial&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.astro.build/en/tutorial/0-introduction/&quot;&gt;https://docs.astro.build/en/tutorial/0-introduction/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;notes&quot;&gt;Notes&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Astro puts files in the &lt;code&gt;/public&lt;/code&gt; directory into the &lt;code&gt;root&lt;/code&gt; for some reason.&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>astro</category><category>markdown</category></item><item><title>Markdown Guide</title><link>https://jpshlk.com/blog/github-markdown-guide/</link><guid isPermaLink="true">https://jpshlk.com/blog/github-markdown-guide/</guid><description>Markdown cheatsheet for all your blogging needs - headers, lists, images, tables and more! An illustrated guide based on GitHub Flavored Markdown.</description><pubDate>Fri, 11 Oct 2019 00:00:00 GMT</pubDate><content:encoded>&lt;img src=&quot;https://jpshlk.com/_astro/github-markdown-guide.DJ2OeCI4_Z1yGLqn.webp&quot; alt=&quot;Flat night scene of a small builder writing on a giant document marked with a hash heading, text bars, a bulleted list, and a table grid.&quot; width=&quot;1400&quot; height=&quot;732&quot;&gt;&lt;h1 id=&quot;introduction&quot;&gt;Introduction&lt;/h1&gt;
&lt;p&gt;Markdown and Mdx parsing is supported via &lt;code&gt;unified&lt;/code&gt;, and other remark and rehype packages. &lt;code&gt;next-mdx-remote&lt;/code&gt; allows us to parse &lt;code&gt;.mdx&lt;/code&gt; and &lt;code&gt;.md&lt;/code&gt; files in a more flexible manner without touching webpack.&lt;/p&gt;
&lt;p&gt;GitHub flavored markdown is used. &lt;code&gt;mdx-prism&lt;/code&gt; provides syntax highlighting capabilities for code blocks. Here’s a demo of how everything looks.&lt;/p&gt;
&lt;p&gt;The following markdown cheatsheet is adapted from: &lt;a href=&quot;https://guides.github.com/features/mastering-markdown/&quot;&gt;https://guides.github.com/features/mastering-markdown/&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&quot;what-is-markdown&quot;&gt;What is Markdown?&lt;/h1&gt;
&lt;p&gt;Markdown is a way to style text on the web. You control the display of the document; formatting words as bold or italic, adding images, and creating lists are just a few of the things we can do with Markdown. Mostly, Markdown is just regular text with a few non-alphabetic characters thrown in, like &lt;code&gt;#&lt;/code&gt; or &lt;code&gt;*&lt;/code&gt;.&lt;/p&gt;
&lt;h1 id=&quot;syntax-guide&quot;&gt;Syntax guide&lt;/h1&gt;
&lt;p&gt;Here’s an overview of Markdown syntax that you can use anywhere on GitHub.com or in your own text files.&lt;/p&gt;
&lt;h2 id=&quot;headers&quot;&gt;Headers&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;# This is a h1 tag&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;## This is a h2 tag&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;#### This is a h4 tag&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&quot;this-is-a-h1-tag&quot;&gt;This is a h1 tag&lt;/h1&gt;
&lt;h2 id=&quot;this-is-a-h2-tag&quot;&gt;This is a h2 tag&lt;/h2&gt;
&lt;h4 id=&quot;this-is-a-h4-tag&quot;&gt;This is a h4 tag&lt;/h4&gt;
&lt;h2 id=&quot;emphasis&quot;&gt;Emphasis&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;_This text will be italic_&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;**This text will be bold**&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;_You **can** combine them_&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;This text will be italic&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;This text will be bold&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;You &lt;strong&gt;can&lt;/strong&gt; combine them&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&quot;lists&quot;&gt;Lists&lt;/h2&gt;
&lt;h3 id=&quot;unordered&quot;&gt;Unordered&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;- Item 1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;- Item 2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  - Item 2a&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  - Item 2b&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Item 1&lt;/li&gt;
&lt;li&gt;Item 2
&lt;ul&gt;
&lt;li&gt;Item 2a&lt;/li&gt;
&lt;li&gt;Item 2b&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;ordered&quot;&gt;Ordered&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;1. Item 1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;1. Item 2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;1. Item 3&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   1. Item 3a&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   1. Item 3b&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;Item 1&lt;/li&gt;
&lt;li&gt;Item 2&lt;/li&gt;
&lt;li&gt;Item 3
&lt;ol&gt;
&lt;li&gt;Item 3a&lt;/li&gt;
&lt;li&gt;Item 3b&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;images&quot;&gt;Images&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;![GitHub Logo](https://github.githubassets.com/images/modules/logos_page/GitHub-Mark.png)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Format: ![Alt Text](url)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://github.githubassets.com/images/modules/logos_page/GitHub-Mark.png&quot; alt=&quot;GitHub Logo&quot;/&gt;&lt;/p&gt;
&lt;h2 id=&quot;links&quot;&gt;Links&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;http://github.com - automatic!&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;[GitHub](http://github.com)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;http://github.com&quot;&gt;http://github.com&lt;/a&gt; - automatic!
&lt;a href=&quot;http://github.com&quot;&gt;GitHub&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;blockquotes&quot;&gt;Blockquotes&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;As Kanye West said:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&amp;gt; We&amp;#39;re living the future so&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&amp;gt; the present is our past.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;As Kanye West said:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;We’re living the future so
the present is our past.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;inline-code&quot;&gt;Inline code&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;I think you should use an&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;`&amp;lt;addr&amp;gt;` element here instead.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I think you should use an
&lt;code&gt;&amp;lt;addr&amp;gt;&lt;/code&gt; element here instead.&lt;/p&gt;
&lt;h2 id=&quot;syntax-highlighting&quot;&gt;Syntax highlighting&lt;/h2&gt;
&lt;p&gt;Here’s an example of how you can use syntax highlighting with &lt;a href=&quot;https://help.github.com/articles/basic-writing-and-formatting-syntax/&quot;&gt;GitHub Flavored Markdown&lt;/a&gt;:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;```js&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;function fancyAlert(arg) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  if (arg) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    $.facebox({ div: &amp;#39;#foo&amp;#39; })&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;```&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And here’s how it looks - nicely colored!&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; fancyAlert&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;arg&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (arg) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    $.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;facebox&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;({ div: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;#39;#foo&amp;#39;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; })&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;footnotes&quot;&gt;Footnotes&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Here is a simple footnote[^1]. With some additional text after it.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;[^1]: My reference.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Here is a simple footnote&lt;sup&gt;&lt;a href=&quot;#user-content-fn-1&quot; id=&quot;user-content-fnref-1&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;. With some additional text after it.&lt;/p&gt;
&lt;h2 id=&quot;task-lists&quot;&gt;Task Lists&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;- [x] list syntax required (any unordered or ordered list supported)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;- [x] this is a complete item&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;- [ ] this is an incomplete item&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul class=&quot;contains-task-list&quot;&gt;
&lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; checked disabled/&gt; list syntax required (any unordered or ordered list supported)&lt;/li&gt;
&lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; checked disabled/&gt; this is a complete item&lt;/li&gt;
&lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; disabled/&gt; this is an incomplete item&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;tables&quot;&gt;Tables&lt;/h2&gt;
&lt;p&gt;You can create tables by assembling a list of words and dividing them with hyphens &lt;code&gt;-&lt;/code&gt; (for the first row), and then separating each column with a pipe &lt;code&gt;|&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;| First Header                | Second Header                |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;| --------------------------- | ---------------------------- |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;| Content from cell 1         | Content from cell 2          |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;| Content in the first column | Content in the second column |&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

















&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;First Header&lt;/th&gt;&lt;th&gt;Second Header&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Content from cell 1&lt;/td&gt;&lt;td&gt;Content from cell 2&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Content in the first column&lt;/td&gt;&lt;td&gt;Content in the second column&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;strikethrough&quot;&gt;Strikethrough&lt;/h2&gt;
&lt;p&gt;Any word wrapped with two tildes (like &lt;code&gt;~~this~~&lt;/code&gt;) will appear &lt;del&gt;crossed out&lt;/del&gt;.&lt;/p&gt;
&lt;section data-footnotes class=&quot;footnotes&quot;&gt;&lt;h2 class=&quot;sr-only&quot; id=&quot;footnote-label&quot;&gt;Footnotes&lt;/h2&gt;
&lt;ol&gt;
&lt;li id=&quot;user-content-fn-1&quot;&gt;
&lt;p&gt;My reference. &lt;a href=&quot;#user-content-fnref-1&quot; data-footnote-backref aria-label=&quot;Back to reference 1&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;</content:encoded><category>markdown</category><category>old</category></item><item><title>Tags Archive in Liquid on a GitHub Pages Jekyll Site</title><link>https://jpshlk.com/blog/jekyll-tags/</link><guid isPermaLink="true">https://jpshlk.com/blog/jekyll-tags/</guid><description>Creating a tags archive in jekyll with Liquid.</description><pubDate>Sun, 22 Apr 2018 00:00:00 GMT</pubDate><content:encoded>&lt;img src=&quot;https://jpshlk.com/_astro/post-tags.CHnb2Lfs_ZeMHuo.webp&quot; alt=&quot;Post Tags via Undraw&quot; width=&quot;974&quot; height=&quot;925&quot;&gt;&lt;h2 id=&quot;what-is-a-blog-without-tags-and-an-archive-page&quot;&gt;What is a blog without tags and an archive page?&lt;/h2&gt;
&lt;p&gt;When I started on this site, I wasn’t looking forward to figuring out tags logic and building the archive page to show them. I had tried using other Jekyll themes, and sometimes their tags would work and sometimes they wouldn’t.&lt;/p&gt;
&lt;p&gt;Because everyone has a different way of doing things, sometimes it’s hard to follow the logic of why things work and why they don’t. It took me sitting down and watching a lynda.com video series on Jekyll to understand how tags worked. At least enough to implement a simple archive page sorted by tags. I still have a lot to learn about Jekyll, but this is how I achieved my tags archive.&lt;/p&gt;
&lt;p&gt;Something worth noting is that James Williamson, the author of the video series I watched, mentioned a &lt;a href=&quot;https://blog.lanyonm.org/articles/2013/11/21/alphabetize-jekyll-page-tags-pure-liquid.html&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; class=&quot;underline-offset-2 hover:underline&quot;&gt;blog post&lt;/a&gt; by Michael Lanyon about alphabetizing Jekyll page tags in pure Liquid. Give it a read if you have a few minutes, you won’t be disappointed.&lt;/p&gt;
&lt;p&gt;From what I learned, you need four things to get tags working on a Jekyll site:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;A tags array in at least one post’s front matter.&lt;/li&gt;
&lt;li&gt;Some code to capture and sort those tags.&lt;/li&gt;
&lt;li&gt;Other code to loop through them and print them to the page.&lt;/li&gt;
&lt;li&gt;An archive page to display them.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;capturing-the-tags-and-building-the-tag-cloud&quot;&gt;Capturing the tags and building the tag cloud&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://jpshlk.com/_astro/tag-cloud.CKvgm1yl_1gKM3v.webp&quot; alt=&quot;Tag Cloud - via Undraw&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1170&quot; height=&quot;956&quot;&gt;&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;html&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;{% capture site_tags %}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  {% for tag in site.tags %}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    {{ tag | first }}{% unless forloop.last %},{% endunless %}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  {% endfor %}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;{% endcapture %}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;{% assign sortedTags=site_tags | split:&amp;#39;,&amp;#39; | sort %}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;{% for tag in sortedTags %}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;span&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;tags&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; href&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;#{{tag | cgi_escape}}&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;gt;{{ tag }} [{{ site.tags[tag].size }}]&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    {% unless forloop.last %},{% endunless %}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  &amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;span&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;{% endfor %}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Jekyll will store all the tags you specify in the front matter of your posts in the &lt;code&gt;site.tags&lt;/code&gt; object. Any time you add a new tag to a post, they will be added automatically upon rebuilding the site, this is super useful for creating the tag page, although it’s not very straightforward.&lt;/p&gt;
&lt;p&gt;In the code above, the first part will create a variable called &lt;code&gt;site_tags&lt;/code&gt; using &lt;code&gt;capture&lt;/code&gt;. It will then loop through the tags object and grab the name of each tag and assign it as a variable called &lt;code&gt;tag&lt;/code&gt;. Since each tag in the tags object has two properties, a name and a list of posts, it does this by using the &lt;code&gt;first&lt;/code&gt; filter which grabs the first property. It then creates a new array called &lt;code&gt;sortedTags&lt;/code&gt; which takes the names from &lt;code&gt;site_tags&lt;/code&gt; and alphabetizes them and splits them up with a comma, unless it’s the last entry, then it leaves the comma off.&lt;/p&gt;
&lt;p&gt;The second will loop through the array &lt;code&gt;sortedTags&lt;/code&gt; and prints the tag name along with the number of posts associated with it. It seems pretty complicated, but once you work it out, it’s not that bad.&lt;/p&gt;
&lt;h3 id=&quot;creating-the-archive-page&quot;&gt;Creating the archive page&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://jpshlk.com/_astro/archive-page.DklXO5Ku_57F2N.webp&quot; alt=&quot;Archive Page - via Undraw&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1120&quot; height=&quot;869&quot;&gt;&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;html&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;{% for tag in sortedTags %}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;h3&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; id&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;{{tag | cgi_escape}}&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;tag-name&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;span&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;gt;{{tag}}&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;span&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;h3&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;ul&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;tag-list&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    {% for post in site.tags[tag] %}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;li&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;time&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; itemprop&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;dateCreated&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; datetime&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;{{post.date}}&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;gt;{{post.date | date: &amp;quot;%b %d, %Y &amp;quot;}}&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;time&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;gt; &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; href&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;{{site.baseurl}}{{post.url}}&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; rel&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;bookmark&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; title&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;Link to {{site.baseurl}}{{post.url}}&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;gt;{{post.title}}&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      &amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;li&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    {% endfor %}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    &amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;ul&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  &amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;{% endfor %}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now I need to loop through the &lt;code&gt;sortedTags&lt;/code&gt; array to display our tags in the archive page, and then loop through the posts associated with each tag. I’ll use another forloop, with another forloop nested inside, this will create a list of tags with a list of posts under each one.&lt;/p&gt;
&lt;p&gt;In the code example above, the first loop prints the name each of the tags in a header, while the second loops through the posts for each tag and prints the date and then the title with a link. Again, it’s not the most natural thing to wrap your head around at first. The great thing about Jekyll is it sort of lets you tiptoe into programming concepts without being bogged down with semantics.&lt;/p&gt;
&lt;h3 id=&quot;showing-the-tag-cloud-in-the-blog-roll&quot;&gt;Showing the tag cloud in the blog roll&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;html&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;{% for tag in post.tags %}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; href&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;{{ site.baseurl }}/archive/index.html#{{ tag | cgi_escape }}&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; title&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;Pages tagged {{ tag }}&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; rel&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;tag&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;gt;{{ tag }}&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;gt;{% unless forloop.last %}, {% endunless %}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;{% endfor %}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Creating the tag cloud for each post is a bit trickier, you can’t use the same logic as the tag cloud on the archive page. It has only to display the tags that are in the post it’s shown on. I can’t loop through &lt;code&gt;sortedTags&lt;/code&gt; because it will just give me the same global sorted tag list.&lt;/p&gt;
&lt;p&gt;To access the post tags, I’ll need to use &lt;code&gt;post.tags&lt;/code&gt; and loop through that. Also, the &lt;code&gt;href&lt;/code&gt; value has to be relative to jump to the archive page and then land on the right section.&lt;/p&gt;
&lt;p&gt;Another thing to mention is the &lt;code&gt;cgi_escape&lt;/code&gt; filter you may have seen. It strips the spaces out of the tag and replaces it with a dash, this is, so the URL’s of the website still work in all circumstances.&lt;/p&gt;
&lt;h2 id=&quot;thanks-for-stopping-in&quot;&gt;Thanks for stopping in!&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://jpshlk.com/_astro/designer.C5IglJJy_Z3jkaP.webp&quot; alt=&quot;Designer - via Undraw&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1211&quot; height=&quot;822&quot;&gt;&lt;/p&gt;
&lt;p&gt;I hope you like this post!&lt;/p&gt;
&lt;p&gt;I will try and get a post out about once a week or so about my process of building this site and eventually turning it into a theme. There is a lot more to cover so stay tuned for more updates!&lt;/p&gt;</content:encoded><category>old</category><category>jekyll</category></item><item><title>Hiking Horn Canyon Trail to The Pines</title><link>https://jpshlk.com/blog/hiking-horn-canyon-trail-to-the-pines/</link><guid isPermaLink="true">https://jpshlk.com/blog/hiking-horn-canyon-trail-to-the-pines/</guid><description>A moderately difficult hike in Ojai, Ca.</description><pubDate>Mon, 16 Jan 2017 00:00:00 GMT</pubDate><content:encoded>&lt;img src=&quot;https://jpshlk.com/_astro/horn-canyon-trail-hike.DaviMIWK_Z1O2Ngd.webp&quot; alt=&quot;Horn Canyon Trail&quot; width=&quot;1400&quot; height=&quot;1050&quot;&gt;&lt;p&gt;There’s nothing quite like a hike up Horn Canyon in Ojai, California. You have to weave through Thatcher School to find the trailhead, but it’s not hard just stay to the right.&lt;/p&gt;
&lt;h2 id=&quot;horn-canyon-trail&quot;&gt;Horn Canyon Trail&lt;/h2&gt;
&lt;p&gt;Accessible behind Thatcher school in Ojai California, Horn Canyon Trail is a really nice moderate hike in the east end of the valley.&lt;/p&gt;
&lt;p&gt;It starts out with a gradual increase in slope and difficulty, but eventually becomes an incredibly difficult hike later on.&lt;/p&gt;
&lt;p&gt;It shouldn’t be tackled by people who aren’t in shape.&lt;/p&gt;
&lt;h3 id=&quot;horn-canyon-trailhead&quot;&gt;Horn Canyon Trailhead&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://imgur.com/TPwWiaW.jpg&quot; alt=&quot;Horn Canyon Trail - trailhead&quot;/&gt;&lt;/p&gt;
&lt;p&gt;The trail is muddy and torn apart in places from the recent rains and people with horses. It’s not too bad though, you can easily walk around the mud with a little care.&lt;/p&gt;
&lt;h3 id=&quot;coming-to-the-first-river-crossing&quot;&gt;Coming to the first river crossing&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://imgur.com/xEpFzmA.jpg&quot; alt=&quot;Horn Canyon Trail - Dry river crossing&quot;/&gt;&lt;/p&gt;
&lt;p&gt;The first river crossing is completely dry. Last time I was here the creek was spilling over those rocks. California seems to be showing it’s true desert colors now. It had been raining a decent amount this winter though.&lt;/p&gt;
&lt;h3 id=&quot;taking-a-little-break-before-the-going-gets-tough&quot;&gt;Taking a little break before the going gets tough&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://imgur.com/lbtHkjO.jpg&quot; alt=&quot;Horn Canyon Trail - taking a little break&quot;/&gt;&lt;/p&gt;
&lt;p&gt;We took a little break at the last river crossing. There are two streams that converge here so usually it’s a nice and cool spot to rest. We saw a few groups of people come down the trail at this point.&lt;/p&gt;
&lt;h3 id=&quot;the-steep-long-haul&quot;&gt;The steep, long haul&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://imgur.com/iwGs2K9.jpg&quot; alt=&quot;Horn Canyon Trail - Steep long trail&quot;/&gt;&lt;/p&gt;
&lt;p&gt;This is the start of the rather steep incline to The Pines campground. After this long uphill tunnel you start the switchbacks, which continue almost all the way up to the camp.&lt;/p&gt;
&lt;h3 id=&quot;further-and-further-up-the-ridge&quot;&gt;Further and further up the ridge&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://imgur.com/bv1ZdWR.jpg&quot; alt=&quot;Horn Canyon Trail - taking a little break&quot;/&gt;&lt;/p&gt;
&lt;p&gt;After the switchbacks the trail winds up the canyon before turning back and heading up a ridge. This doesn’t look as steep as it is, but it’s a good hike for working out your glutes!&lt;/p&gt;
&lt;h3 id=&quot;rewarding-views-from-behind-motivate-us-to-push-on&quot;&gt;Rewarding views from behind motivate us to push on&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://imgur.com/VRGgYkJ.jpg&quot; alt=&quot;Horn Canyon Trail - View from high up&quot;/&gt;&lt;/p&gt;
&lt;p&gt;At this high up we’re able to just start seeing the ocean, a rewarding part of such a steep hike. Ojai will always be beautiful from this vantage.&lt;/p&gt;
&lt;h3 id=&quot;watch-out-for-ticks-in-thick-brush-like-this&quot;&gt;Watch out for ticks in thick brush like this&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://imgur.com/SWmw1aY.jpg&quot; alt=&quot;Horn Canyon Trail - Chamis&quot;/&gt;&lt;/p&gt;
&lt;p&gt;This is the last section of the hike to The Pines. At this point most of the elevation has been tackled by the switchbacks so this isn’t as steep.&lt;/p&gt;
&lt;p&gt;Notice the plant on the left, called chamise, it can help with erosion and does well where other plants wouldn’t. A friend of mine claims that ticks love the stuff, especially after a rain. Suffice it to say I’ll avoid touching it as much as I can in the future.&lt;/p&gt;
&lt;h3 id=&quot;finally-we-made-it-to-the-campground&quot;&gt;Finally, we made it to the campground&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://imgur.com/LaxONmI.jpg&quot; alt=&quot;Horn Canyon Trail - The Pines Campground&quot;/&gt;&lt;/p&gt;
&lt;p&gt;Here is The Pines campground itself. All but a half dozen or so of the pine trees are felled due to the severity of the drought. The spring is dry, which is a bummer because it’s nice to be able to fill up water bottles there.&lt;/p&gt;
&lt;h3 id=&quot;taking-a-break-and-refueling-before-the-hiking-down&quot;&gt;Taking a break and refueling before the hiking down&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://imgur.com/OiU61FR.jpg&quot; alt=&quot;Horn Canyon Trail - The Pines Campground 2&quot;/&gt;&lt;/p&gt;
&lt;p&gt;We kicked back at the little side camp to catch our breath and behold the loss of the trees. With huge rounds all over and tall piles of dead branches, the place looks like a graveyard. Truly a sad sight indeed.&lt;/p&gt;
&lt;h3 id=&quot;thanks-for-following-my-hike&quot;&gt;Thanks for following my hike!&lt;/h3&gt;</content:encoded><category>old</category><category>hiking</category></item><item><title>Hiking to Gridley Springs Camp, above Ojai California</title><link>https://jpshlk.com/blog/gridley-springs-camp/</link><guid isPermaLink="true">https://jpshlk.com/blog/gridley-springs-camp/</guid><description>This is a very nice hiking trail that is very popular among the locals of Ojai California.</description><pubDate>Mon, 09 Jan 2017 00:00:00 GMT</pubDate><content:encoded>&lt;img src=&quot;https://jpshlk.com/_astro/gridley-springs-camp.C2JYP3gq_ZWy1Wd.webp&quot; alt=&quot;Gridley Springs camp water trough.&quot; width=&quot;1400&quot; height=&quot;1050&quot;&gt;&lt;p&gt;This is a very nice hiking trail that is very popular among the locals of Ojai California. With a nice gradual slope up the canyon, you have a chance to warm up before it gets steep.&lt;/p&gt;
&lt;h2 id=&quot;gridley-trail-to-gridley-springs-camp&quot;&gt;Gridley Trail to Gridley Springs Camp&lt;/h2&gt;
&lt;p&gt;Gridley trail meets up with several other trails and eventually will take you up to the ranger tower on Nordhoff Peak.&lt;/p&gt;
&lt;h3 id=&quot;gridley-trail-entrance&quot;&gt;Gridley Trail Entrance&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://imgur.com/ji1Au3F.jpg&quot; alt=&quot;Gridley Trail Entrance&quot;/&gt;&lt;/p&gt;
&lt;p&gt;Gridley Trail starts at the top of Gridley Road and meets up with Nordhoff Ridge Road. It’s a nice gentle incline and never too steep of a hike. It’s really nice and lends itself to the trails popularity among locals in Ojai.&lt;/p&gt;
&lt;h3 id=&quot;iconic-rocky-steps-of-gridley-trail&quot;&gt;Iconic Rocky Steps of Gridley Trail&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://imgur.com/6lR75To.jpg&quot; alt=&quot;Gridley Trail Rocky Steps&quot;/&gt;&lt;/p&gt;
&lt;p&gt;These rock steps are iconic of Gridley Trail. It’s hard to imagine riding down them on a mountain bike but people do it almost everyday. I’ll stick to my good old hiking boots, thank you.&lt;/p&gt;
&lt;h3 id=&quot;picnic-spot-with-a-view&quot;&gt;Picnic spot with a view&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://imgur.com/ICxxmlY.jpg&quot; alt=&quot;Gridley Trail rest stop&quot;/&gt;&lt;/p&gt;
&lt;p&gt;A view of Ojai from just a bit up the trail from the rock steps. Right behind is a nice boulder (not pictured) that’s good for having a little picnic with a view.&lt;/p&gt;
&lt;h3 id=&quot;looking-up-gridley-canyon&quot;&gt;Looking up Gridley Canyon&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://imgur.com/HuisjfV.jpg&quot; alt=&quot;Looking up Gridley Canyon&quot;/&gt;&lt;/p&gt;
&lt;p&gt;A look up the long canyon toward Nordhoff Ridge. The ranger tower is up on that ridge just to the left behind the hillside.&lt;/p&gt;
&lt;h3 id=&quot;then-looking-down-at-beautiful-ojai-california&quot;&gt;Then looking down at beautiful Ojai California&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://imgur.com/dywtHUA.jpg&quot; alt=&quot;Looking down at beautiful Ojai California&quot;/&gt;&lt;/p&gt;
&lt;p&gt;View from a little higher up the trail, Ojai never ceases to amaze me with how beautiful it is from above.&lt;/p&gt;
&lt;h3 id=&quot;yucca-seed-pod&quot;&gt;Yucca seed pod&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://imgur.com/SQcrIbe.jpg&quot; alt=&quot;Yucca seed pod&quot;/&gt;&lt;/p&gt;
&lt;p&gt;We saw several Yucca plants that had gone to seed along the trail. These pods can carry hundreds of seeds, they are really light so they can drift long distances in the wind.&lt;/p&gt;
&lt;h3 id=&quot;taking-a-break-on-a-boulder-halfway-up-a-mountain&quot;&gt;Taking a break on a boulder halfway up a mountain&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://imgur.com/9HzJUDQ.jpg&quot; alt=&quot;Go Ruck Backpack, taking a break on a hike.&quot;/&gt;&lt;/p&gt;
&lt;p&gt;A little break on a boulder next to the trail. It seems every time I hike this trail I stop here.&lt;/p&gt;
&lt;h3 id=&quot;stopped-to-check-out-some-small-mushrooms&quot;&gt;Stopped to check out some small mushrooms&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://imgur.com/uDPHIz3.jpg&quot; alt=&quot;Macro mushrooms&quot;/&gt;&lt;/p&gt;
&lt;p&gt;Mushrooms all over the trail! Everything was still dewy in the shade of the hillsides from the rain the day before.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://imgur.com/LFkyTn4.jpg&quot; alt=&quot;Macro mushrooms, Puffball&quot;/&gt;&lt;/p&gt;
&lt;p&gt;I spotted a decent size puffball mushroom (Calbovista subsculpta). It’s actually edible and tasty if the inside is still white. As it matures the inside will turn dark brown and powdery due to the spores developing.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fromk Wikipedia&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Many mushrooms are poisonous some are deadly poisonous, and the responsibility for eating any mushroom or fungus must rest with the individual. Never eat any wild mushroom if you are not absolutely sure it is edible. Consider also there are people who are allergic to all species of mushrooms. Even when you know a mushroom well weather conditions or animal damage can cause differences in appearance that could lead to misidentification.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;the-ojai-fritillary-flower&quot;&gt;The Ojai fritillary Flower&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://imgur.com/wQp6VNL.jpg&quot; alt=&quot;The Ojai fritillary Flower&quot;/&gt;&lt;/p&gt;
&lt;p&gt;Ojai fritillary (Fritillaria ojaiensis) sprouting up after a day of rain. It is a rare and endangered native plant that only grows in a few regions of California.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;From Calflora:&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Fritillaria ojaiensis, a monocot, is a perennial herb (bulb) that is native to California and is endemic (limited) to California.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;gridley-springs-horse-trough&quot;&gt;Gridley Springs horse trough&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://imgur.com/ouPvcJa.jpg&quot; alt=&quot;Gridley Springs Camp&quot;/&gt;&lt;/p&gt;
&lt;p&gt;After a bit more hiking we arrive at Gridley Springs Camp, a tiny little camp right off the side of the trail.&lt;/p&gt;
&lt;h3 id=&quot;a-sign-of-the-drought-in-california&quot;&gt;A sign of the drought in California&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://imgur.com/6j23je6.jpg&quot; alt=&quot;Gridley Springs Camp, empty water trough&quot;/&gt;&lt;/p&gt;
&lt;p&gt;A sad sight indeed, I remember when this was overflowing with water all year around. This should serve as a reminder of the seriousness of the drought Southern California is in.&lt;/p&gt;
&lt;h3 id=&quot;finally-to-gridley-springs-camp&quot;&gt;Finally to Gridley Springs Camp!&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://imgur.com/LVm3mLq.jpg&quot; alt=&quot;Gridley Springs Camp, empty water trough&quot;/&gt;&lt;/p&gt;
&lt;p&gt;Here is a shot of the camp itself, in all it’s glory. Somebody seems to have taken out the fire pit and removed the steel ring that used to be up here.&lt;/p&gt;
&lt;p&gt;My best guess would be it’s due to the fire restrictions that come with the drought.&lt;/p&gt;
&lt;p&gt;It’s a small camp if it can be called a camp at all, it’s more of a stop-off spot to grab a quick meal before continuing on to the ridge.&lt;/p&gt;
&lt;p&gt;Thanks for following my hike!&lt;/p&gt;
&lt;p&gt;Please feel free to comment if you’d like. Also, be sure to check out HikeLosPadres.com for more information on the hikes that I go on or others if you’re interested in learning more about the wonderful natural world that surrounds you.&lt;/p&gt;</content:encoded><category>old</category><category>hiking</category></item><item><title>Hiking Fox Canyon In Ojai, Ca</title><link>https://jpshlk.com/blog/hiking-fox-canyon-in-ojai-ca/</link><guid isPermaLink="true">https://jpshlk.com/blog/hiking-fox-canyon-in-ojai-ca/</guid><description>A short but challenging hike in Ojai, Ca.</description><pubDate>Thu, 05 Jan 2017 00:00:00 GMT</pubDate><content:encoded>&lt;img src=&quot;https://jpshlk.com/_astro/backpack.CGxfoQRz_Z9Nn8s.webp&quot; alt=&quot;My backpack up at the lookout at the top of the trail.&quot; width=&quot;1280&quot; height=&quot;656&quot;&gt;&lt;p&gt;A great little hike that forks off of Shelf Road (Valley View Trail). Its a little bit under 2 miles and a little steep at times with quite a few switchbacks.&lt;/p&gt;
&lt;h2 id=&quot;fox-canyon-trail-in-ojai-california&quot;&gt;Fox Canyon Trail in Ojai, California&lt;/h2&gt;
&lt;p&gt;Overall it’s a hike that will make you sweat but shouldn’t take all day. You should still pack your hiking hat.&lt;/p&gt;
&lt;h3 id=&quot;looking-down-on-the-town-of-ojai&quot;&gt;Looking down on the town of Ojai&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://imgur.com/NAsStst.jpg&quot; alt=&quot;Fox Canyon View&quot;/&gt;&lt;/p&gt;
&lt;p&gt;You are awarded with views like this as you stop to take a breath. Ojai truly is a beautiful place.&lt;/p&gt;
&lt;p&gt;That little red thing is the roof of a house that sits right off of Shelf Road.&lt;/p&gt;
&lt;h3 id=&quot;fox-canyon-trail-connects-to-pratt-trail&quot;&gt;Fox Canyon Trail connects to Pratt Trail&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://imgur.com/8IAoHpk.jpg&quot; alt=&quot;Fox Canyon Foothill/Pratt Sign&quot;/&gt;&lt;/p&gt;
&lt;p&gt;From here the trail splits in two and connects over to Pratt Trail, which is another way to get here.&lt;/p&gt;
&lt;h3 id=&quot;green-bark-cianothus&quot;&gt;Green bark Cianothus&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://imgur.com/W0lCuPd.jpg&quot; alt=&quot;Fox Canyon Green Bark Cianothus&quot;/&gt;&lt;/p&gt;
&lt;p&gt;The price of the trail being carved into the hillside for all of us to enjoy. A green bark ceanothus tree just happened to be growing in the way of the trail…&lt;/p&gt;
&lt;p&gt;It’s quite beautiful to see the color of it’s wood-flesh.&lt;/p&gt;
&lt;h3 id=&quot;a-look-back-toward-fox-canyon&quot;&gt;A look back toward Fox Canyon&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://imgur.com/Ul6sxPk.jpg&quot; alt=&quot;Fox Canyon Looking Back&quot;/&gt;&lt;/p&gt;
&lt;p&gt;This is about where we met up with Luci’s Trail. This is looking back toward Fox Canyon.&lt;/p&gt;
&lt;h3 id=&quot;fork-in-the-road&quot;&gt;Fork in the road&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://imgur.com/rAg9oBX.jpg&quot; alt=&quot;Luci&apos;s Trail Sign&quot;/&gt;&lt;/p&gt;
&lt;p&gt;A sign for Foothill Trail, right to Luci’s Trail, or go straight on to Fuel Break Road which leads over to Gridley Trail.&lt;/p&gt;
&lt;h3 id=&quot;lucis-rocky-trail&quot;&gt;Luci’s rocky trail&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://imgur.com/7YiaQKF.jpg&quot; alt=&quot;Looking down Luci&apos;s Trail&quot;/&gt;&lt;/p&gt;
&lt;p&gt;Going down Luci’s Trail is a little rough, it can be touch and go if you’re not careful.&lt;/p&gt;
&lt;h3 id=&quot;phacelia-a-plant-that-can-actually-cause-a-poison-oak-like-rash&quot;&gt;Phacelia, a plant that can actually cause a poison-oak like rash&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://imgur.com/6MPL0gb.jpg&quot; alt=&quot;James showing me a plant to avoid called phacelia&quot;/&gt;&lt;/p&gt;
&lt;p&gt;Here is my buddy James showing me a plant to avoid called phacelia.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://imgur.com/XzYpdzB.jpg&quot; alt=&quot;Here is a close-up of phacelia, avoid this shit at all costs...&quot;/&gt;&lt;/p&gt;
&lt;p&gt;Closer picture of phacelia.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;From Wikipedia:&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;As with many species in the Boraginaceae, contact with the hairs of some species of Phacelia can cause a very unpleasant rash similar to that from poison oak and poison ivy in sensitive individuals. The major contact allergen of Phacelia crenulata has been identified as geranylhydroquinone. The similar-appearing species Eriodictyon parryi (poodle-dog bush), a common chaparral plant of Southern California, is also a frequent cause of skin irritation.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;native-grass-sptouting-up&quot;&gt;Native grass sptouting up&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://imgur.com/Lb0JrrV.jpg&quot; alt=&quot;Nice native grass, maybe...&quot;/&gt;&lt;/p&gt;
&lt;p&gt;Here is a plant that you don’t have to avoid, just because.&lt;/p&gt;
&lt;h3 id=&quot;checking-out-our-route&quot;&gt;Checking out our route&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://imgur.com/fQ3Wklu.jpg&quot; alt=&quot;View of Fox Canyon Trail from Luci’s Trail.&quot;/&gt;&lt;/p&gt;
&lt;p&gt;Here is a view of Fox Canyon Trail from Luci’s Trail.&lt;/p&gt;
&lt;h3 id=&quot;steep-little-switchbacks&quot;&gt;Steep little Switchbacks&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://imgur.com/zwvDmy7.jpg&quot; alt=&quot;Luci&apos;s Trail Switchbacks&quot;/&gt;&lt;/p&gt;
&lt;p&gt;Some very steep and tiny switchbacks. What are these? Switchbacks for ants?&lt;/p&gt;
&lt;h3 id=&quot;awesome-old-water-tank&quot;&gt;Awesome old water tank&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://imgur.com/Twshwn5.jpg&quot; alt=&quot;Old Steel Water tank...&quot;/&gt;&lt;/p&gt;
&lt;p&gt;Luci’s Trail winds by an interesting old steel drum of some kind. I assume it used to hold water maybe?&lt;/p&gt;</content:encoded><category>old</category><category>hiking</category></item><item><title>Living in Alaska for a Spell</title><link>https://jpshlk.com/blog/living-in-alaska/</link><guid isPermaLink="true">https://jpshlk.com/blog/living-in-alaska/</guid><description>I lived in Alaska for a little bit in 2016.</description><pubDate>Fri, 14 Oct 2016 00:00:00 GMT</pubDate><content:encoded>&lt;img src=&quot;https://jpshlk.com/_astro/alaska-glacier.6oufaeb7_Z2wC9jx.webp&quot; alt=&quot;Me walking up to a glacier in Alaska&quot; width=&quot;1280&quot; height=&quot;704&quot;&gt;&lt;p&gt;After being back in my home town for a while following my Montana trip, I was still looking for my next move. While I was picking up work here and there, it wasn’t enough to save anything and get ahead.&lt;/p&gt;
&lt;h2 id=&quot;why-alaska&quot;&gt;Why Alaska?&lt;/h2&gt;
&lt;p&gt;I was beginning to think Southern California wasn’t for me anymore.&lt;/p&gt;
&lt;p&gt;That is around the time a friend of mine gave me a call from Alaska. He had left for a job in Healy around when I left for Montana. It turns out that someone was leaving the job early for personal reasons and they needed to fill the position asap.&lt;/p&gt;
&lt;p&gt;It being literally in the middle of Alaska positions are a little difficult to fill.&lt;/p&gt;
&lt;h3 id=&quot;flying-to-to-the-top-of-the-world&quot;&gt;Flying to to the top of the world&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://imgur.com/goMlz8C.jpg&quot; alt=&quot;On the plane to Alaska&quot;/&gt;&lt;/p&gt;
&lt;p&gt;This was by far the longest flight I’d ever been on. We had a layover in Seattle for about an hour. From Seattle the plane took off into the sunset.&lt;/p&gt;
&lt;p&gt;During the flight it never actually got dark, the sun would dip behind the horizon and then pop back up again a few minutes later.&lt;/p&gt;
&lt;h3 id=&quot;denali-state-park&quot;&gt;Denali State Park&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://imgur.com/X6wzw5E.jpg&quot; alt=&quot;Denali State Park&quot;/&gt;&lt;/p&gt;
&lt;p&gt;The job was working for a private company that runs lodges in Denali National Park.&lt;/p&gt;
&lt;h3 id=&quot;sunset-in-healy-alaska&quot;&gt;Sunset in Healy, Alaska&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/63lCn6A.jpg?1&quot; alt=&quot;Sunset in Healy, Alaska&quot;/&gt;&lt;/p&gt;
&lt;p&gt;Healy is beautiful if you look in the right places. Other than that, it’s really just a hole in the wall on the side of the road.&lt;/p&gt;
&lt;p&gt;I could tell right away that this place wasn’t for me.&lt;/p&gt;
&lt;p&gt;Luckily, my Mom has a good friend in Anchorage, she was excited at the prospect of me coming to stay for a few months.&lt;/p&gt;
&lt;p&gt;I packed up my things and headed south.&lt;/p&gt;
&lt;h3 id=&quot;kincaid-park-disc-golf-course-hole-eighteen&quot;&gt;Kincaid park disc golf course, hole eighteen&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://imgur.com/q0deF9D.jpg&quot; alt=&quot;Kincaid Park Disc Golf Course&quot;/&gt;&lt;/p&gt;
&lt;p&gt;One of the first things I did was search out local disc golf courses. There were a few to choose from so I was able to find a really good one at Kincaid Park.&lt;/p&gt;
&lt;p&gt;Other than the crazy insects that swarm you it was a really nice place to play.&lt;/p&gt;
&lt;h3 id=&quot;kincaid-park-meadow&quot;&gt;Kincaid park meadow&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://imgur.com/6ZPfLwo.jpg&quot; alt=&quot;Kincaid Park sunset&quot;/&gt;&lt;/p&gt;
&lt;p&gt;Kincaid park has over fifteen hundred acres of land accessible to the public. There are a lot of hiking/ cross country skiing trails to check out.&lt;/p&gt;
&lt;h3 id=&quot;matanuska-glacier-is-the-largest-that-is-accessible-by-car-in-the-us&quot;&gt;Matanuska Glacier is the largest that is accessible by car in the US&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://imgur.com/9lSkUwu.jpg&quot; alt=&quot;Matanuska Glacier&quot;/&gt;&lt;/p&gt;
&lt;p&gt;We decided it would be a good idea to take a drive up north a bit and check out a glacier. It was quite a drive but worth it in the end.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://imgur.com/n2rmqcD.jpg&quot; alt=&quot;Me, on top of Matanuska Glacier&quot;/&gt;&lt;/p&gt;
&lt;p&gt;Me on top of the glacier, this is as far as I’d go without equipment.&lt;/p&gt;
&lt;h3 id=&quot;having-a-beer-with-the-pack&quot;&gt;Having a beer with the pack&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://imgur.com/Sag8NWM.jpg&quot; alt=&quot;The dog pack&quot;/&gt;&lt;/p&gt;
&lt;p&gt;When I wasn’t working obscene hours at Costco, visiting glaciers or playing disc golf, I could generally be found hanging out with my neighbors on the front lawn drinking beers with the dog pack.&lt;/p&gt;
&lt;p&gt;All in all it was a really nice time. Imbibe responsibly peeps!&lt;/p&gt;
&lt;p&gt;Thanks again Karen! ;P&lt;/p&gt;
&lt;h3 id=&quot;at-the-shooting-range&quot;&gt;At the shooting range&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://imgur.com/fvshw0Z.jpg&quot; alt=&quot;Shooting at the range before I left&quot;/&gt;&lt;/p&gt;
&lt;p&gt;William, my roommates son took me shooting the day before I left. Not a bad way to spend my last hours in Alaska I’d say.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://imgur.com/BKSDuJd.jpg&quot; alt=&quot;Cover photo&quot;/&gt;&lt;/p&gt;
&lt;p&gt;There is something about holding a semi-automatic shotgun that you can’t describe in words.&lt;/p&gt;
&lt;h3 id=&quot;all-packed-up-and-ready&quot;&gt;All packed up and ready&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://imgur.com/iFKDfuy.jpg&quot; alt=&quot;All packed up to leave&quot;/&gt;&lt;/p&gt;
&lt;p&gt;After deciding that Alaska ultimately wasn’t for me I arranged a flight to meet a buddy in Idaho. From there we’d road trip back to Southern California.&lt;/p&gt;
&lt;h3 id=&quot;pit-stop-in-boise-idaho-before-heading-home&quot;&gt;Pit stop in Boise, Idaho before heading home&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://imgur.com/o41gFzx.jpg&quot; alt=&quot;Boise, Idaho  - bridge along the Greenbelt&quot;/&gt;&lt;/p&gt;
&lt;p&gt;The first thing I did when I finished settling into my hotel room on the first night was look for a place throw some discs.&lt;/p&gt;
&lt;p&gt;Along the way to Ann Morrison park the trail snakes along the river.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://imgur.com/WTeVq2z.jpg&quot; alt=&quot;Boise, Idaho  - fall tree along the Greenbelt&quot;/&gt;&lt;/p&gt;
&lt;p&gt;Fall was in full swing in Boise. This was along the ‘Greenbelt’, which cuts through the middle of the city with lush greenery and the winding Boise river.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://imgur.com/Z2Go6i2.jpg&quot; alt=&quot;Ann Morison Park Disc Golf Course&quot;/&gt;&lt;/p&gt;
&lt;p&gt;As luck would have it, there was a disc golf course at the place I decided to go. I actually didn’t search for courses, just opened Google Maps and found the closes green area and went there.&lt;/p&gt;
&lt;p&gt;I think it was meant to be.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://imgur.com/JMHhyfo.jpg&quot; alt=&quot;Boise State University&quot;/&gt;&lt;/p&gt;
&lt;p&gt;One of the last things I did while there was check out the University campus. It’s right off of the Greenbelt so it wasn’t far out of our way.&lt;/p&gt;
&lt;hr/&gt;
&lt;h3 id=&quot;a-note-about-this-post&quot;&gt;A note about this post&lt;/h3&gt;
&lt;p&gt;This wasn’t actually posted on the date listed. I am adjusting the dates to match around when the events happened.&lt;/p&gt;
&lt;h2 id=&quot;thank-you-for-reading&quot;&gt;Thank you for reading!&lt;/h2&gt;</content:encoded><category>old</category></item><item><title>A Hobbit House on a Montana Homestead</title><link>https://jpshlk.com/blog/hobbit-house/</link><guid isPermaLink="true">https://jpshlk.com/blog/hobbit-house/</guid><description>How did I find myself living in a Hobbit-style house on a remote homestead in Montana?</description><pubDate>Fri, 25 Mar 2016 00:00:00 GMT</pubDate><content:encoded>&lt;img src=&quot;https://jpshlk.com/_astro/hobbit-house-in-montana.r2oAVoNh_2gv3rd.webp&quot; alt=&quot;Underground log cabin in montana.&quot; width=&quot;1280&quot; height=&quot;929&quot;&gt;&lt;h3 id=&quot;why-montana&quot;&gt;Why Montana?&lt;/h3&gt;
&lt;p&gt;Permaculture.&lt;/p&gt;
&lt;p&gt;WTF is that?&lt;/p&gt;
&lt;p&gt;I don’t want to spend time and energy going into what it is, I’ll leave that to the thousands of others. For the sake of my answer, it is what led me to the podcast of a man named, Paul Wheaton.&lt;/p&gt;
&lt;p&gt;He runs a website called &lt;a href=&quot;https://permies.com&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; class=&quot;underline-offset-2 hover:underline&quot;&gt;permies&lt;/a&gt;, which is the largest permaculture forum on the web. He is known as the ‘bad boy’ of permaculture, with a lot of people not regarding him kindly.&lt;/p&gt;
&lt;p&gt;Anyway, his podcast is where I started learning about the homesteading side of permaculture. Eventually, Paul bought some land outside of Missoula Montana and invited like-minded permies out to play.&lt;/p&gt;
&lt;p&gt;After following his stuff for a while I arrived there about midway through year three. I had went through a divorce a year earlier and was ready for something new.&lt;/p&gt;
&lt;h3 id=&quot;arriving-at-the-homestead&quot;&gt;Arriving at the homestead&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/aFjObob.jpg&quot; alt=&quot;My Saab by the Wofati&quot;/&gt;&lt;/p&gt;
&lt;p&gt;After a very long and tiring drive, I was finally here! The fabled things from the permies website and Paul’s podcast were in front of my eyes.&lt;/p&gt;
&lt;p&gt;The solar contraption you see on the right in there has been dubbed, “The Voltzwagon”. It is what supplies 100% of the power to the ‘&lt;a href=&quot;https://richsoil.com/wofati.jsp&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; class=&quot;underline-offset-2 hover:underline&quot;&gt;WOFATI&lt;/a&gt;’ that’s under that mound of dirt. It is also movable if needed on other parts of the property.&lt;/p&gt;
&lt;h3 id=&quot;home-sweet-hobbit-home&quot;&gt;Home, sweet Hobbit home&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/MWb8Woi.jpg&quot; alt=&quot;Hobbit Home Entrance&quot;/&gt;&lt;/p&gt;
&lt;p&gt;The interior was pretty dirty from the floor being unfinished and people coming and going all day. I am not unaccustomed to rough living so it didn’t really faze me.&lt;/p&gt;
&lt;p&gt;The wood stove-looking thing is a modified &lt;a href=&quot;https://richsoil.com/rocket-stove-mass-heater.jsp&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; class=&quot;underline-offset-2 hover:underline&quot;&gt;rocket mass heater&lt;/a&gt;. It was modified to fix a flaw that didn’t allow it to achieve an efficient burn.&lt;/p&gt;
&lt;h3 id=&quot;morning-coffee-next-to-the-rocket-mass-heater&quot;&gt;Morning coffee next to the Rocket Mass Heater&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/ZKDWheJ.jpg&quot; alt=&quot;Coffee the next morning&quot;/&gt;&lt;/p&gt;
&lt;p&gt;Nothing like coffee next to a rocket mass heater to kick off the morning.&lt;/p&gt;
&lt;h3 id=&quot;checking-our-the-area-the-next-morning&quot;&gt;Checking our the area the next morning&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/Hv9j7zc.jpg&quot; alt=&quot;Checking out the area&quot;/&gt;&lt;/p&gt;
&lt;p&gt;Exploring the area a bit more after having coffee. This is on the trail to the neighbors lease. (Still on Paul’s 200 acres.)&lt;/p&gt;
&lt;h3 id=&quot;okay-its-not-quite-a-hobbit-house-but-its-close&quot;&gt;Okay it’s not quite a Hobbit house, but it’s close&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/7T0Skxn.jpg&quot; alt=&quot;Not quite a Hobbit house&quot;/&gt;&lt;/p&gt;
&lt;p&gt;Alright, you wont find Merry and Pippin smoking their pipe-weed anywhere around here, but the design is close enough for me to call it a Hobbit-house.&lt;/p&gt;
&lt;h3 id=&quot;a-natural-wood-fence-that-i-helped-repair-the-first-week&quot;&gt;A natural wood fence that I helped repair the first week.&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/evuz9Wj.jpg&quot; alt=&quot;Natual wood fence&quot;/&gt;&lt;/p&gt;
&lt;p&gt;Paul was offering some paid work for repairing a fence made out of Fir saplings. A portion of the fence had blown down the week before I arrived.&lt;/p&gt;
&lt;p&gt;It blew over because there is no fence posts. The ground is too rocky to dig holes. They are using something called a rock-jack to hold the fence up. One of them had fallen apart, causing the fence to topple.&lt;/p&gt;
&lt;p&gt;A few of the other guests and I made short work of the repair.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/RxAWnBq.jpg&quot; alt=&quot;Natual wood fence inside&quot;/&gt;&lt;/p&gt;
&lt;p&gt;A view from the other side.&lt;/p&gt;
&lt;h3 id=&quot;rocket-mass-heaters&quot;&gt;Rocket Mass Heaters&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/rUuDsHT.jpg&quot; alt=&quot;Rocket Mass Heater&quot;/&gt;&lt;/p&gt;
&lt;p&gt;Taking a peek at the rocket mass heater in the other WOFATI.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/H9jI2uF.jpg&quot; alt=&quot;Rocket Mass Heater in a Tipi&quot;/&gt;&lt;/p&gt;
&lt;p&gt;There is also a tipi on the property that houses a ‘U’ shaped rocket mass heater. In the winter, at negative 10 degrees people were sleeping with no blankets in there, crazy right?&lt;/p&gt;
&lt;h3 id=&quot;ducks-from-one-of-the-residents-properties&quot;&gt;Ducks from one of the residents properties&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/Ik8moxD.jpg&quot; alt=&quot;Ducks&quot;/&gt;&lt;/p&gt;
&lt;p&gt;A resident there has some ducks that wander around during the day. He’s named them all, including the group as ‘Ministry of Quacks’&lt;/p&gt;
&lt;h3 id=&quot;exploring-the-property-a-bit&quot;&gt;Exploring the property a bit&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/2N3ZzEp.jpg&quot; alt=&quot;Snowy forest trail&quot;/&gt;&lt;/p&gt;
&lt;p&gt;The snow lightly powdering the trees make it look so magical.&lt;/p&gt;
&lt;h3 id=&quot;rex-the-excavator&quot;&gt;Rex, the excavator&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/DNxQrt5.jpg&quot; alt=&quot;Excavator bucket&quot;/&gt;&lt;/p&gt;
&lt;p&gt;This is Rex, he’s been helping everyone build their berms and roads, his teeth have seen better days.&lt;/p&gt;
&lt;h3 id=&quot;practicing-some-macro-photography&quot;&gt;Practicing some macro photography&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/1W6VfFC.jpg&quot; alt=&quot;Water Drop&quot;/&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/UwktZc4.jpg&quot; alt=&quot;Another water drop&quot;/&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/mdw18el.jpg&quot; alt=&quot;Macro Shroomy&quot;/&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/xN4FC3l.jpg&quot; alt=&quot;Macro plants&quot;/&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/7aKGrVF.jpg&quot; alt=&quot;Snow Fleas&quot;/&gt;&lt;/p&gt;
&lt;h3 id=&quot;love-shack-baby-love-shack&quot;&gt;Love Shack, Baby Love Shack…&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/fTYZI7m.jpg&quot; alt=&quot;Love Shack&quot;/&gt;&lt;/p&gt;
&lt;p&gt;I stayed in this thing for the last week I was there. I had to go back to California to sort our some tax stuff from that year and tie up some more loose ends before moving on with my life.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/OWEtI6E.jpg&quot; alt=&quot;Love Shack - Inside&quot;/&gt;&lt;/p&gt;
&lt;p&gt;I am used to rugged sleeping so it wasn’t so bad, luckily after the first night I was able to drag a mattress out of Paul’s house to use.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/MC1EOHi.jpg&quot; alt=&quot;Coffee in the Love Shack&quot;/&gt;&lt;/p&gt;
&lt;p&gt;This is how I made coffee for the last few days, even when roughing it alone in a tiny cabin I must have good coffee.&lt;/p&gt;
&lt;p&gt;Coffee makes everything better.&lt;/p&gt;
&lt;hr/&gt;
&lt;h3 id=&quot;a-note-about-this-post&quot;&gt;A note about this post&lt;/h3&gt;
&lt;p&gt;This wasn’t actually posted on the date listed. I am adjusting the dates to match around when the events happened.&lt;/p&gt;
&lt;h2 id=&quot;thank-you-for-reading&quot;&gt;Thank you for reading!&lt;/h2&gt;</content:encoded><category>old</category></item><item><title>Learning how to install laminate flooring</title><link>https://jpshlk.com/blog/learning-how-to-install-laminate-flooring/</link><guid isPermaLink="true">https://jpshlk.com/blog/learning-how-to-install-laminate-flooring/</guid><description>A buddy of mine and I started a little side hussle.</description><pubDate>Wed, 25 Nov 2015 00:00:00 GMT</pubDate><content:encoded>&lt;img src=&quot;https://jpshlk.com/_astro/hardwood-floor-header.BXDIJaY-_1OFclP.webp&quot; alt=&quot;Finished room staged after installing laminate flooring&quot; width=&quot;1280&quot; height=&quot;960&quot;&gt;&lt;p&gt;After bringing a friend of mine, Russell on at OHI Home, we began to take on extra side work from Lila. At first it was small stuff like fixing this or that, but eventually she started getting flooring work.&lt;/p&gt;
&lt;h2 id=&quot;learning-laminate-floor-installation-from-my-buddy-russell&quot;&gt;Learning laminate floor installation from my buddy Russell&lt;/h2&gt;
&lt;p&gt;This was great as it provided Russell and I with some extra income and I was able to learn a new trade.&lt;/p&gt;
&lt;h3 id=&quot;first-step-move-the-materials&quot;&gt;First step, move the materials&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://imgur.com/zKdbIig.jpg&quot; alt=&quot;Hardwood Flooring Materials&quot;/&gt;&lt;/p&gt;
&lt;p&gt;We had the pleasure of moving all of this before we could get started. It wasn’t too bad, but if we had handled the materials ourselves they would have been delivered to the spot that we’d pull from when working. ;P&lt;/p&gt;
&lt;h3 id=&quot;second-step-actually-start-working&quot;&gt;Second step, actually start working&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://imgur.com/fya8PlD.jpg&quot; alt=&quot;Laying down the underlayment&quot;/&gt;&lt;/p&gt;
&lt;p&gt;Laying down the underlayment is very easy due to the brilliant design from ‘Luxury Laminate’. Instead of needing tape, it sticks together nicely with a peel-off adhesive strip.&lt;/p&gt;
&lt;p&gt;It’s not the easiest thing to do in the world, but it’s pretty basic.&lt;/p&gt;
&lt;h3 id=&quot;cutting-the-boards-just-right-to-start&quot;&gt;Cutting the boards just right to start&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://imgur.com/NzRCKq4.jpg&quot; alt=&quot;Cutting the boards just right&quot;/&gt;&lt;/p&gt;
&lt;p&gt;When you start a new section, you always cut at least three boards at once, making sure they are offset in a way similar to the picture.&lt;/p&gt;
&lt;p&gt;This is done to lend a more natural look to the overall appearance of the install.&lt;/p&gt;
&lt;p&gt;If everything was square and lined up perfectly, it would actually look really weird.&lt;/p&gt;
&lt;h3 id=&quot;laying-the-first-boards-down-is-critical-to-the-whole-project&quot;&gt;Laying the first boards down is critical to the whole project&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://imgur.com/BHPcA4W.jpg&quot; alt=&quot;Laying the first boards down&quot;/&gt;&lt;/p&gt;
&lt;p&gt;This is arguably one of the harder parts of the job. Deciding where and how to start will determine how you will tackle problems at different times throughout the job.&lt;/p&gt;
&lt;p&gt;Starting in one section in a certain way will affect how other parts of the house will be handled. Unless you’re doing a very small job, you really have to be thinking ahead the whole time.&lt;/p&gt;
&lt;h3 id=&quot;measuring-out-a-tricky-cut&quot;&gt;Measuring out a tricky cut&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://imgur.com/kHyz39k.jpg&quot; alt=&quot;Measuring out a tricky cut&quot;/&gt;&lt;/p&gt;
&lt;p&gt;Here Russell was showing me how to measure a tricky cut that went into the closet and under the door slightly.&lt;/p&gt;
&lt;h3 id=&quot;closing-out-the-closet&quot;&gt;‘Closing out’ the closet&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://imgur.com/6EDhlaZ.jpg&quot; alt=&quot;Hardwood floor closet closeout&quot;/&gt;&lt;/p&gt;
&lt;p&gt;As weird as that sounds, it is a term for finishing an area. And as it happens this was the first time I learned how to do it. In a closet…&lt;/p&gt;
&lt;h3 id=&quot;the-living-room-is-almost-finished-we-only-need-to-close-out-the-last-board&quot;&gt;The living room is almost finished, we only need to close out the last board&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://imgur.com/uU48R4t.jpg&quot; alt=&quot;Living room almost finished&quot;/&gt;&lt;/p&gt;
&lt;p&gt;Even though it’s dirty as all hell, it is starting to come together. Large rooms like this actually go quickly with two people.&lt;/p&gt;
&lt;p&gt;The ‘boards’ are more like legos that snap together and do most of the work. You gotta love laminate.&lt;/p&gt;
&lt;h3 id=&quot;making-some-tight-cuts-to-make-it-around-the-corner&quot;&gt;Making some tight cuts to make it around the corner&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://imgur.com/jeAW8L9.jpg&quot; alt=&quot;Hardwood Floors - Jigsaw cut&quot;/&gt;&lt;/p&gt;
&lt;p&gt;After closing out the living room we had some tight cuts to turn the corner into the kitchen-nook.&lt;/p&gt;
&lt;h3 id=&quot;our-first-real-problem&quot;&gt;Our first real problem&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://imgur.com/gwQGSkL.jpg&quot; alt=&quot;Hardwood Floors - Very tricky problem&quot;/&gt;&lt;/p&gt;
&lt;p&gt;After moving our way into hallway and bedroom we ran into our first real problem. You can’t see it in the picture, but the floor slopes up slightly into the kitchen area.&lt;/p&gt;
&lt;p&gt;We were unable to get the board under both areas that it had to and snap it back into place within the other board.&lt;/p&gt;
&lt;p&gt;Every time we’d get close the board would break, after a few of those we had to take a different approach.&lt;/p&gt;
&lt;h3 id=&quot;tackling-the-problem-from-a-different-angle&quot;&gt;Tackling the problem from a different angle&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://imgur.com/fJqoaep.jpg&quot; alt=&quot;Hardwood Floors - Very tricky problem, differnt angle&quot;/&gt;&lt;/p&gt;
&lt;p&gt;We ended up having to go backwards a few boards and work from the other direction. It wasn’t easy but we were able to achieve it without breaking any boards.&lt;/p&gt;
&lt;h3 id=&quot;this-was-the-hardest-part-of-the-job&quot;&gt;This was the hardest part of the job&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://imgur.com/LEkDAHn.jpg&quot; alt=&quot;Hardwood floors - very tight fit&quot;/&gt;&lt;/p&gt;
&lt;p&gt;Here we had to snap the boards together in a way that they don’t really want to go. It wasn’t ideal, but it was the best solution we had at the time.&lt;/p&gt;
&lt;p&gt;In the end we got it done and the hallway looked great.&lt;/p&gt;
&lt;h3 id=&quot;insurance-inspector-checking-our-work&quot;&gt;Insurance inspector checking our work&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://imgur.com/48Kofvu.jpg&quot; alt=&quot;Hardwood floors - insurance inspector&quot;/&gt;&lt;/p&gt;
&lt;p&gt;Since this was a repair job from a flood, it was covered by an insurance company. That means we had to go through an inspector.&lt;/p&gt;
&lt;p&gt;He was actually pretty cool after all was said and done. He even offered us more work, we which had to decline due to schedule conflicts.&lt;/p&gt;
&lt;p&gt;Thanks Mark!&lt;/p&gt;
&lt;h3 id=&quot;after-we-were-done-with-the-floors-we-helped-stage-it-as-well&quot;&gt;After we were done with the floors, we helped stage it as well&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://imgur.com/q4VmBPV.jpg&quot; alt=&quot;Hardwood floors - Kitchen Nook&quot;/&gt;&lt;/p&gt;
&lt;p&gt;You don’t even notice the slope when you walk over it.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://imgur.com/oU5dfvb.jpg&quot; alt=&quot;Hardwood floors - Bathroom&quot;/&gt;&lt;/p&gt;
&lt;p&gt;The toilet was a fun thing to learn how to remove and replace. ;P&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://imgur.com/JJE1V6J.jpg&quot; alt=&quot;Hardwood floors - Bedroom&quot;/&gt;&lt;/p&gt;
&lt;p&gt;It all really comes together nicely seeing it from start to finish like this.&lt;/p&gt;
&lt;p&gt;I learned a lot of things on the various other floor and handyman jobs we scored. While there is still a whole hell of a lot I can still learn, I am confidant I could install laminate flooring on my own now.&lt;/p&gt;
&lt;hr/&gt;
&lt;h3 id=&quot;a-note-about-this-post&quot;&gt;A note about this post&lt;/h3&gt;
&lt;p&gt;This wasn’t actually posted on the date listed. I am adjusting the dates to match around when the events happened.&lt;/p&gt;
&lt;h2 id=&quot;thank-you-for-reading&quot;&gt;Thank you for reading!&lt;/h2&gt;</content:encoded><category>old</category></item><item><title>Working for a Staging Company</title><link>https://jpshlk.com/blog/working-for-a-home-staging-company/</link><guid isPermaLink="true">https://jpshlk.com/blog/working-for-a-home-staging-company/</guid><description>I worked for a home staging company for a little while.</description><pubDate>Fri, 10 Jul 2015 00:00:00 GMT</pubDate><content:encoded>&lt;img src=&quot;https://jpshlk.com/_astro/ojai-home-staging.BlgwBQr3_ZLFoWH.webp&quot; alt=&quot;A finished room in a house after being staged.&quot; width=&quot;960&quot; height=&quot;640&quot;&gt;&lt;p&gt;Before I met Lila and Dines, the owners of Ojai Home, I had no idea what home staging was. I didn’t know what I was missing out on.&lt;/p&gt;
&lt;h2 id=&quot;working-for-a-staging-company-was-one-of-the-coolest-experiences-of-my-life&quot;&gt;Working for a staging company was one of the coolest experiences of my life&lt;/h2&gt;
&lt;p&gt;Working for them, I learned a lot about the intangible concepts of design. Especially how a design should make someone happy.&lt;/p&gt;
&lt;h3 id=&quot;huge-den-with-fireplace-in-the-east-end-of-ojai-california&quot;&gt;Huge den with fireplace in the east end of Ojai California&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://imgur.com/Jq8fdIx.jpg&quot; alt=&quot;Huge Den with fireplace in the East End of Ojai California&quot;/&gt;&lt;/p&gt;
&lt;p&gt;This was in the East End of Ojai California. When we got there, it looked nowhere near this.&lt;/p&gt;
&lt;h3 id=&quot;some-like-a-modern-living-room&quot;&gt;Some like a modern living room&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://imgur.com/LUevpZI.jpg&quot; alt=&quot;Modern Living Room from OHI Home&quot;/&gt;&lt;/p&gt;
&lt;p&gt;A lot of times clients would want something more modern that suited the buying trends at the time.&lt;/p&gt;
&lt;h3 id=&quot;others-a-rustic-living-room&quot;&gt;Others, a rustic living room&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://imgur.com/j2MwP9K.jpg&quot; alt=&quot;Rustic Living Room from OHI Home&quot;/&gt;&lt;/p&gt;
&lt;p&gt;Other times, a bit more of a traditional design approach is needed to entice buyers in certain situations.&lt;/p&gt;
&lt;h3 id=&quot;all-glass-living-room&quot;&gt;All glass living room&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://imgur.com/2vQofJv.jpg&quot; alt=&quot;Rustic Living Room from OHI Home&quot;/&gt;&lt;/p&gt;
&lt;p&gt;This was a particularly nice living room that really stood out to me. Sometimes a space demands to be almost left alone with a very minimal touch.&lt;/p&gt;
&lt;h3 id=&quot;its-the-little-things&quot;&gt;It’s the little things&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://imgur.com/bdiKUXC.jpg&quot; alt=&quot;Rustic Living Room from OHI Home&quot;/&gt;&lt;/p&gt;
&lt;p&gt;A lot of the choices a stager makes are small, but add up to something more than the sum of all the parts. This is where the art of the design is.&lt;/p&gt;
&lt;h3 id=&quot;every-staging-company-has-a-massive-amount-of-pillows&quot;&gt;Every staging company has a massive amount of pillows&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://imgur.com/KTd3RMo.jpg&quot; alt=&quot;Clever Pillow Storage&quot;/&gt;&lt;/p&gt;
&lt;p&gt;After a good buddy of mine started working with us, we rigged up this pillow storage solution in one of our warehouse spaces.&lt;/p&gt;
&lt;h3 id=&quot;my-little-truck-loaded-down&quot;&gt;My little truck, loaded down&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://imgur.com/G43JyXK.jpg&quot; alt=&quot;My little truck Loaded down&quot;/&gt;&lt;/p&gt;
&lt;p&gt;Here is my little Mazda B-3000 loaded down as much as she’d go. Often we’d have both trucks operating on the same job to get everything done quicker.&lt;/p&gt;
&lt;h3 id=&quot;lilas-truck-loaded-with-as-much-as-physically-possible&quot;&gt;Lila’s truck loaded with as much as physically possible&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://imgur.com/KuWChiX.jpg&quot; alt=&quot;Lila&apos;s Truck Loaded down with as much as Physically Possible&quot;/&gt;&lt;/p&gt;
&lt;p&gt;All in all I really miss working for OHI Home. The sense of family was very strong from day one, with Lila inviting me over for dinner weekly. Dines, her husband who I actually got the job through, is still one of my favorite people of all time.&lt;/p&gt;
&lt;p&gt;Working with him at lynda.com was a really fun experience and I’ll cherish the memories we made there. That my friends is a story for another day, and another time.&lt;/p&gt;
&lt;p&gt;😜&lt;/p&gt;
&lt;hr/&gt;
&lt;h3 id=&quot;a-note-about-this-post&quot;&gt;A note about this post&lt;/h3&gt;
&lt;p&gt;This wasn’t actually posted on the date listed. I am adjusting the dates to match around when the events happened.&lt;/p&gt;
&lt;h2 id=&quot;thank-you-for-reading&quot;&gt;Thank you for reading!&lt;/h2&gt;</content:encoded><category>old</category></item><item><title>Working for a Small Beverage Company</title><link>https://jpshlk.com/blog/working-for-a-small-lemonade-company/</link><guid isPermaLink="true">https://jpshlk.com/blog/working-for-a-small-lemonade-company/</guid><description>I started working for Lori&apos;s Original Lemonade around September of 2013.</description><pubDate>Thu, 25 Jun 2015 00:00:00 GMT</pubDate><content:encoded>&lt;img src=&quot;https://jpshlk.com/_astro/loris-lemonade-booth.DSdu5rwZ_Z1EC819.webp&quot; alt=&quot;Lori&apos;s Lemonade Booth&quot; width=&quot;1280&quot; height=&quot;960&quot;&gt;&lt;p&gt;I started working for Lori’s Original Lemonade around September of 2013.&lt;/p&gt;
&lt;h2 id=&quot;loris-original-lemonade-lol-was-a-really-amazing-place-to-work&quot;&gt;Lori’s Original Lemonade ‘LOL’ was a really amazing place to work&lt;/h2&gt;
&lt;p&gt;From my &lt;a href=&quot;https://jpshlk.com/aboutme/&quot;&gt;about page&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Working in produce is when I met Lori, of Lori’s Original Lemonade&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;When I first saw her come in and sample the Lavender Lemonade, I was thunderstruck. Great ingredients, it tasted terrific, she was energetic and exciting to talk and listen to, but most of all it was the unseen qualities on display that attracted me to the brand. Even though the first bottles are nothing like the ones currently sold, I saw the name had an incredible potential.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;It was something to behold to watch her with the customers and how they reacted, how I responded to the quality and intensity of the product. I could be more like that I told myself, so I set out to test the waters about helping her out.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;I guessed that I wasn’t the only one interested so I decided to try and set myself apart in a positive way. It grew from a few conversations about social media tactics and business logistics to a potential job offer and blossomed into a weekly half-day delivery gig.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;the-loris-original-lemonade-van-lol-van&quot;&gt;The Lori’s Original Lemonade van ‘LOL Van’&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://imgur.com/8MV1L64.jpg&quot; alt=&quot;The Lori&apos;s Original Lemonade Van &apos;LOL Van&apos;&quot;/&gt;&lt;/p&gt;
&lt;p&gt;This is the original van that Lori bought from a local tennis academy. She was able to get it for a great deal and it served her very well until upgrading.&lt;/p&gt;
&lt;p&gt;I personally drove that thing up and down the central coast of California and down into Los Angeles while helping her grow her company.&lt;/p&gt;
&lt;h3 id=&quot;eventually-the-van-began-to-be-a-bottleneck&quot;&gt;Eventually the van began to be a ‘bottleneck’&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;No pun intended&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://imgur.com/JC5yu1k.jpg&quot; alt=&quot;Lori&apos;s Original Lemonade Van packed full!&quot;/&gt;&lt;/p&gt;
&lt;p&gt;Eventually the van was unable to keep up with how much lemonade the company started to sell.&lt;/p&gt;
&lt;p&gt;We did our best with what we had for as long as we could, but Lori had to start looking for better options.&lt;/p&gt;
&lt;h3 id=&quot;renting-trucks-to-deliver-pallets-of-lemonade&quot;&gt;Renting trucks to deliver pallets of lemonade&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://imgur.com/p463FMY.jpg&quot; alt=&quot;Renting a truck for pallets of lemonade&quot;/&gt;&lt;/p&gt;
&lt;p&gt;We even tried renting trucks to deliver pallets. This was actually the largest truck that one could drive without the need for an additional license.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://imgur.com/MymIUuP.jpg&quot; alt=&quot;Unloading pallets of lemonade&quot;/&gt;&lt;/p&gt;
&lt;p&gt;Here I am unloading a pallet for a new store in the Thousand Oaks area.&lt;/p&gt;
&lt;h3 id=&quot;i-created-and-maintained-beautiful-displays-at-several-key-stores-along-the-central-coast-of-california&quot;&gt;I created and maintained beautiful displays at several key stores along the central coast of California&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://imgur.com/DSt95So.jpg&quot; alt=&quot;Beautiful Lori&apos;s Original Lemonade Display&quot;/&gt;&lt;/p&gt;
&lt;p&gt;A large entrance display at a Vons location.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://imgur.com/K8jYK3W.jpg&quot; alt=&quot;Another Beautiful Lori&apos;s Original Lemonade Display&quot;/&gt;&lt;/p&gt;
&lt;p&gt;A quaint little table top display in the produce department at another Vons location.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://imgur.com/QI5nLiA.jpg&quot; alt=&quot;Another Smaller Beautiful Lori&apos;s Original Lemonade Display&quot;/&gt;&lt;/p&gt;
&lt;p&gt;Small entrance display at a private market in Camarillo California.&lt;/p&gt;
&lt;h3 id=&quot;i-helped-move-offices&quot;&gt;I helped move offices&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://imgur.com/gYiZhsf.jpg&quot; alt=&quot;Lori&apos;s Original Lemonade Office Space&quot;/&gt;&lt;/p&gt;
&lt;p&gt;During my last days at the company, I helped move into a new office space.&lt;/p&gt;
&lt;p&gt;Since I was also working for a home staging company at the time, I had a little input on the design.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://imgur.com/jDPYxTE.jpg&quot; alt=&quot;Lori&apos;s Original Lemonade Office Space - back&quot;/&gt;&lt;/p&gt;
&lt;p&gt;I also helped layout the shelves in a way that made sense for the workflow and storage needs of the company.&lt;/p&gt;
&lt;hr/&gt;
&lt;h3 id=&quot;a-note-about-this-post&quot;&gt;A note about this post&lt;/h3&gt;
&lt;p&gt;This wasn’t actually posted on the date listed. I am adjusting the dates to match around when the events happened.&lt;/p&gt;
&lt;h2 id=&quot;thank-you-for-reading&quot;&gt;Thank you for reading!&lt;/h2&gt;</content:encoded><category>old</category></item><item><title>Attending a Tech Conferene In Las Vegas</title><link>https://jpshlk.com/blog/attending-a-tech-conference-in-beautiful-las-vegas/</link><guid isPermaLink="true">https://jpshlk.com/blog/attending-a-tech-conference-in-beautiful-las-vegas/</guid><description>Back in 2015 I went to Collision in Las Vegas.</description><pubDate>Thu, 07 May 2015 00:00:00 GMT</pubDate><content:encoded>&lt;img src=&quot;https://jpshlk.com/_astro/collision-conference.DpsZWfYc_20P9yy.webp&quot; alt=&quot;Las Vegas Ticket&quot; width=&quot;1400&quot; height=&quot;562&quot;&gt;&lt;p&gt;At the airport, I remember being anxious to get the flight over with. This was actually my first time flying, ever.&lt;/p&gt;
&lt;h2 id=&quot;i-had-the-opportunity-to-attend-a-tech-conference&quot;&gt;I had the opportunity to attend a tech conference&lt;/h2&gt;
&lt;p&gt;It wasn’t so bad, but I was nervous at first I will admit.&lt;/p&gt;
&lt;h3 id=&quot;aaron-who-runs-pocketfullofappscom-and-i-heading-out-for-the-night&quot;&gt;Aaron who runs Pocketfullofapps.com, and I heading out for the night&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://imgur.com/1wmaieX.jpg&quot; alt=&quot;Aaron and I&quot;/&gt;&lt;/p&gt;
&lt;p&gt;After settling in to our hotel rooms, we set out to check out the town.&lt;/p&gt;
&lt;p&gt;It wasn’t a long walk from our hotel to the strip. We didn’t stay in a fancy place, but it wasn’t far.&lt;/p&gt;
&lt;h3 id=&quot;victory-meal&quot;&gt;Victory meal&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://imgur.com/i4LcrZI.jpg&quot; alt=&quot;Victory Burger&quot;/&gt;&lt;/p&gt;
&lt;p&gt;We eventually had to stop for something to eat, and this burger place smelled amazing so we went for it.&lt;/p&gt;
&lt;h3 id=&quot;las-vegas-street-artist&quot;&gt;Las Vegas street artist&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://imgur.com/Dq8GB3o.jpg&quot; alt=&quot;Las Vegas Street Artist&quot;/&gt;&lt;/p&gt;
&lt;p&gt;I ended up buying one that looks a lot like the one on the right. They are amazing to watch and not very expensive.&lt;/p&gt;
&lt;h3 id=&quot;at-the-conference&quot;&gt;At the Conference&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://imgur.com/GXExCHo.jpg&quot; alt=&quot;At the Collision Conference&quot;/&gt;&lt;/p&gt;
&lt;p&gt;When we finally arrived at the conference it wasn’t very packed yet as we were actually pretty early.&lt;/p&gt;
&lt;h3 id=&quot;collision-conference-booths&quot;&gt;Collision Conference booths&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://imgur.com/P3IKdFo.jpg&quot; alt=&quot;Collision Conference booths&quot;/&gt;&lt;/p&gt;
&lt;p&gt;There were so many booths that it was impossible to visit every one in the two days of the conference. Especially because each day had different vendors.&lt;/p&gt;
&lt;h3 id=&quot;night-on-the-town&quot;&gt;Night on the town&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://imgur.com/Bieg1oI.jpg&quot; alt=&quot;Night on the town&quot;/&gt;&lt;/p&gt;
&lt;p&gt;After the first day of the conference, we went out on the town again. This time, we wanted to explore a bit more.&lt;/p&gt;
&lt;h3 id=&quot;after-thoughts&quot;&gt;After thoughts&lt;/h3&gt;
&lt;p&gt;The second day of the conference was actually pretty boring, we ended up leaving early for an after party which was very fun. I didn’t really know anyone there but I felt in good company and entirely safe.&lt;/p&gt;
&lt;p&gt;Even though everyone around me were pretty much strangers.&lt;/p&gt;
&lt;hr/&gt;
&lt;h3 id=&quot;a-note-about-this-post&quot;&gt;A note about this post&lt;/h3&gt;
&lt;p&gt;This wasn’t actually posted on the date listed. I am adjusting the dates to match around when the events happened.&lt;/p&gt;
&lt;h2 id=&quot;thank-you-for-reading&quot;&gt;Thank you for reading!&lt;/h2&gt;</content:encoded><category>old</category></item></channel></rss>