<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Aulvem Blog</title><description>Build logs, technical notes and reviews from the work of building things at Aulvem.</description><link>https://aulvem.com/</link><language>en</language><lastBuildDate>Sat, 27 Jun 2026 04:18:32 GMT</lastBuildDate><atom:link href="https://aulvem.com/rss.xml" rel="self" type="application/rss+xml"/><item><title>How Rakuten&apos;s API hides the JAN, and the 3-tier cross-marketplace match</title><link>https://aulvem.com/blog/2026-06-27-rakuten-jan-cross-matching/</link><guid isPermaLink="true">https://aulvem.com/blog/2026-06-27-rakuten-jan-cross-matching/</guid><description>Rakuten&apos;s item search API never returns the JAN barcode, while Yahoo! Shopping looks it up directly via jan_code. Building a cross-marketplace price watcher on that asymmetry, I split product identity into three certainty tiers — JAN match, name fuzzy match, no match — with the scoring weights, thresholds, and the notification rule that keeps mis-merged items from firing alerts.</description><pubDate>Sat, 27 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Trying to compare the same product across Rakuten’s and Yahoo!‘s APIs, the first wall wasn’t price — it was identity. Before you can compute which is cheaper, a machine has to decide that &lt;em&gt;this&lt;/em&gt; listing on one marketplace and &lt;em&gt;that&lt;/em&gt; listing on the other are the same product. Without that, there’s no comparison table to build.&lt;/p&gt;
&lt;p&gt;Where it got stuck was the JAN — the 13- or 8-digit barcode number on a product. Yahoo! Shopping looks one up directly with &lt;code&gt;jan_code&lt;/code&gt;. Rakuten’s item search API never returns it. So the obvious plan — pull both marketplaces by the same JAN and tie them together in one shot — breaks on one side.&lt;/p&gt;
&lt;p&gt;I built and shipped a price watcher on my own: &lt;a href=&quot;https://aulvem.com/products/yasugoro/&quot;&gt;yasugoro&lt;/a&gt;, which compares point-inclusive prices across marketplaces and pings you when a watched staple gets cheaper. To make the cross-marketplace part hold together, I split matching into three certainty tiers, assuming up front that JANs won’t always line up. Here’s that design.&lt;/p&gt;
&lt;h2 id=&quot;rakuten-and-yahoo-are-asymmetric-about-the-jan&quot;&gt;Rakuten and Yahoo! are asymmetric about the JAN&lt;/h2&gt;
&lt;p&gt;The two marketplaces simply differ in how easily you can get a JAN, and designing as if they were symmetric guarantees the Rakuten side falls apart.&lt;/p&gt;
&lt;p&gt;Yahoo! Shopping’s item search takes a dedicated &lt;code&gt;jan_code&lt;/code&gt; parameter, so you can query by JAN directly, and the response sometimes carries &lt;code&gt;janCode&lt;/code&gt; back. If you know the JAN, you can resolve the listing.&lt;/p&gt;
&lt;p&gt;Rakuten’s item search has no JAN parameter. You end up putting the JAN string into &lt;code&gt;keyword&lt;/code&gt; — an indirect match. Worse, the JAN isn’t a structured field; it tends to be buried inside the item description (&lt;code&gt;itemCaption&lt;/code&gt;). I saw exactly this on model-numbered goods like Anker. So on the Rakuten side you always need a follow-up step: did the keyword=JAN hit actually correspond to that JAN’s product?&lt;/p&gt;
&lt;p&gt;That asymmetry is the starting point. Yahoo! you can trust into a confirmed JAN match; Rakuten you can’t use without proof.&lt;/p&gt;
&lt;h2 id=&quot;collapse-it-into-three-certainty-tiers&quot;&gt;Collapse it into three certainty tiers&lt;/h2&gt;
&lt;p&gt;I split product identity into three tiers, ordered by how certain the match is. Instead of forcing every item through a JAN match, only the ones I can tie down with confidence sit at the top.&lt;/p&gt;





























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Tier&lt;/th&gt;&lt;th&gt;Method&lt;/th&gt;&lt;th&gt;Used for comparison&lt;/th&gt;&lt;th&gt;Sends alerts&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;① JAN match&lt;/td&gt;&lt;td&gt;Yahoo! direct lookup + Rakuten keyword=JAN scored for confidence&lt;/td&gt;&lt;td&gt;Yes (confirmed only)&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;② Name fuzzy match&lt;/td&gt;&lt;td&gt;Scored on model no. / size / brand → candidates → user confirms&lt;/td&gt;&lt;td&gt;After user confirms&lt;/td&gt;&lt;td&gt;Confirmed only&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;③ No match&lt;/td&gt;&lt;td&gt;Treated as single-store (e.g. pasted URL)&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;td&gt;Own price drops only&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;The lower the tier, the weaker the evidence, so the right to enter comparison and to fire alerts narrows with it. Only tier ① lands in the table as “the same product to everyone”; ② and ③ are demoted in proportion to how sure the match is.&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;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;flowchart TD&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  In[Input: JAN / name / URL]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  Kind{Detect kind}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  Jan[① JAN match]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  Score{Confidence score}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  Fuzzy[② Name fuzzy match]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  Cand{Candidates?}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  Single[③ Single-store]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  Cross[Enters comparison, can notify]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  Pending[Candidates, awaiting user confirm]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  Watch[Track own price drops only]&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;  In --&amp;gt; Kind&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  Kind --&amp;gt;|JAN| Jan&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  Kind --&amp;gt;|name| Fuzzy&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  Kind --&amp;gt;|URL| Single&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  Jan --&amp;gt; Score&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  Score --&amp;gt;|high ≥0.8| Cross&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  Score --&amp;gt;|mid ≥0.5| Pending&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  Score --&amp;gt;|low &amp;lt;0.5| Single&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  Fuzzy --&amp;gt; Cand&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  Cand --&amp;gt;|yes| Pending&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  Cand --&amp;gt;|no| Single&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  Pending --&amp;gt;|confirm| Cross&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  Single --&amp;gt; Watch&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A JAN input enters at ①, a name at ②, a URL at ③ — and a weak ① hit falls through to ② or ③. It’s a two-stage funnel, not a single gate.&lt;/p&gt;
&lt;h2 id=&quot;-jan-match-prove-rakuten-hits-by-scoring-jan-ness&quot;&gt;① JAN match: prove Rakuten hits by scoring “JAN-ness”&lt;/h2&gt;
&lt;p&gt;Even inside the JAN tier, Rakuten needs proof that a keyword=JAN hit is really the same product. I made that an additive confidence score.&lt;/p&gt;
&lt;p&gt;Yahoo! comes in via &lt;code&gt;jan_code&lt;/code&gt; lookup, so it goes straight to confirmed (alerts allowed). Rakuten is the awkward one — each hit accumulates a score:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;JAN string appears in the item name or caption … &lt;strong&gt;+0.5&lt;/strong&gt; (the most direct evidence)&lt;/li&gt;
&lt;li&gt;price falls inside the product-search API’s price range … &lt;strong&gt;+0.3&lt;/strong&gt; / outside it … &lt;strong&gt;−0.4&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;a model number or size can be read off the hit … &lt;strong&gt;+0.2&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Thresholds split the score three ways. &lt;strong&gt;≥0.8 is confirmed (&lt;code&gt;jan&lt;/code&gt;, can notify), ≥0.5 is needs-review (demoted to &lt;code&gt;fuzzy&lt;/code&gt;, no notify), and anything under 0.5 is discarded&lt;/strong&gt; (kept out of comparison). Refusing to treat a weak hit as confirmed turned out to be the single most effective guard against wrong merges.&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;// Rakuten single-hit JAN confidence (excerpt)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; s &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&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; (hit.itemCaption.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;includes&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(jan) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;||&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; hit.itemName.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;includes&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(jan)) s &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0.5&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; (range) {&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; lo&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; range.minPrice &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0.7&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;   &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// allow 30% below (old models, parallel imports)&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; hi&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; range.maxPrice &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1.5&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;   &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// allow 50% above (shipping-included, bundles)&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; (hit.itemPrice &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; lo &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; hit.itemPrice &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;lt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; hi) s &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0.3&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;  else&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; s &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0.4&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;                      &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// far outside = likely a bad match&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:#F97583&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;modelOrCapacityConsistent&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(hit)) s &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0.2&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;The price range comes from Rakuten’s product search API (&lt;code&gt;productCode=JAN&lt;/code&gt;), which returns a min and max price. I allow 0.7× below for old stock and parallel imports, and 1.5× above for shipping-included or bundled listings. A price far outside that band gets penalized — it’s probably a different size, a different color, or another product entirely.&lt;/p&gt;
&lt;p&gt;The catch: in practice that product search API returned 404 a lot. The price range is missing for many hits, so I can’t lean on the range term. To cover that, I added a check anchored on the cross-marketplace counterpart — the same-JAN Yahoo! hit’s representative price. If a model-number token pulled from the Yahoo! side (alphanumeric, 5+ chars, so effectively unique) appears in the Rakuten hit’s name, &lt;em&gt;and&lt;/em&gt; the price is within &lt;strong&gt;±40%&lt;/strong&gt; of the counterpart’s price, the hit is promoted to confirmed. The model token alone could collide by chance; the price band screens that out. Both conditions have to hold.&lt;/p&gt;
&lt;p&gt;You can see the comparison screen running in &lt;a href=&quot;https://aulvem.com/yasugoro/&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;yasugoro’s live app&lt;/a&gt; — free, no login. When the same product lines up across marketplaces, that’s a tier ① confirmation.&lt;/p&gt;
&lt;h2 id=&quot;-name-fuzzy-match-stop-at-candidates-dont-auto-confirm&quot;&gt;② Name fuzzy match: stop at candidates, don’t auto-confirm&lt;/h2&gt;
&lt;p&gt;When all you have is a product name, I score it on model number, size, and brand and stop at surfacing candidates. Nothing auto-confirms as the same product.&lt;/p&gt;
&lt;p&gt;The fuzzy score breaks down like this — the model number is the strongest signal by far:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;model number matches … &lt;strong&gt;+0.5&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;brand matches … &lt;strong&gt;+0.2&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;size matches … &lt;strong&gt;+0.2&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;overlap of remaining tokens (Jaccard) … &lt;strong&gt;+0.1 × coefficient&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A model number like &lt;code&gt;EH-NA0J&lt;/code&gt; is pulled from the name by regex, and a size like &lt;code&gt;54 sheets × 3&lt;/code&gt; is decomposed into “54 per pack × 3 packs = 162 total” before comparing. Only candidates scoring ≥0.6 are surfaced; if none clear it, the single best one drops to tier ③.&lt;/p&gt;
&lt;p&gt;The person confirms the candidate, not the algorithm. Only what a user marks as “same product” gets mastered. A wrong pairing can be rejected in one tap, which removes that pair from the candidate pool for good (it won’t resurface). For cross-marketplace comparison of household staples, putting a plain confirm path and a plain undo path in front of the user beats endlessly chasing higher auto-match accuracy.&lt;/p&gt;
&lt;h2 id=&quot;-no-match-fall-back-to-single-store-drop-alerts&quot;&gt;③ No match: fall back to single-store drop alerts&lt;/h2&gt;
&lt;p&gt;Anything that couldn’t be tied down at any tier becomes a single-store item. It stays out of the cheapest-across-stores ranking, and only its own page’s price drops are tracked.&lt;/p&gt;
&lt;p&gt;A single item added by pasting a URL starts here from the outset. It isn’t on the comparison footing, so it never claims “cheaper than another store” — but it can still say “cheaper than before.” I’d rather do the honest, smaller thing than force an incomparable item into the ranking and emit a wrong “cheapest.”&lt;/p&gt;
&lt;h2 id=&quot;what-stops-wrong-merges-is-only-confirmed-tiers-notify&quot;&gt;What stops wrong merges is “only confirmed tiers notify”&lt;/h2&gt;
&lt;p&gt;The real reason for three tiers was to never fire an alert on a bad identity. Notifications can only fire on JAN-confirmed (&lt;code&gt;jan&lt;/code&gt;) and user-confirmed (&lt;code&gt;user_confirmed&lt;/code&gt;) matches. The fuzzy needs-review state and single-store items are both kept out of the trigger condition.&lt;/p&gt;
&lt;p&gt;Locking the right to notify behind identity certainty — before any price math — matters because otherwise a price drop on a &lt;em&gt;different&lt;/em&gt; product gets reported as “your watched item got cheaper.” The trust in a cross-marketplace comparison rests, in the end, on that identity footing.&lt;/p&gt;
&lt;p&gt;How I compute the point-inclusive real price (splitting price into three certainty layers) is its own post: &lt;a href=&quot;https://aulvem.com/blog/2026-06-15-point-inclusive-effective-price/&quot;&gt;the effective-price design notes&lt;/a&gt;. That one is “how the price is computed,” this one is “how the same product is identified” — you need both for the comparison to hold. The running thing is &lt;a href=&quot;https://aulvem.com/products/yasugoro/&quot;&gt;yasugoro&lt;/a&gt; if you want to poke at it.&lt;/p&gt;
&lt;h2 id=&quot;faq&quot;&gt;FAQ&lt;/h2&gt;
&lt;h3 id=&quot;can-you-not-get-the-jan-from-rakutens-api-at-all&quot;&gt;Can you not get the JAN from Rakuten’s API at all?&lt;/h3&gt;
&lt;p&gt;There’s no JAN field in the item search response and no JAN-specific search parameter. In practice you throw the JAN string into the keyword parameter, and the JAN itself usually sits inside the item caption rather than a structured field. Yahoo! Shopping, by contrast, has a jan_code parameter that looks it up directly and returns janCode in the response — and that asymmetry is where the whole cross-marketplace problem starts.&lt;/p&gt;
&lt;h3 id=&quot;why-not-just-match-everything-by-jan&quot;&gt;Why not just match everything by JAN?&lt;/h3&gt;
&lt;p&gt;Force a JAN match on items where the JAN isn’t available and you start merging different products as one — the failure I most wanted to avoid. Rakuten doesn’t return the JAN directly, so a keyword=JAN hit needs separate proof that it’s really that product. Only items I can tie down by JAN go into the confirmed tier; weaker evidence drops to candidate suggestions, and unmatchable items drop to single-store alerts.&lt;/p&gt;
&lt;h3 id=&quot;why-doesnt-the-fuzzy-match-confirm-automatically&quot;&gt;Why doesn’t the fuzzy match confirm automatically?&lt;/h3&gt;
&lt;p&gt;A matching model number, size, and brand still only give you a probability, and auto-confirming a guess means alerts fire on a wrong merge. The fuzzy tier surfaces candidates and only masters the ones a person confirms; a wrong pairing can be rejected in one tap, which permanently drops that pair from the candidate pool. Notifications fire only on JAN-confirmed and user-confirmed matches.&lt;/p&gt;
&lt;h3 id=&quot;what-happens-to-items-that-dont-match&quot;&gt;What happens to items that don’t match?&lt;/h3&gt;
&lt;p&gt;They become single-store items: dropped from cross-marketplace comparison, with only their own page’s price drops tracked. Anything you add by pasting a URL starts here too. They never enter the cheapest-across-stores ranking — they’re watched as a standalone price, and alerts only say “cheaper than before”, never “cheaper than the other store”.&lt;/p&gt;</content:encoded><category>build</category><category>typescript</category><category>rakuten</category><category>yahoo</category><category>ec</category><category>api</category></item><item><title>How I compute the real, point-inclusive price — design notes from a 3-layer model</title><link>https://aulvem.com/blog/2026-06-15-point-inclusive-effective-price/</link><guid isPermaLink="true">https://aulvem.com/blog/2026-06-15-point-inclusive-effective-price/</guid><description>Building a price watcher on my own, the calculation I underestimated most was &apos;display price minus the points you earn&apos;. Splitting reward points into three certainty layers (confirmed, conditional, assumed), flooring each layer before summing, ranking on the confirmed layer only, and why shipping stays out — the design decisions I landed on, with code.</description><pubDate>Mon, 15 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I built and shipped a price watcher on my own. It compares the &lt;em&gt;real price&lt;/em&gt; — sticker price minus the reward points you earn — across marketplaces, and pings you when a watched staple gets cheaper. Going in, I figured “display price minus points” was a one-liner. The moment I started writing it, that one line turned out to be the hardest part.&lt;/p&gt;
&lt;p&gt;Three reasons. Subtract every point and you inflate the number. Mix points you’ll definitely get with points you &lt;em&gt;might&lt;/em&gt; get, and the listing that looks cheapest turns out to be conditional. Reward rates use different units per marketplace, and get the rounding wrong and you land a few yen off the real grant.&lt;/p&gt;
&lt;p&gt;So here are the design decisions I landed on for that real price. In short: split points into three certainty layers, floor each layer before summing, and rank on the certain layer only. If you’re computing “which is cheaper once points are in” yourself, maybe these help.&lt;/p&gt;
&lt;h2 id=&quot;first-define-the-real-price&quot;&gt;First, define the real price&lt;/h2&gt;
&lt;p&gt;A real price is the sticker price minus the points that purchase earns you. A ¥1,000 item that returns 100 points is ¥900 real. It’s closer to what actually leaves your wallet than the sticker number is.&lt;/p&gt;
&lt;p&gt;Points aren’t quite cash, though — they expire and they’re restricted in where you can spend them. So I fixed an assumption up front: one point equals one yen on your next purchase. Without that assumption nailed down, a cross-store comparison doesn’t even hold together. Folding the assumption into the definition was where the design started.&lt;/p&gt;
&lt;h2 id=&quot;where-the-naive-version-broke&quot;&gt;Where the naive version broke&lt;/h2&gt;
&lt;p&gt;The first thing I wrote was 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;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; effectivePrice&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; displayPrice &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; totalPoints; &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// this inflates&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Short, and it had three holes.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;It subtracts points you might not get.&lt;/strong&gt; Fold in entry-required campaigns or your assumed loyalty multiplier, and the cheapest-looking store becomes “the price you reach only if every condition is met.”&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reward rates use different units per marketplace.&lt;/strong&gt; Rakuten’s multiplier, Yahoo’s campaign add-ons, limited-time points. Multiply them in one pass and the magnitude drifts.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Rounding.&lt;/strong&gt; Points usually accrue floored. Sum several rewards and &lt;em&gt;then&lt;/em&gt; floor, and you land a few yen off the real grant.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A few yen is enough to swap first and second place — which changes the answer to “where should I buy.” Don’t inflate, and don’t drift. A real price has to do both, or it decays into a rough hint. So I rebuilt it.&lt;/p&gt;
&lt;h2 id=&quot;the-core-decision-split-points-by-certainty-into-three-layers&quot;&gt;The core decision: split points by certainty into three layers&lt;/h2&gt;
&lt;p&gt;The axis I settled on was splitting points by &lt;em&gt;how certain you are to receive them&lt;/em&gt; into three layers.&lt;/p&gt;





























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Layer&lt;/th&gt;&lt;th&gt;Contents&lt;/th&gt;&lt;th&gt;Certainty&lt;/th&gt;&lt;th&gt;Used for ranking&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;① Confirmed&lt;/td&gt;&lt;td&gt;Actual points the API returns&lt;/td&gt;&lt;td&gt;Certain&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;② Conditional&lt;/td&gt;&lt;td&gt;Known campaigns (e.g. “5 and 0 days”)&lt;/td&gt;&lt;td&gt;Varies (entry, etc.)&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;③ Assumed&lt;/td&gt;&lt;td&gt;Your own loyalty multiplier / shop-hopping&lt;/td&gt;&lt;td&gt;Self-reported&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Rank on the confirmed layer alone, and show ② and ③ as “the most it could drop.” The sort order is the same for everyone — decided by certain information — while the upside flexes with each person’s conditions.&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;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;flowchart TD&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  Price[Sticker price incl. tax]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  L1[① Confirmed: API points]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  L2[② Conditional: known campaigns]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  L3[③ Assumed: user settings]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  Rank[Ranking rankKey = price − ①]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  Eff[Displayed real price = price − ①②③]&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;  Price --&amp;gt; L1 --&amp;gt; Rank&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  Price --&amp;gt; L2 --&amp;gt; Eff&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  Price --&amp;gt; L3 --&amp;gt; Eff&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  L1 --&amp;gt; Eff&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Each result carries the weakest layer it includes as a certainty tier. In types, that’s all it is:&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;type&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; CertaintyTier&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &amp;#39;confirmed&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;conditional&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;assumed&amp;#39;&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;A rule hangs off that: a price that includes layer ③ (assumed) never fires a notification. You can’t tell someone “buy now” on the strength of self-reported points. Notifications fire on confirmed only — or on conditional once the entry requirement is disclosed.&lt;/p&gt;
&lt;h2 id=&quot;floor-each-layer-before-summing&quot;&gt;Floor each layer before summing&lt;/h2&gt;
&lt;p&gt;Don’t floor once at the end across layers. Floor inside each layer, then add.&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;let&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; pts &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; Math.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;floor&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(base &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; rate); &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// floor per layer&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; (cap &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;!=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; null&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; pts &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; cap) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  pts &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; Math.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;min&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(pts, cap); &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// cap applies to floored point-yen&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;Real grants are usually floored per campaign too, so summing and flooring afterward lands a yen or two off. The cap behaves the same way: take &lt;code&gt;Math.min&lt;/code&gt; against the &lt;em&gt;floored&lt;/em&gt; point-yen. Cap first, floor second, and you’re off by one again. Unglamorous ordering, but this is what the displayed number’s credibility rested on.&lt;/p&gt;
&lt;p&gt;There’s a quirk in how rates are stored, too. A campaign’s “+4×” is held as the &lt;em&gt;added&lt;/em&gt; grant on top of the tax-inclusive price — an increment. The base 1× is increment zero. Multiply the price by the raw multiplier and you double-count the standard points everyone already gets. So I store only the increment as a rate.&lt;/p&gt;
&lt;h2 id=&quot;separate-the-ranking-key-from-the-displayed-price&quot;&gt;Separate the ranking key from the displayed price&lt;/h2&gt;
&lt;p&gt;The key that sorts and the real price I show subtract different layers.&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; rankKey&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; base &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; confirmedPoints;                 &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// ① only&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; total&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; confirmedPoints &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; conditionalPoints &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; assumedPoints;&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; effectivePrice&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; Math.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;max&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, base &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; total);       &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// negative guard&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;rankKey&lt;/code&gt; subtracts the confirmed layer only, so the order is identical for everyone. &lt;code&gt;effectivePrice&lt;/code&gt; subtracts every layer and represents “the most this could drop” with your conditions folded in. On high-reward items the total points can exceed the price and go negative, so &lt;code&gt;Math.max(0, …)&lt;/code&gt; guards it.&lt;/p&gt;
&lt;p&gt;I pulled the order apart from the displayed amount on purpose: numbers that vary by reader (conditional, assumed) shouldn’t move the ranking. Let them in and you get the queasy behavior where whoever inflated their loyalty settings most reshuffles the top.&lt;/p&gt;
&lt;h2 id=&quot;leave-shipping-out-of-the-real-price-on-purpose&quot;&gt;Leave shipping out of the real price, on purpose&lt;/h2&gt;
&lt;p&gt;No marketplace search API returns the shipping amount, so I decided to keep it out of the real price. Add a guess and you import error to paper over data you don’t have.&lt;/p&gt;
&lt;p&gt;Instead, carry a flag — shipping-included, shipping-separate, or unknown — and compare only shipping-included listings on the same footing.&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;// only shipping-included listings enter the main ranking&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; isComparableForRank&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;listing&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; Listing&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:#79B8FF&quot;&gt; boolean&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;  return&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; listing.postageFlag &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;===&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// 0=included, 1=separate, null=unknown&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;Mix separate-shipping and included-shipping listings into one “cheapest” and you’ll miss the ones that flip once shipping lands. Deciding &lt;em&gt;not&lt;/em&gt; to include data you can’t get — and surfacing that decision — is more honest than half-guessing it.&lt;/p&gt;
&lt;h2 id=&quot;looking-back&quot;&gt;Looking back&lt;/h2&gt;
&lt;p&gt;A real price reads as “sticker minus points” in one line, yet making it trustworthy stacked up quiet decisions: split by certainty, floor per layer, separate the ranking key, drop shipping. None of it is flashy. Do it sloppily, though, and “the cheapest one was actually conditional” costs you the reader’s trust. Most of the time I spent went into making this calculation’s footing solid.&lt;/p&gt;
&lt;p&gt;This three-layer calculation runs on watched staples every day, pinging only when the confirmed layer says something genuinely got cheaper. The watcher I built around it — now live — is &lt;a href=&quot;https://aulvem.com/products/yasugoro/&quot;&gt;yasugoro&lt;/a&gt;: free, no login required.&lt;/p&gt;
&lt;h2 id=&quot;faq&quot;&gt;FAQ&lt;/h2&gt;
&lt;h3 id=&quot;why-not-just-subtract-all-the-points-and-compare-that-number&quot;&gt;Why not just subtract all the points and compare that number?&lt;/h3&gt;
&lt;p&gt;Subtracting everything inflates the number. A price with entry-required campaigns and your own loyalty multiplier baked in is “the price you reach if every condition is met” — not a floor everyone can count on. Rank on the points the API actually confirms, and show conditional and assumed points as a separate range.&lt;/p&gt;
&lt;h3 id=&quot;how-do-you-handle-limited-time-points-and-entry-required-campaigns&quot;&gt;How do you handle limited-time points and entry-required campaigns?&lt;/h3&gt;
&lt;p&gt;They don’t go into the effective-price total. They live in a conditional layer, computed separately and flagged for “entry required” or “cap reached”. Only API-confirmed points are asserted as a firm amount. Conditional points are shown as “this is the most it could drop”, and they’re excluded from what triggers a notification.&lt;/p&gt;
&lt;h3 id=&quot;if-shipping-isnt-in-the-price-wont-the-cheapest-option-flip&quot;&gt;If shipping isn’t in the price, won’t the cheapest option flip?&lt;/h3&gt;
&lt;p&gt;It can. But no marketplace search API returns the shipping amount, so adding a guess just imports error. I kept shipping out of the effective price and instead carry a flag — shipping-included, shipping-separate, or unknown — comparing only shipping-included listings on the same footing. Separate-shipping listings drop out of the main ranking and are disclosed in a note.&lt;/p&gt;
&lt;h3 id=&quot;why-use-different-layers-for-ranking-versus-the-displayed-price&quot;&gt;Why use different layers for ranking versus the displayed price?&lt;/h3&gt;
&lt;p&gt;The sort order should look the same to everyone. The ranking key uses only the confirmed layer, while the displayed effective price subtracts confirmed plus conditional plus assumed. That way “cheapest first” is decided by certain information alone, and the per-person upside shows up as a range on the displayed price.&lt;/p&gt;</content:encoded><category>build</category><category>typescript</category><category>pricing</category><category>ec</category><category>rakuten</category></item><item><title>Generating llms.txt and llms-full.txt in Astro for a Bilingual Site</title><link>https://aulvem.com/blog/2026-06-14-aulvem-llms-txt-multilingual/</link><guid isPermaLink="true">https://aulvem.com/blog/2026-06-14-aulvem-llms-txt-multilingual/</guid><description>How I generate llms.txt and llms-full.txt as Astro API routes, driving them from Content Collections and splitting English and Japanese with two axes — filterLang (which posts to include) and docLang (the document&apos;s own language) — plus how it sits next to robots.txt.</description><pubDate>Sun, 14 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;llms.txt is a proposed entry point for letting AI search and LLMs read a site. It sits in the same spot as robots.txt and sitemap.xml — a plain-text file at the site root. The spec isn’t settled, and no major LLM vendor officially promises to consume it. I still generate one, because the cost of doing so is small.&lt;/p&gt;
&lt;p&gt;This post is the implementation record for generating llms.txt and llms-full.txt in Astro, split into English and Japanese. I’m not going to argue whether it works — I have no measurable traffic to point at and nothing to assert. This is only about what gets generated and how. It continues the same thread as &lt;a href=&quot;https://aulvem.com/blog/2026-05-23-aulvem-zod-schema-enforcement/&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;enforcing rules with a Zod schema&lt;/a&gt; and &lt;a href=&quot;https://aulvem.com/blog/2026-05-30-aulvem-i18n-hreflang-reciprocal/&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;reciprocal hreflang&lt;/a&gt;: treat frontmatter and Content Collections as the single source of truth.&lt;/p&gt;
&lt;h2 id=&quot;what-llmstxt-actually-is&quot;&gt;What llms.txt actually is&lt;/h2&gt;
&lt;p&gt;llms.txt is a Markdown index for LLMs, placed at the site root. Where &lt;code&gt;sitemap.xml&lt;/code&gt; is a machine-readable list of URLs, llms.txt describes — in natural language, with one-line notes — what the site is and where to start reading.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://llmstxt.org/&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;llmstxt.org&lt;/a&gt; spec sets a loose shape: an H1 site name and a blockquote summary at the top, then H2 sections of annotated links below. Each link follows &lt;code&gt;- [Title](URL): one-line note&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The spec also names a second convention, &lt;code&gt;/llms-full.txt&lt;/code&gt;. That one isn’t an index but an expansion of each page’s body, so an LLM can grasp the content from a single file without following links. Aulvem ships both.&lt;/p&gt;






























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;/th&gt;&lt;th&gt;llms.txt&lt;/th&gt;&lt;th&gt;llms-full.txt&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Role&lt;/td&gt;&lt;td&gt;Light index (links + notes)&lt;/td&gt;&lt;td&gt;Full-text-ish index (excerpts + headings + tags)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Posts&lt;/td&gt;&lt;td&gt;Capped at seven featured&lt;/td&gt;&lt;td&gt;Every post&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Language&lt;/td&gt;&lt;td&gt;Split per language (EN / JA)&lt;/td&gt;&lt;td&gt;One file, EN + JA mixed, each entry language-tagged&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Size&lt;/td&gt;&lt;td&gt;Small&lt;/td&gt;&lt;td&gt;Large&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;the-minimal-astro-version&quot;&gt;The minimal Astro version&lt;/h2&gt;
&lt;p&gt;Astro’s file-based API routes let you return text by dropping a &lt;code&gt;.txt.ts&lt;/code&gt; file under &lt;code&gt;src/pages/&lt;/code&gt;. Return a &lt;code&gt;Response&lt;/code&gt; from a &lt;code&gt;GET&lt;/code&gt; handler with a &lt;code&gt;text/plain&lt;/code&gt; content type.&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/pages/llms.txt.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:#F97583&quot;&gt; type&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; { APIContext } &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &amp;quot;astro&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:#F97583&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; { renderLlmsTxt } &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &amp;quot;../lib/llmsTxt&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&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; async&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; function&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; GET&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;_context&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; APIContext&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; body&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; await&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; renderLlmsTxt&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;({ docLang: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;en&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:#F97583&quot;&gt;  return&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; new&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; Response&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(body, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    status: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;200&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;    headers: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;      &amp;quot;Content-Type&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;text/plain; charset=utf-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:#9ECBFF&quot;&gt;      &amp;quot;Cache-Control&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;public, max-age=3600&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:#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 &lt;code&gt;.txt.ts&lt;/code&gt; extension is what matters: it builds to the URL &lt;code&gt;/llms.txt&lt;/code&gt;. I keep the generation logic in a separate file (&lt;code&gt;src/lib/llmsTxt.ts&lt;/code&gt;) and leave the route as a thin entry point, so a per-language endpoint can reuse the same logic.&lt;/p&gt;
&lt;p&gt;The stack is short.&lt;/p&gt;




















&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;/th&gt;&lt;th&gt;Package&lt;/th&gt;&lt;th&gt;Use&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;img src=&quot;https://cdn.simpleicons.org/astro/af5d38&quot; width=&quot;16&quot; height=&quot;16&quot; alt style=&quot;vertical-align:middle;margin-right:6px;display:inline-block&quot;/&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;astro&lt;/code&gt; (API routes + &lt;code&gt;astro:content&lt;/code&gt;)&lt;/td&gt;&lt;td&gt;Route definitions and Content Collections access&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;img src=&quot;https://cdn.simpleicons.org/typescript/af5d38&quot; width=&quot;16&quot; height=&quot;16&quot; alt style=&quot;vertical-align:middle;margin-right:6px;display:inline-block&quot;/&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;typescript&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Typing the renderer&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;driving-it-from-content-collections&quot;&gt;Driving it from Content Collections&lt;/h2&gt;
&lt;p&gt;The post list inside llms.txt isn’t written by hand. It’s built on the fly from Content Collections — &lt;code&gt;getCollection&lt;/code&gt; for posts and products. A hand-kept list goes stale: you add a post, forget the index, and llms.txt drifts from the actual content.&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/lib/llmsTxt.ts (excerpt)&lt;/span&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; async&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; function&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; renderLlmsTxt&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;opts&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; LlmsTxtOptions&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:#B392F0&quot;&gt; Promise&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;lt;&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&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; services&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; await&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; getCollection&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;services&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:#F97583&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; blog&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; await&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; getCollection&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;blog&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, ({ &lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;data&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:#F97583&quot;&gt; !&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;data.draft);&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:#6A737D&quot;&gt;  // newest first; products order by status (active → preparing → archived)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  blog.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;sort&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;((&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;b&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; b.data.pubDate.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;getTime&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; a.data.pubDate.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;getTime&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:#6A737D&quot;&gt;  // ...assemble sections and return join(&amp;quot;\n&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;/code&gt;&lt;/pre&gt;
&lt;p&gt;The detail to get right is the &lt;code&gt;({ data }) =&amp;gt; !data.draft&lt;/code&gt; filter that drops &lt;code&gt;draft: true&lt;/code&gt;. Skip it and a half-written draft lands in llms.txt, advertising a URL you haven’t published. I keep the same exclusion that sitemap and RSS use.&lt;/p&gt;
&lt;p&gt;For each post’s note, I reuse the frontmatter &lt;code&gt;summary&lt;/code&gt; (falling back to &lt;code&gt;description&lt;/code&gt;). Every post already carries a &lt;code&gt;summary&lt;/code&gt; written as the short answer I want quoted by AI, so the llms.txt note and the post’s own TLDR come from one place. Frontmatter stays the single source here too.&lt;/p&gt;
&lt;h2 id=&quot;splitting-by-language&quot;&gt;Splitting by language&lt;/h2&gt;
&lt;p&gt;This is the part that matters for a multilingual site. Aulvem drives the renderer on two axes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;filterLang&lt;/strong&gt;: which language’s posts and products to list (&lt;code&gt;ja&lt;/code&gt; lists only Japanese entries)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;docLang&lt;/strong&gt;: which language the document’s own text — headings, summary, usage terms — is written in&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Separating those two lets one renderer emit three endpoints.&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/pages/llms.txt.ts        → English headings, posts from all languages&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;renderLlmsTxt&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;({ docLang: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;en&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&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// src/pages/ja/llms.txt.ts     → Japanese headings, Japanese posts only&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;renderLlmsTxt&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;({ filterLang: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;ja&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, docLang: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;ja&amp;quot;&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;The English route &lt;code&gt;/llms.txt&lt;/code&gt; leaves &lt;code&gt;filterLang&lt;/code&gt; unset on purpose. I treat the English version as the whole-site entry point, so it can surface posts in either language. The Japanese version &lt;code&gt;/ja/llms.txt&lt;/code&gt; closes to the Japanese surface with &lt;code&gt;filterLang: &amp;quot;ja&amp;quot;&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;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;flowchart LR&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  CC[Content Collections&amp;lt;br/&amp;gt;blog + services]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  R[renderLlmsTxt&amp;lt;br/&amp;gt;filterLang / docLang]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  EN[&amp;quot;/llms.txt&amp;lt;br/&amp;gt;docLang=en&amp;quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  JA[&amp;quot;/ja/llms.txt&amp;lt;br/&amp;gt;filterLang=ja, docLang=ja&amp;quot;]&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;  CC --&amp;gt;|getCollection| R&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  R --&amp;gt; EN&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  R --&amp;gt; JA&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;featured-posts-narrow-to-doclang&quot;&gt;Featured posts narrow to docLang&lt;/h3&gt;
&lt;p&gt;One design call sits inside this. The English &lt;code&gt;/llms.txt&lt;/code&gt; can surface posts from both languages, but the Featured posts section alone is narrowed to &lt;code&gt;docLang&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;// featured posts only in the doc language&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; featuredSource&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; filteredBlog.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;filter&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 style=&quot;color:#FFAB70&quot;&gt;p&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:#B392F0&quot;&gt; entryLangLocal&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(p.id) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;===&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; opts.docLang,&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;Listing both halves of a translation pair in the featured slots spends two slots on one piece of content and halves the unique signal in a limited list. So the featured slots align to the document language, and the cross-language full set lives in llms-full.txt. A bounded list (seven featured posts) narrows by language; a full dump with loose size limits carries both. That’s the split.&lt;/p&gt;
&lt;h2 id=&quot;llms-fulltxt--full-index-with-language-cross-references&quot;&gt;llms-full.txt — full index with language cross-references&lt;/h2&gt;
&lt;p&gt;llms-full.txt is a separate route (&lt;code&gt;src/pages/llms-full.txt.ts&lt;/code&gt;) that expands every post’s excerpt, headings and tags into one file. The MDX body runs through &lt;code&gt;stripMdx&lt;/code&gt; to drop the syntax, then &lt;code&gt;clip&lt;/code&gt; to 500 characters.&lt;/p&gt;
&lt;p&gt;Each entry gets a language tag (&lt;code&gt;(ja)&lt;/code&gt; / &lt;code&gt;(en)&lt;/code&gt;), and if a translation pair exists, a &lt;code&gt;Lang-Alt&lt;/code&gt; line cross-references the other language’s URL.&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;// add the paired language version as Lang-Alt&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; alt&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; altByBase.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;get&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(slug);&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; (alt) {&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; otherLang&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; lang &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;===&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &amp;quot;ja&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; ?&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &amp;quot;en&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; :&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &amp;quot;ja&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:#F97583&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; otherPath&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; alt[otherLang];&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; (otherPath) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    lines.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;push&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;`Lang-Alt (${&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;otherLang&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;}): ${&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;SITE&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;}${&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;otherPath&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 style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This is the same idea as hreflang. I wrote up emitting reciprocal &lt;code&gt;alternate&lt;/code&gt; links in HTML only for posts that exist in both languages in &lt;a href=&quot;https://aulvem.com/blog/2026-05-30-aulvem-i18n-hreflang-reciprocal/&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;the hreflang post&lt;/a&gt;; llms-full.txt makes the same statement to an LLM — “this post has a paired version over here.” The aim is to keep the English and Japanese halves of one post from being counted as two unrelated documents.&lt;/p&gt;
&lt;h2 id=&quot;how-it-sits-next-to-robotstxt&quot;&gt;How it sits next to robots.txt&lt;/h2&gt;
&lt;p&gt;llms.txt doesn’t replace robots.txt. robots.txt states whether a crawler may fetch; llms.txt states what the site contains and where the good parts are. The final permission to train or quote stays with robots.txt.&lt;/p&gt;
&lt;p&gt;Aulvem puts a usage-and-citation section inside llms.txt: quoting is welcome, link back to the source URL, training is permitted for now. The section ends by pointing back to robots.txt as the authoritative bot policy — the machine-readable authority lives there, and llms.txt is a note, not an override. I’d keep that framing.&lt;/p&gt;
&lt;p&gt;Leave it vague and you get a mismatch: llms.txt says “no training” while robots.txt allows everything. The two files’ stances have to be kept aligned by hand.&lt;/p&gt;
&lt;h2 id=&quot;pitfalls-and-operating-rules&quot;&gt;Pitfalls and operating rules&lt;/h2&gt;
&lt;p&gt;A few things I nearly tripped on:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Apply the &lt;code&gt;draft&lt;/code&gt; exclusion across all three routes&lt;/strong&gt;: put the &lt;code&gt;getCollection&lt;/code&gt; filter in the shared renderer so llms.txt, ja/llms.txt and llms-full.txt all pass the same exclusion. Let one route through raw and drafts leak&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Don’t conflate &lt;code&gt;filterLang&lt;/code&gt; and &lt;code&gt;docLang&lt;/code&gt;&lt;/strong&gt;: “which posts to list” and “what language to write in” are different axes. The English version leaves &lt;code&gt;filterLang&lt;/code&gt; unset to surface Japanese posts too — don’t read that later as a bug and add a filter&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Featured language narrowing&lt;/strong&gt;: only Featured narrows by docLang. Drop that and translation pairs fill the slots&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Set &lt;code&gt;Cache-Control&lt;/code&gt;&lt;/strong&gt;: all three use &lt;code&gt;max-age=3600&lt;/code&gt;. Generation is cheap, but there’s no need to rebuild on every request&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Keep usage terms and robots.txt in sync&lt;/strong&gt;: change the stance and edit both. Don’t let llms.txt stand alone&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;closing&quot;&gt;Closing&lt;/h2&gt;
&lt;p&gt;llms.txt, generated from Content Collections as an Astro API route, drops the manual upkeep every time you add a post. For multiple languages, splitting on filterLang (which posts) and docLang (the wording) lets one renderer emit the English, Japanese and full-text versions.&lt;/p&gt;
&lt;p&gt;Whether it does anything is a separate question I’m leaving alone. How llms.txt feeds AI-search traffic isn’t a settled convention or a measured one yet. Aulvem’s stance is to generate it because it’s cheap, and to keep the authority in robots.txt.&lt;/p&gt;
&lt;p&gt;Treating frontmatter as the single source of truth is the thread that runs from &lt;a href=&quot;https://aulvem.com/blog/2026-05-17-aulvem-blog-architecture/&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;the Aulvem blog architecture post&lt;/a&gt; onward, if you want the wider context.&lt;/p&gt;
&lt;h2 id=&quot;faq&quot;&gt;FAQ&lt;/h2&gt;
&lt;h3 id=&quot;whats-the-difference-between-llmstxt-and-llms-fulltxt&quot;&gt;What’s the difference between llms.txt and llms-full.txt?&lt;/h3&gt;
&lt;p&gt;llms.txt is a light index — annotated links that say what the site is and where to start. llms-full.txt carries each post’s excerpt, headings and tags as a closer-to-full-text dump. Aulvem treats the first as a curated list capped at seven featured posts, and the second as a full excerpt dump of every post.&lt;/p&gt;
&lt;h3 id=&quot;will-publishing-llmstxt-get-my-site-read-by-ai-and-bring-traffic&quot;&gt;Will publishing llms.txt get my site read by AI and bring traffic?&lt;/h3&gt;
&lt;p&gt;I can’t claim that. llms.txt is a proposed convention, and no major LLM vendor officially guarantees it consumes the file. robots.txt and sitemap.xml are still the authoritative bot signals. Aulvem keeps llms.txt because it’s cheap to generate, not because there’s measurable traffic to point to.&lt;/p&gt;
&lt;h3 id=&quot;should-a-multilingual-site-split-llmstxt-per-language&quot;&gt;Should a multilingual site split llms.txt per language?&lt;/h3&gt;
&lt;p&gt;Aulvem serves a Japanese version (/ja/llms.txt) separate from the English root (/llms.txt). I want the headings and usage terms in the reader’s language, and the featured posts narrowed to that language. The full-text llms-full.txt stays as a single bilingual file, kept as a separate track from the two light indexes.&lt;/p&gt;
&lt;h3 id=&quot;if-i-already-have-robotstxt-do-i-need-llmstxt-too&quot;&gt;If I already have robots.txt, do I need llms.txt too?&lt;/h3&gt;
&lt;p&gt;They do different jobs. robots.txt states what crawlers may fetch; llms.txt describes what the site contains and where to read. The authoritative permission for training and citation lives in robots.txt — llms.txt is a guide on top of it. Aulvem’s usage section even points back to robots.txt as the final word.&lt;/p&gt;</content:encoded><category>build</category><category>astro</category><category>llms-txt</category><category>geo</category><category>site-architecture</category></item><item><title>Emitting reciprocal hreflang only when both languages exist — Aulvem&apos;s i18n customisation</title><link>https://aulvem.com/blog/2026-05-30-aulvem-i18n-hreflang-reciprocal/</link><guid isPermaLink="true">https://aulvem.com/blog/2026-05-30-aulvem-i18n-hreflang-reciprocal/</guid><description>Astro&apos;s i18n routing doesn&apos;t emit hreflang on its own, and a naive &apos;always emit all locales&apos; implementation points at 404s for one-sided posts. Aulvem uses Content Collections helpers to emit alternates only for languages that actually have a published entry, then handles the reciprocal and x-default rules on top.</description><pubDate>Sat, 30 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Astro 5’s i18n gives you routing, not hreflang.&lt;/p&gt;
&lt;p&gt;A naive “emit one &lt;code&gt;&amp;lt;link rel=&amp;quot;alternate&amp;quot;&amp;gt;&lt;/code&gt; per supported locale” implementation breaks the moment a post only exists in one language: the alternate points at a 404, Google sees the reciprocal pointer is missing, and the hreflang is quietly ignored. Worst case, it weakens the site’s multilingual signal as a whole.&lt;/p&gt;
&lt;p&gt;Aulvem walks Content Collections to detect which language versions actually exist for a given slug, then emits &lt;code&gt;&amp;lt;link rel=&amp;quot;alternate&amp;quot; hreflang&amp;gt;&lt;/code&gt; conditionally from &lt;code&gt;Seo.astro&lt;/code&gt;. This is the third follow-up to &lt;a href=&quot;https://aulvem.com/blog/2026-05-17-aulvem-blog-architecture/&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;How this blog is built&lt;/a&gt;, picking up the FAQ note that hreflang and sitemap lastmod were both custom-built on top of Astro’s defaults.&lt;/p&gt;
&lt;h2 id=&quot;what-breaks-when-you-emit-alternates-for-every-locale&quot;&gt;What breaks when you emit alternates for every locale&lt;/h2&gt;
&lt;p&gt;The naive pattern: a 2-language site emits two &lt;code&gt;&amp;lt;link rel=&amp;quot;alternate&amp;quot; hreflang&amp;gt;&lt;/code&gt; lines on every page, one for each locale. It looks correct at first.&lt;/p&gt;
&lt;p&gt;The break happens when a specific post only exists in one language:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A JA-only post emits a hreflang pointing at the EN URL → that URL returns 404&lt;/li&gt;
&lt;li&gt;Google notices the EN URL doesn’t reciprocate (no JA pointer because it doesn’t render)&lt;/li&gt;
&lt;li&gt;The hreflang is dropped, and the site’s overall multilingual signal weakens&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://developers.google.com/search/docs/specialty/international/localized-versions&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;Google’s hreflang documentation&lt;/a&gt; makes both rules explicit: “reciprocal pointers required” and “alternates must point at valid URLs”. A naive implementation fails both and effectively becomes a no-op — or worse, an active liability.&lt;/p&gt;
&lt;h2 id=&quot;the-two-rules-from-google&quot;&gt;The two rules from Google&lt;/h2&gt;
&lt;p&gt;Two requirements have to hold for hreflang to count:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Reciprocal pointers&lt;/strong&gt;: if &lt;code&gt;A → B&lt;/code&gt; is emitted, &lt;code&gt;B → A&lt;/code&gt; must exist&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Valid URLs&lt;/strong&gt;: 404 or noindex targets disqualify the alternate&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The cleanest way to satisfy both is “only emit an alternate when both languages actually have a published entry”. That requires walking the content at build time to know which entries are bilingual.&lt;/p&gt;
&lt;h2 id=&quot;three-helpers-in-srclibpoststs&quot;&gt;Three helpers in &lt;code&gt;src/lib/posts.ts&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Aulvem keeps three helpers for the three page types (single post, product page, paginated category):&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;import&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; { getCollection } &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &amp;quot;astro:content&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:#F97583&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; type&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; { Lang } &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &amp;quot;../i18n&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&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; LANGS&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; Lang&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; [&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;en&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;ja&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&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// Per-post: which languages have the entry&lt;/span&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; async&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; function&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; blogAvailableLangs&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;slugWithoutLang&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:#F97583&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; Promise&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Lang&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;  const&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; all&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; await&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; getCollection&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;blog&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, ({ &lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;data&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:#F97583&quot;&gt; !&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;data.draft);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  return&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; LANGS&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;filter&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;((&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;lang&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&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    all.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;some&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; e.id &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;lang&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;}/${&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;slugWithoutLang&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 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:#6A737D&quot;&gt;// Per-product: same, against the services collection&lt;/span&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; async&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; function&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; serviceAvailableLangs&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;slugWithoutLang&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:#F97583&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; Promise&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Lang&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;  const&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; all&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; await&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; getCollection&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;services&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:#F97583&quot;&gt;  return&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; LANGS&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;filter&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;((&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;lang&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&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    all.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;some&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; e.id &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;lang&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;}/${&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;slugWithoutLang&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 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:#6A737D&quot;&gt;// Per-paginated-page: does page N exist in each language?&lt;/span&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; async&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; function&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; categoryPageAvailableLangs&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:#FFAB70&quot;&gt;  category&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&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;  pageNum&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; number&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:#FFAB70&quot;&gt;  pageSize&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; number&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 style=&quot;color:#F97583&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; Promise&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Lang&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;  const&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; results&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; Lang&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; [];&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; lang&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; of&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; LANGS&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; posts&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; await&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; getPublishedBlog&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(lang);&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; inCat&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; posts.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;filter&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;((&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;p&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; p.data.category &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;===&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; category);&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; lastPage&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; Math.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;max&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, Math.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;ceil&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(inCat.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;length&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; /&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; pageSize));&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; (pageNum &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;lt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; lastPage) results.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;push&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(lang);&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:#F97583&quot;&gt;  return&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; results;&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;draft: true&lt;/code&gt; filter inside &lt;code&gt;getCollection&lt;/code&gt; matters — treating a draft-only language as “available” would emit a hreflang pointing at a URL that doesn’t render on the published build.&lt;/p&gt;
&lt;p&gt;Unlike the &lt;a href=&quot;https://aulvem.com/blog/2026-05-25-aulvem-sitemap-lastmod/&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;sitemap lastmod implementation&lt;/a&gt; inside &lt;code&gt;astro.config.mjs&lt;/code&gt;, these helpers run from layouts during page rendering. The Content Collections API is already initialised by then, so &lt;code&gt;getCollection&lt;/code&gt; is the right tool here.&lt;/p&gt;
&lt;h2 id=&quot;conditional-emission-in-seoastro&quot;&gt;Conditional emission in &lt;code&gt;Seo.astro&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;Seo.astro&lt;/code&gt; accepts an &lt;code&gt;availableLangs&lt;/code&gt; prop (defaulting to both) and uses &lt;code&gt;includes(&amp;quot;en&amp;quot;)&lt;/code&gt; / &lt;code&gt;includes(&amp;quot;ja&amp;quot;)&lt;/code&gt; to decide which &lt;code&gt;&amp;lt;link rel=&amp;quot;alternate&amp;quot;&amp;gt;&lt;/code&gt; to emit:&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;---&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;interface&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; Props&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:#6A737D&quot;&gt;  // ... other props&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;  availableLangs&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;?:&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; Lang&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:#F97583&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; { &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;availableLangs&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:#9ECBFF&quot;&gt;&amp;quot;en&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;ja&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;], &lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;lang&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;langProp&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; Astro.props;&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; lang&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; Lang&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; langProp &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;??&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; getLangFromUrl&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(Astro.url);&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;const&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; currentPath&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; Astro.url.pathname;&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; otherLangPath&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; altPathForOtherLang&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(currentPath, lang);&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; enPath&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; lang &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;===&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &amp;quot;en&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; ?&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; currentPath &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; otherLangPath;&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; jaPath&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; lang &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;===&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &amp;quot;ja&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; ?&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; currentPath &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; otherLangPath;&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; enHref&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; new&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; URL&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(enPath, Astro.site).&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;toString&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; jaHref&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; new&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; URL&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(jaPath, Astro.site).&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;toString&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; hasEnVersion&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; availableLangs.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;includes&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;en&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:#F97583&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; hasJaVersion&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; availableLangs.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;includes&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;ja&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:#6A737D&quot;&gt;// x-default points to EN when available; otherwise the only available lang.&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; xDefaultHref&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; hasEnVersion &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;?&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; enHref &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; jaHref;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;{hasEnVersion &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;link&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; rel&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;alternate&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; hreflang&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;en&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; href&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;{enHref} /&amp;gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;{hasJaVersion &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;link&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; rel&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;alternate&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; hreflang&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;ja&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; href&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;{jaHref} /&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;link&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;alternate&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; hreflang&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;x-default&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; href&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;={xDefaultHref} /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The default value &lt;code&gt;[&amp;quot;en&amp;quot;, &amp;quot;ja&amp;quot;]&lt;/code&gt; matches the top-level pages (&lt;code&gt;/&lt;/code&gt;, &lt;code&gt;/about/&lt;/code&gt;, etc.) which are always bilingual. The contract is: &lt;strong&gt;per-entry layouts must override &lt;code&gt;availableLangs&lt;/code&gt;&lt;/strong&gt;. Forgetting the override on a per-entry layout means broadcasting a 404 URL through hreflang, which is the exact failure mode the helpers are designed to prevent.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;x-default&lt;/code&gt; always falls back to EN when both languages exist, since EN is the site’s default locale. Single-language posts still get an &lt;code&gt;x-default&lt;/code&gt; pointing at the only available language — Google’s guideline says to declare at least one supported language explicitly.&lt;/p&gt;
&lt;h2 id=&quot;wiring-layouts-to-the-helpers&quot;&gt;Wiring layouts to the helpers&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;BlogPostLayout.astro&lt;/code&gt; is the typical caller:&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;---&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; { entrySlug, blogAvailableLangs } &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &amp;quot;../lib/posts&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&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; slug&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; entrySlug&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(entry); &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// &amp;quot;ja/2026-05-30-foo&amp;quot; → &amp;quot;2026-05-30-foo&amp;quot;&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; availableLangs&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; await&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; blogAvailableLangs&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(slug);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&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:#79B8FF&quot;&gt;Seo&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  title&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;={data.title}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  description&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;={data.description}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  lang&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;={lang}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  availableLangs&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;={availableLangs}&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;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;entrySlug&lt;/code&gt; strips the language prefix (&lt;code&gt;en/&lt;/code&gt; or &lt;code&gt;ja/&lt;/code&gt;) before handing the slug to the helper. Forgetting the strip turns the lookup into a full mismatch and silently returns an empty array — quiet failure that doesn’t fail the build.&lt;/p&gt;
&lt;p&gt;Paginated routes (&lt;code&gt;/blog/build/[...page].astro&lt;/code&gt;) call &lt;code&gt;categoryPageAvailableLangs(category, page.currentPage, 12)&lt;/code&gt; instead.&lt;/p&gt;
&lt;h2 id=&quot;the-flow&quot;&gt;The flow&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;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;flowchart LR&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  MDX[blog MDX en+ja]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  Helper[blogAvailableLangs&amp;lt;br/&amp;gt;serviceAvailableLangs&amp;lt;br/&amp;gt;categoryPageAvailableLangs]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  Layout[BlogPostLayout&amp;lt;br/&amp;gt;ServiceLayout&amp;lt;br/&amp;gt;category route]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  Seo[Seo.astro&amp;lt;br/&amp;gt;availableLangs prop]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  HTML[hreflang 0~2 + x-default]&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;  MDX --&amp;gt;|getCollection| Helper&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  Helper --&amp;gt; Layout&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  Layout --&amp;gt; Seo&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  Seo --&amp;gt; HTML&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The helper walks Content Collections once and returns a &lt;code&gt;Lang[]&lt;/code&gt; to the layout. The layout passes that array to &lt;code&gt;Seo.astro&lt;/code&gt;, which emits zero, one, or two &lt;code&gt;&amp;lt;link rel=&amp;quot;alternate&amp;quot;&amp;gt;&lt;/code&gt; lines plus an &lt;code&gt;x-default&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&quot;routing-stays-on-the-official-integration&quot;&gt;Routing stays on the official integration&lt;/h2&gt;
&lt;p&gt;Astro 5’s i18n routing — automatic &lt;code&gt;/ja/...&lt;/code&gt; prefixing, locale detection on request — is left untouched. It’s mature enough that there’s no incentive to rewrite it.&lt;/p&gt;
&lt;p&gt;Aulvem’s stance is to leave anything the official integration handles well alone and patch only the gaps. Hreflang is purely an SEO-layer concern, so the override lives entirely inside &lt;code&gt;Seo.astro&lt;/code&gt; and the helpers. When Astro eventually ships hreflang generation out of the box, peeling the override off is a one-file change.&lt;/p&gt;
&lt;h2 id=&quot;pitfalls&quot;&gt;Pitfalls&lt;/h2&gt;
&lt;p&gt;A short list of things that almost broke:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;availableLangs&lt;/code&gt; defaults to &lt;code&gt;[&amp;quot;en&amp;quot;, &amp;quot;ja&amp;quot;]&lt;/code&gt;&lt;/strong&gt;: appropriate for top-level pages, but per-entry layouts must override. Forgetting the override is the exact failure mode this whole setup prevents&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;entrySlug&lt;/code&gt; placement&lt;/strong&gt;: Content Collections IDs are &lt;code&gt;ja/2026-05-30-foo&lt;/code&gt;. Hand the prefixed ID to the helper and the lookup quietly returns &lt;code&gt;[]&lt;/code&gt;, which then emits no hreflang at all — silent regression&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;draft: true&lt;/code&gt; filtering&lt;/strong&gt;: handled inside the helper’s &lt;code&gt;getCollection&lt;/code&gt; filter. Without it, a draft-only language can be marked “available” and the published build has nothing at that URL&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Paginated edge case&lt;/strong&gt;: &lt;code&gt;/blog/build/3/&lt;/code&gt; can exist in EN but not JA if the categories diverge in length. &lt;code&gt;categoryPageAvailableLangs&lt;/code&gt; handles this — without it, page 3 of a category would emit JA alternates pointing at 404&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;x-default&lt;/code&gt; for single-language posts&lt;/strong&gt;: still emitted, pointing at the one available language. Google recommends declaring at least one supported locale explicitly&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;wrap-up&quot;&gt;Wrap-up&lt;/h2&gt;
&lt;p&gt;Hreflang only counts when reciprocal pointers and existence checks both hold. Walking Content Collections at build time gives both, and the override fits in roughly 30 lines split between three helpers and a Seo.astro change. Routing stays on the official integration.&lt;/p&gt;
&lt;p&gt;The same “frontmatter as the single source of truth” idea drives &lt;a href=&quot;https://aulvem.com/blog/2026-05-23-aulvem-zod-schema-enforcement/&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;the Zod schema enforcement&lt;/a&gt; and &lt;a href=&quot;https://aulvem.com/blog/2026-05-25-aulvem-sitemap-lastmod/&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;the sitemap lastmod override&lt;/a&gt; — three follow-ups to the &lt;a href=&quot;https://aulvem.com/blog/2026-05-17-aulvem-blog-architecture/&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;stack overview&lt;/a&gt;. The reciprocal-pointer idea carries over to LLM indexes too, in &lt;a href=&quot;https://aulvem.com/blog/2026-06-14-aulvem-llms-txt-multilingual/&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;generating a bilingual llms.txt&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;faq&quot;&gt;FAQ&lt;/h2&gt;
&lt;h3 id=&quot;why-doesnt-astro-emit-hreflang-on-its-own&quot;&gt;Why doesn’t Astro emit hreflang on its own?&lt;/h3&gt;
&lt;p&gt;Astro 5’s i18n is scoped to routing — generating URLs and detecting the request locale. SEO meta-tag generation isn’t part of that responsibility. &lt;code&gt;@astrojs/sitemap&lt;/code&gt; will emit hreflang inside the sitemap.xml, but the &lt;code&gt;&amp;lt;link rel=&amp;quot;alternate&amp;quot;&amp;gt;&lt;/code&gt; in the &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; is your job to write. Aulvem keeps that responsibility inside Seo.astro.&lt;/p&gt;
&lt;h3 id=&quot;arent-the-hreflang-entries-from-astrojssitemap-enough&quot;&gt;Aren’t the hreflang entries from &lt;code&gt;@astrojs/sitemap&lt;/code&gt; enough?&lt;/h3&gt;
&lt;p&gt;The &lt;code&gt;xhtml:link&lt;/code&gt; entries inside sitemap.xml are emitted, but the &lt;code&gt;&amp;lt;link rel=&amp;quot;alternate&amp;quot; hreflang&amp;gt;&lt;/code&gt; in HTML &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; is a separate channel. Google reads both, and missing the &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; channel weakens multilingual recognition at the snippet level. So both belong.&lt;/p&gt;
&lt;h3 id=&quot;what-should-x-default-point-to&quot;&gt;What should &lt;code&gt;x-default&lt;/code&gt; point to?&lt;/h3&gt;
&lt;p&gt;Google describes it as the fallback for users whose target language can’t be determined. Aulvem has EN as the default locale, so x-default points at the EN version when one exists, and falls back to the only available language otherwise. For posts that have both languages, defaulting to EN is fine.&lt;/p&gt;
&lt;h3 id=&quot;does-omitting-hreflang-for-one-sided-posts-hurt-seo&quot;&gt;Does omitting hreflang for one-sided posts hurt SEO?&lt;/h3&gt;
&lt;p&gt;Not emitting hreflang isn’t itself a penalty. What hurts is emitting an alternate that points at a non-existent URL — Google flags the reciprocal mismatch and weakens the whole site’s multilingual signal. Single-language posts are safer with a clean canonical and no alternate than with a broken one.&lt;/p&gt;</content:encoded><category>build</category><category>astro</category><category>i18n</category><category>seo</category><category>site-architecture</category></item><item><title>Reading sitemap lastmod from MDX frontmatter — customising Astro&apos;s sitemap integration</title><link>https://aulvem.com/blog/2026-05-25-aulvem-sitemap-lastmod/</link><guid isPermaLink="true">https://aulvem.com/blog/2026-05-25-aulvem-sitemap-lastmod/</guid><description>@astrojs/sitemap doesn&apos;t read updatedDate from MDX frontmatter, so Aulvem builds a path-to-date map inside astro.config.mjs with fs.readdir + lightweight regex and feeds it into serialize. Paginated noindex pages are also filtered out.</description><pubDate>Mon, 25 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;code&gt;@astrojs/sitemap&lt;/code&gt; won’t read &lt;code&gt;updatedDate&lt;/code&gt; out of MDX frontmatter.&lt;/p&gt;
&lt;p&gt;Leave it at the defaults and the sitemap’s &lt;code&gt;lastmod&lt;/code&gt; ends up being the build time, which broadcasts the noise signal that “every post was updated on every build” to search engines and AI search. The freshness hint stops being a hint and starts being misleading.&lt;/p&gt;
&lt;p&gt;Aulvem solves this inside &lt;code&gt;astro.config.mjs&lt;/code&gt; by walking the blog folder, building a path-to-date map with a lightweight regex, and feeding it into the &lt;code&gt;serialize&lt;/code&gt; hook of &lt;code&gt;@astrojs/sitemap&lt;/code&gt;. Paginated &lt;code&gt;noindex&lt;/code&gt; pages are dropped from the sitemap in the same pass via &lt;code&gt;filter&lt;/code&gt;. This is the second follow-up to &lt;a href=&quot;https://aulvem.com/blog/2026-05-17-aulvem-blog-architecture/&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;How this blog is built&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;why-lastmod-matters&quot;&gt;Why &lt;code&gt;lastmod&lt;/code&gt; matters&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;lastmod&lt;/code&gt; is the last-modified date in the &lt;a href=&quot;https://www.sitemaps.org/protocol.html&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;sitemap protocol&lt;/a&gt;, and search engines use it as a re-crawl priority hint. AI search engines — ChatGPT Search, Perplexity, Claude Search — read it as a freshness anchor for citation eligibility.&lt;/p&gt;
&lt;p&gt;Two specific reasons to get it right:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Crawl priority&lt;/strong&gt;: recently updated URLs should get re-fetched sooner&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI citation&lt;/strong&gt;: “this article was updated N days ago” feeds into the LLM’s decision to cite the page as current information&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A bogus &lt;code&gt;lastmod&lt;/code&gt; works the other way. Google’s own &lt;a href=&quot;https://developers.google.com/search/docs/crawling-indexing/sitemaps/build-sitemap&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;Sitemap docs&lt;/a&gt; note that unreliable &lt;code&gt;lastmod&lt;/code&gt; values erode site-wide trust. Painting build-time onto every URL teaches Google that this site’s &lt;code&gt;lastmod&lt;/code&gt; is noise, which is worse than not setting one at all. Pair the implementation with a strict &lt;code&gt;updatedDate&lt;/code&gt; policy (see &lt;a href=&quot;https://github.com/aulvem/aulvem-hp/blob/main/docs/content-rules.md&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;content rules A-2-1&lt;/a&gt;) and the signal stays meaningful.&lt;/p&gt;
&lt;h2 id=&quot;walking-mdx-at-config-evaluation-time&quot;&gt;Walking MDX at config evaluation time&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;lastmod&lt;/code&gt; map is built once, inside &lt;code&gt;astro.config.mjs&lt;/code&gt;, by reading every &lt;code&gt;.mdx&lt;/code&gt; / &lt;code&gt;.md&lt;/code&gt; under &lt;code&gt;src/content/blog/{en,ja}/&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;js&quot;&gt;&lt;code&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; { readdir, readFile } &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &amp;quot;node:fs/promises&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:#F97583&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; { join } &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &amp;quot;node:path&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&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;async&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; function&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; buildBlogLastmodMap&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; map&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; new&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; Map&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; lang&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; of&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;en&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;ja&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:#F97583&quot;&gt;    const&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; dir&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; join&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(process.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;cwd&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(), &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;src&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;content&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;blog&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, lang);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    let&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; files &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&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    try&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;      files &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; await&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; readdir&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(dir);&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;catch&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;      continue&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:#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; file&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; of&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; files) {&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;file.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;endsWith&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;.mdx&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; !&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;file.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;endsWith&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;.md&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;continue&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; slug&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; file.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;replace&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#85E89D;font-weight:bold&quot;&gt;\.&lt;/span&gt;&lt;span style=&quot;color:#DBEDFF&quot;&gt;(mdx&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;|&lt;/span&gt;&lt;span style=&quot;color:#DBEDFF&quot;&gt;md)&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;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;&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:#F97583&quot;&gt;      const&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; raw&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; await&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; readFile&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;join&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(dir, file), &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;utf8&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:#F97583&quot;&gt;      const&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; fm&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:#F97583&quot;&gt;^&lt;/span&gt;&lt;span style=&quot;color:#DBEDFF&quot;&gt;---&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;\n&lt;/span&gt;&lt;span style=&quot;color:#DBEDFF&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;[\s\S]&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;*?&lt;/span&gt;&lt;span style=&quot;color:#DBEDFF&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;\n&lt;/span&gt;&lt;span style=&quot;color:#DBEDFF&quot;&gt;---&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 style=&quot;color:#B392F0&quot;&gt;exec&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(raw);&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;fm) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;continue&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; front&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; fm[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&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:#9ECBFF&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;^&lt;/span&gt;&lt;span style=&quot;color:#DBEDFF&quot;&gt;draft:&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;\s&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#DBEDFF&quot;&gt;true&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;m&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;test&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(front)) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;continue&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; updated&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:#F97583&quot;&gt;^&lt;/span&gt;&lt;span style=&quot;color:#DBEDFF&quot;&gt;updatedDate:&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;\s&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#DBEDFF&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;\S&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#DBEDFF&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;m&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;exec&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(front);&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; pub&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:#F97583&quot;&gt;^&lt;/span&gt;&lt;span style=&quot;color:#DBEDFF&quot;&gt;pubDate:&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;\s&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#DBEDFF&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;\S&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#DBEDFF&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;m&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;exec&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(front);&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; dateStr&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (updated &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; updated[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&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; (pub &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; pub[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&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;dateStr) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;continue&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; d&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; new&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; Date&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(dateStr);&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; (Number.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;isNaN&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(d.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;getTime&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;())) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;continue&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; path&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; lang &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;===&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &amp;quot;ja&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; ?&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; `/ja/blog/${&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;slug&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;}/`&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; :&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; `/blog/${&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;slug&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;      map.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;set&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(path, d.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;toISOString&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:#F97583&quot;&gt;  return&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; map;&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:#F97583&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; blogLastmod&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; await&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; buildBlogLastmodMap&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;The reason &lt;code&gt;getCollection(&amp;quot;blog&amp;quot;)&lt;/code&gt; isn’t used here: &lt;code&gt;astro.config.mjs&lt;/code&gt; evaluates &lt;strong&gt;before the content loader is initialised&lt;/strong&gt;. The Content Collections API simply isn’t available when the config is being read.&lt;/p&gt;
&lt;p&gt;Frontmatter is read with a light regex. There’s no need to fully parse MDX — only &lt;code&gt;updatedDate&lt;/code&gt; and &lt;code&gt;pubDate&lt;/code&gt; matter for the lastmod map, and adding a YAML parser as a dependency for two fields isn’t worth it. Type-safety is sacrificed at this layer, but the Zod schema validates every post during the actual build, so the safety net moves up one step rather than disappearing.&lt;/p&gt;
&lt;p&gt;Skipping &lt;code&gt;draft: true&lt;/code&gt; posts here is important. If they leak through, draft URLs end up in the sitemap, which is the opposite of what &lt;code&gt;draft: true&lt;/code&gt; is supposed to express.&lt;/p&gt;
&lt;h2 id=&quot;feeding-the-map-into-serialize&quot;&gt;Feeding the map into &lt;code&gt;serialize&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;serialize&lt;/code&gt; option on &lt;code&gt;@astrojs/sitemap&lt;/code&gt; is a hook that rewrites each emitted URL entry. The map gets looked up by URL path and the result is dropped into &lt;code&gt;item.lastmod&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;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&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;  i18n: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    defaultLocale: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;en&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:#E1E4E8&quot;&gt;    locales: { en: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;en&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, ja: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;ja&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:#E1E4E8&quot;&gt;  },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  serialize&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;item&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; url&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; new&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; URL&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(item.url);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;    // Strip the /ja/ prefix so /ja/blog/foo/ and /blog/foo/ both&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;    // hit the same changefreq / priority branch. lastmod lookup&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;    // still uses the original url.pathname so the map keys match.&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; pathname&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; url.pathname.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;replace&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;^&lt;/span&gt;&lt;span style=&quot;color:#85E89D;font-weight:bold&quot;&gt;\/&lt;/span&gt;&lt;span style=&quot;color:#DBEDFF&quot;&gt;ja&lt;/span&gt;&lt;span style=&quot;color:#85E89D;font-weight:bold&quot;&gt;\/&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 style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;/&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;).&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;replace&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;^&lt;/span&gt;&lt;span style=&quot;color:#85E89D;font-weight:bold&quot;&gt;\/&lt;/span&gt;&lt;span style=&quot;color:#DBEDFF&quot;&gt;ja&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;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;/&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:#F97583&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (pathname &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;===&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &amp;quot;/&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:#E1E4E8&quot;&gt;      item.changefreq &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &amp;quot;daily&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:#E1E4E8&quot;&gt;      item.priority &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1.0&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 style=&quot;color:#F97583&quot;&gt;else&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (pathname &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;===&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &amp;quot;/blog/&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:#E1E4E8&quot;&gt;      item.changefreq &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &amp;quot;daily&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:#E1E4E8&quot;&gt;      item.priority &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0.9&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 style=&quot;color:#F97583&quot;&gt;else&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (pathname.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;startsWith&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;/blog/&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:#E1E4E8&quot;&gt;      item.changefreq &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &amp;quot;monthly&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:#E1E4E8&quot;&gt;      item.priority &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0.7&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; lastmod&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; blogLastmod.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;get&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(url.pathname);&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; (lastmod) item.lastmod &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; lastmod;&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;else&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (pathname.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;startsWith&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;/products/&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:#E1E4E8&quot;&gt;      item.changefreq &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &amp;quot;monthly&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:#E1E4E8&quot;&gt;      item.priority &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0.8&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 style=&quot;color:#F97583&quot;&gt;else&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;      item.changefreq &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &amp;quot;monthly&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:#E1E4E8&quot;&gt;      item.priority &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0.5&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:#F97583&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; item;&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;&lt;code&gt;changefreq&lt;/code&gt; and &lt;code&gt;priority&lt;/code&gt; go in the same hook so each path category gets a consistent value. &lt;code&gt;priority&lt;/code&gt; is officially “ignored” by Google these days, but Bing and the AI crawlers still read it, so I keep it consistent rather than dropping it entirely.&lt;/p&gt;
&lt;p&gt;Stripping &lt;code&gt;/ja/&lt;/code&gt; for the branch decision but not for the lookup matters: the lookup needs to keep the language prefix because the map was built with &lt;code&gt;/ja/blog/foo/&lt;/code&gt; and &lt;code&gt;/blog/foo/&lt;/code&gt; as distinct keys.&lt;/p&gt;
&lt;h2 id=&quot;filtering-out-paginated-noindex-pages&quot;&gt;Filtering out paginated &lt;code&gt;noindex&lt;/code&gt; pages&lt;/h2&gt;
&lt;p&gt;Page 2 and beyond of the category listings (&lt;code&gt;/blog/build/2/&lt;/code&gt;, &lt;code&gt;/blog/reviews/3/&lt;/code&gt;, …) ship a &lt;code&gt;&amp;lt;meta name=&amp;quot;robots&amp;quot; content=&amp;quot;noindex, follow&amp;quot;&amp;gt;&lt;/code&gt;. Only page 1 should be indexed; later pages are crawlable but not index-eligible.&lt;/p&gt;
&lt;p&gt;Leave those URLs in the sitemap and the signal collides. “Listed in sitemap” reads as “please index this”, which contradicts &lt;code&gt;noindex&lt;/code&gt;. Google and Bing both treat that conflict as a quality smell, and there’s no upside to keeping them in.&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:#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:#B392F0&quot;&gt;  filter&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: (&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;page&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;    if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (page.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;endsWith&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;/404/&amp;quot;&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; page.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;endsWith&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;/404&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; false&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:#6A737D&quot;&gt;    // Paginated category pages (/blog/build/2/, /blog/reviews/3/ ...)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;    // are noindex, follow — drop them from the sitemap to avoid&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;    // contradicting the meta robots tag.&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:#9ECBFF&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#85E89D;font-weight:bold&quot;&gt;\/&lt;/span&gt;&lt;span style=&quot;color:#DBEDFF&quot;&gt;blog&lt;/span&gt;&lt;span style=&quot;color:#85E89D;font-weight:bold&quot;&gt;\/&lt;/span&gt;&lt;span style=&quot;color:#DBEDFF&quot;&gt;(build&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;|&lt;/span&gt;&lt;span style=&quot;color:#DBEDFF&quot;&gt;reviews)&lt;/span&gt;&lt;span style=&quot;color:#85E89D;font-weight:bold&quot;&gt;\/&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;\d&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#85E89D;font-weight:bold&quot;&gt;\/&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;.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;test&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; URL&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(page).pathname)) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; false&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;    return&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;  },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&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;If you set &lt;code&gt;noindex&lt;/code&gt; on paginated pages, dropping them from the sitemap is the matching half of the change. Doing one without the other leaves a half-fixed signal.&lt;/p&gt;
&lt;h2 id=&quot;how-the-pieces-connect&quot;&gt;How the pieces connect&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;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;flowchart LR&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  MDX[src/content/blog/&amp;amp;lt;lang&amp;amp;gt;/&amp;amp;lt;slug&amp;amp;gt;.mdx]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  Map[blogLastmod Map&amp;lt;br/&amp;gt;path → ISO date]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  Pages[@astrojs/sitemap&amp;lt;br/&amp;gt;URL list]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  Filter[filter:&amp;lt;br/&amp;gt;drop noindex]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  Serialize[serialize:&amp;lt;br/&amp;gt;lastmod / changefreq / priority]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  SM[sitemap.xml]&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;  MDX --&amp;gt;|fs.readdir + regex| Map&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  Map --&amp;gt;|lookup| Serialize&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  Pages --&amp;gt; Filter&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  Filter --&amp;gt; Serialize&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  Serialize --&amp;gt; SM&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Two pipelines run inside &lt;code&gt;astro.config.mjs&lt;/code&gt;. One walks MDX before the build starts and produces the lastmod map. The other is the standard Astro routing, whose URL list is filtered down and then enriched per-entry in &lt;code&gt;serialize&lt;/code&gt;. Both converge into the final &lt;code&gt;sitemap.xml&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&quot;things-i-almost-got-wrong&quot;&gt;Things I almost got wrong&lt;/h2&gt;
&lt;p&gt;A short list of pitfalls picked up while writing this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Top-level &lt;code&gt;await&lt;/code&gt;&lt;/strong&gt;: works because &lt;code&gt;astro.config.mjs&lt;/code&gt; is evaluated as ESM. Older repo layouts that still use &lt;code&gt;astro.config.cjs&lt;/code&gt; won’t accept top-level await, and would need either a &lt;code&gt;.mjs&lt;/code&gt; rename or an async wrapper inside &lt;code&gt;defineConfig&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;draft: true&lt;/code&gt; filtering&lt;/strong&gt;: skipping drafts in the map builder is necessary. Otherwise draft URLs land in the sitemap, which contradicts the whole point of marking them as drafts&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Regex tightness&lt;/strong&gt;: &lt;code&gt;/^updatedDate:\s*(\S+)/m&lt;/code&gt; reads unquoted YAML like &lt;code&gt;updatedDate: 2026-05-25&lt;/code&gt;. Quoted strings still work because &lt;code&gt;\S+&lt;/code&gt; captures &lt;code&gt;&amp;quot;2026-05-25&amp;quot;&lt;/code&gt; whole and &lt;code&gt;new Date()&lt;/code&gt; can parse it, but be aware if you ever use multi-line or list-style date values&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Per-language folder merge&lt;/strong&gt;: en and ja are walked separately and merged into a single map. Keys are kept distinct (&lt;code&gt;/blog/&amp;lt;slug&amp;gt;/&lt;/code&gt; vs &lt;code&gt;/ja/blog/&amp;lt;slug&amp;gt;/&lt;/code&gt;) so the lookup inside &lt;code&gt;serialize&lt;/code&gt; resolves correctly&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;updatedDate&lt;/code&gt; discipline&lt;/strong&gt;: implementation alone isn’t enough — bumping &lt;code&gt;updatedDate&lt;/code&gt; for trivial edits will still poison the signal. The matching policy lives in &lt;a href=&quot;https://github.com/aulvem/aulvem-hp/blob/main/docs/content-rules.md&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;content rules A-2-1&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;when-this-should-move-back-into-the-official-integration&quot;&gt;When this should move back into the official integration&lt;/h2&gt;
&lt;p&gt;Honestly, this code is the shape of a &lt;code&gt;@astrojs/sitemap&lt;/code&gt; feature request. Coupling Content Collections to the sitemap helper is a need other Astro users will have, and there’s room to generalize it as an option.&lt;/p&gt;
&lt;p&gt;For now it lives inside Aulvem’s config at ~30 lines, which is a size I’m comfortable maintaining. If the official integration ever ships a Content Collections bridge, the bespoke code drops away. Keeping it isolated to &lt;code&gt;astro.config.mjs&lt;/code&gt; makes that removal cheap.&lt;/p&gt;
&lt;h2 id=&quot;wrap-up&quot;&gt;Wrap-up&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;lastmod&lt;/code&gt; is a freshness signal that matters in both classic SEO and AI search, so feeding it real values from &lt;code&gt;updatedDate&lt;/code&gt; is worth the 30 lines of bespoke code. Drop paginated &lt;code&gt;noindex&lt;/code&gt; pages from the sitemap at the same time — handling them separately leaves the signal half-fixed.&lt;/p&gt;
&lt;p&gt;The first follow-up in this series is on using the Zod schema to enforce operational rules at build time → &lt;a href=&quot;https://aulvem.com/blog/2026-05-23-aulvem-zod-schema-enforcement/&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;Pushing operational rules into Astro Content Collections with Zod&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;faq&quot;&gt;FAQ&lt;/h2&gt;
&lt;h3 id=&quot;why-doesnt-astrojssitemap-read-updateddate-on-its-own&quot;&gt;Why doesn’t &lt;code&gt;@astrojs/sitemap&lt;/code&gt; read &lt;code&gt;updatedDate&lt;/code&gt; on its own?&lt;/h3&gt;
&lt;p&gt;The integration takes the list of built URLs and emits a sitemap.xml — it doesn’t reach into Content Collection frontmatter. Pulling MDX shape into a generic sitemap integration would mean coupling it to collection names, schemas, and loader types, which doesn’t sit well as a default responsibility.&lt;/p&gt;
&lt;h3 id=&quot;isnt-reading-frontmatter-through-fsreaddir--regex-unsafe-compared-to-the-content-collections-api&quot;&gt;Isn’t reading frontmatter through &lt;code&gt;fs.readdir&lt;/code&gt; + regex unsafe compared to the Content Collections API?&lt;/h3&gt;
&lt;p&gt;It’s not type-safe. But &lt;code&gt;astro.config.mjs&lt;/code&gt; evaluates before the content loader is initialised, so the API isn’t available at this point. The only fields the lastmod map needs are &lt;code&gt;updatedDate&lt;/code&gt; and &lt;code&gt;pubDate&lt;/code&gt;, so a light regex pass keeps the dependency surface flat. The real type check runs at build time through the Zod schema, so there are two nets, not one.&lt;/p&gt;
&lt;h3 id=&quot;is-it-really-wrong-to-ship-noindex-urls-in-the-sitemap&quot;&gt;Is it really wrong to ship &lt;code&gt;noindex&lt;/code&gt; URLs in the sitemap?&lt;/h3&gt;
&lt;p&gt;It’s a contradictory signal. A sitemap is a list of URLs you want indexed, so a &lt;code&gt;noindex&lt;/code&gt; entry collides with that intent. Google and Bing both treat the conflict as a quality smell that can drag the site-wide signal down.&lt;/p&gt;
&lt;h3 id=&quot;does-putting-a-real-date-in-lastmod-actually-move-ai-search-citations&quot;&gt;Does putting a real date in &lt;code&gt;lastmod&lt;/code&gt; actually move AI search citations?&lt;/h3&gt;
&lt;p&gt;I haven’t measured the lift directly. What the docs do say — Google, Bing, and the AI search vendors — is that &lt;code&gt;lastmod&lt;/code&gt; is a freshness hint and that bogus values erode trust. Treating it as insurance against losing existing trust feels more honest than claiming a citation uplift.&lt;/p&gt;</content:encoded><category>build</category><category>astro</category><category>sitemap</category><category>seo</category><category>site-architecture</category></item><item><title>Pushing operational rules into Astro Content Collections with Zod</title><link>https://aulvem.com/blog/2026-05-23-aulvem-zod-schema-enforcement/</link><guid isPermaLink="true">https://aulvem.com/blog/2026-05-23-aulvem-zod-schema-enforcement/</guid><description>How Aulvem pushes blog operational rules into the Zod schema in src/content.config.ts. .refine() ties two fields together, howto/faq objects keep structured data typed, and a grep validator covers what Zod can&apos;t reach.</description><pubDate>Sat, 23 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Written rules get forgotten.&lt;/p&gt;
&lt;p&gt;When you run a blog alone, the writer (you) breaks the writer’s (your) own rules sooner or later. Forgetting &lt;code&gt;affiliate: true&lt;/code&gt; on a &lt;code&gt;category: reviews&lt;/code&gt; post — and shipping it without the ad disclosure — is the kind of mistake a README check-list doesn’t catch.&lt;/p&gt;
&lt;p&gt;Aulvem leans on &lt;a href=&quot;https://docs.astro.build/en/guides/content-collections/&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;Astro Content Collections&lt;/a&gt; and &lt;a href=&quot;https://zod.dev/&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;Zod&lt;/a&gt; to make rules that a machine can verify into build failures. What follows is where I draw the line between “let the schema catch it”, “let a lint script catch it”, and “leave it to review”.&lt;/p&gt;
&lt;p&gt;This post is a follow-up to &lt;a href=&quot;https://aulvem.com/blog/2026-05-17-aulvem-blog-architecture/&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;How this blog is built&lt;/a&gt;, which sets up the stack overview.&lt;/p&gt;
&lt;h2 id=&quot;why-a-readme-isnt-enough&quot;&gt;Why a README isn’t enough&lt;/h2&gt;
&lt;p&gt;A rule that lives only in a README has roughly zero enforcement.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The editor, reviewer, and writer are the same person, so there’s no second pair of eyes&lt;/li&gt;
&lt;li&gt;Weeks later, the README isn’t going to be re-read line by line&lt;/li&gt;
&lt;li&gt;Past me I trust; future me will plainly forget&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I started with a checklist under &lt;code&gt;docs/&lt;/code&gt; and assumed that would be enough. By the third post I’d already missed an item. With no reviewer in the loop, the only way to force a rule is to put the check outside the writing flow — in the build. That’s why Aulvem leans on schema enforcement.&lt;/p&gt;
&lt;h2 id=&quot;the-schema-in-one-file&quot;&gt;The schema, in one file&lt;/h2&gt;
&lt;p&gt;The Content Collections schema sits in &lt;code&gt;src/content.config.ts&lt;/code&gt; with two collections (&lt;code&gt;blog&lt;/code&gt; and &lt;code&gt;services&lt;/code&gt;) declared together. Keeping them in one file means shared shapes (&lt;code&gt;pubDate&lt;/code&gt;, &lt;code&gt;updatedDate&lt;/code&gt;, &lt;code&gt;heroImage&lt;/code&gt;) can be moved into local helpers without crossing file boundaries.&lt;/p&gt;
&lt;p&gt;The blog schema looks like this (abridged):&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;import&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; { defineCollection, z } &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &amp;quot;astro:content&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:#F97583&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; { glob } &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &amp;quot;astro/loaders&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&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; blog&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;quot;**/[^_]*.{md,mdx}&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, base: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;./src/content/blog&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:#E1E4E8&quot;&gt;  schema: z&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;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;      title: 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&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      summary: 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;      pubDate: z.coerce.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;date&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;      updatedDate: z.coerce.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;date&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;      category: z.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;enum&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;([&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;build&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;reviews&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:#E1E4E8&quot;&gt;      tags: z.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;array&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(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;default&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;      draft: z.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;boolean&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 style=&quot;color:#79B8FF&quot;&gt;false&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;      affiliate: z.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;boolean&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 style=&quot;color:#79B8FF&quot;&gt;false&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;      heroImage: 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;      heroAlt: 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;      howto: 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 style=&quot;color:#6A737D&quot;&gt;/* ... */&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;      faq: z.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;array&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(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;        question: 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;        answer: 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;      })).&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 style=&quot;color:#B392F0&quot;&gt;refine&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;((&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;data&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; (data.category &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;===&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &amp;quot;reviews&amp;quot;&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; data.affiliate, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      message: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;affiliate must be true iff category is &amp;#39;reviews&amp;#39;&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:#E1E4E8&quot;&gt;      path: [&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;affiliate&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:#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;&lt;code&gt;z.enum&lt;/code&gt; pins the category to two values, &lt;code&gt;z.coerce.date&lt;/code&gt; swallows whatever date-string format the YAML emits, and &lt;code&gt;.optional()&lt;/code&gt; + &lt;code&gt;.default()&lt;/code&gt; are explicit about which fields the writer can leave blank. Plain tools cover most of the surface. The interesting work is the &lt;code&gt;.refine()&lt;/code&gt; at the bottom, which is what the next section is about.&lt;/p&gt;
&lt;h2 id=&quot;coupling-two-fields-with-refine&quot;&gt;Coupling two fields with &lt;code&gt;.refine()&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;When two fields must move together, I tack a &lt;code&gt;.refine()&lt;/code&gt; onto the end of the schema. The case in Aulvem: a &lt;code&gt;category: reviews&lt;/code&gt; post is, by affiliate-network rules, advertising, and has to carry the disclosure banner. Aulvem injects the banner (and adds &lt;code&gt;rel=&amp;quot;sponsored noopener noreferrer&amp;quot;&lt;/code&gt;) only when &lt;code&gt;affiliate: true&lt;/code&gt;. So the failure mode is publishing a review post with &lt;code&gt;affiliate&lt;/code&gt; left at its default — disclosure missing, sponsored rel missing, ASP terms broken.&lt;/p&gt;
&lt;p&gt;Here’s the one-liner that catches it:&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:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;refine&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;((&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;data&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; (data.category &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;===&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &amp;quot;reviews&amp;quot;&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; data.affiliate, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  message: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;affiliate must be true iff category is &amp;#39;reviews&amp;#39;&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:#E1E4E8&quot;&gt;  path: [&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;affiliate&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:#E1E4E8&quot;&gt;})&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Both sides compared with &lt;code&gt;===&lt;/code&gt; means changing only one is a build failure. Reading the predicate as “these two are always equal” is clearer than writing the XOR explicitly — it’s the same logic, easier to scan three months later.&lt;/p&gt;
&lt;p&gt;The build error reads 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;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;[ContentEntryInvalidError] Content config error in `blog → 2026-05-...`:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;affiliate must be true iff category is &amp;#39;reviews&amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  at affiliate&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;message&lt;/code&gt; ends up in the output verbatim, so it’s worth writing the message as instructions for future-you.&lt;/p&gt;
&lt;h3 id=&quot;refine-vs-superrefine&quot;&gt;&lt;code&gt;.refine&lt;/code&gt; vs &lt;code&gt;.superRefine&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Once you need more than one independent constraint on the same object, or per-field error messages, &lt;code&gt;.superRefine()&lt;/code&gt; is the easier shape:&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:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;superRefine&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;((&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;data&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;ctx&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;  if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (data.category &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;===&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &amp;quot;reviews&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; !&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;data.affiliate) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    ctx.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;addIssue&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;      code: z.ZodIssueCode.custom,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      message: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;reviews posts must set affiliate: true&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:#E1E4E8&quot;&gt;      path: [&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;affiliate&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:#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:#F97583&quot;&gt;  if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (data.draft &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; data.updatedDate) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    ctx.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;addIssue&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;      code: z.ZodIssueCode.custom,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      message: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;draft posts should not carry updatedDate&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:#E1E4E8&quot;&gt;      path: [&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;updatedDate&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:#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;For a single relationship between two fields, &lt;code&gt;.refine()&lt;/code&gt; is still the lighter option.&lt;/p&gt;
&lt;h2 id=&quot;typing-structured-data-inside-frontmatter&quot;&gt;Typing structured data inside frontmatter&lt;/h2&gt;
&lt;p&gt;I keep the data for the &lt;code&gt;HowTo&lt;/code&gt; and &lt;code&gt;FAQPage&lt;/code&gt; JSON-LD blocks &lt;strong&gt;in frontmatter&lt;/strong&gt; rather than parsing the body. The reasons:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Parsing MDX headings to reconstruct structured data is brittle — a heading rename quietly breaks JSON-LD&lt;/li&gt;
&lt;li&gt;Frontmatter is what Zod validates, so the shape is enforced for free&lt;/li&gt;
&lt;li&gt;The JSON-LD generator can trust frontmatter without re-reading MDX&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The schema looks like:&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;howto&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: 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 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;  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;  totalTime: 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;  steps: z.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;array&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(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;    text: 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;    image: 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 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:#B392F0&quot;&gt;faq&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;(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;  question: 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;  answer: 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;})).&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;/code&gt;&lt;/pre&gt;
&lt;p&gt;Anything malformed — a &lt;code&gt;howto&lt;/code&gt; with no steps, a &lt;code&gt;faq&lt;/code&gt; entry missing &lt;code&gt;answer&lt;/code&gt; — fails the build.&lt;/p&gt;
&lt;h2 id=&quot;where-zod-cant-reach-body-parity&quot;&gt;Where Zod can’t reach: body parity&lt;/h2&gt;
&lt;p&gt;Zod only inspects frontmatter. &lt;strong&gt;The body MDX is outside its scope.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Google’s quality guidelines flag “JSON-LD that has no body counterpart” as structured-data mismatch and pull the rich-result eligibility. A post with FAQ questions only in frontmatter — never echoed in the body — passes the schema and silently disqualifies itself.&lt;/p&gt;
&lt;p&gt;The fix is a separate layer. Aulvem runs a &lt;code&gt;validate-schema-match.mjs&lt;/code&gt; script that grep-checks the body for each &lt;code&gt;faq[].question&lt;/code&gt; and &lt;code&gt;howto.steps[].name&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;js&quot;&gt;&lt;code&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; (Array.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;isArray&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(data?.faq)) {&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:#E1E4E8&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;i&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;item&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;of&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; data.faq.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;entries&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;item?.question) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;continue&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;bodyNorm.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;includes&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;normalise&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(item.question))) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      mismatches.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;push&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;        `faq[${&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;i&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;}].question not found in body: &amp;quot;${&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;item&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;question&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;}&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:#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;/code&gt;&lt;/pre&gt;
&lt;p&gt;It normalises whitespace and case, then checks for substring presence. If something is missing, the script returns exit code 1 and the build is blocked at the pre-commit / CI layer.&lt;/p&gt;
&lt;p&gt;What it can’t catch: meaning. If the question matches but the answer underneath got swapped during editing, this layer says it’s fine.&lt;/p&gt;
&lt;h2 id=&quot;what-i-gave-up-automating&quot;&gt;What I gave up automating&lt;/h2&gt;
&lt;p&gt;Things neither the schema nor the grep validator can see:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Whether the FAQ answer is factually correct&lt;/li&gt;
&lt;li&gt;How strong the disclosure language is (affiliate networks differ on what counts)&lt;/li&gt;
&lt;li&gt;Whether the closing paragraph still reads like an AI draft&lt;/li&gt;
&lt;li&gt;Whether the conclusion lines up with the article’s claim&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These need a human read-through. Trying to encode them as a schema rule would cost more than the manual review they replace. I keep them in the pre-publish checklist and only push the patterns mechanically catchable (&lt;code&gt;lint-banned-phrases.mjs&lt;/code&gt; for AI-tells) into automation.&lt;/p&gt;
&lt;p&gt;The point isn’t “automate everything I can”. It’s deciding where build failures buy you more than they cost. With one person on the keyboard, automation time is finite, and that ratio matters.&lt;/p&gt;
&lt;h2 id=&quot;the-schema--lint--review-split&quot;&gt;The schema / lint / review split&lt;/h2&gt;
&lt;p&gt;Splitting rules across three layers makes “which layer should hold this?” answerable:&lt;/p&gt;





























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Layer&lt;/th&gt;&lt;th&gt;When it fires&lt;/th&gt;&lt;th&gt;What it catches&lt;/th&gt;&lt;th&gt;What it misses&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Zod schema&lt;/td&gt;&lt;td&gt;&lt;code&gt;astro build&lt;/code&gt;&lt;/td&gt;&lt;td&gt;types, enums, required/optional, field-to-field relationships&lt;/td&gt;&lt;td&gt;meaning, body-to-frontmatter parity&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Lint script&lt;/td&gt;&lt;td&gt;pre-commit, CI&lt;/td&gt;&lt;td&gt;banned phrases, body/frontmatter substring parity&lt;/td&gt;&lt;td&gt;meaning&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Review&lt;/td&gt;&lt;td&gt;pre-publish checklist&lt;/td&gt;&lt;td&gt;meaning, disclosure strength, AI-tell judgment&lt;/td&gt;&lt;td&gt;not automatable&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Rule of thumb: if a higher layer can catch it, don’t push it down. Writing field-level constraints into a lint script means the build doesn’t fail and you have to remember to run the script. Pushing simple substring checks into Zod, conversely, makes the schema type definition harder to read.&lt;/p&gt;
&lt;h2 id=&quot;wrap-up&quot;&gt;Wrap-up&lt;/h2&gt;
&lt;p&gt;Structural constraints a machine can check go in the schema. Substring presence goes in lint. Meaning stays with review. Once that split is in place, every new operational rule can be sized against “which layer holds this?” instead of “where do I update the README?”.&lt;/p&gt;
&lt;p&gt;The full Aulvem stack overview is in &lt;a href=&quot;https://aulvem.com/blog/2026-05-17-aulvem-blog-architecture/&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;How this blog is built&lt;/a&gt;, if you want the bigger picture.&lt;/p&gt;
&lt;p&gt;The same “frontmatter as the single source of truth” idea also drives the sitemap &lt;code&gt;lastmod&lt;/code&gt; setup — written up separately in &lt;a href=&quot;https://aulvem.com/blog/2026-05-25-aulvem-sitemap-lastmod/&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;Reading sitemap lastmod from MDX frontmatter&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;faq&quot;&gt;FAQ&lt;/h2&gt;
&lt;h3 id=&quot;when-do-you-reach-for-superrefine-over-refine&quot;&gt;When do you reach for &lt;code&gt;.superRefine&lt;/code&gt; over &lt;code&gt;.refine&lt;/code&gt;?&lt;/h3&gt;
&lt;p&gt;When one object needs more than one independent constraint, or when each issue needs its own message and path. For a single relationship between two fields, &lt;code&gt;.refine()&lt;/code&gt; is enough. Aulvem only ties category and affiliate together, so it stays on &lt;code&gt;.refine()&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&quot;why-keep-howto-and-faq-inside-the-frontmatter-instead-of-separate-files&quot;&gt;Why keep howto and faq inside the frontmatter instead of separate files?&lt;/h3&gt;
&lt;p&gt;Frontmatter gives me one source of truth that’s typed. Splitting them across files means the body, JSON-LD, and metadata each have their own home and have to be kept in sync by hand. Frontmatter as the source, JSON-LD generated from it, and the body echoing the same strings is the configuration with the fewest seams.&lt;/p&gt;
&lt;h3 id=&quot;what-happens-to-existing-posts-when-i-change-the-schema&quot;&gt;What happens to existing posts when I change the schema?&lt;/h3&gt;
&lt;p&gt;The build breaks. Adding a required field means every existing post needs the field before &lt;code&gt;astro build&lt;/code&gt; will pass again. That’s intentional — a schema change forces you to confirm the rollout reach across every post.&lt;/p&gt;
&lt;h3 id=&quot;why-isnt-the-body-to-json-ld-parity-check-wired-into-astro-build&quot;&gt;Why isn’t the body-to-JSON-LD parity check wired into &lt;code&gt;astro build&lt;/code&gt;?&lt;/h3&gt;
&lt;p&gt;To keep build time small. The parity check is a separate grep-based script run in pre-commit and CI. Folding it into the build itself would slow &lt;code&gt;astro dev&lt;/code&gt; startup, which would hurt the writing loop.&lt;/p&gt;</content:encoded><category>build</category><category>astro</category><category>content-collections</category><category>zod</category><category>site-architecture</category></item><item><title>How this blog is built — Aulvem on Astro 5 and Content Collections</title><link>https://aulvem.com/blog/2026-05-17-aulvem-blog-architecture/</link><guid isPermaLink="true">https://aulvem.com/blog/2026-05-17-aulvem-blog-architecture/</guid><description>Aulvem runs on Astro 5 + MDX + Content Collections, with operational rules enforced by a Zod schema and rehype plugins. A map of the stack and the pieces that hold it together.</description><pubDate>Sun, 17 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This post is the starting point for documenting how Aulvem is built — not as a stack tour, but as a map of what we enforce through the schema and what we deliberately leave out. The stack itself is just Astro + MDX + Content Collections — nothing special there. What I want to write about is the design work on top of that: how operational rules a writer tends to forget get pushed into build-time checks.&lt;/p&gt;
&lt;p&gt;The overview hub goes here. The individual decisions (schema enforcement, structured-data parity, custom sitemap lastmod) are split into follow-up posts.&lt;/p&gt;
&lt;h2 id=&quot;stack-overview--astro-5--mdx--content-collections--r2&quot;&gt;Stack overview — Astro 5 + MDX + Content Collections + R2&lt;/h2&gt;
&lt;p&gt;Aulvem runs on Astro 5 (static output) + MDX + Content Collections + Tailwind 3 + Pagefind + Cloudflare R2. There’s no dynamic server — the site is just pre-built HTML served from Cloudflare Pages.&lt;/p&gt;
&lt;p&gt;I narrowed the selection criteria to three points:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the build output is fully static&lt;/li&gt;
&lt;li&gt;post metadata can be locked down by a schema&lt;/li&gt;
&lt;li&gt;the core has a small dependency tree&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Astro 5 met all three. The other features — partial hydration, UI framework integration, and so on — aren’t being used right now.&lt;/p&gt;
&lt;p&gt;Whether Astro is the right pick depends on the requirements. If you want to layer on dynamic auth, comments, or subscriptions, something like Next.js is a better fit.&lt;/p&gt;
&lt;h2 id=&quot;definition-what-content-collections-is&quot;&gt;Definition: what Content Collections is&lt;/h2&gt;
&lt;aside class=&quot;term-callout&quot;&gt;&lt;p&gt;&lt;strong&gt;Content Collections&lt;/strong&gt;: An Astro built-in that treats Markdown / MDX as typed content. Define a &lt;a href=&quot;https://zod.dev/&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;Zod&lt;/a&gt; schema per collection and Astro validates every frontmatter at build time — mismatches break the build. You can also pull the whole collection as a typed array.&lt;/p&gt;&lt;/aside&gt;
&lt;p&gt;Aulvem defines two collections: &lt;code&gt;blog&lt;/code&gt; (posts) and &lt;code&gt;services&lt;/code&gt; (product pages). The schema lives in a single file and is validated at build time for both collections.&lt;/p&gt;
&lt;h2 id=&quot;full-stack--the-main-packages&quot;&gt;Full stack — the main packages&lt;/h2&gt;
&lt;p&gt;Runtime dependencies are kept to eight packages.&lt;/p&gt;


















































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Package&lt;/th&gt;&lt;th&gt;Use&lt;/th&gt;&lt;th&gt;Notes&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;astro&lt;/code&gt; ^5&lt;/td&gt;&lt;td&gt;SSG core&lt;/td&gt;&lt;td&gt;static output only&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;@astrojs/mdx&lt;/code&gt; ^4&lt;/td&gt;&lt;td&gt;MDX support&lt;/td&gt;&lt;td&gt;all posts are &lt;code&gt;.mdx&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;@astrojs/sitemap&lt;/code&gt; ^3&lt;/td&gt;&lt;td&gt;sitemap generation&lt;/td&gt;&lt;td&gt;&lt;code&gt;lastmod&lt;/code&gt; injected manually&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;@astrojs/rss&lt;/code&gt; ^4&lt;/td&gt;&lt;td&gt;RSS generation&lt;/td&gt;&lt;td&gt;full &lt;code&gt;content:encoded&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;@astrojs/tailwind&lt;/code&gt; ^6&lt;/td&gt;&lt;td&gt;Tailwind integration&lt;/td&gt;&lt;td&gt;&lt;code&gt;applyBaseStyles: false&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;rehype-external-links&lt;/code&gt; ^3&lt;/td&gt;&lt;td&gt;rel attributes on external links&lt;/td&gt;&lt;td&gt;&lt;code&gt;noopener noreferrer&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;rehype-mermaid&lt;/code&gt; ^3&lt;/td&gt;&lt;td&gt;Build-time mermaid → SVG&lt;/td&gt;&lt;td&gt;&lt;code&gt;inline-svg&lt;/code&gt; strategy&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;tailwindcss&lt;/code&gt; ^3.4&lt;/td&gt;&lt;td&gt;styling&lt;/td&gt;&lt;td&gt;holding off on v4&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;On the dev side: &lt;code&gt;pagefind&lt;/code&gt; (full-text search), &lt;code&gt;sharp&lt;/code&gt; (local image processing), &lt;code&gt;playwright&lt;/code&gt; (build-time SVG rendering for mermaid), &lt;code&gt;typescript&lt;/code&gt;, and &lt;code&gt;@types/node&lt;/code&gt;. No React, no Vue, no Vite plugins.&lt;/p&gt;
&lt;p&gt;The opening rule is: don’t add a dependency on the hope it’ll be useful later. Unused dependencies show up in both build time and security-alert noise, so before adding one I check whether the use case is articulable in a sentence.&lt;/p&gt;
&lt;h2 id=&quot;three-pieces-i-wouldnt-drop&quot;&gt;Three pieces I wouldn’t drop&lt;/h2&gt;
&lt;h3 id=&quot;1-enforce-rules-through-the-schema&quot;&gt;1. Enforce rules through the schema&lt;/h3&gt;
&lt;p&gt;Operational rules don’t live in the README — they live in the frontmatter schema. I wanted the build to fail when a writer (including me) forgets, instead of leaning on memory.&lt;/p&gt;
&lt;p&gt;For example, &lt;code&gt;category: reviews&lt;/code&gt; posts have to be flagged as advertising under affiliate-network rules, so I require &lt;code&gt;affiliate: true&lt;/code&gt; on them. Instead of leaving this as a line in the README, Zod’s &lt;code&gt;.refine()&lt;/code&gt; forces &lt;code&gt;category === &amp;quot;reviews&amp;quot;&lt;/code&gt; and &lt;code&gt;affiliate === true&lt;/code&gt; to always be equivalent. Changing only one side breaks the build, so memory isn’t the load-bearing piece.&lt;/p&gt;
&lt;p&gt;The same idea applies to the &lt;code&gt;howto&lt;/code&gt; / &lt;code&gt;faq&lt;/code&gt; structured data, but that belongs in a follow-up post.&lt;/p&gt;
&lt;h3 id=&quot;2-keep-structured-data-and-body-text-in-sync&quot;&gt;2. Keep structured data and body text in sync&lt;/h3&gt;
&lt;p&gt;The JSON-LD (howto / faq) content is generated from the frontmatter, but the same content must also appear in the body. This avoids Google’s structured-data mismatch penalty — pumping out elaborate JSON-LD that has no corresponding body text violates Google’s quality guidelines, and getting caught costs you the structured-data display eligibility.&lt;/p&gt;
&lt;p&gt;Aulvem’s rule is to write the same content on both sides — frontmatter and body — so a one-sided update can’t slip through. That alone closes off the failure mode where you fill in the frontmatter FAQ and forget the body.&lt;/p&gt;
&lt;h3 id=&quot;3-read-sitemap-lastmod-from-frontmatter-yourself&quot;&gt;3. Read sitemap lastmod from frontmatter yourself&lt;/h3&gt;
&lt;p&gt;Astro’s official sitemap integration doesn’t read &lt;code&gt;updatedDate&lt;/code&gt; from MDX frontmatter. So Aulvem walks every MDX file with custom logic and pipes &lt;code&gt;updatedDate ?? pubDate&lt;/code&gt; into the sitemap as &lt;code&gt;lastmod&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Without that, the sitemap &lt;code&gt;lastmod&lt;/code&gt; defaults to the build time, which broadcasts the noise signal that “every post was updated every build” to search engines. &lt;code&gt;lastmod&lt;/code&gt; is also used as a freshness input by AI search, so it’s not a part to be sloppy on.&lt;/p&gt;
&lt;p&gt;At the same time, paginated pages that return &lt;code&gt;noindex, follow&lt;/code&gt; are dropped from the sitemap. Submitting a &lt;code&gt;noindex&lt;/code&gt; URL through the sitemap is a contradictory signal, so both have to be handled together.&lt;/p&gt;
&lt;p&gt;The implementation — walking MDX inside &lt;code&gt;astro.config.mjs&lt;/code&gt;, wiring &lt;code&gt;@astrojs/sitemap&lt;/code&gt; &lt;code&gt;serialize&lt;/code&gt; and &lt;code&gt;filter&lt;/code&gt; together, and the operational pitfalls — is in the follow-up post &lt;a href=&quot;https://aulvem.com/blog/2026-05-25-aulvem-sitemap-lastmod/&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;Reading sitemap lastmod from MDX frontmatter&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;how-the-three-pieces-connect&quot;&gt;How the three pieces connect&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;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;flowchart LR&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  FM[frontmatter] --&amp;gt; Zod&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  FM --&amp;gt; Sitemap&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  FM --&amp;gt; Sync&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  Body[MDX body] --&amp;gt; Sync&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;  Zod[&amp;quot;Zod schema check&amp;lt;br/&amp;gt;category ⇔ affiliate&amp;quot;] --&amp;gt; Build&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  Sitemap[&amp;quot;sitemap lastmod injection&amp;lt;br/&amp;gt;reads updatedDate&amp;quot;] --&amp;gt; Build&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  Sync[&amp;quot;frontmatter ↔ body&amp;lt;br/&amp;gt;parity&amp;quot;] --&amp;gt; Build&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;  Build[Astro build]&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;  Build --&amp;gt; HTML[HTML + JSON-LD + SVG]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  Build --&amp;gt; SM[sitemap.xml]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Two inputs — frontmatter and body — fan out through three build-time pieces and converge at Astro build. Frontmatter runs Zod schema validation and sitemap lastmod injection, while both frontmatter and body feed the parity check that makes sure the same content lives on both sides.&lt;/p&gt;
&lt;p&gt;All results are unified by Astro build into the HTML, JSON-LD, and sitemap.xml. If any single piece fails, the build fails — so polishing one side alone won’t get you to publish.&lt;/p&gt;
&lt;h2 id=&quot;operational-flow-lives-in-a-single-source-of-truth&quot;&gt;Operational flow lives in a single source of truth&lt;/h2&gt;
&lt;p&gt;Operational flows — adding a post, adding a product, retiring a post — are anchored in one doc as the single source of truth. From there, the scaffolding and integrity-check scripts are wired in, and the rule is to follow the same steps every time. I think this absorbs most of the “the approach drifts run to run” kind of variance. What’s left is the warmth of the prose, which automation shouldn’t try to normalize anyway.&lt;/p&gt;
&lt;p&gt;There’s also a rule: don’t bump &lt;code&gt;updatedDate&lt;/code&gt; just because you added a preface note — bump it only on substantive revision. Search engines and AI search read &lt;code&gt;dateModified&lt;/code&gt; as a freshness signal, so handling it loosely lowers the whole site’s authority. The criteria are fixed up front.&lt;/p&gt;
&lt;h2 id=&quot;faq&quot;&gt;FAQ&lt;/h2&gt;
&lt;h3 id=&quot;why-astro-5&quot;&gt;Why Astro 5?&lt;/h3&gt;
&lt;p&gt;I narrowed it down to four constraints — Markdown-centric, fully static output, schema-typed frontmatter, and a small core dependency tree. Astro 5 was the best fit. Content Collections and MDX are built in, so there’s no need for extra plugins to get typed content.&lt;/p&gt;
&lt;h3 id=&quot;why-no-headless-cms-sanity-contentful-etc&quot;&gt;Why no headless CMS (Sanity, Contentful, etc.)?&lt;/h3&gt;
&lt;p&gt;Publishing once or twice a week with one editor, MDX + git is faster than a CMS admin UI. A CMS adds the cost of draft locations, schema migrations, and API auth from day one. I’d revisit this when readership crosses ~10k, or when more editors come in.&lt;/p&gt;
&lt;h3 id=&quot;how-is-full-text-search-implemented&quot;&gt;How is full-text search implemented?&lt;/h3&gt;
&lt;p&gt;Pagefind runs after &lt;code&gt;astro build&lt;/code&gt; and produces a static binary search index. The front end pulls it through a tens-of-KB WASM loader. No serverless function, no external API.&lt;/p&gt;
&lt;h3 id=&quot;does-i18n-use-astros-built-in-support-as-is&quot;&gt;Does i18n use Astro’s built-in support as-is?&lt;/h3&gt;
&lt;p&gt;Routing uses Astro 5’s i18n (defaultLocale: en / prefixDefaultLocale: false) untouched. hreflang and sitemap lastmod, on the other hand, are read out of the MDX frontmatter through a custom helper. The details belong in a follow-up post.&lt;/p&gt;
&lt;h2 id=&quot;wrap-up&quot;&gt;Wrap-up&lt;/h2&gt;
&lt;p&gt;That’s the overview. Building and running this, what mattered most wasn’t which stack to pick — it was deciding how tightly to lock the frontmatter down with the schema.&lt;/p&gt;</content:encoded><category>build</category><category>astro</category><category>content-collections</category><category>site-architecture</category></item><item><title>Figma basics, part 3 — color, font, and shadow styles, then components and variants</title><link>https://aulvem.com/blog/2022-04-05-figma-base-3/</link><guid isPermaLink="true">https://aulvem.com/blog/2022-04-05-figma-base-3/</guid><description>Part 3 of the Figma basics series. Walks through registering and applying color, font, and effect (shadow) styles, then combining components with variants — the next step up in making a design file easier to maintain. Illustrated with example GIFs.</description><pubDate>Tue, 05 Apr 2022 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;2026-05-16 update&lt;/strong&gt;: A few years on from the original. The skeleton still holds up, but the tool UI and version match when it was written and differ from the current Figma.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This post covers the Figma features that make a file easier to manage and easier to adjust.&lt;/p&gt;
&lt;p&gt;Building up to the design file itself is covered in the earlier posts, so use those as the starting point.&lt;/p&gt;
&lt;p&gt;The finished design from this post looks like this.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Preview of the finished design&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2022-04-05-figma-base-3/2022-04-05_Completion_drawing.jpg&quot; loading=&quot;lazy&quot;/&gt;
&lt;h2 id=&quot;create-a-color-style&quot;&gt;Create a color style&lt;/h2&gt;
&lt;p&gt;The screen elements are already in place from the earlier parts, so the next step is to register the colors and make them reusable.&lt;/p&gt;
&lt;p&gt;Start with the header background color.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Creating a color style&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2022-04-05-figma-base-3/2022-04-05-Figma-base-3_Creating_colour_styles.gif&quot; loading=&quot;lazy&quot;/&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Point&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Select the element whose color you want to register&lt;/li&gt;
&lt;li&gt;Find the Fill section in the right sidebar&lt;/li&gt;
&lt;li&gt;Click the four-dot icon to the right of Fill&lt;/li&gt;
&lt;li&gt;Click the + icon to the right of Color Styles&lt;/li&gt;
&lt;li&gt;Type the name you want to register in the modal input&lt;/li&gt;
&lt;li&gt;Click Create style&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;p&gt;That’s the color registered.&lt;/p&gt;
&lt;br/&gt;
&lt;p&gt;Registered colors pay off in places where the same color is reused across elements.&lt;/p&gt;
&lt;p&gt;The header background color is also used for the footer background, so apply the style we just registered to the footer.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Applying a color style&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2022-04-05-figma-base-3/2022-04-05-Figma-base-3_Colour_style_adaptation.jpg&quot; loading=&quot;lazy&quot;/&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Point&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Select the element you want to apply the registered color to&lt;/li&gt;
&lt;li&gt;Find the Fill section in the right sidebar&lt;/li&gt;
&lt;li&gt;Click the four-dot icon to the right of Fill&lt;/li&gt;
&lt;li&gt;Under Color Styles, click the color you want to apply&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;p&gt;The registered footer color is now in place.&lt;/p&gt;
&lt;br/&gt;
&lt;p&gt;Registering each color in Color Styles and applying it everywhere makes color changes much easier later on.&lt;/p&gt;
&lt;p&gt;The GIF below edits the main color while every other color and element is already mapped to Color Styles.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Editing a color style&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2022-04-05-figma-base-3/2022-04-05-Figma-base-3_Editing_colour_styles.gif&quot; loading=&quot;lazy&quot;/&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Point&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Click an empty area with no element selected&lt;/li&gt;
&lt;li&gt;Find the Color Styles section in the right sidebar&lt;/li&gt;
&lt;li&gt;Hover over the color you want to edit in Color Styles&lt;/li&gt;
&lt;li&gt;The adjust icon appears on the right — click it&lt;/li&gt;
&lt;li&gt;The color code shows below — click it&lt;/li&gt;
&lt;li&gt;Pick the color you want in the color picker&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;p&gt;As a design tightens up, the urge to fine-tune colors goes up too, so registering colors early tends to save time.&lt;/p&gt;
&lt;p&gt;Color Styles also surfaces which color is doing which job and how many times each one is used, which makes it less likely an odd color slips in.&lt;/p&gt;
&lt;h2 id=&quot;create-a-font-style&quot;&gt;Create a font style&lt;/h2&gt;
&lt;p&gt;The same kind of registration exists for font settings.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Creating a font style&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2022-04-05-figma-base-3/2022-04-05-Figma-base-3_Creating_font_styles.gif&quot; loading=&quot;lazy&quot;/&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Point&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Select the element whose font you want to register&lt;/li&gt;
&lt;li&gt;Find the Text section in the right sidebar&lt;/li&gt;
&lt;li&gt;Click the four-dot icon to the right of Text&lt;/li&gt;
&lt;li&gt;Click the + icon to the right of Text Styles&lt;/li&gt;
&lt;li&gt;Type the name you want to register in the modal input&lt;/li&gt;
&lt;li&gt;Click Create style&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;p&gt;The font style is now registered.&lt;/p&gt;
&lt;p&gt;Applying and editing a font style works the same way as Color Styles.&lt;/p&gt;
&lt;h2 id=&quot;set-up-the-shadow&quot;&gt;Set up the shadow&lt;/h2&gt;
&lt;p&gt;So far this has been about manageability. Next, add a shadow to an element.&lt;/p&gt;
&lt;p&gt;The card frame is a good test case.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Setting up the shadow&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2022-04-05-figma-base-3/2022-04-05-Figma-base-3_Shadow_settings.gif&quot; loading=&quot;lazy&quot;/&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Point&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Select the element you want to add a shadow to&lt;/li&gt;
&lt;li&gt;Find the Effects section in the right sidebar&lt;/li&gt;
&lt;li&gt;Click the + icon to the right of Effects&lt;/li&gt;
&lt;li&gt;Click the sun icon to the right of Effects&lt;/li&gt;
&lt;li&gt;Adjust the values under Drop shadow until they look right&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;Arrow keys (↑↓) nudge by 1 pixel&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;The card frame now has a shadow.&lt;/p&gt;
&lt;br/&gt;
&lt;p&gt;Shadows can be saved as a style the same way.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Creating an effect style&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2022-04-05-figma-base-3/2022-04-05-Figma-base-3_Creating_effect_styles.jpg&quot; loading=&quot;lazy&quot;/&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Point&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Select the element whose shadow you want to register&lt;/li&gt;
&lt;li&gt;Find the Effects section in the right sidebar&lt;/li&gt;
&lt;li&gt;Click the four-dot icon to the right of Effects&lt;/li&gt;
&lt;li&gt;Click the + icon to the right of Effect Styles&lt;/li&gt;
&lt;li&gt;Type the name you want to register in the modal input&lt;/li&gt;
&lt;li&gt;Click Create style&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;p&gt;The shadow style is now registered.&lt;/p&gt;
&lt;p&gt;Applying and editing a shadow style works the same way as Color Styles.&lt;/p&gt;
&lt;h2 id=&quot;combine-components-with-auto-layout&quot;&gt;Combine components with auto layout&lt;/h2&gt;
&lt;p&gt;A button on a real web page changes color or content the moment it’s clicked.&lt;/p&gt;
&lt;p&gt;To express those state changes inside Figma, the Variants feature is the right tool.&lt;/p&gt;
&lt;p&gt;As things stand, Variants is awkward to use, so the prep step is to keep auto layout on the button and turn it into a separate component.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This section originally included a roughly 32 MiB GIF showing the component-plus-auto-layout operation. It’s been dropped because of the hosting (Cloudflare Pages) file size limit. For the actual behavior, see the &lt;a href=&quot;https://help.figma.com/&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;Figma official documentation&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Point&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Select the element you want to turn into a component&lt;/li&gt;
&lt;li&gt;Move it outside the frame&lt;/li&gt;
&lt;li&gt;Wrap in this order: component / auto layout / element
&lt;ul&gt;
&lt;li&gt;If the top of the element is a frame, add auto layout to it&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Move the child component back to where it was in step 1&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;p&gt;The flow is a bit involved, but the button is now a component with auto layout intact.&lt;/p&gt;
&lt;h2 id=&quot;create-variants&quot;&gt;Create variants&lt;/h2&gt;
&lt;p&gt;A button is now ready outside the frame as a component.&lt;/p&gt;
&lt;p&gt;From here, use Variants to express the button’s state changes.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Creating variants&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2022-04-05-figma-base-3/2022-04-05-Figma-base-3_Creating_variants.gif&quot; loading=&quot;lazy&quot;/&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Point: applying variants&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Select the &lt;strong&gt;component-ised element&lt;/strong&gt; you want to add variants to&lt;/li&gt;
&lt;li&gt;Find the Variants section in the right sidebar&lt;/li&gt;
&lt;li&gt;Click the + icon to the right of Variants&lt;/li&gt;
&lt;li&gt;In the input field showing something like “Variant2”, type the sub-state name you want to register&lt;/li&gt;
&lt;li&gt;Select the elements inside that state&lt;/li&gt;
&lt;li&gt;Change colors or other properties&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Point: switching variant state&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Select the element whose state you want to change&lt;/li&gt;
&lt;li&gt;Find the section in the right sidebar that shows the component name&lt;/li&gt;
&lt;li&gt;Click the dropdown next to something like “Property1”&lt;/li&gt;
&lt;li&gt;Pick the state to switch to&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;p&gt;Adding variants outlines the component with a dotted border and duplicates the element.&lt;/p&gt;
&lt;p&gt;Editing those duplicates is how the sub-states get expressed.&lt;/p&gt;
&lt;p&gt;One caveat: Variants only applies to elements that are already components.&lt;/p&gt;
&lt;br/&gt;
&lt;p&gt;By default only one variant on top of the default can be registered, so add another state.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Adding variants&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2022-04-05-figma-base-3/2022-04-05-Figma-base-3_Additions_within_the_Variants.jpg&quot; loading=&quot;lazy&quot;/&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Point: adding a variant&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Select the variant element you want to add another from&lt;/li&gt;
&lt;li&gt;A + icon appears nearby — click it&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;p&gt;New variants get added directly below the selected element, so starting from the bottom-most variant tends to keep the layout clean.&lt;/p&gt;
&lt;h2 id=&quot;finished&quot;&gt;Finished&lt;/h2&gt;
&lt;img width=&quot;800&quot; alt=&quot;Finished design&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2022-04-05-figma-base-3/2022-04-05_Completion_drawing.jpg&quot; loading=&quot;lazy&quot;/&gt;
&lt;p&gt;That’s part 3 of the Figma basics.&lt;/p&gt;
&lt;p&gt;More skill-related posts to come.&lt;/p&gt;</content:encoded><category>build</category><category>UI</category><category>Figma</category></item><item><title>How to use Figma — basics, part 2</title><link>https://aulvem.com/blog/2022-04-01-figma-base-2/</link><guid isPermaLink="true">https://aulvem.com/blog/2022-04-01-figma-base-2/</guid><description>Figma basics, part 2. A walkthrough of strokes, grouping, components, and auto layout — the features that make UI parts genuinely reusable. With GIFs for each step. A foundation for a small design system.</description><pubDate>Fri, 01 Apr 2022 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;2026-05-16 update&lt;/strong&gt;: A post from a few years back. The bones still hold up, but the UI screenshots and Figma version are from when it was written and don’t match the current build.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This post walks through the Figma basics, part 2.&lt;/p&gt;
&lt;p&gt;I covered getting up to a design file in the earlier posts, so use those as a starting point.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Related&lt;/strong&gt;: &lt;a href=&quot;https://aulvem.com/blog/2022-03-29-figma-preparation/&quot;&gt;How to use Figma — setup&lt;/a&gt; / &lt;a href=&quot;https://aulvem.com/blog/2022-03-30-figma-base-1/&quot;&gt;How to use Figma — basics, part 1&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The finished design from this post looks like the image below.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Preview of the finished design&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2022-04-01-figma-base-2/2022-04-01_Completion_drawing.jpg&quot; loading=&quot;lazy&quot;/&gt;
&lt;h2 id=&quot;setting-a-stroke&quot;&gt;Setting a stroke&lt;/h2&gt;
&lt;p&gt;The earlier post stopped at the header and footer.&lt;/p&gt;
&lt;p&gt;This time I start with the cards inside the content area.&lt;/p&gt;
&lt;p&gt;The GIF below begins right after the frame has been created.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Setting a stroke in Figma&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2022-04-01-figma-base-2/2022-04-01_Setting_the_border.gif&quot; loading=&quot;lazy&quot;/&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Point&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Select the element you want to add a stroke to&lt;/li&gt;
&lt;li&gt;Find the Stroke section in the right panel&lt;/li&gt;
&lt;li&gt;Click the + icon to the right of Stroke&lt;/li&gt;
&lt;li&gt;Click the color code that appears below&lt;/li&gt;
&lt;li&gt;Pick a color from the picker, or from the swatch history under it&lt;/li&gt;
&lt;li&gt;Set the line thickness with the number next to the three-line icon under the color code&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;p&gt;That’s the stroke set.&lt;/p&gt;
&lt;h2 id=&quot;creating-different-elements&quot;&gt;Creating different elements&lt;/h2&gt;
&lt;p&gt;With the card outline in place, the next step is the contents.&lt;/p&gt;
&lt;p&gt;I drop in a title and body text as shown in the GIF below.&lt;/p&gt;
&lt;p&gt;Then a divider line and an avatar icon underneath, both made from primitive shapes.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Creating different elements in Figma&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2022-04-01-figma-base-2/2022-04-01_Creating_elements.gif&quot; loading=&quot;lazy&quot;/&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Point: drawing a line&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Click the ∨ next to the rectangle icon in the toolbar&lt;/li&gt;
&lt;li&gt;Pick Line from the list&lt;/li&gt;
&lt;li&gt;Move the cursor to where you want the line to start&lt;/li&gt;
&lt;li&gt;Drag to set the length&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Point: drawing a circle&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Click the ∨ next to the rectangle icon in the toolbar&lt;/li&gt;
&lt;li&gt;Pick Ellipse from the list&lt;/li&gt;
&lt;li&gt;Move the cursor to where you want the shape&lt;/li&gt;
&lt;li&gt;Drag to set the size&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Snapping kicks in around centers and edges&lt;/li&gt;
&lt;li&gt;Hold Shift while dragging to lock the X or Y axis&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The divider and avatar icon are now in place under the content.&lt;/p&gt;
&lt;h2 id=&quot;grouping&quot;&gt;Grouping&lt;/h2&gt;
&lt;p&gt;The card frame is starting to hold a lot of elements, so I bundle them.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Grouping elements in Figma&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2022-04-01-figma-base-2/2022-04-01_Grouping.gif&quot; loading=&quot;lazy&quot;/&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Point&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Select the elements you want to group (multi-select)&lt;/li&gt;
&lt;li&gt;Right-click to open the menu&lt;/li&gt;
&lt;li&gt;Choose Group selection&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;In the left panel you can Shift-click to select a range&lt;/li&gt;
&lt;li&gt;With elements selected, Ctrl + G also groups them&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;The card elements now live inside one group.&lt;/p&gt;
&lt;h2 id=&quot;changing-the-corner-radius&quot;&gt;Changing the corner radius&lt;/h2&gt;
&lt;p&gt;The last piece inside the card is a button next to the avatar icon.&lt;/p&gt;
&lt;p&gt;I drop a frame next to the avatar and give it a background color.&lt;/p&gt;
&lt;p&gt;I want rounded corners on the button, so I round it off here.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Changing the corner radius in Figma&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2022-04-01-figma-base-2/2022-04-01_Rounding_change.jpg&quot; loading=&quot;lazy&quot;/&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Point&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Select the element you want to round&lt;/li&gt;
&lt;li&gt;Find the Frame section in the right panel&lt;/li&gt;
&lt;li&gt;Click the number inside the red outline on the Frame row&lt;/li&gt;
&lt;li&gt;Type the value you want&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;Arrow keys ↑↓ nudge by 1 pixel&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;That’s all the pieces inside the card built.&lt;/p&gt;
&lt;h2 id=&quot;creating-a-component&quot;&gt;Creating a component&lt;/h2&gt;
&lt;p&gt;Cards usually appear more than once, so I duplicate it.&lt;/p&gt;
&lt;p&gt;But instead of plain copy-paste like last time, I use Figma’s component feature — a stronger form of duplication.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Creating a component in Figma&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2022-04-01-figma-base-2/2022-04-01_Creating_components.gif&quot; loading=&quot;lazy&quot;/&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Point&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Select the elements you want to turn into a component&lt;/li&gt;
&lt;li&gt;Right-click to open the menu&lt;/li&gt;
&lt;li&gt;Choose Create component&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;With elements selected, Ctrl + Alt + K also creates a component&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;As the GIF shows, components do a few useful things at once:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Edits to the master component flow through to every instance&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Per-instance overrides (no effect on the master)
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Toggle visibility per element&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Override text per element&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Turning frames you’ll likely reuse into components — and reaching for them by default — is one of the biggest payoffs Figma gives you later.&lt;/p&gt;
&lt;h2 id=&quot;adding-auto-layout&quot;&gt;Adding auto layout&lt;/h2&gt;
&lt;p&gt;At some point I want to swap the button label for something longer.&lt;/p&gt;
&lt;p&gt;This is where auto layout comes in.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Adding auto layout in Figma&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2022-04-01-figma-base-2/2022-04-01_Creating_an_auto_layout.gif&quot; loading=&quot;lazy&quot;/&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Point: turning on auto layout&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Select the element you want auto layout on&lt;/li&gt;
&lt;li&gt;Right-click to open the menu&lt;/li&gt;
&lt;li&gt;Choose Add auto layout&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;With elements selected, Shift + A also enables auto layout&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;Normally, longer text would overflow the frame.
&lt;strong&gt;With auto layout, as the GIF shows, the padding on all four sides stays put.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Reach for auto layout when an element’s width or height needs to grow with its content.&lt;/p&gt;
&lt;br/&gt;
&lt;p&gt;The button in that example grows to the right, which eats into the right-side margin.&lt;/p&gt;
&lt;p&gt;One more tweak keeps the right margin intact while the button still grows.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Changing the auto layout start point in Figma&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2022-04-01-figma-base-2/2022-04-01_Changing_the_starting_point.gif&quot; loading=&quot;lazy&quot;/&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Point: changing the start point&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Select the element whose start point you want to change&lt;/li&gt;
&lt;li&gt;Find the Constraints section in the right panel&lt;/li&gt;
&lt;li&gt;In the small diagram, click the blue lines to set the start point&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;p&gt;The button’s auto layout now anchors to the bottom-right, so the right margin stays put as it grows.&lt;/p&gt;
&lt;p&gt;The labels (&lt;code&gt;left&lt;/code&gt;, &lt;code&gt;right&lt;/code&gt;, etc.) next to the diagram set the same thing if you prefer text.&lt;/p&gt;
&lt;br/&gt;
&lt;p&gt;Auto layout has another useful piece.&lt;/p&gt;
&lt;p&gt;I use it here to set the padding around each card and the gap between cards.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Adjusting auto layout in Figma&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2022-04-01-figma-base-2/2022-04-01_Adjusting_the_auto_layout.gif&quot; loading=&quot;lazy&quot;/&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Point: adjusting auto layout&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Multi-select the elements you want under auto layout&lt;/li&gt;
&lt;li&gt;Enable auto layout&lt;/li&gt;
&lt;li&gt;Find the Auto layout section in the right panel&lt;/li&gt;
&lt;li&gt;Click the rightmost square in the Auto layout row&lt;/li&gt;
&lt;li&gt;Adjust the top / bottom / left / right padding in pixels&lt;/li&gt;
&lt;li&gt;Click the three-line icon&lt;/li&gt;
&lt;li&gt;Adjust the gap between elements&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;p&gt;The Auto layout section in the right panel handles padding and spacing.&lt;/p&gt;
&lt;p&gt;When the same element appears more than once, &lt;strong&gt;auto layout makes it easy to dial in outer padding and inter-element gaps in one place&lt;/strong&gt; — worth reaching for by default.&lt;/p&gt;
&lt;h2 id=&quot;the-finished-design&quot;&gt;The finished design&lt;/h2&gt;
&lt;img width=&quot;800&quot; alt=&quot;The finished card design in Figma&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2022-04-01-figma-base-2/2022-04-01_Completion_drawing.jpg&quot; loading=&quot;lazy&quot;/&gt;
&lt;p&gt;That covers Figma basics, part 2.&lt;/p&gt;
&lt;p&gt;Next up: the features that make a Figma file easier to maintain over time.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Related&lt;/strong&gt;: &lt;a href=&quot;https://aulvem.com/blog/2022-04-05-figma-base-3/&quot;&gt;How to use Figma — basics, part 3&lt;/a&gt;&lt;/p&gt;</content:encoded><category>build</category><category>UI</category><category>Figma</category></item><item><title>Figma basics, part 1 — frames, fills, text, and alignment</title><link>https://aulvem.com/blog/2022-03-30-figma-base-1/</link><guid isPermaLink="true">https://aulvem.com/blog/2022-03-30-figma-base-1/</guid><description>Figma basics, part 1. The first set of operations to learn in Figma: creating a frame, changing its background fill, moving and resizing elements, entering text, and aligning. Walked through with example GIFs, written for first-time Figma users.</description><pubDate>Wed, 30 Mar 2022 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;2026-05-16 update&lt;/strong&gt;: A post a few years old. The bones still hold up, but the tool UI and version are from when it was written and don’t match the current Figma.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Figma basics, part one. The previous post got as far as creating a design file. From here, I’m building out the screen itself.&lt;/p&gt;
&lt;p&gt;The finished version looks like the image below. A plain screen, but it covers the core Figma basics: frames, fills, text, and alignment.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Preview of the finished design&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2022-03-30-figma-base-1/2022-03-30_completion%20drawing.jpg&quot; loading=&quot;lazy&quot;/&gt;
&lt;h2 id=&quot;the-basic-layout&quot;&gt;The basic layout&lt;/h2&gt;
&lt;img width=&quot;800&quot; alt=&quot;The default Figma screen&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2022-03-30-figma-base-1/2022-03-30_Default_screen.jpg&quot; loading=&quot;lazy&quot;/&gt;
&lt;p&gt;Rough map of the screen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The header is &lt;strong&gt;the tooling&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;The left sidebar is &lt;strong&gt;the objects you’ve created&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;The right sidebar adjusts &lt;strong&gt;the object you’ve selected&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;frame&quot;&gt;Frame&lt;/h2&gt;
&lt;p&gt;First, the screen bounds.&lt;/p&gt;
&lt;p&gt;In Figma, a screen is expressed using a part called a frame.&lt;/p&gt;
&lt;p&gt;Frames are versatile — they’re used for the screen bounds, as outer containers for elements, and more. There are templates available, so the easiest place to start is picking one of those.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Creating a frame from a template&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2022-03-30-figma-base-1/2022-03-30_Creating_template_frames.gif&quot; loading=&quot;lazy&quot;/&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Point&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Click the frame icon in the header&lt;/li&gt;
&lt;li&gt;The frame templates appear in the right sidebar — pick the one you want&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;p&gt;Clicking creates an iPhone 13 Pro Max frame in the center of the canvas.&lt;/p&gt;
&lt;p&gt;The right sidebar shows the new frame labeled &lt;strong&gt;# iPhone 13 Pro Max&lt;/strong&gt;.&lt;/p&gt;
&lt;br/&gt;
&lt;p&gt;With the screen bounds in place, next is the elements inside the screen.&lt;/p&gt;
&lt;p&gt;Starting with the header.&lt;/p&gt;
&lt;p&gt;The previous step used a frame template — this time, drawing a frame freely.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Drawing a frame freely&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2022-03-30-figma-base-1/2022-03-30_Creating_frames.gif&quot; loading=&quot;lazy&quot;/&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Point&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Click the frame icon in the header&lt;/li&gt;
&lt;li&gt;Move the cursor to where you want the frame&lt;/li&gt;
&lt;li&gt;Drag to draw&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;p&gt;Freehand drawing isn’t pixel-precise, so aim for roughly the right size and fine-tune later.&lt;/p&gt;
&lt;p&gt;Use freehand drawing for larger blocks like headers, and for the base shape of small elements like buttons.&lt;/p&gt;
&lt;h2 id=&quot;change-the-background-fill&quot;&gt;Change the background fill&lt;/h2&gt;
&lt;p&gt;The freehand-drawn frame comes out plain white. To make it easier to see, I’ll give the header frame a background fill.&lt;/p&gt;
&lt;p&gt;Fine adjustments like fill color happen in the right sidebar.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Changing the background fill&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2022-03-30-figma-base-1/2022-03-30_Changing_the_background_colour.gif&quot; loading=&quot;lazy&quot;/&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Point&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Select the element to adjust&lt;/li&gt;
&lt;li&gt;Find the Fill row in the right sidebar&lt;/li&gt;
&lt;li&gt;Click the + icon to the right of Fill&lt;/li&gt;
&lt;li&gt;Click the color code shown below&lt;/li&gt;
&lt;li&gt;Pick a color in the color picker&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;p&gt;That switches the fill to black.&lt;/p&gt;
&lt;h2 id=&quot;move-and-resize-elements&quot;&gt;Move and resize elements&lt;/h2&gt;
&lt;p&gt;The header has its color, but the position and size are off.&lt;/p&gt;
&lt;p&gt;Time to move it and resize it.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Moving and resizing an element&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2022-03-30-figma-base-1/2022-03-30_Moving_and_resizing_elements.gif&quot; loading=&quot;lazy&quot;/&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Point: repositioning&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Select the element to adjust&lt;/li&gt;
&lt;li&gt;Drag to where you want it&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;Smart guides snap to center and edges&lt;/li&gt;
&lt;li&gt;Shift + drag locks movement to the x or y axis&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Point: resizing&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Select the element to adjust&lt;/li&gt;
&lt;li&gt;Move the cursor to the bounding-box handle&lt;/li&gt;
&lt;li&gt;Drag to resize&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;p&gt;That puts the header roughly where it belongs, at roughly the right size.&lt;/p&gt;
&lt;p&gt;But the height is a few pixels off, so a quick fine-tune.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Fine-tuning element height&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2022-03-30-figma-base-1/2022-03-30_Resizing_elements.jpg&quot; loading=&quot;lazy&quot;/&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Point: fine-tuning element height&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Select the element to adjust&lt;/li&gt;
&lt;li&gt;Click the H field under Frame in the right sidebar&lt;/li&gt;
&lt;li&gt;Edit the value&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;Arrow up / down nudges by 1 pixel&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;Under Frame, X and Y are position; W and H are width and height — all editable.&lt;/p&gt;
&lt;h2 id=&quot;enter-text&quot;&gt;Enter text&lt;/h2&gt;
&lt;p&gt;With the header frame in place, next are the elements inside the header.&lt;/p&gt;
&lt;p&gt;For the walkthrough, putting some text in the header.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Entering text&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2022-03-30-figma-base-1/2022-03-30_Text_input.gif&quot; loading=&quot;lazy&quot;/&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Point&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Click the T icon in the header&lt;/li&gt;
&lt;li&gt;Click where you want the text&lt;/li&gt;
&lt;li&gt;Type once the cursor goes into edit mode&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;p&gt;That puts the word “Header” inside the header.&lt;/p&gt;
&lt;h3 id=&quot;changing-the-font-size&quot;&gt;Changing the font size&lt;/h3&gt;
&lt;p&gt;The text is too small as-is, so bumping the font size up to something readable.&lt;/p&gt;
&lt;p&gt;Same as before — fine adjustments happen in the right sidebar.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Changing the font size&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2022-03-30-figma-base-1/2022-03-30_Change_in_size.gif&quot; loading=&quot;lazy&quot;/&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Point&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Select the text to adjust&lt;/li&gt;
&lt;li&gt;Find the Text row in the right sidebar&lt;/li&gt;
&lt;li&gt;Find the numeric field in the lower right of the Text row&lt;/li&gt;
&lt;li&gt;Click the number&lt;/li&gt;
&lt;li&gt;Edit the value&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;Arrow up / down nudges by 1 size unit&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;That gets the font size to something readable.&lt;/p&gt;
&lt;h2 id=&quot;align-elements&quot;&gt;Align elements&lt;/h2&gt;
&lt;p&gt;Font size sorted. Next, the text position.&lt;/p&gt;
&lt;p&gt;Same as before — fine adjustments happen in the right sidebar.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Centering an element&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2022-03-30-figma-base-1/2022-03-30_Centred_elements.gif&quot; loading=&quot;lazy&quot;/&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Point: horizontal center&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Select the element to adjust&lt;/li&gt;
&lt;li&gt;In the right sidebar, click the icon with a vertical line through the center&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Point: vertical center&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Select the element to adjust&lt;/li&gt;
&lt;li&gt;In the right sidebar, click the icon with a horizontal line through the center&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;p&gt;The other icons on the same row are the rest of the alignment options.&lt;/p&gt;
&lt;br/&gt;
&lt;p&gt;Header done. Next, the footer.&lt;/p&gt;
&lt;p&gt;Same design as the header, so copying the header across.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Duplicating an element for the footer&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2022-03-30-figma-base-1/2022-03-30_Reproduction.jpg&quot; loading=&quot;lazy&quot;/&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Point: duplicating an element&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Select the element to duplicate&lt;/li&gt;
&lt;li&gt;Press Ctrl + C&lt;/li&gt;
&lt;li&gt;Press Ctrl + V&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;p&gt;That gives the footer copy.&lt;/p&gt;
&lt;p&gt;It sits at the same position as the header, though — needs to move to the bottom.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Placing the footer at the bottom of the screen&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2022-03-30-figma-base-1/2022-03-30_Undercover.jpg&quot; loading=&quot;lazy&quot;/&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Point: align to bottom&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Select the element to adjust&lt;/li&gt;
&lt;li&gt;In the right sidebar, click the icon with a horizontal line at the bottom&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;p&gt;Footer done.&lt;/p&gt;
&lt;p&gt;That covers the first set of Figma operations. Part two picks up the core features worth learning early when you start using Figma seriously.&lt;/p&gt;</content:encoded><category>build</category><category>UI</category><category>Figma</category></item><item><title>How to use Figma — setup guide</title><link>https://aulvem.com/blog/2022-03-29-figma-preparation/</link><guid isPermaLink="true">https://aulvem.com/blog/2022-03-29-figma-preparation/</guid><description>A setup guide for getting started with Figma. Covers what Figma is, its core characteristics, account signup, team creation, opening a new design file, and the basics of the editor — step by step, with screenshots. A starting point for anyone new to UI design.</description><pubDate>Tue, 29 Mar 2022 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;2026-05-16 update&lt;/strong&gt;: This post is a few years old now. The skeleton — create an account, create a team, create a file — still holds, but the UI details and labels are left as they were at the time. Today’s Figma has added Dev Mode, Variables, stronger Auto layout, and other features that didn’t exist back then. Read it alongside the current screens.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is a walkthrough of what Figma is, and what it takes to get to your first design file. Three steps — account, team, file — in order, and the UI design canvas is right there.&lt;/p&gt;
&lt;h2 id=&quot;understand-what-figma-is&quot;&gt;Understand what Figma is&lt;/h2&gt;
&lt;p&gt;Figma is a UI design tool that runs in the browser. No install needed; open a URL and the editor is right there.&lt;/p&gt;
&lt;p&gt;There are other prototyping tools out there, but for getting the shape of Figma, two characteristics stand out:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The work lives in the cloud&lt;/li&gt;
&lt;li&gt;Multiple people can edit at the same time&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;the-work-lives-in-the-cloud&quot;&gt;The work lives in the cloud&lt;/h3&gt;
&lt;p&gt;Figma files live in the cloud, and editing happens inside the browser.&lt;/p&gt;
&lt;p&gt;As long as the account exists, &lt;strong&gt;any PC with a browser can sign in and read or edit the current file&lt;/strong&gt;. There’s nothing to install locally.&lt;/p&gt;
&lt;h3 id=&quot;multiple-people-can-edit-at-the-same-time&quot;&gt;Multiple people can edit at the same time&lt;/h3&gt;
&lt;p&gt;The defining feature of Figma is that multiple people can edit the same file simultaneously.&lt;/p&gt;
&lt;p&gt;For solo use the benefit is thin, but for prototyping at work it removes the usual friction of zipping files, mistaking which copy is the latest, and so on.&lt;/p&gt;
&lt;p&gt;Note: &lt;strong&gt;it’s especially good in remote meetings&lt;/strong&gt;. You can share your screen and fix things live as the conversation happens.&lt;/p&gt;
&lt;h2 id=&quot;create-an-account&quot;&gt;Create an account&lt;/h2&gt;
&lt;p&gt;To actually start using it, the first step is creating a Figma account.&lt;/p&gt;
&lt;p&gt;Open the official site and head to signup.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.figma.com/&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;https://www.figma.com/&lt;/a&gt;&lt;/p&gt;
&lt;img width=&quot;600&quot; alt=&quot;Figma top page&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2022-03-29-figma-preparation/2022-03-29-Figma-Top.jpg&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;p&gt;The page above loads up. Click the &lt;strong&gt;Sign up button in the red box&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;That opens the new-account modal.&lt;/p&gt;
&lt;p&gt;Signing up with a Google account is the least friction and what I’d recommend. Email also works fine.&lt;/p&gt;
&lt;h2 id=&quot;create-a-team&quot;&gt;Create a team&lt;/h2&gt;
&lt;p&gt;Once the account is created and signed in, the next step is to create a team.&lt;/p&gt;
&lt;p&gt;A team is similar to a folder on a PC. You create the team folder first, and design files go inside it — that’s the hierarchy.&lt;/p&gt;
&lt;p&gt;Click the area highlighted in red below.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Team creation screen&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2022-03-29-figma-preparation/2022-03-29_Team_creation.jpg&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;p&gt;A team-name input screen comes up.&lt;/p&gt;
&lt;p&gt;Type any team name and click the &lt;strong&gt;Create team&lt;/strong&gt; button.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Team name input screen&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2022-03-29-figma-preparation/2022-03-29_Enter_team_name.jpg&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;p&gt;Next is a screen for inviting users to the team.&lt;/p&gt;
&lt;p&gt;Since this is a solo setup on the free plan, click &lt;strong&gt;Skip for now&lt;/strong&gt; at the bottom of the screen.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Skip user invite&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2022-03-29-figma-preparation/2022-03-29_Skip.jpg&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;p&gt;The last step is choosing a Figma plan.&lt;/p&gt;
&lt;p&gt;Going with the free plan, so click &lt;strong&gt;Choose Starter&lt;/strong&gt; in the red box. That finishes team creation.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Free plan selection screen&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2022-03-29-figma-preparation/2022-03-29_Free_version.jpg&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;h2 id=&quot;create-a-design-file&quot;&gt;Create a design file&lt;/h2&gt;
&lt;p&gt;With the team in place, the next step is creating the actual workspace — a design file.&lt;/p&gt;
&lt;p&gt;Note that on the free plan you can only create up to three design files (limit as of writing — check the official pricing page for the current cap).&lt;/p&gt;
&lt;br/&gt;
&lt;p&gt;Creating the file itself is simple.&lt;/p&gt;
&lt;p&gt;The team name shows up on the left side. Selecting it opens the screen below.&lt;/p&gt;
&lt;p&gt;Clicking the area in the red box creates a new design file.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Design file creation screen&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2022-03-29-figma-preparation/2022-03-29_Design_creation.jpg&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;p&gt;Once created, this screen opens — and that’s the end of setup.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Default design file screen&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2022-03-29-figma-preparation/2022-03-29_Default_screen.jpg&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;p&gt;So that covers what Figma is, and getting through to an empty canvas.&lt;/p&gt;
&lt;p&gt;What to actually do inside that canvas is the subject of the next post — the basics guide.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Related&lt;/strong&gt;: &lt;a href=&quot;https://aulvem.com/blog/2022-03-30-figma-base-1/&quot;&gt;How to use Figma — basics 1&lt;/a&gt;&lt;/p&gt;</content:encoded><category>build</category><category>UI</category><category>Figma</category></item><item><title>Design thinking, and how I actually use it at work</title><link>https://aulvem.com/blog/2022-03-19-design-thinking/</link><guid isPermaLink="true">https://aulvem.com/blog/2022-03-19-design-thinking/</guid><description>Design thinking is a problem-solving approach that borrows the designer&apos;s creative process and applies it to other fields. A walkthrough of the empathize / define / ideate / prototype / test flow, the Double Diamond model, and practical notes on using it day to day.</description><pubDate>Sat, 19 Mar 2022 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;2026 update&lt;/strong&gt;: A few years on from the original post. The shape of the argument still holds, but any tool UIs and version numbers mentioned are from when it was written and may have drifted from current releases.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;what-is-design-thinking&quot;&gt;What is design thinking?&lt;/h2&gt;
&lt;p&gt;I’ve been running into “design thinking” more often at work lately, so this is me writing down how I actually understand it.&lt;/p&gt;
&lt;br/&gt;
&lt;p&gt;Design thinking started as a way designers approached creative work, then got generalized as a problem-solving approach for other fields.&lt;/p&gt;
&lt;p&gt;Where logical thinking leans on theory and numbers to &lt;strong&gt;solve the problem in front of you&lt;/strong&gt;,&lt;/p&gt;
&lt;p&gt;design thinking starts from empathy and emotion and tries to &lt;strong&gt;find the real problem underneath&lt;/strong&gt;.&lt;/p&gt;
&lt;img width=&quot;600&quot; alt=&quot;The Ford apocryphal quote&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2022-03-19-design-thinking/2022-03-19-Design-Thinking-Ford.jpg&quot; loading=&quot;lazy&quot;/&gt;
&lt;p&gt;The example people reach for is the Ford one. The user request — “&lt;strong&gt;I want a faster horse&lt;/strong&gt;” — gets read not as the literal object (a horse) but as the underlying desire (“&lt;strong&gt;I want to move from A to B&lt;/strong&gt;”), and the answer becomes a car.&lt;/p&gt;
&lt;p&gt;That’s the move: doubt the problem as presented, and go after the real problem sitting behind it.&lt;/p&gt;
&lt;h2 id=&quot;the-design-thinking-process&quot;&gt;The design thinking process&lt;/h2&gt;
&lt;p&gt;The process runs as a pattern of &lt;strong&gt;diverge&lt;/strong&gt; and &lt;strong&gt;converge&lt;/strong&gt;. This is the Double Diamond model.&lt;/p&gt;
&lt;img width=&quot;600&quot; alt=&quot;The Double Diamond model&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2022-03-19-design-thinking/2022-03-19-Double-Diamond.jpg&quot; loading=&quot;lazy&quot;/&gt;
&lt;p&gt;It breaks into four stages.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Diverge and converge to find the right problem — “discover” and “define”&lt;/li&gt;
&lt;li&gt;Diverge and converge to find the right solution — “develop” and “deliver”&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You spin through these four stages, fast, and the product gets sharper each loop.&lt;/p&gt;
&lt;h3 id=&quot;diverging-to-find-the-right-problem&quot;&gt;Diverging to find the right problem&lt;/h3&gt;
&lt;h4 id=&quot;discover&quot;&gt;Discover&lt;/h4&gt;
&lt;p&gt;The discover phase is where the core idea of design thinking — &lt;strong&gt;searching for the real problem&lt;/strong&gt; — does the most work.&lt;/p&gt;
&lt;p&gt;The job here is to observe and interview actual users and &lt;strong&gt;explore their needs&lt;/strong&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Why did they take that action?&lt;/li&gt;
&lt;li&gt;What was their emotional state, before and after touching the service?&lt;/li&gt;
&lt;li&gt;And so on.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These are the questions you use to diverge the problem space.&lt;/p&gt;
&lt;p&gt;You let it run wide — from the obvious things that feel too dumb to say, all the way out to weird and tangential ones — and you keep them all on the table.&lt;/p&gt;
&lt;h4 id=&quot;define&quot;&gt;Define&lt;/h4&gt;
&lt;p&gt;Once you have a spread of hypotheses, you narrow.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Which problem is the one users feel most strongly?&lt;/li&gt;
&lt;li&gt;What’s the underlying cause, and how do you abstract it?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Bring in the marketing and sales angles alongside the user angle, and converge from more than one axis.&lt;/p&gt;
&lt;h3 id=&quot;diverging-to-find-the-right-solution&quot;&gt;Diverging to find the right solution&lt;/h3&gt;
&lt;p&gt;From here, the work shifts closer to ordinary logical thinking.&lt;/p&gt;
&lt;p&gt;For ideation, I try to keep a few things in mind:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;More ideas is better than fewer&lt;/li&gt;
&lt;li&gt;The more obvious it seems, the more worth asking about&lt;/li&gt;
&lt;li&gt;Locking in a decision too early is a real risk&lt;/li&gt;
&lt;li&gt;Don’t shoot ideas down&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;the-downsides-of-design-thinking&quot;&gt;The downsides of design thinking&lt;/h3&gt;
&lt;h4 id=&quot;it-costs-time-and-money&quot;&gt;It costs time and money&lt;/h4&gt;
&lt;p&gt;By design (so to speak), the process eats time and money.&lt;/p&gt;
&lt;p&gt;Real product development has deadlines, so the practical move is to put a hard time limit on each loop before you start spinning.&lt;/p&gt;
&lt;h4 id=&quot;the-bar-to-actually-run-it-is-high&quot;&gt;The bar to actually run it is high&lt;/h4&gt;
&lt;p&gt;User perspective and empathy carry the whole thing, and neither is something you pick up overnight. It takes patient practice — observation, interviews, repeat.&lt;/p&gt;
&lt;p&gt;On top of that you need the imagination to spread ideas wide, so trying to run the full loop as a beginner is rough.&lt;/p&gt;
&lt;h4 id=&quot;its-overkill-for-small-improvements&quot;&gt;It’s overkill for small improvements&lt;/h4&gt;
&lt;p&gt;Because design thinking re-examines the problem from scratch, it’s strong at producing new solutions but expensive for incremental tweaks to existing features. For pure improvement work, plain logical thinking is often the faster path.&lt;/p&gt;
&lt;h2 id=&quot;putting-it-into-practice&quot;&gt;Putting it into practice&lt;/h2&gt;
&lt;p&gt;User perspective, empathy, idea generation — all of these need training, so running the full set from tomorrow morning isn’t realistic.&lt;/p&gt;
&lt;p&gt;The version I’ve landed on is to pull out the essence and mix it into ordinary work, a bit at a time.&lt;/p&gt;
&lt;h3 id=&quot;what-the-idea-is-really-getting-at&quot;&gt;What the idea is really getting at&lt;/h3&gt;
&lt;p&gt;The core, for me, is “search for the real problem” — or, said differently, &lt;u&gt;step back from the problem as it was handed to you&lt;/u&gt;.&lt;/p&gt;
&lt;p&gt;User perspective is the strongest lever, but you don’t have to be locked to it. Just imagining the context behind the subject opens up a different angle. Treating design thinking as &lt;strong&gt;a tool for shifting your viewpoint&lt;/strong&gt; is what makes it usable without ceremony.&lt;/p&gt;
&lt;h3 id=&quot;training-the-users-eye-view&quot;&gt;Training the user’s-eye view&lt;/h3&gt;
&lt;p&gt;A quick way to train the user’s-eye view is to actually pick up the competing products you use in daily life and try them.&lt;/p&gt;
&lt;p&gt;You start noticing the differences against what you’re used to, and the comparison becomes a habit. That’s the first step into the user’s-eye view.&lt;/p&gt;
&lt;h3 id=&quot;design-thinking-in-microdoses&quot;&gt;Design thinking, in microdoses&lt;/h3&gt;
&lt;p&gt;You don’t have to plant a flag that says “we’re doing design thinking now”. You can slip a fragment of the mindset into ordinary work.&lt;/p&gt;
&lt;p&gt;For example, on a given meeting agenda: is the agenda itself even framed correctly? Is the perspective too local? Practice it on small units, and the resolution of the discussion shifts, little by little.&lt;/p&gt;</content:encoded><category>build</category><category>UI</category></item><item><title>How to pick a microSD card — reading the spec markings and matching them to use case</title><link>https://aulvem.com/blog/2022-02-26-micro-sd-base/</link><guid isPermaLink="true">https://aulvem.com/blog/2022-02-26-micro-sd-base/</guid><description>What the SDHC / SDXC / Class10 / V30 / A1 markings on a microSD card actually mean, and the minimum spec you need for cameras, phones, and GoPros.</description><pubDate>Sat, 26 Feb 2022 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;2026 update&lt;/strong&gt;: ported from the old VuePress blog. The SD Association’s marking system hasn’t really changed since the original publication date, but I’ve revised the 2026 view of capacity-tier pricing and the state of SDUC (over-4TB) cards reaching the market. Specific product links should be re-checked and swapped to current models before going live.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;When you go to buy a microSD card, the cards on the shelf have an alarming number of markings on the face. “SDXC”, “U3”, “V30”, “A2”, “I”. Two cards of the same capacity can differ in price by a factor of two. Which one to buy?&lt;/p&gt;
&lt;p&gt;This piece sorts out how to read microSD markings and lays out the minimum spec by use case — phone, mirrorless camera, GoPro, Switch. By the end, the time spent staring at the shelf should drop to zero.&lt;/p&gt;
&lt;h2 id=&quot;the-short-answer--read-capacity-and-speed-separately-let-use-case-set-the-floor&quot;&gt;The short answer — read capacity and speed separately, let use case set the floor&lt;/h2&gt;
&lt;p&gt;Short answer: microSD performance is set by three layers — &lt;strong&gt;capacity class (SDHC / SDXC / SDUC)&lt;/strong&gt;, &lt;strong&gt;speed class (Class / UHS / Video Speed Class)&lt;/strong&gt;, and &lt;strong&gt;bus (UHS-I / II / III)&lt;/strong&gt;. Looking at any one of them in isolation isn’t enough to decide.&lt;/p&gt;
&lt;p&gt;Minimum spec by use case:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Phone (Android)&lt;/strong&gt;: 128GB / A1 / UHS-I&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mirrorless stills + burst&lt;/strong&gt;: 64GB or more / UHS-II card and body&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GoPro / action cam 4K&lt;/strong&gt;: 128GB / V30 / UHS-I U3&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Switch / handheld game consoles&lt;/strong&gt;: 128–256GB / UHS-I (capacity matters more than speed)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dashcam&lt;/strong&gt;: 64–128GB / High Endurance models&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Put differently: once the use case is fixed, you only have two or three markings left to read.&lt;/p&gt;
&lt;h2 id=&quot;capacity-class--sdhc--sdxc--sduc&quot;&gt;Capacity class — SDHC / SDXC / SDUC&lt;/h2&gt;
&lt;p&gt;Short answer: capacity class tells you the maximum capacity the card supports, and ties into compatibility with the device. If the device is recent, you mostly don’t have to worry about it.&lt;/p&gt;
&lt;p&gt;There are three generations:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;SDHC&lt;/strong&gt;: over 2GB up to 32GB&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SDXC&lt;/strong&gt;: over 32GB up to 2TB&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SDUC&lt;/strong&gt;: over 2TB up to 128TB&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Glossary&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;SDHC / SDXC / SDUC specify a pair: the card’s capacity ceiling and the filesystem it uses. SDHC is FAT32, SDXC is exFAT, SDUC is also exFAT. Drop a newer-generation card into an older device and it may not read because the filesystem isn’t supported.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;compatibility-older-devices-are-narrower&quot;&gt;Compatibility: older devices are narrower&lt;/h3&gt;
&lt;p&gt;Device support is backward-compatible only, not forward-compatible. From around 2015 onward, SDXC support is basically standard, so this rarely causes friction.&lt;/p&gt;





























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Device supports&lt;/th&gt;&lt;th style=&quot;text-align:center&quot;&gt;32GB and under (SDHC)&lt;/th&gt;&lt;th style=&quot;text-align:center&quot;&gt;64GB–2TB (SDXC)&lt;/th&gt;&lt;th style=&quot;text-align:center&quot;&gt;Over 2TB (SDUC)&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;SDHC only&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;OK&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;NG&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;NG&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Up to SDXC&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;OK&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;OK&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;NG&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;SDUC-ready&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;OK&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;OK&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;OK&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;As of 2026, SDUC cards are just starting to appear on the market, and there aren’t many cases where you’d actually want a card over 4TB. For general use, the SDXC range (64GB–1TB) is enough.&lt;/p&gt;
&lt;h2 id=&quot;speed-class--class--uhs-speed-class--video-speed-class&quot;&gt;Speed class — Class / UHS Speed Class / Video Speed Class&lt;/h2&gt;
&lt;p&gt;Short answer: speed class is a guaranteed &lt;strong&gt;minimum write speed&lt;/strong&gt;. There are three families — Class (old), UHS Speed Class (U), and Video Speed Class (V) — with newer ones being more strictly defined.&lt;/p&gt;
&lt;p&gt;It’s easy to muddle, but all three are about the floor (“never drops below this”), not the ceiling. The number matters most for use cases like video recording, where a stall is a real problem.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;What “speed class” means&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A guarantee from the SD Association on the minimum sustained write speed. “Class10”, “U1”, and “V10” are three different notations for the same 10 MB/s minimum. In some cases the markings are just different labels on the same performance.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;how-the-three-families-line-up&quot;&gt;How the three families line up&lt;/h3&gt;





















































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Min write&lt;/th&gt;&lt;th style=&quot;text-align:center&quot;&gt;Class&lt;/th&gt;&lt;th style=&quot;text-align:center&quot;&gt;UHS Speed&lt;/th&gt;&lt;th style=&quot;text-align:center&quot;&gt;Video Speed&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;2 MB/s&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;C2&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;—&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;—&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;4 MB/s&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;C4&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;—&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;—&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;6 MB/s&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;C6&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;—&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;V6&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;10 MB/s&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;C10&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;U1&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;V10&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;30 MB/s&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;—&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;U3&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;V30&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;60 MB/s&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;—&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;—&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;V60&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;90 MB/s&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;—&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;—&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;V90&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;As of 2026 the cards on store shelves are almost all U1 / U3 / V30 / V60 / V90. The older Class 2–6 cards have mostly disappeared.&lt;/p&gt;
&lt;h3 id=&quot;the-bus-interface-uhs-i--ii--iii-is-a-separate-thing&quot;&gt;The bus interface (UHS-I / II / III) is a separate thing&lt;/h3&gt;
&lt;p&gt;Where speed class guarantees a floor, the bus interface (the row of pins on the back of the card) defines the ceiling.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;UHS-I&lt;/strong&gt;: theoretical max 104 MB/s&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;UHS-II&lt;/strong&gt;: theoretical max 312 MB/s&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;UHS-III&lt;/strong&gt;: theoretical max 624 MB/s&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;UHS-II and above add a second row of pins on the back. If the device’s slot isn’t also UHS-II, the speed falls back to UHS-I levels. Phones, GoPros, and entry mirrorless cameras usually cap at UHS-I.&lt;/p&gt;
&lt;h2 id=&quot;application-performance-class-a1--a2&quot;&gt;Application Performance Class (A1 / A2)&lt;/h2&gt;
&lt;p&gt;Short answer: a spec for Android phones that keep apps on the SD card. On top of the minimum sustained write speed, it defines a floor for random I/O (IOPS).&lt;/p&gt;























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Class&lt;/th&gt;&lt;th style=&quot;text-align:center&quot;&gt;Min sustained write&lt;/th&gt;&lt;th style=&quot;text-align:center&quot;&gt;Min random read&lt;/th&gt;&lt;th style=&quot;text-align:center&quot;&gt;Min random write&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;A1&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;10 MB/s&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;1,500 IOPS&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;500 IOPS&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;A2&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;10 MB/s&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;4,000 IOPS&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;2,000 IOPS&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Sustained speed is identical, but A2 is faster on lots of small-file operations. If you’re moving apps onto the SD card, A2’s upside is easier to feel. That said, A2’s real gains depend on a caching mechanism on the device side, and on Android devices that don’t implement it you may not feel any difference from A1.&lt;/p&gt;
&lt;h2 id=&quot;picking-capacity--a-realistic-floor-by-use-case&quot;&gt;Picking capacity — a realistic floor by use case&lt;/h2&gt;
&lt;p&gt;Short answer: pick capacity by &lt;strong&gt;the band with the cheapest cost per GB&lt;/strong&gt;, not by “the most I could ever use”.&lt;/p&gt;
&lt;p&gt;Cost per GB usually bottoms out in the mid-capacity range (128–256GB). The price gap between 32GB and 128GB is often only a few hundred to a thousand yen, so when in doubt, you rarely lose by going bigger.&lt;/p&gt;
&lt;h3 id=&quot;targets-by-use-case&quot;&gt;Targets by use case&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Phone (photos, video, music)&lt;/strong&gt;: 128GB floor, 256GB for headroom&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;4K video recording (GoPro / camcorder)&lt;/strong&gt;: 128GB is about two hours (4K60p, 100 Mbps bitrate estimate)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mirrorless RAW burst&lt;/strong&gt;: 64GB is about 1,500–2,000 shots (24MP RAW estimate, depends on camera body)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Switch / handhelds&lt;/strong&gt;: 256GB holds roughly 20 downloaded titles&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dashcam&lt;/strong&gt;: 64–128GB in a High Endurance variant. Standard cards wear out on write cycles&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;comparison-minimum-spec-at-a-glance-by-use-case&quot;&gt;Comparison: minimum spec at a glance, by use case&lt;/h2&gt;





























































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Use case&lt;/th&gt;&lt;th style=&quot;text-align:center&quot;&gt;Capacity class&lt;/th&gt;&lt;th style=&quot;text-align:center&quot;&gt;Capacity target&lt;/th&gt;&lt;th style=&quot;text-align:center&quot;&gt;Speed class&lt;/th&gt;&lt;th style=&quot;text-align:center&quot;&gt;Bus&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Phone (Android)&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;SDXC&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;128GB&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;A1 / U1&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;UHS-I&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Android with apps on SD&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;SDXC&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;128GB&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;A2 / U1&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;UHS-I&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GoPro / 4K action&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;SDXC&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;128GB&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;V30 / U3&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;UHS-I&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;8K camcorder&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;SDXC&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;256GB+&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;V60 / V90&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;UHS-II&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Mirrorless stills + burst&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;SDXC&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;64GB+&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;V60 / V90&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;UHS-II&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Switch&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;SDXC&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;128–256GB&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;U1 / U3&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;UHS-I&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Dashcam&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;SDXC&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;64–128GB&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;U1 (High Endurance)&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;UHS-I&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;recommended-microsd-cards&quot;&gt;Recommended microSD cards&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;The picks below reflect the direction at the time of writing. From a 2026 vantage point, verify the current model in the same price band before linking.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;phone--switch--128gb--a1--u1&quot;&gt;Phone / Switch — 128GB / A1 / U1&lt;/h3&gt;
&lt;p&gt;A generalist baseline. As long as it meets A1 and U1 with 128GB or more, daily use is covered. SanDisk Ultra, Samsung EVO Select, and Kingston Canvas Select Plus are the usual suspects.&lt;/p&gt;
&lt;h3 id=&quot;gopro--4k-video--128gb--v30--u3&quot;&gt;GoPro / 4K video — 128GB / V30 / U3&lt;/h3&gt;
&lt;p&gt;Pick a card that clears V30. Choosing one that’s on GoPro’s official compatibility list makes it easier to dodge edge-case issues. SanDisk Extreme and Lexar Professional 1066x are common picks.&lt;/p&gt;
&lt;h3 id=&quot;mirrorless-burst--uhs-ii--v60v90&quot;&gt;Mirrorless burst — UHS-II / V60–V90&lt;/h3&gt;
&lt;p&gt;Assumes the camera body itself is UHS-II. The card speed maps directly onto how long the burst buffer takes to clear. Price is two to three times a UHS-I card.&lt;/p&gt;
&lt;h2 id=&quot;faq&quot;&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Q. 32GB or 128GB — which should I buy if I’m undecided?&lt;/strong&gt;
A. If undecided, 128GB. Cost per GB bottoms out in the mid-capacity range, and the price gap from 32GB is usually a few hundred to a thousand yen. The bigger risk is running out of room for video or apps.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. How do Class10, UHS-I U1, and V10 differ?&lt;/strong&gt;
A. All three mean a minimum write speed of 10 MB/s — just in different notations. Class is the old standard, U was defined for the UHS bus, and V was defined for video. Cards on the shelf today mostly use the V or U markings.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. What does a Nintendo Switch need?&lt;/strong&gt;
A. Switch officially recommends a UHS-I microSDXC. Capacity matters more than speed class in daily use, so a 128GB–256GB UHS-I U1 / U3 is plenty.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. Does a more expensive UHS-II card actually run faster?&lt;/strong&gt;
A. Not unless the device has a UHS-II slot. Phones, GoPros, and entry mirrorless cameras top out at UHS-I. UHS-II earns its price on mid-to-high mirrorless bodies doing burst shooting, and on 8K camcorders.&lt;/p&gt;
&lt;h2 id=&quot;wrapping-up&quot;&gt;Wrapping up&lt;/h2&gt;
&lt;p&gt;microSD markings stop being confusing once you read them in three layers: capacity class / speed class / bus.&lt;/p&gt;
&lt;p&gt;Fix the use case and the required spec narrows quickly. Phone: 128GB + A1. 4K video: 128GB + V30. Mirrorless burst: a UHS-II card. Switch: capacity first. Going the other way — buying “the fastest one” without a use case in mind — is the classic way to overpay for performance the device can’t actually use.&lt;/p&gt;
&lt;p&gt;When you’re staring at the shelf, narrow your use case to one first. The marking decoder comes after.&lt;/p&gt;
</content:encoded><category>reviews</category><category>PCPeripherals</category></item><item><title>Manfrotto PIXI EVO review — a ball-head mini tripod that holds a full-frame body and still fits in a bag</title><link>https://aulvem.com/blog/2022-02-16-manfrotto-pixi-evo/</link><guid isPermaLink="true">https://aulvem.com/blog/2022-02-16-manfrotto-pixi-evo/</guid><description>Two-plus years with the Manfrotto PIXI EVO. A rated 2.5 kg load means it carries a full-frame body, and the low-to-high height range covers desk and eye-level scenes. At 270g it is on the heavy side, and the stiff ball-head lock makes 1° tweaks awkward.</description><pubDate>Wed, 16 Feb 2022 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;2026 update&lt;/strong&gt;: Ported from the old VuePress blog. The PIXI EVO is still in Manfrotto’s current line-up in 2026 as a staple model. The angles reviewed here — load rating, two-stage leg angle plus four-section legs, stiff ball-head lock — still hold up as practical buying criteria. The numbers are the manufacturer’s published figures from the original writing; current official specs may differ.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;When I picked up a mirrorless body, I went looking for a single mini tripod that could cover desk, café, and outdoor snap shooting. Conditions: it had to stay rigid with a full-frame body on top, fit in a bag, and span low and high heights within reason.&lt;/p&gt;
&lt;p&gt;I landed on the &lt;strong&gt;Manfrotto PIXI EVO&lt;/strong&gt;. It is one step heavier than the plain PIXI from the same family, and in exchange you get four-section telescoping legs and two leg-angle modes. After more than two years of carrying it from indoor product shots to travel snaps, this is the write-up.&lt;/p&gt;
&lt;h2 id=&quot;the-verdict--a-strong-pick-if-you-want-one-mini-tripod-that-takes-a-full-frame-body&quot;&gt;The verdict — a strong pick if you want one mini tripod that takes a full-frame body&lt;/h2&gt;
&lt;p&gt;Short answer: a rated 2.5 kg load covers a full-frame body, and two leg angles plus four-section telescoping legs span desk-low to just-below-eye-level. As all-rounder ball-head mini tripods go, it is one of the few practical ones.&lt;/p&gt;
&lt;p&gt;The reasoning is simple. Mini tripods that combine “carries real weight” with “covers a real height range” are rarer than the category suggests. Most mini tripods rate at around 1 kg, have fixed-length legs, and either cannot take a full-frame body or can but never change height. The PIXI EVO addresses both gaps at once.&lt;/p&gt;
&lt;p&gt;That said, some buyers will be happier elsewhere:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;People who want to wrap legs around a pillar or handrail&lt;/strong&gt;: the flexible-leg &lt;a href=&quot;https://aulvem.com/blog/2021-03-03-jobygorillapod-jb01542-pkk/&quot;&gt;JOBY GorillaPod&lt;/a&gt; fits that use case better&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;People counting every gram&lt;/strong&gt;: at 270g it is heavy for its class&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;People who need 1° video levelling&lt;/strong&gt;: the ball-head lock is stiff, so micro-adjustments are awkward&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;build--red-logo-on-top-stubby-integrated-head-silhouette&quot;&gt;Build — red logo on top, stubby integrated-head silhouette&lt;/h2&gt;
&lt;p&gt;Short answer: matte-black legs with the red Manfrotto logo on the ball head — a familiar Manfrotto palette. The head and legs are one piece, and the head lock is the unusual “turn the logo on top” mechanism.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Manfrotto PIXI EVO seen from the front&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2022-02-16-manfrotto-pixi-evo/2022-02-16-Manfrotto-Pixi-Evo-front.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;p&gt;Categorically it is a &lt;strong&gt;1/4-inch ball-head mini tripod&lt;/strong&gt;. The legs carry an angle-mode switch at the base and a push-button telescoping lock on each leg. The silhouette is distinctive enough to stick in memory.&lt;/p&gt;





























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align:left&quot;&gt;Item&lt;/th&gt;&lt;th style=&quot;text-align:left&quot;&gt;Value&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Own weight&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;About 270g (rated)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Maximum load&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;About 2.5 kg (rated)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Head&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Ball head (1/4-inch screw top plate)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Leg sections&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;4&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Leg-angle modes&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;2 (normal / low)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;img width=&quot;800&quot; alt=&quot;Close-up of the PIXI EVO ball head&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2022-02-16-manfrotto-pixi-evo/2022-02-16-Manfrotto-Pixi-Evo-heads.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;p&gt;You lock the head by turning the red Manfrotto logo on the front. It is firm enough that it does not slip on its own. The 1/4-inch screw tightens via the dial on the head. An Arca-Swiss compatible clamp will screw on, but it is close to twice the head’s width, so the rig leans top-heavy.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Leg-angle mode switch at the base of the PIXI EVO&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2022-02-16-manfrotto-pixi-evo/2022-02-16-Manfrotto-Pixi-Evo-switch.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;p&gt;A slide switch at the base of the legs flips between normal and low leg-angle modes. The two modes are printed under the switch, so first-time use is unambiguous.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;PIXI EVO in low leg-angle mode, sitting flat on a surface&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2022-02-16-manfrotto-pixi-evo/2022-02-16-Manfrotto-Pixi-Evo-open.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;p&gt;In low mode the legs splay almost flat to the surface. Useful when you are shooting product photos on a desk and want the camera right at subject height.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;PIXI EVO folded down into a slim cylinder&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2022-02-16-manfrotto-pixi-evo/2022-02-16-Manfrotto-Pixi-Evo-foldable.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;p&gt;Folded, it is a slim cylinder. The backs of the three legs are cut at an angle so they sit flush against each other when closed. The result fits into a gap in a camera bag or the side pocket of a jacket.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Push-button telescoping lock on each PIXI EVO leg&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2022-02-16-manfrotto-pixi-evo/2022-02-16-Manfrotto-Pixi-Evo-button.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;p&gt;Each leg has a push-button telescoping lock. Press, pull, release — that is the whole interaction.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;PIXI EVO with all legs extended fully&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2022-02-16-manfrotto-pixi-evo/2022-02-16-Manfrotto-Pixi-Evo-stretch.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;p&gt;The legs telescope in four sections. They lock at intermediate stops too, but in practice almost every shoot ends up using either fully extended or fully retracted. Treat the in-between stops as fine adjustment and the design reads more cleanly.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;PIXI EVO with a GoPro mounted, for scale&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2022-02-16-manfrotto-pixi-evo/2022-02-16-Manfrotto-Pixi-Evo-gopro.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;p&gt;The camera body was in use for these review shots, so a GoPro stands in. For a GoPro-class load the PIXI EVO is wildly overspec’d, but the stability feels reassuring all the same.&lt;/p&gt;
&lt;h2 id=&quot;what-worked&quot;&gt;What worked&lt;/h2&gt;
&lt;p&gt;Short answer: it stays rigid with a full-frame body on top; the two leg-angle modes plus four-section legs give it a real working height range; folded, it collapses into a slim stick that goes in a bag.&lt;/p&gt;
&lt;h3 id=&quot;a-25-kg-load-rating--full-frame-bodies-are-realistic&quot;&gt;A 2.5 kg load rating — full-frame bodies are realistic&lt;/h3&gt;
&lt;p&gt;Unusually for a mini tripod, the head does not give up under a full-frame body with a standard zoom. A pro-grade telephoto zoom puts the centre of gravity too high to recommend, but anything up to a standard zoom is fine for desk product shots, table photography, and low-position street snaps.&lt;/p&gt;
&lt;p&gt;The leg tips are rubber and grip on flooring and desk tops well. On gravel or concrete steps outdoors you have to adjust the leg angle so they bite, but that is a mini-tripod constraint in general, not a PIXI EVO one.&lt;/p&gt;
&lt;h3 id=&quot;two-leg-angle-modes-plus-four-section-legs--real-working-height-range&quot;&gt;Two leg-angle modes plus four-section legs — real working height range&lt;/h3&gt;
&lt;p&gt;A typical mini tripod has fixed-length legs, which means it has exactly one usable height: “sitting on a desk.” The PIXI EVO sits flat on the floor in low mode, and reaches just below eye level in normal mode with the legs fully extended.&lt;/p&gt;
&lt;p&gt;On a desk, low mode puts the camera at subject height for product shots. Outdoors, normal mode plus fully extended legs hits hip height for snap shots. Switching between scenes is fast. If you only want to carry one mini tripod across two or three shooting contexts, that flexibility earns its keep.&lt;/p&gt;
&lt;h3 id=&quot;folds-into-a-stick--fits-in-the-gaps-in-a-bag&quot;&gt;Folds into a stick — fits in the gaps in a bag&lt;/h3&gt;
&lt;p&gt;The angled cuts on the back of each leg mean the closed unit becomes a slim cylinder. It slides into the divider gap in a camera bag, or into the side pocket of a daypack. As “carryable in spite of being built for full-frame bodies” goes, it lands in the realm of “heavy but you will still bring it.”&lt;/p&gt;
&lt;h3 id=&quot;doubles-as-a-selfie-stick&quot;&gt;Doubles as a selfie stick&lt;/h3&gt;
&lt;p&gt;With the legs folded, you can hold the column as a handle and get a passable selfie stick. Extending the legs while keeping them closed buys another few dozen centimetres. It will not match a dedicated selfie stick for length or weight, but on a trip the fact that you do not have to pack both a tripod and a selfie stick adds up.&lt;/p&gt;
&lt;h2 id=&quot;what-didnt&quot;&gt;What didn’t&lt;/h2&gt;
&lt;p&gt;Short answer: 270g is heavy for the class; the stiff ball-head lock makes 1° tweaks awkward; the bare 1/4-inch screw on top is exposed.&lt;/p&gt;
&lt;h3 id=&quot;270g-own-weight--you-notice-it-in-the-pouch&quot;&gt;270g own weight — you notice it in the pouch&lt;/h3&gt;
&lt;p&gt;This is the flip side of “rigid enough for a full-frame body.” For a mini tripod it is on the heavy end. Drop it into a sacoche or a small pouch and you get a “do I really need to bring this today?” moment before heading out.&lt;/p&gt;
&lt;p&gt;If portability is the deciding factor, a sub-60g flexible-leg option like the &lt;a href=&quot;https://aulvem.com/blog/2021-03-03-jobygorillapod-jb01542-pkk/&quot;&gt;JOBY GorillaPod JB01542-PKK&lt;/a&gt; is the lighter answer. Load capacity and rigidity are separate concerns, though — the choice is “lighter, or higher load.”&lt;/p&gt;
&lt;h3 id=&quot;stiff-ball-head-lock-awkward-at-fine-adjustments&quot;&gt;Stiff ball-head lock, awkward at fine adjustments&lt;/h3&gt;
&lt;p&gt;The red logo plate that doubles as the head lock is firm. From a “do not let the camera fall” angle that is the right design choice, but when you are tightening a composition by one degree at a time, loosening the lock often shifts the framing more than you intended.&lt;/p&gt;
&lt;p&gt;For video work where you want strict horizon levelling, or panning at a controlled speed, a three-way head or a dedicated ball head with independent lock pressure is the better tool. For stills, it is rarely a problem.&lt;/p&gt;
&lt;h3 id=&quot;the-bare-14-inch-screw-on-top&quot;&gt;The bare 1/4-inch screw on top&lt;/h3&gt;
&lt;p&gt;There is no quick-release plate — the 1/4-inch screw sits exposed on the head’s top plate. Take the camera off and toss the tripod into a bag, and the screw rubs against the bag’s inner lining. A fabric inner case is enough to dodge the issue, but it is a design quirk.&lt;/p&gt;
&lt;h2 id=&quot;comparison&quot;&gt;Comparison&lt;/h2&gt;
&lt;p&gt;Short answer: heavier than a flexible-leg tripod but more rigid; heavier and pricier than the plain PIXI but with more load capacity and height range; less tall than a typical telescoping mini tripod, but more compact head-and-all.&lt;/p&gt;
&lt;h3 id=&quot;vs-joby-gorillapod-jb01542-pkk--light-and-unusual-placements-vs-rigid-and-high-load&quot;&gt;vs JOBY GorillaPod JB01542-PKK — “light and unusual placements” vs “rigid and high load”&lt;/h3&gt;








































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Angle&lt;/th&gt;&lt;th&gt;Manfrotto PIXI EVO&lt;/th&gt;&lt;th&gt;JOBY GorillaPod JB01542-PKK&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Intended gear&lt;/td&gt;&lt;td&gt;Phone to full-frame standard zoom&lt;/td&gt;&lt;td&gt;Phone, webcam, GoPro&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Own weight&lt;/td&gt;&lt;td&gt;About 270g (rated)&lt;/td&gt;&lt;td&gt;About 52g (rated)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Maximum load&lt;/td&gt;&lt;td&gt;About 2.5 kg (rated)&lt;/td&gt;&lt;td&gt;About 325g (rated)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Mounting site&lt;/td&gt;&lt;td&gt;Flat floor or desk&lt;/td&gt;&lt;td&gt;Floor, pillar, handrail, shelf edge&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Height adjustment&lt;/td&gt;&lt;td&gt;2 leg angles + 4-section legs&lt;/td&gt;&lt;td&gt;Bend the legs as needed&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Ball-head lock&lt;/td&gt;&lt;td&gt;Yes (firm)&lt;/td&gt;&lt;td&gt;Yes (firm, stepless)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;The PIXI EVO is for &lt;strong&gt;planting heavy gear on a flat surface&lt;/strong&gt;. The GorillaPod is for &lt;strong&gt;hooking light gear onto a non-flat one&lt;/strong&gt;. The use cases are opposite, so the decision is “do I want to carry weight, or to place it in odd spots.” For a full comparison, see the &lt;a href=&quot;https://aulvem.com/blog/2021-03-03-jobygorillapod-jb01542-pkk/&quot;&gt;JOBY GorillaPod JB01542-PKK review&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;vs-the-plain-pixi--lighter-and-cheaper-vs-more-load-and-more-height&quot;&gt;vs the plain PIXI — “lighter and cheaper” vs “more load and more height”&lt;/h3&gt;



































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Angle&lt;/th&gt;&lt;th&gt;PIXI EVO&lt;/th&gt;&lt;th&gt;Plain PIXI&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Intended gear&lt;/td&gt;&lt;td&gt;Up to full-frame standard zoom&lt;/td&gt;&lt;td&gt;Up to mirrorless standard zoom&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Maximum load&lt;/td&gt;&lt;td&gt;About 2.5 kg (rated)&lt;/td&gt;&lt;td&gt;About 1 kg (rated)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Leg sections&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;None (fixed length)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Leg-angle modes&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Price tier&lt;/td&gt;&lt;td&gt;Mid&lt;/td&gt;&lt;td&gt;Entry&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;If a phone, a compact, or a mirrorless body with a kit zoom is the full scope of use, the plain PIXI is enough. If “I might bring a full-frame body one day” or “I want to switch between low and high” is part of the plan, the EVO’s price premium is meaningful.&lt;/p&gt;
&lt;h3 id=&quot;vs-a-typical-telescoping-mini-tripod&quot;&gt;vs a typical telescoping mini tripod&lt;/h3&gt;



































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Angle&lt;/th&gt;&lt;th&gt;PIXI EVO&lt;/th&gt;&lt;th&gt;Typical telescoping mini tripod&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Maximum height&lt;/td&gt;&lt;td&gt;4-section legs + normal angle&lt;/td&gt;&lt;td&gt;Centre column reaches higher&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Head&lt;/td&gt;&lt;td&gt;Integrated ball head&lt;/td&gt;&lt;td&gt;Sometimes three-way heads&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Fine adjustment&lt;/td&gt;&lt;td&gt;Weak (lock is firm)&lt;/td&gt;&lt;td&gt;Three-way heads handle this well&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Folded form&lt;/td&gt;&lt;td&gt;Legs flush, slim cylinder&lt;/td&gt;&lt;td&gt;Head tends to protrude&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Portability&lt;/td&gt;&lt;td&gt;Fits gaps in a bag&lt;/td&gt;&lt;td&gt;Depends on size&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;If “slim when folded” and “switch between desk-low and just-below-eye-level” matter, the PIXI EVO wins. If “tallest possible” and “smooth video adjustment” matter, you are looking at a different category. Same “mini tripod” label, different target situations.&lt;/p&gt;
&lt;aside class=&quot;aff-card not-prose my-10 rounded-2xl border border-[color:var(--aulvem-border)] bg-[color:var(--aulvem-surface)] px-5 py-5 sm:px-6 sm:py-6 has-image&quot; aria-label=&quot;Buy links for Manfrotto PIXI EVO (MTPIXIEVO-BK)&quot; data-astro-cid-qoq25xnm&gt;&lt;div class=&quot;aff-image&quot; data-astro-cid-qoq25xnm&gt;&lt;img src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2022-02-16-manfrotto-pixi-evo/2022-02-16-Manfrotto-Pixi-Evo.webp&quot; alt=&quot;&quot; aria-hidden=&quot;true&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; data-astro-cid-qoq25xnm&gt;&lt;/div&gt;&lt;p class=&quot;aff-title&quot; data-astro-cid-qoq25xnm&gt;Manfrotto PIXI EVO (MTPIXIEVO-BK)&lt;/p&gt;&lt;div class=&quot;aff-buttons&quot; data-astro-cid-qoq25xnm&gt;&lt;a href=&quot;https://www.amazon.co.jp/dp/B0152X16XO/?language=en_US&amp;amp;tag=aulvem-22&quot; aria-label=&quot;View Manfrotto PIXI EVO (MTPIXIEVO-BK) on Amazon Japan (primarily sold in Japan)&quot; rel=&quot;sponsored nofollow noopener noreferrer&quot; target=&quot;_blank&quot; class=&quot;aff-btn inline-flex items-center gap-2 rounded-lg border border-[color:var(--aulvem-border)] bg-white px-4 py-2.5 transition-colors hover:border-aulvem-orange&quot; style=&quot;font-size: 14px; font-weight: 500;&quot; data-astro-cid-qoq25xnm&gt;&lt;img src=&quot;https://api.iconify.design/fa6-brands/amazon.svg?color=%23FF9900&quot; width=&quot;16&quot; height=&quot;16&quot; alt=&quot;&quot; aria-hidden=&quot;true&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; style=&quot;display:block&quot; data-astro-cid-qoq25xnm&gt;&lt;span data-astro-cid-qoq25xnm&gt;View on Amazon Japan&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;p class=&quot;aff-note&quot; data-astro-cid-qoq25xnm&gt;
Primarily sold in Japan. amazon.co.jp may ship internationally on select items.
&lt;/p&gt;&lt;/aside&gt;
&lt;h2 id=&quot;faq&quot;&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Q. Should I pick the plain PIXI or the PIXI EVO?&lt;/strong&gt;
A. Decide by the gear you plan to mount. For a phone, a compact, or a mirrorless body with a kit zoom, the plain PIXI is enough. If a full-frame body with a standard-to-short-telephoto zoom is in scope, the PIXI EVO’s 2.5 kg rating and four-section legs are the safer choice. Conversely, if you only ever sit it on a desk to shoot phone vlogs, the EVO’s extra weight and bulk are overkill.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. Can it double as a selfie stick for a GoPro or a phone?&lt;/strong&gt;
A. With the legs closed, you can grip the column as a handle and treat it as a makeshift selfie stick. Extending the legs while keeping them closed buys another few dozen centimetres of reach. It will not match a dedicated selfie stick for length or weight, so think of it as a tripod that occasionally pulls double duty.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. Will it carry an Arca-Swiss compatible clamp?&lt;/strong&gt;
A. The head’s top plate is a 1/4-inch screw, so a standard Arca-Swiss clamp screws on directly. The clamp is usually close to twice the width of the head itself, so the rig ends up top-heavy. If Arca-Swiss is your default, picking the smallest clamp you can live with is steadier than swapping the head outright.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. Can I use it outdoors with a full-frame DSLR or mirrorless?&lt;/strong&gt;
A. Within the stated 2.5 kg load it carries fine, but ground and wind matter. On gravel or concrete steps, adjust the leg angle so the rubber feet bite. For long exposures, keep the centre of gravity low — no centre-column extension, no strap wrapped around the body. On windy days, hang a bag under the tripod as ballast.&lt;/p&gt;
&lt;h2 id=&quot;verdict--a-strong-pick-if-you-want-exactly-one-mini-tripod&quot;&gt;Verdict — a strong pick if you want exactly one mini tripod&lt;/h2&gt;
&lt;p&gt;The PIXI EVO is one of the few mini tripods that simultaneously delivers load capacity, rigidity, a working height range, and a slim folded form. It is heavier than phone-only ultralights, and it cannot wrap legs around a pillar like a flexible-leg tripod, but it does make the realistic case — “carry one tripod that handles full-frame bodies indoors and outdoors” — actually work.&lt;/p&gt;
&lt;p&gt;In more than two years of daily-ish use, neither the head lock nor the telescoping locks have loosened with age. For someone who would rather carry a little more weight in exchange for a tripod that lasts, it is the right tool.&lt;/p&gt;
&lt;p&gt;If “as light as possible” or “wrap it around a pillar” is the real requirement, a different category will be a happier purchase. If the use case is “plant slightly heavy gear on a flat surface,” this is a hard one to regret.&lt;/p&gt;
</content:encoded><category>reviews</category><category>cameraEquipment</category></item><item><title>Minecraft PC specs — a mid-range GPU is enough for Bedrock; for MOD/Java, mid-range GPU + 16 GB is the realistic line</title><link>https://aulvem.com/blog/2021-04-27-minecraft-pc/</link><guid isPermaLink="true">https://aulvem.com/blog/2021-04-27-minecraft-pc/</guid><description>Recommended PC specs for playing Minecraft comfortably. Bedrock (Bedrock Edition) and Java Edition have different requirements; for MODs and shader MODs, a mid-range GPU and 16 GB of RAM is the realistic floor.</description><pubDate>Tue, 27 Apr 2021 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;2026 update&lt;/strong&gt;: ported from the old VuePress blog. When this was first written in 2021, the baseline was a GTX 1650 / Core i5-era machine. Today Bedrock Edition is the default, and Java has settled into the role of “the MOD edition”. The piece has been rewritten end to end to reflect that.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;You want to play Minecraft on a PC. But the gaming-PC market is wide, and it’s hard to tell how far you actually need to push the specs.&lt;/p&gt;
&lt;p&gt;This piece splits Minecraft PCs into three use cases — “lightly playing vanilla Bedrock”, “Java with a lot of MODs”, and “also streaming” — and maps each to a realistic spec target. The numbers are anchored to 2026.&lt;/p&gt;
&lt;h2 id=&quot;the-short-answer--80000100000-yen-for-bedrock-150000-yen-and-up-for-java--mods&quot;&gt;The short answer — 80,000–100,000 yen for Bedrock, 150,000 yen and up for Java + MODs&lt;/h2&gt;
&lt;p&gt;Short version: Minecraft is a light game on paper, but the second you start stacking MODs on Java, the required specs jump.&lt;/p&gt;
&lt;p&gt;The realistic 2026 targets fall into three tiers.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Vanilla Bedrock&lt;/strong&gt;: GTX 1650 / RTX 3050-class GPU + 16 GB RAM + Ryzen 5 / Core i5. 80,000–100,000 yen for a prebuilt&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Java + MODs / shader MODs&lt;/strong&gt;: RTX 4060-class GPU + 32 GB RAM + Ryzen 5 / Core i5 (6 cores or more). 150,000–200,000 yen&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Streaming too&lt;/strong&gt;: RTX 4060 Ti or better + 32 GB RAM + Ryzen 7 / Core i7 (8 cores or more). 200,000 yen and up&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The flip side: a bargain laptop with only integrated graphics will force you to cut render distance even on vanilla. If you plan to play long-term, picking a discrete-GPU machine from the start tends to be the cheaper choice in the end.&lt;/p&gt;
&lt;h2 id=&quot;how-to-read-the-recommended-specs--official-numbers-are-the-minimum-to-run&quot;&gt;How to read the recommended specs — official numbers are the “minimum to run”&lt;/h2&gt;
&lt;p&gt;Short version: &lt;a href=&quot;https://help.minecraft.net/hc/en-us/articles/360035131371-Minecraft-Java-Edition-system-requirements-&quot; rel=&quot;noopener noreferrer sponsored nofollow&quot; target=&quot;_blank&quot;&gt;Mojang’s official recommended specs&lt;/a&gt; are the floor for “runs without stuttering”, not the line for “plays comfortably”.&lt;/p&gt;
&lt;p&gt;The official Java recommended specs (as of 2026) sit roughly here:&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;CPU: Intel Core i5-4690 3.5GHz / AMD A10-7800 APU 3.5GHz equivalent&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;RAM: 8 GB&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;GPU: GeForce 700 series / Radeon Rx 200 series (OpenGL 4.5 capable)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Storage: 4 GB SSD&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;OS: Windows 10 or later / macOS 10.12 or later / major Linux distros&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;What to take from this: &lt;strong&gt;Java leans on the CPU and RAM&lt;/strong&gt;. The GPU can be modest and the game will still run, but redstone circuits and large builds depend heavily on single-threaded CPU performance — cut the CPU and you’ll feel it in world loading and chunk generation.&lt;/p&gt;
&lt;h3 id=&quot;bedrock-requirements-are-lower-but-rtx-is-its-own-story&quot;&gt;Bedrock requirements are lower, but RTX is its own story&lt;/h3&gt;
&lt;p&gt;Bedrock Edition is built on DirectX 12 and is more optimised, so at equal graphics settings it runs lighter than Java. The official RTX ray-tracing mode is a separate matter, though — it needs ray-tracing cores on the GPU, which in practice means RTX 20-series or newer.&lt;/p&gt;
&lt;h3 id=&quot;for-java-mods-are-the-real-workload&quot;&gt;For Java, MODs are the real workload&lt;/h3&gt;
&lt;p&gt;Java is best planned around MODs from the start. Once MODs and shader MODs go in:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Shader MODs (OptiFine, Iris + Sodium and friends)&lt;/strong&gt;: GPU load climbs sharply&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Large MOD packs (200–400 mods)&lt;/strong&gt;: RAM use rises from 8 GB to 12–16 GB&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Heavy industrial / automation MODs&lt;/strong&gt;: single-thread CPU and RAM bandwidth start to matter&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The official spec table is for &lt;strong&gt;vanilla Java&lt;/strong&gt;, so if MODs are in the plan, bump one or two ranks above it.&lt;/p&gt;
&lt;h2 id=&quot;modjava-vs-bedrock--choosing-in-2026&quot;&gt;MOD/Java vs Bedrock — choosing in 2026&lt;/h2&gt;
&lt;p&gt;Short version: in 2026, Bedrock is the default; Java is what you keep around for MODs and shader MODs.&lt;/p&gt;
&lt;p&gt;Buying Minecraft on a PC store generally bundles Java &amp;amp; Bedrock Edition together, so the question isn’t “which do I buy?” — it’s “which do I mostly play?”&lt;/p&gt;
&lt;h3 id=&quot;reasons-to-pick-bedrock&quot;&gt;Reasons to pick Bedrock&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Crossplay&lt;/strong&gt;: multiplayer with Switch / PlayStation / Xbox / phones&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Official RTX support&lt;/strong&gt;: ray tracing out of the box&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Marketplace&lt;/strong&gt;: official store for skins and worlds&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;reasons-to-pick-java&quot;&gt;Reasons to pick Java&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;MOD ecosystem&lt;/strong&gt;: a mature MOD culture built around Forge and Fabric&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Shader MODs&lt;/strong&gt;: Iris + Sodium lets you raise the visuals while keeping things light&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Backwards compatibility&lt;/strong&gt;: Java worlds from the 2010s open as-is&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Bedrock’s RTX and Java’s shader MODs are two different things. Both fall under “I want Minecraft to look good”, but the kind of GPU each one wants is different, and it’s worth keeping that distinction in mind.&lt;/p&gt;
&lt;h2 id=&quot;comparison-table--recommended-specs-by-use-case&quot;&gt;Comparison table — recommended specs by use case&lt;/h2&gt;















































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Aspect&lt;/th&gt;&lt;th&gt;Lightweight (vanilla Bedrock)&lt;/th&gt;&lt;th&gt;MOD-heavy (Java + shader MODs)&lt;/th&gt;&lt;th&gt;Streaming too&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;CPU&lt;/td&gt;&lt;td&gt;Ryzen 5 / Core i5 (6 cores)&lt;/td&gt;&lt;td&gt;Ryzen 5 / Core i5 (6 cores or more)&lt;/td&gt;&lt;td&gt;Ryzen 7 / Core i7 (8 cores or more)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GPU&lt;/td&gt;&lt;td&gt;GTX 1650 / RTX 3050&lt;/td&gt;&lt;td&gt;RTX 4060&lt;/td&gt;&lt;td&gt;RTX 4060 Ti or better&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;RAM&lt;/td&gt;&lt;td&gt;16 GB&lt;/td&gt;&lt;td&gt;32 GB&lt;/td&gt;&lt;td&gt;32 GB&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Storage&lt;/td&gt;&lt;td&gt;500 GB SSD&lt;/td&gt;&lt;td&gt;1 TB SSD (MOD packs and world files take room)&lt;/td&gt;&lt;td&gt;1 TB SSD + a second SSD for recordings&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Render distance&lt;/td&gt;&lt;td&gt;16–24 chunks / 60 fps&lt;/td&gt;&lt;td&gt;24–32 chunks / 60 fps&lt;/td&gt;&lt;td&gt;16–24 chunks + 60 fps stream&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Price band (prebuilt)&lt;/td&gt;&lt;td&gt;80,000–100,000 yen&lt;/td&gt;&lt;td&gt;150,000–200,000 yen&lt;/td&gt;&lt;td&gt;200,000–300,000 yen&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;The numbers are pegged to a 2026 mid-range build.&lt;/p&gt;
&lt;h3 id=&quot;cpu-single-thread-speed-matters-more-than-core-count&quot;&gt;CPU: single-thread speed matters more than core count&lt;/h3&gt;
&lt;p&gt;Java’s chunk generation and redstone math lean on a single thread, so per-core performance (clock × IPC) moves the needle more than core count. Core count starts to matter only once you add streaming — the encoder will use it.&lt;/p&gt;
&lt;h3 id=&quot;gpu-bedrock-rtx-or-java-shader-mods-decides-the-target&quot;&gt;GPU: “Bedrock RTX or Java shader MODs” decides the target&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Bedrock RTX&lt;/strong&gt;: RTX 20-series or newer; a 4060 is plenty&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Java + Sodium + shader MODs&lt;/strong&gt;: RTX 3060 for medium settings, RTX 4060 or better for high&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you just default to “RTX 4060”, you cover both Bedrock RTX and the heavier Java shader setups.&lt;/p&gt;
&lt;h3 id=&quot;ram-pick-based-on-mod-pack-size&quot;&gt;RAM: pick based on MOD pack size&lt;/h3&gt;
&lt;p&gt;Vanilla alone runs fine on 16 GB. For MOD packs, go with 32 GB. Java’s launch arguments (&lt;code&gt;-Xmx&lt;/code&gt;) let you assign how much RAM the game gets, so you also want headroom for the system on top of that.&lt;/p&gt;
&lt;h3 id=&quot;storage-ssd-is-the-only-call-size-depends-on-worlds-and-mods&quot;&gt;Storage: SSD is the only call; size depends on worlds and MODs&lt;/h3&gt;
&lt;p&gt;For just the OS and Minecraft itself, 100 GB is enough. But once you stack MOD packs and large worlds (a few GB per world), things fill up fast. Putting a 1 TB SSD in from the start saves regret later.&lt;/p&gt;
&lt;h2 id=&quot;recommended-builds&quot;&gt;Recommended builds&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;The picks below are anchored to 2026. BTO line-ups shift month to month, so verify the latest-generation equivalent before buying.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;bedrock-focused-a-gaming-laptop-is-enough&quot;&gt;Bedrock-focused: a gaming laptop is enough&lt;/h3&gt;
&lt;p&gt;For lightweight play, a 15.6-inch gaming laptop with an RTX 3050 Ti / 4050 is plenty.&lt;/p&gt;





























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align:left&quot;&gt;Item&lt;/th&gt;&lt;th style=&quot;text-align:left&quot;&gt;Spec&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Display&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;15.6-inch FHD&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;CPU&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Core i5 / Ryzen 5 (latest generation)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;RAM&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;16 GB&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;GPU&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;GeForce RTX 3050 Ti / 4050&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Storage&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;512 GB SSD&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;mods--streaming-a-desktop&quot;&gt;MODs / streaming: a desktop&lt;/h3&gt;
&lt;p&gt;On heat, expandability, and price-performance, the desktop wins.&lt;/p&gt;

























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align:left&quot;&gt;Item&lt;/th&gt;&lt;th style=&quot;text-align:left&quot;&gt;Spec&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;CPU&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Ryzen 5 / Core i5 (latest generation, 6 cores or more)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;RAM&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;32 GB&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;GPU&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;GeForce RTX 4060&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Storage&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;1 TB SSD&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;faq&quot;&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Q. Bedrock Edition or Java Edition — which should I buy?&lt;/strong&gt;
A. Pick Bedrock if you care about crossplay or official RTX support. Pick Java if you want MODs and shader MODs. As of 2026, buying either edition on PC usually bundles both as Minecraft: Java &amp;amp; Bedrock Edition.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. Will MODs run on a laptop?&lt;/strong&gt;
A. A gaming laptop with a GeForce RTX 3050 Ti / 4050 or better will run them. But with heavy setups — shader MODs plus a 32-chunk render distance — heat and thermal throttling tend to make things unstable. If you’re serious about MODs, go desktop.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. Is 16 GB or 32 GB of RAM the right pick?&lt;/strong&gt;
A. For Bedrock and vanilla Java, 16 GB is enough. For MOD packs (over 200 mods), large redstone contraptions, or running streaming software alongside the game, go with 32 GB. Whether the model lets you add memory later is also worth weighing.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. Can I play on integrated graphics (a CPU’s built-in GPU)?&lt;/strong&gt;
A. Recent integrated GPUs — Ryzen AI series, Intel Arc — can now run vanilla Bedrock at 1080p / medium settings. Java Edition and shader MODs still drop frames, though, so if you plan to play long-term, picking a discrete-GPU model from the start usually works out cheaper.&lt;/p&gt;
&lt;h2 id=&quot;wrapping-up&quot;&gt;Wrapping up&lt;/h2&gt;
&lt;p&gt;For a Minecraft PC, what you play decides how much spec you need.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Vanilla Bedrock → GTX 1650 / RTX 3050 + 16 GB, 80,000–100,000 yen&lt;/li&gt;
&lt;li&gt;Java + MODs / shader MODs → RTX 4060 + 32 GB, 150,000–200,000 yen&lt;/li&gt;
&lt;li&gt;Streaming too → RTX 4060 Ti + 32 GB + 8-core CPU, 200,000 yen and up&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In 2026 Bedrock is the default, but Java is still around for MODs and shader MODs. If you want to keep both options open, RTX 4060 + 32 GB is the build that covers the widest ground.&lt;/p&gt;
&lt;p&gt;The monitor side of the question is covered in a separate piece.&lt;/p&gt;
</content:encoded><category>reviews</category><category>pc</category><category>minecraft</category></item><item><title>Sony Walkman NW-A105 review — the Type-C, Android DAP I switched to, revisited from 2026</title><link>https://aulvem.com/blog/2021-04-24-sony-nw-a105/</link><guid isPermaLink="true">https://aulvem.com/blog/2021-04-24-sony-nw-a105/</guid><description>Over five years of commuting with the Sony NW-A105. The USB Type-C, microSD, and Android wins weighed against the weak battery life and sluggish UI, with comparisons to the current NW-A300 line and to going phone-only.</description><pubDate>Sat, 24 Apr 2021 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;2026 update&lt;/strong&gt;: Ported from the old VuePress blog (originally written in 2021, after about half a year of use). As of 2026, the current A-series line is the NW-A300 (NW-A306 in Japan, A307 internationally, released 2023). The NW-A105 itself is discontinued, with new stock only while supplies last. The bones of this review still hold up — just read it alongside the current model when considering a purchase.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I used the Sony Walkman &lt;strong&gt;NW-A105&lt;/strong&gt; for over five years, for music on the commute and on the road. It was the first Walkman generation to combine USB Type-C, microSD, and Android — the model where the connector finally caught up with the rest of the world.&lt;/p&gt;
&lt;p&gt;Looking back from 2026, though, the strengths and weaknesses sit on very different sides of the ledger. This is a long-term impression, compared against the current NW-A300 line and against going phone-only.&lt;/p&gt;
&lt;h2 id=&quot;the-verdict--a-first-generation-type-c--microsd--android-dap-for-a-new-purchase-go-a300&quot;&gt;The verdict — a first-generation Type-C / microSD / Android DAP; for a new purchase, go A300&lt;/h2&gt;
&lt;p&gt;Short answer: the NW-A105 was valuable as the first generation of Walkman with Type-C and Android. The sound-tuning depth still holds up. But the CPU and battery let it down, and for a new purchase in 2026, the current NW-A300 line is the easier recommendation.&lt;/p&gt;
&lt;p&gt;The reasoning is that the NW-A105’s weak points — sluggish responsiveness and high idle drain — are tied to internal parts. They are not the kind of thing a firmware update can fix at the root. The later battery-saver helped operationally, but the underlying issue is still there.&lt;/p&gt;
&lt;p&gt;Who should and should not buy one:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Worth it&lt;/strong&gt;: anyone who can find a cheap used unit and wants wired earphones, microSD, and deep sound tuning&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Skip it&lt;/strong&gt;: anyone buying new, anyone whose music life is already on a phone, anyone who prioritises battery life&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;build-and-layout&quot;&gt;Build and layout&lt;/h2&gt;
&lt;p&gt;Short answer: a small Android device with a 3.6-inch touchscreen. The physical buttons cluster on the right edge; the bottom carries the 3.5 mm jack, USB Type-C, and microSD slot.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;NW-A105, front&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-04-24-sony-nw-a105/2021-04-24-sony-nw-a105.webp&quot; loading=&quot;lazy&quot;/&gt;
&lt;p&gt;A hi-res-capable, Android-powered Walkman. Most operations happen on the touchscreen.&lt;/p&gt;





























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align:left&quot;&gt;Spec&lt;/th&gt;&lt;th style=&quot;text-align:left&quot;&gt;Value&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Display&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;3.6 inch&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Dimensions&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;55.9 × 98.9 × 11 mm&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Weight&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;103 g&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;OS&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Android 9 (at launch)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Ports&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;USB Type-C / 3.5 mm jack / microSD&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;(rated)&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;NW-A105, back&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-04-24-sony-nw-a105/2021-04-24-sony-nw-a105-back.webp&quot; loading=&quot;lazy&quot;/&gt;
&lt;p&gt;The back is matte, with a Walkman logo. Fingerprints stay out of sight.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;NW-A105, left side&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-04-24-sony-nw-a105/2021-04-24-sony-nw-a105-left.webp&quot; loading=&quot;lazy&quot;/&gt;
&lt;p&gt;The left flank is bare — no buttons.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;NW-A105, right side&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-04-24-sony-nw-a105/2021-04-24-sony-nw-a105-right.webp&quot; loading=&quot;lazy&quot;/&gt;
&lt;p&gt;All the operating buttons live on the right. From left to right: hold / back / play-pause / forward / volume down / volume up / power. That layout lets you control playback blind, with the unit still in a bag or pocket — exactly what a DAP should get right.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;NW-A105, ports on the bottom&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-04-24-sony-nw-a105/2021-04-24-sony-nw-a105-rear.webp&quot; loading=&quot;lazy&quot;/&gt;
&lt;p&gt;The bottom edge holds the 3.5 mm jack, a strap hole, USB Type-C, and the microSD slot. Keeping the 3.5 mm jack matters a lot if you live on wired earphones.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;NW-A105, library screen&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-04-24-sony-nw-a105/2021-04-24-sony-nw-a105-library.webp&quot; class=&quot;page-sp-img&quot; loading=&quot;lazy&quot;/&gt;
&lt;p&gt;The home screen sticks close to stock Android. You can add apps freely (Google Play is supported).&lt;/p&gt;
&lt;h2 id=&quot;what-worked&quot;&gt;What worked&lt;/h2&gt;
&lt;p&gt;Short answer: the Type-C / microSD / Android trio, plus the depth of Sony’s sound-processing options.&lt;/p&gt;
&lt;h3 id=&quot;usb-type-c--the-reason-i-switched&quot;&gt;USB Type-C — the reason I switched&lt;/h3&gt;
&lt;p&gt;This was the deciding factor when I bought it. Earlier Walkman models used Sony’s proprietary WM-PORT, which meant carrying a dedicated cable everywhere.&lt;/p&gt;
&lt;p&gt;Moving to Type-C means the same cable as the phone and the tablet. The “I forgot the Walkman cable on a business trip” disaster simply stops happening. That alone changed how I packed.&lt;/p&gt;
&lt;h3 id=&quot;microsd-adds-storage-after-the-fact&quot;&gt;microSD adds storage after the fact&lt;/h3&gt;
&lt;p&gt;Internal storage is a modest 16 GB. Trying to manage a hi-res library on internal storage alone is not realistic.&lt;/p&gt;
&lt;p&gt;Put another way: the device assumes a microSD card. The internal memory is for OS and apps; music lives on the card. With support up to 1 TB microSDXC, there is enough headroom for a serious library.&lt;/p&gt;
&lt;h3 id=&quot;sound-tuning-runs-deep&quot;&gt;Sound tuning runs deep&lt;/h3&gt;
&lt;p&gt;This is where a Sony DAP earns its keep.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;NW-A105, equaliser screen&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-04-24-sony-nw-a105/2021-04-24-sony-nw-a105-eq.webp&quot; class=&quot;page-sp-img&quot; loading=&quot;lazy&quot;/&gt;
&lt;p&gt;The equaliser is roughly ten bands of fine adjustment, with genre presets on top.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;NW-A105, noise cancelling settings&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-04-24-sony-nw-a105/2021-04-24-sony-nw-a105-nc.webp&quot; class=&quot;page-sp-img&quot; loading=&quot;lazy&quot;/&gt;
&lt;p&gt;Noise cancelling assumes Sony’s compatible earphones (the IER-NW500N and similar). On a commuter train, it knocks the noise floor down hard.&lt;/p&gt;
&lt;p&gt;The main sound-processing features:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;DSEE HX&lt;/strong&gt;: upscales compressed audio toward hi-res&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DC Phase Linearizer&lt;/strong&gt;: corrects phase characteristics to mimic an analogue amp&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dynamic Normalizer&lt;/strong&gt;: evens out volume differences between tracks&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Vinyl Processor&lt;/strong&gt;: shapes the sound to feel like a record&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ClearAudio+&lt;/strong&gt;: Sony’s recommended auto-optimisation preset&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;What you learn after living with it is that “everything on” is not always best. Toggling DSEE HX on or off per genre, for example, is where the sound changes character if you put in the time.&lt;/p&gt;
&lt;h3 id=&quot;android-opens-it-up&quot;&gt;Android opens it up&lt;/h3&gt;
&lt;p&gt;It runs Android 9 at the base. Spotify, Apple Music, and YouTube Music install through Google Play. A single device handles a local library and streaming side by side.&lt;/p&gt;
&lt;p&gt;Bluetooth pairing for handing audio off from a phone works the way you would expect.&lt;/p&gt;
&lt;h2 id=&quot;what-didnt&quot;&gt;What didn’t&lt;/h2&gt;
&lt;p&gt;Short answer: battery life and CPU speed. Both come down to hardware; neither is fixable in software.&lt;/p&gt;
&lt;h3 id=&quot;battery-drain-is-high&quot;&gt;Battery drain is high&lt;/h3&gt;
&lt;p&gt;The biggest complaint.&lt;/p&gt;
&lt;p&gt;Just leaving it powered on visibly drains the battery. Idle for a day without playback still costs a meaningful chunk of the meter.&lt;/p&gt;
&lt;p&gt;Sony quotes around 26 hours of hi-res playback. In real use, what hurts is the consumption during the hours you are not listening. A later firmware update added a battery saver that powers the unit off after a set period of inactivity, and that helped a lot operationally. It is still not a fix at the root.&lt;/p&gt;
&lt;p&gt;For commuting, where you charge at home or at work every day, this is fine. For a two-day business trip without an easy charge, it is tight.&lt;/p&gt;
&lt;h3 id=&quot;a-general-sluggishness&quot;&gt;A general sluggishness&lt;/h3&gt;
&lt;p&gt;The CPU is modest, and it shows up as friction when opening apps, switching screens, or scrolling a large library.&lt;/p&gt;
&lt;p&gt;It is not a device you tap constantly the way you do a phone, so it never becomes critical — but opening Spotify, tapping the search bar, and typing into it feels heavier than it should.&lt;/p&gt;
&lt;h3 id=&quot;software-support-has-ended&quot;&gt;Software support has ended&lt;/h3&gt;
&lt;p&gt;As of 2026, the NW-A105 is still on Android 9, with no major updates. From a security standpoint, it is not suitable as a primary phone substitute.&lt;/p&gt;
&lt;p&gt;As a dedicated music player, that is acceptable. The long-term compatibility of streaming apps, though, is not guaranteed.&lt;/p&gt;
&lt;h2 id=&quot;comparison--nw-a105-vs-nw-a300-series-vs-phone-only&quot;&gt;Comparison — NW-A105 vs NW-A300 series vs phone-only&lt;/h2&gt;
&lt;p&gt;Short answer: buy new and the NW-A300 wins. Want the cheapest path that still works, used NW-A105. Want a single device for everything, the phone is fine.&lt;/p&gt;

































































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align:left&quot;&gt;Angle&lt;/th&gt;&lt;th style=&quot;text-align:left&quot;&gt;NW-A105 (2019)&lt;/th&gt;&lt;th style=&quot;text-align:left&quot;&gt;NW-A300 series (2023–)&lt;/th&gt;&lt;th style=&quot;text-align:left&quot;&gt;Phone-only&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;OS&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Android 9&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Android 12 base&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Latest per device&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Perceived CPU speed&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Sluggish&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Improved&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Depends on device&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Battery (rated hi-res)&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;~26 hours&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;~36 hours (rated)&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Shared with everything else&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Internal storage&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;16 GB&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;32 GB (rated)&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Depends on device&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;microSD&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Yes (up to 1 TB)&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Yes&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Usually no&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Ports&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;USB Type-C / 3.5 mm&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;USB Type-C / 3.5 mm&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Type-C only on most&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Noise cancelling (Sony earphones)&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Supported&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Supported&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Not supported&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;DSEE HX-style processing&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Yes&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Yes (now DSEE Ultimate)&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;No&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Price (2026 expectation)&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Mostly used&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;New, ~mid-40,000s yen and up&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Already in the phone&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;The decision splits cleanly:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;You care about sound processing and a wired chain, and you do not want music draining the phone&lt;/strong&gt; → NW-A300&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Same requirements, minimum cost&lt;/strong&gt; → NW-A105 used&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Streaming-centric, wireless earphones, one device for everything&lt;/strong&gt; → phone-only. You do not need a DAP&lt;/li&gt;
&lt;/ul&gt;
&lt;aside class=&quot;aff-card not-prose my-10 rounded-2xl border border-[color:var(--aulvem-border)] bg-[color:var(--aulvem-surface)] px-5 py-5 sm:px-6 sm:py-6 has-image&quot; aria-label=&quot;Buy links for Sony Walkman NW-A105 (Black)&quot; data-astro-cid-qoq25xnm&gt;&lt;div class=&quot;aff-image&quot; data-astro-cid-qoq25xnm&gt;&lt;img src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-04-24-sony-nw-a105/2021-04-24-sony-nw-a105.webp&quot; alt=&quot;&quot; aria-hidden=&quot;true&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; data-astro-cid-qoq25xnm&gt;&lt;/div&gt;&lt;p class=&quot;aff-title&quot; data-astro-cid-qoq25xnm&gt;Sony Walkman NW-A105 (Black)&lt;/p&gt;&lt;div class=&quot;aff-buttons&quot; data-astro-cid-qoq25xnm&gt;&lt;a href=&quot;https://www.amazon.co.jp/dp/B07YYFN8HH/?language=en_US&amp;amp;tag=aulvem-22&quot; aria-label=&quot;View Sony Walkman NW-A105 (Black) on Amazon Japan (primarily sold in Japan)&quot; rel=&quot;sponsored nofollow noopener noreferrer&quot; target=&quot;_blank&quot; class=&quot;aff-btn inline-flex items-center gap-2 rounded-lg border border-[color:var(--aulvem-border)] bg-white px-4 py-2.5 transition-colors hover:border-aulvem-orange&quot; style=&quot;font-size: 14px; font-weight: 500;&quot; data-astro-cid-qoq25xnm&gt;&lt;img src=&quot;https://api.iconify.design/fa6-brands/amazon.svg?color=%23FF9900&quot; width=&quot;16&quot; height=&quot;16&quot; alt=&quot;&quot; aria-hidden=&quot;true&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; style=&quot;display:block&quot; data-astro-cid-qoq25xnm&gt;&lt;span data-astro-cid-qoq25xnm&gt;View on Amazon Japan&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;p class=&quot;aff-note&quot; data-astro-cid-qoq25xnm&gt;
Primarily sold in Japan. amazon.co.jp may ship internationally on select items.
&lt;/p&gt;&lt;/aside&gt;
&lt;h2 id=&quot;faq&quot;&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Q. Is the NW-A105 worth buying new in 2026?&lt;/strong&gt;
A. For a new purchase, the current NW-A300 line (NW-A306 in Japan / A307 internationally) is the easier recommendation. The NW-A105 was released in 2019, and its CPU and battery life are both weak. If you only want a DAP with microSD, Type-C, and Android, and you can find a cheap used unit, it is still an option.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. Compared with listening on a phone, is there a reason to carry an NW-A105?&lt;/strong&gt;
A. Yes, if you want Sony’s noise cancelling or DSEE HX sound processing, or if you do not want music playback eating your phone’s battery. If your library lives entirely in streaming and you do not use wired earphones, a phone alone is enough.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. How long does the battery last?&lt;/strong&gt;
A. Sony lists about 26 hours of hi-res playback. In practice, idle drain is high — leaving it powered on for a day burns through a visible chunk even without playing. A later firmware update added a battery-saver auto-off feature.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. What is the maximum microSD capacity?&lt;/strong&gt;
A. Up to 1 TB microSDXC. Internal storage is only 16 GB, so any serious hi-res library has to live on the card — the design assumes you will use one.&lt;/p&gt;
&lt;h2 id=&quot;verdict--a-device-for-experiencing-the-first-android-on-a-dap-generation&quot;&gt;Verdict — a device for experiencing the first Android-on-a-DAP generation&lt;/h2&gt;
&lt;p&gt;The NW-A105 belongs to the generation where “the Walkman finally went Type-C” and “the Walkman runs Android” arrived together. As a reason to buy at the time, that was enough, and after five-plus years it never stopped being a reliable home for the library.&lt;/p&gt;
&lt;p&gt;Would I recommend buying one new today? No. The CPU and the battery are tied to the internal design, and the successor generation improved both directly. Either go cheap on a used unit, or step up to the current NW-A300 — those are the two sensible paths.&lt;/p&gt;
&lt;p&gt;If your phone, paired with streaming and wireless earphones, already covers your music, there is no reason to add a DAP. Carrying one only earns its keep if you are unwilling to give up one of the three: wired earphones, deep sound processing, or microSD.&lt;/p&gt;</content:encoded><category>reviews</category><category>gadget</category><category>sony</category><category>walkman</category><category>dap</category></item><item><title>HDD vs SSD — in 2026, SSD is the default; HDD is for high-capacity archives</title><link>https://aulvem.com/blog/2021-04-21-hdd-ssd-difference/</link><guid isPermaLink="true">https://aulvem.com/blog/2021-04-21-hdd-ssd-difference/</guid><description>Comparing HDD and SSD across speed, cost per GB, lifespan, noise, and shock resistance. In 2026, OS / apps / games run on SSD by default, and HDD is narrowed to multi-TB archival use.</description><pubDate>Wed, 21 Apr 2021 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;2026 update&lt;/strong&gt;: ported from the old VuePress blog. When this was first written in 2021, the practical answer was a hybrid setup — “OS on SSD, data on HDD”. By 2026, SSD prices have dropped enough that &lt;strong&gt;SSD is the default&lt;/strong&gt; on both laptops and self-built desktops. HDDs are now narrowed to backups, video footage, and other multi-TB archival use. The underlying framework — how the two technologies differ — still holds.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;A slow PC, or a fresh purchase where you can’t tell whether to go SSD or HDD — this is where a lot of people stall. Once the structural difference is clear, the call gets easier.&lt;/p&gt;
&lt;p&gt;This piece lines up HDD vs SSD on speed, cost per GB, lifespan, noise, and shock resistance, and sums up how to choose in 2026.&lt;/p&gt;
&lt;h2 id=&quot;the-short-answer--ssd-for-system-hdd-for-bulk-storage&quot;&gt;The short answer — SSD for system, HDD for bulk storage&lt;/h2&gt;
&lt;p&gt;In 2026, if you’re buying or building new, the system drive that holds the OS and apps should be an &lt;strong&gt;SSD (NVMe if possible)&lt;/strong&gt;. HDDs work as secondary storage when you want several TB on the cheap.&lt;/p&gt;
&lt;p&gt;The reason: SSD prices have fallen significantly over the past five years, and 1 TB-class drives now sit in the mainstream price band. HDDs still win on cost per TB, and they keep their edge in the 4 TB / 8 TB range.&lt;/p&gt;
&lt;p&gt;For example: if you’re replacing a laptop, an SSD-only setup is plenty. If you’re building a desktop and you stockpile video footage or photo RAWs, a two-drive setup of 1 TB SSD (system) + 4 TB HDD (data) is the realistic call.&lt;/p&gt;
&lt;p&gt;One thing to note: rather than keep using an old HDD-only PC, swapping the boot drive to SSD is usually the single most effective upgrade. It often costs less than buying a new machine.&lt;/p&gt;
&lt;h2 id=&quot;the-main-differences-between-hdd-and-ssd&quot;&gt;The main differences between HDD and SSD&lt;/h2&gt;
&lt;p&gt;Looked at across six axes, SSD wins on “fast, quiet, shock-resistant”; HDD wins on “cheap at high capacity, long track record”.&lt;/p&gt;








































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Aspect&lt;/th&gt;&lt;th&gt;HDD&lt;/th&gt;&lt;th&gt;SSD&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Read/write speed&lt;/td&gt;&lt;td&gt;Slow (around 100–200 MB/s sequential)&lt;/td&gt;&lt;td&gt;Fast (SATA up to ~550 MB/s, NVMe several thousand MB/s)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cost per GB&lt;/td&gt;&lt;td&gt;Cheap (clear win at 4 TB and above)&lt;/td&gt;&lt;td&gt;Higher (though 1 TB-class is now mainstream-priced)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Lifespan&lt;/td&gt;&lt;td&gt;Mechanical wear causes failure&lt;/td&gt;&lt;td&gt;Limited write endurance, but strong against shock&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Noise&lt;/td&gt;&lt;td&gt;Spin and seek noise&lt;/td&gt;&lt;td&gt;Silent&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Shock resistance&lt;/td&gt;&lt;td&gt;Weak (a drop while running often kills it)&lt;/td&gt;&lt;td&gt;Strong (no moving parts)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Price guide (1 TB)&lt;/td&gt;&lt;td&gt;A few thousand yen and up&lt;/td&gt;&lt;td&gt;Around 10,000 yen and up (NVMe runs higher)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;The reason is structural: the two are built on fundamentally different mechanics. HDDs record magnetically on a physically spinning disk; SSDs record electrically on semiconductor memory. That single difference drives every row in the table.&lt;/p&gt;
&lt;p&gt;One thing to note: the table is a general trend. Between NVMe SSD and SATA SSD, the speed gap widens further by several times. See the FAQ for more.&lt;/p&gt;
&lt;h2 id=&quot;what-an-hdd-is--a-spinning-disk-that-stores-data-magnetically&quot;&gt;What an HDD is — a spinning disk that stores data magnetically&lt;/h2&gt;
&lt;p&gt;An HDD (Hard Disk Drive) writes and reads data magnetically on a spinning metal platter. It’s a mechanical device with moving parts — structurally closer to a CD player than to a memory chip.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Inside an HDD — the platter and magnetic head&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-04-21-hdd-ssd-difference/2021-04-21-hdd.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;p&gt;The reason it’s slower is mechanical: the platter spins at high speed and the magnetic head physically moves to the right location, so there’s always a physical motion in the loop. That is the root cause of “slow reads, audible noise, fragile to shock”.&lt;/p&gt;
&lt;p&gt;For example: a typical 3.5-inch HDD spins at 5400 rpm or 7200 rpm. The seek noise (the head moving) and the spin noise are constant, which makes HDDs hard to live with if you’re going for a silent build.&lt;/p&gt;
&lt;p&gt;One thing to note: the HDD’s strength is cheap capacity. In the 4 TB / 8 TB / 16 TB range, the cost per TB is still lower than SSD in 2026. For backups, video footage, and NAS use, HDDs are very much still in service.&lt;/p&gt;
&lt;h2 id=&quot;what-an-ssd-is--semiconductor-memory-that-stores-data-electrically&quot;&gt;What an SSD is — semiconductor memory that stores data electrically&lt;/h2&gt;
&lt;p&gt;An SSD (Solid State Drive) writes and reads data electrically on flash memory (semiconductors). It has no moving parts at all — structurally closer to a scaled-up USB stick.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Inside an SSD — semiconductor chips on a circuit board&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-04-21-hdd-ssd-difference/2021-04-21-memory.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;p&gt;The reason it’s fast is structural: 0 / 1 is encoded by the presence or absence of electrons in a semiconductor, so no physical movement is needed. That is the root cause of “fast, silent, shock-resistant, light”.&lt;/p&gt;
&lt;p&gt;For example: booting the same OS, an HDD machine often takes 30–60 seconds, where an SSD machine is up in around 10 seconds. This is why putting an SSD into an older PC feels so different.&lt;/p&gt;
&lt;p&gt;One thing to note: SSDs have a finite number of writes (often quoted as TBW, Total Bytes Written). For normal office, gaming, or development workloads, hitting that ceiling is rare. In everyday use, HDDs more often fail mechanically before an SSD wears out.&lt;/p&gt;
&lt;h2 id=&quot;how-to-split-the-workload-between-ssd-and-hdd--2026-edition&quot;&gt;How to split the workload between SSD and HDD — 2026 edition&lt;/h2&gt;
&lt;p&gt;The system drive (OS and apps) goes on SSD. The data warehouse (photos, video, backups) goes on HDD. That is the 2026 baseline.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Splitting the workload between SSD and HDD&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-04-21-hdd-ssd-difference/2021-04-21-ssd.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;p&gt;The reason: boot and app launch speed obviously benefit from SSD, while archival storage is accessed less often, so the speed gap is harder to feel there. Letting the HDD — which wins on cost per TB — handle the “cold” data is the rational split.&lt;/p&gt;
&lt;h3 id=&quot;laptops--general-use--a-single-ssd-is-enough&quot;&gt;Laptops / general use — a single SSD is enough&lt;/h3&gt;
&lt;p&gt;For a laptop or a typical desktop, a single SSD (512 GB to 1 TB) is the mainstream setup. Skipping the HDD also means lighter weight, less noise, and lower power draw.&lt;/p&gt;
&lt;p&gt;For gaming or video editing, target 1 TB or 2 TB.&lt;/p&gt;
&lt;h3 id=&quot;self-built-pc--creators--two-drives-ssd--hdd&quot;&gt;Self-built PC / creators — two drives, SSD + HDD&lt;/h3&gt;
&lt;p&gt;If you carry photo RAWs, video footage, or a large game library, a two-drive setup of SSD (system) + HDD (data) is still the right call.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;System = NVMe SSD 1 TB&lt;/li&gt;
&lt;li&gt;Data = HDD 4 TB or more&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;reviving-an-old-hdd-machine--ssd-swap-is-the-biggest-win&quot;&gt;Reviving an old HDD machine — SSD swap is the biggest win&lt;/h3&gt;
&lt;p&gt;A lot of “my PC feels slow” complaints trace back to the HDD. Adding RAM helps less than swapping the boot drive to SSD. It’s the realistic move when the budget can’t stretch to a new machine.&lt;/p&gt;
&lt;p&gt;The standard tool kit is a SATA SSD plus a USB enclosure for migrating the data.&lt;/p&gt;
&lt;h2 id=&quot;faq&quot;&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Q. Is a hybrid SSD + HDD setup still worth doing?&lt;/strong&gt;
A. On a self-built PC or a desktop where you need a lot of capacity, yes. Splitting roles — SSD for system, HDD for data and backups — still makes sense. Laptops, on the other hand, often have only a single SSD slot, so a hybrid setup is hard to assemble.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. NVMe SSD or SATA SSD — which one?&lt;/strong&gt;
A. If the motherboard or laptop has an M.2 slot that supports NVMe, NVMe is the first pick. Sequential reads and writes are several times faster than SATA SSD. That said, for OS boot and office work the felt difference is small; it pays off on large file copies and video editing. If cost is the constraint, SATA SSD is still perfectly usable.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. How long does an SSD last?&lt;/strong&gt;
A. Manufacturer-quoted TBW (total bytes written) for a 1 TB-class drive lands around 300–600 TBW. At everyday workloads — even 50 GB written per day works out to 18 TB per year — that’s more than 10 years on paper. Most drives get retired for capacity or standards reasons before the write limit hits. The sudden-failure risk is lower than HDD, but not zero.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. How do I migrate from HDD to SSD?&lt;/strong&gt;
A. Two main routes. (1) Clone the whole disk, OS and all, with cloning software (often shipped by the SSD manufacturer). (2) Reinstall the OS clean and copy the data over via an external enclosure. Cloning is easier on paper, but you can trip over Windows licensing or drive letters. If you don’t mind reinstalling, route (2) ends up cleaner. Take a backup before either route.&lt;/p&gt;
&lt;h2 id=&quot;wrapping-up&quot;&gt;Wrapping up&lt;/h2&gt;
&lt;p&gt;The 2026 baseline is “SSD for system, HDD for bulk data”. For laptops and general use, a single SSD is enough on its own.&lt;/p&gt;
&lt;p&gt;The HDD’s role has clearly shrunk compared to five years ago. It’s narrowed to use cases where you need a lot of capacity cheaply — backups, video footage, photo RAWs.&lt;/p&gt;
&lt;p&gt;If you want an old HDD machine to feel faster, an SSD swap comes before adding RAM. It’s worth considering before jumping straight to a full replacement.&lt;/p&gt;
</content:encoded><category>reviews</category><category>PCPeripherals</category></item><item><title>Video connectors at a glance — HDMI when in doubt, DisplayPort for 4K high-refresh</title><link>https://aulvem.com/blog/2021-04-17-video-terminal/</link><guid isPermaLink="true">https://aulvem.com/blog/2021-04-17-video-terminal/</guid><description>The video connectors between a PC and a monitor come down to five: HDMI, DisplayPort, USB-C, DVI, and VGA. HDMI is the safe default thanks to wide adoption; DisplayPort wins for gaming; USB-C Alt Mode lets a laptop run on a single cable.</description><pubDate>Sat, 17 Apr 2021 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;2026 update&lt;/strong&gt;: ported from the old VuePress blog. The framework — how each connector is positioned — still holds, but the latest-generation specs (HDMI 2.1, DisplayPort 2.1, USB4) are worth checking against current official figures.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;You buy a PC and a monitor, and the cable ends don’t match. HDMI, DisplayPort, USB-C, DVI, VGA — which one is the right one to plug in.&lt;/p&gt;
&lt;p&gt;This piece lines up the five video connectors and how to pick between them by use case. By the time you finish, you should be able to narrow the cable you need down to one.&lt;/p&gt;
&lt;h2 id=&quot;the-short-answer--hdmi-when-in-doubt-displayport-for-4k-high-refresh&quot;&gt;The short answer — HDMI when in doubt, DisplayPort for 4K high-refresh&lt;/h2&gt;
&lt;p&gt;Short answer: HDMI strikes the safest balance between adoption and performance. TVs, game consoles, and most monitors all have it, so one cable tends to connect almost anything.&lt;/p&gt;
&lt;p&gt;The optimum shifts with use case:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;4K / high refresh rate / multi-monitor&lt;/strong&gt;: DisplayPort&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Laptop, video and power over one cable&lt;/strong&gt;: USB-C (DisplayPort Alt Mode)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Office use, just needs to display&lt;/strong&gt;: whatever cable you have lying around (HDMI or DVI, either is fine)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Conversely, &lt;strong&gt;there’s almost no reason to pick DVI or VGA for a new purchase&lt;/strong&gt;. Only consider them when keeping an older device alive.&lt;/p&gt;
&lt;h2 id=&quot;in-practice-the-field-narrows-to-five-connectors&quot;&gt;In practice, the field narrows to five connectors&lt;/h2&gt;
&lt;p&gt;Short answer: the video connectors still in use around a PC come down to HDMI, DisplayPort, USB-C (Alt Mode), DVI, and VGA. Thunderbolt shares the physical USB-C connector, so it’s grouped under USB-C here.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;How each connector sits&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;HDMI&lt;/strong&gt; — most widespread across home electronics and PCs. The default when in doubt&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DisplayPort&lt;/strong&gt; — biased toward PC and graphics cards. Strong on high resolution and high refresh&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;USB-C Alt Mode&lt;/strong&gt; — bundles video, power, and data into one cable on a laptop&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DVI&lt;/strong&gt; — the pioneer of digital video. Almost never worth buying new&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;VGA&lt;/strong&gt; — analog. For keeping older gear alive&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;hdmi--the-shared-standard-for-tvs-consoles-and-pcs&quot;&gt;HDMI — the shared standard for TVs, consoles, and PCs&lt;/h2&gt;
&lt;img width=&quot;800&quot; alt=&quot;The HDMI connector shape (a near-trapezoidal silhouette)&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-04-17-video-terminal/2021-04-17-hdmi.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;What HDMI is&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A digital connector that carries video and audio over a single cable. Standardized in 2002, it’s been adopted across TVs, monitors, game consoles, and PCs — the single most widespread video connector today.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Short answer: adoption is broad and the compatible device pool is wide (home electronics, PCs, consoles), which makes HDMI the first pick when you don’t have a strong reason to pick anything else.&lt;/p&gt;
&lt;p&gt;There are two reasons. First, audio runs over the same cable (up to 8 channels, Dolby / DTS supported). Unlike audio-only connectors such as S/PDIF, surround formats pass straight through. Second, home electronics (TVs, recorders, consoles) are designed around HDMI as the baseline.&lt;/p&gt;
&lt;h3 id=&quot;version-differences-come-down-to-how-many-hz-at-4k&quot;&gt;Version differences come down to “how many Hz at 4K”&lt;/h3&gt;
&lt;p&gt;The maximum resolution and refresh rate change by HDMI version.&lt;/p&gt;








































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align:left&quot;&gt;Ver&lt;/th&gt;&lt;th style=&quot;text-align:center&quot;&gt;1.2&lt;/th&gt;&lt;th style=&quot;text-align:center&quot;&gt;1.4&lt;/th&gt;&lt;th style=&quot;text-align:center&quot;&gt;2.0a&lt;/th&gt;&lt;th style=&quot;text-align:center&quot;&gt;2.1&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Max resolution&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;FHD&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;4K&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;4K&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;10K&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;HDR&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;No&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;No&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;Yes&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;Yes&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Max Hz at FHD&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;60 Hz&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;120 Hz&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;240 Hz&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;240 Hz&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Max Hz at 4K&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;—&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;30 Hz&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;60 Hz&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;120 Hz+&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;At FHD, version doesn’t really matter. To push 4K at 60 Hz or higher, pick &lt;strong&gt;Ver. 2.0a or later&lt;/strong&gt;; for gaming with 4K 120 Hz / 8K in mind, choose &lt;strong&gt;Ver. 2.1&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The cable itself — how to pick one — is covered in a separate piece.&lt;/p&gt;
&lt;p&gt;→ &lt;a href=&quot;https://aulvem.com/blog/2021-03-23-hdmi/&quot;&gt;Three things to check when picking an HDMI cable (length, connector, version)&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;displayport--the-standard-for-pcs-gpus-and-high-refresh-use&quot;&gt;DisplayPort — the standard for PCs, GPUs, and high-refresh use&lt;/h2&gt;
&lt;img width=&quot;800&quot; alt=&quot;The DisplayPort connector shape (a rectangle with a notch on one side)&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-04-17-video-terminal/2021-04-17-displayport.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;What DisplayPort is&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A video connector defined by VESA, the PC industry’s standards body. Found on graphics cards, some Macs, and gaming monitors. Tends to lead HDMI on high resolution and high refresh rates.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Short answer: if you’re targeting 4K-or-above resolution, 120 Hz / 240 Hz refresh, or driving multiple monitors over a single cable with MST (Multi-Stream Transport), DisplayPort is the pick.&lt;/p&gt;
&lt;p&gt;The reason is that DisplayPort was designed from the start around PC displays. Where HDMI leans toward home electronics, DisplayPort prioritized high resolution, high frame rates, and bandwidth efficiency from day one. Generation for generation, DisplayPort often arrives first.&lt;/p&gt;
&lt;h3 id=&quot;version-differences-are-gentler-than-hdmis&quot;&gt;Version differences are gentler than HDMI’s&lt;/h3&gt;



































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align:left&quot;&gt;Ver&lt;/th&gt;&lt;th style=&quot;text-align:center&quot;&gt;1.2&lt;/th&gt;&lt;th style=&quot;text-align:center&quot;&gt;1.4&lt;/th&gt;&lt;th style=&quot;text-align:center&quot;&gt;2.0&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Max resolution&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;4K / 5K&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;8K&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;16K&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;HDR&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;No&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;Yes&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;Yes&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Max Hz at FHD&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;240 Hz&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;240 Hz&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;240 Hz+&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Max Hz at 4K&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;60 Hz&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;120 Hz&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;240 Hz+&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Older versions still cover 4K 60 Hz, so version anxiety isn’t as sharp as with HDMI.&lt;/p&gt;
&lt;h3 id=&quot;watch-out-turning-a-monitor-off-resets-your-window-layout&quot;&gt;Watch out: turning a monitor off resets your window layout&lt;/h3&gt;
&lt;p&gt;DisplayPort has one quirk worth knowing about. &lt;strong&gt;When the monitor’s power is cut, the PC reads it as “the monitor has been disconnected”.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In a dual-monitor setup, windows and icons then collapse onto the primary screen. Powering the monitor back on doesn’t restore their positions.&lt;/p&gt;
&lt;p&gt;Workarounds: let the monitor sleep instead of cutting power; use HDMI instead of DisplayPort; or hunt for a setting that disables DDC/CI. Worth knowing before you buy if it’s the kind of thing that’ll bother you.&lt;/p&gt;
&lt;h2 id=&quot;usb-c-displayport-alt-mode--bundling-a-laptop-into-one-cable&quot;&gt;USB-C (DisplayPort Alt Mode) — bundling a laptop into one cable&lt;/h2&gt;
&lt;img width=&quot;800&quot; alt=&quot;The USB Type-C connector shape (a rounded rectangle, reversible top to bottom)&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-04-17-video-terminal/2021-04-17-usb-typec.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;What USB-C Alt Mode is&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A mechanism that uses some of the USB Type-C connector’s pins to carry a DisplayPort signal (DisplayPort Alternate Mode). Video, data, and power (USB Power Delivery) ride over a single cable. Thunderbolt uses the same physical shape.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Short answer: this fits people who want to handle a laptop with a single monitor. Video, peripherals, and power (up to around 100 W) all run over one cable.&lt;/p&gt;
&lt;p&gt;The reason is the cable count. Plug one USB-C cable in when you’re back at the desk and external monitor, keyboard, mouse, and charging all come back at once.&lt;/p&gt;
&lt;h3 id=&quot;watch-out-what-the-device-supports-decides-what-you-get&quot;&gt;Watch out: what the device supports decides what you get&lt;/h3&gt;
&lt;p&gt;USB-C is the name of the physical connector. Whether it can carry video depends on whether the device supports DisplayPort Alt Mode or Thunderbolt.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Whether the laptop’s USB-C port supports video output (check the spec sheet for “video output”, “DisplayPort Alt Mode”, or “Thunderbolt 3 / 4”)&lt;/li&gt;
&lt;li&gt;Whether the cable supports video (a charge-only cable won’t carry a picture)&lt;/li&gt;
&lt;li&gt;Whether the monitor has a USB-C input (if not, you’ll need a USB-C → HDMI / DisplayPort adapter)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If those three don’t line up, no picture. Reading spec sheets takes more work than with HDMI.&lt;/p&gt;
&lt;h2 id=&quot;dvi--the-pioneer-of-digital-video-not-worth-buying-new&quot;&gt;DVI — the pioneer of digital video; not worth buying new&lt;/h2&gt;
&lt;img width=&quot;800&quot; alt=&quot;The DVI connector shape (a rectangle with multiple rows of pins)&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-04-17-video-terminal/2021-04-17-dvi.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;What DVI is&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A digital video connector introduced in 1999. It became widespread in the PC industry as the successor to VGA. Still found on some Windows desktops and business monitors, but rarely on laptops or TVs.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Short answer: DVI handles FHD (1920×1080) without issue. Treat it as a way to keep DVI gear you already own working — not as something to buy into.&lt;/p&gt;
&lt;p&gt;The reason is that the connector is physically large, and on current-generation hardware it’s been replaced by HDMI / DisplayPort. 4K isn’t really supported either (DVI Dual-Link covers some cases), so as a new option it’s a leftover.&lt;/p&gt;
&lt;p&gt;It still earns its keep when connecting a company desktop to a monitor, or pulling video from an older GPU. For a fresh setup, pick HDMI or DisplayPort and skip DVI.&lt;/p&gt;
&lt;h2 id=&quot;vga-d-sub--analog-for-keeping-older-gear-alive&quot;&gt;VGA (D-Sub) — analog, for keeping older gear alive&lt;/h2&gt;
&lt;img width=&quot;800&quot; alt=&quot;The VGA / D-Sub connector shape (the blue connector with pins)&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-04-17-video-terminal/2021-04-17-dsub.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;What VGA (D-Sub 15-pin) is&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;An analog video connector standardized by IBM in 1987. It was the PC-to-monitor standard until the 2000s, but adoption fell as the industry went digital (DVI → HDMI / DisplayPort). Still seen on projectors and older conference-room equipment.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Short answer: because the signal is analog, resolution and image quality fall short of modern standards. Drop it from any new-purchase shortlist.&lt;/p&gt;
&lt;p&gt;The reason is signal degradation — cable length and quality both eat into image quality. The practical resolution ceiling is FHD (the published numbers run higher, but blurring becomes visible).&lt;/p&gt;
&lt;p&gt;Even so, conference-room projectors that are VGA-only are still around. If your laptop only has USB-C, keeping a single &lt;strong&gt;USB-C → VGA adapter&lt;/strong&gt; in your bag covers you on business trips.&lt;/p&gt;
&lt;h2 id=&quot;comparison--five-connectors-by-resolution-best-use-and-adoption&quot;&gt;Comparison — five connectors by resolution, best use, and adoption&lt;/h2&gt;









































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align:left&quot;&gt;Connector&lt;/th&gt;&lt;th style=&quot;text-align:left&quot;&gt;Max resolution (latest gen)&lt;/th&gt;&lt;th style=&quot;text-align:left&quot;&gt;Best use&lt;/th&gt;&lt;th style=&quot;text-align:center&quot;&gt;Adoption&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;HDMI&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;10K (Ver. 2.1)&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;TVs, consoles, general PCs&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;Highest&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;DisplayPort&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;16K (Ver. 2.0)&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Gaming, high resolution, multi-monitor&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;Medium (PC-centric)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;USB-C Alt Mode&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;4K–8K (device-dependent)&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Laptop + one external monitor&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;Growing&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;DVI&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;FHD / some 4K&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Reusing existing PC gear&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;Declining&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;VGA&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;FHD (in practice)&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Older gear, older projectors&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;Declining&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;(Figures are the published maxes of each standard’s latest revision. Real-world performance depends on cable quality and device-side implementation.)&lt;/p&gt;
&lt;h2 id=&quot;how-to-choose--three-questions-in-order&quot;&gt;How to choose — three questions, in order&lt;/h2&gt;
&lt;p&gt;Short answer: walk through “do I also connect a TV or a console?” → “is this for gaming or 4K high-refresh?” → “do I want a laptop bundled into one cable?” in that order.&lt;/p&gt;
&lt;h3 id=&quot;1-also-connecting-a-tv-or-console--hdmi&quot;&gt;1. Also connecting a TV or console → HDMI&lt;/h3&gt;
&lt;p&gt;For home electronics, HDMI is essentially the only option. If you’re sharing with a PS5, Switch, Apple TV, or a recorder, going HDMI across the board lets you reuse cables.&lt;/p&gt;
&lt;h3 id=&quot;2-gaming-4k-120-hz-multi-monitor--displayport&quot;&gt;2. Gaming, 4K 120 Hz, multi-monitor → DisplayPort&lt;/h3&gt;
&lt;p&gt;PC gamers targeting 144 Hz / 240 Hz, anyone wanting 4K 120 Hz for games, or anyone running three or more monitors off a single cable via MST — for any of these, DisplayPort.&lt;/p&gt;
&lt;h3 id=&quot;3-docking-a-laptop-with-a-single-cable--usb-c&quot;&gt;3. Docking a laptop with a single cable → USB-C&lt;/h3&gt;
&lt;p&gt;If the goal is “plug one USB-C in after coming home and external monitor, keyboard, mouse, and charging all wake up”, that’s USB-C. A USB-C → HDMI / DisplayPort converter cable also covers monitors that don’t have USB-C input.&lt;/p&gt;
&lt;h2 id=&quot;faq&quot;&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Q. Is there an image-quality difference between HDMI and DisplayPort?&lt;/strong&gt;
A. Compared at the same version generation, same resolution, and same refresh rate, there’s no visible difference. The gap shows up only where one supports a higher maximum resolution or refresh rate. In day-to-day FHD / 4K 60 Hz use, they’re effectively tied.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. I tried to send video over USB-C and got nothing. What do I check?&lt;/strong&gt;
A. Three things. (1) The laptop spec sheet should say “video output supported”, “DisplayPort Alt Mode”, or “Thunderbolt”. (2) The cable should be video-capable, not charge-only (look for the USB-C logo and the bandwidth label). (3) The monitor should accept USB-C input, or you should be running it through a USB-C → HDMI / DisplayPort adapter.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. If I convert a DVI cable to HDMI, can I drive 4K?&lt;/strong&gt;
A. Generally no. DVI Single-Link tops out around FHD 60 Hz and doesn’t reach the bandwidth 4K needs. For 4K, use a native HDMI or DisplayPort port on both the PC and monitor sides.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. For gaming, I’m stuck between HDMI 2.1 and DisplayPort 1.4. Which one?&lt;/strong&gt;
A. If both your GPU and monitor support HDMI 2.1, you can line up 4K 120 Hz and variable refresh rate (VRR) cleanly. For an older monitor / GPU combo, DisplayPort 1.4 opens up more options. Check the ports on your GPU and monitor first — that makes the call a lot easier.&lt;/p&gt;
&lt;h2 id=&quot;wrapping-up&quot;&gt;Wrapping up&lt;/h2&gt;
&lt;p&gt;Picking between the five video connectors comes down to use case.&lt;/p&gt;
&lt;p&gt;When in doubt, &lt;strong&gt;HDMI&lt;/strong&gt;. It’s compatible with the whole home-electronics stack, including TVs and consoles, so one cable tends to cover most of the setup.&lt;/p&gt;
&lt;p&gt;For serious PC gaming or 4K high refresh, &lt;strong&gt;DisplayPort&lt;/strong&gt;. For docking a laptop with a single cable, &lt;strong&gt;USB-C Alt Mode&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Treat &lt;strong&gt;DVI and VGA as options only for keeping existing gear running&lt;/strong&gt;. There’s almost no scenario where they’re a positive new-purchase pick.&lt;/p&gt;
&lt;p&gt;How to pick the cable itself — length, connector shape, version — is covered for HDMI in a separate piece.&lt;/p&gt;
&lt;p&gt;→ &lt;a href=&quot;https://aulvem.com/blog/2021-03-23-hdmi/&quot;&gt;Three things to check when picking an HDMI cable (length, connector, version)&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>reviews</category><category>PCPeripherals</category></item><item><title>Peak Design Capture V3 and ProPad review — the clip that locks a DSLR onto your hip belt</title><link>https://aulvem.com/blog/2021-04-16-peakdesign-capture-propad/</link><guid isPermaLink="true">https://aulvem.com/blog/2021-04-16-peakdesign-capture-propad/</guid><description>A few years with the Peak Design Capture V3 (CC-BK-3) and ProPad (PP-2). The main draw is locking a DSLR onto a hip belt so you can raise it to your eye in one motion. The lock is solid and almost rattle-free, though tolerances against some plates can produce a metallic click.</description><pubDate>Fri, 16 Apr 2021 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;2026 update&lt;/strong&gt;: Ported from the old VuePress blog. The Peak Design Capture is still in the current line-up in 2026, with successive minor revisions of the V3 generation on sale. The review angles here — comfort on a hip belt, lock robustness, the metallic click from plate tolerance — still apply.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Take a DSLR out for the day and every shot has the same tax: dig the camera out of the bag, miss the moment, repeat. Lay it flat inside the pack and by the time it is out, whatever you wanted to shoot has already moved on.&lt;/p&gt;
&lt;p&gt;To deal with this at the physical layer, I bought the &lt;strong&gt;Peak Design Capture V3 (CC-BK-3)&lt;/strong&gt; and &lt;strong&gt;ProPad (PP-2)&lt;/strong&gt; and have lived with them for a few years. The flow becomes: clip the camera directly onto a hip belt or backpack shoulder strap, lift it off one-handed, raise it to the eye.&lt;/p&gt;
&lt;h2 id=&quot;the-verdict--worth-the-money-if-you-raise-a-dslr-often&quot;&gt;The verdict — worth the money if you raise a DSLR often&lt;/h2&gt;
&lt;p&gt;Short answer: if you want out of strap-based carry, buy it. The lock is solid, the camera does not come loose while running, and after several years the button has never broken.&lt;/p&gt;
&lt;p&gt;The reason is that the &lt;strong&gt;number of actions before the camera is at your eye&lt;/strong&gt; drops sharply. Three actions — put the bag down, open the zip, lift the camera out — collapse to one: press the button and lift. With moving subjects that will not wait — kids, animals at a zoo, sports day — that difference is the gap between getting the shot and not.&lt;/p&gt;
&lt;p&gt;A few cautions before buying:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Hands-free types who only shoot occasionally&lt;/strong&gt;: a strap for a few thousand yen is enough&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Full-frame + f/2.8 trinity users&lt;/strong&gt;: hanging that much weight off the hip swings while you walk. Routing the load through the shoulder is more realistic&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;People shooting in environments that need to be quiet&lt;/strong&gt;: tolerance between the plate and the clamp can produce a metallic click (more below)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;look-and-feel&quot;&gt;Look and feel&lt;/h2&gt;
&lt;p&gt;Short answer: machined aluminium, single matte black, edges rounded but the surface feels hard. The build quality sits above most camera accessories.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Peak Design Capture V3, front view&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-04-16-peakdesign-capture-propad/2021-04-16-PeakDesign-Capture-front.webp&quot; loading=&quot;lazy&quot;/&gt;
&lt;p&gt;The front is plain. A lock-release button sits in the centre, with hex-socket clamp screws to either side.&lt;/p&gt;

























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align:left&quot;&gt;Spec&lt;/th&gt;&lt;th style=&quot;text-align:left&quot;&gt;Capture V3&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Size&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;about 13 × 13 × 3 cm&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Weight&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;about 144g (rated)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Material&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;machined aluminium&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Strap thickness&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;up to ~6.4mm (rated)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;img width=&quot;800&quot; alt=&quot;Peak Design Capture V3, back&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-04-16-peakdesign-capture-propad/2021-04-16-PeakDesign-Capture-rear.webp&quot; loading=&quot;lazy&quot;/&gt;
&lt;p&gt;The back is flat. This is the face that meets the belt, and it is designed to have nothing catching. On a hip belt the surface ends up close to your skin and hip bone, so the cushion (ProPad) earns its place.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Peak Design Capture V3, side view&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-04-16-peakdesign-capture-propad/2021-04-16-PeakDesign-Capture-left.webp&quot; loading=&quot;lazy&quot;/&gt;
&lt;p&gt;From the side the depth is shallow. On a hip belt it is small enough that the hem of a jacket can cover it.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Peak Design Capture V3, underside showing the plate slot&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-04-16-peakdesign-capture-propad/2021-04-16-PeakDesign-Capture-back.webp&quot; loading=&quot;lazy&quot;/&gt;
&lt;p&gt;The underside is the female slot for the plate. The trapezoidal quick-release plate on the camera slides into here from above.&lt;/p&gt;
&lt;h3 id=&quot;propad-pp-2&quot;&gt;ProPad PP-2&lt;/h3&gt;
&lt;img width=&quot;800&quot; alt=&quot;Peak Design ProPad PP-2 on its own&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-04-16-peakdesign-capture-propad/2021-04-16-PeakDesign-ProPad.webp&quot; loading=&quot;lazy&quot;/&gt;
&lt;p&gt;The cushion that sits between the Capture and a hip belt to spread the load.&lt;/p&gt;





















&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align:left&quot;&gt;Spec&lt;/th&gt;&lt;th style=&quot;text-align:left&quot;&gt;ProPad PP-2&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Size&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;about 17 × 9 × 3 cm&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Weight&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;about 36g (rated)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Material&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;cushion + hook-and-loop&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;The cushion is not overly thick, and once the belt is tightened it sits flush against the hip. Even when I worked up a sweat the hook-and-loop did not loosen.&lt;/p&gt;
&lt;h2 id=&quot;what-worked&quot;&gt;What worked&lt;/h2&gt;
&lt;p&gt;Short answer: the motion to bring the camera to your eye is at its shortest / the lock is genuinely robust / nothing has broken over several years.&lt;/p&gt;
&lt;h3 id=&quot;one-handed-one-action-to-ready&quot;&gt;One-handed, one-action to ready&lt;/h3&gt;
&lt;p&gt;The biggest single win. &lt;strong&gt;Hold the lock-release button while you pull the camera up — done&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Unlike pulling it out of a bag, by the time it is up it is already in shooting position. With kids or animals that move unpredictably, the two or three seconds saved decide whether the shot exists. The effect has been largest for travel, sports day, the zoo, and hiking.&lt;/p&gt;
&lt;h3 id=&quot;the-lock-does-not-open-unless-you-mean-it&quot;&gt;The lock does not open unless you mean it&lt;/h3&gt;
&lt;p&gt;If it is one-handed in one motion, the obvious worry is “will it pop open while I am walking?” Over several years of use, that &lt;strong&gt;has never happened&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The lock geometry will not allow vertical removal without the button being pressed. Run, jump — as long as nothing touches the button, the camera stays put. Press it intentionally and it slides out cleanly. The on/off distinction is unambiguous, with no nagging worry about accidental release.&lt;/p&gt;
&lt;h3 id=&quot;the-button-is-built-into-the-body-so-it-cannot-be-lost&quot;&gt;The button is built into the body, so it cannot be lost&lt;/h3&gt;
&lt;p&gt;A generic camera clip I had used before put the lock-release button on a removable cap. Within six months it had gone missing and the clip was unusable.&lt;/p&gt;
&lt;p&gt;On the Peak Design side the button is &lt;strong&gt;fully integrated into the body&lt;/strong&gt; — you cannot pop it off even if you try. Serviceability suffers in exchange, but the field-loss risk drops to zero, and in real use that matters.&lt;/p&gt;
&lt;h3 id=&quot;arca-swiss-plates-work-too&quot;&gt;Arca-Swiss plates work too&lt;/h3&gt;
&lt;p&gt;The standard Peak Design plate has an Arca-Swiss-compatible cross section, so if your tripod head already takes Arca-Swiss clamps, the same plate goes straight onto the tripod with no swapping.&lt;/p&gt;
&lt;p&gt;Third-party Arca-Swiss plates have also worked in the slot. If you are buying a new kit it is safest to stay all Peak Design, but if you have already standardised your tripod side on Arca, the cost of moving over is low.&lt;/p&gt;
&lt;h2 id=&quot;what-didnt&quot;&gt;What didn’t&lt;/h2&gt;
&lt;p&gt;Short answer: third-party plates can rattle metallically / heavy rigs swing on a hip belt / the standard plate slides on its own bottom face.&lt;/p&gt;
&lt;h3 id=&quot;tolerance-against-third-party-plates-causes-a-metallic-rattle&quot;&gt;Tolerance against third-party plates causes a metallic rattle&lt;/h3&gt;
&lt;p&gt;The plate slot is built with some clearance, presumably so that it will accept a range of compatible plates.&lt;/p&gt;
&lt;p&gt;With the genuine Peak Design plate there is almost no play, but a third-party Arca-Swiss plate can produce a &lt;strong&gt;light metallic click-clack&lt;/strong&gt;, more obvious the faster you walk. For environments where silence matters — bird photography, say — the realistic options are to standardise on Peak Design plates, or to take up the slack with a thin strip of PTFE tape.&lt;/p&gt;
&lt;h3 id=&quot;heavy-lenses-swing-on-a-hip-belt&quot;&gt;Heavy lenses swing on a hip belt&lt;/h3&gt;
&lt;p&gt;Mount a full-frame body with a 70–200mm f/2.8-class lens on the hip and it bounces up and down with every step. This is not really a problem with Capture; it is the physical limit of hanging that much weight off a hip belt at all.&lt;/p&gt;
&lt;p&gt;In practice, for rigs that heavy, move the Capture &lt;strong&gt;onto a backpack shoulder strap&lt;/strong&gt;, or pair it with a regular strap to share the load. Hip-belt use stays comfortable up to about mirrorless plus a prime or a standard zoom.&lt;/p&gt;
&lt;h3 id=&quot;the-standard-plate-slides-on-a-tripod-head&quot;&gt;The standard plate slides on a tripod head&lt;/h3&gt;
&lt;p&gt;The base of the standard plate is flat, with no cork or rubber anti-slip layer (may vary by unit).&lt;/p&gt;
&lt;p&gt;If you set the camera down on its bottom directly, or onto a slick tripod head, there is a slight slip. Clamped down it is fine, but a casual drop onto a desk can start sliding, so worth knowing.&lt;/p&gt;
&lt;h2 id=&quot;how-to-mount-and-use-it&quot;&gt;How to mount and use it&lt;/h2&gt;
&lt;p&gt;Short answer: open the clamp, thread the belt, tighten — 30 seconds. The plate stays on the tripod thread once you put it on and basically never comes off.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Peak Design Capture V3 with the clamp loosened and opened&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-04-16-peakdesign-capture-propad/2021-04-16-PeakDesign-Capture-open.webp&quot; loading=&quot;lazy&quot;/&gt;
&lt;p&gt;First, loosen the two clamp screws with a hex key. You can work from either side. With the screws loose, the upper half rotates open and clears a path for the belt.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Peak Design Capture and ProPad partway through assembly&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-04-16-peakdesign-capture-propad/2021-04-16-PeakDesign-Capture-ProPad-midway.webp&quot; loading=&quot;lazy&quot;/&gt;
&lt;p&gt;For hip-belt use, open the ProPad and sandwich the Capture in along the printed guide on the inside. Thread the whole sandwich onto the belt.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Peak Design Capture and ProPad fully attached to a belt&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-04-16-peakdesign-capture-propad/2021-04-16-PeakDesign-Capture-ProPad-Complete.webp&quot; loading=&quot;lazy&quot;/&gt;
&lt;p&gt;Close the ProPad, swing the Capture’s upper half back into place, and retighten the screws. Done — 30 seconds once you know the moves.&lt;/p&gt;
&lt;h3 id=&quot;fitting-the-camera-plate&quot;&gt;Fitting the camera plate&lt;/h3&gt;
&lt;img width=&quot;800&quot; alt=&quot;Peak Design standard plate, top side&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-04-16-peakdesign-capture-propad/2021-04-16-plate.webp&quot; loading=&quot;lazy&quot;/&gt;
&lt;p&gt;On the camera side, screw the quick-release plate into the tripod thread with the 1/4-inch screw. Once it is on, it basically stays on.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Peak Design plate from the side showing its trapezoidal base&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-04-16-peakdesign-capture-propad/2021-04-16-plate-side.webp&quot; loading=&quot;lazy&quot;/&gt;
&lt;p&gt;Seen from the side, the base is trapezoidal (Arca-Swiss compatible). That dovetail slides into the matching female profile inside the Capture.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Peak Design plate sliding into the Capture&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-04-16-peakdesign-capture-propad/2021-04-16-PeakDesign-Capture-ProPad-plate-midway.webp&quot; loading=&quot;lazy&quot;/&gt;
&lt;p&gt;Press the black cylindrical button on the side of the Capture, then drop the plate in from above.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Peak Design Capture with the plate locked in&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-04-16-peakdesign-capture-propad/2021-04-16-PeakDesign-Capture-ProPad-plate.webp&quot; loading=&quot;lazy&quot;/&gt;
&lt;p&gt;Push it all the way down, release the button, and the lock engages. Removing it uses the same button in reverse.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;A GoPro mounted on the Peak Design Capture&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-04-16-peakdesign-capture-propad/2021-04-16-PeakDesign-Capture-ProPad-plate-Complete.webp&quot; loading=&quot;lazy&quot;/&gt;
&lt;p&gt;A GoPro will also fit, given an adapter mount with a 1/4-inch thread. In practice, though, the main use case is mirrorless or DSLR carry on a hip belt, not action cams.&lt;/p&gt;
&lt;h2 id=&quot;compared-with-camera-belts-and-sling-harnesses&quot;&gt;Compared with camera belts and sling harnesses&lt;/h2&gt;
&lt;p&gt;Short answer: Capture locks the camera flush to your body, a harness slings it off your shoulder for a fast lift, a neck strap just hangs it from your neck — they are answers to different questions.&lt;/p&gt;





















































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Angle&lt;/th&gt;&lt;th&gt;Peak Design Capture V3&lt;/th&gt;&lt;th&gt;Sling harness (general)&lt;/th&gt;&lt;th&gt;Neck strap (general)&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Mount position&lt;/td&gt;&lt;td&gt;Hip belt or shoulder strap&lt;/td&gt;&lt;td&gt;Shoulder / under arm&lt;/td&gt;&lt;td&gt;Neck&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Bring-up motion&lt;/td&gt;&lt;td&gt;Press button, lift out&lt;/td&gt;&lt;td&gt;Lift the dangling camera&lt;/td&gt;&lt;td&gt;Lift the dangling camera&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Hands fully free?&lt;/td&gt;&lt;td&gt;Yes — locked in place&lt;/td&gt;&lt;td&gt;No — still swings&lt;/td&gt;&lt;td&gt;No — still swings&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Stability while running or jumping&lt;/td&gt;&lt;td&gt;High (no swing)&lt;/td&gt;&lt;td&gt;Medium (strap rebound)&lt;/td&gt;&lt;td&gt;Low (camera flails)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Heavy lenses&lt;/td&gt;&lt;td&gt;Swings on a hip belt&lt;/td&gt;&lt;td&gt;Good — shoulder absorbs it&lt;/td&gt;&lt;td&gt;Average&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Noise&lt;/td&gt;&lt;td&gt;Possible plate-tolerance click&lt;/td&gt;&lt;td&gt;Quiet&lt;/td&gt;&lt;td&gt;Quiet&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Price band (at the time of writing)&lt;/td&gt;&lt;td&gt;~18,000–20,000 yen&lt;/td&gt;&lt;td&gt;~5,000–15,000 yen&lt;/td&gt;&lt;td&gt;~2,000–5,000 yen&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;“I want the absolute shortest path to my eye” and “I want both hands genuinely free” both point at Capture. “I want to walk with the camera hanging off me all day” leans toward a harness, which is less tiring over long stretches.&lt;/p&gt;
&lt;p&gt;For an adjacent piece in the same camera-accessory category, I also wrote up the &lt;a href=&quot;https://aulvem.com/blog/2021-03-03-jobygorillapod-jb01542-pkk/&quot;&gt;JOBY GorillaPod JB01542-PKK&lt;/a&gt;, which is a small flexible tripod for wrapping around a pillar or shelf. That sits on the desk-or-pillar layer rather than the body-mounted layer, so it is a separate choice from Capture.&lt;/p&gt;
&lt;aside class=&quot;aff-card not-prose my-10 rounded-2xl border border-[color:var(--aulvem-border)] bg-[color:var(--aulvem-surface)] px-5 py-5 sm:px-6 sm:py-6 has-image&quot; aria-label=&quot;Buy links for Peak Design Capture V3 (CC-BK-3)&quot; data-astro-cid-qoq25xnm&gt;&lt;div class=&quot;aff-image&quot; data-astro-cid-qoq25xnm&gt;&lt;img src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-04-16-peakdesign-capture-propad/2021-04-16-PeakDesign-Capture-ProPad.webp&quot; alt=&quot;&quot; aria-hidden=&quot;true&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; data-astro-cid-qoq25xnm&gt;&lt;/div&gt;&lt;p class=&quot;aff-title&quot; data-astro-cid-qoq25xnm&gt;Peak Design Capture V3 (CC-BK-3)&lt;/p&gt;&lt;div class=&quot;aff-buttons&quot; data-astro-cid-qoq25xnm&gt;&lt;a href=&quot;https://www.amazon.co.jp/dp/B07818Z4Q5/?language=en_US&amp;amp;tag=aulvem-22&quot; aria-label=&quot;View Peak Design Capture V3 (CC-BK-3) on Amazon Japan (primarily sold in Japan)&quot; rel=&quot;sponsored nofollow noopener noreferrer&quot; target=&quot;_blank&quot; class=&quot;aff-btn inline-flex items-center gap-2 rounded-lg border border-[color:var(--aulvem-border)] bg-white px-4 py-2.5 transition-colors hover:border-aulvem-orange&quot; style=&quot;font-size: 14px; font-weight: 500;&quot; data-astro-cid-qoq25xnm&gt;&lt;img src=&quot;https://api.iconify.design/fa6-brands/amazon.svg?color=%23FF9900&quot; width=&quot;16&quot; height=&quot;16&quot; alt=&quot;&quot; aria-hidden=&quot;true&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; style=&quot;display:block&quot; data-astro-cid-qoq25xnm&gt;&lt;span data-astro-cid-qoq25xnm&gt;View on Amazon Japan&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;p class=&quot;aff-note&quot; data-astro-cid-qoq25xnm&gt;
Primarily sold in Japan. amazon.co.jp may ship internationally on select items.
&lt;/p&gt;&lt;/aside&gt;
&lt;aside class=&quot;aff-card not-prose my-10 rounded-2xl border border-[color:var(--aulvem-border)] bg-[color:var(--aulvem-surface)] px-5 py-5 sm:px-6 sm:py-6&quot; aria-label=&quot;Buy links for Peak Design ProPad (PP-2)&quot; data-astro-cid-qoq25xnm&gt;&lt;p class=&quot;aff-title&quot; data-astro-cid-qoq25xnm&gt;Peak Design ProPad (PP-2)&lt;/p&gt;&lt;div class=&quot;aff-buttons&quot; data-astro-cid-qoq25xnm&gt;&lt;a href=&quot;https://www.amazon.co.jp/dp/B0781S64XJ/?language=en_US&amp;amp;tag=aulvem-22&quot; aria-label=&quot;View Peak Design ProPad (PP-2) on Amazon Japan (primarily sold in Japan)&quot; rel=&quot;sponsored nofollow noopener noreferrer&quot; target=&quot;_blank&quot; class=&quot;aff-btn inline-flex items-center gap-2 rounded-lg border border-[color:var(--aulvem-border)] bg-white px-4 py-2.5 transition-colors hover:border-aulvem-orange&quot; style=&quot;font-size: 14px; font-weight: 500;&quot; data-astro-cid-qoq25xnm&gt;&lt;img src=&quot;https://api.iconify.design/fa6-brands/amazon.svg?color=%23FF9900&quot; width=&quot;16&quot; height=&quot;16&quot; alt=&quot;&quot; aria-hidden=&quot;true&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; style=&quot;display:block&quot; data-astro-cid-qoq25xnm&gt;&lt;span data-astro-cid-qoq25xnm&gt;View on Amazon Japan&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;p class=&quot;aff-note&quot; data-astro-cid-qoq25xnm&gt;
Primarily sold in Japan. amazon.co.jp may ship internationally on select items.
&lt;/p&gt;&lt;/aside&gt;
&lt;h2 id=&quot;faq&quot;&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Q. What cameras and packs does it fit?&lt;/strong&gt;
A. The clamp is rated for straps and belts up to about 6.4mm thick. That covers the shoulder straps on most camera backpacks and hip belts up to roughly 5cm wide. On the camera side, anything with a 1/4-inch tripod thread will work — mirrorless, DSLR, or compact. Heavy rigs (a full-frame body with a telephoto, for example) put real load on the shoulder or hip, so pairing with a shoulder strap is the practical call.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. Is it better than a harness or a sling strap?&lt;/strong&gt;
A. They solve different problems. A harness or sling strap is for “hang it off the shoulder and bring it up fast”; the camera always dangles from your body. Capture is for “lock it flush to your body” and is strong when you want both hands fully free — hiking, shooting with kids. The way the weight is routed is also different: a harness rides on the shoulder, Capture distributes load through the hip (via the ProPad). People who shoot a lot on a tripod, or who swap lenses often, frequently end up using both.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. Do I actually need the ProPad?&lt;/strong&gt;
A. For hip-belt use, effectively yes. With Capture alone, the back of the clamp digs straight into the belt, and after a long walk it presses on the hip bone and hurts. ProPad sandwiches the belt in cushioning so the load spreads out around the waist. For backpack-shoulder use the cushion is not needed and Capture on its own is enough. The rule of thumb is “ProPad for hip, Capture alone for shoulder.”&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. Does it hold up over years of use?&lt;/strong&gt;
A. After several years of daily use, the lock mechanism has never failed. The clamp screws, the lock button, the aluminium body — none of them show meaningful wear. By way of comparison, a generic clip from another brand I had used before had a removable lock button, and within six months the button was lost or broken. On the Peak Design side the button is built into the body and cannot be removed, so the loss risk is structurally zero.&lt;/p&gt;
&lt;h2 id=&quot;verdict--if-you-raise-a-dslr-often-the-day-to-day-changes&quot;&gt;Verdict — if you raise a DSLR often, the day-to-day changes&lt;/h2&gt;
&lt;p&gt;It is the kind of accessory that picks its users, but for the right use case it is hard to go back to strap-only carry.&lt;/p&gt;
&lt;p&gt;It is an easy recommendation for &lt;strong&gt;kids, travel, the zoo, hiking&lt;/strong&gt; — anywhere you want both hands free with a DSLR ready to come up in one motion. Conversely, if the camera only comes out a few times a month, a neck strap for a few thousand yen will do the job.&lt;/p&gt;
&lt;p&gt;The two cautions are the metallic click from plate tolerance and hip-belt swing with heavy lenses. The first is fixed by standardising on Peak Design plates; the second by moving over to a shoulder-strap mount.&lt;/p&gt;</content:encoded><category>reviews</category><category>camera-equipment</category></item><item><title>Vue.js basics — v-if and v-for</title><link>https://aulvem.com/blog/2021-04-15-vue-v-if/</link><guid isPermaLink="true">https://aulvem.com/blog/2021-04-15-vue-v-if/</guid><description>A primer on Vue.js template directives for conditional rendering and list rendering — v-if / v-else / v-else-if, v-show for visibility toggles, v-for with the :key attribute, and when to reach for v-if versus v-show.</description><pubDate>Thu, 15 Apr 2021 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;2026 update&lt;/strong&gt;: this post was first written for Vue 2 / Options API. In 2026, Vue 3 with the Composition API (&lt;code&gt;&amp;lt;script setup&amp;gt;&lt;/code&gt;) is the default, but the template syntax for v-if / v-else / v-for hasn’t changed, so the shape of the examples below still maps over.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;A short reference for the Vue.js directives that handle conditional rendering and iteration.&lt;/p&gt;
&lt;p&gt;The mustache syntax and v-bind are covered in a separate post.&lt;/p&gt;
&lt;h2 id=&quot;the-short-answer&quot;&gt;The short answer&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;v-if&lt;/strong&gt;: renders the element only when the condition is truthy. Pairs with &lt;code&gt;v-else&lt;/code&gt; / &lt;code&gt;v-else-if&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;v-show&lt;/strong&gt;: toggles visibility through CSS &lt;code&gt;display&lt;/code&gt;. Suited to elements that flip on and off often&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;v-for&lt;/strong&gt;: iterates over an array. Always pass &lt;code&gt;:key&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;v-if&quot;&gt;v-if&lt;/h2&gt;
&lt;p&gt;v-if &lt;strong&gt;renders an element only when the expression is truthy&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;It’s common in real work — UI that needs to differ between mobile and desktop, or between logged-in and logged-out states, is the typical case.&lt;/p&gt;
&lt;h3 id=&quot;basic-usage&quot;&gt;Basic usage&lt;/h3&gt;
&lt;p&gt;v-if is written as an attribute on the target element, with the condition as its value.&lt;/p&gt;
&lt;br/&gt;
&lt;p&gt;The snippet below decides inside the template whether the block renders.&lt;/p&gt;
&lt;p&gt;In practice this displays &lt;strong&gt;This is a sample.&lt;/strong&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;vue&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;template&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:#B392F0&quot;&gt; v-if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;sampleNum === 1&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;    サンプルです。&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;template&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&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;export&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; default&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:#B392F0&quot;&gt;  data&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;    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;      sampleNum: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&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 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;h3 id=&quot;v-else&quot;&gt;v-else&lt;/h3&gt;
&lt;p&gt;v-if accepts an else branch in the same way a regular if statement does.&lt;/p&gt;
&lt;p&gt;Just add &lt;code&gt;v-else&lt;/code&gt; as an attribute on the next element.&lt;/p&gt;
&lt;br/&gt;
&lt;p&gt;This snippet displays &lt;strong&gt;else is shown.&lt;/strong&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;vue&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;template&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;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; v-if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;sampleNum === 0&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;      サンプルです。&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;div&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; v-else&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;      elseが表示です。&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;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;template&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&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;export&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; default&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:#B392F0&quot;&gt;  data&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;    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;      sampleNum: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&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 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;One gotcha: &lt;code&gt;v-else&lt;/code&gt; has to sit on the element directly after the &lt;code&gt;v-if&lt;/code&gt;. Anything in between breaks the pairing.&lt;/p&gt;
&lt;h3 id=&quot;v-else-if&quot;&gt;v-else-if&lt;/h3&gt;
&lt;p&gt;else-if works alongside else.&lt;/p&gt;
&lt;p&gt;The form is the same — add &lt;code&gt;v-else-if&lt;/code&gt; as the attribute.&lt;/p&gt;
&lt;br/&gt;
&lt;p&gt;This snippet displays &lt;strong&gt;sampleNum is 1.&lt;/strong&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;vue&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;template&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;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; v-if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;sampleNum === 0&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;      サンプルです。&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;div&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; v-else-if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;sampleNum === 1&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;      sampleNumは1です。&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;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;template&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&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;export&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; default&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:#B392F0&quot;&gt;  data&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;    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;      sampleNum: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&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 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;h3 id=&quot;v-show&quot;&gt;v-show&lt;/h3&gt;
&lt;p&gt;v-show looks similar to v-if from the outside, but the mechanics are different.&lt;/p&gt;
&lt;p&gt;The syntax matches v-if — write &lt;code&gt;v-show=&amp;quot;...&amp;quot;&lt;/code&gt; as an attribute.&lt;/p&gt;
&lt;br/&gt;
&lt;p&gt;The difference between v-if and v-show is &lt;strong&gt;whether the DOM node is added and removed, or just hidden with &lt;code&gt;display&lt;/code&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;v-if creates the element when the condition turns truthy and removes it from the DOM when the condition turns falsy. v-show keeps the element in the DOM from the start and only toggles &lt;code&gt;display: none&lt;/code&gt;. As a result, the toggle cost is lower with v-show, while the initial-render cost is lower with v-if.&lt;/p&gt;
&lt;p&gt;A rough rule of thumb:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Element that’s likely falsy at first paint and rarely shown after — v-if&lt;/li&gt;
&lt;li&gt;Toggle UI that flips on and off frequently — v-show&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Note that v-show leans on the &lt;code&gt;display&lt;/code&gt; property, so it doesn’t compose with &lt;code&gt;&amp;lt;template&amp;gt;&lt;/code&gt; elements or with &lt;code&gt;v-else&lt;/code&gt;. In those cases, use v-if.&lt;/p&gt;
&lt;h2 id=&quot;v-for&quot;&gt;v-for&lt;/h2&gt;
&lt;p&gt;v-for &lt;strong&gt;iterates over an array or object&lt;/strong&gt; and renders the template once per entry.&lt;/p&gt;
&lt;p&gt;It maps closely to a JavaScript for loop — Vue lays out the same template for each item in the list.&lt;/p&gt;
&lt;p&gt;The form is &lt;code&gt;v-for=&amp;quot;(item, index) in list&amp;quot;&lt;/code&gt;. Pass a unique value to &lt;code&gt;:key&lt;/code&gt; so Vue can diff the list correctly.&lt;/p&gt;
&lt;br/&gt;
&lt;p&gt;This snippet displays &lt;strong&gt;num is 1, index is 0. num is 2, index is 1.&lt;/strong&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;vue&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;template&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;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; v-for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;(num, i) in numList&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; :key&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;i&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;      中身は{{ num }}, indexは{{ i }}。&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;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;template&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&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;export&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; default&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:#B392F0&quot;&gt;  data&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;    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;      numList: [&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;2&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 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;h2 id=&quot;wrapping-up&quot;&gt;Wrapping up&lt;/h2&gt;
&lt;p&gt;v-if creates or removes the element based on the condition; v-show keeps the element and hides it with CSS. v-for needs &lt;code&gt;:key&lt;/code&gt; to iterate cleanly. The template syntax carries over to Vue 3 unchanged, so this same shape works once you move to the Composition API.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Related posts&lt;/strong&gt;:&lt;/p&gt;</content:encoded><category>build</category><category>JavaScript</category><category>Vue.js</category><category>v-if</category><category>v-for</category></item><item><title>Getting started with Vue.js — v-bind basics, explained</title><link>https://aulvem.com/blog/2021-04-14-vue-v-bind/</link><guid isPermaLink="true">https://aulvem.com/blog/2021-04-14-vue-v-bind/</guid><description>A step-by-step intro to Vue.js&apos;s own HTML notation for newcomers: the mustache tag ({{ }}), the v-bind directive, its shorthand colon form (:), and binding multiple attributes at once — each with a runnable code example.</description><pubDate>Wed, 14 Apr 2021 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;2026-05-16 update&lt;/strong&gt;: An older post. The bones still hold up, but the tool UI and versions are from the original writing — newer releases may differ.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;A short intro to &lt;strong&gt;Vue.js’s own HTML notation&lt;/strong&gt;, written for people picking up Vue for the first time.&lt;/p&gt;
&lt;h2 id=&quot;the-takeaway&quot;&gt;The takeaway&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;mustache tag&lt;/strong&gt; (&lt;code&gt;{{ }}&lt;/code&gt;) outputs script-side variables into HTML&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;v-bind&lt;/strong&gt; is a directive that binds attributes to dynamic expressions&lt;/li&gt;
&lt;li&gt;&lt;code&gt;:&lt;/code&gt; is the shorthand prefix for &lt;code&gt;v-bind:&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Array notation lets you apply multiple classes or styles at once&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;mustache-tag&quot;&gt;Mustache tag&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;The mustache tag is for surfacing variables or function results — defined in &lt;code&gt;script&lt;/code&gt; — inside the HTML.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;You use it by writing &lt;code&gt;{{ }}&lt;/code&gt; somewhere in the template.&lt;/p&gt;
&lt;p&gt;The code below defines &lt;code&gt;displayText&lt;/code&gt; in script and prints it from HTML.&lt;/p&gt;
&lt;p&gt;When you run it, the output reads &lt;strong&gt;文字列です。&lt;/strong&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;vue&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;template&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;  {{ displayText }}&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;template&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&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;export&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; default&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:#B392F0&quot;&gt;  data&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;    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;      displayText: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;#39;文字列です。&amp;#39;&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 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;That’s the simplest possible form.&lt;/p&gt;
&lt;p&gt;The example uses a string variable, but the same syntax accepts an object.&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;vue&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;template&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;  {{ displayObj }}&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;template&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&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;export&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; default&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:#B392F0&quot;&gt;  data&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;    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;      displayObj: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        text: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;#39;文字列です。&amp;#39;&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 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;Worth noting: running this prints &lt;code&gt;{ text: &amp;#39;文字列です。&amp;#39; }&lt;/code&gt; literally.&lt;/p&gt;
&lt;p&gt;To render &lt;strong&gt;文字列です。&lt;/strong&gt; on its own, write &lt;code&gt;displayObj.text&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&quot;v-bind&quot;&gt;v-bind&lt;/h2&gt;
&lt;p&gt;v-bind is the main thing this post is about.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;v-bind lets you bind attributes to dynamic logic with almost no ceremony.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Toggling &lt;code&gt;class&lt;/code&gt; dynamically opens up a lot of expressive room on the page, so this is where it gets used most.&lt;/p&gt;
&lt;h3 id=&quot;basic-v-bind-usage&quot;&gt;Basic v-bind usage&lt;/h3&gt;
&lt;p&gt;The code below applies the &lt;code&gt;activeClass&lt;/code&gt; class based on the boolean &lt;code&gt;isActive&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;When you run it, &lt;strong&gt;文字列です。&lt;/strong&gt; appears in white text.&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;vue&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;template&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:#B392F0&quot;&gt; v-bind: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;{ activeClass: isActive }&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;    サンプルです。&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;template&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&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;export&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; default&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:#B392F0&quot;&gt;  data&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;    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;      isActive: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;true&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 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&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;style&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; lang&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;css&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:#B392F0&quot;&gt;  .activeClass&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;    color&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;#fff&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;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;style&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;&lt;code&gt;isActive&lt;/code&gt; is defined in script, and the HTML’s &lt;code&gt;v-bind:class&lt;/code&gt; evaluates it.&lt;/p&gt;
&lt;p&gt;Here &lt;code&gt;isActive&lt;/code&gt; is &lt;code&gt;true&lt;/code&gt;, so the class applies. Flip it to &lt;code&gt;false&lt;/code&gt; and the text renders in black.&lt;/p&gt;
&lt;h3 id=&quot;v-bind-shorthand&quot;&gt;v-bind shorthand&lt;/h3&gt;
&lt;p&gt;v-bind has a shorthand.&lt;/p&gt;
&lt;p&gt;Prefix the attribute with &lt;code&gt;:&lt;/code&gt; and v-bind kicks in.&lt;/p&gt;
&lt;br/&gt;
&lt;p&gt;The code below applies the &lt;code&gt;activeClass&lt;/code&gt; class based on the boolean &lt;code&gt;isActive&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;When you run it, &lt;strong&gt;文字列です。&lt;/strong&gt; appears in black text.&lt;/p&gt;
&lt;p&gt;The reason it’s black: the expression uses &lt;code&gt;!&lt;/code&gt; to negate the value.&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;vue&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;template&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:#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;{ activeClass: !isActive }&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;    サンプルです。&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;template&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&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;export&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; default&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:#B392F0&quot;&gt;  data&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;    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;      isActive: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;true&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 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&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;style&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; lang&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;css&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:#B392F0&quot;&gt;  .activeClass&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;    color&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;#fff&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;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;style&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;h3 id=&quot;multiple-v-bind&quot;&gt;Multiple v-bind&lt;/h3&gt;
&lt;p&gt;To bind more than one class condition on a single attribute, wrap the expressions in an array.&lt;/p&gt;
&lt;br/&gt;
&lt;p&gt;The code below applies both &lt;code&gt;activeClass&lt;/code&gt; and &lt;code&gt;sampleClass&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;When you run it, &lt;strong&gt;文字列です。&lt;/strong&gt; appears in white text.&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;vue&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;template&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:#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;[{ activeClass: isActive }, { sampleClass: sampleNum === 1 }]&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;    サンプルです。&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;template&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&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;export&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; default&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:#B392F0&quot;&gt;  data&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;    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;      isActive: &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;      sampleNum: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&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 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&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;style&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; lang&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;css&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:#B392F0&quot;&gt;  .activeClass&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;    color&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;#fff&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;  .sampleClass&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;    width&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;100&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&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;style&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;Each entry is a normal JS expression, so comparison operators are fair game.&lt;/p&gt;
&lt;p&gt;v-bind works on essentially any attribute. The ones it ends up on most often are &lt;strong&gt;class, style, and src&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id=&quot;closing&quot;&gt;Closing&lt;/h2&gt;
&lt;p&gt;That’s the mustache tag and v-bind in Vue.js — the foundation everything else builds on.&lt;/p&gt;
&lt;p&gt;Worth getting comfortable with before moving on.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Related&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://aulvem.com/blog/2021-04-02-vue-base/&quot;&gt;Getting started with Vue.js — the basics&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://aulvem.com/blog/2021-04-09-vue-component/&quot;&gt;Getting started with Vue.js — components&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>build</category><category>JavaScript</category><category>Vue.js</category><category>v-bind</category></item><item><title>Sennheiser HD 598 SR review — open-back spaciousness and a fit that lasts for hours</title><link>https://aulvem.com/blog/2021-04-13-sennheiser-hd-598-sr/</link><guid isPermaLink="true">https://aulvem.com/blog/2021-04-13-sennheiser-hd-598-sr/</guid><description>A hands-on review of the Sennheiser HD 598 SR open-back headphones after years of work and personal use. Strong on soundstage and long-session comfort; weak on isolation and price tier. With closed-back and wireless comparisons.</description><pubDate>Tue, 13 Apr 2021 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;2026 update&lt;/strong&gt;: Ported from the old VuePress blog. The HD 598 SR is an Amazon-exclusive black variant, and as of 2026 new-stock circulation has all but ended. On the open-back side, the HD 599 and HD 560S remain in the current lineup as natural successors. The review angles here — open-back soundstage, fit, and how it compares against closed-backs — should still be useful, so I kept the bones and only cleaned up the wording and structure.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I have used the Sennheiser HD 598 SR open-back headphones for a long stretch of work and personal listening, and this is the write-up.&lt;/p&gt;
&lt;p&gt;For anyone who has not owned an open-back before, the first wall is the same: “sound leaks out, outside sound leaks in.” Whether you can live with that splits the verdict cleanly in two. If you can — at home, in your own room, doing remote work — the HD 598 SR is a more honest way to enjoy music than most closed-backs at the same price.&lt;/p&gt;
&lt;h2 id=&quot;the-verdict--still-a-working-pick-for-a-fixed-home-setup&quot;&gt;The verdict — still a working pick for a fixed home setup&lt;/h2&gt;
&lt;p&gt;Short answer: the strengths are the open-back spaciousness and the lightness over long sessions. The price for that is zero isolation and audible leakage, so it does not belong outside or in a shared room.&lt;/p&gt;
&lt;p&gt;Three reasons.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Wide soundstage&lt;/strong&gt;: as an open-back, the “inside-the-skull” feeling is muted. It pays off for film, streaming, and live recordings&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Light fit&lt;/strong&gt;: the clamp is moderate, and the over-ear cups fully surround the ear, so multi-hour use does not tire you out&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Removable ear pads&lt;/strong&gt;: cleaning and replacement are easy, which suits long-term ownership&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;On the other hand, look elsewhere if any of these apply:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;You also want to use them outside or on a commute&lt;/strong&gt;: open-backs leak heavily in both directions and are unusable in public spaces&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;You share a room and listen late at night&lt;/strong&gt;: someone seated next to you will faintly hear what you are playing&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;You need wireless&lt;/strong&gt;: the HD 598 SR is wired only, with no Bluetooth support&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;build-and-accessories&quot;&gt;Build and accessories&lt;/h2&gt;
&lt;p&gt;Short answer: the all-black finish reads as calm and restrained. As an Amazon-exclusive color, it is the one to pick if the cream of the standard HD 598 is not your taste.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Sennheiser HD 598 SR, front view&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-04-13-sennheiser-hd-598-sr/2021-04-13-Sennheiser-HD-598-SR-point.webp&quot; loading=&quot;lazy&quot;/&gt;
&lt;p&gt;The HD 598 SR is the Amazon-exclusive variant of the HD 598, with the cream finish swapped for black. For most home and remote-work setups, the SR is the easier color to live with.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Sennheiser HD 598 SR, right side with logo&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-04-13-sennheiser-hd-598-sr/2021-04-13-Sennheiser-HD-598-SR-side.webp&quot; loading=&quot;lazy&quot;/&gt;
&lt;p&gt;The housings are vertically elongated ovals. If you are used to round earcups it looks unusual at first, but the shape follows the outline of the ear and settles in cleanly once worn.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Sennheiser HD 598 SR, bottom view with the cable jack&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-04-13-sennheiser-hd-598-sr/2021-04-13-Sennheiser-HD-598-SR-rear.webp&quot; loading=&quot;lazy&quot;/&gt;
&lt;p&gt;The cable is detachable and exits from the bottom of the right cup. Being able to swap only the cable when it eventually breaks is a real plus for long-term ownership.&lt;/p&gt;
&lt;p&gt;The bundled accessories are as follows.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;In the box&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;3 m cable with a 6.3 mm stereo plug (for desktop amps and audio interfaces)&lt;/li&gt;
&lt;li&gt;1.2 m cable with a 3.5 mm straight plug (for PCs and phones)&lt;/li&gt;
&lt;li&gt;6.3 mm to 3.5 mm adapter&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;img width=&quot;800&quot; alt=&quot;Sennheiser HD 598 SR, top view with the L / R markings&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-04-13-sennheiser-hd-598-sr/2021-04-13-Sennheiser-HD-598-SR-RL.webp&quot; loading=&quot;lazy&quot;/&gt;
&lt;p&gt;The inside of the headband is cushioned. The L / R marks live on the inside as well, so you can tell the sides apart by feel in a dark room.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Sennheiser HD 598 SR headband adjustment&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-04-13-sennheiser-hd-598-sr/2021-04-13-Sennheiser-HD-598-SR-adjust.webp&quot; loading=&quot;lazy&quot;/&gt;
&lt;p&gt;The length adjustment is nearly continuous in feel, so larger heads fit without issue (the photo shows the headband at full extension).&lt;/p&gt;
&lt;h2 id=&quot;what-worked&quot;&gt;What worked&lt;/h2&gt;
&lt;p&gt;Short answer: the soundstage, the long-session comfort, and the ease of maintenance — those three carry the headphone.&lt;/p&gt;
&lt;h3 id=&quot;open-back-soundstage-and-an-honest-balance&quot;&gt;Open-back soundstage and an honest balance&lt;/h3&gt;
&lt;p&gt;As an open-back design, the HD 598 SR avoids the “stuffy, inside-the-skull” feeling closed-backs tend to have. There is a sense of air, closer to listening through speakers.&lt;/p&gt;
&lt;p&gt;Low end on an open-back will always sit below an equivalent closed-back by construction, but the HD 598 SR puts out what the music needs. Bass and kick do not vanish, and no genre falls apart.&lt;/p&gt;
&lt;p&gt;If your daily listening is EDM or hip-hop where the low end has to push the song, this is not the right fit. For most other listening — vocals, acoustic music, film, games — it stays enjoyable without forcing anything.&lt;/p&gt;
&lt;h3 id=&quot;over-ear-comfort-that-holds-up-over-long-sessions&quot;&gt;Over-ear comfort that holds up over long sessions&lt;/h3&gt;
&lt;p&gt;The combination of fully over-ear cups, an open-back chamber, and a moderate clamp means very little listening fatigue.&lt;/p&gt;
&lt;p&gt;Unlike in-ears or closed-backs, heat does not build up around or inside the ear, so it stays comfortable even in summer. Half a day of wearing them during remote work is genuinely low stress.&lt;/p&gt;
&lt;h3 id=&quot;tool-less-removable-ear-pads&quot;&gt;Tool-less, removable ear pads&lt;/h3&gt;
&lt;img width=&quot;800&quot; alt=&quot;Sennheiser HD 598 SR with the ear pads removed&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-04-13-sennheiser-hd-598-sr/2021-04-13-Sennheiser-HD-598-SR-disassembly.webp&quot; loading=&quot;lazy&quot;/&gt;
&lt;p&gt;To remove a pad, orient the logo downward and pull it straight off (it comes free with a soft click). Cleaning and replacement are easy, and that pays back the longer you own the headphone.&lt;/p&gt;
&lt;p&gt;After a few years of use, swapping only the pads extends the life of the rest of the headphone. Sennheiser has supplied replacement pads for the HD 598 family for a long time.&lt;/p&gt;
&lt;h2 id=&quot;what-didnt&quot;&gt;What didn’t&lt;/h2&gt;
&lt;p&gt;Short answer: zero isolation, wired-only operation, and the practical difficulty of buying one new today.&lt;/p&gt;
&lt;h3 id=&quot;zero-isolation--not-for-outside-not-for-late-nights&quot;&gt;Zero isolation — not for outside, not for late nights&lt;/h3&gt;
&lt;p&gt;By construction, leakage in and out happens essentially without filtering.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;People next to you can faintly hear what you are playing&lt;/li&gt;
&lt;li&gt;Voices and household sounds come straight in&lt;/li&gt;
&lt;li&gt;Noise cancellation is, of course, not on the table&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is a design characteristic rather than a flaw — but it is the line item that decides whether the headphone is “wrong tool for the job.” For &lt;strong&gt;listening alone in your own room at home&lt;/strong&gt;, it is not an issue. For an office, a cafe, or a bedroom that shares a wall with family, this is not the headphone to choose.&lt;/p&gt;
&lt;h3 id=&quot;wired-only-no-bluetooth&quot;&gt;Wired only, no Bluetooth&lt;/h3&gt;
&lt;p&gt;By 2026 the default is wireless. The HD 598 SR is wired only, designed to plug straight into a PC, a desktop amp, or a phone.&lt;/p&gt;
&lt;p&gt;Phones no longer carry a 3.5 mm jack in most cases, so a USB-C or Lightning DAC dongle is an extra step in the chain.&lt;/p&gt;
&lt;h3 id=&quot;price-band-and-current-availability&quot;&gt;Price band and current availability&lt;/h3&gt;
&lt;p&gt;At the time of writing, the street price was around 20,000 yen. That is not entry-level.&lt;/p&gt;
&lt;p&gt;On top of that, as of 2026 new-stock circulation has effectively ended, which makes “buy new” hard to recommend. Looking at the successor open-backs — the HD 599 and the HD 560S — is the more realistic move.&lt;/p&gt;
&lt;h2 id=&quot;comparison-open-back-hd-598-sr-vs-same-price-closed-back--wireless&quot;&gt;Comparison: open-back HD 598 SR vs same-price closed-back / wireless&lt;/h2&gt;
&lt;p&gt;Short answer: the HD 598 SR wins on “at home, fixed setup, wired, soundstage-first.” Outside that, a different category is more comfortable.&lt;/p&gt;



























































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Angle&lt;/th&gt;&lt;th&gt;HD 598 SR (open-back, wired)&lt;/th&gt;&lt;th&gt;Same-price closed-back&lt;/th&gt;&lt;th&gt;Same-price wireless (with ANC)&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Soundstage&lt;/td&gt;&lt;td&gt;Wide&lt;/td&gt;&lt;td&gt;Narrower&lt;/td&gt;&lt;td&gt;Depends on model (typically narrower)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Bass quantity&lt;/td&gt;&lt;td&gt;Enough for the music&lt;/td&gt;&lt;td&gt;Stronger&lt;/td&gt;&lt;td&gt;Strong (DSP-assisted)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Isolation&lt;/td&gt;&lt;td&gt;None (open-back)&lt;/td&gt;&lt;td&gt;High&lt;/td&gt;&lt;td&gt;High (with ANC)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Sound leakage&lt;/td&gt;&lt;td&gt;Large&lt;/td&gt;&lt;td&gt;Small&lt;/td&gt;&lt;td&gt;Small&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Long-session fatigue&lt;/td&gt;&lt;td&gt;Low&lt;/td&gt;&lt;td&gt;Heat builds up&lt;/td&gt;&lt;td&gt;Battery weight adds up&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cable&lt;/td&gt;&lt;td&gt;Wired only&lt;/td&gt;&lt;td&gt;Mostly wired&lt;/td&gt;&lt;td&gt;Mostly wireless&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Outdoor / commute use&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Best fit&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Home remote work&lt;/td&gt;&lt;td&gt;Best fit&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Yes (needs charging)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;The HD 598 SR’s winning lane is narrow: at home, in your own room, wired is fine, soundstage matters. For anyone who lands in that lane, the listening experience is clearly better than a same-price closed-back or a budget wireless.&lt;/p&gt;
&lt;p&gt;If there is any chance you will want to use them outside or on a commute, buying a closed-back or a wireless ANC pair from the start tends to have fewer regrets.&lt;/p&gt;
&lt;aside class=&quot;aff-card not-prose my-10 rounded-2xl border border-[color:var(--aulvem-border)] bg-[color:var(--aulvem-surface)] px-5 py-5 sm:px-6 sm:py-6 has-image&quot; aria-label=&quot;Buy links for Sennheiser HD 598 SR&quot; data-astro-cid-qoq25xnm&gt;&lt;div class=&quot;aff-image&quot; data-astro-cid-qoq25xnm&gt;&lt;img src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-04-13-sennheiser-hd-598-sr/2021-04-13-Sennheiser-HD-598-SR.webp&quot; alt=&quot;&quot; aria-hidden=&quot;true&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; data-astro-cid-qoq25xnm&gt;&lt;/div&gt;&lt;p class=&quot;aff-title&quot; data-astro-cid-qoq25xnm&gt;Sennheiser HD 598 SR&lt;/p&gt;&lt;div class=&quot;aff-buttons&quot; data-astro-cid-qoq25xnm&gt;&lt;a href=&quot;https://www.amazon.co.jp/dp/B06WLGRYSF/?language=en_US&amp;amp;tag=aulvem-22&quot; aria-label=&quot;View Sennheiser HD 598 SR on Amazon Japan (primarily sold in Japan)&quot; rel=&quot;sponsored nofollow noopener noreferrer&quot; target=&quot;_blank&quot; class=&quot;aff-btn inline-flex items-center gap-2 rounded-lg border border-[color:var(--aulvem-border)] bg-white px-4 py-2.5 transition-colors hover:border-aulvem-orange&quot; style=&quot;font-size: 14px; font-weight: 500;&quot; data-astro-cid-qoq25xnm&gt;&lt;img src=&quot;https://api.iconify.design/fa6-brands/amazon.svg?color=%23FF9900&quot; width=&quot;16&quot; height=&quot;16&quot; alt=&quot;&quot; aria-hidden=&quot;true&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; style=&quot;display:block&quot; data-astro-cid-qoq25xnm&gt;&lt;span data-astro-cid-qoq25xnm&gt;View on Amazon Japan&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;p class=&quot;aff-note&quot; data-astro-cid-qoq25xnm&gt;
Primarily sold in Japan. amazon.co.jp may ship internationally on select items.
&lt;/p&gt;&lt;/aside&gt;
&lt;h2 id=&quot;faq&quot;&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Q. Can I plug them straight into a phone?&lt;/strong&gt;
A. If the phone still has a 3.5 mm jack, the 1.2 m cable plugs in directly. Most current phones have dropped the jack, so a USB-C or Lightning DAC dongle is needed separately. By impedance, the HD 598 SR is generally easy enough to drive from a phone.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. How does it differ from a closed-back?&lt;/strong&gt;
A. The biggest gaps are soundstage and isolation. An open-back like the HD 598 SR has speaker-like air around the sound, without the boxed-in feeling. The trade is heavy leakage in both directions. A closed-back does the opposite — strong isolation and strong low end, at the cost of heat and pressure around the ear over long sessions. &lt;strong&gt;Open-back for listening alone in your own room, closed-back for outside or shared rooms&lt;/strong&gt; — that is the simple split.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. How does it compare to wireless headphones?&lt;/strong&gt;
A. Setting tuning aside, the operational gap is the big one. Wireless asks you to manage charging, pairing, and latency, in exchange for the freedom of no cable. The HD 598 SR has no charging, no latency, and a stable connection by virtue of being wired, but the cable is always there. For a desk-bound remote-work setup, wired is often the easier choice.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. Are they comfortable over long sessions?&lt;/strong&gt;
A. The combination of an over-ear cup, an open-back chamber, and a light clamp puts fatigue on the low end of the same-price range, in my experience. Unlike in-ears that push into the canal, these only surround the ear, so the pressure is mild. Comfort still varies by head shape, so trying a pair for ten or fifteen minutes in a store before committing is the safe move.&lt;/p&gt;
&lt;h2 id=&quot;verdict--for-someone-happy-to-keep-them-at-home&quot;&gt;Verdict — for someone happy to keep them at home&lt;/h2&gt;
&lt;p&gt;The HD 598 SR is a still-useful open-back if you are clear about the use case.&lt;/p&gt;
&lt;p&gt;It suits home listening — remote work, music, film, games in your own room — where the wide soundstage, the long-session comfort, and the easy maintenance all show up in daily use.&lt;/p&gt;
&lt;p&gt;It does not suit using them outside, sharing time with family in the same room, or operating wireless-first. For those uses, the design loses by construction.&lt;/p&gt;
&lt;p&gt;If you are buying new in 2026, new stock has thinned out, so it is worth looking at the successor lineup (HD 599 / HD 560S) at the same time. On the secondhand or clearance market, the HD 598 SR is “the black HD 598” — the sound is the same as the standard version, so picking on color preference is fine.&lt;/p&gt;
</content:encoded><category>reviews</category><category>audio</category><category>headphones</category><category>sennheiser</category></item><item><title>Elecom EX-G Bluetooth M-XGL10BBBK review — the budget mouse where grip differences show up most</title><link>https://aulvem.com/blog/2021-04-12-elecom-m-xgl10bbbk/</link><guid isPermaLink="true">https://aulvem.com/blog/2021-04-12-elecom-m-xgl10bbbk/</guid><description>A review of the Elecom EX-G M-XGL10BBBK, a low-priced Bluetooth mouse offered in three sizes. The grip punches above its price; wireless stability and the configuration software are where the corners were cut.</description><pubDate>Mon, 12 Apr 2021 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;2026 update&lt;/strong&gt;: Ported from the old VuePress blog. The M-XGL10BBBK is still in circulation as a current budget Bluetooth mouse in 2026. The review angles here (size options, grip comfort, wireless stability) still apply. Spec values quoted are the manufacturer’s figures from the time of writing, so check the latest product page before buying.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I used the Elecom EX-G Bluetooth M-XGL10BBBK at work for about a year. This is a review combining what it felt like then with a 2026 re-read of the same points.&lt;/p&gt;
&lt;p&gt;In the “I don’t want to spend much on a mouse, but I do want to graduate from the one that came in the box” price band, this is the model where the grip difference is most obvious. Being able to pick S, M, or L is also rare at this price.&lt;/p&gt;
&lt;h2 id=&quot;the-verdict--the-best-first-step-up-if-you-want-size-options&quot;&gt;The verdict — the best “first step up” if you want size options&lt;/h2&gt;
&lt;p&gt;Short answer: if you’re moving up from a bundled cheap mouse, this is the one in its price band where the difference in grip is most clearly felt. The S/M/L sizing makes it easy to recommend to people with smaller hands too.&lt;/p&gt;
&lt;p&gt;The reason is that the ergonomic shape and the side buttons are both there — you can feel the design intent in your fingers the moment you pick it up. Coming from a generic bundled mouse, the way your hand stiffens during long sessions visibly improves.&lt;/p&gt;
&lt;p&gt;That said, look elsewhere if any of the following apply:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;You prioritize wireless stability&lt;/strong&gt;: it is Bluetooth-only, so it will not be as steady as a USB-receiver model&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;You want fine button customization&lt;/strong&gt;: the bundled software is more modest than the Logicool Options family&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gaming use&lt;/strong&gt;: response speed and sensor performance are tuned for office work&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;build--a-mid-height-ergonomic-shape&quot;&gt;Build — a mid-height ergonomic shape&lt;/h2&gt;
&lt;p&gt;Short answer: a shape that sits between flat mice and tall sculpted mice. An asymmetric design that drops away on the right-click side, made to be palmed rather than clawed.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;ELECOM M-XGL10BBBK, top view&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-04-12-elecom-m-xgl10bbbk/2021-04-12-ELECOM-M-XGL10BBBK.webp&quot; loading=&quot;lazy&quot;/&gt;
&lt;p&gt;The shape from above. Photographed in L size. You pick S, M, or L to match your hand.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;ELECOM M-XGL10BBBK, underside&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-04-12-elecom-m-xgl10bbbk/2021-04-12-ELECOM-M-XGL10BBBK-back.webp&quot; loading=&quot;lazy&quot;/&gt;
&lt;p&gt;The underside holds the power switch, pairing button, and battery cover. It runs on a single AA cell, and the manufacturer’s rated battery life is about 402 days (check the latest spec before buying).&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;ELECOM M-XGL10BBBK, front view&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-04-12-elecom-m-xgl10bbbk/2021-04-12-ELECOM-M-XGL10BBBK-front.webp&quot; loading=&quot;lazy&quot;/&gt;
&lt;p&gt;Seen from the front, the right-click side drops away noticeably. Not flat, not fully sculpted — a mid-height ergonomic shape.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;ELECOM M-XGL10BBBK, rear view&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-04-12-elecom-m-xgl10bbbk/2021-04-12-ELECOM-M-XGL10BBBK-rear.webp&quot; loading=&quot;lazy&quot;/&gt;
&lt;p&gt;From the back. The hump is modest — it sits in your whole palm. If you only ever claw-grip, the MX Master family will suit you better.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;ELECOM M-XGL10BBBK, right side&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-04-12-elecom-m-xgl10bbbk/2021-04-12-ELECOM-M-XGL10BBBK-right.webp&quot; loading=&quot;lazy&quot;/&gt;
&lt;p&gt;The right flank is wrapped in rubber, and the ring and little fingers stop there without sliding. Even with sweaty hands during long sessions, it does not slip.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;ELECOM M-XGL10BBBK, left side&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-04-12-elecom-m-xgl10bbbk/2021-04-12-ELECOM-M-XGL10BBBK-left.webp&quot; loading=&quot;lazy&quot;/&gt;
&lt;p&gt;The left flank has a thumb rest and two side buttons. The thumb area is shaped with a gentle convex curve that matches the natural shape of the thumb, so the thumb settles there without thinking about it.&lt;/p&gt;
&lt;h2 id=&quot;what-worked--grip-and-side-buttons-that-punch-above-the-price&quot;&gt;What worked — grip and side buttons that punch above the price&lt;/h2&gt;
&lt;p&gt;Short answer: a deliberate grip, side buttons, S/M/L sizing, and a light weight. The basics of a budget mouse, all present.&lt;/p&gt;
&lt;h3 id=&quot;a-grip-designed-to-be-held&quot;&gt;A grip designed to be held&lt;/h3&gt;
&lt;img width=&quot;800&quot; alt=&quot;ELECOM M-XGL10BBBK, scroll wheel&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-04-12-elecom-m-xgl10bbbk/2021-04-12-ELECOM-M-XGL10BBBK-wheel.webp&quot; loading=&quot;lazy&quot;/&gt;
&lt;p&gt;The defining trait of this mouse is that it pushes its budget into the way it feels in the hand.&lt;/p&gt;
&lt;p&gt;Moving over from a bundled mouse or a thousand-yen plain one, the difference is obvious the moment you pick it up. The rubber on the right flank, the convex thumb rest, the drop on the right-click side — none of them look dramatic on their own, but together they change how your hand feels at the end of a long day.&lt;/p&gt;
&lt;h3 id=&quot;side-buttons-make-back-a-one-finger-action&quot;&gt;Side buttons make “back” a one-finger action&lt;/h3&gt;
&lt;p&gt;Side buttons connect directly to workflow.&lt;/p&gt;
&lt;p&gt;The main use is browser back/forward. Web browsing, file managers, IDEs — all of them rely on it constantly, so having the buttons or not having them is a real gap. That alone is enough reason to leave a bundled mouse behind.&lt;/p&gt;
&lt;h3 id=&quot;s--m--l-sizing&quot;&gt;S / M / L sizing&lt;/h3&gt;
&lt;p&gt;Rare in this price band: three sizes to pick from.&lt;/p&gt;
&lt;p&gt;L suits adult-male-sized hands, S works for children and smaller hands, M sits in between. A mouse that does not fit your hand will tire you out no matter how much it cost, so size choices at this price are quietly useful.&lt;/p&gt;
&lt;h3 id=&quot;about-87-g-without-the-battery&quot;&gt;About 87 g without the battery&lt;/h3&gt;
&lt;p&gt;The rated weight is about 87 g without the battery.&lt;/p&gt;
&lt;p&gt;A mouse over 100 g changes how tired your arm gets across a full day, so for office work, light is right. Even with a AA inserted it lands on the lighter side by feel.&lt;/p&gt;
&lt;h2 id=&quot;what-didnt--the-bluetooth-only-trade-off&quot;&gt;What didn’t — the Bluetooth-only trade-off&lt;/h2&gt;
&lt;p&gt;Short answer: connection is Bluetooth-only, so the wireless link is less stable than a USB-receiver model. The lag right after waking from sleep is the most common case.&lt;/p&gt;
&lt;h3 id=&quot;pickup-delay-when-resuming-from-sleep&quot;&gt;Pickup delay when resuming from sleep&lt;/h3&gt;
&lt;p&gt;The biggest complaint.&lt;/p&gt;
&lt;p&gt;For the first few seconds after the PC wakes, the mouse sometimes does not respond. That is a Bluetooth-general behavior rather than a specific defect of this mouse, but coming from a USB-receiver model you will notice it.&lt;/p&gt;
&lt;p&gt;If you sleep and resume often (a laptop-and-dock setup, for example), it is safer to also consider models that ship with a USB receiver, such as the Logicool Unifying-compatible ones.&lt;/p&gt;
&lt;h3 id=&quot;modest-button-remapping-software&quot;&gt;Modest button-remapping software&lt;/h3&gt;
&lt;p&gt;It cannot do the fine-grained gestures the Logicool Options family allows. If you want to map the side buttons to anything beyond simple back/forward, you will end up leaning on a third-party Windows utility.&lt;/p&gt;
&lt;p&gt;That said, the basics (DPI, button presses) work reliably, so for office use without elaborate remapping, there is no real inconvenience.&lt;/p&gt;
&lt;h2 id=&quot;comparison--where-it-sits-against-the-same-and-higher-tiers&quot;&gt;Comparison — where it sits against the same and higher tiers&lt;/h2&gt;
&lt;p&gt;Short answer: at the budget end, it stands out on grip. Compared to higher-tier mice like the Logicool MX line, the side wheel and customization are where the gap shows up.&lt;/p&gt;



























































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Angle&lt;/th&gt;&lt;th&gt;M-XGL10BBBK&lt;/th&gt;&lt;th&gt;Logicool mid-range (e.g. M650)&lt;/th&gt;&lt;th&gt;Sub-1,500-yen budget mice&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Price&lt;/td&gt;&lt;td&gt;Around 2,000 yen&lt;/td&gt;&lt;td&gt;Around 4,000–6,000 yen&lt;/td&gt;&lt;td&gt;Around 1,000 yen&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Connection&lt;/td&gt;&lt;td&gt;Bluetooth only&lt;/td&gt;&lt;td&gt;Bluetooth + USB receiver&lt;/td&gt;&lt;td&gt;Bluetooth or wired&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Sizes&lt;/td&gt;&lt;td&gt;S / M / L&lt;/td&gt;&lt;td&gt;M / L (model-dependent)&lt;/td&gt;&lt;td&gt;Usually none&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Grip&lt;/td&gt;&lt;td&gt;Ergonomic shape, rubber grip&lt;/td&gt;&lt;td&gt;Ergonomic-leaning, smoother&lt;/td&gt;&lt;td&gt;Mostly flat&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Side buttons&lt;/td&gt;&lt;td&gt;2 buttons&lt;/td&gt;&lt;td&gt;2 buttons + custom&lt;/td&gt;&lt;td&gt;None to 2&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Side wheel&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;td&gt;Yes on some models&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Battery&lt;/td&gt;&lt;td&gt;1 × AA (about 402 days rated)&lt;/td&gt;&lt;td&gt;1 × AA or rechargeable&lt;/td&gt;&lt;td&gt;AA or USB-powered&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Remapping software&lt;/td&gt;&lt;td&gt;Yes (modest)&lt;/td&gt;&lt;td&gt;Logi Options+ (full-featured)&lt;/td&gt;&lt;td&gt;Mostly none&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Put briefly: pick the M-XGL10BBBK for the “one step up from a cheap mouse” use case, and the Logicool MX line when you want another step up that includes Excel horizontal scrolling. For the comparison with higher-tier MX Master mice, see the &lt;a href=&quot;https://aulvem.com/en/blog/2021-03-09-logicool-mx-master-2s/&quot;&gt;Logitech MX MASTER 2S review&lt;/a&gt;.&lt;/p&gt;
&lt;aside class=&quot;aff-card not-prose my-10 rounded-2xl border border-[color:var(--aulvem-border)] bg-[color:var(--aulvem-surface)] px-5 py-5 sm:px-6 sm:py-6 has-image&quot; aria-label=&quot;Buy links for Elecom EX-G Bluetooth M-XGL10BBBK&quot; data-astro-cid-qoq25xnm&gt;&lt;div class=&quot;aff-image&quot; data-astro-cid-qoq25xnm&gt;&lt;img src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-04-12-elecom-m-xgl10bbbk/2021-04-12-ELECOM-M-XGL10BBBK.webp&quot; alt=&quot;&quot; aria-hidden=&quot;true&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; data-astro-cid-qoq25xnm&gt;&lt;/div&gt;&lt;p class=&quot;aff-title&quot; data-astro-cid-qoq25xnm&gt;Elecom EX-G Bluetooth M-XGL10BBBK&lt;/p&gt;&lt;div class=&quot;aff-buttons&quot; data-astro-cid-qoq25xnm&gt;&lt;a href=&quot;https://www.amazon.co.jp/dp/B0161YPB6G/?language=en_US&amp;amp;tag=aulvem-22&quot; aria-label=&quot;View Elecom EX-G Bluetooth M-XGL10BBBK on Amazon Japan (primarily sold in Japan)&quot; rel=&quot;sponsored nofollow noopener noreferrer&quot; target=&quot;_blank&quot; class=&quot;aff-btn inline-flex items-center gap-2 rounded-lg border border-[color:var(--aulvem-border)] bg-white px-4 py-2.5 transition-colors hover:border-aulvem-orange&quot; style=&quot;font-size: 14px; font-weight: 500;&quot; data-astro-cid-qoq25xnm&gt;&lt;img src=&quot;https://api.iconify.design/fa6-brands/amazon.svg?color=%23FF9900&quot; width=&quot;16&quot; height=&quot;16&quot; alt=&quot;&quot; aria-hidden=&quot;true&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; style=&quot;display:block&quot; data-astro-cid-qoq25xnm&gt;&lt;span data-astro-cid-qoq25xnm&gt;View on Amazon Japan&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;p class=&quot;aff-note&quot; data-astro-cid-qoq25xnm&gt;
Primarily sold in Japan. amazon.co.jp may ship internationally on select items.
&lt;/p&gt;&lt;/aside&gt;
&lt;h2 id=&quot;faq&quot;&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Q. Does it work with phones and tablets, not just PCs?&lt;/strong&gt;
A. It connects over Bluetooth, so any OS with Bluetooth-mouse support will work — Windows, macOS, iPadOS 13.4 and later, parts of Android. Without a USB receiver, compatibility depends on the host OS’s Bluetooth support.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. How far can the bundled software remap buttons?&lt;/strong&gt;
A. Elecom provides “Elecom Mouse Assistant,” which remaps the side buttons and similar (Windows only — check the latest supported OS list). It is not as fine-grained as the Logicool Options family — things like “different actions per gesture direction” are not on offer. For simple back/forward/copy/paste-level remapping, it is enough.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. Is it less tiring for smaller hands?&lt;/strong&gt;
A. Pick the S size and it is less tiring. The L size, for smaller hands, actually makes the fingers stretch and tires the hand faster, so size choice matters. If you can, holding one in a store is the surest way to avoid regret.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. Can it be used for gaming?&lt;/strong&gt;
A. Response speed and sensor performance are tuned for office work, so it is not a good fit for FPS or anything that needs precise input. For browser games or low-intensity MMOs, it is fine.&lt;/p&gt;
&lt;h2 id=&quot;verdict--a-fitting-upgrade-for-your-first-real-mouse&quot;&gt;Verdict — a fitting upgrade for your first “real” mouse&lt;/h2&gt;
&lt;p&gt;On the price-to-grip ratio, this is one of the standouts in the budget band.&lt;/p&gt;
&lt;p&gt;Especially for “I want to move on from a bundled mouse or a flat thousand-yen one” and “I want to try a mouse that fits my hand size without spending much,” this is a safe first pick.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;ELECOM M-XGL10BBBK, summary shot&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-04-12-elecom-m-xgl10bbbk/2021-04-12-ELECOM-M-XGL10BBBK-point.webp&quot; loading=&quot;lazy&quot;/&gt;
&lt;p&gt;The two things to keep in mind are the Bluetooth-only stability and the modest software. If you live in Excel horizontal scrolling or lean on custom gestures, you’ll be happier in the long run with the Logicool MX line.&lt;/p&gt;</content:encoded><category>reviews</category><category>mouse</category><category>elecom</category><category>pc-peripherals</category></item><item><title>How to pick an iPad for illustration — iPad Pro if you draw seriously, iPad Air as the realistic entry point</title><link>https://aulvem.com/blog/2021-04-11-illustration-ipad/</link><guid isPermaLink="true">https://aulvem.com/blog/2021-04-11-illustration-ipad/</guid><description>Picking an iPad for illustration. The plain iPad, iPad Air, and iPad Pro compared on screen size, performance, and Apple Pencil support, with a recommendation per use case.</description><pubDate>Sun, 11 Apr 2021 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;2026 update&lt;/strong&gt;: ported from the old VuePress blog. The bones (what to look at when choosing a model) still hold, but the specs, prices, and generation names are anchored to when this was written. Heavy rewrite in progress — verify against the current line-up before publishing.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The first thing that trips people up when buying a tablet to draw on is: which one — the plain iPad, the iPad Air, or the iPad Pro? The price spans more than 2x, the screen sizes differ, and the Apple Pencil generations differ too.&lt;/p&gt;
&lt;p&gt;This piece narrows the decision to iPads used for drawing. By the end you should have a clear shape of the one model that fits you, plus the accessories that go with it.&lt;/p&gt;
&lt;h2 id=&quot;the-short-answer--129-inch-ipad-pro-for-serious-drawing-ipad-air-for-entry&quot;&gt;The short answer — 12.9-inch iPad Pro for serious drawing, iPad Air for entry&lt;/h2&gt;
&lt;p&gt;Short answer: if you want to draw long sessions as a display-tablet replacement, the 12.9-inch iPad Pro. If you are starting out as a hobby, the iPad Air is the realistic pick. The plain iPad is cheap, but some generations only support the 1st-gen Apple Pencil, which is a notch behind for illustration use.&lt;/p&gt;
&lt;p&gt;Whatever model you land on, the same three checks decide it:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Screen size&lt;/strong&gt;: aim for 11 inches or larger. Anything around 10 inches gets cramped for full strokes&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Apple Pencil generation&lt;/strong&gt;: pick a model that supports the 2nd gen (magnetic charging, double-tap)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Storage&lt;/strong&gt;: 256 GB or more. A single psd / clip file can hit several hundred MB&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Put differently: if those three boxes are ticked, &lt;strong&gt;the price tier matters less than you think&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id=&quot;picking-the-model--understand-where-each-one-sits&quot;&gt;Picking the model — understand where each one sits&lt;/h2&gt;
&lt;p&gt;Short answer: the plain iPad is “a cheap tablet,” the iPad Air is “light and able to draw,” and the iPad Pro is “a display-tablet replacement.” Pick by use case, not by price.&lt;/p&gt;
&lt;p&gt;The reason is that the iPad line splits hard on CPU, screen quality, and Apple Pencil support — even though all three share the iPad name. For drawing in particular, screen size and Pencil support drive the experience.&lt;/p&gt;
&lt;h3 id=&quot;plain-ipad--fine-for-entry-light-for-serious-long-sessions&quot;&gt;Plain iPad — fine for entry, light for serious long sessions&lt;/h3&gt;
&lt;p&gt;The plain iPad is the cheapest line. For ebooks and video, with the occasional doodle on top, it is plenty.&lt;/p&gt;
&lt;p&gt;That said, some generations only support the 1st-gen Apple Pencil, which charges over Lightning by plugging into the bottom of the tablet — clumsy in daily use. If you are buying a dedicated drawing machine, step up to the Air or higher.&lt;/p&gt;
&lt;h3 id=&quot;ipad-air--the-realistic-entry-point-for-drawing&quot;&gt;iPad Air — the realistic entry point for drawing&lt;/h3&gt;
&lt;p&gt;The iPad Air is “the entry to iPads that can draw.” It supports the 2nd-gen Apple Pencil, and the roughly 10.9-inch screen lands in the usable range.&lt;/p&gt;
&lt;p&gt;It is 20,000–30,000 yen more than the plain iPad, but with the Pencil the experience gap is wide. Hobby use through semi-pro work is covered here.&lt;/p&gt;
&lt;h3 id=&quot;ipad-pro--for-long-sessions-as-a-display-tablet-replacement&quot;&gt;iPad Pro — for long sessions as a display-tablet replacement&lt;/h3&gt;
&lt;p&gt;The iPad Pro is the line for people drawing long sessions as a display-tablet replacement. It supports 120 Hz (ProMotion), and the stroke tracking is noticeably different from the other models.&lt;/p&gt;
&lt;p&gt;It comes in 11-inch and 12.9-inch. If you draw seriously, go 12.9. The price ends up more than 2x the plain iPad, but the extra canvas — “draw without switching views” — translates directly into output.&lt;/p&gt;
&lt;h2 id=&quot;pick-a-model-that-supports-the-2nd-gen-apple-pencil&quot;&gt;Pick a model that supports the 2nd-gen Apple Pencil&lt;/h2&gt;
&lt;p&gt;Short answer: for illustration, 2nd-gen Apple Pencil support is close to a hard requirement. Skip 1st-gen-only models.&lt;/p&gt;
&lt;p&gt;The reason is that the 2nd gen charges magnetically on the side, switches tools on a double-tap, and has lower latency — the feel is a step up. The 1st gen plugs into the Lightning port on the bottom of the tablet to charge, which is awkward to live with.&lt;/p&gt;
&lt;p&gt;What to verify:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The model is explicitly listed as “Apple Pencil (2nd generation) compatible”&lt;/li&gt;
&lt;li&gt;The iPad has a magnetic charging strip on the side (you can see it in product photos)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;storage-from-256-gb-wi-fi-only-is-enough&quot;&gt;Storage from 256 GB, Wi-Fi only is enough&lt;/h2&gt;
&lt;p&gt;Short answer: for illustration, 256 GB or more. Wi-Fi only covers most people.&lt;/p&gt;
&lt;p&gt;The reason is that psd / clip / procreate files run several hundred MB each, and a series-worth of work reaches tens of GB. 64 GB and 128 GB get eaten by the OS and apps.&lt;/p&gt;
&lt;p&gt;Cellular only makes sense if you specifically need always-on connectivity on the move. If Wi-Fi at home and at cafés covers you, putting the 10,000–20,000-yen difference into the Pencil or a case is the higher-satisfaction move.&lt;/p&gt;
&lt;h2 id=&quot;accessories--the-minimum-set&quot;&gt;Accessories — the minimum set&lt;/h2&gt;
&lt;p&gt;Short answer: Apple Pencil (2nd gen), a screen protector, and a stand or keyboard cover. Three things, and the drawing setup is broadly there.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Apple Pencil (2nd gen)&lt;/strong&gt;: required. Sold separately&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Paper-like screen protector&lt;/strong&gt;: closer to the feel of paper. Pen tips wear faster as a tradeoff&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Stand or keyboard cover&lt;/strong&gt;: gives you a drawing angle on a desk. Easier on posture over long sessions&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Unlike a display tablet, there are no external monitor cables or drivers to wire up. Starting to draw the day it arrives is the iPad’s quiet strength.&lt;/p&gt;
&lt;h2 id=&quot;comparison-plain-ipad--ipad-air--ipad-pro-for-illustration&quot;&gt;Comparison: plain iPad / iPad Air / iPad Pro (for illustration)&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;The line-up below is anchored to 2021. In 2026, verify the current generation’s specs and price for each model.&lt;/p&gt;
&lt;/blockquote&gt;















































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Aspect&lt;/th&gt;&lt;th&gt;Plain iPad&lt;/th&gt;&lt;th&gt;iPad Air&lt;/th&gt;&lt;th&gt;iPad Pro 12.9”&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Screen size&lt;/td&gt;&lt;td&gt;About 10.2 in&lt;/td&gt;&lt;td&gt;About 10.9 in&lt;/td&gt;&lt;td&gt;12.9 in&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Apple Pencil&lt;/td&gt;&lt;td&gt;1st gen&lt;/td&gt;&lt;td&gt;2nd gen&lt;/td&gt;&lt;td&gt;2nd gen&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Refresh rate&lt;/td&gt;&lt;td&gt;60 Hz&lt;/td&gt;&lt;td&gt;60 Hz&lt;/td&gt;&lt;td&gt;120 Hz (ProMotion)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;RAM (rough)&lt;/td&gt;&lt;td&gt;3–4 GB&lt;/td&gt;&lt;td&gt;4 GB&lt;/td&gt;&lt;td&gt;6–8 GB&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Price (rough)&lt;/td&gt;&lt;td&gt;From ~40,000 yen&lt;/td&gt;&lt;td&gt;From ~70,000 yen&lt;/td&gt;&lt;td&gt;From ~120,000 yen&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Best fit&lt;/td&gt;&lt;td&gt;Entry, doodling&lt;/td&gt;&lt;td&gt;Hobby through semi-pro&lt;/td&gt;&lt;td&gt;Display-tablet replacement, serious drawing&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;faq&quot;&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Q. Can you draw on an iPad mini?&lt;/strong&gt;
A. You can, but the 7.9–8.3-inch screen gets cramped for long sessions. If you want to share it with ebook and gaming use, the iPad mini works; if drawing is the main goal, step up to the Air or higher. For more, see &lt;a href=&quot;https://aulvem.com/blog/2021-04-05-ipad-mini/&quot;&gt;How to pick an iPad mini&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. 11-inch or 12.9-inch iPad Pro?&lt;/strong&gt;
A. 12.9 if you draw seriously. The price gap is around 20,000 yen, but the extra screen translates directly into “the range you can draw on without zooming.” 11-inch is worth considering only if portability is the priority.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. Can you do illustration work entirely on an iPad?&lt;/strong&gt;
A. With Procreate or Clip Studio Paint, you can take a piece from rough to finish on iPad. That said, for fine pre-submission tweaks and multi-monitor workflows, pairing with a PC is the realistic long-term setup.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. How much RAM do you need?&lt;/strong&gt;
A. RAM starts to matter as layer count climbs. The Air’s 4 GB holds up for hobby use, but for commercial-scale canvases the iPad Pro’s 6–8 GB is the safer call.&lt;/p&gt;
&lt;h2 id=&quot;wrapping-up&quot;&gt;Wrapping up&lt;/h2&gt;
&lt;p&gt;For an illustration iPad, the 12.9-inch iPad Pro is the call if you draw seriously, and the iPad Air is the realistic entry point for hobby through semi-pro use. The plain iPad is cheap, but as a dedicated drawing tablet it sits a notch behind on Pencil-generation support.&lt;/p&gt;
&lt;p&gt;The deciding factors are three: 11-inch-or-larger screen, 2nd-gen Apple Pencil support, and 256 GB or more storage. Prioritizing those three over price leaves less regret after the purchase.&lt;/p&gt;
&lt;p&gt;Starting to draw the day it arrives is the iPad’s quiet strength. The lower setup overhead, compared with a display tablet plus PC, adds up over years of drawing.&lt;/p&gt;</content:encoded><category>reviews</category><category>apple</category><category>illustration</category><category>ipad</category></item><item><title>How to pick a numeric keypad for Windows — laptop built-in, USB, or Bluetooth</title><link>https://aulvem.com/blog/2021-04-10-numeric-keypad-windows/</link><guid isPermaLink="true">https://aulvem.com/blog/2021-04-10-numeric-keypad-windows/</guid><description>For people who want faster number entry in Excel or accounting work on Windows. Compares laptop built-in keypads, USB 2.4GHz, and Bluetooth, with a buying guide and FAQ that keep you from picking wrong.</description><pubDate>Sat, 10 Apr 2021 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;2026 update&lt;/strong&gt;: Ported from the old VuePress blog. The basic structure of numeric keypads has not changed much since 2021, so the framework still holds, but the specific product links need to be swapped for current models.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;When you keep typing numbers in Excel, the small cost of reaching for the number row on a full-size keyboard quietly adds up. For accounting, inventory, or data entry work — anything where you punch in numbers many times a day — a dedicated keypad ends up faster.&lt;/p&gt;
&lt;p&gt;This piece walks through how to pick a numeric keypad for Windows, in this order: is the laptop’s built-in keypad enough, and if not, USB or Bluetooth? By the end you should have a clear shape of the one unit that fits you.&lt;/p&gt;
&lt;h2 id=&quot;the-short-answer--for-heavy-number-entry-a-usb-24ghz-external-keypad-is-the-first-pick&quot;&gt;The short answer — for heavy number entry, a USB 2.4GHz external keypad is the first pick&lt;/h2&gt;
&lt;p&gt;Short answer: first check whether the laptop’s built-in keypad is enough. If it isn’t, the default Windows keypad shape is &lt;strong&gt;USB 2.4GHz wireless, slim, with a calculator key&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Three reasons:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;USB 2.4GHz has less latency than Bluetooth&lt;/strong&gt; — the dedicated receiver link is less affected by the surrounding environment&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A slim profile (scissor switch or pantograph) matches the key height of a laptop&lt;/strong&gt; — minimal step when you place them side by side&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A calculator key earns its space if you open the calculator many times a day&lt;/strong&gt; — you can launch it without your eyes moving&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;For people whose work is fully contained on a laptop, or whose desk doubles as a Windows + iPad setup, the decision axis is different. The sections below walk through it.&lt;/p&gt;
&lt;h2 id=&quot;is-the-laptops-built-in-keypad-enough--check-this-first&quot;&gt;Is the laptop’s built-in keypad enough — check this first&lt;/h2&gt;
&lt;p&gt;Short answer: if you type numbers a few dozen times a day, the laptop’s built-in keypad is enough. If you punch in real volume every day, switching to an external one is easier on your hands.&lt;/p&gt;
&lt;p&gt;The reason is structural: a laptop with a built-in keypad is wider, which shifts the home position to the left of body center. Type for long stretches and your right shoulder tends to creep forward.&lt;/p&gt;
&lt;p&gt;What to check:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;How often you type numbers&lt;/strong&gt;: hundreds of times a day → external; occasionally → built-in is plenty&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Body size&lt;/strong&gt;: built-in keypads are usually only on 15.6-inch and larger models (depends on model)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Key layout&lt;/strong&gt;: NumLock and &lt;code&gt;00&lt;/code&gt; key placement vary by manufacturer, so if you already know one brand’s layout you can keep using it&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If the built-in keypad doesn’t feel like enough, switch to external. The next section gets into connection types.&lt;/p&gt;
&lt;h2 id=&quot;connection-type--usb-24ghz-bluetooth-wired&quot;&gt;Connection type — USB 2.4GHz, Bluetooth, wired&lt;/h2&gt;
&lt;img width=&quot;800&quot; alt=&quot;Numeric keypad connection types — wired USB, USB 2.4GHz wireless, Bluetooth wireless&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-04-10-numeric-keypad-windows/2021-04-10-Numeric-Keypad-Connection-type.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;p&gt;Short answer: for a fixed PC setup, USB 2.4GHz; for sharing with a phone or tablet, Bluetooth; if you absolutely need zero latency, wired.&lt;/p&gt;
&lt;p&gt;The reason is that each is good at a different scenario.&lt;/p&gt;
&lt;h3 id=&quot;usb-24ghz-wireless-receiver&quot;&gt;USB 2.4GHz (wireless receiver)&lt;/h3&gt;
&lt;p&gt;You plug a dedicated USB receiver into the PC. Less latency than Bluetooth, and fewer dropped keystrokes right after waking from sleep.&lt;/p&gt;
&lt;p&gt;It uses one USB port, but there’s no pairing dance. On Windows it just works the moment you plug it in.&lt;/p&gt;
&lt;p&gt;For a fixed keypad setup on a desktop or laptop, this is the format I’d recommend first.&lt;/p&gt;
&lt;h3 id=&quot;bluetooth&quot;&gt;Bluetooth&lt;/h3&gt;
&lt;p&gt;Connects to the PC’s built-in Bluetooth. No receiver needed, so it doesn’t take up a USB port.&lt;/p&gt;
&lt;p&gt;Handy if you want to share the same hardware with an iPad or phone. The trade-off is that in congested environments a keystroke can drop for a moment. There’s also a bit of a wait after sleep wake (environment-dependent).&lt;/p&gt;
&lt;h3 id=&quot;wired-usb&quot;&gt;Wired USB&lt;/h3&gt;
&lt;p&gt;Connects to the PC by cable. Guaranteed zero latency.&lt;/p&gt;
&lt;p&gt;The cost is desk handling: placed to the right of a tenkeyless keyboard, the cable tangles into the path your hand takes. Unless you’re an accountant typing numbers all day, wireless is plenty.&lt;/p&gt;
&lt;h2 id=&quot;comparison-usb-24ghz--bluetooth--laptop-built-in&quot;&gt;Comparison: USB 2.4GHz / Bluetooth / laptop built-in&lt;/h2&gt;
&lt;p&gt;Lining all three up. Price and latency feel are reference values from when I bought mine (varies by model and environment).&lt;/p&gt;



























































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Aspect&lt;/th&gt;&lt;th&gt;USB 2.4GHz&lt;/th&gt;&lt;th&gt;Bluetooth&lt;/th&gt;&lt;th&gt;Laptop built-in&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Connection&lt;/td&gt;&lt;td&gt;USB receiver&lt;/td&gt;&lt;td&gt;PC’s built-in Bluetooth&lt;/td&gt;&lt;td&gt;Integrated into the laptop&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Latency concern&lt;/td&gt;&lt;td&gt;Low&lt;/td&gt;&lt;td&gt;Slightly higher (environment-dependent)&lt;/td&gt;&lt;td&gt;None&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Stability&lt;/td&gt;&lt;td&gt;Good&lt;/td&gt;&lt;td&gt;Fair&lt;/td&gt;&lt;td&gt;Good&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cross-device use&lt;/td&gt;&lt;td&gt;Limited (PC-oriented)&lt;/td&gt;&lt;td&gt;Good (works with phone/tablet)&lt;/td&gt;&lt;td&gt;None (laptop only)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;USB port use&lt;/td&gt;&lt;td&gt;1 port&lt;/td&gt;&lt;td&gt;None&lt;/td&gt;&lt;td&gt;None&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Price range&lt;/td&gt;&lt;td&gt;2,000–4,000 yen&lt;/td&gt;&lt;td&gt;3,000–6,000 yen&lt;/td&gt;&lt;td&gt;Included in laptop price&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Portability&lt;/td&gt;&lt;td&gt;Carry with the receiver&lt;/td&gt;&lt;td&gt;Carry on its own&lt;/td&gt;&lt;td&gt;Stays with the laptop&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Calculator key&lt;/td&gt;&lt;td&gt;Depends on model&lt;/td&gt;&lt;td&gt;Depends on model&lt;/td&gt;&lt;td&gt;Most models don’t have one&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Rough decision guide:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Windows desktop / fixed laptop setup&lt;/strong&gt; → USB 2.4GHz&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Want to share with iPad/phone, or USB ports are scarce&lt;/strong&gt; → Bluetooth&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;About to replace the laptop / light number entry&lt;/strong&gt; → consider a model with a built-in keypad&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;three-keys-you-dont-want-to-miss--tab-backspace-calculator&quot;&gt;Three keys you don’t want to miss — Tab, Backspace, calculator&lt;/h2&gt;
&lt;p&gt;Among the keys on the keypad body, three are ones Excel-heavy users shouldn’t drop:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Tab&lt;/strong&gt;: horizontal cell movement in Excel. Combined with Enter (down), you can fill in a whole table without leaving the keypad&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Backspace&lt;/strong&gt;: instant fix for a wrong digit. You hit it constantly in numeric entry, so a dedicated key matters&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Calculator&lt;/strong&gt;: launches the Windows Calculator app with one key. Earns its keep during expense work&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A &lt;code&gt;00&lt;/code&gt; (double-zero) key only matters if you enter monetary amounts a lot. Outside accounting work, it’s lower priority.&lt;/p&gt;
&lt;p&gt;You can confirm these keys are present by looking at the key layout photo on the product page. Spec sheets alone sometimes don’t tell you whether “Tab” and “Backspace” are there, so always check the image.&lt;/p&gt;
&lt;h2 id=&quot;key-feel--scissor-switches-if-it-sits-next-to-a-laptop&quot;&gt;Key feel — scissor switches if it sits next to a laptop&lt;/h2&gt;
&lt;p&gt;Short answer: if you place it next to a laptop, a scissor switch or pantograph matches the key height and is easier to work with.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Membrane&lt;/strong&gt;: cheap. Long key travel — placed next to a laptop, the height difference feels off&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pantograph&lt;/strong&gt;: the slim format widely used in laptops. Compact, but the feel varies a lot between products&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Scissor switch&lt;/strong&gt;: refined version of the pantograph. Slim with a clear click feel. Less tiring over long sessions&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For dedicated number entry, scissor switches are the first pick.&lt;/p&gt;
&lt;h2 id=&quot;what-to-actually-buy&quot;&gt;What to actually buy&lt;/h2&gt;
&lt;p&gt;For a model that hits all three of USB 2.4GHz, scissor switches, and a calculator key, I’ve written a separate review of the Belis wireless numeric keypad. It gets into the key feel on an actual unit, how loud the LED is, and battery life — so if you want to confirm whether a specific model matches the conditions above, read them together.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Related: &lt;a href=&quot;https://aulvem.com/blog/2021-03-01-belis-numerickeypad/&quot;&gt;Belis wireless numeric keypad review — a slim USB 2.4GHz keypad with a calculator key&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;faq&quot;&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Q. If I buy a laptop with a built-in numeric keypad, do I still need an external one?&lt;/strong&gt;
A. If you type numbers a few dozen times a day, a laptop with a built-in keypad is enough. The drawbacks are a wider body, a home position that sits to the right of center, and key layouts that vary by manufacturer — so if you punch in numbers in real volume every day, an external keypad is easier on your hands.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. USB 2.4GHz vs. Bluetooth — which is more stable?&lt;/strong&gt;
A. For a fixed setup at a PC, USB 2.4GHz is more stable. The dedicated receiver link has less latency and is less likely to keep you waiting right after sleep wake. Bluetooth can drop a keystroke for a moment in noisy or congested environments.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. Should the numeric keypad have a calculator key?&lt;/strong&gt;
A. If you launch the calculator often — expense claims, rough stock counts — go with a model that has a dedicated calculator key. Compared to a keyboard shortcut you have to remember, your eyes move less, and the calculator appears the instant you press the key.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. Can I use the same numeric keypad on a Mac?&lt;/strong&gt;
A. The number keys themselves usually work, but the calculator key and some function keys may not respond on macOS, or may be recognized as different keys. If you plan to use it on a Mac, it’s safer to confirm explicit Mac support on the product page before you buy (depends on product and OS version).&lt;/p&gt;
&lt;h2 id=&quot;wrapping-up&quot;&gt;Wrapping up&lt;/h2&gt;
&lt;p&gt;For a numeric keypad on Windows, first check whether the laptop’s built-in one is enough. If it isn’t, the split is: USB 2.4GHz for a fixed PC setup, Bluetooth for sharing with other devices.&lt;/p&gt;
&lt;p&gt;Key format: scissor switch or pantograph. Confirm from the product photo that Tab, Backspace, and the calculator key are present.&lt;/p&gt;
&lt;p&gt;With those constraints, it’s hard to pick wrong. If you want to know the key feel on a specific model before buying, the &lt;a href=&quot;https://aulvem.com/blog/2021-03-01-belis-numerickeypad/&quot;&gt;Belis wireless numeric keypad review&lt;/a&gt; sketches it in concrete detail.&lt;/p&gt;
</content:encoded><category>reviews</category><category>PCPeripherals</category><category>numeric-keypad</category><category>windows</category></item><item><title>Vue.js for beginners — components, props, and two-way binding, explained with real code</title><link>https://aulvem.com/blog/2021-04-09-vue-component/</link><guid isPermaLink="true">https://aulvem.com/blog/2021-04-09-vue-component/</guid><description>A walkthrough of Vue.js components for first-time users — what a component is, how parent and child talk to each other, and where to use one-way binding (v-bind / v-on) versus two-way binding (v-bind + v-on, or .sync) — with runnable code at each step.</description><pubDate>Fri, 09 Apr 2021 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;2026 update&lt;/strong&gt;: a post ported over from the old VuePress blog. The shape of the explanation still holds, but the tooling and Vue version are frozen at the time of writing and differ from the current release.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;For anyone picking up Vue.js — or a JavaScript framework — for the first time, &lt;strong&gt;the part to understand first is components&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;This post starts from what a component is, so it should read cleanly even without prior framework experience.&lt;/p&gt;
&lt;h2 id=&quot;the-short-version&quot;&gt;The short version&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;component&lt;/strong&gt; is a reusable UI part — it raises maintainability and lets you reuse work&lt;/li&gt;
&lt;li&gt;Data flows between a parent and a child through &lt;strong&gt;binding&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Use one-way binding (&lt;code&gt;v-bind&lt;/code&gt; / &lt;code&gt;v-on&lt;/code&gt;) and two-way binding (&lt;code&gt;v-bind&lt;/code&gt; + &lt;code&gt;v-on&lt;/code&gt;, or &lt;code&gt;.sync&lt;/code&gt;) depending on whether the data needs transforming&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;what-is-a-component&quot;&gt;What is a component?&lt;/h2&gt;
&lt;p&gt;Vue.js and Angular both build on the idea of a component.&lt;/p&gt;
&lt;p&gt;Vue uses components to consolidate code. Consolidation cuts down the amount of code you maintain and makes it easier to change later.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Every Vue project uses components in some form, so understanding them is non-optional.&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&quot;a-reusable-part&quot;&gt;A reusable part&lt;/h3&gt;
&lt;p&gt;A component, in one line, is a &lt;strong&gt;reusable part&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;A &lt;code&gt;.vue&lt;/code&gt; file can import and use another &lt;code&gt;.vue&lt;/code&gt; file inside its own template.&lt;/p&gt;
&lt;p&gt;Build a button as a reusable component, for example, and any caller can render the same look and the same behaviour just by referencing it.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Example: a button&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Goal&lt;/strong&gt;: reuse a 20 px square button labelled “click here”.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How&lt;/strong&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;In file A, define a 20 px square button labelled “click here”.&lt;/li&gt;
&lt;li&gt;In file B, render the button component.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Result&lt;/strong&gt;: the button shows up in file B.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The side being called (file A) and the side calling it (file B) are usually referred to as the &lt;strong&gt;child&lt;/strong&gt; and the &lt;strong&gt;parent&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;From here on:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The caller = parent&lt;/li&gt;
&lt;li&gt;The called = child&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;what-is-binding&quot;&gt;What is binding?&lt;/h3&gt;
&lt;p&gt;In the button example above, two limitations stand out:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The button text is hard-coded&lt;/li&gt;
&lt;li&gt;The click handler has to live in the child&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Binding is what removes those limits.&lt;/p&gt;
&lt;h3 id=&quot;component-to-component-data-flow&quot;&gt;Component-to-component data flow&lt;/h3&gt;
&lt;p&gt;Binding, in one line, is &lt;strong&gt;the data flow between components&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;With binding in place you can:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Let the parent decide the child’s text&lt;/li&gt;
&lt;li&gt;Let the child propagate an event up to the parent&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Both of the issues above go away once binding is added.&lt;/p&gt;
&lt;br/&gt;
&lt;p&gt;The relationship between the parent and the child matters here:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A one-way trip — parent to child, or child to parent — is &lt;strong&gt;one-way binding&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;A round trip between the two is &lt;strong&gt;two-way binding&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Components do not click into place until binding does, so this is the section worth re-reading.&lt;/p&gt;
&lt;h2 id=&quot;working-examples&quot;&gt;Working examples&lt;/h2&gt;
&lt;p&gt;From here, the explanation is anchored to real Vue.js code.&lt;/p&gt;
&lt;p&gt;If &lt;code&gt;.vue&lt;/code&gt; file basics are unfamiliar, the earlier post covers them:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://aulvem.com/blog/2021-04-02-vue-base/&quot;&gt;Vue.js for beginners — the basics&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;using-a-component&quot;&gt;Using a component&lt;/h3&gt;
&lt;p&gt;Start with the plainest case: rendering a component with no binding at all.&lt;/p&gt;
&lt;p&gt;The child shows a string. The parent renders the child.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Child&lt;/strong&gt;: &lt;code&gt;ChildComponent.vue&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;vue&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;template&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;  string&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;template&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 child has no logic — it just prints text.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Parent&lt;/strong&gt;: &lt;code&gt;ParentComponent.vue&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;vue&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;template&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;ChildComponent&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;template&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&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;import&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ChildComponent &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &amp;quot;xxxx/ChildComponent.vue&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&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:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  components: { ChildComponent },&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;The parent imports &lt;code&gt;ChildComponent.vue&lt;/code&gt; and registers it under &lt;code&gt;components&lt;/code&gt;. On the template side, dropping &lt;code&gt;&amp;lt;ChildComponent /&amp;gt;&lt;/code&gt; where you want it to render is enough.&lt;/p&gt;
&lt;h3 id=&quot;v-bind--one-way-binding-parent-to-child&quot;&gt;v-bind — one-way binding, parent to child&lt;/h3&gt;
&lt;p&gt;With the call mechanics out of the way, the next step is parent-to-child binding.&lt;/p&gt;
&lt;p&gt;The idea is: let the parent decide the child’s text.&lt;/p&gt;
&lt;p&gt;The snippet below passes a string set in the parent down to the child.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Child&lt;/strong&gt;: &lt;code&gt;ChildComponent.vue&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;vue&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;template&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;  {{bindName}}&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;template&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&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;export&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; default&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;  props: [&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;bindName&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:#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;To receive data from the parent, the child declares &lt;strong&gt;props&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The prop name has to match on both sides. Here it is &lt;code&gt;bindName&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;props&lt;/code&gt; is an array, so a child can declare multiple inbound props at once.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Parent&lt;/strong&gt;: &lt;code&gt;ParentComponent.vue&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;vue&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;template&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;ChildComponent&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; :bindName&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;dataName&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;template&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&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;import&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ChildComponent &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &amp;quot;xxxx/ChildComponent.vue&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&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:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  components: { ChildComponent },&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;  data&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;    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;      dataName: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;#39;string&amp;#39;&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 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 parent renders the child with &lt;code&gt;:bindName=&amp;quot;dataName&amp;quot;&lt;/code&gt;. That attribute is the bind itself.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;bindName&lt;/code&gt; is the prop name on the child&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dataName&lt;/code&gt; is the data field on the parent&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That is the full parent-to-child flow.&lt;/p&gt;
&lt;h3 id=&quot;v-on--one-way-binding-child-to-parent&quot;&gt;v-on — one-way binding, child to parent&lt;/h3&gt;
&lt;p&gt;Next, child-to-parent binding.&lt;/p&gt;
&lt;p&gt;The idea is: let the parent observe an event that happened inside the child.&lt;/p&gt;
&lt;p&gt;In the snippet below, clicking the child’s text fires an event in the parent and flips the parent’s text from &lt;strong&gt;string → モジ&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Child&lt;/strong&gt;: &lt;code&gt;ChildComponent.vue&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;vue&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;template&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;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; @click&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;clickText()&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;      クリックして変更&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;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;template&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&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;export&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; default&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;  methods: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;    clickText&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;      this&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;$emit&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;#39;onName&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;モジ&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 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 child wires up a click handler — &lt;code&gt;@click&lt;/code&gt; is the directive.&lt;/p&gt;
&lt;p&gt;Inside the method, the line that lifts the event up to the parent is &lt;code&gt;emit&lt;/code&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The first argument, &lt;code&gt;onName&lt;/code&gt;, is the event name&lt;/li&gt;
&lt;li&gt;The second argument, &lt;code&gt;モジ&lt;/code&gt;, is the payload (an object works too)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Clicking “クリックして変更” propagates up to the parent’s &lt;code&gt;onName&lt;/code&gt; listener.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Parent&lt;/strong&gt;: &lt;code&gt;ParentComponent.vue&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;vue&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;template&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;  {{dataName}}&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;ChildComponent&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; @onName&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;changeName&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;template&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&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;import&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ChildComponent &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &amp;quot;xxxx/ChildComponent.vue&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&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:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  components: { ChildComponent },&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;  data&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;    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;      dataName: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;#39;string&amp;#39;&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;  methods: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;    changeName&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;item&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;      this&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.dataName &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; item&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 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 parent looks much like the &lt;code&gt;v-bind&lt;/code&gt; case.&lt;/p&gt;
&lt;p&gt;The new piece is &lt;code&gt;changeName&lt;/code&gt; — its argument is the payload the child emitted.&lt;/p&gt;
&lt;p&gt;That is the full child-to-parent flow.&lt;/p&gt;
&lt;h2 id=&quot;going-further&quot;&gt;Going further&lt;/h2&gt;
&lt;p&gt;The one-way patterns above cannot move data in both directions on their own.&lt;/p&gt;
&lt;p&gt;Two-way binding is what closes that loop. It is the trickiest part of components, so this section is worth slowing down on.&lt;/p&gt;
&lt;h3 id=&quot;v-bind--v-on--two-way-binding&quot;&gt;v-bind + v-on — two-way binding&lt;/h3&gt;
&lt;p&gt;Vue.js has two common ways to do two-way binding. The most fundamental one comes first.&lt;/p&gt;
&lt;p&gt;It is the combination of:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;v-bind&lt;/code&gt; — one-way, parent to child&lt;/li&gt;
&lt;li&gt;&lt;code&gt;v-on&lt;/code&gt; — one-way, child to parent&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The flow:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The parent sets the string the child will show (&lt;code&gt;string&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;The child sends a click event up to the parent (payload: &lt;code&gt;モジ&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;The parent’s string flips from &lt;code&gt;string&lt;/code&gt; → &lt;code&gt;モジ&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;The child re-renders with &lt;code&gt;モジ&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Previous sections led with the child. From here, &lt;strong&gt;the parent comes first&lt;/strong&gt; — it reads more naturally.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Parent&lt;/strong&gt;: &lt;code&gt;ParentComponent.vue&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;vue&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;template&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;ChildComponent&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; :bindName&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;dataName&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; @onName&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;changeName&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;template&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&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;import&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ChildComponent &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &amp;quot;xxxx/ChildComponent.vue&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&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:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  components: { ChildComponent },&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;  data&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;    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;      dataName: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;#39;string&amp;#39;&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;  methods: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;    changeName&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;item&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;      this&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.dataName &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; item&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 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;It is just &lt;code&gt;v-bind&lt;/code&gt; and &lt;code&gt;v-on&lt;/code&gt; running side by side. The parent stays straightforward.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Child&lt;/strong&gt;: &lt;code&gt;ChildComponent.vue&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;vue&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;template&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;    {{bindName}}&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:#B392F0&quot;&gt; @click&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;clickText()&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;      クリックして変更&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;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;template&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&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;export&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; default&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;  props: [&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;bindName&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&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  methods: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;    clickText&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;      this&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;$emit&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;#39;onName&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;モジ&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 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 child is the same shape — &lt;code&gt;v-bind&lt;/code&gt; plus &lt;code&gt;v-on&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;If this stops making sense, walking through the four-step flow above in order tends to put it back together.&lt;/p&gt;
&lt;h3 id=&quot;sync--two-way-binding&quot;&gt;.sync — two-way binding&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;v-bind&lt;/code&gt; + &lt;code&gt;v-on&lt;/code&gt; works, but it gets verbose.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;.sync&lt;/code&gt; is the shortcut for the cases that do not need the wiring.&lt;/p&gt;
&lt;p&gt;In one line, &lt;code&gt;.sync&lt;/code&gt; &lt;strong&gt;turns &lt;code&gt;v-bind&lt;/code&gt; into a synced binding&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The code below produces the same end behaviour as the previous snippet:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The parent sets the string the child will show (&lt;code&gt;string&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;The child sends a click event up to the parent (payload: &lt;code&gt;モジ&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;The parent’s string flips from &lt;code&gt;string&lt;/code&gt; → &lt;code&gt;モジ&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;The child re-renders with &lt;code&gt;モジ&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Parent&lt;/strong&gt;: &lt;code&gt;ParentComponent.vue&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;vue&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;template&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;ChildComponent&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; :bindName.sync&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;dataName&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;template&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&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;import&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ChildComponent &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &amp;quot;xxxx/ChildComponent.vue&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&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:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  components: { ChildComponent },&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;  data&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;    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;      dataName: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;#39;string&amp;#39;&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 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 parent gets noticeably lighter.&lt;/p&gt;
&lt;p&gt;The key is &lt;code&gt;bindName.sync&lt;/code&gt; — adding &lt;code&gt;.sync&lt;/code&gt; removes the explicit assignment that &lt;code&gt;v-on&lt;/code&gt; was doing.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Child&lt;/strong&gt;: &lt;code&gt;ChildComponent.vue&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;vue&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;template&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;    {{bindName}}&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:#B392F0&quot;&gt; @click&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;clickText()&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;      クリックして変更&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;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;template&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&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;export&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; default&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;  props: [&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;bindName&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&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  methods: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;    clickText&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;      this&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;$emit&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;#39;update:bindName&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;モジ&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 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 child changes slightly — the first argument to &lt;code&gt;emit&lt;/code&gt; becomes &lt;code&gt;update:bindName&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;update:&lt;/code&gt; prefix is what wires the emit back into the parent’s &lt;code&gt;.sync&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&quot;v-on-vs-sync--when-to-use-which&quot;&gt;v-on vs. .sync — when to use which&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;.sync&lt;/code&gt; is shorter, but it has a caveat.&lt;/p&gt;
&lt;p&gt;Because it is a synced bind, there is no place to hook in transformation logic. &lt;strong&gt;If the parent needs to filter or reshape the child’s payload before assigning it, &lt;code&gt;.sync&lt;/code&gt; will not fit.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A rough rule for two-way binding:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If the data is transformed between files → &lt;strong&gt;v-bind + v-on&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;If the data is passed through unchanged → &lt;strong&gt;.sync&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;wrap-up&quot;&gt;Wrap-up&lt;/h2&gt;
&lt;p&gt;Components and binding are two of the load-bearing pieces of Vue.js, and the rest of the framework leans on them. Worth re-reading and writing out by hand until they feel automatic.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Related&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://aulvem.com/blog/2021-04-02-vue-base/&quot;&gt;Vue.js for beginners — the basics&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://aulvem.com/blog/2021-03-31-vue-angular/&quot;&gt;Angular vs. Vue.js, from a year of using both&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>build</category><category>JavaScript</category><category>Vue.js</category><category>Component</category></item><item><title>How to pick a MacBook for blogging — Air covers it; Pro is for creators</title><link>https://aulvem.com/blog/2021-04-08-blog-macbook/</link><guid isPermaLink="true">https://aulvem.com/blog/2021-04-08-blog-macbook/</guid><description>Picking a MacBook for blog writing. For almost everyone the Air is enough; the Pro only earns its keep if you also edit video, develop, or process RAW photos. Here&apos;s what actually separates them and how to choose without regret.</description><pubDate>Thu, 08 Apr 2021 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;2026 update&lt;/strong&gt;: ported from the old VuePress blog. The frame — Air is enough; Pro only if you’re a creator — still holds, but the model names, prices, and specs below are 2021-era. Apple Silicon has gone through several refreshes, so confirm the current line-up before buying. Heavily rewritten — re-check the affiliate links before publishing.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;When you start looking at MacBooks to start a blog, the options pile up fast: Air, Pro, 13-inch, 14-inch, 16-inch. The price gap can run past 100,000 yen, and going straight to a Pro feels reckless.&lt;/p&gt;
&lt;p&gt;This piece narrows the question to one use case — writing a blog — and lays out which MacBook to pick between Air and Pro. The short version: for almost everyone, the Air is enough.&lt;/p&gt;
&lt;p&gt;If you’re weighing this against a Windows laptop, the companion piece &lt;a href=&quot;https://aulvem.com/blog/2021-03-13-blog-pc/&quot;&gt;How to pick a laptop for blogging&lt;/a&gt; covers the cross-OS criteria.&lt;/p&gt;
&lt;h2 id=&quot;the-short-answer--macbook-air-for-blogging-pro-only-if-you-double-up-as-a-creator&quot;&gt;The short answer — MacBook Air for blogging, Pro only if you double up as a creator&lt;/h2&gt;
&lt;p&gt;Short answer: if blog writing is the only goal, the cheapest MacBook Air is enough. The price gap to a Pro (roughly 50,000–100,000 yen) is worth paying only if you also edit video, develop, or process RAW photos.&lt;/p&gt;
&lt;p&gt;The reason is simple: WordPress writing happens in the browser. The browser needs to feel smooth, and the Air’s Apple Silicon comfortably cleared that bar even as the entry-level laptop of the day.&lt;/p&gt;
&lt;p&gt;There are only two real axes to weigh:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;What you’ll do on the MacBook&lt;/strong&gt; — Air if it’s “blogging only”; Pro if you also handle video, photo, or development&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Whether you carry it&lt;/strong&gt; — the Air is light; the 16-inch Pro is over 2 kg&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Settle those two and there isn’t much room left to second-guess.&lt;/p&gt;
&lt;h2 id=&quot;three-things-to-look-at-when-choosing-a-macbook&quot;&gt;Three things to look at when choosing a MacBook&lt;/h2&gt;
&lt;p&gt;Short answer: for a blogging machine, the only specs that matter are &lt;strong&gt;RAM, weight, and screen size&lt;/strong&gt;. The CPU generation and core count are not worth stressing over.&lt;/p&gt;
&lt;p&gt;The reason is that writing work hits memory before it hits the CPU. If you write with dozens of browser tabs open for reference, RAM is where you’ll feel the squeeze.&lt;/p&gt;
&lt;h3 id=&quot;ram--8-gb-is-the-floor-16-gb-lasts-longer&quot;&gt;RAM — 8 GB is the floor, 16 GB lasts longer&lt;/h3&gt;
&lt;p&gt;RAM is how much your machine can hold in flight at once. Tabs eat into it quickly, so if you tend to leave 30 reference tabs open while drafting, this is where you’ll bottleneck.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;8 GB&lt;/strong&gt;: WordPress editor plus ~10 reference tabs is fine&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;16 GB&lt;/strong&gt;: recommended if you plan to keep the machine for 4–5 years — your tab habits don’t have to be disciplined&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Apple Silicon MacBooks have RAM soldered on; you can’t upgrade it later. Decide at purchase.&lt;/p&gt;
&lt;h3 id=&quot;weight--ignore-it-if-you-write-at-home-target-13-kg-or-less-if-you-carry-it&quot;&gt;Weight — ignore it if you write at home, target 1.3 kg or less if you carry it&lt;/h3&gt;
&lt;p&gt;If you only write at home, weight is a non-issue.&lt;/p&gt;
&lt;p&gt;If you write outside, the Air is the realistic pick. The Pro is around 1.5 kg even at 14 inches, and the 16-inch passes 2 kg. Slipping that into a bag every day adds up on your back.&lt;/p&gt;
&lt;h3 id=&quot;screen--13-inches-is-enough-add-an-external-monitor-at-home&quot;&gt;Screen — 13 inches is enough; add an external monitor at home&lt;/h3&gt;
&lt;p&gt;Blog writing is text-first, so 13 inches is workable.&lt;/p&gt;
&lt;p&gt;If you write at home for long stretches, adding an external monitor moves the needle more than upgrading the laptop’s own screen. Reference material stays parked on one display, and you stop paying the tax of switching tabs.&lt;/p&gt;
&lt;h2 id=&quot;picks-by-model&quot;&gt;Picks by model&lt;/h2&gt;
&lt;p&gt;Short answer: for blogging only, the MacBook Air 13-inch. If you also edit video or develop, the MacBook Pro 14-inch. The Pro 16-inch isn’t a blogger’s machine.&lt;/p&gt;
&lt;h3 id=&quot;macbook-air-13-inch--the-default-for-bloggers&quot;&gt;MacBook Air 13-inch — the default for bloggers&lt;/h3&gt;
&lt;p&gt;If blogging is the only job, this is the pick. At time of writing (2021), the M1 MacBook Air started at 115,280 yen (tax included) with 8 GB RAM and 256 GB SSD.&lt;/p&gt;
&lt;p&gt;Bumping RAM to 16 GB adds about 20,000 yen at order time, but if you’re keeping the machine 4–5 years, this is not where to economise.&lt;/p&gt;
&lt;h3 id=&quot;macbook-pro-14-inch--if-youre-doubling-up&quot;&gt;MacBook Pro 14-inch — if you’re doubling up&lt;/h3&gt;
&lt;p&gt;Consider the Pro 14-inch if any of these apply:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Video editing (4K exports as a regular thing)&lt;/li&gt;
&lt;li&gt;RAW photo processing&lt;/li&gt;
&lt;li&gt;iOS / macOS app development, machine learning&lt;/li&gt;
&lt;li&gt;Driving two or more external monitors at all times&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Otherwise, for blogging alone this is overkill. The price gap returns more if you spend it on an external monitor or the rest of your desk setup.&lt;/p&gt;
&lt;h3 id=&quot;macbook-pro-16-inch--not-for-bloggers&quot;&gt;MacBook Pro 16-inch — not for bloggers&lt;/h3&gt;
&lt;p&gt;Over 2 kg, over 300,000 yen — squarely excessive for blogging. It’s a desktop-replacement machine for people running it stationary, and it doesn’t belong on a first-MacBook shortlist for a blogger.&lt;/p&gt;
&lt;h2 id=&quot;comparison-macbook-air-vs-pro-viewed-through-a-blogging-lens&quot;&gt;Comparison: MacBook Air vs Pro (viewed through a blogging lens)&lt;/h2&gt;















































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Aspect&lt;/th&gt;&lt;th&gt;MacBook Air 13”&lt;/th&gt;&lt;th&gt;MacBook Pro 14”&lt;/th&gt;&lt;th&gt;MacBook Pro 16”&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;RAM (base)&lt;/td&gt;&lt;td&gt;8 GB&lt;/td&gt;&lt;td&gt;16 GB&lt;/td&gt;&lt;td&gt;16 GB&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Weight&lt;/td&gt;&lt;td&gt;~1.29 kg&lt;/td&gt;&lt;td&gt;~1.55 kg&lt;/td&gt;&lt;td&gt;~2.1 kg&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Battery life&lt;/td&gt;&lt;td&gt;Up to 15–18 h&lt;/td&gt;&lt;td&gt;Up to 17 h&lt;/td&gt;&lt;td&gt;Up to 21 h&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Price (2021)&lt;/td&gt;&lt;td&gt;From 115,000 yen&lt;/td&gt;&lt;td&gt;From 230,000 yen&lt;/td&gt;&lt;td&gt;From 300,000 yen&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Headroom for blogging&lt;/td&gt;&lt;td&gt;Enough&lt;/td&gt;&lt;td&gt;Overkill&lt;/td&gt;&lt;td&gt;Far too much&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Doubling up&lt;/td&gt;&lt;td&gt;Light tasks only&lt;/td&gt;&lt;td&gt;Video, photo, dev&lt;/td&gt;&lt;td&gt;Heavy video editing&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;If the plan is blogging only, the 100,000+ yen gap between the Air and the Pro 14-inch buys a noticeably better writing experience when spent on an external monitor or a chair.&lt;/p&gt;
&lt;h2 id=&quot;faq&quot;&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Q. MacBook Air RAM — 8 GB or 16 GB?&lt;/strong&gt;
A. 16 GB if you’re planning to keep it for 4–5 years. Apple Silicon can’t be upgraded later, so treat it as insurance against your future self. If you’ll replace it within 2–3 years, 8 GB is fine.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. Mac or Windows for blogging-only?&lt;/strong&gt;
A. Writing efficiency doesn’t change with the OS. Pick the one you already use — less context switching, less friction. The Windows-side comparison lives in &lt;a href=&quot;https://aulvem.com/blog/2021-03-13-blog-pc/&quot;&gt;How to pick a laptop for blogging&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. Can I blog from an iPad Pro plus Magic Keyboard?&lt;/strong&gt;
A. For short pieces, yes. For the WordPress admin, plugin settings, and batch image work, a laptop is clearly faster — and iPad browser extensions tend to be where things stall. Long term, recommend a laptop.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. Is a used MacBook a reasonable buy?&lt;/strong&gt;
A. Yes, but only Apple Silicon (M1 onwards). Intel-era macOS support is likely to drop off sooner, so the savings probably aren’t worth it.&lt;/p&gt;
&lt;h2 id=&quot;wrapping-up&quot;&gt;Wrapping up&lt;/h2&gt;
&lt;p&gt;Pick a MacBook by first answering what you’ll do on it — that resolves 90% of the Air-vs-Pro question.&lt;/p&gt;
&lt;p&gt;For writing only, the Air 13-inch is enough. A Pro earns its price only when video, photo, or development comes with it. Otherwise, putting the price gap into an external monitor or your desk setup buys a better day-to-day than the Pro does.&lt;/p&gt;
&lt;p&gt;If you’re still torn between this and a Windows laptop, the sister piece &lt;a href=&quot;https://aulvem.com/blog/2021-03-13-blog-pc/&quot;&gt;How to pick a laptop for blogging&lt;/a&gt; lines up the trade-offs.&lt;/p&gt;</content:encoded><category>reviews</category><category>pc</category><category>apple</category></item><item><title>Logitech MX Master 2S vs 3 — which one to buy</title><link>https://aulvem.com/blog/2021-04-07-logitech-mouse-comparison/</link><guid isPermaLink="true">https://aulvem.com/blog/2021-04-07-logitech-mouse-comparison/</guid><description>Comparing the Logitech MX Master 2S and MX Master 3. Shape, thumb wheel, side buttons, charging — and which one to pick by use case.</description><pubDate>Wed, 07 Apr 2021 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;2026 update&lt;/strong&gt;: Ported from the old VuePress blog. The MX Master 2S is no longer part of the current lineup — the 2026 successor is the MX Master 3S. The 2S-vs-3 contrast below still maps cleanly onto the choice between the 2S and the 3S. Screenshots are kept from the original write-up.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I wanted a good mouse for work, and Logitech kept coming up. The decision stalls at the same place every time: MX Master 2S or MX Master 3.&lt;/p&gt;
&lt;p&gt;After six-plus months with each, this is the difference between them.&lt;/p&gt;
&lt;h2 id=&quot;the-verdict--if-in-doubt-pick-the-mx-master-3&quot;&gt;The verdict — if in doubt, pick the MX Master 3&lt;/h2&gt;
&lt;p&gt;Short answer: for a new purchase, go with the &lt;strong&gt;MX Master 3&lt;/strong&gt; (or the current 3S).&lt;/p&gt;
&lt;p&gt;It comes down to three things:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The thumb wheel (side wheel) is bigger, and horizontal scrolling happens with one finger&lt;/li&gt;
&lt;li&gt;Charging moved to USB Type-C, so the cable is shared with everything else on the desk&lt;/li&gt;
&lt;li&gt;The main wheel senses scroll speed and switches modes automatically&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That said, if you like to plant your whole palm on the mouse, or you have larger hands, the MX Master 2S can still be the better fit. For per-model detail, see the standalone reviews of the &lt;a href=&quot;https://aulvem.com/blog/2021-03-09-logicool-mx-master-2s/&quot;&gt;MX Master 2S&lt;/a&gt; and the &lt;a href=&quot;https://aulvem.com/blog/2021-04-03-logicool-mx-master-3/&quot;&gt;MX Master 3&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;comparison-table--specs-and-feel&quot;&gt;Comparison table — specs and feel&lt;/h2&gt;
&lt;p&gt;Short answer: shape, thumb wheel, and charging are the main differences. The price gap is roughly 3,000 to 4,000 yen.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Logitech MX Master 2S and MX Master 3 side by side, viewed from above&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-04-07-logitech-mouse-comparison/2021-04-07-Logitech-Mouse-Comparison-top.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;


















































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Angle&lt;/th&gt;&lt;th&gt;MX Master 2S&lt;/th&gt;&lt;th&gt;MX Master 3&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Shape&lt;/td&gt;&lt;td&gt;Flatter, curved&lt;/td&gt;&lt;td&gt;Taller, more squared off&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Suggested grip&lt;/td&gt;&lt;td&gt;Palm rest&lt;/td&gt;&lt;td&gt;Pinch with thumb and pinky&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Thumb wheel&lt;/td&gt;&lt;td&gt;Small&lt;/td&gt;&lt;td&gt;Large&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Side button layout&lt;/td&gt;&lt;td&gt;Stacked vertically&lt;/td&gt;&lt;td&gt;Front-back (horizontal)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Main wheel&lt;/td&gt;&lt;td&gt;Mechanical (manual switch)&lt;/td&gt;&lt;td&gt;MagSpeed (auto switch)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Charging&lt;/td&gt;&lt;td&gt;micro-USB Type-B&lt;/td&gt;&lt;td&gt;USB Type-C&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Stated battery life&lt;/td&gt;&lt;td&gt;~70 days&lt;/td&gt;&lt;td&gt;~70 days&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Price at time of writing&lt;/td&gt;&lt;td&gt;~9,400 yen&lt;/td&gt;&lt;td&gt;~13,000 yen and up&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;On paper the 3 wins on every axis, but the shape preference sits on a separate axis — the table alone is not enough to decide.&lt;/p&gt;
&lt;h2 id=&quot;shape-and-grip&quot;&gt;Shape and grip&lt;/h2&gt;
&lt;p&gt;Short answer: the 2S is flatter, the 3 is taller. The grip itself changes.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Logitech MX Master 2S and MX Master 3 flipped over, viewed from underneath&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-04-07-logitech-mouse-comparison/2021-04-07-Logitech-Mouse-Comparison-back.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;p&gt;The 2S has a rounded left flank, so the natural grip is to rest the palm on top — the weight of the hand holds the mouse.&lt;/p&gt;
&lt;p&gt;The 3 has a straighter left flank and a taller back. You end up pinching the waist between thumb and pinky and lifting the mouse to move it.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Logitech MX Master 2S and MX Master 3 viewed head-on&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-04-07-logitech-mouse-comparison/2021-04-07-Logitech-Mouse-Comparison-front.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;img width=&quot;800&quot; alt=&quot;Logitech MX Master 2S and MX Master 3 viewed from behind&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-04-07-logitech-mouse-comparison/2021-04-07-Logitech-Mouse-Comparison-rear.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;p&gt;From behind, the 3 is clearly the taller of the two. That is what makes the “pinch grip” sit right on it.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Logitech MX Master 2S and MX Master 3 viewed from the right side&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-04-07-logitech-mouse-comparison/2021-04-07-Logitech-Mouse-Comparison-right.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;img width=&quot;800&quot; alt=&quot;Logitech MX Master 2S and MX Master 3 viewed from the left side&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-04-07-logitech-mouse-comparison/2021-04-07-Logitech-Mouse-Comparison-left.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;p&gt;The left flank angles differ, and so does the way the thumb reaches the thumb wheel. On the 3, the wheel sits where the pad of the thumb naturally lands.&lt;/p&gt;
&lt;h2 id=&quot;thumb-wheel--the-centerpiece-of-horizontal-scrolling&quot;&gt;Thumb wheel — the centerpiece of horizontal scrolling&lt;/h2&gt;
&lt;p&gt;Short answer: the 3’s thumb wheel is clearly easier to use. If you live in Excel or wide code files, the difference shows.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Thumb wheels of the Logitech MX Master 2S and MX Master 3 compared side by side&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-04-07-logitech-mouse-comparison/2021-04-07-Logitech-Mouse-Comparison-thumb-wheel.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;p&gt;The thumb wheel handles horizontal scrolling. Panning right in Excel, scanning long lines of code, scrubbing a video timeline, dragging horizontally in Figma — all of them resolve to one finger, no keyboard modifier.&lt;/p&gt;
&lt;p&gt;The 2S’s thumb wheel is small enough that the pad of the thumb has to hunt for it. On the 3, it is big enough that the thumb falls onto it naturally.&lt;/p&gt;
&lt;p&gt;Being able to drive both axes at once — main wheel for vertical, thumb wheel for horizontal — is a strength shared by both mice.&lt;/p&gt;
&lt;h2 id=&quot;side-button-layout&quot;&gt;Side button layout&lt;/h2&gt;
&lt;p&gt;Short answer: the 2S stacks them vertically, the 3 uses front-back. Front-back is more intuitive.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Side buttons of the Logitech MX Master 2S and MX Master 3 compared&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-04-07-logitech-mouse-comparison/2021-04-07-Logitech-Mouse-Comparison-side-button.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;p&gt;The 2S’s side buttons are stacked vertically — uncommon even within Logitech’s lineup. Once you adapt, the two are quick to tell apart, but mapping them to Back and Forward tends to produce misfires.&lt;/p&gt;
&lt;p&gt;The 3 goes back to a front-back layout, which lines up with most other mice. Switching between mice in the same day no longer costs anything.&lt;/p&gt;
&lt;h2 id=&quot;main-wheel-and-charging&quot;&gt;Main wheel and charging&lt;/h2&gt;
&lt;p&gt;Short answer: the 3’s main wheel switches automatically. Charging is USB Type-C, which makes cable sharing easy.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Close-up of the MX Master main wheel&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-04-07-logitech-mouse-comparison/2021-04-07-Logitech-Mouse-Comparison-thumb.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;p&gt;Both mice have two main-wheel modes: notched (gear-like feedback) and free-spin (smooth, continuous). The 2S switches between them with a button on the wheel. The 3 uses an electromagnetic mechanism called MagSpeed and switches automatically based on scroll speed.&lt;/p&gt;
&lt;p&gt;Slow scrolls stay precise, fast scrolls take off. Not having to think about which mode is active turns out to matter more than it sounds.&lt;/p&gt;
&lt;p&gt;Charging is micro-USB Type-B on the 2S and USB Type-C on the 3. In 2026 most peripherals assume Type-C, so being able to share one cable across the desk is a small but real win for the 3. The charging cycle is once every two or three months, so this is not a deal breaker.&lt;/p&gt;
&lt;h2 id=&quot;how-to-choose--by-use-case&quot;&gt;How to choose — by use case&lt;/h2&gt;
&lt;p&gt;Short answer: pick by workload and hand size. Heavy Excel use leans 3; a stationary home-desk mouse is more about preference.&lt;/p&gt;
&lt;h3 id=&quot;stationary-desk-lots-of-excel-or-code&quot;&gt;Stationary desk, lots of Excel or code&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Pick: MX Master 3&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The larger thumb wheel pairs well with work that asks for constant horizontal scrolling. The auto-switching main wheel helps anyone moving up and down long sheets. Type-C is a quiet plus for keeping the desk tidy.&lt;/p&gt;
&lt;h3 id=&quot;you-want-to-plant-your-whole-palm--you-have-larger-hands&quot;&gt;You want to plant your whole palm / you have larger hands&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Pick: MX Master 2S&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The 3 assumes a pinch grip. If you prefer to rest your palm flat on the mouse, the 3 can feel a little cramped. For larger hands used to flatter mice, the 2S’s shape sits better.&lt;/p&gt;
&lt;h3 id=&quot;mostly-portable-lives-in-a-bag&quot;&gt;Mostly portable, lives in a bag&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Neither is the right call&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The MX Master line is sized for the desk. For travel, the smaller MX Anywhere 3 line fits a bag without complaint.&lt;/p&gt;
&lt;h3 id=&quot;mainly-gaming&quot;&gt;Mainly gaming&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Neither is the right call&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Response feels like an ordinary office mouse. For FPS or anything that needs precise input, a dedicated gaming mouse is the better tool. The 2S also has a known durability concern around the gesture button (see the &lt;a href=&quot;https://aulvem.com/blog/2021-03-09-logicool-mx-master-2s/&quot;&gt;2S standalone review&lt;/a&gt;), which makes it a poor fit for heavy clicking.&lt;/p&gt;
&lt;h2 id=&quot;faq&quot;&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Q. Can the MX Master 3 work for smaller hands?&lt;/strong&gt;
A. The 3 is built around the pinch grip, so finger length matters more than overall palm size. If your fingers can hold it, you can operate it. If you have any doubt, holding one in a store is the surest way to decide.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. Does it work on a Mac?&lt;/strong&gt;
A. Both mice work. Logi Options+ (formerly Logicool Options) has a Mac build, and either Bluetooth or the USB receiver gets you connected.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. Does it work with an iPad?&lt;/strong&gt;
A. From iPadOS 13.4 onward iPads support mice over Bluetooth pairing. Some of the gesture and thumb-wheel features may not be fully supported on the iPad side, so mileage depends on the workflow.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. In 2026, should I just go with the 3S?&lt;/strong&gt;
A. For a new purchase, yes. The 3S is a refined 3 — improved sensor resolution and quieter clicks. The notes here on “the 3” largely transfer to the 3S.&lt;/p&gt;
&lt;h2 id=&quot;wrap-up&quot;&gt;Wrap-up&lt;/h2&gt;
&lt;p&gt;The MX Master 2S and MX Master 3 share a series name, but the shape and feel are closer to two different mice.&lt;/p&gt;
&lt;p&gt;For a new purchase, the MX Master 3 (or the current 3S) is the safer pick. If you prefer a palm grip and the size suits your hand, the 2S still has a place.&lt;/p&gt;
&lt;p&gt;The full per-model write-ups live in the &lt;a href=&quot;https://aulvem.com/blog/2021-03-09-logicool-mx-master-2s/&quot;&gt;MX Master 2S review&lt;/a&gt; and the &lt;a href=&quot;https://aulvem.com/blog/2021-04-03-logicool-mx-master-3/&quot;&gt;MX Master 3 review&lt;/a&gt; — worth a read if this comparison alone is not enough to decide.&lt;/p&gt;</content:encoded><category>reviews</category><category>mouse</category><category>logicool</category><category>pc-peripherals</category></item><item><title>How to pick an iPad mini — the 8.3-inch one-hand form factor earns its keep for reading, gaming, and on-site notes</title><link>https://aulvem.com/blog/2021-04-05-ipad-mini/</link><guid isPermaLink="true">https://aulvem.com/blog/2021-04-05-ipad-mini/</guid><description>Who the iPad mini is actually for. A use-case-driven comparison with the standard iPad and iPad Air, plus how to pick storage and Cellular, and what changed between the current mini 7 and the older mini 6.</description><pubDate>Mon, 05 Apr 2021 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;2026 update&lt;/strong&gt;: ported from the old VuePress blog (first published in 2021, written against the generation before iPad mini 6). The current model as of 2026 is mini 7 (A17 Pro, released October 2024). The framework still applies, but verify pricing and specs against Apple’s current official figures.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The iPad mini gets dismissed as “the small iPad,” which makes the gap with the standard iPad hard to see. On price alone the mini costs more, and its screen is smaller. So where does the case for the mini actually come from?&lt;/p&gt;
&lt;p&gt;This piece narrows the iPad mini down to three use cases where it earns its keep, then lines it up against the standard iPad and the iPad Air so you can pick the right one.&lt;/p&gt;
&lt;h2 id=&quot;the-short-answer--get-the-mini-if-you-hold-a-tablet-one-handed-for-long-stretches-otherwise-get-the-standard-ipad&quot;&gt;The short answer — get the mini if you hold a tablet one-handed for long stretches; otherwise get the standard iPad&lt;/h2&gt;
&lt;p&gt;The short version: the iPad mini delivers when you’re holding it the whole time you’re using it. Concretely, three use cases — ebook reading, gaming, and on-site notes. Anywhere else, the standard iPad gives you more screen for less money.&lt;/p&gt;
&lt;p&gt;The reason is that the mini’s differentiator is the &lt;strong&gt;8.3-inch size itself&lt;/strong&gt;. It doesn’t win on CPU or panel quality; its value is the weight and form factor that fit in one hand. Set it on a desk and that value evaporates.&lt;/p&gt;
&lt;p&gt;Three things to decide on:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;How you’ll hold it&lt;/strong&gt;: a lot of one-handed time — yes means mini, no means the standard iPad&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Storage&lt;/strong&gt;: do you hoard photos and video on the device — if not, the smallest tier is enough&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Connectivity&lt;/strong&gt;: do you need to be online standalone when you’re out — does Wi-Fi do it, does tethering do it&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;use-case-by-use-case--mini-earns-its-keep-in-three-places-only&quot;&gt;Use case by use case — mini earns its keep in three places only&lt;/h2&gt;
&lt;p&gt;The short version: ebook reading, gaming, and on-site notes. If none of those three fit, the case for the mini gets thin.&lt;/p&gt;
&lt;p&gt;The reason is that for everything else — video, note-taking, illustration, document review — screen size carries the day. At the same price band the standard iPad gives you a better experience.&lt;/p&gt;
&lt;h3 id=&quot;reading-ebooks&quot;&gt;Reading ebooks&lt;/h3&gt;
&lt;p&gt;8.3 inches sits between a paperback and a hardcover, a touch smaller than a deluxe-edition manga volume.&lt;/p&gt;
&lt;p&gt;Holding it one-handed for 30 minutes or more without arm fatigue is the real win. The mini 7 weighs 293 g (Wi-Fi model, rated). Against the standard iPad at around 477 g, the difference in how your arm feels after a long reading session is clearly there.&lt;/p&gt;
&lt;h3 id=&quot;gaming&quot;&gt;Gaming&lt;/h3&gt;
&lt;p&gt;Shorter thumb travel is the mini’s quiet advantage.&lt;/p&gt;
&lt;p&gt;On a larger tablet, your thumbs can’t reach the edges in action games, and you end up re-gripping mid-play. On the mini, edge-to-edge stays inside thumb range.&lt;/p&gt;
&lt;h3 id=&quot;taking-notes-and-pulling-up-materials-on-site&quot;&gt;Taking notes and pulling up materials on-site&lt;/h3&gt;
&lt;p&gt;Standing-up conversations where you turn the screen toward the other person, one-handed annotation, slipping it into an inside jacket pocket — this is where the mini owns the field.&lt;/p&gt;
&lt;p&gt;The standard iPad assumes two hands and doesn’t fit in a pocket.&lt;/p&gt;
&lt;h2 id=&quot;specs--what-changed-between-the-current-mini-7-and-the-older-mini-6&quot;&gt;Specs — what changed between the current mini 7 and the older mini 6&lt;/h2&gt;
&lt;p&gt;The short version: mini 7 (2024) is A17 Pro, Apple Intelligence supported. mini 6 (2021) is A15 Bionic. For everyday use the felt difference is small, but if you plan to keep it for a long time, go with the 7.&lt;/p&gt;








































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Item&lt;/th&gt;&lt;th&gt;mini 7 (2024)&lt;/th&gt;&lt;th&gt;mini 6 (2021)&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Chip&lt;/td&gt;&lt;td&gt;A17 Pro&lt;/td&gt;&lt;td&gt;A15 Bionic&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Apple Intelligence&lt;/td&gt;&lt;td&gt;Supported&lt;/td&gt;&lt;td&gt;Not supported&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Storage&lt;/td&gt;&lt;td&gt;128 / 256 / 512 GB&lt;/td&gt;&lt;td&gt;64 / 256 GB&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Pencil&lt;/td&gt;&lt;td&gt;Apple Pencil Pro / USB-C&lt;/td&gt;&lt;td&gt;Apple Pencil 2 / USB-C&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Weight (Wi-Fi)&lt;/td&gt;&lt;td&gt;293 g&lt;/td&gt;&lt;td&gt;293 g&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Released&lt;/td&gt;&lt;td&gt;October 2024&lt;/td&gt;&lt;td&gt;September 2021&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;(Specs from Apple’s official iPad mini specs page.)&lt;/p&gt;
&lt;p&gt;If you can find a used or refurbished mini 6 cheap, reading and browsing is still well within its range. The catch is the 64 GB base tier — too tight for modern apps. If you’re thinking long-haul, mini 7 at 128 GB is the starting line.&lt;/p&gt;
&lt;h2 id=&quot;comparison--ipad-mini-vs-standard-ipad-vs-ipad-air&quot;&gt;Comparison — iPad mini vs standard iPad vs iPad Air&lt;/h2&gt;
&lt;p&gt;The short version: portability goes to mini, value goes to the standard iPad, work-friendliness goes to Air.&lt;/p&gt;















































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Aspect&lt;/th&gt;&lt;th&gt;iPad mini 7&lt;/th&gt;&lt;th&gt;Standard iPad (A16)&lt;/th&gt;&lt;th&gt;iPad Air (M3)&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Screen size&lt;/td&gt;&lt;td&gt;8.3 inches&lt;/td&gt;&lt;td&gt;11 inches&lt;/td&gt;&lt;td&gt;11 / 13 inches&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Weight (Wi-Fi)&lt;/td&gt;&lt;td&gt;293 g&lt;/td&gt;&lt;td&gt;477 g&lt;/td&gt;&lt;td&gt;460–617 g&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Portability&lt;/td&gt;&lt;td&gt;Excellent (one-handed)&lt;/td&gt;&lt;td&gt;Average (two-handed)&lt;/td&gt;&lt;td&gt;Average to slightly heavy&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Work suitability&lt;/td&gt;&lt;td&gt;Cramped&lt;/td&gt;&lt;td&gt;Manageable&lt;/td&gt;&lt;td&gt;Comfortable&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Pencil&lt;/td&gt;&lt;td&gt;Pro / USB-C&lt;/td&gt;&lt;td&gt;USB-C&lt;/td&gt;&lt;td&gt;Pro / USB-C&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Price band (reference)&lt;/td&gt;&lt;td&gt;Mid&lt;/td&gt;&lt;td&gt;Low&lt;/td&gt;&lt;td&gt;High&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;(Pricing and specs: confirm on Apple’s official site.)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Portability, reading, gaming&lt;/strong&gt; → mini&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Value-first, home-based use&lt;/strong&gt; → standard iPad&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Note-taking, illustration, light work as a secondary machine&lt;/strong&gt; → Air&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you’re looking at iPad for illustration, screen size and pen pressure are a separate axis. See &lt;a href=&quot;https://aulvem.com/blog/2021-04-11-illustration-ipad/&quot;&gt;How to pick an iPad for illustration&lt;/a&gt; for the full breakdown.&lt;/p&gt;
&lt;h2 id=&quot;picking-storage-and-cellular&quot;&gt;Picking storage and Cellular&lt;/h2&gt;
&lt;p&gt;The short version: if you don’t hoard photos and video on the device, 128 GB / Wi-Fi is enough. The decision tree is simple, so don’t spend long on it.&lt;/p&gt;
&lt;h3 id=&quot;storage--128-gb-or-more&quot;&gt;Storage — 128 GB, or more?&lt;/h3&gt;
&lt;p&gt;iPad mini 7 ships in 128 / 256 / 512 GB. Price gaps shift by generation and by sale.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Photos and video pushed to iCloud / the cloud&lt;/strong&gt; → 128 GB&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Carrying video footage or several large games at once&lt;/strong&gt; → 256 GB or more&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Long-term video storage&lt;/strong&gt; → an external SSD is a better fit than an iPad in the first place&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;wi-fi-or-cellular&quot;&gt;Wi-Fi or Cellular?&lt;/h3&gt;
&lt;p&gt;The Cellular model costs more up front and needs its own line.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Covered by Wi-Fi at home and work&lt;/strong&gt; → Wi-Fi model&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Frequent standalone use outside, phone tethering is a hassle&lt;/strong&gt; → Cellular / eSIM&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Genuinely unsure&lt;/strong&gt; → start with Wi-Fi + tethering. If it turns out to be a pain, get Cellular next time&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;faq&quot;&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Q. iPad mini or the standard iPad — which should I buy?&lt;/strong&gt;
A. If you’ll hold it one-handed for long stretches, mini. If you’ll set it on a desk to work, the standard iPad. Without a clear portable use case (reading, gaming, on-site notes), the standard iPad gives you a bigger screen for less money.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. mini 6 (2021) vs mini 7 (2024) — is it safe to buy the older one if it’s still being sold?&lt;/strong&gt;
A. For reading and browsing the practical difference is small, so mini 6 still works. That said, mini 7 supports Apple Intelligence and runs on the A17 Pro, so if you plan to keep it for a long time, go with the 7.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. Is 128 GB safe, or should I go 256 / 512 GB?&lt;/strong&gt;
A. If you don’t keep photos and videos on the device itself, 128 GB doesn’t run out. Pushing photos to iCloud or Google Photos means the smallest tier is fine. Carry video footage around and you want 256 GB or more.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. Do I need the Cellular model?&lt;/strong&gt;
A. Not if you use Wi-Fi at home and at the office. If you need to pull up a map, a draft, or a document on the spot when you’re out, then Cellular or eSIM. Try phone tethering first — that often turns out to be enough, and you save the upcharge.&lt;/p&gt;
&lt;h2 id=&quot;wrapping-up&quot;&gt;Wrapping up&lt;/h2&gt;
&lt;p&gt;The reason to pick an iPad mini isn’t performance and it isn’t the screen — it’s the size that fits in one hand.&lt;/p&gt;
&lt;p&gt;If you fit any of the three use cases — ebook reading, gaming, on-site notes — mini 7 with 128 GB Wi-Fi is the starting point. If you don’t, the standard iPad wins on screen and price.&lt;/p&gt;
&lt;p&gt;Picking across the iPad line gets easier when you split it into three axes: do you hold it one-handed, do you set it on a desk, do you draw on it. If illustration is the reason you’re buying, also see &lt;a href=&quot;https://aulvem.com/blog/2021-04-11-illustration-ipad/&quot;&gt;How to pick an iPad for illustration&lt;/a&gt; alongside this piece.&lt;/p&gt;
</content:encoded><category>reviews</category><category>apple</category><category>ipad</category></item><item><title>Logitech MX MASTER 3 review — the natural sequel to the 2S, with USB Type-C and a MagSpeed wheel</title><link>https://aulvem.com/blog/2021-04-03-logicool-mx-master-3/</link><guid isPermaLink="true">https://aulvem.com/blog/2021-04-03-logicool-mx-master-3/</guid><description>A year-plus with the Logitech MX MASTER 3 at work and at home. Focused on the deltas from the 2S — USB Type-C charging, the MagSpeed wheel, and the redesigned thumb wheel.</description><pubDate>Sat, 03 Apr 2021 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;2026 update&lt;/strong&gt;: Ported and revised from the old VuePress blog. The MX MASTER 3 itself is an older model in 2026 — the current line is the MX Master 3S (higher sensor resolution and quieter clicks). The review angles in this piece (charging port, MagSpeed wheel, thumb wheel) carry over to the 3S, so it should still be useful whether you are looking at the 3 or the 3S. The screenshots in this article are from Logicool Options at the time of writing; today it has been replaced by Logi Options+.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I used the Logitech MX MASTER 3 for over a year at work and at home. This is the write-up from that time.&lt;/p&gt;
&lt;p&gt;I covered the previous model in a separate post: &lt;a href=&quot;https://aulvem.com/blog/2021-03-09-logicool-mx-master-2s/&quot;&gt;the MX MASTER 2S review&lt;/a&gt;. This is the sibling piece — focused on &lt;strong&gt;what changed and what did not&lt;/strong&gt; between the 2S and the 3. If you are deciding between the 3, the 2S, and the 3S for a new purchase, the comparison should give you enough to choose.&lt;/p&gt;
&lt;h2 id=&quot;the-verdict--if-you-do-not-already-own-a-2s-get-the-3-or-the-3s&quot;&gt;The verdict — if you do not already own a 2S, get the 3 (or the 3S)&lt;/h2&gt;
&lt;p&gt;Short answer: the move to USB Type-C alone is reason enough to upgrade from a 2S. Add the MagSpeed wheel and the wider thumb wheel, and two-axis scrolling in Excel, code editors, and Figma gets visibly smoother.&lt;/p&gt;
&lt;p&gt;The three main deltas from the 2S:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Charging port: &lt;strong&gt;micro-USB → USB Type-C&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Main wheel: &lt;strong&gt;mechanical → MagSpeed (electromagnetic)&lt;/strong&gt;, which switches between ratcheted and free-spin automatically based on how hard you flick it&lt;/li&gt;
&lt;li&gt;Thumb wheel (horizontal scroll): larger, easier to roll with the pad of your thumb&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;What did &lt;strong&gt;not&lt;/strong&gt; change is the size lineup (full-size only) and the distinctive sculpted shape. For smaller hands it is still a large mouse, and that stays true on the 3S too.&lt;/p&gt;
&lt;h2 id=&quot;build-and-feel&quot;&gt;Build and feel&lt;/h2&gt;
&lt;p&gt;Short answer: lined up next to a 2S, the 3 reads as a more angular sibling. USB Type-C is on the front, and the enlarged thumb wheel is on the left flank.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Logitech MX MASTER 3, top view&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-04-03-logicool-mx-master-3/2021-04-03-Logicool-MX-MASTER-3-center.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;p&gt;A Logicool logo sits on the left click. Directly above the main wheel is the scroll-mode toggle (ratcheted / free-spin). On the thumb side is the gesture button.&lt;/p&gt;
&lt;p&gt;Connection is over Bluetooth or the USB receiver that succeeded Unifying. The receiver is included (the first run of the MX MASTER 3 shipped with the receiver; some 3S configurations sell it separately).&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Logitech MX MASTER 3, underside&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-04-03-logicool-mx-master-3/2021-04-03-Logicool-MX-MASTER-3-back.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;p&gt;The underside carries the power switch and a device-pair toggle (up to three devices). The sensor is rated 1000 dpi (the 3S raises this to 8000 dpi).&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Logitech MX MASTER 3, front USB Type-C port&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-04-03-logicool-mx-master-3/2021-04-03-Logicool-MX-MASTER-3-front.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;p&gt;USB Type-C lives on the front. This is the single biggest change from the 2S’s micro-USB Type-B, and the day-to-day payoff — one cable type across the whole desk — is bigger than it sounds.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Logitech MX MASTER 3, rear view showing the waist&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-04-03-logicool-mx-master-3/2021-04-03-Logicool-MX-MASTER-3-rear.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;p&gt;From behind, the body has a clear waist through the middle. You grip it with the thumb on one side of the waist and the pinky on the other — the same hold as the 2S.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Logitech MX MASTER 3, left side with the thumb wheel&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-04-03-logicool-mx-master-3/2021-04-03-Logicool-MX-MASTER-3-left.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;p&gt;The left flank carries two side buttons (back/forward) and the horizontal thumb wheel. The thumb wheel is now nearly the size of the main wheel — easier to roll than the narrow strip on the 2S. A short green indicator blinks when you turn the mouse on.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Logitech MX MASTER 3, right side&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-04-03-logicool-mx-master-3/2021-04-03-Logicool-MX-MASTER-3-right.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;p&gt;The right side is plain — no buttons.&lt;/p&gt;
&lt;h2 id=&quot;what-worked&quot;&gt;What worked&lt;/h2&gt;
&lt;p&gt;Short answer: the “it just switches” feel of the MagSpeed wheel, the wider thumb wheel, and USB Type-C charging.&lt;/p&gt;
&lt;h3 id=&quot;magspeed--ratcheted-and-free-spin-switched-automatically&quot;&gt;MagSpeed — ratcheted and free-spin, switched automatically&lt;/h3&gt;
&lt;p&gt;This is the headline feature of the MX MASTER 3. Roll the wheel a little and you get the familiar ratcheted clicks; flick it hard and it shifts into free-spin mode, flying to the bottom of the page in one motion.&lt;/p&gt;
&lt;p&gt;The switch happens automatically based on rotation speed. If you want to lock one mode, the button above the wheel toggles between ratcheted and free-spin explicitly.&lt;/p&gt;
&lt;p&gt;The place this pays off most is moving up and down long files — code, long articles, deep spreadsheets. On the 2S I worked around it by holding Shift and tapping a button, or by keeping a second mouse on the desk for free-spinning. On the 3, one wheel covers both jobs.&lt;/p&gt;
&lt;h3 id=&quot;a-thumb-wheel-you-can-actually-roll&quot;&gt;A thumb wheel you can actually roll&lt;/h3&gt;
&lt;p&gt;Functionally it is the same “dedicated horizontal-scroll wheel” as on the 2S, but the larger shape lets the pad of the thumb sit on it comfortably.&lt;/p&gt;
&lt;p&gt;Horizontal pans in Excel, canvas panning in Figma, scrubbing a video timeline — already comfortable on the 2S, now resolved with even less finger travel. &lt;strong&gt;Rolling the main wheel and the thumb wheel at the same time gives you simultaneous two-axis scrolling&lt;/strong&gt;, and that is hard to go back from once it sinks in.&lt;/p&gt;
&lt;h3 id=&quot;charging-is-usb-type-c&quot;&gt;Charging is USB Type-C&lt;/h3&gt;
&lt;p&gt;The single biggest weak point of the 2S, gone. I almost wrote “charging only happens every two or three months, so it does not really matter” and then deleted it — being able to keep a single cable type on the desk turns out to matter more than the charge interval would suggest.&lt;/p&gt;
&lt;h3 id=&quot;battery-life&quot;&gt;Battery life&lt;/h3&gt;
&lt;p&gt;Logitech lists 70 days. In actual use, charging every two or three months has been enough. After a full charge it feels the same as a freshly charged 2S.&lt;/p&gt;
&lt;h2 id=&quot;what-didnt&quot;&gt;What didn’t&lt;/h2&gt;
&lt;p&gt;Short answer: still full-size only, still on the expensive side, and the gesture button is “somewhat better” than the 2S rather than “fixed”.&lt;/p&gt;
&lt;h3 id=&quot;no-size-options&quot;&gt;No size options&lt;/h3&gt;
&lt;p&gt;The 3, like the 2S, comes in a single full size. For smaller hands it is still a large mouse.&lt;/p&gt;
&lt;p&gt;If a smaller body matters more than the thumb wheel, the &lt;strong&gt;MX Anywhere 3&lt;/strong&gt; is the other Logicool option. The Anywhere 3 has the MagSpeed main wheel but no thumb wheel — so the “horizontal scrolling is great” part of this review does not apply.&lt;/p&gt;
&lt;h3 id=&quot;price-stayed-high&quot;&gt;Price stayed high&lt;/h3&gt;
&lt;p&gt;Around 13,000 yen at the time of writing. Whether the deltas from the 2S — Type-C, MagSpeed, the larger thumb wheel — justify that depends almost entirely on how much horizontal scrolling you do in a day.&lt;/p&gt;
&lt;p&gt;For someone in Excel, Figma, or a video editor every day, the payback comes quickly. For browsing-heavy use, a used 2S or waiting for the 3S below is often the more satisfying buy.&lt;/p&gt;
&lt;h3 id=&quot;the-gesture-button-is-still-the-soft-spot&quot;&gt;The gesture button is still the soft spot&lt;/h3&gt;
&lt;p&gt;In the &lt;a href=&quot;https://aulvem.com/blog/2021-03-09-logicool-mx-master-2s/&quot;&gt;2S review&lt;/a&gt;, I wrote about the gesture button sticking in the pressed state after a hard press mid-game. The same structure carries into the 3, and the same risk exists for users who hammer it during long gaming sessions (my own unit has not reproduced it).&lt;/p&gt;
&lt;p&gt;For gaming, a dedicated gaming mouse is still the honest recommendation.&lt;/p&gt;
&lt;h2 id=&quot;comparison-mx-master-2s-vs-3-vs-3s&quot;&gt;Comparison: MX MASTER 2S vs 3 vs 3S&lt;/h2&gt;
&lt;p&gt;The three siblings, side by side.&lt;/p&gt;

































































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Angle&lt;/th&gt;&lt;th&gt;MX MASTER 2S&lt;/th&gt;&lt;th&gt;MX MASTER 3&lt;/th&gt;&lt;th&gt;MX Master 3S&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Charging&lt;/td&gt;&lt;td&gt;micro-USB Type-B&lt;/td&gt;&lt;td&gt;USB Type-C&lt;/td&gt;&lt;td&gt;USB Type-C&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Main wheel&lt;/td&gt;&lt;td&gt;Mechanical (ratcheted)&lt;/td&gt;&lt;td&gt;MagSpeed (electromagnetic, auto switch)&lt;/td&gt;&lt;td&gt;MagSpeed (electromagnetic, auto switch)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Thumb wheel&lt;/td&gt;&lt;td&gt;Yes (narrow)&lt;/td&gt;&lt;td&gt;Yes (larger)&lt;/td&gt;&lt;td&gt;Yes (larger, same as the 3)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Sensor resolution&lt;/td&gt;&lt;td&gt;4000 dpi (rated)&lt;/td&gt;&lt;td&gt;1000 dpi (rated)&lt;/td&gt;&lt;td&gt;8000 dpi (rated)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Click acoustics&lt;/td&gt;&lt;td&gt;Standard&lt;/td&gt;&lt;td&gt;Standard&lt;/td&gt;&lt;td&gt;Quiet click&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Battery (rated)&lt;/td&gt;&lt;td&gt;70 days&lt;/td&gt;&lt;td&gt;70 days&lt;/td&gt;&lt;td&gt;70 days&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Sizes&lt;/td&gt;&lt;td&gt;Full-size only&lt;/td&gt;&lt;td&gt;Full-size only&lt;/td&gt;&lt;td&gt;Full-size only&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Software&lt;/td&gt;&lt;td&gt;Logicool Options&lt;/td&gt;&lt;td&gt;Logicool Options / Options+&lt;/td&gt;&lt;td&gt;Logi Options+&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Released&lt;/td&gt;&lt;td&gt;2017&lt;/td&gt;&lt;td&gt;2019&lt;/td&gt;&lt;td&gt;2022&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;For a fresh purchase, the &lt;strong&gt;3S&lt;/strong&gt; is the easiest recommendation. If the price gap is large enough on a clearance 3, the &lt;strong&gt;3&lt;/strong&gt; still holds up. The &lt;strong&gt;2S&lt;/strong&gt; is hard to find new in 2026; if you want USB Type-C, skip it.&lt;/p&gt;
&lt;h2 id=&quot;the-software-logicool-options--logi-options&quot;&gt;The software (Logicool Options / Logi Options+)&lt;/h2&gt;
&lt;p&gt;The companion app remaps every button and tunes wheel sensitivity. At the time of writing it was Logicool Options; in 2026 it has been replaced by &lt;strong&gt;Logi Options+&lt;/strong&gt;.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Logicool Options mouse configuration&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-04-03-logicool-mx-master-3/2021-04-03-Logicool-MX-MASTER-3-mousel.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;p&gt;The mouse view changes each button’s action. The thumb wheel accepts horizontal scroll, next/previous, volume, tab switching, and more.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Logicool Options gesture configuration&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-04-03-logicool-mx-master-3/2021-04-03-Logicool-MX-MASTER-3-gesture.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;p&gt;The gesture button can carry four directional actions on top of its press. I do not use it heavily, so mine is set to Enter.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Logicool Options point and scroll configuration&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-04-03-logicool-mx-master-3/2021-04-03-Logicool-MX-MASTER-3-point-scroll.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;p&gt;Pointer speed, thumb-wheel sensitivity, and scroll direction are all tunable in fine steps. Per-app tuning works too — for example, dialling down the scroll distance just for Excel.&lt;/p&gt;
&lt;aside class=&quot;aff-card not-prose my-10 rounded-2xl border border-[color:var(--aulvem-border)] bg-[color:var(--aulvem-surface)] px-5 py-5 sm:px-6 sm:py-6 has-image&quot; aria-label=&quot;Buy links for Logitech MX MASTER 3 (MX2200sGR)&quot; data-astro-cid-qoq25xnm&gt;&lt;div class=&quot;aff-image&quot; data-astro-cid-qoq25xnm&gt;&lt;img src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-04-03-logicool-mx-master-3/2021-04-03-Logicool-MX-MASTER-3.webp&quot; alt=&quot;&quot; aria-hidden=&quot;true&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; data-astro-cid-qoq25xnm&gt;&lt;/div&gt;&lt;p class=&quot;aff-title&quot; data-astro-cid-qoq25xnm&gt;Logitech MX MASTER 3 (MX2200sGR)&lt;/p&gt;&lt;div class=&quot;aff-buttons&quot; data-astro-cid-qoq25xnm&gt;&lt;a href=&quot;https://www.amazon.co.jp/dp/B07XQ6XD8J/?language=en_US&amp;amp;tag=aulvem-22&quot; aria-label=&quot;View Logitech MX MASTER 3 (MX2200sGR) on Amazon Japan (primarily sold in Japan)&quot; rel=&quot;sponsored nofollow noopener noreferrer&quot; target=&quot;_blank&quot; class=&quot;aff-btn inline-flex items-center gap-2 rounded-lg border border-[color:var(--aulvem-border)] bg-white px-4 py-2.5 transition-colors hover:border-aulvem-orange&quot; style=&quot;font-size: 14px; font-weight: 500;&quot; data-astro-cid-qoq25xnm&gt;&lt;img src=&quot;https://api.iconify.design/fa6-brands/amazon.svg?color=%23FF9900&quot; width=&quot;16&quot; height=&quot;16&quot; alt=&quot;&quot; aria-hidden=&quot;true&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; style=&quot;display:block&quot; data-astro-cid-qoq25xnm&gt;&lt;span data-astro-cid-qoq25xnm&gt;View on Amazon Japan&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;p class=&quot;aff-note&quot; data-astro-cid-qoq25xnm&gt;
Primarily sold in Japan. amazon.co.jp may ship internationally on select items.
&lt;/p&gt;&lt;/aside&gt;
&lt;h2 id=&quot;faq&quot;&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Q. Does it work with a Mac?&lt;/strong&gt;
A. Yes. Logi Options+ has a Mac build. It pairs over Bluetooth or the USB receiver, and macOS-specific gestures (Mission Control and similar) can be assigned.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. Is it worth upgrading from the MX MASTER 2S?&lt;/strong&gt;
A. The two big wins are USB Type-C charging and the MagSpeed wheel’s free-spin. If you do a lot of horizontal scrolling, the upgrade is worth it. If you mostly browse and the micro-USB port on the 2S does not bother you, there is no urgency.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. Now that the MX Master 3S exists, is there a reason to buy the 3?&lt;/strong&gt;
A. If the street-price gap is clearly in the 3’s favor, yes. The 3S’s main improvements are sensor resolution (1000 → 8000 dpi) and quieter clicks; the horizontal-scrolling and thumb-wheel feel are the same as on the 3. Pick the 3S if quiet offices or late-night sessions matter to you. Pick the 3 if price matters more.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. How usable are the gestures?&lt;/strong&gt;
A. Holding the thumb gesture button while flicking the mouse up, down, left, or right triggers a configurable action in each direction. It is genuinely handy for Mission Control and virtual-desktop switching, but the press feel is unusual and it took me a few days to get used to. In the end I drifted away from gestures and settled on a single-press action (Enter).&lt;/p&gt;
&lt;h2 id=&quot;verdict--pays-off-if-you-do-horizontal-scrolling-every-day&quot;&gt;Verdict — pays off if you do horizontal scrolling every day&lt;/h2&gt;
&lt;p&gt;Short answer: the natural sequel to the 2S. USB Type-C closes the most painful gap, and the main wheel jumps a tier with MagSpeed. For a new purchase, lean 3S; for a price-led decision, the 3 is still a fine pick.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Logitech MX MASTER 3, summary shot&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-04-03-logicool-mx-master-3/2021-04-03-Logicool-MX-MASTER-3-summary.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;p&gt;If you live in Excel, Figma, or a code editor and move around the screen on both axes, the price comes back in saved time within a few months. If you mostly browse, have smaller hands, or care most about quiet clicks — pick whichever of those applies and look at the 3S or the Anywhere 3 instead.&lt;/p&gt;
&lt;p&gt;For the sibling review, see &lt;a href=&quot;https://aulvem.com/blog/2021-03-09-logicool-mx-master-2s/&quot;&gt;the MX MASTER 2S&lt;/a&gt;.&lt;/p&gt;</content:encoded><category>reviews</category><category>mouse</category><category>logicool</category><category>pc-peripherals</category></item><item><title>Vue.js basics — a working engineer&apos;s guide to the file structure and lifecycle</title><link>https://aulvem.com/blog/2021-04-02-vue-base/</link><guid isPermaLink="true">https://aulvem.com/blog/2021-04-02-vue-base/</guid><description>A working Vue.js engineer walks through the single-file component layout (template / script / style), the basics of data, methods, and the component lifecycle — when to use created vs mounted — with example code for people new to Vue.</description><pubDate>Fri, 02 Apr 2021 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;2026-05-16 update&lt;/strong&gt;: This post is a few years old. It’s written against Vue 2 + the Options API — the &lt;code&gt;data() { return ... }&lt;/code&gt; + &lt;code&gt;methods: {}&lt;/code&gt; style. The current mainstream in 2026 is Vue 3 + the Composition API (&lt;code&gt;&amp;lt;script setup&amp;gt;&lt;/code&gt; with &lt;code&gt;ref&lt;/code&gt; / &lt;code&gt;reactive&lt;/code&gt; / &lt;code&gt;computed&lt;/code&gt;), and lifecycle hooks are functions like &lt;code&gt;onMounted&lt;/code&gt; / &lt;code&gt;onUnmounted&lt;/code&gt;. The skeleton — the three-block structure and the created-vs-mounted distinction — still holds, but the code itself isn’t something you’d drop into a new project as-is.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I’ve been working with Vue.js for over a year now. This post is the &lt;strong&gt;bare-bones basics of Vue.js&lt;/strong&gt;, with a bit of working experience folded in.&lt;/p&gt;
&lt;h2 id=&quot;the-takeaway&quot;&gt;The takeaway&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;A Vue file puts &lt;strong&gt;HTML, JavaScript, and CSS in a single file&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;The three-block structure — &lt;code&gt;template&lt;/code&gt; / &lt;code&gt;script&lt;/code&gt; / &lt;code&gt;style&lt;/code&gt; — is enough to get started&lt;/li&gt;
&lt;li&gt;In the &lt;code&gt;script&lt;/code&gt; block, the first thing to learn is &lt;strong&gt;&lt;code&gt;data&lt;/code&gt;, &lt;code&gt;methods&lt;/code&gt;, and the lifecycle&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;For the lifecycle, mainly learn the distinction between &lt;strong&gt;&lt;code&gt;created&lt;/code&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;code&gt;mounted&lt;/code&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;understand-the-structure-of-a-vue-file&quot;&gt;Understand the structure of a Vue file&lt;/h2&gt;
&lt;p&gt;The first thing to understand the structure of a Vue file. A Vue file holds &lt;strong&gt;all three languages&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;HTML&lt;/li&gt;
&lt;li&gt;JavaScript&lt;/li&gt;
&lt;li&gt;CSS&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It looks 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;vue&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;template&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;    html記述&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;template&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&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;  export&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; default&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: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;XXX&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:#B392F0&quot;&gt;    data&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;      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;        xxx: yyy&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 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&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;style&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; lang&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;css&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&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;style&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;Each language can be split out into its own file, but I’ll skip that here.&lt;br/&gt;
The &lt;code&gt;script&lt;/code&gt; and &lt;code&gt;style&lt;/code&gt; blocks can &lt;strong&gt;be swapped for other languages&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;I usually go with &lt;strong&gt;TypeScript for &lt;code&gt;script&lt;/code&gt;&lt;/strong&gt; and &lt;strong&gt;SCSS or Stylus for &lt;code&gt;style&lt;/code&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id=&quot;write-html-in-the-template-block&quot;&gt;Write HTML in the template block&lt;/h2&gt;
&lt;p&gt;This is where you write HTML in the template block.&lt;/p&gt;
&lt;p&gt;It’s mostly the same as plain HTML, with a few &lt;strong&gt;Vue-specific additions&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;I’ll cover the Vue-specific bits in a separate post.&lt;/p&gt;
&lt;h2 id=&quot;write-data-and-methods-in-the-script-block&quot;&gt;Write data and methods in the script block&lt;/h2&gt;
&lt;p&gt;This is where the JavaScript side lives. The entry point is to &lt;strong&gt;write data and methods in the script block&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;I’ll use plain JavaScript for the examples here.&lt;/p&gt;
&lt;p&gt;The base shape:&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;javascript&quot;&gt;&lt;code&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:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  data&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;    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;      xxx: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;yyy&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;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  methods: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;    hogeMethod&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;str&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;      return&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; str&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;    hugaMethod&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;      let&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; test &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; this&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.xxx;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      test &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; this&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;hogeMethod&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(test);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;      return&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; test;&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;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;data&lt;/code&gt;&lt;/strong&gt; is where you declare and initialise &lt;strong&gt;variables&lt;/strong&gt; that are available inside the Vue file.&lt;br/&gt;
It’s used a lot when you want to render processed data into the HTML.&lt;/p&gt;
&lt;p&gt;Note: you’re returning an object literal here.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;methods&lt;/code&gt;&lt;/strong&gt; is just a place for regular functions.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;To reference a variable or function defined in the same file, prefix it with &lt;code&gt;this.&lt;/code&gt;&lt;/strong&gt;&lt;br/&gt;
Local variables inside the same function don’t need &lt;code&gt;this.&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The relevant part:&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;javascript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;hugaMethod&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;  let&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; test &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; this&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.xxx;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  test &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; this&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;hogeMethod&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(test);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  return&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; test;&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;h3 id=&quot;use-lifecycle-hooks-to-control-timing&quot;&gt;Use lifecycle hooks to control timing&lt;/h3&gt;
&lt;p&gt;The lifecycle is the trickiest part of this post. Read it with this in mind: &lt;strong&gt;use lifecycle hooks to control timing&lt;/strong&gt;.&lt;br/&gt;
The official reference is here:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://jp.vuejs.org/v2/guide/instance.html#%E3%83%A9%E3%82%A4%E3%83%95%E3%82%B5%E3%82%A4%E3%82%AF%E3%83%AB%E3%83%80%E3%82%A4%E3%82%A2%E3%82%B0%E3%83%A9%E3%83%A0&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;Vue.js docs: lifecycle diagram&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The lifetime of a Vue file — from load to teardown — is divided into 8 points&lt;/strong&gt;, and &lt;strong&gt;you can hook JavaScript into each one&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The eight points:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;beforeCreate&lt;/strong&gt; — before instance creation&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;created&lt;/strong&gt; — after instance creation&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;beforeMount&lt;/strong&gt; — before mount&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;mounted&lt;/strong&gt; — after mount&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;beforeUpdate&lt;/strong&gt; — before update&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;updated&lt;/strong&gt; — after update&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;beforeDestroy&lt;/strong&gt; — before teardown&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;destroyed&lt;/strong&gt; — after teardown&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In code:&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;javascript&quot;&gt;&lt;code&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:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  data&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:#B392F0&quot;&gt;  beforeCreate&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:#B392F0&quot;&gt;  created&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:#B392F0&quot;&gt;  beforeMount&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:#B392F0&quot;&gt;  mounted&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:#B392F0&quot;&gt;  beforeUpdate&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:#B392F0&quot;&gt;  updated&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:#B392F0&quot;&gt;  beforeDestroy&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:#B392F0&quot;&gt;  destroyed&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;  methods: {}&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 two you’ll actually use most are &lt;strong&gt;&lt;code&gt;created&lt;/code&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;code&gt;mounted&lt;/code&gt;&lt;/strong&gt;.&lt;br/&gt;
The difference between them is &lt;strong&gt;when the DOM is loaded&lt;/strong&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;created&lt;/code&gt;&lt;/strong&gt; runs &lt;strong&gt;before&lt;/strong&gt; the DOM is loaded&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;mounted&lt;/code&gt;&lt;/strong&gt; runs &lt;strong&gt;after&lt;/strong&gt; the DOM is loaded&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The rough rule: use &lt;strong&gt;&lt;code&gt;created&lt;/code&gt; for script-side initialisation&lt;/strong&gt; and &lt;strong&gt;&lt;code&gt;mounted&lt;/code&gt; for anything that touches the HTML&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id=&quot;write-css-in-the-style-block&quot;&gt;Write CSS in the style block&lt;/h2&gt;
&lt;p&gt;The CSS lives here — write CSS in the style block.&lt;br/&gt;
The syntax is plain CSS, so there’s nothing new to learn.&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:#B392F0&quot;&gt;.display-flex&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;  display&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;flex&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;h2 id=&quot;closing&quot;&gt;Closing&lt;/h2&gt;
&lt;p&gt;That covers the bare basics of Vue.js.&lt;/p&gt;
&lt;p&gt;The main acts — &lt;strong&gt;Components&lt;/strong&gt; and &lt;strong&gt;Binding&lt;/strong&gt; — are in separate posts.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Related posts&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://aulvem.com/blog/2021-03-31-vue-angular/&quot;&gt;Angular vs. Vue.js, from an engineer who’s used both for over a year&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://aulvem.com/blog/2021-04-09-vue-component/&quot;&gt;Understanding Vue.js Components&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>build</category><category>JavaScript</category><category>Vue.js</category></item><item><title>Angular vs Vue.js — what a year of using both in production actually felt like</title><link>https://aulvem.com/blog/2021-03-31-vue-angular/</link><guid isPermaLink="true">https://aulvem.com/blog/2021-03-31-vue-angular/</guid><description>A practical comparison of Angular and Vue.js from an engineer who used both on real projects for over a year — file structure, syntax, learning cost, and which one fits which kind of team.</description><pubDate>Wed, 31 Mar 2021 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;2026 update&lt;/strong&gt;: Originally written in 2021, when Vue 2 and Angular 11 were the mainstream versions. Today the defaults are Vue 3 (Composition API, &lt;code&gt;&amp;lt;script setup&amp;gt;&lt;/code&gt;) and Angular 17+ (Signals, standalone components, the new control-flow syntax), and Vue’s TypeScript story has improved a lot. The overall framing — Angular as batteries-included, Vue as minimal — still mostly holds, but the code samples and APIs here are from the original version and don’t match current behavior exactly.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;There are three JavaScript frameworks people usually mention in the same breath, and I’ve shipped production work in two of them. React isn’t one of them, so this post is just about &lt;strong&gt;Angular and Vue.js, and how they actually differ&lt;/strong&gt; when you use them day-to-day.&lt;/p&gt;
&lt;h2 id=&quot;the-short-version&quot;&gt;The short version&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Angular&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Batteries included&lt;/li&gt;
&lt;li&gt;Strict syntax conventions&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Vue.js&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Minimal core&lt;/li&gt;
&lt;li&gt;Loose, flexible conventions&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;angular&quot;&gt;Angular&lt;/h2&gt;
&lt;h3 id=&quot;overview&quot;&gt;Overview&lt;/h3&gt;
&lt;p&gt;Angular is &lt;strong&gt;the framework Google maintains&lt;/strong&gt;. The v1 line was called AngularJS; from v2 onward it’s just Angular. Google has said &lt;strong&gt;major versions ship roughly every six months&lt;/strong&gt;, and that &lt;strong&gt;major versions don’t guarantee backwards compatibility&lt;/strong&gt; — worth keeping in mind.&lt;/p&gt;
&lt;p&gt;In practice, upgrades on the projects I worked on were less painful than that warning suggested.&lt;/p&gt;
&lt;p&gt;The two things that stood out to me:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It’s a full-stack framework&lt;/li&gt;
&lt;li&gt;TypeScript by default&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;full-stack-framework&quot;&gt;Full-stack framework&lt;/h3&gt;
&lt;p&gt;Angular &lt;strong&gt;ships with routing and other common pieces out of the box&lt;/strong&gt;. Install it and you basically have a working project skeleton. Looking things up is also easier because the official docs cover most of what you need.&lt;/p&gt;
&lt;p&gt;A component’s folder layout looks 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;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;component&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  ├── component.ts&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  ├── component.html&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  ├── component.css&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  └── component.spec.ts&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Keeping the languages in separate files inside one folder makes the code easier to manage at scale.&lt;/p&gt;
&lt;p&gt;The downside of “batteries included” is that you carry code you don’t necessarily use, and that has a real performance cost.&lt;/p&gt;
&lt;h3 id=&quot;typescript&quot;&gt;TypeScript&lt;/h3&gt;
&lt;p&gt;Angular’s recommended language is TypeScript. TypeScript is &lt;strong&gt;a Microsoft project&lt;/strong&gt;, so you end up with a Google framework written in a Microsoft language — which on paper is a pretty solid combination.&lt;/p&gt;
&lt;p&gt;Static typing makes the code feel tight, in a good way. But for anyone new to TypeScript, you’re effectively learning two things at once, and &lt;strong&gt;the ramp-up is steep&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id=&quot;when-id-reach-for-angular&quot;&gt;When I’d reach for Angular&lt;/h3&gt;
&lt;p&gt;The conventional wisdom is that Angular fits &lt;strong&gt;large projects&lt;/strong&gt;, and my experience matches that.&lt;/p&gt;
&lt;p&gt;The strict structure and conventions — for better or worse — meant handoffs and parallel work between team members went smoothly. The trade-off is the learning cost: &lt;strong&gt;plan extra time at the start of any handoff for people to get comfortable with the framework&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id=&quot;vuejs&quot;&gt;Vue.js&lt;/h2&gt;
&lt;h3 id=&quot;overview-1&quot;&gt;Overview&lt;/h3&gt;
&lt;p&gt;Vue.js is community-developed and has been picking up adoption steadily. The two things that stood out to me:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A minimal core&lt;/li&gt;
&lt;li&gt;Flexibility&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;minimal-core&quot;&gt;Minimal core&lt;/h3&gt;
&lt;p&gt;Unlike Angular, Vue doesn’t bundle routing and other extras by default. You install the libraries you need separately. Vue CLI makes that pretty painless.&lt;/p&gt;
&lt;p&gt;A component is a single file:&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;component&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  └── component.vue&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Very simple. HTML, JS, and CSS all live inside the &lt;code&gt;.vue&lt;/code&gt; file.&lt;/p&gt;
&lt;p&gt;You can split JS and CSS into separate files if you want:&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;component&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  ├── component.vue&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  ├── component.js&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  └── component.css&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The split is manual, though — there’s no automatic separation.&lt;/p&gt;
&lt;p&gt;The flip side of a minimal core is that you have to &lt;strong&gt;find and pick libraries yourself&lt;/strong&gt;. The upside is the bundle stays light, and performance is good by default.&lt;/p&gt;
&lt;h3 id=&quot;flexibility&quot;&gt;Flexibility&lt;/h3&gt;
&lt;p&gt;Vue defaults to plain JavaScript. TypeScript works too, but setting it up properly used to take some effort (current note: Vue 3 with &lt;code&gt;&amp;lt;script setup&amp;gt;&lt;/code&gt; has improved TypeScript support significantly, and as of 2026 the setup is no longer the same hassle it was).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The key difference from Angular is how much room Vue gives you&lt;/strong&gt;. You can shape a project to fit the team’s skill level and the use case — that flexibility is genuinely useful.&lt;/p&gt;
&lt;p&gt;You’ll need to do more of your own research, but &lt;strong&gt;the barrier to entry is clearly lower&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id=&quot;when-id-reach-for-vue&quot;&gt;When I’d reach for Vue&lt;/h3&gt;
&lt;p&gt;Vue fits &lt;strong&gt;anything that isn’t a strict programmer-and-designer split with formal handoffs&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The catch: &lt;strong&gt;document your library choices, your project structure, and the build setup&lt;/strong&gt;. The flexibility that makes Vue pleasant in solo work becomes a maintenance burden in a team if nothing is written down. For company projects, I’d strongly recommend setting up a formatter and a style guide on day one.&lt;/p&gt;
&lt;p&gt;For personal projects, Vue.js is hard to beat.&lt;/p&gt;
&lt;h2 id=&quot;wrap-up&quot;&gt;Wrap-up&lt;/h2&gt;
&lt;p&gt;That’s the comparison, with my own bias from working in both.&lt;/p&gt;
&lt;p&gt;If you forced me to pick one, I’d go with Vue.js plus TypeScript. The setup takes some patience, but the readability and the resulting code are worth it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Related&lt;/strong&gt;: &lt;a href=&quot;https://aulvem.com/blog/2021-04-02-vue-base/&quot;&gt;Getting started with Vue.js — the basics&lt;/a&gt;&lt;/p&gt;</content:encoded><category>build</category><category>JavaScript</category><category>Vue.js</category><category>Angular</category><category>TypeScript</category></item><item><title>YAMAHA TW-E3A review — a year of commuting with YAMAHA&apos;s honest, even-handed true wireless</title><link>https://aulvem.com/blog/2021-03-30-yamaha-tw-e3a/</link><guid isPermaLink="true">https://aulvem.com/blog/2021-03-30-yamaha-tw-e3a/</guid><description>A year of commuting with YAMAHA&apos;s first-generation true wireless earbuds, the TW-E3A. Honest tuning and a secure fit are the strengths; the deep physical-button press is the weakness.</description><pubDate>Tue, 30 Mar 2021 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;2026 update&lt;/strong&gt;: Ported from the old VuePress blog. The TW-E3A is an older model in 2026, with successors like the TW-E3B and TW-E3C now on sale. The review angles here (the honest tuning, the fit, the physical-button quirks) still hold up. Spec numbers are based on the manufacturer’s published figures at the time of writing.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I used the YAMAHA TW-E3A true wireless earbuds for about a year of daily commuting. This is the write-up of what showed up — strengths and weaknesses — once they were folded into the rhythm of regular use.&lt;/p&gt;
&lt;p&gt;The review is framed around the fact that the TW-E3A was YAMAHA’s first true wireless earbud. So instead of grading it head-to-head against the latest competition, I focus on whether it fits its price band and intended use.&lt;/p&gt;
&lt;h2 id=&quot;the-verdict--for-listeners-who-want-tuning-without-a-personality&quot;&gt;The verdict — for listeners who want tuning without a personality&lt;/h2&gt;
&lt;p&gt;Short answer: the sound follows YAMAHA’s tuning brief without unnecessary flavor, and the fit is stable enough for a commute. The deep physical-button press, and the way the controls are split across left and right, are the parts that will pick their audience.&lt;/p&gt;
&lt;p&gt;The reason is simple. The TW-E3A does not chase a single headline trait — no thumping bass, no aggressive noise cancellation. Instead it settles into a balance that does not tire the ear over long sessions. The design leans toward background listening during a commute or while working, rather than dedicated music-appreciation sessions.&lt;/p&gt;
&lt;p&gt;That said, you should probably look elsewhere if any of these apply:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;You’re used to touch controls or multi-button setups&lt;/strong&gt;: the TW-E3A funnels every function through a single physical button on each side&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;You need active noise cancellation&lt;/strong&gt;: the TW-E3A does not have ANC (based on the manufacturer’s spec sheet)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;You want to use them for hard workouts&lt;/strong&gt;: the fit is secure, but there are no sport fins for high-impact movement&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;build-and-feel&quot;&gt;Build and feel&lt;/h2&gt;
&lt;p&gt;Short answer: the case is a small rectangle, roughly the size of a miniature bento box, that slips into a chest pocket. The earbuds themselves are slightly elongated and sit deep in the ear.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;YAMAHA TW-E3A charging case, front view&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-03-30-yamaha-tw-e3a/2021-03-30-YAMAHA-TW-E3A-front.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;p&gt;The lid carries a matte YAMAHA wordmark. The finish does not pick up fingerprints easily.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;YAMAHA TW-E3A charging case held in a palm for scale&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-03-30-yamaha-tw-e3a/2021-03-30-YAMAHA-TW-E3A-size.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;p&gt;The case measures roughly 70 × 35 × 35 mm (manufacturer’s published figures). That is compact for its price band, and it fits cleanly into a jacket’s chest pocket.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;YAMAHA TW-E3A charging case opened&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-03-30-yamaha-tw-e3a/2021-03-30-YAMAHA-TW-E3A-in.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;p&gt;The lid pops open with a light push and falls shut under its own weight, locking with a small click. In a year of bag-carrying it never opened on its own.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;YAMAHA TW-E3A earbuds laid out next to the case&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-03-30-yamaha-tw-e3a/2021-03-30-YAMAHA-TW-E3A-Earphones-and-case.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;p&gt;The nozzle is long. Once seated, it sits about as deep as the first knuckle of an index finger, which is what gives the fit its security. The R / L marks are embossed on the inside of each shell, so you can tell them apart by feel in the dark.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;YAMAHA TW-E3A earbud, outer face&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-03-30-yamaha-tw-e3a/2021-03-30-YAMAHA-TW-E3A-Earphones.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;p&gt;On its own, each bud reads as slightly elongated. Each side weighs 6.3 g (manufacturer’s published figures).&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;YAMAHA TW-E3A charging case, back with the USB Type-C port&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-03-30-yamaha-tw-e3a/2021-03-30-YAMAHA-TW-E3A-back.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;p&gt;The back of the case carries a USB Type-C port and a charge-status LED. USB-C was not a given on early-2021 models, and in 2026 it is still useful for keeping one cable type across devices.&lt;/p&gt;
&lt;h2 id=&quot;what-worked&quot;&gt;What worked&lt;/h2&gt;
&lt;p&gt;Short answer: honest tuning, a fit that holds up at commute intensity, and a stable Bluetooth 5.0 link.&lt;/p&gt;
&lt;h3 id=&quot;yamahas-flat-low-fatigue-tuning&quot;&gt;YAMAHA’s flat, low-fatigue tuning&lt;/h3&gt;
&lt;p&gt;The tuning does not push the low end and does not sharpen the upper mids. Vocals and acoustic instruments come through naturally; genres that lean on a forward low end — EDM, for example — can feel underweight to some listeners.&lt;/p&gt;
&lt;p&gt;Two- or three-hour sessions stay comfortable, which is the practical payoff of that tuning choice.&lt;/p&gt;
&lt;h3 id=&quot;stays-in-for-commutes-and-walking&quot;&gt;Stays in for commutes and walking&lt;/h3&gt;
&lt;p&gt;The deep nozzle keeps the bud seated through the shoves of a packed train or a short jog. Across a year of daily use, neither side ever fell out.&lt;/p&gt;
&lt;p&gt;There are no sport fins in the box, though, so for the gym or longer runs it is worth looking at a model built for that.&lt;/p&gt;
&lt;h3 id=&quot;bluetooth-50-holds-up-in-crowded-rf&quot;&gt;Bluetooth 5.0 holds up in crowded RF&lt;/h3&gt;
&lt;p&gt;With Bluetooth 5.0 (based on the manufacturer’s spec sheet), the link stayed clean inside busy stations and trains where RF gets congested. Dropouts and single-ear lockouts were rare. Compared to the 4.x-era buds I used at the same price point, the stability is clearly a step up.&lt;/p&gt;
&lt;h2 id=&quot;what-didnt&quot;&gt;What didn’t&lt;/h2&gt;
&lt;p&gt;Short answer: the buttons need a firm press, the controls are split across the two sides, and there is no ANC.&lt;/p&gt;
&lt;h3 id=&quot;buttons-want-a-deep-press&quot;&gt;Buttons want a deep press&lt;/h3&gt;
&lt;p&gt;These are physical buttons rather than touch sensors. That cuts down on accidental taps, but the TW-E3A’s travel is on the deep side. To register a press you end up pushing the bud further into the ear, and each time you do, the seal shifts.&lt;/p&gt;
&lt;p&gt;A touch sensor — or even just a lighter actuation — would have been easier to live with.&lt;/p&gt;
&lt;h3 id=&quot;left-and-right-do-different-things-and-its-hard-to-memorize&quot;&gt;Left and right do different things, and it’s hard to memorize&lt;/h3&gt;
&lt;p&gt;Because there is only one button per side, playback, volume, and track skipping are spread across the two sides by click count.&lt;/p&gt;





























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Action&lt;/th&gt;&lt;th&gt;Mapping&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Play / pause&lt;/td&gt;&lt;td&gt;Either side, single click&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Volume up&lt;/td&gt;&lt;td&gt;Right, double click&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Volume down&lt;/td&gt;&lt;td&gt;Left, double click&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Next track&lt;/td&gt;&lt;td&gt;Right, long press&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Previous track&lt;/td&gt;&lt;td&gt;Left, long press&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;If “volume on the right, track skip on the right” had been the rule, the mapping would have stayed intuitive by direction. As it stands you have to memorize the chart. For someone who only touches the controls a few times a day, that is more friction than it should be.&lt;/p&gt;
&lt;h3 id=&quot;no-active-noise-cancellation&quot;&gt;No active noise cancellation&lt;/h3&gt;
&lt;p&gt;The canal-type fit gives you some passive isolation, but there is no active NC (based on the manufacturer’s spec sheet). If your goal is to flatten out rail noise or HVAC drone, this is not the right pick.&lt;/p&gt;
&lt;h2 id=&quot;comparison--where-the-tw-e3a-sits-in-mid-range-true-wireless&quot;&gt;Comparison — where the TW-E3A sits in mid-range true wireless&lt;/h2&gt;
&lt;p&gt;Short answer: if you care about even-handed tuning and a secure fit, it competes well at this price. If ANC or rich touch controls are non-negotiable, look elsewhere.&lt;/p&gt;















































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Angle&lt;/th&gt;&lt;th&gt;YAMAHA TW-E3A&lt;/th&gt;&lt;th&gt;Typical mid-range peers&lt;/th&gt;&lt;th&gt;YAMAHA’s higher tier (TW-E5B / E7B family)&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Tuning&lt;/td&gt;&lt;td&gt;Flat, low-fatigue&lt;/td&gt;&lt;td&gt;Often bass-forward&lt;/td&gt;&lt;td&gt;Listening-focused, bass with detail&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Active noise cancellation&lt;/td&gt;&lt;td&gt;None&lt;/td&gt;&lt;td&gt;Increasingly common&lt;/td&gt;&lt;td&gt;Available on some models&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Controls&lt;/td&gt;&lt;td&gt;One physical button per side&lt;/td&gt;&lt;td&gt;Touch is the norm&lt;/td&gt;&lt;td&gt;Touch plus companion app&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Connection&lt;/td&gt;&lt;td&gt;Bluetooth 5.0&lt;/td&gt;&lt;td&gt;5.0 to 5.3&lt;/td&gt;&lt;td&gt;5.2 and up is common&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Charging port&lt;/td&gt;&lt;td&gt;USB Type-C&lt;/td&gt;&lt;td&gt;Mostly USB-C now&lt;/td&gt;&lt;td&gt;USB Type-C&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Bud-only playback&lt;/td&gt;&lt;td&gt;~6 hours (rated)&lt;/td&gt;&lt;td&gt;5 to 8 hours&lt;/td&gt;&lt;td&gt;6 to 10 hours (rated)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;If you are buying new and you specifically want the YAMAHA house sound, the more natural move is to compare the TW-E5B / E7B siblings as well. Conversely, on the second-hand or clearance market, where the TW-E3A turns up cheap, its solid baseline of tuning and fit still earns it a place.&lt;/p&gt;
&lt;aside class=&quot;aff-card not-prose my-10 rounded-2xl border border-[color:var(--aulvem-border)] bg-[color:var(--aulvem-surface)] px-5 py-5 sm:px-6 sm:py-6 has-image&quot; aria-label=&quot;Buy links for Yamaha TW-E3A (Black)&quot; data-astro-cid-qoq25xnm&gt;&lt;div class=&quot;aff-image&quot; data-astro-cid-qoq25xnm&gt;&lt;img src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-03-30-yamaha-tw-e3a/2021-03-30-YAMAHA-TW-E3A.webp&quot; alt=&quot;&quot; aria-hidden=&quot;true&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; data-astro-cid-qoq25xnm&gt;&lt;/div&gt;&lt;p class=&quot;aff-title&quot; data-astro-cid-qoq25xnm&gt;Yamaha TW-E3A (Black)&lt;/p&gt;&lt;div class=&quot;aff-buttons&quot; data-astro-cid-qoq25xnm&gt;&lt;a href=&quot;https://www.amazon.co.jp/dp/B0814N96JY/?language=en_US&amp;amp;tag=aulvem-22&quot; aria-label=&quot;View Yamaha TW-E3A (Black) on Amazon Japan (primarily sold in Japan)&quot; rel=&quot;sponsored nofollow noopener noreferrer&quot; target=&quot;_blank&quot; class=&quot;aff-btn inline-flex items-center gap-2 rounded-lg border border-[color:var(--aulvem-border)] bg-white px-4 py-2.5 transition-colors hover:border-aulvem-orange&quot; style=&quot;font-size: 14px; font-weight: 500;&quot; data-astro-cid-qoq25xnm&gt;&lt;img src=&quot;https://api.iconify.design/fa6-brands/amazon.svg?color=%23FF9900&quot; width=&quot;16&quot; height=&quot;16&quot; alt=&quot;&quot; aria-hidden=&quot;true&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; style=&quot;display:block&quot; data-astro-cid-qoq25xnm&gt;&lt;span data-astro-cid-qoq25xnm&gt;View on Amazon Japan&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;p class=&quot;aff-note&quot; data-astro-cid-qoq25xnm&gt;
Primarily sold in Japan. amazon.co.jp may ship internationally on select items.
&lt;/p&gt;&lt;/aside&gt;
&lt;h2 id=&quot;faq&quot;&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Q. Will it pair without issues on both iPhone and Android?&lt;/strong&gt;
A. Any Bluetooth 5.0 host is fine in practice. There is no multipoint support (based on the manufacturer’s spec sheet), so it is not a good fit for someone who switches between a PC and a phone all day. Treat it as a single-device companion, or expect to re-pair each time.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. How long does the battery last?&lt;/strong&gt;
A. The published figures are around 6 hours on a charge and roughly 24 hours including the case (manufacturer’s published figures). With a one-hour commute each way, the case lands back on the dock about once every three or four weekdays.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. Is it usable for remote-work video calls?&lt;/strong&gt;
A. There is a built-in mic and calls work, but the noise reduction is not what you would expect from a dedicated headset (based on the manufacturer’s spec sheet). It is fine for a 1:1 from a quiet home; for calls in a cafe or an open office, a real headset is the safer bet.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. Does it hold up for running or light workouts?&lt;/strong&gt;
A. The deep nozzle keeps it secure through short jogs on a commute. Heavy vertical motion during running, or sweat-heavy gym sessions, are outside what it was built for, and long-term sweat resistance is not guaranteed (check the manufacturer’s IP rating). For serious training, use something built for it.&lt;/p&gt;
&lt;h2 id=&quot;verdict--for-daily-listening-with-yamahas-tuning&quot;&gt;Verdict — for daily listening with YAMAHA’s tuning&lt;/h2&gt;
&lt;p&gt;Short answer: not a model that sells on flash. It earns its keep through the quiet quality of the tuning and the fit, which is the kind of thing you only notice after weeks of use. The cleanest way to read it: a first-generation product that did not try to do too much.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;YAMAHA TW-E3A charging case closed, full overview&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-03-30-yamaha-tw-e3a/2021-03-30-YAMAHA-TW-E3A-case.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;p&gt;The two things to weigh are the button feel and the awkward control mapping. If a store has a demo unit, putting them in and running through the left-right controls before deciding will save regret later. If you are also weighing newer generations, look at the higher-tier models and the successor lineup (ANC, multipoint, touch controls) at the same time — the decision gets less wobbly with that context.&lt;/p&gt;</content:encoded><category>reviews</category><category>audio</category><category>yamaha</category><category>wireless-earbuds</category></item><item><title>Anker PowerCore 10000 review — two or three phone charges in a palm-sized power bank</title><link>https://aulvem.com/blog/2021-03-29-anker-powercore-10000/</link><guid isPermaLink="true">https://aulvem.com/blog/2021-03-29-anker-powercore-10000/</guid><description>A review of the Anker PowerCore 10000 after several years as my main battery. Compact and light for the 10000mAh class, but the USB Type-A / micro-B I/O ages poorly against today&apos;s Type-C cables.</description><pubDate>Mon, 29 Mar 2021 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;2026 update&lt;/strong&gt;: Ported from the old VuePress blog. The PowerCore 10000 is an older model in 2026 — the current line has moved to USB Type-C I/O in the newer PowerCore series. The framing here (how to weigh capacity, size, and ports in the 10000mAh class) still applies.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I used the Anker PowerCore 10000 as my main mobile battery for several years, carried for the usual reason — a backup against a dead phone outside the house. The 10000mAh class strikes a workable balance between “two or three phone charges” and “small enough to carry”, which makes it an easy first battery to land on.&lt;/p&gt;
&lt;p&gt;The I/O ports, though, are this generation’s weak spot. From a 2026 vantage point, I want to write down which parts still hold up and which parts I would no longer pick.&lt;/p&gt;
&lt;h2 id=&quot;the-verdict--a-solid-default-for-size-vs-capacity-but-the-ports-are-dated&quot;&gt;The verdict — a solid default for size-vs-capacity, but the ports are dated&lt;/h2&gt;
&lt;p&gt;Short answer: fitting 10000mAh into a pocketable shell still earns the recommendation. The charging behaviour is steady in the way Anker batteries usually are, which makes it easy to trust as an outing backup. The catch is the USB Type-A input and micro-B output — that pairing does not match the cables most people already carry in 2026.&lt;/p&gt;
&lt;p&gt;The reason is simple: phones, laptops, and wireless earbuds have been converging on USB Type-C. For anyone trying to standardise on a single Type-C cable, packing a dedicated micro-B cable just for this one battery is hard to justify.&lt;/p&gt;
&lt;p&gt;A few cautions before buying:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;You want to standardise on USB Type-C cables&lt;/strong&gt;: a Type-C version of the same series is the cleaner choice&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;You want to charge a laptop with PD (Power Delivery)&lt;/strong&gt;: this unit tops out at USB-A / 2.4A and does not support laptop fast-charge&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;You are buying brand new&lt;/strong&gt;: the current Type-C successor will keep working with the rest of your gear for longer&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;look-and-size&quot;&gt;Look and size&lt;/h2&gt;
&lt;p&gt;Short answer: compact for a 10000mAh battery. Anker traded height for thickness, so it still slips into a jeans pocket.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Anker PowerCore 10000, front view&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-03-29-anker-powercore-10000/2021-03-29-Anker-PowerCore-10000-center.webp&quot; loading=&quot;lazy&quot;/&gt;
&lt;p&gt;The shell is matte black, the same finish Anker uses across the mobile battery range, and it hides fingerprints and minor scuffs well.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Anker PowerCore 10000 next to a smartphone for size comparison&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-03-29-anker-powercore-10000/2021-03-29-Anker-PowerCore-10000-size.webp&quot; loading=&quot;lazy&quot;/&gt;
&lt;p&gt;Stated specs are below (source: as printed on the packaging).&lt;/p&gt;

































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Spec&lt;/th&gt;&lt;th&gt;Value&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Size&lt;/td&gt;&lt;td&gt;~92 x 60 x 22mm&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Weight&lt;/td&gt;&lt;td&gt;~180g&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Capacity&lt;/td&gt;&lt;td&gt;10000mAh&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Output&lt;/td&gt;&lt;td&gt;Up to 2.4A (PowerIQ)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Input port&lt;/td&gt;&lt;td&gt;USB Type-A&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Output port&lt;/td&gt;&lt;td&gt;micro-B&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;180g is about average for the 10000mAh class. The short height means it sits well in a closed hand.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Anker PowerCore 10000 input and output ports (USB Type-A and micro-B)&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-03-29-anker-powercore-10000/2021-03-29-Anker-PowerCore-10000-input.webp&quot; loading=&quot;lazy&quot;/&gt;
&lt;p&gt;The battery charges over USB Type-A and outputs over micro-B. At the time of writing (2021), USB Type-A was the default everywhere. In 2026 the layout reads as an older generation.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Anker PowerCore 10000 power button and battery indicator&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-03-29-anker-powercore-10000/2021-03-29-Anker-PowerCore-10000-side.webp&quot; loading=&quot;lazy&quot;/&gt;
&lt;p&gt;The power button is on the side. A single press lights four blue LEDs that show the remaining charge. Plug in a phone, press the button, and it starts pushing power — there is nothing to think about.&lt;/p&gt;
&lt;h2 id=&quot;what-worked&quot;&gt;What worked&lt;/h2&gt;
&lt;p&gt;Short answer: Anker’s reliable charging behaviour and a genuinely pocketable 10000mAh form factor.&lt;/p&gt;
&lt;h3 id=&quot;the-charging-behaviour-is-steady&quot;&gt;The charging behaviour is steady&lt;/h3&gt;
&lt;p&gt;I have owned several Anker batteries and never run into power cutting out mid-charge or the device failing to register. For a battery that gets plugged and unplugged constantly throughout the day, that kind of quiet reliability matters more than a spec sheet.&lt;/p&gt;
&lt;p&gt;Anker’s own PowerIQ (current adjustment based on the connected device) seems to do its job within the 2.4A range — though this is based on day-to-day use rather than measured output.&lt;/p&gt;
&lt;h3 id=&quot;pocketable-for-a-10000mah-battery&quot;&gt;Pocketable for a 10000mAh battery&lt;/h3&gt;
&lt;p&gt;10000mAh covers about two to three phone charges, or just under one full tablet charge. Fitting that into a pocketable shape was the headline at launch and still is.&lt;/p&gt;
&lt;p&gt;On a day out without a bag, it goes in a jacket or back pocket and lasts the day.&lt;/p&gt;
&lt;h3 id=&quot;four-led-battery-indicator-no-fuss&quot;&gt;Four-LED battery indicator, no fuss&lt;/h3&gt;
&lt;p&gt;One button press, four LEDs. There is no app, no Bluetooth pairing — and as a result, no ambiguity about how much is left. It is hard to walk out the door with a battery you thought was full but wasn’t.&lt;/p&gt;
&lt;h2 id=&quot;what-didnt&quot;&gt;What didn’t&lt;/h2&gt;
&lt;p&gt;Short answer: USB Type-A / micro-B ports, no PD support, and slow input charging.&lt;/p&gt;
&lt;h3 id=&quot;usb-type-a--micro-b-io&quot;&gt;USB Type-A / micro-B I/O&lt;/h3&gt;
&lt;p&gt;Normal in 2021, a clear weakness in 2026. If your cable kit is already standardised on USB Type-C, carrying a micro-B cable just for this one battery starts to feel like overhead.&lt;/p&gt;
&lt;p&gt;For a new purchase I would point people at the Type-C version of the same line (PowerCore III 10000 or similar).&lt;/p&gt;
&lt;h3 id=&quot;no-usb-pd&quot;&gt;No USB PD&lt;/h3&gt;
&lt;p&gt;The output is a single USB-A port at up to 2.4A — no USB Power Delivery (PD).&lt;/p&gt;
&lt;p&gt;That rules out fast-charging a recent phone, or driving a laptop or tablet at any useful speed. As a topping-up battery for a phone it is still fine.&lt;/p&gt;
&lt;h3 id=&quot;slow-to-refill-itself&quot;&gt;Slow to refill itself&lt;/h3&gt;
&lt;p&gt;Charging the battery itself is over micro-B, and even on the bundled wall adapter, it feels slow to reach full.&lt;/p&gt;
&lt;p&gt;Plug it in before bed and it is ready in the morning, which is the usual pattern. As a “top up just before leaving” battery, it is not the right tool.&lt;/p&gt;
&lt;h2 id=&quot;comparison-choosing-in-the-10000mah-class&quot;&gt;Comparison: choosing in the 10000mAh class&lt;/h2&gt;
&lt;p&gt;10000mAh is the capacity most people land on for a first battery. A short way to compare options inside that class:&lt;/p&gt;









































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Angle&lt;/th&gt;&lt;th&gt;PowerCore 10000 (this unit)&lt;/th&gt;&lt;th&gt;Type-C PowerCore successor&lt;/th&gt;&lt;th&gt;20000mAh class&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Ports&lt;/td&gt;&lt;td&gt;USB-A / micro-B&lt;/td&gt;&lt;td&gt;USB-C in/out&lt;/td&gt;&lt;td&gt;Varies by model&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Weight&lt;/td&gt;&lt;td&gt;~180g&lt;/td&gt;&lt;td&gt;~190g (rated)&lt;/td&gt;&lt;td&gt;~350g&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Capacity&lt;/td&gt;&lt;td&gt;10000mAh&lt;/td&gt;&lt;td&gt;10000mAh&lt;/td&gt;&lt;td&gt;20000mAh&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Best for&lt;/td&gt;&lt;td&gt;2–3 phone charges&lt;/td&gt;&lt;td&gt;Phone + light tablet&lt;/td&gt;&lt;td&gt;Phone + laptop&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Launch price (at time of writing)&lt;/td&gt;&lt;td&gt;~2,500–3,500 yen&lt;/td&gt;&lt;td&gt;~3,500–5,000 yen&lt;/td&gt;&lt;td&gt;~5,000–8,000 yen&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;The decision is short: “do I want everything on Type-C?” and “do I need to charge a laptop?” Two no’s and this class is enough. One yes and a different model fits better.&lt;/p&gt;
&lt;aside class=&quot;aff-card not-prose my-10 rounded-2xl border border-[color:var(--aulvem-border)] bg-[color:var(--aulvem-surface)] px-5 py-5 sm:px-6 sm:py-6 has-image&quot; aria-label=&quot;Buy links for Anker PowerCore 10000 (Black)&quot; data-astro-cid-qoq25xnm&gt;&lt;div class=&quot;aff-image&quot; data-astro-cid-qoq25xnm&gt;&lt;img src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-03-29-anker-powercore-10000/2021-03-29-Anker-PowerCore-10000.webp&quot; alt=&quot;&quot; aria-hidden=&quot;true&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; data-astro-cid-qoq25xnm&gt;&lt;/div&gt;&lt;p class=&quot;aff-title&quot; data-astro-cid-qoq25xnm&gt;Anker PowerCore 10000 (Black)&lt;/p&gt;&lt;div class=&quot;aff-buttons&quot; data-astro-cid-qoq25xnm&gt;&lt;a href=&quot;https://www.amazon.co.jp/dp/B019GNUT0C/?language=en_US&amp;amp;tag=aulvem-22&quot; aria-label=&quot;View Anker PowerCore 10000 (Black) on Amazon Japan (primarily sold in Japan)&quot; rel=&quot;sponsored nofollow noopener noreferrer&quot; target=&quot;_blank&quot; class=&quot;aff-btn inline-flex items-center gap-2 rounded-lg border border-[color:var(--aulvem-border)] bg-white px-4 py-2.5 transition-colors hover:border-aulvem-orange&quot; style=&quot;font-size: 14px; font-weight: 500;&quot; data-astro-cid-qoq25xnm&gt;&lt;img src=&quot;https://api.iconify.design/fa6-brands/amazon.svg?color=%23FF9900&quot; width=&quot;16&quot; height=&quot;16&quot; alt=&quot;&quot; aria-hidden=&quot;true&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; style=&quot;display:block&quot; data-astro-cid-qoq25xnm&gt;&lt;span data-astro-cid-qoq25xnm&gt;View on Amazon Japan&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;p class=&quot;aff-note&quot; data-astro-cid-qoq25xnm&gt;
Primarily sold in Japan. amazon.co.jp may ship internationally on select items.
&lt;/p&gt;&lt;/aside&gt;
&lt;h2 id=&quot;faq&quot;&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Q. Does it work with both iPhone and Android?&lt;/strong&gt;
A. Yes. The output is USB Type-A, so as long as you carry the right cable for your device (Lightning / USB-C / micro-B), either side works. There is one USB-A output port on the battery.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. Can I take it on a plane?&lt;/strong&gt;
A. Carry-on, yes. 10000mAh works out to roughly 37Wh, comfortably under the 100Wh limit major airlines apply (airlines and routes vary, check the current rules for your specific flight). Checked baggage is not allowed.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. How many times can it charge a phone?&lt;/strong&gt;
A. Depends on the phone’s battery and charging losses, but for a 3000–4000mAh phone, two to three full charges is the practical figure. The four-LED indicator gives you a rough sense of what’s left as you go.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. Can it charge a laptop?&lt;/strong&gt;
A. Not really. The output is USB-A at 2.4A with no USB PD, so it does not meet the fast-charge requirements of most laptops. For a laptop, look at a PD-capable battery with at least 30W output.&lt;/p&gt;
&lt;h2 id=&quot;verdict--still-usable-as-a-first-battery-but-a-successor-is-the-smarter-new-purchase&quot;&gt;Verdict — still usable as a first battery, but a successor is the smarter new purchase&lt;/h2&gt;
&lt;p&gt;As a default in the 10000mAh class, it is still easy to live with. Anker’s steady charging behaviour and the palm-sized shell make it a quiet, dependable backup when leaving the house.&lt;/p&gt;
&lt;p&gt;For a fresh purchase in 2026, though, the Type-C versions of the current line will hurt less in the long run, simply because everything else you carry is already on Type-C.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Anker PowerCore 10000, three-quarter view&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-03-29-anker-powercore-10000/2021-03-29-Anker-PowerCore-10000-slanted.webp&quot; loading=&quot;lazy&quot;/&gt;
&lt;p&gt;If you already own a PowerCore 10000, there is no reason to retire it — keep a micro-B cable in the bag and carry on. When it does come time to replace it, the Type-C successor is the obvious next stop.&lt;/p&gt;</content:encoded><category>reviews</category><category>mobile-battery</category><category>anker</category><category>pc-peripherals</category></item><item><title>How to pick a Windows laptop for programming — 16 GB RAM and Core i5 / Ryzen 5 are the realistic floor</title><link>https://aulvem.com/blog/2021-03-28-programming-windows/</link><guid isPermaLink="true">https://aulvem.com/blog/2021-03-28-programming-windows/</guid><description>Spec criteria for buying a Windows laptop for learning to code, side projects, or a career change, plus how it stacks up against MacBook and Linux laptops. 16 GB RAM and Core i5 / Ryzen 5 as the working baseline, with picks by use case.</description><pubDate>Sun, 28 Mar 2021 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;2026 update&lt;/strong&gt;: ported from the old VuePress blog. The framework still holds, but the CPU generations and prices are pinned to when this was written. Confirm current generations and stock before you buy.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The first thing that trips people up when starting to learn programming is picking the laptop. Which numbers on the spec sheet matter, and how far is it worth spending before the extra money stops paying off — it’s hard to tell.&lt;/p&gt;
&lt;p&gt;This piece lays out the spec criteria for buying a Windows laptop, assuming web-focused learning, a side project, or a career change. For readers torn between this and a MacBook, there’s a comparison table further down.&lt;/p&gt;
&lt;h2 id=&quot;the-short-answer--16-gb-ram-core-i5--ryzen-5-or-better-around-100000-yen&quot;&gt;The short answer — 16 GB RAM, Core i5 / Ryzen 5 or better, around 100,000 yen&lt;/h2&gt;
&lt;p&gt;Short version: for learning or side-project use, pick a model that clears &lt;strong&gt;16 GB RAM, Core i5 (11th gen or newer) or Ryzen 5 (4th gen or newer), 512 GB SSD&lt;/strong&gt;. The price band is around 100,000 yen.&lt;/p&gt;
&lt;p&gt;Two reasons:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The moment you have an IDE, a browser, and Docker or a VM running together, 8 GB is cramped. 16 GB carries you a few years&lt;/li&gt;
&lt;li&gt;A mid-tier CPU (i5 / Ryzen 5) handles IDE builds and test runs without felt stress&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Going beyond i7 / Ryzen 7 or 32 GB of RAM is overkill unless you’re also doing machine learning or video editing. The cost-to-benefit drops off.&lt;/p&gt;
&lt;p&gt;If you’re a MacBook person, there’s a separate piece for that.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://aulvem.com/blog/2021-03-27-programming-macbook/&quot;&gt;How to pick a MacBook for programming&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;use-16-gb-of-ram-as-the-baseline&quot;&gt;Use 16 GB of RAM as the baseline&lt;/h2&gt;
&lt;p&gt;Short version: 16 GB. 8 GB works at the very start of learning, but you hit the ceiling within six months to a year.&lt;/p&gt;
&lt;p&gt;The things that eat RAM while you code:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;IDE (VS Code, IntelliJ, and so on) — several GB once extensions are in&lt;/li&gt;
&lt;li&gt;Browser tabs — a dozen-plus is normal while developing&lt;/li&gt;
&lt;li&gt;Docker / VMs — a few hundred MB per container, upward&lt;/li&gt;
&lt;li&gt;Local DB / dev server — running alongside everything else&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Run those in parallel and 8 GB is gone. Once swap kicks in it eats at SSD lifespan too, so putting 16 GB in from day one is cheaper in the end.&lt;/p&gt;
&lt;h3 id=&quot;when-32-gb-is-warranted&quot;&gt;When 32 GB is warranted&lt;/h3&gt;
&lt;p&gt;If you’re also doing machine learning, large-scale data processing, or video editing, go to 32 GB. For plain web development or Android-leaning mobile work, 16 GB is enough.&lt;/p&gt;
&lt;h2 id=&quot;core-i5--ryzen-5-or-better--and-check-the-generation&quot;&gt;Core i5 / Ryzen 5 or better — and check the generation&lt;/h2&gt;
&lt;p&gt;Short version: pick a mid-tier (i5 / Ryzen 5) chip from a &lt;strong&gt;recent generation&lt;/strong&gt;. The generation gap matters more than the tier gap, in feel.&lt;/p&gt;
&lt;p&gt;Realistic floor for laptop CPUs (as of 2021):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Intel: &lt;strong&gt;11th-gen Core i5&lt;/strong&gt; or newer&lt;/li&gt;
&lt;li&gt;AMD: &lt;strong&gt;Ryzen 5 4th gen (5000 series)&lt;/strong&gt; or newer&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;By 2026 the generations have moved on, so as long as you stay within the latest two generations at purchase, you won’t go wrong.&lt;/p&gt;
&lt;h3 id=&quot;choosing-between-i5-and-ryzen-5&quot;&gt;Choosing between i5 and Ryzen 5&lt;/h3&gt;
&lt;p&gt;For programming use, the felt difference is close to zero. Rules of thumb:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;More cores at the same price → Ryzen 5&lt;/li&gt;
&lt;li&gt;Better battery life and power efficiency → Intel Core i5&lt;/li&gt;
&lt;li&gt;Enterprise support and stable stock → Intel Core i5&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;i7 / Ryzen 7 and above belong to the “also doing ML or video editing” bucket. For programming alone, the upside is thin.&lt;/p&gt;
&lt;h2 id=&quot;picks-by-use-case--learning-side-project-machine-learning&quot;&gt;Picks by use case — learning, side project, machine learning&lt;/h2&gt;
&lt;p&gt;Short version: the three patterns differ a lot. Price bands and required specs are not interchangeable.&lt;/p&gt;
&lt;h3 id=&quot;learning-progate--udemy--portfolio-work&quot;&gt;Learning (Progate / Udemy → portfolio work)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CPU&lt;/strong&gt;: Core i5 / Ryzen 5 (mid)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RAM&lt;/strong&gt;: 16 GB&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SSD&lt;/strong&gt;: 512 GB&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GPU&lt;/strong&gt;: integrated is enough&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Price target&lt;/strong&gt;: 80,000–100,000 yen&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is plenty for a first machine. Outgoing-model and direct-sales outlets can knock another 20,000–30,000 yen off.&lt;/p&gt;
&lt;h3 id=&quot;side-project--career-change-closer-to-real-work-running-docker-and-vms&quot;&gt;Side project / career change (closer to real work, running Docker and VMs)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CPU&lt;/strong&gt;: Core i5 / Ryzen 5 (recent mid-tier)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RAM&lt;/strong&gt;: 16 GB (ideally a model you can later upgrade to 32 GB)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SSD&lt;/strong&gt;: 512 GB to 1 TB&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GPU&lt;/strong&gt;: integrated is enough&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Price target&lt;/strong&gt;: 100,000–130,000 yen&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You’ll start running Docker, multiple VMs, and a local DB at the same time. Confirm whether RAM is upgradeable.&lt;/p&gt;
&lt;h3 id=&quot;machine-learning-training-locally&quot;&gt;Machine learning (training locally)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CPU&lt;/strong&gt;: Core i7 / Ryzen 7&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RAM&lt;/strong&gt;: 32 GB or more&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SSD&lt;/strong&gt;: 1 TB&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GPU&lt;/strong&gt;: NVIDIA GeForce RTX class (8 GB VRAM or more)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Price target&lt;/strong&gt;: 150,000 to over 250,000 yen&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Honestly, finishing everything on a laptop is rough. Once the training workload passes a certain size, it’s more realistic to plan around cloud GPU from the start.&lt;/p&gt;
&lt;h2 id=&quot;comparison--windows-laptop-macbook-linux-laptop&quot;&gt;Comparison — Windows laptop, MacBook, Linux laptop&lt;/h2&gt;
&lt;p&gt;Short version: at equivalent specs for web or backend work, Windows is the cheapest. If you want Apple Silicon’s power efficiency, MacBook. If you want the hardware to be your dev environment, a Linux laptop.&lt;/p&gt;





















































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Aspect&lt;/th&gt;&lt;th&gt;Windows laptop&lt;/th&gt;&lt;th&gt;MacBook (Apple Silicon)&lt;/th&gt;&lt;th&gt;Linux laptop (ThinkPad and so on)&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Price at equivalent specs&lt;/td&gt;&lt;td&gt;Cheapest (baseline)&lt;/td&gt;&lt;td&gt;+20,000–30,000 yen&lt;/td&gt;&lt;td&gt;On par with Windows&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Dev environment setup&lt;/td&gt;&lt;td&gt;WSL2 covers most&lt;/td&gt;&lt;td&gt;Native (UNIX-like macOS)&lt;/td&gt;&lt;td&gt;Native, straightforward&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;iOS / macOS development&lt;/td&gt;&lt;td&gt;No (Xcode won’t run)&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Battery / quietness&lt;/td&gt;&lt;td&gt;Depends on the model&lt;/td&gt;&lt;td&gt;Strong&lt;/td&gt;&lt;td&gt;Depends on the model&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Expandability / repair&lt;/td&gt;&lt;td&gt;Easier (model dependent)&lt;/td&gt;&lt;td&gt;Harder&lt;/td&gt;&lt;td&gt;Easier&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Machine learning (GPU)&lt;/td&gt;&lt;td&gt;NVIDIA-equipped models available&lt;/td&gt;&lt;td&gt;Via MPS / Metal (limited)&lt;/td&gt;&lt;td&gt;NVIDIA-equipped models available&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Learning resources&lt;/td&gt;&lt;td&gt;Plenty (workplaces run Windows)&lt;/td&gt;&lt;td&gt;Plenty&lt;/td&gt;&lt;td&gt;Fewer&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Unless iOS development is on the table, Windows is a safe pick. If you want a native Linux experience, a ThinkPad or Dell XPS with Ubuntu installed is the steady choice.&lt;/p&gt;
&lt;h2 id=&quot;adding-a-monitor-pays-off-more-than-upgrading-the-laptop&quot;&gt;Adding a monitor pays off more than upgrading the laptop&lt;/h2&gt;
&lt;p&gt;Adding a single external monitor moves the needle on day-to-day work more than bumping the laptop one tier. Whether you can lay out code next to a browser (preview, docs) feeds directly into productivity.&lt;/p&gt;
&lt;p&gt;For lightweight picks aimed at writing away from home, there’s a separate piece.&lt;/p&gt;
&lt;h2 id=&quot;faq&quot;&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Q. Is 8 GB of RAM enough for programming?&lt;/strong&gt;
A. For learning or small personal projects, 8 GB will run. The moment you bring up an IDE, a browser with lots of tabs, and Docker or a VM at the same time, it gets tight fast. Unless you plan to upgrade soon anyway, picking 16 GB from the start is cheaper in the long run.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. MacBook or Windows for programming?&lt;/strong&gt;
A. If you’re not building iOS apps, either works. At equivalent specs Windows runs 20,000–30,000 yen cheaper, and WSL2 covers most Linux-side development just fine. It’s a choice between Apple Silicon’s power efficiency and Windows’ price and expandability.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. Core i5 or Ryzen 5 — which should I pick?&lt;/strong&gt;
A. For programming use, the felt difference is negligible. At the same price, Ryzen 5 usually wins on core count, while Intel tends to be steadier on battery life and power efficiency. Decide on price, stock, and battery requirements.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. What kind of build do I need for machine learning?&lt;/strong&gt;
A. If you want to train locally, the realistic floor is an NVIDIA GPU (8 GB VRAM or more) plus 32 GB of RAM. If you’re serious about it, paying for cloud GPU (Colab, RunPod, and so on) ends up cheaper. I wouldn’t recommend trying to finish everything on a laptop.&lt;/p&gt;
&lt;h2 id=&quot;wrapping-up&quot;&gt;Wrapping up&lt;/h2&gt;
&lt;p&gt;For a programming Windows laptop, &lt;strong&gt;16 GB RAM, Core i5 / Ryzen 5 or better, 512 GB SSD, around 100,000 yen&lt;/strong&gt; is hard to go wrong with. Past that line, the call comes down to whether you also need machine learning or video editing.&lt;/p&gt;
&lt;p&gt;If you’re torn between this and a MacBook, the dividing line is iOS development. If you’re not doing it, Windows at the same specs for 20,000–30,000 yen less is plenty.&lt;/p&gt;
&lt;p&gt;If the budget can stretch to an external monitor, buying one is a bigger felt jump than bumping the laptop itself a tier.&lt;/p&gt;
</content:encoded><category>reviews</category><category>pc</category></item><item><title>How to pick a MacBook for programming — the Air covers most cases; reach for the Pro if you&apos;re doing ML or iOS</title><link>https://aulvem.com/blog/2021-03-27-programming-macbook/</link><guid isPermaLink="true">https://aulvem.com/blog/2021-03-27-programming-macbook/</guid><description>Picking a MacBook for programming. The Air is the default — web and mobile development run fine on it. The Pro 14 earns its keep for ML or heavy Xcode work; the Pro 16 only if you drive multiple external monitors or run long builds. Here&apos;s the use-case framework and realistic RAM and CPU targets.</description><pubDate>Sat, 27 Mar 2021 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;2026 update&lt;/strong&gt;: ported from the old VuePress blog and rewritten end to end. The Intel-era framing has been re-anchored to Apple Silicon (M1–M4). Always confirm current pricing and specs against Apple’s official site or a major retailer before you buy.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;When you walk into the Mac aisle to start programming, you find the Air, the Pro 14, and the Pro 16 side by side, and within each model the CPU, RAM, and SSD permutations move the price by tens of thousands of yen each. Putting 400,000 yen on the table for your first machine is a lot.&lt;/p&gt;
&lt;p&gt;This piece narrows the question to one use case — learning to code and doing the day-job — and walks through how to pick an Apple Silicon MacBook for it. The short version: most people will be fine on the Air.&lt;/p&gt;
&lt;p&gt;If you’re also weighing a Windows laptop, &lt;a href=&quot;https://aulvem.com/blog/2021-03-28-programming-windows/&quot;&gt;How to pick a Windows laptop for programming&lt;/a&gt; covers that side. If your main job on the machine is blog writing, &lt;a href=&quot;https://aulvem.com/blog/2021-04-08-blog-macbook/&quot;&gt;How to pick a MacBook for blogging&lt;/a&gt; is the better read.&lt;/p&gt;
&lt;h2 id=&quot;the-short-answer--air-for-web-and-mobile-pro-for-ml-or-serious-ios&quot;&gt;The short answer — Air for web and mobile, Pro for ML or serious iOS&lt;/h2&gt;
&lt;p&gt;Short version: for learning to program and for most web and mobile app development, a &lt;strong&gt;MacBook Air (M-series, 16 GB RAM)&lt;/strong&gt; is enough. The Pro earns its keep in three places: machine learning that wants a lot of unified memory, iOS development with long Xcode build loops, and setups driving two or more external monitors.&lt;/p&gt;
&lt;p&gt;Three decisions, nothing more:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;What you’ll build&lt;/strong&gt; — web or mobile, Air; ML or heavy iOS work, Pro&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RAM&lt;/strong&gt; — 16 GB as the baseline; 24 GB or 32 GB if you’re learning and working on the same machine or have ML in mind&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Screen and expansion&lt;/strong&gt; — Pro 14 or 16 if multiple external monitors are part of your daily setup&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Put differently: the 8 GB tier paired with a 256 GB SSD is the combination to avoid for modern programming work — dependencies and simulators fill the SSD faster than you’d expect.&lt;/p&gt;
&lt;h2 id=&quot;by-use-case--web-mobile-and-ml-pull-in-different-directions&quot;&gt;By use case — web, mobile, and ML pull in different directions&lt;/h2&gt;
&lt;p&gt;Short version: don’t lump “programming” into one bucket. Split by what you actually write — web, mobile, ML — because the resource demands diverge.&lt;/p&gt;
&lt;h3 id=&quot;web-and-backend--the-air-is-enough&quot;&gt;Web and backend — the Air is enough&lt;/h3&gt;
&lt;p&gt;Node, Python, Go on the backend; React or Vue on the front — none of this strains a MacBook Air. With 16 GB of RAM, you can run a handful of Docker containers and still have headroom for learning through small-scale day-job work.&lt;/p&gt;
&lt;p&gt;For the typical setup — VS Code, a browser, a terminal, one or two containers — the Air’s cooling is fine, and you won’t hear the fan often.&lt;/p&gt;
&lt;h3 id=&quot;mobile--pro-14-is-the-safe-call-for-ios-android-is-fine-on-the-air&quot;&gt;Mobile — Pro 14 is the safe call for iOS; Android is fine on the Air&lt;/h3&gt;
&lt;p&gt;Android Studio runs on the Air, but the emulator chews through RAM the moment you launch it. Treat 16 GB as the floor.&lt;/p&gt;
&lt;p&gt;For iOS (Xcode), the Air handles development too — for learning, you won’t be blocked. For a real job that has you running builds all day, the Pro 14’s cooling and SoC headroom translate into perceptible speed. If you’re plugging in multiple physical devices and running long, continuous builds, lean Pro.&lt;/p&gt;
&lt;h3 id=&quot;machine-learning--pro-14-or-16-with-a-lot-of-unified-memory&quot;&gt;Machine learning — Pro 14 or 16 with a lot of unified memory&lt;/h3&gt;
&lt;p&gt;For local inference or fine-tuning experiments, Apple Silicon’s unified memory (shared between CPU and GPU) gets used as GPU memory. That’s the platform’s edge: a Pro at 24 GB, 32 GB, or 64 GB can run on-device models that a same-price Windows laptop’s discrete GPU can’t load.&lt;/p&gt;
&lt;p&gt;Serious training (fine-tuning workloads of any size) is more realistic on cloud GPUs. Treat the MacBook as the inference and prototyping machine.&lt;/p&gt;
&lt;h2 id=&quot;realistic-ram-and-cpu-targets&quot;&gt;Realistic RAM and CPU targets&lt;/h2&gt;
&lt;p&gt;Short version: start at 16 GB for RAM, and think of the CPU (SoC) tiers as Air = base M, Pro 14 = M Pro, Pro 16 = M Pro / M Max.&lt;/p&gt;
&lt;h3 id=&quot;ram--skip-8-gb-in-2026-baseline-is-16-gb&quot;&gt;RAM — skip 8 GB in 2026; baseline is 16 GB&lt;/h3&gt;
&lt;p&gt;Apple Silicon at 8 GB holds up better than Intel-era 8 GB did. But in 2026, with a browser, an editor, containers, and chat apps all resident, 8 GB swaps daily.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Learning only, light loads&lt;/strong&gt;: 16 GB&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Day job plus learning&lt;/strong&gt;: 16–24 GB&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Serious ML, iOS, or video work alongside&lt;/strong&gt;: 32 GB or more&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;RAM is set at order time — Apple Silicon has it soldered on, no upgrade path. When in doubt, take the next tier up; you regret it less.&lt;/p&gt;
&lt;h3 id=&quot;cpu-soc--the-airs-base-m-covers-most-of-the-work&quot;&gt;CPU (SoC) — the Air’s base M covers most of the work&lt;/h3&gt;
&lt;p&gt;The base M has, generation over generation, pulled ahead of Intel-era i7. For ordinary web and mobile work, you won’t feel a CPU ceiling on the base M.&lt;/p&gt;
&lt;p&gt;The M Pro and M Max pull away under sustained full load — video exports, large builds, ML training. For short builds and IDE work, the gap between Air and Pro is hard to feel.&lt;/p&gt;
&lt;h2 id=&quot;comparison--air-vs-pro-14-vs-pro-16-for-programming&quot;&gt;Comparison — Air vs. Pro 14 vs. Pro 16 (for programming)&lt;/h2&gt;

































































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Aspect&lt;/th&gt;&lt;th&gt;MacBook Air&lt;/th&gt;&lt;th&gt;MacBook Pro 14&lt;/th&gt;&lt;th&gt;MacBook Pro 16&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Use case&lt;/td&gt;&lt;td&gt;Web / mobile learning and work&lt;/td&gt;&lt;td&gt;iOS / ML / mixed video work&lt;/td&gt;&lt;td&gt;Long builds, multiple external monitors&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;SoC&lt;/td&gt;&lt;td&gt;Base M&lt;/td&gt;&lt;td&gt;M Pro / M Max&lt;/td&gt;&lt;td&gt;M Pro / M Max&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;RAM recommended&lt;/td&gt;&lt;td&gt;16 GB&lt;/td&gt;&lt;td&gt;18–24 GB&lt;/td&gt;&lt;td&gt;24–32 GB or more&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;SSD recommended&lt;/td&gt;&lt;td&gt;512 GB or more&lt;/td&gt;&lt;td&gt;512 GB or more&lt;/td&gt;&lt;td&gt;1 TB or more&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Display&lt;/td&gt;&lt;td&gt;13 / 15 inch&lt;/td&gt;&lt;td&gt;14-inch ProMotion&lt;/td&gt;&lt;td&gt;16-inch ProMotion&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;External monitors&lt;/td&gt;&lt;td&gt;1–2 max (generation-dependent)&lt;/td&gt;&lt;td&gt;Multiple&lt;/td&gt;&lt;td&gt;Multiple&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cooling&lt;/td&gt;&lt;td&gt;Fanless (through M3) / quiet&lt;/td&gt;&lt;td&gt;Active&lt;/td&gt;&lt;td&gt;Active&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Weight&lt;/td&gt;&lt;td&gt;~1.2–1.5 kg&lt;/td&gt;&lt;td&gt;~1.6 kg&lt;/td&gt;&lt;td&gt;~2.1 kg&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Price range&lt;/td&gt;&lt;td&gt;150,000–250,000 yen&lt;/td&gt;&lt;td&gt;250,000–400,000 yen&lt;/td&gt;&lt;td&gt;350,000–600,000 yen&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Pricing and specs shift with each generation; confirm against Apple’s official site at purchase time.&lt;/p&gt;
&lt;h2 id=&quot;faq&quot;&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Q. Should I pick 8 GB or 16 GB of RAM?&lt;/strong&gt;
A. In 2026, treat 16 GB as the floor. Apple Silicon at 8 GB holds up better than Intel-era 8 GB did, but the moment you run Docker, a VM, and a stack of browser tabs in parallel, you start swapping. If you plan to keep the machine for a while, 16 GB or more is the safer call.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. Can I do iOS app development on a MacBook Air?&lt;/strong&gt;
A. Yes. Xcode runs fine on the Air. That said, if your day is the simulator-and-device-build loop on a real job, the Pro’s active cooling shows up as perceptible speed in places the Air starts to throttle.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. Is a MacBook enough for machine learning?&lt;/strong&gt;
A. If you’re serious about local inference or running local LLMs, a Pro 14 or 16 with a lot of unified memory is the realistic choice. The Air is fine to learn on, but for actual workloads, pair it with cloud GPUs rather than trying to do it all on-device.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. Windows or MacBook for programming?&lt;/strong&gt;
A. If your work involves macOS, iOS, or any Apple-platform development, it’s MacBook, full stop. For web or backend work, Windows + WSL2 is enough. At the same price, Windows gives you more spec on paper, but the MacBook wins on dev-environment ergonomics and second-hand resale. See &lt;a href=&quot;https://aulvem.com/blog/2021-03-28-programming-windows/&quot;&gt;How to pick a Windows laptop for programming&lt;/a&gt; for the other side.&lt;/p&gt;
&lt;h2 id=&quot;wrapping-up&quot;&gt;Wrapping up&lt;/h2&gt;
&lt;p&gt;For a programming MacBook, if you’re learning or working on web and mobile, an Air with 16 GB of RAM handles most of it. The Pro 14 or 16 earns its place in three situations: ML work that needs a lot of unified memory, iOS development with long build loops, and setups with multiple external monitors.&lt;/p&gt;
&lt;p&gt;If you’re deciding where to put the price delta, the better move for the first machine is to &lt;strong&gt;spec the Air at 16 GB / 512 GB and spend the difference on an external monitor&lt;/strong&gt; — that’s where day-to-day workflow actually improves.&lt;/p&gt;
&lt;p&gt;If you’re looking at a MacBook for blog writing, &lt;a href=&quot;https://aulvem.com/blog/2021-04-08-blog-macbook/&quot;&gt;How to pick a MacBook for blogging&lt;/a&gt; is the companion piece. If you’re comparing against Windows, &lt;a href=&quot;https://aulvem.com/blog/2021-03-28-programming-windows/&quot;&gt;How to pick a Windows laptop for programming&lt;/a&gt; is the other side of the question.&lt;/p&gt;
</content:encoded><category>reviews</category><category>pc</category><category>apple</category></item><item><title>How to pick an iPhone 12 — viewing the first 5G-rollout-year iPhone as a buy today</title><link>https://aulvem.com/blog/2021-03-26-iphone12/</link><guid isPermaLink="true">https://aulvem.com/blog/2021-03-26-iphone12/</guid><description>How to choose between the iPhone 12 line-up (standard, mini, Pro, Pro Max). As the first 5G-rollout-year iPhone, the question of which one to pick — mini, standard, Pro, or Pro Max — comes down to use case, summarized with a table and FAQ.</description><pubDate>Fri, 26 Mar 2021 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;2026 update&lt;/strong&gt;: ported from the old VuePress blog. iPhone 12 was the &lt;strong&gt;first iPhone to ship into Japan’s 5G rollout&lt;/strong&gt; (announced autumn 2020), and the generation where the split between mmWave models for the US and Sub-6-only models for Japan first settled into place. It is no longer a current new-product pick in 2026, but the framework still works for evaluating a used or last-gen buy. Always confirm current pricing and stock before you order. The numbers are the manufacturer’s published figures from the original writing; current official specs may differ.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The iPhone 12 has moved past the “buy it new” phase, but it is still a live option on the used and refurbished market if the goal is to own an iPhone cheaply right now. The line-up has four models — mini, standard, Pro, Pro Max — that differ in both size and camera.&lt;/p&gt;
&lt;p&gt;This piece sorts the four on two axes: &lt;strong&gt;screen size and whether there’s an optical telephoto&lt;/strong&gt;, then maps each model to a use case. If you are torn between iPhone 11 and iPhone 12, the answer flips on whether you’ll use 5G, so read through to the FAQ.&lt;/p&gt;
&lt;h2 id=&quot;the-short-answer--mini-or-pro-the-standard-and-pro-max-are-the-middle-thats-easy-to-get-lost-in&quot;&gt;The short answer — mini or Pro; the standard and Pro Max are the middle that’s easy to get lost in&lt;/h2&gt;
&lt;p&gt;Short answer: mini if you want one-handed use, Pro line if you want telephoto and low-light. For everyone else the standard iPhone 12 is enough. The Pro Max is for people who want both a big screen and a telephoto.&lt;/p&gt;
&lt;p&gt;Boil down the differences inside the iPhone 12 line and three points remain:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Screen size&lt;/strong&gt;: three steps — 5.4 / 6.1 / 6.7 inches&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Optical telephoto and LiDAR&lt;/strong&gt;: Pro line only&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;5G mmWave&lt;/strong&gt;: Japan-market units are all Sub-6 only&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Starting from those three is faster than starting from price or storage.&lt;/p&gt;
&lt;h2 id=&quot;what-changed-at-the-iphone-12-generation&quot;&gt;What changed at the iPhone 12 generation&lt;/h2&gt;
&lt;p&gt;Short answer: 5G, OLED across the whole line-up, MagSafe, A14 Bionic, and a redesigned body. Coming from iPhone 11, the volume of change earns the “generational shift” label.&lt;/p&gt;
&lt;h3 id=&quot;5g-support-sub-6-only-in-japan&quot;&gt;5G support (Sub-6 only in Japan)&lt;/h3&gt;
&lt;p&gt;iPhone 12 was the &lt;strong&gt;first 5G iPhone released in Japan&lt;/strong&gt;. Japanese-market units are Sub-6 only; the mmWave models stayed North-America-only.&lt;/p&gt;
&lt;p&gt;In day-to-day use, downstream speed picks up inside a 5G area, but outside one the phone falls back to 4G LTE — so “5G means fast” is not a clean shorthand. By 2026 the 5G footprint has grown, so the upside is easier to feel than it was at launch.&lt;/p&gt;
&lt;h3 id=&quot;oled-across-the-entire-line-up-super-retina-xdr&quot;&gt;OLED across the entire line-up (Super Retina XDR)&lt;/h3&gt;
&lt;p&gt;On iPhone 11, the standard model used an IPS LCD and only the Pro line had OLED. From iPhone 12 onward, &lt;strong&gt;mini and standard included, every model is OLED&lt;/strong&gt;, so deep blacks and HDR content became a shared baseline.&lt;/p&gt;
&lt;h3 id=&quot;magsafe-wireless-charging&quot;&gt;MagSafe wireless charging&lt;/h3&gt;
&lt;p&gt;A ring of magnets is built into the back, so first-party and third-party MagSafe chargers and accessories snap into place. The standard carried forward across iPhone 12 and beyond, so accessories accumulated over time keep their value.&lt;/p&gt;
&lt;h3 id=&quot;the-body-returned-to-flat-edges&quot;&gt;The body returned to flat edges&lt;/h3&gt;
&lt;p&gt;A flat-edge profile that calls back to the iPhone 4 / 5 era. The feel in the hand is noticeably different from the rounded sides used up through iPhone 11. If you have smaller hands, hold one in person before buying.&lt;/p&gt;
&lt;h2 id=&quot;picks-by-use-case--which-one-to-choose&quot;&gt;Picks by use case — which one to choose&lt;/h2&gt;
&lt;p&gt;Short answer: which model fits comes down to a single priority — one-handed, telephoto, or big screen.&lt;/p&gt;
&lt;h3 id=&quot;one-handed-use--iphone-12-mini-54-inches&quot;&gt;One-handed use — iPhone 12 mini (5.4 inches)&lt;/h3&gt;
&lt;p&gt;iPhone 12 mini is &lt;strong&gt;the smallest of the line at 5.4 inches&lt;/strong&gt;. Even counting same-generation Android flagships, a size like this is rare, so if one-handed operation is the top priority, it is the only real pick.&lt;/p&gt;
&lt;p&gt;The trade-off is the smaller battery: heavy use can leave the meter uncomfortable by evening. If you’re out and on the phone all day, lean to the standard model or above.&lt;/p&gt;
&lt;h3 id=&quot;telephoto-low-light-lidar--iphone-12-pro--pro-max&quot;&gt;Telephoto, low-light, LiDAR — iPhone 12 Pro / Pro Max&lt;/h3&gt;
&lt;p&gt;Only the Pro line carries the &lt;strong&gt;optical telephoto camera and the LiDAR scanner&lt;/strong&gt;. The telephoto pays off when you want a tighter frame on a still subject or shoot portraits, and LiDAR feeds directly into autofocus speed in dim rooms.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;iPhone 12 Pro: 2x optical zoom&lt;/li&gt;
&lt;li&gt;iPhone 12 Pro Max: 2.5x optical zoom + sensor-shift stabilization&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If “get a little closer” is the whole request, the standard model’s digital zoom is enough. If shooting people in low light is a frequent thing, the Pro-line gap is real.&lt;/p&gt;
&lt;h3 id=&quot;big-screen--iphone-12-pro-max-67-inches&quot;&gt;Big screen — iPhone 12 Pro Max (6.7 inches)&lt;/h3&gt;
&lt;p&gt;6.7 inches earns its keep on video and games. It is also too large to fully wrap one hand around, so you have to accept it as a two-handed device.&lt;/p&gt;
&lt;h3 id=&quot;everything-else--iphone-12-standard-61-inches&quot;&gt;Everything else — iPhone 12 (standard, 6.1 inches)&lt;/h3&gt;
&lt;p&gt;If neither size nor optical telephoto is on the wish list, the standard model leaves nothing on the table. From an iPhone 11, it is the most natural upgrade path.&lt;/p&gt;
&lt;h2 id=&quot;iphone-12-line-up-comparison&quot;&gt;iPhone 12 line-up comparison&lt;/h2&gt;













































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align:left&quot;&gt;Model&lt;/th&gt;&lt;th style=&quot;text-align:center&quot;&gt;Screen&lt;/th&gt;&lt;th style=&quot;text-align:center&quot;&gt;Camera&lt;/th&gt;&lt;th style=&quot;text-align:center&quot;&gt;Optical telephoto&lt;/th&gt;&lt;th style=&quot;text-align:center&quot;&gt;LiDAR&lt;/th&gt;&lt;th style=&quot;text-align:center&quot;&gt;Weight&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;iPhone 12 mini&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;5.4 in&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;Wide + Ultra-wide&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;No&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;No&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;~133 g&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;iPhone 12&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;6.1 in&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;Wide + Ultra-wide&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;No&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;No&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;~162 g&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;iPhone 12 Pro&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;6.1 in&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;Wide + Ultra-wide + Tele&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;2x&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;Yes&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;~187 g&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;iPhone 12 Pro Max&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;6.7 in&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;Wide + Ultra-wide + Tele&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;2.5x&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;Yes&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;~226 g&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Spec numbers are Apple’s published figures. Weight is the published value, not a case-off measurement.&lt;/p&gt;
&lt;h2 id=&quot;iphone-11-or-iphone-12--which-one-to-buy&quot;&gt;iPhone 11 or iPhone 12 — which one to buy&lt;/h2&gt;
&lt;p&gt;Short answer: it comes down to whether you’ll use 5G and whether OLED on the standard model matters to you.&lt;/p&gt;
&lt;p&gt;The walkthrough for the iPhone 11 line is in &lt;a href=&quot;https://aulvem.com/blog/2021-03-25-iphone11/&quot;&gt;How to pick an iPhone 11&lt;/a&gt;. Reading the two side by side makes it easier to see what actually changed at iPhone 12.&lt;/p&gt;



































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align:left&quot;&gt;Angle&lt;/th&gt;&lt;th style=&quot;text-align:center&quot;&gt;iPhone 11&lt;/th&gt;&lt;th style=&quot;text-align:center&quot;&gt;iPhone 12&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;5G&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;Not supported&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;Sub-6 (Japan units)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Standard model’s screen&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;IPS LCD&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;OLED&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;MagSafe&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;Not supported&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;Supported&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Smallest size&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;5.8 in (Pro)&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;5.4 in (mini)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Used price (2026 ballpark)&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;Cheaper&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;A bit higher&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;If 5G and OLED don’t matter and price is the lead, iPhone 11 is enough. If “mini-sized for one-handed use” or “OLED even on the standard model” is what you’re after, iPhone 12 has a reason to exist.&lt;/p&gt;
&lt;h2 id=&quot;faq&quot;&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Q. Is there a reason to buy iPhone 12 new in 2026?&lt;/strong&gt;
A. Distribution of new units has more or less wound down, so refurbished or used is the practical channel. If you can verify battery health, it works as a secondary phone or for light use. As your main phone for years to come, lean to a newer generation.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. Is the mini’s battery really weaker?&lt;/strong&gt;
A. Yes — Apple’s published video-playback time is shorter than the standard model. Under heavy use the meter does get tight in the evening. The decision is whether you accept that as the cost of the one-handed size, or move up to the standard.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. Does iPhone 12’s 5G matter in Japan?&lt;/strong&gt;
A. At the 2020 launch the 5G footprint was thin; in 2026 coverage is wide enough that the upside is easier to feel. That said, Japanese units are Sub-6 only — the high-throughput mmWave bands are not on the table.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. Is upgrading from iPhone 11 to iPhone 12 worth it?&lt;/strong&gt;
A. If iPhone 11 still feels fine, there is no hard reason to jump. The usual triggers for upgrading are: wanting 5G, wanting OLED on the standard tier, or wanting the mini’s one-handed size.&lt;/p&gt;
&lt;h2 id=&quot;wrapping-up&quot;&gt;Wrapping up&lt;/h2&gt;
&lt;p&gt;The iPhone 12 line has a clean historical position as “the first 5G iPhone in the rollout year,” and the move to OLED across the line plus MagSafe makes the generation feel cohesive.&lt;/p&gt;
&lt;p&gt;If you’re buying in 2026, used or refurbished is the realistic line, not new. Settle three things before you order — screen size, optical telephoto or not, and your local 5G area — and the odds of buyer’s remorse drop.&lt;/p&gt;
&lt;p&gt;If you’re still torn between iPhone 11 and iPhone 12, reading this alongside &lt;a href=&quot;https://aulvem.com/blog/2021-03-25-iphone11/&quot;&gt;How to pick an iPhone 11&lt;/a&gt; sharpens the generation gap.&lt;/p&gt;
</content:encoded><category>reviews</category><category>smartphone</category><category>apple</category></item><item><title>How to pick an iPhone 11 — Pro, Pro Max, or the standard model, sorted by use case</title><link>https://aulvem.com/blog/2021-03-25-iphone11/</link><guid isPermaLink="true">https://aulvem.com/blog/2021-03-25-iphone11/</guid><description>iPhone 11, 11 Pro, and 11 Pro Max compared along three axes: screen size, camera, and display quality. Framed to the 2021 release window, with a use-case-by-use-case verdict.</description><pubDate>Thu, 25 Mar 2021 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;2026 update&lt;/strong&gt;: This was written in March 2021, when the iPhone 11 had just dropped a generation and become the obvious value pick. In 2026 the iPhone 12 / 13 and later are cheap enough on the used market that there is almost no reason to buy an iPhone 11 new. Read this as &lt;strong&gt;a snapshot of the 2021 buying decision&lt;/strong&gt;. The frame — how to think about the Pro / Pro Max / standard split — still applies.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The iPhone 11 line hit its sales peak after enough time had passed for it to settle into the “last-generation bargain” slot. Three models — Pro, Pro Max, and the standard iPhone 11 — and the price gaps between them are wide enough that people get stuck on the choice.&lt;/p&gt;
&lt;p&gt;This piece narrows the comparison down to three axes — screen size, camera, and display quality — so that by the end you know which of the three is yours.&lt;/p&gt;
&lt;h2 id=&quot;the-short-answer--pro-or-standard-and-three-things-decide-it&quot;&gt;The short answer — Pro or standard, and three things decide it&lt;/h2&gt;
&lt;p&gt;Short version: picking inside the iPhone 11 line comes down to three questions. Do you need a triple-lens camera with a telephoto? Do you need the punch of an OLED display? Do you need a 6.5-inch screen?&lt;/p&gt;
&lt;p&gt;Flip that around, and anyone who says no to all three is fine with &lt;strong&gt;the standard iPhone 11&lt;/strong&gt;. In day-to-day use the performance gap against the Pro models is almost invisible.&lt;/p&gt;

































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align:left&quot;&gt;Model&lt;/th&gt;&lt;th style=&quot;text-align:center&quot;&gt;Screen size&lt;/th&gt;&lt;th style=&quot;text-align:center&quot;&gt;Camera&lt;/th&gt;&lt;th style=&quot;text-align:center&quot;&gt;Display&lt;/th&gt;&lt;th style=&quot;text-align:center&quot;&gt;Price band (2021)&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;iPhone 11 Pro Max&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;6.5 inches&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;Triple lens (with telephoto)&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;OLED, HDR&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;High&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;iPhone 11 Pro&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;5.8 inches&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;Triple lens (with telephoto)&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;OLED, HDR&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;Mid to high&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;iPhone 11&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;6.1 inches&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;Dual lens (wide + ultra-wide)&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;IPS LCD&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;Mid&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;The use-case verdict, up front:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Telephoto shots, low light, video — &lt;strong&gt;Pro line&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Vivid display for HDR video or photo editing — &lt;strong&gt;Pro line&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Heavy gaming use — &lt;strong&gt;Pro line&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;The largest possible screen, period — &lt;strong&gt;Pro Max&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;None of the above — &lt;strong&gt;standard iPhone 11&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;basic-specs-of-the-iphone-11-line-side-by-side&quot;&gt;Basic specs of the iPhone 11 line, side by side&lt;/h2&gt;
&lt;p&gt;Short version: all three share the same SoC (A13 Bionic), so CPU performance is identical. The differences live in the camera, the display, the screen size, and the battery.&lt;/p&gt;
&lt;h3 id=&quot;cpu-is-a13-bionic-across-the-board&quot;&gt;CPU is A13 Bionic across the board&lt;/h3&gt;
&lt;p&gt;Pro, Pro Max, and the standard model all carry the same A13 Bionic. For everyday use and app launches, the felt speed is basically the same.&lt;/p&gt;
&lt;p&gt;If “the Pro feels smoother for gaming” ever lines up with reality, it tends to come from &lt;strong&gt;the display feel&lt;/strong&gt; and &lt;strong&gt;thermal-throttling headroom under heat&lt;/strong&gt;, not from raw CPU.&lt;/p&gt;
&lt;h3 id=&quot;where-they-actually-differ-camera-display-size-battery&quot;&gt;Where they actually differ: camera, display, size, battery&lt;/h3&gt;















































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align:left&quot;&gt;Aspect&lt;/th&gt;&lt;th style=&quot;text-align:center&quot;&gt;iPhone 11 Pro Max&lt;/th&gt;&lt;th style=&quot;text-align:center&quot;&gt;iPhone 11 Pro&lt;/th&gt;&lt;th style=&quot;text-align:center&quot;&gt;iPhone 11&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;SoC&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;A13 Bionic&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;A13 Bionic&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;A13 Bionic&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Screen size&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;6.5 inches&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;5.8 inches&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;6.1 inches&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Display&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;Super Retina XDR (OLED)&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;Super Retina XDR (OLED)&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;Liquid Retina (IPS LCD)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Camera&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;Triple (wide, ultra-wide, telephoto)&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;Triple (wide, ultra-wide, telephoto)&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;Dual (wide, ultra-wide)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Battery (rough)&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;Longest&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;Middle&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;Middle (some reports say the standard outlasts the Pro)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Weight&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;226 g&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;188 g&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;194 g&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Read as a spec sheet alone the three look almost identical, but &lt;strong&gt;the telephoto lens and the OLED&lt;/strong&gt; are the two places where the difference shows up in daily use.&lt;/p&gt;
&lt;h2 id=&quot;choosing-by-use-case&quot;&gt;Choosing by use case&lt;/h2&gt;
&lt;p&gt;Short version: if you make money on photos and video, or treat them as a serious hobby, take a Pro. If screen size is the top priority, take the Pro Max. Otherwise the standard model is fine.&lt;/p&gt;
&lt;h3 id=&quot;if-photos-and-video-matter-take-a-pro&quot;&gt;If photos and video matter, take a Pro&lt;/h3&gt;
&lt;p&gt;What the triple-lens camera buys you is &lt;strong&gt;a 2x optical telephoto&lt;/strong&gt; and &lt;strong&gt;a more reliable night mode&lt;/strong&gt;. If you post food and travel shots to social media often, the Pro line lands closer to “actually satisfied.”&lt;/p&gt;
&lt;p&gt;That said, 2x is only 2x. “Pull something far away in close” is not what this telephoto is for — set the expectation at “one step closer” and you won’t be disappointed.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;iPhone 11 Pro Max body shot showing the triple-lens camera array on the back&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-03-25-iphone11/2021-03-25-iPhone11-Pro-Max.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;h3 id=&quot;for-immersive-video-and-gaming-take-a-pro-for-the-oled&quot;&gt;For immersive video and gaming, take a Pro for the OLED&lt;/h3&gt;
&lt;p&gt;The Pro / Pro Max Super Retina XDR is OLED with HDR support. On a Netflix HDR title or a Dolby Vision film on Apple TV+, you can clearly feel the deeper blacks and the brighter highlights.&lt;/p&gt;
&lt;p&gt;The Liquid Retina (IPS LCD) on the standard iPhone 11 still looks good on its own, but if HDR video is part of your daily diet, the Pro line is worth the premium.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;iPhone 11 Pro body shot at the 5.8-inch size&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-03-25-iphone11/2021-03-25-iPhone11-Pro.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;h3 id=&quot;for-long-form-video-or-e-books-on-a-large-screen-take-the-pro-max&quot;&gt;For long-form video or e-books on a large screen, take the Pro Max&lt;/h3&gt;
&lt;p&gt;6.5 inches is the largest in the line. Good for two-page e-book spreads and for long video sessions — but &lt;strong&gt;226 g&lt;/strong&gt; is a lot to hold one-handed for any length of time. If you carry it in a pocket all day, go in with eyes open.&lt;/p&gt;
&lt;h3 id=&quot;if-none-of-the-above-take-the-standard-iphone-11&quot;&gt;If none of the above, take the standard iPhone 11&lt;/h3&gt;
&lt;p&gt;If your day is mostly messaging, social media, snapshots, and video — and you don’t specifically need telephoto, HDR, or a big screen — the standard model covers it. Putting the price difference toward something else gives you more satisfaction per yen.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Standard iPhone 11 body shot at the 6.1-inch size&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-03-25-iphone11/2021-03-25-iPhone11.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;h2 id=&quot;how-the-iphone-11-stacks-up-against-neighbouring-generations&quot;&gt;How the iPhone 11 stacks up against neighbouring generations&lt;/h2&gt;
&lt;p&gt;Short version: against the older models (iPhone XR / Xs) it is a clear step up thanks to &lt;strong&gt;A13 plus the ultra-wide camera&lt;/strong&gt;. Against the iPhone 12 the gap is &lt;strong&gt;no 5G and no MagSafe&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id=&quot;versus-iphone-xr--xs--a-clean-upgrade&quot;&gt;Versus iPhone XR / Xs — a clean upgrade&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;CPU goes A12 to A13, with better processing speed and power efficiency&lt;/li&gt;
&lt;li&gt;Adds an &lt;strong&gt;ultra-wide lens&lt;/strong&gt; to the camera (XR was single, Xs was telephoto plus wide)&lt;/li&gt;
&lt;li&gt;Adds night mode, which is a real step up for low-light shots&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Coming from an XR, the difference is obvious in everyday use. Coming from an Xs, unless you care a lot about the camera, the honest answer is “no need to rush.”&lt;/p&gt;
&lt;h3 id=&quot;versus-the-iphone-12-line&quot;&gt;Versus the iPhone 12 line&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;iPhone 12 supports &lt;strong&gt;5G&lt;/strong&gt;, iPhone 11 stops at 4G&lt;/li&gt;
&lt;li&gt;iPhone 12 supports &lt;strong&gt;MagSafe&lt;/strong&gt; (magnetic accessories); iPhone 11 does not&lt;/li&gt;
&lt;li&gt;iPhone 12 is OLED across the line; on iPhone 11 only the Pro models are OLED&lt;/li&gt;
&lt;li&gt;The iPhone 11 is the cheaper of the two (2021)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The full breakdown is in a separate piece — &lt;a href=&quot;https://aulvem.com/blog/2021-03-26-iphone12/&quot;&gt;how to pick an iPhone 12&lt;/a&gt;. The 11-vs-12 question really comes down to whether you take the price cut or the 5G + MagSafe bundle.&lt;/p&gt;
&lt;h3 id=&quot;cross-generation-summary&quot;&gt;Cross-generation summary&lt;/h3&gt;









































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align:left&quot;&gt;Aspect&lt;/th&gt;&lt;th style=&quot;text-align:center&quot;&gt;iPhone 11 line&lt;/th&gt;&lt;th style=&quot;text-align:center&quot;&gt;iPhone 12 line&lt;/th&gt;&lt;th style=&quot;text-align:center&quot;&gt;iPhone Xs / XR&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;SoC&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;A13&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;A14&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;A12&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;5G&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;No&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;Yes&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;No&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;MagSafe&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;No&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;Yes&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;No&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Ultra-wide camera&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;Yes (all models)&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;Yes (all models)&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;No on XR&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;OLED&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;Pro line only&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;All models&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;Xs only&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;faq&quot;&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Q. Is there a point in buying an iPhone 11 new in 2026?&lt;/strong&gt;
A. Almost none. Apple no longer sells it, so you would be looking at the used market anyway. If iPhone 12 / 13 sits in the same price band, prefer those for 5G and OLED. The iPhone 11 still has a place as a used pick for a secondary phone, a kid’s phone, or a “just need an iPhone” stopgap.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. iPhone 11 Pro or Pro Max — which one?&lt;/strong&gt;
A. Specs are identical, so decide on a single question: do you need 6.5 inches? E-books and long video sessions point to the Pro Max. One-handed comfort points to the Pro. The 38 g weight gap feels real once you actually hold both.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. How much does the IPS LCD on the standard iPhone 11 fall behind the Pro’s OLED?&lt;/strong&gt;
A. Side by side you can tell. Apart from that, it rarely registers. Where the gap shows up is on &lt;strong&gt;a true-black background&lt;/strong&gt; (OLED fully turns off the pixels) and in &lt;strong&gt;HDR-video contrast&lt;/strong&gt;. Day-to-day web browsing and social media — you won’t notice.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. For gaming, is there a real difference between the Pro and the standard model?&lt;/strong&gt;
A. Same A13, so frame rates are basically the same. In long sessions, there are reports that the Pro line dissipates heat better by construction. For something heavy like Genshin Impact over long stretches, the Pro line may stay more stable — about that level of difference.&lt;/p&gt;
&lt;h2 id=&quot;wrapping-up&quot;&gt;Wrapping up&lt;/h2&gt;
&lt;p&gt;How to pick an iPhone 11 boils down to one question: do you need any of the three — the telephoto lens, the OLED display, or the 6.5-inch screen? If the answer to all three is no, the standard iPhone 11 is enough. If you are stepping deeper into photography, video, or gaming, go with the Pro line.&lt;/p&gt;
&lt;p&gt;In 2021 the iPhone 11 line was a strong value pick. In 2026 the used market has it sitting next to the iPhone 12 / 13 in the same price band, so it makes sense to broaden the search a generation up rather than insisting on a new iPhone 11.&lt;/p&gt;
&lt;p&gt;For the full comparison that includes iPhone 12, see &lt;a href=&quot;https://aulvem.com/blog/2021-03-26-iphone12/&quot;&gt;how to pick an iPhone 12&lt;/a&gt;.&lt;/p&gt;
</content:encoded><category>reviews</category><category>smartphone</category><category>apple</category></item><item><title>How to pick a monitor for programming — start with one 24-inch, full HD, pivot-capable panel</title><link>https://aulvem.com/blog/2021-03-24-programming-monitor/</link><guid isPermaLink="true">https://aulvem.com/blog/2021-03-24-programming-monitor/</guid><description>Picking a monitor for programming is 80% the same as a general office pick; the other 20% is pivot support and how many lines of code you can see at once. Start from 24-inch, full HD, matte, pivot-capable, and use that base to decide on dual, vertical, or 4K.</description><pubDate>Wed, 24 Mar 2021 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;2026 update&lt;/strong&gt;: ported from the old VuePress blog. The backbone — what to add on top of an office monitor when you code — still holds, but the product links and price ranges are anchored to 2021. Verify current prices and model numbers, and swap the links to the latest equivalents.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;A lot of people pick up an extra monitor when they start learning to program, or when they land a job as an engineer. Search around and you quickly run into strong opinions — “ultrawide or nothing”, “vertical is mandatory” — which makes it hard to decide on a first panel.&lt;/p&gt;
&lt;p&gt;The trick is to take the office-use baseline (&lt;a href=&quot;https://aulvem.com/blog/2021-03-15-choose-monitor/&quot;&gt;How to pick a PC monitor&lt;/a&gt;) and add two programming-specific points on top. That clears almost all of the noise. If all you want is to spend more time reading code, a single 24-inch, full HD, matte, pivot-capable monitor will carry you a long way.&lt;/p&gt;
&lt;h2 id=&quot;the-short-answer--start-with-one-24-inch-full-hd-matte-pivot-capable-panel&quot;&gt;The short answer — start with one 24-inch, full HD, matte, pivot-capable panel&lt;/h2&gt;
&lt;p&gt;Short version: a programming monitor is the office pick plus two extras — pivot (vertical) support, and how comfortably the text reads. Concretely, start from one panel that ticks these four boxes.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Size&lt;/strong&gt;: around 24 inches (fits on a desk; text doesn’t get cramped at full HD)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Resolution&lt;/strong&gt;: full HD (1920×1080) — at 24 inches you can run it at 100% scaling with no fuss&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Surface&lt;/strong&gt;: matte (non-glare) — easier on the eyes over long sessions&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pivot&lt;/strong&gt;: a stand that rotates to vertical, or VESA support (so you can mount it on an arm later)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Whether to go dual, run it vertical, or invest in 4K can all be answered later. Pick a first panel that meets the four points above, and you keep all those upgrade paths open.&lt;/p&gt;
&lt;h2 id=&quot;size-and-resolution--24-inches-and-full-hd-is-the-easy-choice&quot;&gt;Size and resolution — 24 inches and full HD is the easy choice&lt;/h2&gt;
&lt;p&gt;Short version: for a first programming monitor, 24-inch full HD. The reason is that code reads cleanly at that size with no extra setup.&lt;/p&gt;
&lt;p&gt;At 24 inches and full HD (1920×1080), the default IDE font size (around 13–14 pt) sits comfortably at 80–100 columns. You can leave scaling at 100%, which sidesteps the layout breakage you sometimes hit in Linux or older tools.&lt;/p&gt;
&lt;p&gt;Push full HD up to 27 inches and the dot pitch gets coarse — the edges of letters start to look a little fuzzy. If you want to run 27 inches or larger comfortably, 4K is effectively the floor (see the FAQ below).&lt;/p&gt;
&lt;p&gt;If your desk is less than 60 cm deep, anchor on 24 inches. With more depth, a 27-inch 4K starts to make sense.&lt;/p&gt;
&lt;h2 id=&quot;vertical-pivot-vs-landscape--when-each-one-helps&quot;&gt;Vertical (pivot) vs. landscape — when each one helps&lt;/h2&gt;
&lt;p&gt;Short version: landscape is the default. Vertical is something to add only if you spend a lot of time reading tall content.&lt;/p&gt;
&lt;p&gt;The reason: across a coding day, you spend more time reading logs, diffs, and docs than actually typing code. When the thing you’re reading is tall (logs, Markdown, Git diffs, PDFs), going vertical lets a lot more fit on one screen and visibly cuts how often you scroll.&lt;/p&gt;
&lt;h3 id=&quot;landscape--the-default-and-where-to-start&quot;&gt;Landscape — the default, and where to start&lt;/h3&gt;
&lt;p&gt;Landscape pairs well with the usual layout of IDE / browser / terminal side by side. If you’re using a multi-column IDE (tree on the left, editor in the middle, preview on the right) the way it was designed, landscape is fine.&lt;/p&gt;
&lt;h3 id=&quot;vertical--for-logs-long-code-and-pr-reviews&quot;&gt;Vertical — for logs, long code, and PR reviews&lt;/h3&gt;
&lt;p&gt;Vertical earns its keep for people like this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tailing server logs for long stretches (SRE / backend-leaning work)&lt;/li&gt;
&lt;li&gt;Reviewing GitHub PRs every day (less vertical scrolling through diffs)&lt;/li&gt;
&lt;li&gt;Reading long-form docs or specs for hours at a time&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To go vertical you need &lt;strong&gt;a pivot-capable stand&lt;/strong&gt; or &lt;strong&gt;VESA support plus a monitor arm&lt;/strong&gt;. Lock in one of those at purchase time and the extra cost of switching to vertical later is zero.&lt;/p&gt;
&lt;h3 id=&quot;if-you-go-dual-match-the-model-and-put-them-side-by-side&quot;&gt;If you go dual, match the model and put them side by side&lt;/h3&gt;
&lt;p&gt;A second display reliably cuts the time you spend bouncing between code and reference. That said, &lt;strong&gt;side by side beats stacked&lt;/strong&gt;: horizontal eye movement is easier on you than constantly looking up and down.&lt;/p&gt;
&lt;p&gt;Match the model when you pair two. Mismatched panels mean uneven bezels and slightly different colour casts, and that small mismatch nags at you every time you flick across.&lt;/p&gt;
&lt;h2 id=&quot;comparison--general-office-use-vs-programming&quot;&gt;Comparison — general office use vs. programming&lt;/h2&gt;
&lt;p&gt;Compared to an office pick, the things to add or change for programming come down to two: pivot support, and headroom for a second panel.&lt;/p&gt;













































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Aspect&lt;/th&gt;&lt;th&gt;General office&lt;/th&gt;&lt;th&gt;Programming&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Size&lt;/td&gt;&lt;td&gt;22–24 inches&lt;/td&gt;&lt;td&gt;24 inches (more lines visible)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Resolution&lt;/td&gt;&lt;td&gt;Full HD&lt;/td&gt;&lt;td&gt;Full HD (24”) / 4K (27” and up)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Surface&lt;/td&gt;&lt;td&gt;Matte&lt;/td&gt;&lt;td&gt;Matte (non-negotiable)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Panel type&lt;/td&gt;&lt;td&gt;VA or IPS&lt;/td&gt;&lt;td&gt;IPS preferred (colour stays steady off-axis)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Pivot&lt;/td&gt;&lt;td&gt;To taste&lt;/td&gt;&lt;td&gt;Supported (or VESA, to add later)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Count&lt;/td&gt;&lt;td&gt;One is enough&lt;/td&gt;&lt;td&gt;One → a matched second, side by side&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Price band&lt;/td&gt;&lt;td&gt;15,000–30,000 yen&lt;/td&gt;&lt;td&gt;20,000–40,000 yen × 1–2 panels&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;The three office baselines (panel type, size, surface) are shared with &lt;a href=&quot;https://aulvem.com/blog/2021-03-15-choose-monitor/&quot;&gt;How to pick a PC monitor&lt;/a&gt;. The programming-specific delta is just “pivot support” and “room to add a second panel”.&lt;/p&gt;
&lt;h2 id=&quot;picks-for-reference&quot;&gt;Picks (for reference)&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;The models below were chosen in 2021. In 2026, verify the successor or an equivalent in the same price band before linking.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;24-inch-ips-pivot-capable-vesa-included&quot;&gt;24-inch, IPS, pivot-capable (VESA included)&lt;/h3&gt;
&lt;p&gt;24-inch, IPS, matte, VESA-ready. The default pick whether you want one panel, or a matched second to grow into a dual setup.&lt;/p&gt;

































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align:left&quot;&gt;Item&lt;/th&gt;&lt;th style=&quot;text-align:left&quot;&gt;Spec&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Size&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;24 inches&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Panel&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;IPS&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Resolution&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Full HD&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Surface&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Matte&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Pivot&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Yes&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;VESA mount&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Yes&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;24-inch-ips-vesa-ready-tilt-only-stand&quot;&gt;24-inch, IPS, VESA-ready (tilt-only stand)&lt;/h3&gt;
&lt;p&gt;The stand by itself doesn’t pivot, but the panel is VESA-compatible, so an aftermarket arm will get you vertical orientation. A reasonable budget option.&lt;/p&gt;

































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align:left&quot;&gt;Item&lt;/th&gt;&lt;th style=&quot;text-align:left&quot;&gt;Spec&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Size&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;24 inches&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Panel&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;IPS&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Resolution&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Full HD&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Surface&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Matte&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Pivot&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Not on the stand (arm required)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;VESA mount&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Yes&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Pair this with a monitor arm and the same hardware covers both dual setup and vertical orientation.&lt;/p&gt;
&lt;h2 id=&quot;faq&quot;&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Q. Is a dual-monitor setup mandatory?&lt;/strong&gt;
A. No. One panel plus IDE tabs and window splits will get the job done. That said, if you’re reviewing PRs or referencing docs while you write every day, a second panel visibly shortens that work. The honest path is one to start, then add a matching second panel once you have the desk space and the budget.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. Does vertical (pivot) actually help?&lt;/strong&gt;
A. For a narrow group, yes — clearly. If you tail logs for hours, do a lot of PR review, or read long specs, vertical is a real win. If you spend your day on front-end work or design, two landscape panels feel better. At purchase time, just make sure the panel is VESA-ready; you can switch to vertical later with an arm.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. Do I need a 4K monitor?&lt;/strong&gt;
A. At 24 inches, mostly no. 24-inch 4K has a dot pitch fine enough that scaling becomes mandatory, and the extra setup pays back less than you’d hope. 4K starts to earn its keep at 27 inches and up, where it gives you a wide working area without fuzzy text. For a first panel, 24-inch full HD is the easier ride.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. How do I connect this to a Mac without grief?&lt;/strong&gt;
A. Recent MacBooks output USB-C / Thunderbolt, so a monitor with &lt;strong&gt;USB-C input (DP Alt Mode)&lt;/strong&gt; lets you handle power and video on a single cable — fewer wires on the desk. If the monitor you want doesn’t have USB-C input, pick one with HDMI or DisplayPort and add a USB-C → HDMI / DP adapter on the side. Early M-series MacBook Air models cap out at one external monitor, so if you’re planning to run dual, check the laptop’s output count before you commit.&lt;/p&gt;
&lt;h2 id=&quot;wrapping-up&quot;&gt;Wrapping up&lt;/h2&gt;
&lt;p&gt;For a programming monitor, take the office baseline (24-inch, full HD, matte, IPS) and add two things: &lt;strong&gt;pivot support&lt;/strong&gt; and &lt;strong&gt;room to add a second panel&lt;/strong&gt;. That’s the whole delta.&lt;/p&gt;
&lt;p&gt;For the first panel, don’t reach. A standard 24-inch, full HD, matte, VESA-ready model does the job. Dual setup and vertical orientation can both be added later for little money, so you don’t have to settle every question at purchase time.&lt;/p&gt;
&lt;p&gt;The picks that overlap with office use live in &lt;a href=&quot;https://aulvem.com/blog/2021-03-15-choose-monitor/&quot;&gt;How to pick a PC monitor&lt;/a&gt;. If you want a deeper read on panel type (VA vs. IPS), size, and surface finish, that’s the companion piece to this one.&lt;/p&gt;
</content:encoded><category>reviews</category><category>monitor</category><category>programming</category></item><item><title>How to pick an HDMI cable — decide by version (1.4 / 2.0 / 2.1) and use case</title><link>https://aulvem.com/blog/2021-03-23-hdmi/</link><guid isPermaLink="true">https://aulvem.com/blog/2021-03-23-hdmi/</guid><description>How to pick an HDMI cable, sorted by version (1.4 / 2.0 / 2.1) and use case. 2.0 for 4K60Hz, 2.1 for 4K120Hz or 8K, 1.4 is enough up to Full HD. Length, connector shape, and cert checkpoints included.</description><pubDate>Tue, 23 Mar 2021 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;2026 update&lt;/strong&gt;: ported from the old VuePress blog. The original draft assumed HDMI 2.0a as the ceiling, but HDMI 2.1 has gone mainstream for 4K120Hz / 8K / VRR, so the body has been rewritten end to end. Re-check the affiliate links against the current line-up.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;“I want to hook a TV up to a game console.” “I need a second one for my PC monitor.” “It’s supposed to be 4K, but it doesn’t look 4K.” The reasons people stall on buying an HDMI cable are usually one of these.&lt;/p&gt;
&lt;p&gt;Prices run from a few hundred yen to several thousand, and the cables all look more or less the same. The difference lives in two things printed in small type on the box: the &lt;strong&gt;version&lt;/strong&gt; and the &lt;strong&gt;connector shape&lt;/strong&gt;. This piece focuses on those two and aims to give you the shape of “the HDMI cable you should buy right now.”&lt;/p&gt;
&lt;h2 id=&quot;the-short-answer--version-length-connector-shape&quot;&gt;The short answer — version, length, connector shape&lt;/h2&gt;
&lt;p&gt;Short version: picking an HDMI cable is not hard. &lt;strong&gt;A version that matches your use case, a length that is just long enough, and a connector shape that matches your gear&lt;/strong&gt; — settle those three in order and you are done.&lt;/p&gt;
&lt;p&gt;The shortest path, by use case:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Up to Full HD (1080p) — &lt;strong&gt;HDMI 1.4&lt;/strong&gt; is enough&lt;/li&gt;
&lt;li&gt;4K60Hz / HDR — &lt;strong&gt;HDMI 2.0&lt;/strong&gt; (Premium High Speed)&lt;/li&gt;
&lt;li&gt;4K120Hz / 8K / VRR (game consoles, latest GPUs) — &lt;strong&gt;HDMI 2.1&lt;/strong&gt; (Ultra High Speed)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;For length, treat 1–3 m as the desk-side baseline and pick something a little longer than your actual run. For the connector, confirm “Type A (standard) / Mini / Micro” on both ends of the connection. Do those things and failure is rare.&lt;/p&gt;
&lt;h2 id=&quot;what-an-hdmi-version-is--a-bundle-of-bandwidth-and-features&quot;&gt;What an HDMI version is — a bundle of bandwidth and features&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;What an HDMI version is&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The number that marks a generation of the HDMI cable and connector spec. Each generation fixes a &lt;strong&gt;maximum bandwidth (Gbps)&lt;/strong&gt;, which in turn fixes &lt;strong&gt;the maximum resolution, refresh rate, and feature set (HDR, VRR, etc.) it supports&lt;/strong&gt;. Newer cables are backward compatible with older features, but &lt;strong&gt;not the other way around&lt;/strong&gt; — older cables cannot deliver newer features.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Miss this point and you get “the TV is 4K but the picture isn’t 4K” or “the game won’t push 120Hz.” When the cable can’t carry the bandwidth, the device automatically falls back to a lower signal.&lt;/p&gt;
&lt;p&gt;The headline specs for each version look like this.&lt;/p&gt;
&lt;h3 id=&quot;hdmi-14--full-hd--up-to-4k30hz&quot;&gt;HDMI 1.4 — Full HD / up to 4K30Hz&lt;/h3&gt;
&lt;p&gt;Defined in 2009. Maximum bandwidth around 10.2 Gbps, with Full HD (1920×1080) at 60Hz and 4K (3840×2160) at 30Hz as the practical ceiling.&lt;/p&gt;
&lt;p&gt;3D video and the Ethernet channel showed up in this generation. Today it sits as &lt;strong&gt;the floor for Full HD TVs and older monitors&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id=&quot;hdmi-20--the-mainstream-for-4k60hz--hdr&quot;&gt;HDMI 2.0 — the mainstream for 4K60Hz / HDR&lt;/h3&gt;
&lt;p&gt;Defined in 2013. Maximum bandwidth 18 Gbps, supporting &lt;strong&gt;4K60Hz and HDR10&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;As of 2026, pairing a typical 4K TV or 4K monitor with mainstream gear, this is the safest baseline. Cables labeled &lt;strong&gt;Premium High Speed&lt;/strong&gt; fall in this band.&lt;/p&gt;
&lt;p&gt;If you actually want HDR to work, pick &lt;strong&gt;HDMI 2.0a or later&lt;/strong&gt;. The difference between 2.0 and 2.0a is HDR metadata support, and the shortcut is to look for “HDR” called out on the box.&lt;/p&gt;
&lt;h3 id=&quot;hdmi-21--4k120hz--8k--vrr&quot;&gt;HDMI 2.1 — 4K120Hz / 8K / VRR&lt;/h3&gt;
&lt;p&gt;Defined in 2017. Maximum bandwidth jumps to 48 Gbps, with support for &lt;strong&gt;4K120Hz, 8K60Hz, Variable Refresh Rate (VRR), and Auto Low Latency Mode (ALLM)&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;For 4K120Hz on a PlayStation 5, an Xbox Series X / S, or a current GPU, the cable has to be this generation or the bandwidth won’t hold up. These are sold as &lt;strong&gt;Ultra High Speed HDMI&lt;/strong&gt; cables.&lt;/p&gt;
&lt;p&gt;Some products call themselves HDMI 2.1 without actually clearing 48 Gbps, so when you buy, the safe move is to look for the &lt;strong&gt;“Ultra High Speed HDMI Cable” certification label&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id=&quot;picking-by-use-case--five-patterns&quot;&gt;Picking by use case — five patterns&lt;/h2&gt;
&lt;p&gt;Short version: the answer is set by what you are plugging into what. Drop your situation into one of the cases below.&lt;/p&gt;
&lt;h3 id=&quot;tv--recorder-full-hd--hdmi-14&quot;&gt;TV + recorder (Full HD) — HDMI 1.4&lt;/h3&gt;
&lt;p&gt;For recording and playing back Full HD terrestrial broadcasts, HDMI 1.4 is plenty. A cheap basic-grade cable is fine.&lt;/p&gt;
&lt;h3 id=&quot;4k-tv--blu-ray-or-streaming-stick--hdmi-20&quot;&gt;4K TV + Blu-ray or streaming stick — HDMI 2.0&lt;/h3&gt;
&lt;p&gt;The content is mostly 4K60Hz / HDR. Pick a Premium High Speed certified cable. Anything sold at an electronics store under the “4K compatible” label is usually in this class.&lt;/p&gt;
&lt;h3 id=&quot;pc--4k-monitor-creative-work--hdmi-20&quot;&gt;PC + 4K monitor (creative work) — HDMI 2.0&lt;/h3&gt;
&lt;p&gt;For photo work, video editing, and design, 4K60Hz is enough. Use HDMI 2.0 as the baseline.&lt;/p&gt;
&lt;p&gt;If the monitor has DisplayPort input, DisplayPort is often a generation ahead on bandwidth. If you aren’t tied to HDMI, it’s worth considering.&lt;/p&gt;
&lt;h3 id=&quot;game-consoles-ps5--xbox-series-x--hdmi-21&quot;&gt;Game consoles (PS5 / Xbox Series X) — HDMI 2.1&lt;/h3&gt;
&lt;p&gt;If you want 4K120Hz or VRR working, HDMI 2.1 is required. The PS5 ships with an HDMI 2.1 cable in the box, so match that grade when you buy a second one.&lt;/p&gt;
&lt;h3 id=&quot;laptop--projector-occasional-use--hdmi-14-is-fine&quot;&gt;Laptop + projector (occasional use) — HDMI 1.4 is fine&lt;/h3&gt;
&lt;p&gt;For projecting in a meeting room or on a trip, resolutions often drop to WUXGA or so. Length tends to need 3 m or more, so &lt;strong&gt;cable quality (shielding, conductor)&lt;/strong&gt; moves the needle more than the generation does.&lt;/p&gt;
&lt;h2 id=&quot;comparison--hdmi-14--20--21&quot;&gt;Comparison — HDMI 1.4 / 2.0 / 2.1&lt;/h2&gt;
&lt;p&gt;Max resolution, refresh rate, and headline use case in one table.&lt;/p&gt;















































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Spec&lt;/th&gt;&lt;th&gt;HDMI 1.4&lt;/th&gt;&lt;th&gt;HDMI 2.0 / 2.0a&lt;/th&gt;&lt;th&gt;HDMI 2.1&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Max bandwidth&lt;/td&gt;&lt;td&gt;10.2 Gbps&lt;/td&gt;&lt;td&gt;18 Gbps&lt;/td&gt;&lt;td&gt;48 Gbps&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Max resolution&lt;/td&gt;&lt;td&gt;4K30Hz&lt;/td&gt;&lt;td&gt;4K60Hz&lt;/td&gt;&lt;td&gt;8K60Hz / 4K120Hz&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;HDR&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;td&gt;Yes (2.0a and later)&lt;/td&gt;&lt;td&gt;Yes (Dynamic HDR)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;VRR / ALLM&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Marketing name&lt;/td&gt;&lt;td&gt;High Speed&lt;/td&gt;&lt;td&gt;Premium High Speed&lt;/td&gt;&lt;td&gt;Ultra High Speed&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Typical use&lt;/td&gt;&lt;td&gt;Full HD TV / recorder&lt;/td&gt;&lt;td&gt;4K TV / 4K monitor&lt;/td&gt;&lt;td&gt;PS5 / Xbox Series X / 8K TV&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;length--pick-actual-run--a-little-slack&quot;&gt;Length — pick “actual run + a little slack”&lt;/h2&gt;
&lt;p&gt;Short version: too short and it won’t reach; too long and it sags and gets in the way. The practical sweet spot is &lt;strong&gt;the measured run plus 0.5–1 m of slack&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id=&quot;permanent-install--23-m&quot;&gt;Permanent install — 2–3 m&lt;/h3&gt;
&lt;p&gt;Wiring that runs behind a desk or down a wall is always longer than it looks. If your desk-side run measures 1.5 m, pick 2–3 m of cable.&lt;/p&gt;
&lt;h3 id=&quot;temporary-use--12-m&quot;&gt;Temporary use — 1–2 m&lt;/h3&gt;
&lt;p&gt;Plugging a laptop straight into a monitor puts the two devices close together. 1–2 m is enough.&lt;/p&gt;
&lt;h3 id=&quot;anything-past-5-m-needs-care&quot;&gt;Anything past 5 m needs care&lt;/h3&gt;
&lt;p&gt;HDMI works at long runs on paper, but &lt;strong&gt;4K60Hz / HDR signals start dropping out around the 5 m mark&lt;/strong&gt;. For long runs, look at optical fiber HDMI cables (Active Optical Cable, AOC).&lt;/p&gt;
&lt;h2 id=&quot;connector-shape--confirm-both-ends&quot;&gt;Connector shape — confirm both ends&lt;/h2&gt;
&lt;p&gt;Short version: HDMI connectors come in three shapes — &lt;strong&gt;Type A (standard) / Mini HDMI (Type C) / Micro HDMI (Type D)&lt;/strong&gt;. Before you buy, check the &lt;strong&gt;connector shape on both ends of the link&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Home gear is almost always Type A, but Mini / Micro show up in these cases:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Mirrorless cameras / camcorders — usually Mini or Micro&lt;/li&gt;
&lt;li&gt;Small laptops and 2-in-1s — Mini HDMI sometimes&lt;/li&gt;
&lt;li&gt;Action cameras — typically Micro HDMI&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There’s also more gear that uses &lt;strong&gt;DisplayPort or USB Type-C (DP Alt Mode) instead of HDMI&lt;/strong&gt;. A laptop with USB-C as the only video out won’t connect with an HDMI cable directly — you’ll need a USB-C to HDMI adapter.&lt;/p&gt;
&lt;h2 id=&quot;faq&quot;&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Q. If I buy an HDMI 2.1 cable, will my old gear get upgraded?&lt;/strong&gt;
A. No. HDMI only delivers a generation’s features when &lt;strong&gt;both endpoints and the cable&lt;/strong&gt; support it. Plug a 2.1 cable into an older TV and the TV is still the ceiling.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. How do I tell Premium High Speed apart from Ultra High Speed?&lt;/strong&gt;
A. By the certification label on the packaging. “Premium High Speed HDMI Cable” corresponds to HDMI 2.0 / 2.0a, and “Ultra High Speed HDMI Cable” corresponds to HDMI 2.1. A bare “4K compatible” tag without a label is no guarantee of bandwidth.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. What’s the difference between a 1,000-yen cable and a 5,000-yen one?&lt;/strong&gt;
A. Mostly conductor material, shielding thickness, and connector build. For Full HD or 4K60Hz, a certified cheap cable is fine, and the 5,000-yen difference only really shows up in &lt;strong&gt;long runs, 4K120Hz, 8K, or pro gear&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. Does the cable itself change input lag?&lt;/strong&gt;
A. Almost never. Video input lag is dominated by what the TV or monitor is doing internally, and a cable doesn’t usually add to it. For gaming, picking an HDMI 2.1 device with ALLM / VRR support matters more.&lt;/p&gt;
&lt;h2 id=&quot;picks-by-use-case&quot;&gt;Picks by use case&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;The picks below were chosen at the time of writing, with 2026 equivalents in the same band. Confirm the current generation at the time of purchase.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;4k60hz--hdr--hdmi-20-premium-high-speed&quot;&gt;4K60Hz / HDR — HDMI 2.0 Premium High Speed&lt;/h3&gt;
&lt;p&gt;For the everyday case of plugging a home 4K TV into a PC or game console, a certified Premium High Speed cable is the first pick. Around 2 m is enough.&lt;/p&gt;
&lt;h3 id=&quot;4k120hz--8k--vrr--hdmi-21-ultra-high-speed&quot;&gt;4K120Hz / 8K / VRR — HDMI 2.1 Ultra High Speed&lt;/h3&gt;
&lt;p&gt;If you want 120Hz out of a PS5, Xbox Series X, or current GPU, pick an Ultra High Speed certified cable.&lt;/p&gt;
&lt;h3 id=&quot;long-runs-past-5-m--optical-fiber-hdmi-aoc&quot;&gt;Long runs past 5 m — Optical Fiber HDMI (AOC)&lt;/h3&gt;
&lt;p&gt;Good for ceiling-mounted projectors in meeting rooms, or layouts where the TV and the AV rack are far apart. They cost more than copper at the same length, but they carry 4K60Hz / HDR cleanly.&lt;/p&gt;
&lt;h2 id=&quot;wrapping-up&quot;&gt;Wrapping up&lt;/h2&gt;
&lt;p&gt;Because HDMI cables look almost identical, just keeping &lt;strong&gt;version, length, and connector shape&lt;/strong&gt; in mind collapses the decision to something simple.&lt;/p&gt;
&lt;p&gt;Full HD: 1.4. 4K60Hz / HDR: 2.0. 4K120Hz, 8K, or VRR: 2.1. Length is the measured run plus 0.5–1 m, and confirm the connector on both ends. Stick to that and you avoid the “I bought it but it doesn’t deliver the picture quality” trap.&lt;/p&gt;
&lt;p&gt;If you’re unsure, the shortcut is to check the maximum resolution and refresh rate of the gear you already own first. A cable is a tool that lets the gear hit its limit — it cannot push past what the gear itself can do.&lt;/p&gt;
</content:encoded><category>reviews</category><category>PCPeripherals</category></item><item><title>How to pick a monitor arm — get VESA, load capacity, and the clamp right and you won&apos;t end up with a bad one</title><link>https://aulvem.com/blog/2021-03-22-monitor-arm/</link><guid isPermaLink="true">https://aulvem.com/blog/2021-03-22-monitor-arm/</guid><description>For anyone who wants to free up desk space and adjust monitor height freely, this piece walks through how to pick a monitor arm. Get three things right — VESA mount, load capacity, and mounting style (clamp) — and the price band doesn&apos;t really matter.</description><pubDate>Mon, 22 Mar 2021 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;2026 update&lt;/strong&gt;: ported from the old VuePress blog. The backbone — what to look at when picking an arm — still holds, but the product links and price ranges are anchored to 2021. Verify current model numbers and prices and swap to the latest equivalents.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Add a monitor arm and the desk surface opens up in one stroke. The space for papers and a drink comes back, and you can move the screen height to match how you’re sitting.&lt;/p&gt;
&lt;p&gt;The catch is the price range — anything from cheap to expensive — and a bad pick can lead to a screen that slowly droops, or, in the worst case, won’t mount at all. This piece narrows the call down to three things — VESA, load capacity, and mounting style — assuming you’ll use the arm for long PC sessions.&lt;/p&gt;
&lt;h2 id=&quot;the-short-answer--vesa-100100-15-the-load-clamp-mount&quot;&gt;The short answer — VESA 100×100, 1.5× the load, clamp mount&lt;/h2&gt;
&lt;p&gt;Short version: a monitor arm is hard to get wrong if it ticks these three boxes.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;VESA mount&lt;/strong&gt;: the monitor supports VESA 100×100 mm on the back&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Load capacity&lt;/strong&gt;: aim for &lt;strong&gt;1.5×&lt;/strong&gt; the monitor’s actual weight, with margin to spare&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mounting style&lt;/strong&gt;: clamp mount (clips onto the desk edge)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;On budget vs longevity: for the long haul, an Ergotron LX-class gas-spring arm (17,000–25,000 yen); for a short-term try, a cheaper gas-spring model (5,000–10,000 yen). Mechanical-spring arms and bolt-fixed budget models aren’t a great fit for “I’ll be moving it around.”&lt;/p&gt;
&lt;h2 id=&quot;what-a-monitor-arm-is-actually-for&quot;&gt;What a monitor arm is actually for&lt;/h2&gt;
&lt;p&gt;Short version: to free up the desk surface, and to move the screen height to fit your posture.&lt;/p&gt;
&lt;p&gt;The reason: a monitor on its base sits on a stand whose foot juts toward you and eats 30–50% of the desk depth. Swap to an arm and the front of the desk goes completely clear.&lt;/p&gt;
&lt;p&gt;Side benefits: it’s harder to topple in an earthquake, cable routing gets cleaner, and aligning multiple monitors gets easier. If you sit alone, head-on, those are bonuses — not the main reason to buy.&lt;/p&gt;
&lt;h2 id=&quot;vesa-mount-and-clamp-vs-grommet--terms-first&quot;&gt;VESA mount and clamp vs grommet — terms first&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;What “VESA mount” means&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The screw-hole standard on the back of a monitor. VESA 100×100 mm refers to four screw holes laid out at 100 mm horizontal and 100 mm vertical spacing. Most 22–27-inch monitors support this pattern.
At 32 inches and up, you sometimes hit VESA 200×200 mm or another size, so check the monitor’s spec sheet before you buy.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Clamp mount vs grommet mount&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Clamp mount&lt;/strong&gt;: clips the desktop from above and below, like a clip. Doesn’t scratch the surface, no tools needed. Needs roughly 5 cm of clearance behind the desk edge.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Grommet mount&lt;/strong&gt;: bolts through a hole drilled in the desk (or an existing cable hole). You can mount it anywhere on the surface, not just the edge — at the cost of needing a hole.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;Most home desks are fine with a clamp mount. Reach for grommet if you want the arm in the middle of the desk, or if your desk sits flush against a wall with no clearance for a clamp.&lt;/p&gt;
&lt;h2 id=&quot;mounting-style--clamp-is-the-safe-default&quot;&gt;Mounting style — clamp is the safe default&lt;/h2&gt;
&lt;p&gt;Short version: pick a clamp mount and you’ll almost never run into trouble on a home desk.&lt;/p&gt;
&lt;p&gt;The reason: no hole in the desktop means it works in a rental, and it travels well through moves and layout changes. Grommet mounts assume drilling, which leaves a permanent mark when you sell the desk.&lt;/p&gt;
&lt;h3 id=&quot;when-clamp-fits&quot;&gt;When clamp fits&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;A rental where you don’t want to modify the desktop&lt;/li&gt;
&lt;li&gt;A desk 65 cm deep or more (room for the clamp’s overhang)&lt;/li&gt;
&lt;li&gt;You want the monitor at the back edge of the desk&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Almost every home PC desk meets these conditions.&lt;/p&gt;
&lt;h3 id=&quot;when-grommet-fits&quot;&gt;When grommet fits&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;The desk already has a cable hole&lt;/li&gt;
&lt;li&gt;You want the desk flush against a wall (the clamp would foul the wall)&lt;/li&gt;
&lt;li&gt;You want the monitor closer to the center of the desk&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It’s more common on office desks and standing desks with built-in cable holes.&lt;/p&gt;
&lt;h2 id=&quot;load-capacity--15-the-monitors-actual-weight&quot;&gt;Load capacity — 1.5× the monitor’s actual weight&lt;/h2&gt;
&lt;p&gt;Short version: budget for &lt;strong&gt;1.5×&lt;/strong&gt; the monitor’s actual weight and the screen won’t droop later when the gas spring weakens.&lt;/p&gt;
&lt;p&gt;The reason: gas-spring arms rely on internal gas pressure to hold the weight. Run one near its upper limit and as the pressure drops over time, it can no longer hold the screen up. At the upper limit, you tend to hit “wait, when did the screen sag?” within six months to a year.&lt;/p&gt;
&lt;h3 id=&quot;rough-weights-by-size&quot;&gt;Rough weights by size&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;22–24 inches: 3–4 kg&lt;/li&gt;
&lt;li&gt;27 inches: 5–7 kg&lt;/li&gt;
&lt;li&gt;32 inches: 7–10 kg&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So 24 inches calls for an arm rated 5–6 kg or more, and 27 inches for 8–10 kg or more, to keep that 1.5× cushion.&lt;/p&gt;
&lt;h3 id=&quot;go-by-weight-not-size&quot;&gt;Go by weight, not size&lt;/h3&gt;
&lt;p&gt;Product specs often say something like “supports up to 27 inches,” but that’s a rough guide. Two 27-inch monitors can differ by 2× in weight, so always check the actual weight on the monitor’s spec sheet and match it against the arm’s load rating.&lt;/p&gt;
&lt;h2 id=&quot;movement-type--gas-spring-is-the-default&quot;&gt;Movement type — gas spring is the default&lt;/h2&gt;
&lt;p&gt;Short version: pick gas-spring if you’ll change height often. For fixed positions, mechanical spring or bolt-fixed is fine, but the price gap is only 1,000–2,000 yen, so gas-spring is the safer default.&lt;/p&gt;
&lt;p&gt;The reason: gas-spring arms move with one hand, mechanical-spring arms need finicky tension adjustment, and bolt-fixed arms need a tool. People who tell themselves “I won’t move it” usually end up wanting to change the height when their posture shifts — so something that moves easily lasts longer in practice.&lt;/p&gt;
&lt;h3 id=&quot;gas-spring--mechanical-spring--bolt-fixed&quot;&gt;Gas spring / mechanical spring / bolt-fixed&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Gas spring&lt;/strong&gt;: held by internal gas pressure. Moves with one hand. The most common type.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mechanical spring&lt;/strong&gt;: held by a metal spring. Cheaper than gas, but you tune the tension with an adjustment screw. Works if the weight matches the setting, but the screen weight changes mean re-tuning.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bolt-fixed&lt;/strong&gt;: joints locked with hex bolts. Set it once and don’t move it. Cheapest of the three, but a poor match for changing posture.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;price-bands-and-product-comparison&quot;&gt;Price bands and product comparison&lt;/h2&gt;
&lt;p&gt;Short version: the range runs 5,000 to 25,000 yen. Ergotron LX for the long haul, a cheap gas-spring for a short-term try, bolt-fixed for a static setup — those three slots cover most of it.&lt;/p&gt;






















































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Aspect&lt;/th&gt;&lt;th&gt;Ergotron LX class&lt;/th&gt;&lt;th&gt;Budget gas-spring&lt;/th&gt;&lt;th&gt;Mechanical spring&lt;/th&gt;&lt;th&gt;Bolt-fixed&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Price range&lt;/td&gt;&lt;td&gt;17,000–25,000 yen&lt;/td&gt;&lt;td&gt;5,000–10,000 yen&lt;/td&gt;&lt;td&gt;4,000–8,000 yen&lt;/td&gt;&lt;td&gt;3,000–6,000 yen&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Movement&lt;/td&gt;&lt;td&gt;Gas spring&lt;/td&gt;&lt;td&gt;Gas spring&lt;/td&gt;&lt;td&gt;Mechanical spring&lt;/td&gt;&lt;td&gt;Bolt-fixed&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Load capacity&lt;/td&gt;&lt;td&gt;up to 11 kg&lt;/td&gt;&lt;td&gt;up to 8 kg&lt;/td&gt;&lt;td&gt;up to 8 kg&lt;/td&gt;&lt;td&gt;up to 10 kg&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Ease of movement&lt;/td&gt;&lt;td&gt;One hand, light&lt;/td&gt;&lt;td&gt;Works one-handed but unit-to-unit variance&lt;/td&gt;&lt;td&gt;Needs tension tuning&lt;/td&gt;&lt;td&gt;Static&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Warranty&lt;/td&gt;&lt;td&gt;10 years (rated)&lt;/td&gt;&lt;td&gt;About 1 year (rated)&lt;/td&gt;&lt;td&gt;About 1 year&lt;/td&gt;&lt;td&gt;About 1 year&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Best fit&lt;/td&gt;&lt;td&gt;Planning to use 5+ years&lt;/td&gt;&lt;td&gt;Trying it out / short term&lt;/td&gt;&lt;td&gt;Same&lt;/td&gt;&lt;td&gt;Static, secondary setup&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;For long-term use, the warranty length and parts availability matter. Budget models tend to be “if the gas pressure dies, replace the whole arm.”&lt;/p&gt;
&lt;h2 id=&quot;recommended-monitor-arms-for-reference&quot;&gt;Recommended monitor arms (for reference)&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;The picks below are from 2021. Verify current model numbers and prices and swap to the latest equivalents.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;for-the-long-haul--ergotron-lx&quot;&gt;For the long haul — Ergotron LX&lt;/h3&gt;
&lt;p&gt;Gas-spring, rated to 11.3 kg, wide range of motion, long warranty. Around 20,000 yen up front, but if it sits on the same desk for five years or more, the per-year cost drops.&lt;/p&gt;





























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align:left&quot;&gt;Item&lt;/th&gt;&lt;th style=&quot;text-align:left&quot;&gt;Spec&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Movement&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Gas spring&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Load capacity&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;up to 11.3 kg (rated)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;VESA mount&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;75×75 / 100×100&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Mounting style&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Clamp / grommet (both)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Warranty&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;10 years (rated)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;for-a-short-term-try--amazon-basics-class-gas-spring&quot;&gt;For a short-term try — Amazon Basics class gas-spring&lt;/h3&gt;
&lt;p&gt;The Amazon Basics monitor arm, reputed to be the Ergotron LX OEM, is the headline pick. Around 10,000 yen, with load capacity and range of motion both more than enough.&lt;/p&gt;





























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align:left&quot;&gt;Item&lt;/th&gt;&lt;th style=&quot;text-align:left&quot;&gt;Spec&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Movement&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Gas spring&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Load capacity&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;up to 11.3 kg (rated)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;VESA mount&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;75×75 / 100×100&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Mounting style&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Clamp / grommet (both)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Warranty&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;1 year (rated)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;I’ve run a few equivalents over several years and never hit a fatal issue. If you’re going in with the “good enough” mindset, this band is plenty.&lt;/p&gt;
&lt;h2 id=&quot;faq&quot;&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Q. Can I use one with a monitor that doesn’t support VESA?&lt;/strong&gt;
A. Some makers sell VESA conversion adapters separately. But the stand mount on the back of a monitor is model-specific, and if no adapter exists for yours, you can’t really use it. The reliable move is to check the monitor’s spec sheet for VESA support before you buy.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. Will a clamp mount work on a thin desktop?&lt;/strong&gt;
A. The clamp lists a supported thickness range (for example, 10–60 mm). Too thin and the clamp won’t bite, so it ends up loose. Too thick and it won’t close. Measure the desktop and check the range.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. For dual monitors, should I pick a single arm that holds both screens?&lt;/strong&gt;
A. A one-arm dual-screen setup looks tidy, but the load capacity and range of motion get tight. For the long haul, two single arms side by side handle future swaps and single-screen use more gracefully.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. Will a monitor on an arm wobble?&lt;/strong&gt;
A. With the clamp tightened properly and a desktop of decent thickness and material (plywood or steel), typing-level vibration almost never shows. Very thin or hollow desktops do shake — swap the desk or move to a bolt-fixed arm.&lt;/p&gt;
&lt;h2 id=&quot;wrapping-up&quot;&gt;Wrapping up&lt;/h2&gt;
&lt;p&gt;A monitor arm is hard to get wrong, regardless of price band, as long as it ticks three boxes: VESA 100×100 mm support, load capacity at 1.5× the monitor’s actual weight, and a clamp mount.&lt;/p&gt;
&lt;p&gt;For the long haul, Ergotron LX-class is the realistic call; for a short-term try, an Amazon Basics-class gas-spring arm is enough. Mechanical-spring and bolt-fixed arms are on the table if you’ll keep the screen in one place.&lt;/p&gt;
&lt;p&gt;The cleaner order is: pick the monitor first, then match the arm to it. The monitor side of the call is covered in a separate piece (&lt;a href=&quot;https://aulvem.com/blog/2021-03-15-choose-monitor/&quot;&gt;How to pick a PC monitor — three things you can’t get wrong, plus one to taste&lt;/a&gt;).&lt;/p&gt;
</content:encoded><category>reviews</category><category>monitor</category></item><item><title>Picking a monitor panel by use case — IPS / VA / TN / OLED, and where each one fits</title><link>https://aulvem.com/blog/2021-03-21-monitor-panel/</link><guid isPermaLink="true">https://aulvem.com/blog/2021-03-21-monitor-panel/</guid><description>The IPS / VA / TN / OLED labels on monitor spec sheets, sorted across five axes: color, viewing angle, response time, price, and best-fit use case. IPS is the safe all-rounder for work and video; VA wins on price; TN suits competitive gaming; OLED is the call for film and HDR.</description><pubDate>Sun, 21 Mar 2021 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;2026 update&lt;/strong&gt;: ported from the old VuePress blog. The backbone — which panel fits which use case — still holds, but price bands and the spread of OLED have moved a lot since then. Treat the price figures as ballparks and verify the current market.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The letters that line up on a monitor spec sheet — IPS, VA, TN, OLED — get glossed over more often than not. Surprisingly few people can explain the difference cleanly.&lt;/p&gt;
&lt;p&gt;The axis for choosing one, though, is simple. If you want one screen that handles work and video without fuss, pick IPS. If price is the deciding factor, VA. If you want frame-by-frame response for competitive gaming, TN. If film and HDR are what you actually care about, OLED. This piece lays that out across five axes — color, viewing angle, response time, price, and best-fit use case — on one page.&lt;/p&gt;
&lt;h2 id=&quot;the-short-answer--pick-ips-when-in-doubt-another-panel-when-the-goal-is-clear&quot;&gt;The short answer — pick IPS when in doubt, another panel when the goal is clear&lt;/h2&gt;
&lt;p&gt;Short version: if you don’t know what to pick, IPS is the safe call. The color balance is good, the viewing angle is wide, and prices have come down to a comfortable range.&lt;/p&gt;
&lt;p&gt;That said, when the goal is clear, another panel is the right answer.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;IPS&lt;/strong&gt; — the all-rounder for work + video + light gaming. The default when in doubt&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;VA&lt;/strong&gt; — when price comes first, or for video with lots of dark scenes&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TN&lt;/strong&gt; — competitive use where FPS or fighting-game response is the priority&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OLED&lt;/strong&gt; — when HDR or a film-like image matters and budget allows&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The panel type sets the broad shape of the rest of the spec comparison, so locking this in first makes everything downstream faster.&lt;/p&gt;
&lt;h2 id=&quot;what-panel-type-means--liquid-crystal-vs-self-emitting&quot;&gt;What “panel type” means — liquid crystal vs self-emitting&lt;/h2&gt;
&lt;p&gt;Short version: the panel is the layer that produces the picture. LCDs (IPS / VA / TN) gate light from a backlight by twisting liquid-crystal molecules; OLED has each pixel emit its own light.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Term roundup&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;LCD panel&lt;/strong&gt;: backlight + liquid-crystal layer. Color comes from how the light is bent and let through&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;IPS (In-Plane Switching)&lt;/strong&gt;: drives the crystals horizontally. Strong on viewing angle and color&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;VA (Vertical Alignment)&lt;/strong&gt;: drives the crystals vertically. Strong on black levels&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TN (Twisted Nematic)&lt;/strong&gt;: drives the crystals by twisting them. Strong on response time and price&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OLED (Organic Light-Emitting Diode)&lt;/strong&gt;: organic EL. Each pixel emits its own light, so no backlight is needed and black is fully off&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;The three LCD types differ only in how the crystals are moved, but that one mechanical choice sets the color / viewing-angle / speed trade-off. OLED is a fundamentally different mechanism, so it sits in its own category.&lt;/p&gt;
&lt;h2 id=&quot;ips--the-all-rounder-pick-this-when-in-doubt&quot;&gt;IPS — the all-rounder; pick this when in doubt&lt;/h2&gt;
&lt;p&gt;Short version: nice color, wide viewing angle, prices have come down. The first candidate if one screen has to cover work + video + light gaming.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;IPS at a glance&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Color: good. Near-full sRGB coverage is standard&lt;/li&gt;
&lt;li&gt;Viewing angle: wide (170°+ on both axes, rated)&lt;/li&gt;
&lt;li&gt;Response time: average (5–8 ms is the norm; gaming variants list 1 ms)&lt;/li&gt;
&lt;li&gt;Price: middle. 23–27-inch panels in the 20,000–40,000-yen band are common&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;The weak spot is that blacks float a little in scenes that need strong contrast. In a fully dark room watching films, OLED has the edge; for ordinary daytime use in a lit room, it isn’t something you notice.&lt;/p&gt;
&lt;p&gt;“My first monitor,” “a remote-work screen,” or “I’ll also touch photo and light video editing” almost always lands on IPS.&lt;/p&gt;
&lt;h2 id=&quot;va--price-first-with-tight-blacks-for-video&quot;&gt;VA — price first, with tight blacks for video&lt;/h2&gt;
&lt;p&gt;Short version: often the cheapest in its size class, with strong black reproduction. A good fit for sitting in front of a screen alone and watching video.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;VA at a glance&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Color: average. Contrast ratio runs high (around 3000:1 is common, rated)&lt;/li&gt;
&lt;li&gt;Viewing angle: a little narrow. Color washes out at oblique angles&lt;/li&gt;
&lt;li&gt;Response time: medium to slow. Ghosting can show up in fast motion (without black-frame insertion)&lt;/li&gt;
&lt;li&gt;Price: cheap. Plenty of 23-inch options in the 10,000–20,000-yen range&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;Variants like MVA / AMVA have closed the viewing-angle gap with IPS in recent years. Even so, for a meeting screen where multiple people lean in, or a desk layout where the monitor sits at an angle to your eyes, IPS is easier to live with.&lt;/p&gt;
&lt;p&gt;If the budget is under 20,000 yen for one screen, the realistic shortlist tilts toward VA.&lt;/p&gt;
&lt;h2 id=&quot;tn--built-for-competitive-gaming-all-in-on-response-time&quot;&gt;TN — built for competitive gaming, all-in on response time&lt;/h2&gt;
&lt;p&gt;Short version: a panel that goes all-in on response time and a low price. The pick for FPS and fighting players who need frame-level response; for ordinary use, the weak color and viewing angle start to show.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TN at a glance&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Color: weak. Gamut coverage falls a notch below IPS and VA&lt;/li&gt;
&lt;li&gt;Viewing angle: narrow (especially vertically)&lt;/li&gt;
&lt;li&gt;Response time: fast (1 ms is the norm)&lt;/li&gt;
&lt;li&gt;Price: cheap. Plenty of gaming-feature models in the 20,000-yen band&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;“TN is dated” is a common line, but at 240 Hz / 360 Hz, TN is still very much in service for gaming. The honest framing is: it’s the panel for people willing to give up color to chase frames.&lt;/p&gt;
&lt;p&gt;The flip side is that long sessions of writing or spreadsheets get harder, because the narrow viewing angle forces you to hold one posture.&lt;/p&gt;
&lt;h2 id=&quot;oled--hdr-and-a-film-image-with-a-price-tag-and-burn-in-to-weigh&quot;&gt;OLED — HDR and a film image, with a price tag and burn-in to weigh&lt;/h2&gt;
&lt;p&gt;Short version: per-pixel self-emission means black goes fully off. If HDR gradation and cinema-style contrast are what you want, it’s the only real answer. The cost is several times an LCD, and burn-in is a real concern with long static content.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;OLED at a glance&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Color: very good. Near-full DCI-P3 coverage is standard&lt;/li&gt;
&lt;li&gt;Viewing angle: wide. Self-emission means little color shift off-axis&lt;/li&gt;
&lt;li&gt;Response time: very fast (a different axis from LCD response; pixel response is cited around 0.1 ms)&lt;/li&gt;
&lt;li&gt;Price: high. 27–32-inch panels mostly land in the 100,000–200,000-yen band&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;The thing to watch is burn-in. Static elements like the taskbar or window borders, left on screen for long stretches, can leave faint outlines behind. Recent models mitigate this with pixel shift and screensavers, but for office work that pins the same UI to the screen all day, it’s still not the right pick.&lt;/p&gt;
&lt;p&gt;This is the “for film and HDR” monitor, for buyers with the budget to spend on what they see.&lt;/p&gt;
&lt;h2 id=&quot;comparison--ips--va--tn--oled-across-five-axes&quot;&gt;Comparison — IPS / VA / TN / OLED across five axes&lt;/h2&gt;
&lt;p&gt;Short version: line them up by color, viewing angle, response time, price, and best-fit use case, and the panel that matches your priorities surfaces on its own.&lt;/p&gt;















































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Axis&lt;/th&gt;&lt;th&gt;IPS&lt;/th&gt;&lt;th&gt;VA&lt;/th&gt;&lt;th&gt;TN&lt;/th&gt;&lt;th&gt;OLED&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Color&lt;/td&gt;&lt;td&gt;Good&lt;/td&gt;&lt;td&gt;Average&lt;/td&gt;&lt;td&gt;Weak&lt;/td&gt;&lt;td&gt;Very good&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Viewing angle&lt;/td&gt;&lt;td&gt;Wide&lt;/td&gt;&lt;td&gt;A little narrow&lt;/td&gt;&lt;td&gt;Narrow&lt;/td&gt;&lt;td&gt;Wide&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Response time&lt;/td&gt;&lt;td&gt;Average to fast&lt;/td&gt;&lt;td&gt;Medium to slow&lt;/td&gt;&lt;td&gt;Fast&lt;/td&gt;&lt;td&gt;Very fast&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Price&lt;/td&gt;&lt;td&gt;Middle&lt;/td&gt;&lt;td&gt;Cheap&lt;/td&gt;&lt;td&gt;Cheap&lt;/td&gt;&lt;td&gt;High&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Best fit&lt;/td&gt;&lt;td&gt;Work + video all-rounder&lt;/td&gt;&lt;td&gt;Video-centric, price first&lt;/td&gt;&lt;td&gt;Competitive gaming&lt;/td&gt;&lt;td&gt;HDR / film&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Price and color tend to trade off. Viewing angle and response time are roughly where IPS and OLED have both. TN is the “fast and cheap” specialist; VA is the “black and cheap” specialist. That framing makes the table easier to hold in your head.&lt;/p&gt;
&lt;p&gt;The fine numerical differences — 1 ms vs 4 ms response, say — are hard to feel without competitive gaming in the mix. Use the table to lock in the broad shape, then compare individual models inside that band.&lt;/p&gt;
&lt;h2 id=&quot;picks-by-use-case--what-to-actually-buy&quot;&gt;Picks by use case — what to actually buy&lt;/h2&gt;
&lt;p&gt;Short version: if the use case is known, panel choice is settled by the chart below.&lt;/p&gt;








































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Use case&lt;/th&gt;&lt;th&gt;Panel&lt;/th&gt;&lt;th&gt;Why&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Work + video + occasional gaming&lt;/td&gt;&lt;td&gt;&lt;strong&gt;IPS&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;All-rounder. Good balance of viewing angle and color&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;One screen, as cheap as possible&lt;/td&gt;&lt;td&gt;&lt;strong&gt;VA&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Cheapest in its size class. Also pairs well with video&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;FPS / fighting-game competitive&lt;/td&gt;&lt;td&gt;&lt;strong&gt;TN&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Response time and price. Color is the trade&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Film / HDR / photo viewing&lt;/td&gt;&lt;td&gt;&lt;strong&gt;OLED&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Black levels and gamut. If the budget allows&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Photo / video editing&lt;/td&gt;&lt;td&gt;&lt;strong&gt;IPS (wide-gamut model)&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Check sRGB / DCI-P3 coverage in the spec sheet&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Adding a second display&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Same panel type as the first&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Color tone matches more easily when they sit side by side&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;For multi-monitor setups, different panel types render the same image with subtly different tones. If you’ll have two or more screens in front of you at work, you don’t have to match the brand — but &lt;strong&gt;match the panel type&lt;/strong&gt; and a lot of small friction goes away.&lt;/p&gt;
&lt;h2 id=&quot;faq&quot;&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Q. Where on the spec sheet do I find the panel type?&lt;/strong&gt;
A. Product pages list it under “panel type,” “display type,” or “panel format.” If it isn’t on the listing, the manufacturer’s official spec PDF is the safe place to confirm.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. Among “IPS” panels, do brands actually differ in quality?&lt;/strong&gt;
A. Yes. Even under the same “IPS” label, gamut coverage (sRGB / DCI-P3 percentages) and brightness vary widely model to model. Compare on the numbers in the spec column.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. How long does it take for OLED to burn in?&lt;/strong&gt;
A. It depends on usage. In an environment where the taskbar or an app UI sits in the same place for long stretches, faint outlines are cited as starting to appear in the several-hundred to several-thousand-hour range. For film-centric use it’s far less of a concern. If you’re worried, auto-hide taskbars and screensavers help reduce it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. Can a gaming monitor be IPS?&lt;/strong&gt;
A. Yes. 144 Hz and 240 Hz IPS models with 1 ms response listings have become common. Unless you’re competitive, an IPS gaming model that takes both color and speed is the more practical pick over TN.&lt;/p&gt;
&lt;h2 id=&quot;wrapping-up&quot;&gt;Wrapping up&lt;/h2&gt;
&lt;p&gt;Picking a panel is a question of what you prioritize. Want color and viewing angle balanced — IPS. Want the lowest price — VA. Want frame speed — TN. Want HDR and deep blacks — OLED.&lt;/p&gt;
&lt;p&gt;Before comparing fine numbers on a spec sheet, decide which of the four you’re leaning toward. Once that’s settled, what’s left is size, surface finish, and connectors.&lt;/p&gt;
&lt;p&gt;How to pick a monitor itself — size, surface finish, and so on — is covered in a separate piece. Read alongside this one, and the spec column on a product page starts reading at a glance.&lt;/p&gt;
</content:encoded><category>reviews</category><category>monitor</category></item><item><title>How to pick a gaming monitor — 144Hz, 1ms, and panel type cover 90% of the decision (2026 edition)</title><link>https://aulvem.com/blog/2021-03-20-gaming-monitor/</link><guid isPermaLink="true">https://aulvem.com/blog/2021-03-20-gaming-monitor/</guid><description>Picking a gaming monitor for PS5 and PC. Framed on four axes: refresh rate, response time, panel, and sync tech. For FPS and fighters, 144Hz / 1ms is the realistic floor; in 2026, 240Hz and OLED also enter the picture.</description><pubDate>Sat, 20 Mar 2021 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;2026 update&lt;/strong&gt;: ported from the old VuePress blog. The framework — refresh rate, response time, and panel — still holds, but as of 2026, 240Hz has dropped into the mainstream and OLED gaming monitors land around the 100,000-yen mark. Specific product links need to be verified and swapped to current models before this goes live.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;You want to refresh your monitor to match a PS5 or a recent PC title. But the spec sheet lines up “Hz,” “ms,” “IPS,” and “G-Sync,” and it is hard to tell which of them you should actually weigh.&lt;/p&gt;
&lt;p&gt;This piece frames a gaming monitor on four axes — refresh rate, response time, panel, and sync tech. By the end, the shape of the one model that fits your genre and budget should be visible.&lt;/p&gt;
&lt;h2 id=&quot;the-short-answer--for-fps-and-fighters-144hz--1ms--ips-is-the-realistic-floor&quot;&gt;The short answer — for FPS and fighters, 144Hz / 1ms / IPS is the realistic floor&lt;/h2&gt;
&lt;p&gt;Short answer: if you play speed-driven genres (FPS, fighters, competitive action), four things to check before you buy.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Refresh rate&lt;/strong&gt;: 144Hz or higher (consoles, PS5 included, cap at 120Hz in most cases)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Response time&lt;/strong&gt;: around GtG 1ms&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Panel&lt;/strong&gt;: IPS (balanced) / TN (fastest, cheapest) / OLED (top tier, expensive)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sync tech&lt;/strong&gt;: FreeSync (AMD) or G-Sync Compatible (NVIDIA)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Conversely, if you mostly play RPGs, simulations, or turn-based games, those numbers are overspec. A standard work-grade IPS monitor at 60Hz looks plenty good.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Key points&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Refresh rate &lt;strong&gt;144Hz or higher&lt;/strong&gt; (in 2026, 240Hz is the mainstream tier)&lt;/li&gt;
&lt;li&gt;Response time aim for &lt;strong&gt;GtG 1ms&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Panels: &lt;strong&gt;IPS&lt;/strong&gt; is the all-rounder, &lt;strong&gt;TN&lt;/strong&gt; for raw speed, &lt;strong&gt;OLED&lt;/strong&gt; if picture quality comes first&lt;/li&gt;
&lt;li&gt;On PC, always match &lt;strong&gt;FreeSync / G-Sync&lt;/strong&gt; to your GPU&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;the-terminology--hz-ms-freesync&quot;&gt;The terminology — Hz, ms, FreeSync&lt;/h2&gt;
&lt;p&gt;Short answer: the three terms on every spec sheet measure different things — smoothness, ghosting, and tearing prevention.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Gaming monitor terms&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Hz (refresh rate)&lt;/strong&gt;: how many times per second the screen is redrawn. At 144Hz, the panel updates 144 times a second. Higher numbers feel smoother and let you catch the opponent’s movement a moment sooner.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ms (response time / GtG)&lt;/strong&gt;: the time a pixel takes to switch from one mid-gray to another (“Gray to Gray”). The closer to 1ms, the less the trailing image (ghosting). Catalog figures and measured values can diverge.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;FreeSync / G-Sync (sync tech)&lt;/strong&gt;: a mechanism that aligns the GPU’s draw timing with the monitor’s refresh timing, so tearing (horizontal misalignment) and stuttering get suppressed. FreeSync came from AMD, G-Sync from NVIDIA, but the two have grown largely cross-compatible in recent years.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;refresh-rate--144hz-is-the-standard-in-2026-240hz-is-in-reach&quot;&gt;Refresh rate — 144Hz is the standard; in 2026, 240Hz is in reach&lt;/h2&gt;
&lt;p&gt;Short answer: for FPS and fighters, 144Hz is the realistic floor. In 2026, the 240Hz class has dropped to the 30,000–50,000-yen range, which makes it good value.&lt;/p&gt;
&lt;p&gt;The reason is that a higher refresh rate carries more information per second, which shortens the lag between an opponent’s move and your reaction. The jump from 60Hz to 144Hz is clearly noticeable to most people; the jump from 144Hz to 240Hz mostly matters to competitive players.&lt;/p&gt;
&lt;h3 id=&quot;moving-from-60hz-to-144hz-is-the-big-jump&quot;&gt;Moving from 60Hz to 144Hz is the big jump&lt;/h3&gt;
&lt;p&gt;Everyday monitors are almost all 60Hz. Lifting that to 144Hz, you feel the difference starting with the mouse cursor. In FPS, an “I saw where they were” window opens wider when you whip the view around.&lt;/p&gt;
&lt;h3 id=&quot;240hz-and-beyond-depends-on-genre-and-rig&quot;&gt;240Hz and beyond depends on genre and rig&lt;/h3&gt;
&lt;p&gt;To actually feel a 240Hz or 360Hz panel, the GPU has to push frames at that rate reliably. PS5 and Xbox Series X cap at 120Hz, so if console is your main platform, 144Hz is where the curve flattens.&lt;/p&gt;
&lt;h3 id=&quot;mind-the-cable-spec-too&quot;&gt;Mind the cable spec too&lt;/h3&gt;
&lt;p&gt;High refresh rates depend on the video cable spec. Driving 4K at 144Hz needs DisplayPort 1.4 or higher, or HDMI 2.1. An older HDMI 2.0 cable lacks the bandwidth and can drop back to 60Hz.&lt;/p&gt;
&lt;h2 id=&quot;response-time--aim-around-gtg-1ms&quot;&gt;Response time — aim around GtG 1ms&lt;/h2&gt;
&lt;p&gt;Short answer: for speed-driven genres, pick around GtG 1ms. Slower than that and ghosting shows up in fast-moving scenes.&lt;/p&gt;
&lt;p&gt;The reason is that a slow response leaves the previous frame’s pixels lingering into the next, smearing the opponent’s silhouette. In FPS, ghosting delays the read on which way the other player is facing.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Example of monitor ghosting — slow response times leave previous-frame pixels trailing behind&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-03-20-gaming-monitor/2021-03-20-Afterimage.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;h3 id=&quot;catalog-values-and-measured-values-can-diverge&quot;&gt;Catalog values and measured values can diverge&lt;/h3&gt;
&lt;p&gt;A “1ms (GtG)” spec can come back with measured values that vary by more than 2x depending on the mode. Cross-checking with measurements from review sites is the safe play.&lt;/p&gt;
&lt;h3 id=&quot;how-to-use-the-overdrive-setting&quot;&gt;How to use the overdrive setting&lt;/h3&gt;
&lt;p&gt;Most gaming monitors have an overdrive (OD) setting that forces faster pixel transitions. Crank it too far and you get reverse ghosting (overshoot), so starting from the middle preset that ships with the panel is the realistic move.&lt;/p&gt;
&lt;h2 id=&quot;panel-type--ips-is-the-standard-tn-is-the-fastest-oled-is-the-new-option&quot;&gt;Panel type — IPS is the standard, TN is the fastest, OLED is the new option&lt;/h2&gt;
&lt;p&gt;Short answer: as of 2026, the picks are IPS (balanced), TN (fastest and cheapest), and OLED (picture quality first).&lt;/p&gt;
&lt;p&gt;The reason is that panel type changes the balance of response time, viewing angle, color, and price by a lot. Even at the same 144Hz and 1ms, what you see and what you pay can differ sharply.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;How gaming monitor panel types differ in look&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-03-17-iilustration-monitor/2021-03-17-IPS-LCD.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;h3 id=&quot;ips--the-all-rounder-the-default-pick&quot;&gt;IPS — the all-rounder, the default pick&lt;/h3&gt;
&lt;p&gt;Strong on color vibrancy and viewing angle. Response time used to lag behind TN, but gaming-grade IPS (Fast IPS and similar) has closed in on the 1ms class and is now practical for FPS. The main price band is 30,000–70,000 yen.&lt;/p&gt;
&lt;h3 id=&quot;tn--fastest-and-cheapest-at-the-cost-of-picture-quality-and-viewing-angle&quot;&gt;TN — fastest and cheapest, at the cost of picture quality and viewing angle&lt;/h3&gt;
&lt;p&gt;Still in the top tier for response time and the lowest on price. The trade-off is dull colors and a shift in color when viewed from the side. Best for fixed solo play at the center of the desk.&lt;/p&gt;
&lt;h3 id=&quot;va--contrast-strong-not-a-competitive-pick&quot;&gt;VA — contrast-strong, not a competitive pick&lt;/h3&gt;
&lt;p&gt;Deep blacks make it a good fit for film and single-player RPGs. But response time trails IPS and TN, and dark-scene ghosting (black smear) is easier to spot, so it falls off the list for competitive play.&lt;/p&gt;
&lt;h3 id=&quot;oled--the-new-2026-option&quot;&gt;OLED — the new 2026 option&lt;/h3&gt;
&lt;p&gt;Gaming monitors with QD-OLED or WOLED panels have become widely available. Response time on the order of 0.03ms and effectively infinite contrast put picture quality well beyond LCDs. The main price band is 100,000–200,000 yen. Burn-in risk has not gone away, but more models now ship with serious warranty terms.&lt;/p&gt;
&lt;h2 id=&quot;freesync--g-sync--on-pc-always-match-to-your-gpu&quot;&gt;FreeSync / G-Sync — on PC, always match to your GPU&lt;/h2&gt;
&lt;p&gt;Short answer: if you play on PC, pick a monitor with the sync tech that matches your GPU brand.&lt;/p&gt;
&lt;p&gt;The reason is that when the GPU’s draw rate and the monitor’s refresh rate fall out of step, tearing (horizontal screen splits) and stuttering show up. Sync tech absorbs that automatically.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;NVIDIA GPU primary&lt;/strong&gt;: G-Sync or G-Sync Compatible&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AMD GPU primary&lt;/strong&gt;: FreeSync or FreeSync Premium&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dual-support panels&lt;/strong&gt;: more recent models support both, which is the safer pick if you might switch GPUs later&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;PS5 and Xbox support HDMI VRR, which is compatible with the FreeSync family.&lt;/p&gt;
&lt;h2 id=&quot;comparison-60hz-vs-144hz-vs-240hz&quot;&gt;Comparison: 60Hz vs. 144Hz vs. 240Hz+&lt;/h2&gt;















































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Aspect&lt;/th&gt;&lt;th&gt;60Hz (general use)&lt;/th&gt;&lt;th&gt;144Hz (gaming standard)&lt;/th&gt;&lt;th&gt;240Hz+ (competitive / latest gen)&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Target genre&lt;/td&gt;&lt;td&gt;RPG / office work&lt;/td&gt;&lt;td&gt;FPS / fighters in general&lt;/td&gt;&lt;td&gt;Competitive FPS / esports&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Smoothness&lt;/td&gt;&lt;td&gt;Standard&lt;/td&gt;&lt;td&gt;Clearly smoother&lt;/td&gt;&lt;td&gt;Small gap vs. 144Hz in practice&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GPU needed&lt;/td&gt;&lt;td&gt;Integrated GPU is fine&lt;/td&gt;&lt;td&gt;Mid-range or above&lt;/td&gt;&lt;td&gt;High-end GPU recommended&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;PS5 / Xbox fit&lt;/td&gt;&lt;td&gt;Fits&lt;/td&gt;&lt;td&gt;120Hz output gets real benefit&lt;/td&gt;&lt;td&gt;Overspec&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Price band (24-inch)&lt;/td&gt;&lt;td&gt;10,000–20,000 yen&lt;/td&gt;&lt;td&gt;30,000–50,000 yen&lt;/td&gt;&lt;td&gt;50,000–80,000 yen&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Panel options&lt;/td&gt;&lt;td&gt;Mainly IPS / VA&lt;/td&gt;&lt;td&gt;IPS / TN / VA&lt;/td&gt;&lt;td&gt;IPS / OLED&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;recommended-monitors--by-use-case&quot;&gt;Recommended monitors — by use case&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;The picks below were chosen at the time of writing (2021). In 2026, verify the successor or an equivalent in the same price band before linking.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;speed-first--tn-144hz&quot;&gt;Speed first — TN 144Hz&lt;/h3&gt;
&lt;p&gt;For competitive players who put response time above everything. Compromises on color in exchange for price and speed.&lt;/p&gt;









































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align:left&quot;&gt;Item&lt;/th&gt;&lt;th style=&quot;text-align:center&quot;&gt;Spec&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Size&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;23.6 inches&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Panel&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;TN&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Resolution&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;Full HD&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Surface&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;Non-glossy&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Response time&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;GtG 1ms&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Refresh rate&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;144Hz&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Sync tech&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;FreeSync&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;VESA mount&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;Yes&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;balanced--ips-144hz&quot;&gt;Balanced — IPS 144Hz&lt;/h3&gt;
&lt;p&gt;For a multi-genre player who runs both FPS and RPG. Holds onto viewing angle and color vibrancy while keeping response time in the practical range.&lt;/p&gt;









































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align:left&quot;&gt;Item&lt;/th&gt;&lt;th style=&quot;text-align:center&quot;&gt;Spec&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Size&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;23.8 inches&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Panel&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;IPS&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Resolution&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;Full HD&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Surface&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;Non-glossy&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Response time&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;GtG 1ms&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Refresh rate&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;144Hz&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Sync tech&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;FreeSync / G-Sync Compatible&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;VESA mount&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;Yes&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;picture-quality-first--oled-240hz-the-2026-option&quot;&gt;Picture quality first — OLED 240Hz (the 2026 option)&lt;/h3&gt;
&lt;p&gt;The upper tier, worth considering if the budget allows. Pairs picture quality with response time. WQHD or higher resolution is the realistic pairing.&lt;/p&gt;
&lt;h2 id=&quot;faq&quot;&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Q. Do 144Hz or 240Hz help on PS5?&lt;/strong&gt;
A. PS5 caps at 4K 120Hz or Full HD 120Hz over HDMI 2.1. It can’t output 144Hz or higher, but a 120Hz-capable monitor still pays off on supported titles. A model with VRR (HDMI VRR) also smooths out the stutter when the frame rate fluctuates.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. 4K at 144Hz or Full HD at 240Hz — which one?&lt;/strong&gt;
A. Pick by genre. If frame rate maps directly to win rate (competitive FPS), Full HD 240Hz. If story or action is the focus and you want image detail, 4K 144Hz. If you want both, WQHD at 165–240Hz is the middle path.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. Can I feel the difference between 1ms and 0.5ms response?&lt;/strong&gt;
A. Most people cannot. Cable spec, GPU output frame rate, and the monitor’s internal processing delay (input lag) move the felt difference more than the pixel transition does.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. Can a gaming monitor double for everyday use (work, browsing)?&lt;/strong&gt;
A. With no trouble. The smoothness of 144Hz is even felt while scrolling. That said, if you need accurate color for photo or video work, a calibration-capable dedicated monitor is a better fit.&lt;/p&gt;
&lt;h2 id=&quot;wrapping-up&quot;&gt;Wrapping up&lt;/h2&gt;
&lt;p&gt;Picking a gaming monitor gets easier when you frame it on four axes: refresh rate, response time, panel, and sync tech.&lt;/p&gt;
&lt;p&gt;For FPS and fighters, &lt;strong&gt;144Hz / GtG 1ms / IPS / FreeSync or G-Sync Compatible&lt;/strong&gt; is the realistic floor. In 2026, the 240Hz class has dropped into the mainstream, and if picture quality is the priority, an OLED gaming monitor is the upper-tier option.&lt;/p&gt;
&lt;p&gt;If your genres are mostly RPG or simulation, those numbers are overspec. Buying to fit the actual use case ends up being the most cost-efficient call.&lt;/p&gt;</content:encoded><category>reviews</category><category>monitor</category><category>gaming</category></item><item><title>A 4K monitor isn&apos;t for everyone — how to pick between 4K, WQHD, and FHD by use case</title><link>https://aulvem.com/blog/2021-03-19-four-k-monitor/</link><guid isPermaLink="true">https://aulvem.com/blog/2021-03-19-four-k-monitor/</guid><description>Four things to check before buying a 4K monitor — screen size, HDR, color coverage, panel type — plus the criteria for choosing 4K, WQHD, or FHD by use case.</description><pubDate>Fri, 19 Mar 2021 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;2026 update&lt;/strong&gt;: ported from the old VuePress blog and reshaped from a 2026 vantage point. 4K monitors are cheaper and more common than they were in 2021, but “should everyone buy 4K” still depends on the use case. Specific product links need to be swapped for current models before this goes live.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;“I want a 4K monitor, but I can’t figure out which one to pick.” “What’s the best 4K for the money?” I get asked some version of this often. The trouble is, the conversation usually jumps straight to comparing specific models before settling whether 4K is even the right call.&lt;/p&gt;
&lt;p&gt;This piece is the step before that — the lens for deciding whether 4K is what you actually want, and if it is, the four things to check.&lt;/p&gt;
&lt;h2 id=&quot;the-short-answer--4k-isnt-for-everyone-pick-by-use-case&quot;&gt;The short answer — 4K isn’t for everyone, pick by use case&lt;/h2&gt;
&lt;p&gt;Short answer: a 4K monitor is for people who do photo or video editing, watch 4K content, or want a wider workspace on a 28-inch-or-larger panel. For text-heavy work or light gaming, WQHD is the better value.&lt;/p&gt;
&lt;p&gt;Three reasons:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;You can’t feel the difference on a small panel&lt;/strong&gt; — at 27 inches or below, scaling becomes mandatory, and 4K’s pixel density gets thrown away&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GPU load jumps&lt;/strong&gt; — for games and real-time 3D, the rendering cost more than doubles going from FHD to 4K&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;You also need newer cables and ports&lt;/strong&gt; — HDMI 2.0a or DisplayPort 1.4 minimum, and older PCs can’t output it&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Conversely, 4K earns its keep when pixel density flows directly into the output — previewing photos at native resolution, checking 4K video footage 1:1, packing dense text onto a 28-inch-or-larger panel.&lt;/p&gt;
&lt;h3 id=&quot;what-4k-actually-means&quot;&gt;What 4K actually means&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;4K (UHD)&lt;/strong&gt;: 3840×2160 pixels. Double FHD (1920×1080) on each axis — four times the area. Note that “DCI 4K” (4096×2160, the cinema standard) is a different spec; almost every consumer monitor sold as 4K is the 3840×2160 UHD variant.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;comparison-how-4k-wqhd-and-fhd-differ&quot;&gt;Comparison: how 4K, WQHD, and FHD differ&lt;/h2&gt;
&lt;p&gt;Short answer: higher resolution gives you more workspace, but it also raises GPU requirements, monitor price, and how much you have to fight scaling.&lt;/p&gt;



































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Aspect&lt;/th&gt;&lt;th&gt;FHD (1920×1080)&lt;/th&gt;&lt;th&gt;WQHD (2560×1440)&lt;/th&gt;&lt;th&gt;4K (3840×2160)&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Day-to-day feel&lt;/td&gt;&lt;td&gt;No visible pixel grid at 24 inches. Fine for text-heavy work&lt;/td&gt;&lt;td&gt;Sweet spot at 27 inches. Runs at 100% scaling&lt;/td&gt;&lt;td&gt;28 inches or larger needed; below that, scaling is mandatory&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Price range (27-inch IPS)&lt;/td&gt;&lt;td&gt;20,000–30,000 yen&lt;/td&gt;&lt;td&gt;30,000–50,000 yen&lt;/td&gt;&lt;td&gt;50,000–80,000 yen&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GPU needed (gaming)&lt;/td&gt;&lt;td&gt;Entry-level GPU at 60fps&lt;/td&gt;&lt;td&gt;Mid-range required&lt;/td&gt;&lt;td&gt;High-end recommended&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Best fit&lt;/td&gt;&lt;td&gt;Writing, office work, light gaming&lt;/td&gt;&lt;td&gt;Programming, streaming, esports&lt;/td&gt;&lt;td&gt;Photo/video editing, large displays, film viewing&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Prices reflect my read of Japanese retail as of May 2026. They move with the exchange rate and product cycles, so check again at purchase time.&lt;/p&gt;
&lt;h2 id=&quot;four-things-to-check-when-picking-a-4k-monitor&quot;&gt;Four things to check when picking a 4K monitor&lt;/h2&gt;
&lt;p&gt;Short answer: once you’ve decided on 4K, check screen size, HDR support, color coverage, and panel type. The HDMI cable is a separate after-purchase trap worth knowing about.&lt;/p&gt;
&lt;p&gt;If any of those four are off, you end up with “I bought 4K but it doesn’t feel any different” — which is the failure mode this section is built to prevent. One at a time below.&lt;/p&gt;
&lt;h2 id=&quot;screen-size-4k-pays-off-at-28-inches-and-up&quot;&gt;Screen size: 4K pays off at 28 inches and up&lt;/h2&gt;
&lt;p&gt;Short answer: to get value from 4K’s pixel density, go 28 inches or larger. Below 27 inches you’re forced into scaling, and the upside thins out.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;A wide desktop with multiple windows showing how 4K density fills a large panel&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-03-19-four-k-monitor/2021-03-19-Large-monitor.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;p&gt;The reason: 4K packs four times FHD’s pixels, but on a physically small panel those pixels get so small the text becomes unreadable. You end up turning on OS-level scaling to bring it back to a legible size — and once scaled, the “more workspace” upside evaporates.&lt;/p&gt;
&lt;p&gt;A concrete example: a 24-inch 4K at 100% scaling has text too small for daily use. Push it to 150% and the effective resolution lands near WQHD — at which point WQHD would have been the simpler call.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Size target&lt;/strong&gt;: 28 to 32 inches for desktop use. Past 35 inches you start approaching living-room TV territory, which is too large for a close-up desk setup.&lt;/p&gt;
&lt;h3 id=&quot;note-laptop-displays-are-a-separate-conversation&quot;&gt;Note: laptop displays are a separate conversation&lt;/h3&gt;
&lt;p&gt;Picking 4K on a 13–15-inch laptop only makes sense if you’re after Retina-style sharpness for its own sake. The workspace doesn’t grow.&lt;/p&gt;
&lt;h2 id=&quot;hdr-useful-for-film-and-games-not-for-documents&quot;&gt;HDR: useful for film and games, not for documents&lt;/h2&gt;
&lt;p&gt;Short answer: HDR widens the brightness range, especially in dark scenes. It pays off for video and games; for document work, the benefit is thin.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;A side-by-side image showing shadow detail on an HDR monitor versus a non-HDR one&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-03-19-four-k-monitor/2021-03-19-HDR-monitor.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;p&gt;The reason: HDR (High Dynamic Range) handles a wider span between the darkest and brightest values than standard signal. The difference shows up in night-sky shots and in backlit scenes where bright and dark sit in the same frame.&lt;/p&gt;
&lt;p&gt;For example, on a non-HDR monitor a dark scene crushes to black and you can’t tell what’s on screen. On an HDR10 panel the same scene reads — you can make out the shape of objects in the shadows.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How to read the spec sheet&lt;/strong&gt;: look for “HDR10”, “HDR10+”, or “Dolby Vision”. No mention means no support. Be careful with “HDR Ready” or “HDR Compatible” — those only mean the monitor accepts an HDR signal, not that it can actually display HDR meaningfully.&lt;/p&gt;
&lt;h3 id=&quot;note-hdr-also-needs-os-and-content-support&quot;&gt;Note: HDR also needs OS and content support&lt;/h3&gt;
&lt;p&gt;Even with an HDR monitor, Windows HDR settings and the content itself both have to be HDR-aware. Miss either and the feature doesn’t engage.&lt;/p&gt;
&lt;h2 id=&quot;color-coverage-aim-for-90-or-higher-for-creative-work&quot;&gt;Color coverage: aim for 90% or higher for creative work&lt;/h2&gt;
&lt;p&gt;Short answer: for photo, video, or illustration, target sRGB 100% or roughly 90% on NTSC / Adobe RGB. For text work it doesn’t matter much.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;A side-by-side example showing color reproduction differences between a wide-gamut and a narrow-gamut monitor&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-03-17-iilustration-monitor/2021-03-17-Color-Reproducibility.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;p&gt;The reason: color coverage (the gamut) is the range of colors a monitor can actually display. On a low-gamut panel, what should be a vivid red or green comes out muted.&lt;/p&gt;
&lt;p&gt;A concrete example: editing photos on a cheap monitor that covers only sRGB 70% often results in “the version everyone else sees” being more saturated than what you edited. Reviewing on the wider-gamut side is the safer move.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How to read the spec sheet&lt;/strong&gt;: figures like “sRGB coverage 100%”, “Adobe RGB 90%”, or “NTSC 90%” expressed as percentages. No percentage listed usually means the panel isn’t wide-gamut.&lt;/p&gt;
&lt;h2 id=&quot;panel-type-ips-for-text-photo-and-video-tn-or-oled-for-competitive-gaming&quot;&gt;Panel type: IPS for text, photo, and video; TN or OLED for competitive gaming&lt;/h2&gt;
&lt;p&gt;Short answer: for general use, IPS is the default. Wide viewing angles, minimal color shift. Only consider TN or OLED when response time is the top priority for competitive games.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;A side-by-side comparison of viewing-angle behavior on IPS versus TN panels&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-03-17-iilustration-monitor/2021-03-17-IPS-LCD.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;p&gt;The reason: IPS holds its color when viewed off-axis, which is what you want for photo and video review. TN responds faster but has narrower angles and washed-out color. VA is strong on blacks but slower to respond.&lt;/p&gt;
&lt;p&gt;For example, in a dual-monitor setup with one panel angled inward, a TN monitor visibly shifts color across the screen depending on the angle. An IPS panel keeps the tone consistent across both.&lt;/p&gt;
&lt;h3 id=&quot;oled-has-become-a-real-option&quot;&gt;OLED has become a real option&lt;/h3&gt;
&lt;p&gt;In 2021 I’d have said OLED monitors barely existed. As of 2026 you can find 27-inch-class OLED desktop monitors in the 100,000-yen range. Blacks and response time beat IPS, but burn-in remains a risk — worth thinking about if you leave static text on screen for long stretches.&lt;/p&gt;
&lt;h2 id=&quot;the-trap-hdmi-cable-and-displayport-spec&quot;&gt;The trap: HDMI cable and DisplayPort spec&lt;/h2&gt;
&lt;p&gt;Short answer: for 4K HDR at 60Hz, you need HDMI 2.0a or higher, or DisplayPort 1.4 or higher. With an older cable, the signal silently drops back to FHD.&lt;/p&gt;
&lt;p&gt;The reason: HDMI and DisplayPort tie supported resolution, refresh rate, and color depth to the version of the spec. And cables don’t advertise their version on the outside.&lt;/p&gt;





















&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Signal&lt;/th&gt;&lt;th&gt;Required spec&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;4K 60Hz SDR&lt;/td&gt;&lt;td&gt;HDMI 2.0 / DisplayPort 1.2&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;4K 60Hz HDR&lt;/td&gt;&lt;td&gt;HDMI 2.0a / DisplayPort 1.4&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;4K 120Hz HDR&lt;/td&gt;&lt;td&gt;HDMI 2.1 / DisplayPort 1.4 (DSC)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Even the cable in the monitor box doesn’t always meet the spec the monitor itself is rated for. If colors look washed out or the resolution caps at FHD straight out of the box, suspect the cable and the PC’s output port before anything else.&lt;/p&gt;
&lt;h2 id=&quot;recommended-models-by-use-case&quot;&gt;Recommended models (by use case)&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;The picks below were selected when this article was written. From a 2026 vantage point, always verify the current successor or an equivalent model in the same price band before linking.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;srgb-100-for-text-and-photo-work--i-o-data-27-inch-4k&quot;&gt;sRGB 100%, for text and photo work — I-O DATA 27-inch 4K&lt;/h3&gt;
&lt;p&gt;Covers sRGB 100%, so it holds up for photo color checks. A 27-inch 4K with a matte finish, so desk-lamp reflections don’t get in the way. VESA-compatible for swapping onto a monitor arm.&lt;/p&gt;





































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align:left&quot;&gt;Spec&lt;/th&gt;&lt;th style=&quot;text-align:center&quot;&gt;Value&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Size&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;27 inches&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Panel type&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;ADS (IPS-equivalent)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Resolution&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;4K (3840×2160)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Surface&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;Matte&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Color coverage&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;sRGB 100%&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;HDR&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;HDR10&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;VESA&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;Yes&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;around-ntsc-90-for-video-and-film-editing--i-o-data-28-inch-4k&quot;&gt;Around NTSC 90%, for video and film editing — I-O DATA 28-inch 4K&lt;/h3&gt;
&lt;p&gt;NTSC 88%, tuned toward the video-editing gamut. The 28-inch size also lets 4K’s density actually breathe.&lt;/p&gt;





































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align:left&quot;&gt;Spec&lt;/th&gt;&lt;th style=&quot;text-align:center&quot;&gt;Value&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Size&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;28 inches&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Panel type&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;IPS&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Resolution&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;4K (3840×2160)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Surface&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;Matte&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Color coverage&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;NTSC 88%&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;HDR&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;HDR10&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;VESA&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;Yes&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;faq&quot;&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Q. Who actually needs a 4K monitor?&lt;/strong&gt;
A. People doing photo or video editing, watching 4K content, or wanting more workspace on a 28-inch-or-larger screen. For text-heavy work or competitive gaming, WQHD is enough.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. Do I need to use scaling on a 4K monitor?&lt;/strong&gt;
A. On both Windows and macOS, 4K at 27 inches or below all but requires 125–150% scaling. If you’re going to scale anyway, WQHD often looks cleaner out of the box.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. 21:9 ultrawide or 16:9 4K — which is better?&lt;/strong&gt;
A. If you want more horizontal workspace, a 21:9 WQHD-class panel (3440×1440) is easier to live with. If you want vertical room and pure pixel density, 16:9 4K. Pick by use case.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. Which HDMI cable should I use?&lt;/strong&gt;
A. HDMI 2.0a or higher for 4K HDR; HDMI 2.1 for 4K at 120Hz. The cable in the monitor box doesn’t always meet that spec, so check before you blame the monitor.&lt;/p&gt;
&lt;h2 id=&quot;wrapping-up&quot;&gt;Wrapping up&lt;/h2&gt;
&lt;p&gt;A 4K monitor is gear for people whose output benefits from pixel density. If that’s you, check four things — 28 inches or larger, HDR, around 90% color coverage, IPS — and you’ll land somewhere reasonable.&lt;/p&gt;
&lt;p&gt;If it’s not you, WQHD wins on price, GPU load, and avoiding the scaling fight. The starting question is less “should I buy 4K” and more “does my actual work want that density”.&lt;/p&gt;</content:encoded><category>reviews</category><category>monitor</category></item><item><title>How to pick a display tablet — decide on four things: 14–16 inch size, color gamut, response time, and parallax</title><link>https://aulvem.com/blog/2021-03-18-choose-lcd-tablet/</link><guid isPermaLink="true">https://aulvem.com/blog/2021-03-18-choose-lcd-tablet/</guid><description>Sorting out the choice between a display tablet, a pen tablet, and an iPad. If you settle on four points — 14–16 inch size, color gamut sized to your output, response time around 20ms, and a fully laminated panel for no parallax — you are unlikely to miss.</description><pubDate>Thu, 18 Mar 2021 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;2026 update&lt;/strong&gt;: ported from the old VuePress blog. The framework — what to look at when choosing — still holds, but the specific specs and price ranges are anchored to the 2021 market. Newer models have improved on the numbers, so check each manufacturer’s current spec sheet before buying. The numbers are the manufacturer’s published figures from the original writing; current official specs may differ.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Display tablets (LCD tablets, or “liquid tablets” in the Japanese shorthand) have become a much more realistic upgrade from a pen tablet over the last few years. Compared to the days when Wacom was the only serious option, XP-Pen and HUION have widened the field, and the price range now stretches in both directions.&lt;/p&gt;
&lt;p&gt;The problem is that more options make it harder to see which one to actually buy. This piece sorts out what to look at when picking a display tablet, and how it stacks up against a pen tablet and an iPad.&lt;/p&gt;
&lt;h2 id=&quot;the-short-answer--decide-on-four-things-size-color-gamut-response-time-and-parallax&quot;&gt;The short answer — decide on four things: size, color gamut, response time, and parallax&lt;/h2&gt;
&lt;p&gt;Short answer: a display tablet comes down to these four points. The rest of the spec sheet is nice-to-have.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Size&lt;/strong&gt;: 14–16 inches (the balance between drawing comfort and how much desk it eats)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Color gamut&lt;/strong&gt;: around Adobe RGB / NTSC 90% if you output to print, around sRGB 100% if you stay web-first&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Response time&lt;/strong&gt;: around 14–25 ms&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Parallax&lt;/strong&gt;: pick a fully laminated panel&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Put differently: whether the brand is Wacom, or whether the pen has 8192 pressure levels, does not move the needle the way these four do. Current-generation display tablets all ship with 8192 levels or more as a baseline.&lt;/p&gt;
&lt;h2 id=&quot;by-use-case--compare-against-a-pen-tablet-and-an-ipad-before-deciding&quot;&gt;By use case — compare against a pen tablet and an iPad before deciding&lt;/h2&gt;
&lt;p&gt;Short answer: a display tablet is not always the right answer. A pen tablet and an iPad each have things a display tablet does not.&lt;/p&gt;
&lt;h3 id=&quot;i-want-to-draw-like-on-paper--display-tablet&quot;&gt;”I want to draw like on paper” → display tablet&lt;/h3&gt;
&lt;p&gt;Putting the pen directly on the screen is the core value of a display tablet. The benefit is largest if you are coming from analog drawing, or if your work is line-heavy.&lt;/p&gt;
&lt;p&gt;The trade-off is cabling — a display tablet is not built to be carried around. Assume it lives on your desk permanently.&lt;/p&gt;
&lt;h3 id=&quot;cheaper-start-less-arm-fatigue--pen-tablet&quot;&gt;”Cheaper start, less arm fatigue” → pen tablet&lt;/h3&gt;
&lt;p&gt;A pen tablet (the kind with no screen) puts your hand and the screen in different places, which takes adjustment. Once you adjust, you can draw without lifting your arm, and long sessions are noticeably less tiring.&lt;/p&gt;
&lt;p&gt;The price is also a third to a fifth of a display tablet (comparing same brand and same size). If you are just starting out or working within a budget, a pen tablet is enough.&lt;/p&gt;
&lt;h3 id=&quot;i-want-to-draw-away-from-the-desk-and-i-already-have-an-ipad--ipad--apple-pencil&quot;&gt;”I want to draw away from the desk, and I already have an iPad” → iPad + Apple Pencil&lt;/h3&gt;
&lt;p&gt;An iPad plus Apple Pencil is, in practice, a display tablet you can carry. Procreate and Clip Studio Paint for iPad have matured considerably.&lt;/p&gt;
&lt;p&gt;The weak spot is software — some PC-only tools, like Photoshop, are not available in the same form. Fitting the iPad into a PC-based workflow takes extra steps.&lt;/p&gt;
&lt;h2 id=&quot;reading-the-spec-sheet--what-each-number-actually-does&quot;&gt;Reading the spec sheet — what each number actually does&lt;/h2&gt;
&lt;p&gt;Short answer: numbers on a spec sheet say very little in isolation. Read each one in terms of what it changes for your way of working.&lt;/p&gt;
&lt;h3 id=&quot;1416-inches-is-the-sweet-spot&quot;&gt;14–16 inches is the sweet spot&lt;/h3&gt;
&lt;p&gt;Bigger is easier to draw on, but desk footprint and price scale up roughly in proportion.&lt;/p&gt;

























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Size&lt;/th&gt;&lt;th&gt;Approx. width × height&lt;/th&gt;&lt;th&gt;Suits&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Up to 13 inches&lt;/td&gt;&lt;td&gt;~28 × 17 cm&lt;/td&gt;&lt;td&gt;Portable use, secondary machine&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;14–16 inches&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;~31 × 20 cm&lt;/td&gt;&lt;td&gt;Most illustration and manga work&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;21 inches and up&lt;/td&gt;&lt;td&gt;~47 × 27 cm&lt;/td&gt;&lt;td&gt;Commercial work, larger desks&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Under 13 inches gets cramped for long sessions. 21 inches and up means moving your arm more, and prices push past 100,000 yen.&lt;/p&gt;
&lt;h3 id=&quot;color-gamut-is-chosen-by-where-you-output&quot;&gt;Color gamut is chosen by where you output&lt;/h3&gt;
&lt;p&gt;Color gamut (Adobe RGB / NTSC / sRGB coverage) tells you how much of the real-world color range the panel can reproduce.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Output to print&lt;/strong&gt;: Adobe RGB or around NTSC 90%. The print color space is wider than sRGB, so if you do not match here, the file you deliver and the printed result will not line up&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Web and social mainly&lt;/strong&gt;: sRGB 100% is enough. An Adobe RGB panel viewing sRGB material can actually make colors look washed out&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;“Pick wide gamut when in doubt” is a common line, but if your output is web-first, it is over-spec.&lt;/p&gt;
&lt;h3 id=&quot;response-time-at-1425-ms-is-fine-for-drawing&quot;&gt;Response time at 14–25 ms is fine for drawing&lt;/h3&gt;
&lt;p&gt;Response time affects how quickly what you do with the pen reaches the screen.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Response time around 14–25 ms&lt;/li&gt;
&lt;li&gt;Report rate of 200 RPS or higher is standard on current models&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Older models slower than this turn drawing lag into wobbly lines.&lt;/p&gt;
&lt;h3 id=&quot;a-fully-laminated-panel-kills-parallax&quot;&gt;A fully laminated panel kills parallax&lt;/h3&gt;
&lt;p&gt;Parallax is the effect where there is a gap between the glass surface and the light-emitting layer, so the tip of the pen and the line on screen appear slightly offset.&lt;/p&gt;
&lt;p&gt;Models labeled “full lamination” or “laminated” have shrunk that gap to near-zero. Used units and very cheap models sometimes still skip the lamination, so check the spec section of the product page.&lt;/p&gt;
&lt;h2 id=&quot;comparison-display-tablet-vs-pen-tablet-vs-ipad&quot;&gt;Comparison: display tablet vs pen tablet vs iPad&lt;/h2&gt;
&lt;p&gt;Short answer: “desk-based with a paper feel” goes to the display tablet, “budget and long sessions” goes to the pen tablet, “portability” goes to the iPad.&lt;/p&gt;















































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Aspect&lt;/th&gt;&lt;th&gt;Display tablet&lt;/th&gt;&lt;th&gt;Pen tablet&lt;/th&gt;&lt;th&gt;iPad + Apple Pencil&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Price range&lt;/td&gt;&lt;td&gt;40,000–100,000 yen&lt;/td&gt;&lt;td&gt;10,000–30,000 yen&lt;/td&gt;&lt;td&gt;100,000 yen and up (body + pen)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Drawing feel&lt;/td&gt;&lt;td&gt;Directly on screen&lt;/td&gt;&lt;td&gt;Hand and screen separated&lt;/td&gt;&lt;td&gt;Directly on screen&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Portability&lt;/td&gt;&lt;td&gt;× Too many cables&lt;/td&gt;&lt;td&gt;△ The slab itself is light&lt;/td&gt;&lt;td&gt;◯&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Long sessions&lt;/td&gt;&lt;td&gt;Tiring (arm raised)&lt;/td&gt;&lt;td&gt;Easiest once you adjust&lt;/td&gt;&lt;td&gt;Depends on iPad weight&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Software&lt;/td&gt;&lt;td&gt;Full PC apps&lt;/td&gt;&lt;td&gt;Full PC apps&lt;/td&gt;&lt;td&gt;iPad versions only&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Up-front cost&lt;/td&gt;&lt;td&gt;Mid to high&lt;/td&gt;&lt;td&gt;Low&lt;/td&gt;&lt;td&gt;High&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;The strength of a display tablet is that you draw directly on the screen and still run your PC apps unchanged. It looks like the best of both worlds against a pen tablet and an iPad, but you pay for it in price and desk space.&lt;/p&gt;
&lt;h2 id=&quot;recommended-specs--the-156-inch-workhorse-class&quot;&gt;Recommended specs — the 15.6-inch workhorse class&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;The specs below were the configuration the author picked at the time of writing (2021). As of 2026, the same money buys equivalent or better; map these requirements onto a current model.&lt;/p&gt;
&lt;/blockquote&gt;





































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align:left&quot;&gt;Item&lt;/th&gt;&lt;th style=&quot;text-align:center&quot;&gt;Spec&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Size&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;15.6 inches&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Panel&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;IPS&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Resolution&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;Full HD (1920 × 1080)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Color gamut&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;NTSC 88%&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Response time&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;14 ms&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Lamination&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;Yes&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Tilt detection&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;Yes&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;This class hits all four requirements (size, color gamut, response time, parallax) while keeping price under control. The author uses a model in this configuration.&lt;/p&gt;
&lt;h2 id=&quot;faq&quot;&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Q. Does it have to be Wacom?&lt;/strong&gt;
A. No. Wacom is rated highly for stability and driver polish, but current XP-Pen and HUION models are in usable territory. It comes down to whether you can absorb the price difference, and how much you weigh support and warranty.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. Is upgrading from a pen tablet to a display tablet worth it?&lt;/strong&gt;
A. The “hand and screen don’t track” feeling goes away, which is a real win. On the other hand, drawing with your arm raised gets tiring on long days, and the cabling clutters the desk. If a pen tablet is not slowing your work down, there is no urgency to switch.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. How many pressure levels do I need?&lt;/strong&gt;
A. Current models are all roughly tied at 8192 levels or more. It is rarely the number that decides between two machines. Prioritize color gamut and parallax instead.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. If I have an iPad Pro, do I still need a display tablet?&lt;/strong&gt;
A. Depends on what you do. If your drawing finishes inside iPad apps, you do not need one. If you also run PC-only tools like Photoshop or After Effects, a display tablet’s tie-in to a PC workflow still earns its place.&lt;/p&gt;
&lt;h2 id=&quot;wrapping-up&quot;&gt;Wrapping up&lt;/h2&gt;
&lt;p&gt;The axis for picking a display tablet is four things: 14–16 inch size, color gamut chosen by where you output, response time around 14–25 ms, and a fully laminated panel to kill parallax. The rest of the spec differences do not move the drawing experience much.&lt;/p&gt;
&lt;p&gt;On top of that: “desk-based, running PC apps as-is” goes to a display tablet, “budget and arm fatigue” goes to a pen tablet, “portable” goes to an iPad. Pick by use case.&lt;/p&gt;
&lt;p&gt;There is a separate piece on picking a monitor for illustration; it is worth a look if you want to think about the display side at the same time.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Related: &lt;a href=&quot;https://aulvem.com/blog/2021-03-17-iilustration-monitor/&quot;&gt;How to pick a monitor for illustration&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>reviews</category><category>monitor</category><category>illustration</category></item><item><title>How to pick a monitor for illustration — three things to check: color gamut, panel type, and size</title><link>https://aulvem.com/blog/2021-03-17-iilustration-monitor/</link><guid isPermaLink="true">https://aulvem.com/blog/2021-03-17-iilustration-monitor/</guid><description>Picking a monitor for illustration work, narrowed to five points: color gamut (varies by use), panel type (IPS only), screen size (22–24 inches), surface finish (non-glossy), and VESA support.</description><pubDate>Wed, 17 Mar 2021 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;2026 update&lt;/strong&gt;: ported from the old VuePress blog. The framework — what to look at when choosing — still holds, but the product specs, prices, and tool UI are anchored to 2021. The specific product links need to be swapped to current models before publishing.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Pen tablet and display tablet prices have settled, and more people are pairing them with an external monitor. The trouble is that shelves at consumer electronics stores mix gaming and 4K HDR units in with everything else, and it is hard to tell which ones are aimed at illustration.&lt;/p&gt;
&lt;p&gt;This piece narrows the decision to five things to look at when picking a monitor for illustration work. Gaming and photo-retouching edge cases are dropped, and the focus is on long drawing sessions paired with a pen tablet or display tablet.&lt;/p&gt;
&lt;h2 id=&quot;the-short-answer--five-things-to-check-skip-gaming-and-4k-hdr&quot;&gt;The short answer — five things to check; skip gaming and 4K HDR&lt;/h2&gt;
&lt;p&gt;Short answer: for an illustration monitor, five things are enough — color gamut, panel, size, surface, and VESA. The high refresh rates and HDR aimed at gaming do not help with illustration work.&lt;/p&gt;
&lt;p&gt;The reason is that two axes matter for illustration: how the colors look, and how easily the eyes hold up over long sessions. Paying for motion smoothness (refresh rate) or contrast (HDR) does not raise the quality of your line work or color fills.&lt;/p&gt;
&lt;p&gt;Five points to check:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Color gamut&lt;/strong&gt;: depends on where you publish (web-first vs. print included)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Panel type&lt;/strong&gt;: IPS (or an equivalent like ADS)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Screen size&lt;/strong&gt;: 22–24 inches&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Surface finish&lt;/strong&gt;: non-glossy (matte)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;VESA support&lt;/strong&gt;: required if you use a monitor arm now or might later&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Put differently: a general-purpose monitor that does not advertise itself as “for illustration” is perfectly usable, as long as it ticks these five boxes.&lt;/p&gt;
&lt;h2 id=&quot;decide-the-color-gamut-by-who-you-draw-for&quot;&gt;Decide the color gamut by who you draw for&lt;/h2&gt;
&lt;p&gt;Short answer: target &lt;strong&gt;sRGB 100%&lt;/strong&gt; if you mostly publish online, or &lt;strong&gt;around Adobe RGB / NTSC 90%&lt;/strong&gt; if print is part of the workflow. Wider gamut is not automatically better.&lt;/p&gt;
&lt;p&gt;The reason is that the gamut on the viewer’s side is all over the map. If the audience is looking at sRGB-class phones and monitors, anything you draw in Adobe RGB largely lands as a compressed-to-sRGB version once it reaches them.&lt;/p&gt;
&lt;h3 id=&quot;web-first-srgb-100&quot;&gt;Web-first: sRGB 100%&lt;/h3&gt;
&lt;p&gt;For illustrations posted to the web, social media art, and stream thumbnails, it is realistic to assume the viewing environment is sRGB. If the spec sheet says “sRGB 100%”, or nothing in particular (standard color), that is enough.&lt;/p&gt;
&lt;h3 id=&quot;print-doujinshi-or-merchandise-around-adobe-rgb--ntsc-90&quot;&gt;Print, doujinshi, or merchandise: around Adobe RGB / NTSC 90%&lt;/h3&gt;
&lt;p&gt;Print is reproduced in CMYK, but a monitor with a gamut close to Adobe RGB makes it easier to spot differences during pre-submission checks. On the spec sheet, look for “Adobe RGB coverage around 90%” or “NTSC ratio around 90%”.&lt;/p&gt;
&lt;h3 id=&quot;if-you-also-use-a-display-tablet-split-the-roles&quot;&gt;If you also use a display tablet, split the roles&lt;/h3&gt;
&lt;p&gt;If you use a display tablet, put the higher-color-fidelity model on the tablet side and keep the desk-side external monitor in a regular sRGB tier. That split matches both the budget and the way most viewers will actually see the work.&lt;/p&gt;
&lt;h2 id=&quot;panel-type-ips-or-an-equivalent-like-ads&quot;&gt;Panel type: IPS (or an equivalent like ADS)&lt;/h2&gt;
&lt;p&gt;Short answer: for illustration work, go with an IPS panel. The viewing angles and color stability suit the long looking-at-the-screen of pen work.&lt;/p&gt;
&lt;p&gt;The reason is that TN panels are tuned for response time, and the color shifts noticeably when your eye line moves up or down. Resting a tablet on your lap, propping your chin on the hand holding the pen — when the color drifts under those postures, retouching judgments drift with it.&lt;/p&gt;
&lt;p&gt;The “ADS” panel used by I-O DATA and others has characteristics equivalent to IPS, so anything listed as “ADS / IPS-class” on the spec sheet is a candidate. VA panels lean toward contrast and suit photos and video; for the edge clarity of line work, IPS is easier to deal with.&lt;/p&gt;
&lt;h2 id=&quot;screen-size-2224-inches&quot;&gt;Screen size: 22–24 inches&lt;/h2&gt;
&lt;p&gt;Short answer: the 22–24 inch range is the mainstream tier and balances price, footprint, and working area.&lt;/p&gt;
&lt;p&gt;The reason is that 27 inches and up adds eye-line travel and tires the eyes faster, and the price steps up too. Below 21.5 inches the working area gets cramped, and putting palettes and a layer panel onscreen squeezes the drawing canvas.&lt;/p&gt;
&lt;p&gt;Rough physical sizes (assuming 16:9):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;23.8 inches: about 53 cm wide / 30 cm tall&lt;/li&gt;
&lt;li&gt;21.5 inches: about 48 cm wide / 27 cm tall&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Things to confirm before placement:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Is the desk at least &lt;strong&gt;monitor width + 5 cm&lt;/strong&gt; wide (some bezels are thick — leave headroom)&lt;/li&gt;
&lt;li&gt;Is the depth at least 20 cm, counting the stand’s foot&lt;/li&gt;
&lt;li&gt;Can you keep a viewing distance of 50–70 cm&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;surface-non-glossy-matte&quot;&gt;Surface: non-glossy (matte)&lt;/h2&gt;
&lt;p&gt;Short answer: pick non-glossy for long drawing sessions. Glossy surfaces catch room lighting and your own reflection, which gets in the way of judging lines.&lt;/p&gt;
&lt;p&gt;The reason is that illustration work means staring at the same screen for hours, and the tiny eye-line corrections forced by reflections add up to fatigue over a session.&lt;/p&gt;
&lt;p&gt;The upside of glossy is more vivid color and tighter blacks. That suits photo viewing and video, but the trade-off does not work for pen tablet work.&lt;/p&gt;
&lt;h2 id=&quot;vesa-support-the-prerequisite-for-a-monitor-arm&quot;&gt;VESA support: the prerequisite for a monitor arm&lt;/h2&gt;
&lt;p&gt;Short answer: if you use a monitor arm now, or might later, pick a model with a VESA mount. Without VESA support, you cannot retrofit an arm.&lt;/p&gt;
&lt;p&gt;The reason is that monitor arms mount to the VESA standard (commonly 100×100 mm). A non-VESA model with a built-in stand limits how freely you can reclaim desk space and adjust height.&lt;/p&gt;
&lt;p&gt;If you want the display tablet closer to you on the desk, lifting the external monitor on an arm makes the depth of the desk usable again.&lt;/p&gt;
&lt;h2 id=&quot;illustration-grade-vs-general-purpose-monitors&quot;&gt;Illustration-grade vs. general-purpose monitors&lt;/h2&gt;
&lt;p&gt;Here is what matters for illustration work side by side with what is common on general-purpose monitors.&lt;/p&gt;













































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Aspect&lt;/th&gt;&lt;th&gt;Recommended for illustration&lt;/th&gt;&lt;th&gt;Typical general-purpose / gaming&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Color gamut&lt;/td&gt;&lt;td&gt;sRGB 100% or above (Adobe RGB 90% if print is in scope)&lt;/td&gt;&lt;td&gt;About sRGB 95% is enough&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Panel type&lt;/td&gt;&lt;td&gt;IPS / ADS&lt;/td&gt;&lt;td&gt;TN (gaming) / VA (general) common&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Screen size&lt;/td&gt;&lt;td&gt;22–24 inches&lt;/td&gt;&lt;td&gt;24–27 inches&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Surface&lt;/td&gt;&lt;td&gt;Non-glossy&lt;/td&gt;&lt;td&gt;Glossy is on the menu&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Refresh rate&lt;/td&gt;&lt;td&gt;60 Hz is enough&lt;/td&gt;&lt;td&gt;144 Hz and up (gaming)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;HDR&lt;/td&gt;&lt;td&gt;Not needed&lt;/td&gt;&lt;td&gt;Useful for video and games&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;VESA support&lt;/td&gt;&lt;td&gt;Nice to have&lt;/td&gt;&lt;td&gt;Depends on the model&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;candidate-models-reference&quot;&gt;Candidate models (reference)&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;The models below were the reference picks at the time of writing. Always check successor models or equivalent units in the same price band.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;srgb-100-tier--philips-238-inch&quot;&gt;sRGB 100% tier — PHILIPS 23.8 inch&lt;/h3&gt;


































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align:left&quot;&gt;Item&lt;/th&gt;&lt;th style=&quot;text-align:center&quot;&gt;Spec&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Size&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;23.8 inches&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Panel&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;IPS&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Resolution&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;Full HD&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Surface&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;Non-glossy&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Color gamut&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;sRGB 102%&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;VESA&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;Supported&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;sRGB 102% / 23.8 inches / IPS / non-glossy — clears the five points.&lt;/p&gt;
&lt;h3 id=&quot;adobe-rgb--ntsc-90-tier--i-o-data-238-inch&quot;&gt;Adobe RGB / NTSC 90% tier — I-O DATA 23.8 inch&lt;/h3&gt;


































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align:left&quot;&gt;Item&lt;/th&gt;&lt;th style=&quot;text-align:center&quot;&gt;Spec&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Size&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;23.8 inches&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Panel&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;ADS (IPS-class)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Resolution&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;Full HD&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Surface&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;Non-glossy&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Color gamut&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;Adobe RGB 90%&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;VESA&lt;/td&gt;&lt;td style=&quot;text-align:center&quot;&gt;Supported&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Adobe RGB 90% / 23.8 inches / ADS / non-glossy. The pick if print is on the horizon.&lt;/p&gt;
&lt;h2 id=&quot;faq&quot;&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Q. Do I need a 4K monitor for illustration work?&lt;/strong&gt;
A. No. A piece drawn at Full HD does not gain resolution by being shown on a 4K display, and the UI shrinks enough that you end up scaling things back up. 4K pays off more for photo retouching and video editing; for pen tablet work centered on illustration, Full HD is plenty.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. Should I buy a color calibrator?&lt;/strong&gt;
A. If print submissions or commercial work are an ongoing part of the workflow, it goes on the candidate list. For hobby work or social-media-first publishing, an sRGB 100% monitor at factory settings is a fine starting point, and a calibrator can wait until you actually feel the need.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. Can I use a gaming monitor for illustration?&lt;/strong&gt;
A. If the panel is IPS, the surface is non-glossy, and the gamut is around sRGB 100%, it can pull double duty. The high refresh rate and fast response time do not raise illustration quality though, so the question becomes whether the price premium is worth it for you.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. Is drawing on a laptop’s built-in display unworkable?&lt;/strong&gt;
A. As a starting point, it is fine. But mobile-class built-in panels often have a narrow gamut (some models sit in the sRGB 60–70% range), and adding an external sRGB 100% monitor takes the wobble out of long-term color judgments.&lt;/p&gt;
&lt;h2 id=&quot;wrapping-up&quot;&gt;Wrapping up&lt;/h2&gt;
&lt;p&gt;For an illustration monitor, look at five things:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Color gamut decided by where you publish (sRGB 100% for the web / around Adobe RGB 90% if print is in scope)&lt;/li&gt;
&lt;li&gt;Panel: IPS / ADS&lt;/li&gt;
&lt;li&gt;Size: 22–24 inches&lt;/li&gt;
&lt;li&gt;Surface: non-glossy&lt;/li&gt;
&lt;li&gt;VESA support&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Gaming-grade 144 Hz, HDR, and 4K resolution contribute almost nothing to illustration quality. If you want to keep the price down, drop those and pick from the mainstream tier.&lt;/p&gt;
&lt;p&gt;If you use a display tablet, the cleanest split is to put the higher-color-fidelity model on the tablet side and keep the external monitor close to what the audience will actually see.&lt;/p&gt;
</content:encoded><category>reviews</category><category>monitor</category></item><item><title>How to pick a PC monitor — three things you can&apos;t get wrong, plus one to taste</title><link>https://aulvem.com/blog/2021-03-15-choose-monitor/</link><guid isPermaLink="true">https://aulvem.com/blog/2021-03-15-choose-monitor/</guid><description>Remote work pushed more people to add a PC monitor at home. Prices and specs sprawl, but for long office hours the call comes down to three things: panel type, size, and surface finish. Get those right and you won&apos;t end up with a bad one.</description><pubDate>Mon, 15 Mar 2021 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;2026 update&lt;/strong&gt;: ported from the old VuePress blog. The backbone — the three things to look at — still holds, but the product picks and price ranges are anchored to 2021. Verify current prices and model numbers, and swap the links to the latest equivalents.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Remote work settled in, and more people are adding a PC monitor at home. What sits on the shelves at electronics stores runs from under 10,000 yen to well past 100,000 yen, and it’s hard to tell what to compare against what.&lt;/p&gt;
&lt;p&gt;For long office-style use, the call comes down to three things: panel type, size, and surface finish. Built-in speakers belong in the “to taste” column, and most of the time you can skip them.&lt;/p&gt;
&lt;h2 id=&quot;the-short-answer--three-things-to-get-right-plus-one-to-taste&quot;&gt;The short answer — three things to get right, plus one to taste&lt;/h2&gt;
&lt;p&gt;Short version: you don’t need to compare brands or chase fine-grained specs. Tick these three boxes and you’re unlikely to end up with a monitor that gets in your way at work.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Panel type&lt;/strong&gt;: IPS (image quality) or VA (price)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Size&lt;/strong&gt;: 22–24 inches&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Surface finish&lt;/strong&gt;: matte (non-glare)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The “to taste” addition is &lt;strong&gt;whether the monitor has built-in speakers&lt;/strong&gt;. If shaving one cable off the desk matters, fine; if you care about sound, buying a separate speaker is the more honest call.&lt;/p&gt;
&lt;p&gt;Brand doesn’t matter much. The quality gap between makers has narrowed in recent years, and as long as you can handle the rare initial defect, the real-world impact is small.&lt;/p&gt;
&lt;h2 id=&quot;pick-the-panel-type-by-budget--va-or-ips&quot;&gt;Pick the panel type by budget — VA or IPS&lt;/h2&gt;
&lt;p&gt;Short version: VA if price comes first, IPS if you want the image to look better. Pick between these two and your panel-type decision is done for office use.&lt;/p&gt;
&lt;p&gt;The reason: most of what you actually notice about how a monitor looks comes from the panel type. Numbers like response time and color gamut don’t translate into a felt difference unless you game or edit photos.&lt;/p&gt;
&lt;p&gt;The price gap runs roughly 10,000–20,000 yen from VA to IPS. If you’d rather not gamble, IPS is the safer pick.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Comparison illustration of VA and IPS monitor panel types&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-03-15-choose-monitor/2021-03-15-Monitor-display-format.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;h3 id=&quot;va--cheap-with-deep-blacks&quot;&gt;VA — cheap, with deep blacks&lt;/h3&gt;
&lt;p&gt;VA tends to be the cheapest tier at any given size. Black levels are strong, which suits video with a lot of dark scenes.&lt;/p&gt;
&lt;p&gt;The weakness is viewing angle. Step off-axis and colors wash out, so it’s not a great fit for TV duty or for more than one person looking at the screen. Sitting alone, square to the panel, you won’t notice.&lt;/p&gt;
&lt;h3 id=&quot;ips--clean-color-wide-viewing-angle&quot;&gt;IPS — clean color, wide viewing angle&lt;/h3&gt;
&lt;p&gt;IPS holds color more reliably. Colors don’t fall apart when viewed from the side, which helps when more than one person is looking, or when the layout of your desk puts you at an angle to the monitor.&lt;/p&gt;
&lt;p&gt;It costs around 10,000–20,000 yen more than VA. If this is the screen you stare at all day for work, that markup is easy to feel.&lt;/p&gt;
&lt;h3 id=&quot;va-vs-ips-at-a-glance&quot;&gt;VA vs IPS at a glance&lt;/h3&gt;



































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Aspect&lt;/th&gt;&lt;th&gt;VA&lt;/th&gt;&lt;th&gt;IPS&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Price&lt;/td&gt;&lt;td&gt;Cheap&lt;/td&gt;&lt;td&gt;A bit higher&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Blacks&lt;/td&gt;&lt;td&gt;Deep&lt;/td&gt;&lt;td&gt;Average&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Viewing angle&lt;/td&gt;&lt;td&gt;Narrow (head-on)&lt;/td&gt;&lt;td&gt;Wide&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Color stability&lt;/td&gt;&lt;td&gt;Drifts a bit&lt;/td&gt;&lt;td&gt;Stable&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Best fit&lt;/td&gt;&lt;td&gt;One person head-on, price first&lt;/td&gt;&lt;td&gt;Work, multiple viewers, layout freedom&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;size--2224-inches-the-office-sweet-spot&quot;&gt;Size — 22–24 inches, the office sweet spot&lt;/h2&gt;
&lt;p&gt;Short version: 22–24 inches sits well on a desk and keeps text readable. Smaller gets cramped; bigger starts to crowd the desk.&lt;/p&gt;
&lt;p&gt;The reason: 22–24 inches lands at roughly 49–53 cm wide and 27–30 cm tall, which plays well with the depth of a typical PC desk. It’s also the size band offices and schools standardise on.&lt;/p&gt;
&lt;p&gt;Before you set it on your desk, measure the spot with about 5 cm of slack on top of the panel width. Recent models have thin bezels, but older models and business units can have thick ones, so always check the listed exterior dimensions on the product page.&lt;/p&gt;
&lt;h3 id=&quot;bigger-is-better-is-a-separate-question&quot;&gt;”Bigger is better” is a separate question&lt;/h3&gt;
&lt;p&gt;27 inches and up looks tempting because of the extra screen real estate. But sit too close and you’ll move your eyes more, not less, and it gets tiring. If your desk depth is under 60 cm, start at 24 inches and see how it feels.&lt;/p&gt;
&lt;h2 id=&quot;surface-finish--matte-non-glare&quot;&gt;Surface finish — matte (non-glare)&lt;/h2&gt;
&lt;p&gt;Short version: for office use, matte is the only sensible pick. Glossy panels pick up reflections from lights and windows, and long sessions wear on your eyes.&lt;/p&gt;
&lt;p&gt;The reason: a glossy surface reflects ambient light, which pushes you to crank the brightness. Higher brightness loads your eyes more. Phones use glossy screens because they’re built for short bursts outside, which is a different problem from sitting at a desk all day.&lt;/p&gt;
&lt;p&gt;Unless you’re doing final photo or video review at home, you’ll never regret picking matte.&lt;/p&gt;
&lt;h2 id=&quot;built-in-speakers--usually-unnecessary&quot;&gt;Built-in speakers — usually unnecessary&lt;/h2&gt;
&lt;p&gt;Short version: monitor speakers tend to sound mediocre. A laptop or external speaker is going to leave you happier.&lt;/p&gt;
&lt;p&gt;The reason: built-in speakers are constrained by how thin the chassis is, and at price-conscious tiers there’s not much room to tune them. For “I just need voices to come out” — meeting audio, for example — they’re fine. For sitting down with music or video, they’re weak.&lt;/p&gt;
&lt;h3 id=&quot;who-built-in-speakers-fit-and-who-they-dont&quot;&gt;Who built-in speakers fit, and who they don’t&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;You’d like one less cable on the desk; meeting audio is enough → built-in is fine&lt;/li&gt;
&lt;li&gt;You listen to music or video regularly and care about sound → skip built-in and buy a separate speaker&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A few-thousand-yen USB or Bluetooth speaker usually beats a built-in one.&lt;/p&gt;
&lt;h2 id=&quot;spec-targets-that-meet-the-criteria&quot;&gt;Spec targets that meet the criteria&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;These are not specific product names but spec targets — “pick a model that meets these.” Verify actual products and prices at purchase time.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;ips--23-inch-class&quot;&gt;IPS — 23-inch class&lt;/h3&gt;
&lt;p&gt;The entry-tier target that ticks 23-inch, IPS, and matte. If you want decent image quality without spending more than you need to, use this spec as your baseline.&lt;/p&gt;

































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align:left&quot;&gt;Item&lt;/th&gt;&lt;th style=&quot;text-align:left&quot;&gt;Spec&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Size&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;23 inches&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Panel type&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;IPS&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Resolution&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Full HD&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Surface&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Matte&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Speakers&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;None&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;VESA mount&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Not supported&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;No VESA mount, so if there’s any chance you’ll want a monitor arm later, look at a different model.&lt;/p&gt;
&lt;h3 id=&quot;va--236-inch-class&quot;&gt;VA — 23.6-inch class&lt;/h3&gt;
&lt;p&gt;23.6-inch, VA, matte, with VESA support. The target when you want to keep the price down and leave room to add a monitor arm later.&lt;/p&gt;

































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align:left&quot;&gt;Item&lt;/th&gt;&lt;th style=&quot;text-align:left&quot;&gt;Spec&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Size&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;23.6 inches&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Panel type&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;VA&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Resolution&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Full HD&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Surface&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Matte&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Speakers&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;None&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;VESA mount&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Supported&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;faq&quot;&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Q. Full HD or 4K?&lt;/strong&gt;
A. For office use at 23–24 inches, Full HD is plenty. 4K starts to earn its keep at 27 inches and up, but it brings display-scaling and GPU-load tradeoffs. For a first monitor, Full HD is the safer call.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. Are curved monitors good for work?&lt;/strong&gt;
A. They help if you sit alone, head-on, and want wide screen real estate or multiple windows side by side. For text-heavy office work the benefit is small and the price is higher. As a first monitor, flat is enough.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. Anything to watch when connecting to a laptop?&lt;/strong&gt;
A. Match the laptop’s video output (HDMI, DisplayPort, or USB-C) to the monitor’s input. A model that handles power and video over a single USB-C cable cuts down the clutter and feels noticeably tidier.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. Do I need a monitor arm?&lt;/strong&gt;
A. Not required, but it helps a lot when desk depth is shallow or when you want to adjust height. If there’s any chance you’ll add one later, pick a VESA-compatible monitor up front.&lt;/p&gt;
&lt;h2 id=&quot;wrapping-up&quot;&gt;Wrapping up&lt;/h2&gt;
&lt;p&gt;For an office-use PC monitor, three axes — panel type, size, and surface finish — get you most of the way there.&lt;/p&gt;
&lt;p&gt;VA if price comes first, IPS if image quality does. Size at 22–24 inches, surface matte. Built-in speakers are usually unnecessary; if you need sound, buying a separate speaker leaves you happier.&lt;/p&gt;
&lt;p&gt;People who care deeply about image quality, or who want to push response times for gaming, have their own way of choosing. Outside of those cases, these three things are enough to avoid the bad picks.&lt;/p&gt;
</content:encoded><category>reviews</category><category>monitor</category></item><item><title>Publishing a blog with VuePress — the 2021 roadmap, and the parts still worth keeping in 2026</title><link>https://aulvem.com/blog/2021-03-14-vuepress-blog-roadmap/</link><guid isPermaLink="true">https://aulvem.com/blog/2021-03-14-vuepress-blog-roadmap/</guid><description>The full roadmap from when I shipped a blog on VuePress 1.x + GitHub + Netlify + Onamae.com in 2021. Four layers — local dev, repo, hosting, custom domain — sliced in a way that still maps onto today&apos;s Astro / Cloudflare Pages stack.</description><pubDate>Sun, 14 Mar 2021 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;2026 update&lt;/strong&gt;: A post ported from the old VuePress blog. The procedural screenshots are from 2021, and the Netlify / Onamae.com UI has shifted since. VuePress 1.x itself isn’t suited to greenfield builds anymore, so the body has been rewritten in two layers: “a 2021 build record” and “the four-layer roadmap you can still reuse”.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In 2021, Aulvem’s precursor blog was built on VuePress 1.x, with the source kept on GitHub, builds and delivery handled by Netlify, and a custom domain bought through Onamae.com pointed at the whole thing. I worked through it while reading the usual “publish a blog for free” articles, but it took a while before the big picture of “what was happening where” clicked for me.&lt;/p&gt;
&lt;p&gt;This post leads with the thing my past self would have wanted first: the overall roadmap and the responsibility of each step. VuePress 1.x isn’t a serious option for new builds anymore, but the roadmap itself ports cleanly over to an Astro + Cloudflare Pages setup.&lt;/p&gt;
&lt;p&gt;The VuePress directory layout itself is split out into a separate post (&lt;a href=&quot;https://aulvem.com/blog/2021-03-01-vuepress-structure/&quot;&gt;VuePress/blog directory structure — a 2021 build note&lt;/a&gt;). This one focuses on “the sequence of getting the whole site published”, not “the contents of individual files”.&lt;/p&gt;
&lt;h2 id=&quot;the-short-answer--break-it-into-four-layers-and-clear-one-at-a-time&quot;&gt;The short answer — break it into four layers and clear one at a time&lt;/h2&gt;
&lt;p&gt;Short answer: the fastest way to get a VuePress blog live on a custom domain is to break the work into four layers — (1) local dev, (2) put the source on GitHub, (3) let Netlify auto-build and serve it, (4) delegate the Onamae.com nameservers to Netlify — and clear them one by one.&lt;/p&gt;
&lt;p&gt;The reason is separation of concerns. Cramming everything into one service makes it hard to tell where a failure occurred. Putting “write”, “store”, “build”, and “publish” on separate layers makes triage easier when something breaks.&lt;/p&gt;
&lt;p&gt;The whole picture looks 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;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;[Local PC]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   │ git push&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;[GitHub] ──── source of truth&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   │ webhook&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;[Netlify] ──── build &amp;amp; static delivery (xxx.netlify.app)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   │ DNS (nameserver delegation)&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;[Onamae.com domain]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   │ served on the custom domain&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;[Readers]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A caveat: these four layers aren’t VuePress-specific. Astro, Hugo, or any other SSG that converts Markdown to static HTML and serves it lines up the same way. The VuePress-specific parts only show up in the build commands of (1) and (3).&lt;/p&gt;
&lt;h2 id=&quot;glossary-ssg-and-jamstack--the-assumptions-this-roadmap-rests-on&quot;&gt;Glossary: SSG and Jamstack — the assumptions this roadmap rests on&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;SSG (Static Site Generator)&lt;/strong&gt;: A generic term for tools that convert Markdown or JSON to static HTML at build time. VuePress, Astro, Next.js (output:static), Hugo, and Jekyll all qualify. It pairs against the CMS pattern (WordPress and friends) where the server assembles the page dynamically per request.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Jamstack&lt;/strong&gt;: An acronym from JavaScript / APIs / Markup (pre-built static files). It refers to a setup where SSG-generated HTML sits on a CDN and any dynamic logic is supplied by external APIs. Netlify is hosting designed around this Jamstack assumption.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This roadmap only works because the output is “just static files”. The simplicity of “put the source on GitHub, let Netlify rebuild it and push it to a CDN” leans on the Jamstack premise.&lt;/p&gt;
&lt;h2 id=&quot;step-1--develop-and-write-the-vuepress-project-locally&quot;&gt;Step 1 — Develop and write the VuePress project locally&lt;/h2&gt;
&lt;p&gt;Short answer: in the local-development phase, write Markdown and Vue components with hot-reload via &lt;code&gt;vuepress dev src&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The reason is iteration speed. Fixing things locally is an order of magnitude faster than redeploying. Build times were short too, so an “edit while you write” workflow was realistic.&lt;/p&gt;
&lt;p&gt;Concretely, I developed against this layout.&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&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;├─ _posts                   Markdown for each article&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│  └─ category&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│     └─ page.md&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;└─ .vuepress&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   ├─ components            Article-side components (Vue)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   ├─ public                images and robots.txt&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   ├─ theme                 layouts / components / styles&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   ├─ config.js             VuePress core configuration&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   └─ enhanceApp.js         Vue plugin entry point&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A two-way split: &lt;code&gt;_posts/&lt;/code&gt; for articles, &lt;code&gt;.vuepress/&lt;/code&gt; for framework configuration and theme. The details are in &lt;a href=&quot;https://aulvem.com/blog/2021-03-01-vuepress-structure/&quot;&gt;VuePress/blog directory structure&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;A caveat: during development, &lt;code&gt;vuepress dev src --host 0.0.0.0 --port 8080&lt;/code&gt; lets you open the site from another device on the LAN to check the phone view. Markdown layouts tend to get sloppy if you only ever look at them on a desktop.&lt;/p&gt;
&lt;h2 id=&quot;step-2--create-a-github-repo-and-push-the-source&quot;&gt;Step 2 — Create a GitHub repo and push the source&lt;/h2&gt;
&lt;p&gt;Short answer: in the “push to GitHub” phase, create an empty repo, then push only the source from local with &lt;code&gt;git remote add&lt;/code&gt; and &lt;code&gt;git push -u origin main&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The reason is separating source from build output. Committing &lt;code&gt;dist/&lt;/code&gt; or &lt;code&gt;node_modules/&lt;/code&gt; bloats history and undermines the whole point of letting Netlify rebuild on its side.&lt;/p&gt;
&lt;p&gt;Concretely, I excluded the following via &lt;code&gt;.gitignore&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;node_modules/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;src/.vuepress/dist/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;src/.vuepress/.cache/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;src/.vuepress/.temp/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;.env&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;.env.local&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Netlify rebuilds the build output every time, so the repository only needs &lt;code&gt;src/&lt;/code&gt; and &lt;code&gt;package.json&lt;/code&gt; / &lt;code&gt;package-lock.json&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;A caveat: if you’re going public, don’t accidentally commit API keys or access tokens. At the time I went back and forth on whether to put secrets in GitHub Secrets or Netlify environment variables — the conclusion I landed on was “values only used at build time go on the Netlify side, and anything that could leak at runtime shouldn’t exist at all”.&lt;/p&gt;
&lt;h2 id=&quot;step-3--connect-the-repo-to-netlify-and-let-it-auto-build&quot;&gt;Step 3 — Connect the repo to Netlify and let it auto-build&lt;/h2&gt;
&lt;p&gt;Short answer: in the Netlify connection phase, go through Add new site → Import an existing project, pick the GitHub repo, and fill in the build command and publish directory.&lt;/p&gt;
&lt;p&gt;The reason is webhook-driven automation. Netlify detects each &lt;code&gt;git push&lt;/code&gt; to GitHub and re-runs &lt;code&gt;vuepress build&lt;/code&gt; against the latest source. The old “manual &lt;code&gt;npm run build&lt;/code&gt; then FTP to a server” flow disappears entirely.&lt;/p&gt;
&lt;p&gt;The concrete settings were these.&lt;/p&gt;

























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Setting&lt;/th&gt;&lt;th&gt;Value&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Branch to deploy&lt;/td&gt;&lt;td&gt;&lt;code&gt;main&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Build command&lt;/td&gt;&lt;td&gt;&lt;code&gt;vuepress build src&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Publish directory&lt;/td&gt;&lt;td&gt;&lt;code&gt;src/.vuepress/dist&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Node.js version&lt;/td&gt;&lt;td&gt;14.x (pinned via the &lt;code&gt;NODE_VERSION&lt;/code&gt; env var)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;After signing into Netlify, the flow looked roughly like this (UI as of 2021).&lt;/p&gt;
&lt;img width=&quot;600&quot; alt=&quot;The Netlify login screen as of 2021, with the GitHub sign-in button centered on the page.&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-03-06-netlify-setup/2021-03-06-Netlify-login.webp&quot; class=&quot;page-small-img&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;p&gt;Once you pick the repository, enter &lt;code&gt;vuepress build src&lt;/code&gt; and &lt;code&gt;src/.vuepress/dist&lt;/code&gt; in the build settings and the deploy kicks off.&lt;/p&gt;
&lt;img width=&quot;600&quot; alt=&quot;The Netlify build configuration screen, showing the Build command and Publish directory input fields.&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-03-06-netlify-setup/2021-03-06-Netlify-repository-setting.webp&quot; class=&quot;page-small-img&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;p&gt;A caveat: the first build often fails because of Node version mismatches. Pinning &lt;code&gt;NODE_VERSION&lt;/code&gt; to something like &lt;code&gt;14&lt;/code&gt;, or dropping a &lt;code&gt;.nvmrc&lt;/code&gt; at the repo root, cuts the accident rate. The detailed walkthrough lives in &lt;a href=&quot;https://aulvem.com/blog/2021-03-06-netlify-setup/&quot;&gt;Deploying a VuePress / static site to Netlify&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;step-4--buy-a-custom-domain-on-onamaecom&quot;&gt;Step 4 — Buy a custom domain on Onamae.com&lt;/h2&gt;
&lt;p&gt;Short answer: in the domain-purchase phase, search for the domain name you want, pick “do not use” for the server option, and check out. There’s no need to bundle a server contract.&lt;/p&gt;
&lt;p&gt;The reason is separation of concerns. Onamae.com’s job is “owning the domain”; hosting is Netlify’s job. You’ll usually be guided into bundling a server contract, but a Jamstack setup doesn’t need one.&lt;/p&gt;
&lt;p&gt;The actual screen looked like this.&lt;/p&gt;
&lt;img width=&quot;600&quot; alt=&quot;The Onamae.com homepage search form where you enter the domain name you want.&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-03-08-netlify-onamae/2021-03-08-onamae-search.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;p&gt;At the server selection step, pick “do not use” and proceed.&lt;/p&gt;
&lt;img width=&quot;600&quot; alt=&quot;The Onamae.com server selection screen with &apos;do not use&apos; selected.&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-03-08-netlify-onamae/2021-03-08-onamae-server-selection.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;p&gt;A caveat: always enable Whois privacy within its free tier — it keeps your personal information off the public Whois record. Renewal fees can be higher than the initial registration on some TLDs, so for long-term operation a standard TLD like .com / .net reads better later on.&lt;/p&gt;
&lt;h2 id=&quot;step-5--wire-netlify-and-onamaecom-together-by-delegating-nameservers&quot;&gt;Step 5 — Wire Netlify and Onamae.com together by delegating nameservers&lt;/h2&gt;
&lt;p&gt;Short answer: in the nameserver-delegation phase, on the Netlify side go through Add custom domain → Set up Netlify DNS, and paste the four nameservers it shows you into “Change nameservers” in Onamae.com Navi.&lt;/p&gt;
&lt;p&gt;The reason is to centralize DNS management on Netlify. Once you delegate nameservers, Netlify takes over A / CNAME records and SSL certificate issuance (Let’s Encrypt). You no longer have to write records yourself on the Onamae.com side.&lt;/p&gt;
&lt;p&gt;Open Domain settings from Netlify’s overview page.&lt;/p&gt;
&lt;img width=&quot;600&quot; alt=&quot;A Netlify site overview screen with a link to Domain settings visible near the middle.&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-03-08-netlify-onamae/2021-03-08-Netlify-overview.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;p&gt;Step through Add custom domain and you’ll eventually see the four assigned nameservers.&lt;/p&gt;
&lt;img width=&quot;600&quot; alt=&quot;A list of four nameservers assigned by Netlify, in the dnsX.pXX.nsone.net format.&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-03-08-netlify-onamae/2021-03-08-Netlify-custom-domains.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;p&gt;Sign in to Onamae.com Navi, open “Change nameservers” for the target domain, pick “use other nameservers”, and paste the four you noted down.&lt;/p&gt;
&lt;img width=&quot;600&quot; alt=&quot;The Onamae.com Navi &apos;change nameservers&apos; screen with Netlify&apos;s four nameservers pasted into the input fields.&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-03-08-netlify-onamae/2021-03-08-Onamae-name-server.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;p&gt;Propagation takes anywhere from a few minutes to about 48 hours. If the custom domain still doesn’t resolve after half a day, try accessing from a different network (mobile data, for example) to rule out DNS caching. The detailed caveats are split into &lt;a href=&quot;https://aulvem.com/blog/2021-03-08-netlify-onamae/&quot;&gt;Connecting an Onamae.com custom domain to Netlify&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;A caveat: once you’ve delegated, stop touching Onamae.com’s DNS records screen. Netlify DNS is now the source of truth, so subdomain additions and MX records for email should all happen in Netlify’s DNS Records UI.&lt;/p&gt;
&lt;h2 id=&quot;comparison-table--the-2021-vuepress-setup-vs-the-2026-astro-setup&quot;&gt;Comparison table — the 2021 VuePress setup vs. the 2026 Astro setup&lt;/h2&gt;
&lt;p&gt;The roadmap itself hasn’t changed, but the tools at each layer have rotated over the past five years. Aulvem itself has moved from VuePress to Astro.&lt;/p&gt;


















































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Layer&lt;/th&gt;&lt;th&gt;2021: VuePress setup&lt;/th&gt;&lt;th&gt;2026: Astro setup (current Aulvem)&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Local dev&lt;/td&gt;&lt;td&gt;VuePress 1.x + Node 14.x&lt;/td&gt;&lt;td&gt;Astro 5 + Node 20.x&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Article schema&lt;/td&gt;&lt;td&gt;frontmatter (untyped)&lt;/td&gt;&lt;td&gt;content collections + zod schema&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Git hosting&lt;/td&gt;&lt;td&gt;GitHub&lt;/td&gt;&lt;td&gt;GitHub&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;CI / build &amp;amp; delivery&lt;/td&gt;&lt;td&gt;Netlify&lt;/td&gt;&lt;td&gt;Cloudflare Pages&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Domain registrar&lt;/td&gt;&lt;td&gt;Onamae.com&lt;/td&gt;&lt;td&gt;Onamae.com or Cloudflare Registrar&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;DNS management&lt;/td&gt;&lt;td&gt;Netlify DNS&lt;/td&gt;&lt;td&gt;Cloudflare DNS&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;SSL certificate&lt;/td&gt;&lt;td&gt;Let’s Encrypt (auto-issued by Netlify)&lt;/td&gt;&lt;td&gt;Cloudflare-issued automatically&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Image delivery&lt;/td&gt;&lt;td&gt;served straight from Netlify&lt;/td&gt;&lt;td&gt;Cloudflare R2 + image optimization&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;The point isn’t that the newer side is “better” — it’s that the four-layer roadmap is unchanged and you only swap in different implementations per layer. The VuePress-to-Astro migration also progressed by carving things up layer-by-layer and replacing one at a time.&lt;/p&gt;
&lt;p&gt;A caveat: Netlify is still a valid choice in 2026, and if you’re leaning on its own features like Forms / Identity / Edge Functions it’s still a top pick. Which beats which between Netlify and Cloudflare Pages depends on the use case.&lt;/p&gt;
&lt;h2 id=&quot;faq&quot;&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Q. Is there any point in starting a blog on VuePress 1.x today?&lt;/strong&gt;
A. I wouldn’t recommend it as a first pick for a new blog. VuePress 1.x is effectively unmaintained, so timely vulnerability patches in dependencies are unlikely. For a Markdown-centric static blog, Astro + content collections or VitePress is a better return on your learning time. If you have a personal reason to stay on Vue, VitePress is the candidate to look at.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. Do GitHub and Netlify really need to be split?&lt;/strong&gt;
A. Generally yes. GitHub is the source of truth for source code; Netlify is the delivery layer for built HTML — different responsibilities, so if one goes down the other survives. Some services like GitHub Pages or Cloudflare Pages combine both, and in those cases it’s fine to centralize. The Pages-style options come with constraints on CI customization, though, so if you want fine-grained control over the build pipeline, splitting them is easier.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. Can you still publish if you put off buying the domain?&lt;/strong&gt;
A. Yes. Netlify hands out a free &lt;code&gt;xxx.netlify.app&lt;/code&gt; subdomain, so you can build and review content before paying for a custom domain. In practice, switching the domain over last is the safer order. Less chance of accidents that way than buying the domain first and then sitting on a long wait while you try to make the site work.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. If I were to build this in 2026, what would I swap in?&lt;/strong&gt;
A. My personal swap is VuePress to Astro, Netlify to Cloudflare Pages, and Onamae.com staying as-is (or moving to Cloudflare Registrar). The four roadmap layers — local dev, Git hosting, build and delivery, DNS — carry over unchanged. Put differently: if you only memorize the service names without internalizing the four layers, you’ll have to start over every time you move to a different service.&lt;/p&gt;
&lt;h2 id=&quot;closing&quot;&gt;Closing&lt;/h2&gt;
&lt;p&gt;In the end, the fastest path to publishing a VuePress blog on a custom domain was to separate “where you write”, “where it’s stored”, “where it’s built”, and “where it’s served” into different layers, and clear them one at a time.&lt;/p&gt;
&lt;p&gt;As of 2026 I don’t think many people are spinning up new VuePress 1.x builds. But the four-layer split — local, GitHub, build &amp;amp; delivery, DNS — is alive and well on an Astro + Cloudflare Pages stack today. The specific commands and screenshots age out, but the skeleton can be reused — I’m leaving this here as one example of that.&lt;/p&gt;
&lt;p&gt;Related: &lt;a href=&quot;https://aulvem.com/blog/2021-03-01-vuepress-structure/&quot;&gt;VuePress/blog directory structure — a 2021 build note&lt;/a&gt; / &lt;a href=&quot;https://aulvem.com/blog/2021-03-08-netlify-onamae/&quot;&gt;Connecting an Onamae.com custom domain to Netlify&lt;/a&gt; / &lt;a href=&quot;https://aulvem.com/blog/2021-03-06-netlify-setup/&quot;&gt;Deploying a VuePress / static site to Netlify&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>build</category><category>VuePress</category><category>Netlify</category><category>GitHub</category><category>domain</category></item><item><title>How to pick a laptop for blogging — a 50,000-yen entry model is enough; if you write away from home, weight and battery decide it</title><link>https://aulvem.com/blog/2021-03-13-blog-pc/</link><guid isPermaLink="true">https://aulvem.com/blog/2021-03-13-blog-pc/</guid><description>Picking a laptop to start a blog. Any model from the last five years will do, but three things matter: where you write, the keyboard layout, and the screen size.</description><pubDate>Sat, 13 Mar 2021 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;2026 update&lt;/strong&gt;: ported from the old VuePress blog. Product picks are anchored to 2021 models, so the affiliate links need to be re-checked against the current line-up. The framework — what to look at when choosing — still holds.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The first thing that trips people up when starting a blog is: which laptop should I buy? Writing only on a phone gets old fast, and using a company-issued machine for personal work is a non-starter.&lt;/p&gt;
&lt;p&gt;This piece walks through how to pick a laptop dedicated to blogging, using a single axis: do you write at home, or do you write on the move? By the end you should have a clear shape of the one machine that fits you.&lt;/p&gt;
&lt;h2 id=&quot;the-short-answer--almost-any-model-from-the-last-five-years-works-but-check-three-things&quot;&gt;The short answer — almost any model from the last five years works, but check three things&lt;/h2&gt;
&lt;p&gt;For blogging, you do not need a high-end CPU or a lot of RAM. Any laptop released in the last five years (counting from 2021) has more than enough headroom for writing.&lt;/p&gt;
&lt;p&gt;Three things to confirm before you buy:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Where you write&lt;/strong&gt;: mostly at home, or also on the move — this changes the weight and battery requirements&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Keyboard layout&lt;/strong&gt;: JIS (Japanese) layout — an English layout makes IME toggling clumsy&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Screen size&lt;/strong&gt;: 14 inches or more — anything under 12 inches makes long-form writing painful&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Put differently: if those three boxes are ticked, &lt;strong&gt;a 50,000-yen entry laptop is plenty&lt;/strong&gt; to write a blog on.&lt;/p&gt;
&lt;h2 id=&quot;where-you-write-changes-most-of-the-spec-sheet&quot;&gt;Where you write changes most of the spec sheet&lt;/h2&gt;
&lt;p&gt;Where you write decides about 90% of the choice.&lt;/p&gt;
&lt;p&gt;The reason is simple: carrying the laptop around adds two hard constraints — weight and battery life — and both push the price up. If you stay at home, the constraints are loose, and the same budget buys you more performance.&lt;/p&gt;
&lt;h3 id=&quot;writing-at-home-weight-and-battery-dont-matter&quot;&gt;Writing at home: weight and battery don’t matter&lt;/h3&gt;
&lt;p&gt;If home is the main writing spot, you can ignore both weight and battery life.&lt;/p&gt;
&lt;p&gt;That frees the budget for screen size and CPU. A 15-inch class with a Core i3 or i5 lands in the 50,000–70,000-yen range, which is a comfortable spot.&lt;/p&gt;
&lt;h3 id=&quot;writing-on-the-move-15-kg-or-lighter-12-hours-of-battery&quot;&gt;Writing on the move: 1.5 kg or lighter, 12+ hours of battery&lt;/h3&gt;
&lt;p&gt;On the move, weight and battery feed directly back into how much you actually get done.&lt;/p&gt;
&lt;p&gt;Rough targets:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Weight&lt;/strong&gt;: 1.5 kg or under (lighter still if you walk a lot)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Battery life&lt;/strong&gt;: 12 hours or more on the spec sheet&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Screen size&lt;/strong&gt;: 14 inches (the sweet spot between portability and working space)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Light models tend to cost 10,000–20,000 yen more than a heavier laptop with equivalent specs.&lt;/p&gt;
&lt;h2 id=&quot;always-confirm-the-keyboard-is-jis-japanese-layout&quot;&gt;Always confirm the keyboard is JIS (Japanese) layout&lt;/h2&gt;
&lt;p&gt;Cheap laptops sometimes ship with US-layout keyboards mixed in. Confirm the layout before you order.&lt;/p&gt;
&lt;p&gt;A US layout has no 全角/半角 key, which makes IME toggling a constant small friction. For long writing sessions it adds up.&lt;/p&gt;
&lt;p&gt;How to check:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The spec sheet says “JIS” or “日本語キーボード”&lt;/li&gt;
&lt;li&gt;The product photo shows a 全角/半角 key in the top-left of the keyboard&lt;/li&gt;
&lt;/ul&gt;
&lt;img width=&quot;800&quot; alt=&quot;A US-layout keyboard, with no 全角/半角 key in the top-left&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-03-13-blog-pc/2021-03-13-English-keyboard.webp&quot; loading=&quot;lazy&quot;/&gt;
&lt;h2 id=&quot;screen-14-inches-or-more-with-an-external-monitor-if-you-can&quot;&gt;Screen 14 inches or more, with an external monitor if you can&lt;/h2&gt;
&lt;p&gt;Anything below 12 inches gets painful for long-form writing. Set 14 inches as the floor.&lt;/p&gt;
&lt;p&gt;You end up juggling reference material, a preview pane, and the draft itself, often at the same time. On a cramped screen, just switching windows eats real minutes.&lt;/p&gt;
&lt;p&gt;If home is the main writing spot, a laptop plus an external monitor is the single biggest jump in feel. Reference material stays open on one screen, and the draft has room to breathe.&lt;/p&gt;
&lt;h2 id=&quot;picks-by-use-case&quot;&gt;Picks by use case&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;The models below were chosen in 2021. In 2026, verify the successor or an equivalent in the same price band before linking.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;writing-at-home--a-15-inch-entry-laptop&quot;&gt;Writing at home — a 15-inch entry laptop&lt;/h3&gt;
&lt;p&gt;A 15-inch entry model in the 50,000-yen range is the first pick. A Core i3 is enough — for writing work, you won’t feel the performance ceiling.&lt;/p&gt;
&lt;h3 id=&quot;writing-on-the-move--15-kg-14-inch-class&quot;&gt;Writing on the move — 1.5 kg, 14-inch class&lt;/h3&gt;
&lt;p&gt;Portability first. Around 1.5 kg, 14-inch screen, with a long battery life on the spec sheet.&lt;/p&gt;
&lt;h2 id=&quot;comparison-home-vs-on-the-go-laptop&quot;&gt;Comparison: home vs on-the-go laptop&lt;/h2&gt;



































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Aspect&lt;/th&gt;&lt;th&gt;Home&lt;/th&gt;&lt;th&gt;On the move&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Weight&lt;/td&gt;&lt;td&gt;Doesn’t matter&lt;/td&gt;&lt;td&gt;1.5 kg or under&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Battery&lt;/td&gt;&lt;td&gt;Short is fine&lt;/td&gt;&lt;td&gt;12 hours or more&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Screen size&lt;/td&gt;&lt;td&gt;15 inches preferred&lt;/td&gt;&lt;td&gt;14 inches&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Price range&lt;/td&gt;&lt;td&gt;50,000–70,000 yen&lt;/td&gt;&lt;td&gt;70,000–100,000 yen&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;External monitor&lt;/td&gt;&lt;td&gt;Adds real productivity&lt;/td&gt;&lt;td&gt;Not needed (you won’t carry one)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;faq&quot;&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Q. Can I blog on an iPad Pro?&lt;/strong&gt;
A. With a recent iPad Pro and an external keyboard, it’s doable. But once you account for the WordPress admin and image editing, a laptop is the safer long-term call.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. Mac or Windows?&lt;/strong&gt;
A. For blog writing alone, either is fine. Pick the OS you already use day to day — the smaller the context switch, the better.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. How much RAM do I need?&lt;/strong&gt;
A. 4 GB will technically run, but a browser with many tabs open starts swapping and things slow down. 8 GB is the safer floor.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. SSD or HDD?&lt;/strong&gt;
A. SSD, no contest. HDD models are slow to boot and slow to launch apps, and that drag wears on you daily.&lt;/p&gt;
&lt;h2 id=&quot;wrapping-up&quot;&gt;Wrapping up&lt;/h2&gt;
&lt;p&gt;For a blogging laptop, almost any model from the last five years will work.&lt;/p&gt;
&lt;p&gt;The decisions are three: home or on the move, the keyboard layout you actually type on, and a 14-inch-or-larger screen. With those settled, an entry-class machine in the 50,000–70,000-yen range carries a blog just fine.&lt;/p&gt;
&lt;p&gt;If there’s room in the budget for an external monitor, the home-based setup steps up a level on day-to-day productivity.&lt;/p&gt;</content:encoded><category>reviews</category><category>pc</category><category>blogging</category></item><item><title>PC cleaning with an air-duster can and an anti-static brush — Elecom ECO and Sanwa Supply brush review</title><link>https://aulvem.com/blog/2021-03-11-air-duster-brush/</link><guid isPermaLink="true">https://aulvem.com/blog/2021-03-11-air-duster-brush/</guid><description>Years of use with the Elecom Air Duster ECO and the Sanwa Supply anti-static cleaning brush. How they compare with electric air dusters and alcohol + cotton swabs, and a routine for cleaning the inside of a PC.</description><pubDate>Thu, 11 Mar 2021 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;2026 update&lt;/strong&gt;: Ported from the old VuePress blog. The Elecom Air Duster ECO and the Sanwa Supply anti-static cleaning brush are both still current products, though prices and model numbers may have shifted. The review angles here (the strengths and weaknesses of the can, where the anti-static brush helps, and how to choose between cans and an electric duster) still hold up.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Dust inside a PC or around a keyboard, left alone, eventually clogs fans, drives thermal throttling, and makes key presses catch. A quick clean once a month makes a real difference to how long the hardware lasts.&lt;/p&gt;
&lt;p&gt;This is a review of the &lt;strong&gt;Elecom Air Duster ECO&lt;/strong&gt; and the &lt;strong&gt;Sanwa Supply anti-static cleaning brush&lt;/strong&gt; — a combination I have been using for several years — compared against the three obvious alternatives: cans alone, electric dusters, and alcohol + cotton swabs.&lt;/p&gt;
&lt;h2 id=&quot;the-verdict--can--anti-static-brush-is-fast-and-cheap&quot;&gt;The verdict — “can + anti-static brush” is fast and cheap&lt;/h2&gt;
&lt;p&gt;Short answer: for a light clean once or twice a month, blowing the big dust away with an air-duster can and brushing the detail with an anti-static brush is the best time-to-result trade-off. An electric duster makes more sense if you clean weekly.&lt;/p&gt;
&lt;p&gt;The reasoning is straightforward. A can costs around 1,000 yen, so the entry cost is low, and the peak airflow often beats an electric duster. The anti-static brush lets you touch parts that can be damaged by static — CPU, memory, GPU PCBs — without worrying about it.&lt;/p&gt;
&lt;p&gt;You may want a different setup if any of these apply:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;You clean more than once a week&lt;/strong&gt;: the per-can cost starts to add up. An electric duster is cheaper over time&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;You are sensitive to the gas smell or the room is hard to ventilate&lt;/strong&gt;: switch to electric, or do it outside&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The grime is greasy — oil, fingerprints, tar&lt;/strong&gt;: air and bristles will not move it. You need anhydrous ethanol and cotton swabs alongside&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;elecom-air-duster-eco--the-package&quot;&gt;Elecom Air Duster ECO — the package&lt;/h2&gt;
&lt;p&gt;Short answer: a standard spray-can size, with a red nozzle and a cap in the box.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Elecom Air Duster ECO can, front&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-03-11-air-duster-brush/2021-03-11-Air-Duster-front.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;p&gt;I use it on the gaps between keys, inside a PC case, and at the vents of a laptop — anywhere a brush will not reach. At a roughly monthly cadence, one can lasts me about six months.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Elecom Air Duster ECO narrow nozzle&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-03-11-air-duster-brush/2021-03-11-Air-Duster-Nozzle.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;p&gt;The red narrow nozzle ships taped to the can’s label. It snaps on when you need to focus the airflow into a tight gap.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Elecom Air Duster ECO safety cap&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-03-11-air-duster-brush/2021-03-11-Air-Duster-cap.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;p&gt;A clear cap fits over the trigger button to prevent accidental firing inside a bag or drawer.&lt;/p&gt;
&lt;h2 id=&quot;elecom-air-duster-eco--what-worked&quot;&gt;Elecom Air Duster ECO — what worked&lt;/h2&gt;
&lt;p&gt;Short answer: strong airflow, and a price low enough that you do not hesitate to use it.&lt;/p&gt;
&lt;h3 id=&quot;strong-immediate-airflow&quot;&gt;Strong, immediate airflow&lt;/h3&gt;
&lt;p&gt;Pull the trigger and the air comes out in a single hard burst. Dust packed in keyboard gaps or around case fans clears in one short blast at close range.&lt;/p&gt;
&lt;p&gt;I also have an electric duster, and on peak airflow alone, the can still feels stronger (depends on model and remaining gas).&lt;/p&gt;
&lt;h3 id=&quot;cheap-enough-to-use-freely&quot;&gt;Cheap enough to use freely&lt;/h3&gt;
&lt;p&gt;At roughly 1,000 yen a can, I can blow away a stray clump of dust without thinking about it. Not having to mentally save it up “for a proper clean later” matters more than it sounds.&lt;/p&gt;
&lt;p&gt;Lower friction to start cleaning → higher cleaning frequency → longer hardware life. That feedback loop is the real value.&lt;/p&gt;
&lt;h2 id=&quot;elecom-air-duster-eco--what-didnt&quot;&gt;Elecom Air Duster ECO — what didn’t&lt;/h2&gt;
&lt;p&gt;Short answer: the gas smell lingers, and a single-use can means a running cost.&lt;/p&gt;
&lt;h3 id=&quot;the-gas-leaves-a-smell&quot;&gt;The gas leaves a smell&lt;/h3&gt;
&lt;p&gt;The propellant has a smell that hangs in the room for a while after use. Short bursts of one or two seconds are unnoticeable, but five seconds or more in a row and the smell builds up.&lt;/p&gt;
&lt;p&gt;In a well-ventilated room it is a non-issue. Late at night in an apartment building, full-power cleaning is harder to justify.&lt;/p&gt;
&lt;h3 id=&quot;running-cost-piles-up&quot;&gt;Running cost piles up&lt;/h3&gt;
&lt;p&gt;A can is one-and-done. Once a month, six months a can — manageable. Once a week works out to four to six cans a year. At 1,000 yen each, that is 4,000 to 6,000 yen annually. An electric duster (around 10,000 yen) pays for itself in roughly two years.&lt;/p&gt;
&lt;p&gt;I am still using cans, but if you clean heavily, the electric option is worth considering.&lt;/p&gt;
&lt;h2 id=&quot;sanwa-supply-anti-static-cleaning-brush--the-package&quot;&gt;Sanwa Supply anti-static cleaning brush — the package&lt;/h2&gt;
&lt;p&gt;Short answer: a brush with anti-static construction, with a large head on one end and a small head on the other. Often sold in packs of three.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Sanwa Supply anti-static cleaning brush, large-brush end&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-03-11-air-duster-brush/2021-03-11-Brush-Large-brush.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;p&gt;I use it to sweep dust off the inside of a PC. The handle is said to contain anti-static material that bleeds off any charge that builds up.&lt;/p&gt;
&lt;p&gt;CPU, memory, and GPU boards can be killed by static. On parts where you would normally hesitate to brush with a synthetic-fibre brush, an anti-static brush gives you enough confidence to actually do the work. It saves you from the folk-remedy approach of “strip down and build the PC in the bathroom” (only half-joking).&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Sanwa Supply anti-static cleaning brush, small-brush end&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-03-11-air-duster-brush/2021-03-11-Small-brush.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;p&gt;The opposite end has a smaller brush for narrow spots — between heatsink fins, behind the I/O shield, around the base of SATA connectors. Anywhere the large brush cannot fit, this end takes over.&lt;/p&gt;
&lt;h2 id=&quot;sanwa-supply-anti-static-cleaning-brush--what-worked&quot;&gt;Sanwa Supply anti-static cleaning brush — what worked&lt;/h2&gt;
&lt;p&gt;Short answer: the anti-static design makes it easier to touch boards, and the small-brush end reaches into places the large one cannot.&lt;/p&gt;
&lt;h3 id=&quot;confidence-near-sensitive-boards&quot;&gt;Confidence near sensitive boards&lt;/h3&gt;
&lt;p&gt;You hear about bent CPU pins and broken memory; you hear less about static damage, but it is not rare either. An anti-static brush takes the “should I really be touching this?” hesitation off the table.&lt;/p&gt;
&lt;p&gt;I have no way to measure how much risk it actually removes, but as insurance, it is worth keeping around.&lt;/p&gt;
&lt;h3 id=&quot;the-small-brush-reaches-narrow-spots&quot;&gt;The small brush reaches narrow spots&lt;/h3&gt;
&lt;p&gt;A PC’s interior is full of gaps too tight for a finger. The small brush is barely thicker than a toothpick, so the bristle tips can reach into heatsink fins and the base of connectors.&lt;/p&gt;
&lt;p&gt;It also picks out the wad-of-lint kind of dust that the air-duster can never quite blows free.&lt;/p&gt;
&lt;h2 id=&quot;sanwa-supply-anti-static-cleaning-brush--what-didnt&quot;&gt;Sanwa Supply anti-static cleaning brush — what didn’t&lt;/h2&gt;
&lt;p&gt;Short answer: the large brush end is a touch oversized.&lt;/p&gt;
&lt;h3 id=&quot;the-large-brush-is-bigger-than-i-want-inside-a-case&quot;&gt;The large brush is bigger than I want inside a case&lt;/h3&gt;
&lt;p&gt;Inside a PC case, a brush “a size or two smaller” would be easier to steer. Running it along a row of heatsinks on a motherboard, the bristle tips keep catching on the neighbouring connectors.&lt;/p&gt;
&lt;p&gt;For keyboard cleaning the large brush is fine, so it is more a “use it for the right thing” comment than a real complaint.&lt;/p&gt;
&lt;h2 id=&quot;comparison-can--anti-static-brush-vs-other-cleaning-methods&quot;&gt;Comparison: can + anti-static brush vs other cleaning methods&lt;/h2&gt;





























































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Angle&lt;/th&gt;&lt;th&gt;Can + anti-static brush (this pairing)&lt;/th&gt;&lt;th&gt;Alcohol + cotton swabs&lt;/th&gt;&lt;th&gt;Air-duster can alone&lt;/th&gt;&lt;th&gt;Electric air duster&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Initial cost&lt;/td&gt;&lt;td&gt;Around 2,000 yen&lt;/td&gt;&lt;td&gt;From around 500 yen&lt;/td&gt;&lt;td&gt;Around 1,000 yen&lt;/td&gt;&lt;td&gt;From around 10,000 yen&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Running cost&lt;/td&gt;&lt;td&gt;Disposable cans only&lt;/td&gt;&lt;td&gt;Consumables (swabs, ethanol)&lt;/td&gt;&lt;td&gt;Disposable cans&lt;/td&gt;&lt;td&gt;Electricity only&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Best on&lt;/td&gt;&lt;td&gt;Dry dust in general&lt;/td&gt;&lt;td&gt;Grease, fingerprints, tar&lt;/td&gt;&lt;td&gt;Dry coarse dust&lt;/td&gt;&lt;td&gt;Dry dust in general&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Anti-static&lt;/td&gt;&lt;td&gt;Yes (anti-static brush)&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;td&gt;Depends on model&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Noise&lt;/td&gt;&lt;td&gt;Hiss of the nozzle only&lt;/td&gt;&lt;td&gt;Quiet&lt;/td&gt;&lt;td&gt;Hiss of the nozzle only&lt;/td&gt;&lt;td&gt;Loud motor&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Environmental load&lt;/td&gt;&lt;td&gt;Discarded cans&lt;/td&gt;&lt;td&gt;Low&lt;/td&gt;&lt;td&gt;Discarded cans&lt;/td&gt;&lt;td&gt;Low (reused for the life of the unit)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Gas smell&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Alcohol smell&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;None&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;An electric air duster saves you the monthly cost of a can, at the price of a 10,000-yen initial outlay and noticeable motor noise. For a once-or-twice-a-month routine, cans are easier overall.&lt;/p&gt;
&lt;p&gt;Greasy grime — finger oils on keycaps, tar baked onto fans — does not move with air. You need a separate step with alcohol and cotton swabs, or anhydrous ethanol, to wipe it off.&lt;/p&gt;
&lt;h2 id=&quot;faq&quot;&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Q. Should I buy an air-duster can or an electric duster?&lt;/strong&gt;
A. If you clean once or twice a month, a can is enough. If you clean weekly, or you have other gear that wants cleaning (cameras, instruments, 3D printers) and you can do it outside, the electric option becomes a candidate. The running-cost break-even point lands around two to three years (depends on use).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. I hear electric dusters have weaker airflow than cans. True?&lt;/strong&gt;
A. It depends on the model and how full the can is. A fresh full can hits a higher peak airflow, but as you use it, evaporative cooling chills the can and the airflow tails off. An electric duster keeps a steady output, so for long cleaning sessions it can be the easier tool.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. Do anti-static brushes actually stop static?&lt;/strong&gt;
A. Not completely. They are designed to bleed off charge through the handle material, but they are not a guarantee. Pair them with the basics: touch a grounded metal surface to discharge yourself before handling boards, and avoid cleaning during dry mid-winter days.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. If I blow air into a running PC, will it spin the fans hard enough to damage them?&lt;/strong&gt;
A. Spinning a fan past its normal speed with airflow can wear the bearing. The standard trick is to hold the fan still — with a finger, or the brush handle — before you fire the duster. Do the same for CPU-cooler fans.&lt;/p&gt;
&lt;h2 id=&quot;verdict--a-reasonably-cheap-reasonably-safe-combination&quot;&gt;Verdict — a “reasonably cheap, reasonably safe” combination&lt;/h2&gt;
&lt;p&gt;Short answer: for a light monthly clean, the can + anti-static brush combination hits the right balance of time, cost, and safety. Hard to beat as a default.&lt;/p&gt;
&lt;p&gt;My internal-cleaning routine has settled into this:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Blow the big dust away with the air-duster can (hold the fans still with a finger)&lt;/li&gt;
&lt;li&gt;Sweep what’s left off with the large brush&lt;/li&gt;
&lt;li&gt;Finish into heatsink fins and around connectors with the small brush&lt;/li&gt;
&lt;li&gt;Wipe greasy or fingerprinted spots with anhydrous ethanol on a cotton swab&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Do this every month and the once-a-year deep clean comes around to “the inside isn’t really that dirty” — which is exactly the state you want.&lt;/p&gt;
&lt;p&gt;When cleaning frequency creeps up, move to an electric air duster. When greasy grime starts to dominate, add alcohol to the kit. Layer the tools as the workload grows.&lt;/p&gt;
</content:encoded><category>reviews</category><category>PCPeripherals</category></item><item><title>Logitech MX MASTER 2S review — the side wheel that fixes Excel horizontal scrolling</title><link>https://aulvem.com/blog/2021-03-09-logicool-mx-master-2s/</link><guid isPermaLink="true">https://aulvem.com/blog/2021-03-09-logicool-mx-master-2s/</guid><description>Six-plus months with the Logitech MX MASTER 2S at work. Strong on the side wheel and vertically stacked thumb buttons; weak on the gesture button&apos;s durability.</description><pubDate>Tue, 09 Mar 2021 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;2026 update&lt;/strong&gt;: Ported from the old VuePress blog. The MX MASTER 2S is an older model in 2026 — the current line is the MX Master 3S. The review angles here (side-wheel value, hand-size fit, gesture-button caveat) still hold up.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I used the Logitech MX MASTER 2S at work for over half a year. This is the write-up from that time, kept for reference.&lt;/p&gt;
&lt;p&gt;It is the kind of mouse that feels expensive on the shelf — around 9,400 yen at the time of writing. If you spend your days in Excel or creative tools, the productivity gain pays the difference back.&lt;/p&gt;
&lt;h2 id=&quot;the-verdict--buy-it-if-you-live-in-excels-horizontal-axis&quot;&gt;The verdict — buy it if you live in Excel’s horizontal axis&lt;/h2&gt;
&lt;p&gt;Short answer: the side wheel makes horizontal scrolling so easy it becomes invisible. If you scroll vertically and horizontally all day in Excel or design tools, the price is justified.&lt;/p&gt;
&lt;p&gt;The reason is mechanical. Operations that normally cost a “Shift + wheel” combo, or a drag to the edge of the window, collapse into a single flick of the side wheel. Multiply that by the hundreds of times a day you scroll, and the one-or-two-second saving adds up.&lt;/p&gt;
&lt;p&gt;A few cautions before buying:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Smaller hands&lt;/strong&gt;: the MX MASTER 2S is a large mouse, and there is only one size&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Heavy gaming use&lt;/strong&gt;: there is a known durability issue with the gesture button (covered below)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;build-and-feel&quot;&gt;Build and feel&lt;/h2&gt;
&lt;p&gt;Short answer: a sculpted, monochrome body with a distinctive front taper. It looks like a premium tool, not a peripheral.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Logitech MX MASTER 2S, top view&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-03-09-logicool-mx-master-2s/2021-03-09-Logicool-MX-MASTER-2S-upward.webp&quot; loading=&quot;lazy&quot;/&gt;
&lt;p&gt;From the side it reads like a horizontal “H” — you grip it between thumb and pinky rather than draping your hand over it.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Logitech MX MASTER 2S, underside&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-03-09-logicool-mx-master-2s/2021-03-09-Logicool-MX-MASTER-2S-back.webp&quot; loading=&quot;lazy&quot;/&gt;
&lt;p&gt;The underside holds the power switch and a device-pair toggle. It pairs with up to three devices.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Logitech MX MASTER 2S, left side&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-03-09-logicool-mx-master-2s/2021-03-09-Logicool-MX-MASTER-2S-left.webp&quot; loading=&quot;lazy&quot;/&gt;
&lt;p&gt;The left flank carries the thumb rest with the gesture button, the side wheel, and two vertically stacked thumb buttons. Charging is over micro-USB Type-B — one of the model’s few real weak points.&lt;/p&gt;
&lt;h2 id=&quot;what-worked&quot;&gt;What worked&lt;/h2&gt;
&lt;p&gt;Short answer: the side wheel is the headline. The shape and the button layout are quiet upgrades on every other mouse I had used.&lt;/p&gt;
&lt;h3 id=&quot;the-side-wheel--excel-horizontal-scrolling-in-one-flick&quot;&gt;The side wheel — Excel horizontal scrolling in one flick&lt;/h3&gt;
&lt;p&gt;This is the single biggest difference from any other mouse. A &lt;strong&gt;dedicated horizontal-scroll wheel&lt;/strong&gt; sits on the left flank.&lt;/p&gt;
&lt;p&gt;Horizontal pans in Excel, canvas panning in Figma, timeline scrubbing in a video editor — all of them resolve to one finger, no keyboard modifier.&lt;/p&gt;
&lt;h3 id=&quot;thumb-buttons-stacked-vertically-easy-to-press&quot;&gt;Thumb buttons stacked vertically, easy to press&lt;/h3&gt;
&lt;p&gt;Most mice put the thumb buttons in a front-back layout and map them to Back and Forward. The MX MASTER 2S &lt;strong&gt;stacks them vertically&lt;/strong&gt;. It feels strange for a day, and then you stop noticing — the two buttons are easier to tell apart by feel.&lt;/p&gt;
&lt;h3 id=&quot;a-design-that-does-not-stand-out-in-an-office&quot;&gt;A design that does not stand out in an office&lt;/h3&gt;
&lt;p&gt;The matte, monochrome finish keeps it quiet on a desk. It looks at home in a home office or a meeting room without drawing attention.&lt;/p&gt;
&lt;h2 id=&quot;what-didnt&quot;&gt;What didn’t&lt;/h2&gt;
&lt;p&gt;Short answer: it is large, it charges over micro-USB Type-B, and the gesture button has a durability concern.&lt;/p&gt;
&lt;h3 id=&quot;sized-for-larger-hands-with-no-smaller-option&quot;&gt;Sized for larger hands, with no smaller option&lt;/h3&gt;
&lt;p&gt;For me the grip was the most comfortable I had used. For smaller hands it is harder to recommend, and there is no smaller variant. If you can, hold one in a store before committing.&lt;/p&gt;
&lt;h3 id=&quot;charging-is-micro-usb-type-b&quot;&gt;Charging is micro-USB Type-B&lt;/h3&gt;
&lt;p&gt;In 2026, USB Type-C is the default for peripherals. Charging happens every two or three months, so it is not a daily annoyance — it is just one more cable to keep around.&lt;/p&gt;
&lt;h3 id=&quot;the-gesture-button-is-the-weak-link&quot;&gt;The gesture button is the weak link&lt;/h3&gt;
&lt;p&gt;This is the reason I eventually moved on from this mouse.&lt;/p&gt;
&lt;p&gt;Mid-game, I pressed the gesture button with some force and it &lt;strong&gt;stuck in the pressed state&lt;/strong&gt;. It is the kind of thing you could fix by opening the body, but I did not feel I had clicked it especially hard — the structure looks under-built for that kind of input.&lt;/p&gt;
&lt;p&gt;If you tend to hammer buttons during long gaming sessions, take this seriously.&lt;/p&gt;
&lt;h2 id=&quot;comparison-mx-master-2s-vs-3--3s&quot;&gt;Comparison: MX MASTER 2S vs 3 / 3S&lt;/h2&gt;



































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Angle&lt;/th&gt;&lt;th&gt;MX MASTER 2S&lt;/th&gt;&lt;th&gt;MX MASTER 3 / 3S&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Charging&lt;/td&gt;&lt;td&gt;micro-USB Type-B&lt;/td&gt;&lt;td&gt;USB Type-C&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Main wheel&lt;/td&gt;&lt;td&gt;Mechanical&lt;/td&gt;&lt;td&gt;MagSpeed (electromagnetic)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Side wheel&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Yes (smoother)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Gesture button durability&lt;/td&gt;&lt;td&gt;Weaker&lt;/td&gt;&lt;td&gt;Improved&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Price at launch&lt;/td&gt;&lt;td&gt;~9,400 yen&lt;/td&gt;&lt;td&gt;~13,000 yen and up&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;For a new purchase today, the current MX Master 3S is the easier recommendation. If you find a 2S secondhand or on clearance and do not lean on the gesture button, it still holds up in daily use.&lt;/p&gt;
&lt;h2 id=&quot;the-software-logicool-options&quot;&gt;The software (Logicool Options)&lt;/h2&gt;
&lt;p&gt;Logicool Options remaps almost every button on the mouse.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Logicool Options home screen&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-03-09-logicool-mx-master-2s/2021-03-09-Logicool-MX-MASTER-2S-Logicool-Options-home.webp&quot; loading=&quot;lazy&quot;/&gt;
&lt;p&gt;The gesture button can carry four directional actions — up, down, left, right — on top of its press action.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Logicool Options gesture configuration&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-03-09-logicool-mx-master-2s/2021-03-09-Logicool-MX-MASTER-2S-Logicool-Options-gesture.webp&quot; loading=&quot;lazy&quot;/&gt;
&lt;p&gt;Wheel sensitivity and pointer speed are tunable in fine steps. You can, for example, dial the wheel scroll distance specifically for Excel sessions.&lt;/p&gt;
&lt;aside class=&quot;aff-card not-prose my-10 rounded-2xl border border-[color:var(--aulvem-border)] bg-[color:var(--aulvem-surface)] px-5 py-5 sm:px-6 sm:py-6 has-image&quot; aria-label=&quot;Buy links for Logitech MX MASTER 2S (MX2100CR)&quot; data-astro-cid-qoq25xnm&gt;&lt;div class=&quot;aff-image&quot; data-astro-cid-qoq25xnm&gt;&lt;img src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-03-09-logicool-mx-master-2s/2021-03-09-Logicool-MX-MASTER-2S.webp&quot; alt=&quot;&quot; aria-hidden=&quot;true&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; data-astro-cid-qoq25xnm&gt;&lt;/div&gt;&lt;p class=&quot;aff-title&quot; data-astro-cid-qoq25xnm&gt;Logitech MX MASTER 2S (MX2100CR)&lt;/p&gt;&lt;div class=&quot;aff-buttons&quot; data-astro-cid-qoq25xnm&gt;&lt;a href=&quot;https://www.amazon.co.jp/dp/B08K8PH9G3/?language=en_US&amp;amp;tag=aulvem-22&quot; aria-label=&quot;View Logitech MX MASTER 2S (MX2100CR) on Amazon Japan (primarily sold in Japan)&quot; rel=&quot;sponsored nofollow noopener noreferrer&quot; target=&quot;_blank&quot; class=&quot;aff-btn inline-flex items-center gap-2 rounded-lg border border-[color:var(--aulvem-border)] bg-white px-4 py-2.5 transition-colors hover:border-aulvem-orange&quot; style=&quot;font-size: 14px; font-weight: 500;&quot; data-astro-cid-qoq25xnm&gt;&lt;img src=&quot;https://api.iconify.design/fa6-brands/amazon.svg?color=%23FF9900&quot; width=&quot;16&quot; height=&quot;16&quot; alt=&quot;&quot; aria-hidden=&quot;true&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; style=&quot;display:block&quot; data-astro-cid-qoq25xnm&gt;&lt;span data-astro-cid-qoq25xnm&gt;View on Amazon Japan&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;p class=&quot;aff-note&quot; data-astro-cid-qoq25xnm&gt;
Primarily sold in Japan. amazon.co.jp may ship internationally on select items.
&lt;/p&gt;&lt;/aside&gt;
&lt;h2 id=&quot;faq&quot;&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Q. Does it work with a Mac?&lt;/strong&gt;
A. Yes. Logicool Options for Mac is available, and the mouse connects over either Bluetooth or the USB receiver.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. How long does the battery last?&lt;/strong&gt;
A. Logitech lists 70 days. In actual use I charged it every two to three months.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. Can it be used for gaming?&lt;/strong&gt;
A. Response-wise it behaves like an ordinary mouse. For FPS or other titles that need precise input, a dedicated gaming mouse is the better tool — and given the gesture-button concern, anything with violent clicking is best kept off this mouse.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. Does it connect to an iPad?&lt;/strong&gt;
A. Yes, from iPadOS 13.4 onward iPads support mice. Pairing happens over Bluetooth.&lt;/p&gt;
&lt;h2 id=&quot;verdict--a-mouse-for-a-specific-kind-of-work&quot;&gt;Verdict — a mouse for a specific kind of work&lt;/h2&gt;
&lt;p&gt;It is not a universal recommendation. For the right workload, though, it is hard to go back from.&lt;/p&gt;
&lt;p&gt;In Excel, Figma, or a video editor — anywhere horizontal scrolling shows up constantly — the side wheel changes the day-to-day feel of the work.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Logitech MX MASTER 2S, summary shot&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-03-09-logicool-mx-master-2s/2021-03-09-Logicool-MX-MASTER-2S-summary.webp&quot; loading=&quot;lazy&quot;/&gt;
&lt;p&gt;The two things to weigh are the size and the gesture button. If you can hold one in a store before deciding, that is still the surest way to avoid buyer’s remorse.&lt;/p&gt;</content:encoded><category>reviews</category><category>mouse</category><category>logicool</category><category>pc-peripherals</category></item><item><title>Pointing an Onamae.com domain at Netlify — DNS handover steps and gotchas</title><link>https://aulvem.com/blog/2021-03-08-netlify-onamae/</link><guid isPermaLink="true">https://aulvem.com/blog/2021-03-08-netlify-onamae/</guid><description>Steps for wiring an Onamae.com domain to Netlify by delegating the nameservers. Covers how DNS works, using Cloudflare DNS as an alternative, and tips for waiting out propagation — written through a 2026 lens.</description><pubDate>Mon, 08 Mar 2021 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;2026 update&lt;/strong&gt;: A post ported over from the old VuePress blog. The skeleton of the procedure hasn’t changed, but the Netlify / Onamae.com UI screenshots are from 2021. Cloudflare Pages + Cloudflare DNS is a common pairing now too, so a short comparison is added at the end.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Pointing an Onamae.com domain at a Netlify site is the kind of task you trip over on the first attempt if the UI isn’t familiar. The two things that snag people are pretty consistent: “where do I change the nameservers”, and “is it slow because it’s working or because it isn’t”.&lt;/p&gt;
&lt;p&gt;This post tries to clear both up before you start clicking, so the order is: how DNS works, the connection steps, then how to confirm propagation. The Netlify deploy itself is assumed to be done already, per &lt;a href=&quot;https://aulvem.com/blog/2021-03-06-netlify-setup/&quot;&gt;Setting up a static site with VuePress, GitHub, and Netlify&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;short-answer--delegate-the-nameservers-to-netlify-dns&quot;&gt;Short answer — delegate the nameservers to Netlify DNS&lt;/h2&gt;
&lt;p&gt;The shortest path for connecting an Onamae.com domain to Netlify is to &lt;strong&gt;rewrite the Onamae.com nameservers to the four Netlify DNS ones&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The reason is that Netlify takes over DNS-record management (A / AAAA / CNAME), so SSL issuance, apex-domain handling, and adding subdomains all run more or less on autopilot. You only need to write records yourself if you’ve chosen the &lt;strong&gt;delegate to a separate DNS (e.g. Cloudflare DNS) and CNAME to Netlify&lt;/strong&gt; layout.&lt;/p&gt;
&lt;p&gt;If you’re undecided: Netlify DNS for delegation, Cloudflare DNS if you want to bundle multiple services under one domain. That’s the dividing line.&lt;/p&gt;
&lt;h2 id=&quot;how-dns-delegation-works--who-holds-the-address-book&quot;&gt;How DNS delegation works — who holds the address book&lt;/h2&gt;
&lt;p&gt;DNS is the distributed database that resolves “domain name → server IP”. A nameserver is the &lt;strong&gt;authoritative source&lt;/strong&gt; for those lookups.&lt;/p&gt;
&lt;p&gt;Right after you buy a domain at Onamae.com, Onamae.com itself is the authoritative source (the primary DNS). Switching the nameservers to Netlify DNS is what “changing nameservers” means, and from that point on the A / CNAME records live on the Netlify side.&lt;/p&gt;
&lt;h3 id=&quot;onamaecom-dns-vs-netlify-dns-vs-cloudflare-dns&quot;&gt;Onamae.com DNS vs Netlify DNS vs Cloudflare DNS&lt;/h3&gt;















































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Angle&lt;/th&gt;&lt;th&gt;Onamae.com DNS (default)&lt;/th&gt;&lt;th&gt;Netlify DNS (delegated)&lt;/th&gt;&lt;th&gt;Cloudflare DNS (delegated)&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Setup effort&lt;/td&gt;&lt;td&gt;Hand-write A / CNAME&lt;/td&gt;&lt;td&gt;Records generated automatically&lt;/td&gt;&lt;td&gt;Hand-write your own CNAME&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Fit with Netlify&lt;/td&gt;&lt;td&gt;OK&lt;/td&gt;&lt;td&gt;The official short path&lt;/td&gt;&lt;td&gt;Good (CNAME flattening supported)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;HTTPS certificate&lt;/td&gt;&lt;td&gt;Automatic on Netlify&lt;/td&gt;&lt;td&gt;Automatic on Netlify&lt;/td&gt;&lt;td&gt;Automatic on Netlify&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;CDN / WAF&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;td&gt;Yes (via Cloudflare)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Email / other services&lt;/td&gt;&lt;td&gt;Slightly awkward&lt;/td&gt;&lt;td&gt;Awkward&lt;/td&gt;&lt;td&gt;Easy&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2026 popularity&lt;/td&gt;&lt;td&gt;△&lt;/td&gt;&lt;td&gt;◯&lt;/td&gt;&lt;td&gt;◎&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;If you’re stuck, walk down the table: “only using Netlify → Netlify DNS”, “want email or another service on the same domain too → Cloudflare DNS”. That keeps the decision stable.&lt;/p&gt;
&lt;h2 id=&quot;connection-steps--10-minutes-of-actual-work-up-to-48-hours-of-propagation&quot;&gt;Connection steps — 10 minutes of actual work, up to 48 hours of propagation&lt;/h2&gt;
&lt;p&gt;The actual work starts here. The clicking part takes around 10 minutes; DNS taking effect everywhere can take up to 48 hours (in practice it’s usually done within a few hours).&lt;/p&gt;
&lt;h3 id=&quot;step-1-register-a-domain-at-onamaecom&quot;&gt;Step 1: Register a domain at Onamae.com&lt;/h3&gt;
&lt;p&gt;On the Onamae.com homepage, type in the domain name you want. For non-&lt;code&gt;.com&lt;/code&gt; TLDs, select the TLD explicitly.&lt;/p&gt;
&lt;img width=&quot;600&quot; alt=&quot;Onamae.com homepage domain search form&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-03-08-netlify-onamae/2021-03-08-onamae-search.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;p&gt;In the results, tick the TLD you want and &lt;strong&gt;proceed to pricing confirmation&lt;/strong&gt;.&lt;/p&gt;
&lt;img width=&quot;600&quot; alt=&quot;Onamae.com domain selection screen&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-03-08-netlify-onamae/2021-03-08-onamae-domain.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;p&gt;On the next screen — the server-selection step — pick &lt;strong&gt;don’t use one&lt;/strong&gt;, since hosting is going to Netlify. Don’t accidentally sign up for a rental server here (an annual fee straight down the drain).&lt;/p&gt;
&lt;img width=&quot;600&quot; alt=&quot;Onamae.com server selection screen with don&apos;t use option&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-03-08-netlify-onamae/2021-03-08-onamae-server-selection.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;p&gt;Once payment is done, the domain is yours. Whois proxy is included free, so you can leave it on.&lt;/p&gt;
&lt;h3 id=&quot;step-2-run-add-custom-domain-in-netlify&quot;&gt;Step 2: Run Add custom domain in Netlify&lt;/h3&gt;
&lt;p&gt;From the target Netlify site’s overview, open &lt;strong&gt;Domain settings&lt;/strong&gt;.&lt;/p&gt;
&lt;img width=&quot;600&quot; alt=&quot;Netlify site overview screen&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-03-08-netlify-onamae/2021-03-08-Netlify-overview.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;p&gt;Click &lt;strong&gt;Add custom domain&lt;/strong&gt;, type in the domain you registered (as the apex, e.g. &lt;code&gt;example.com&lt;/code&gt;), and click Verify. That takes you to the ownership-check screen.&lt;/p&gt;
&lt;img width=&quot;600&quot; alt=&quot;Netlify Domain settings screen&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-03-08-netlify-onamae/2021-03-08-Netlify-domain.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;h3 id=&quot;step-3-turn-on-netlify-dns-and-copy-the-nameservers&quot;&gt;Step 3: Turn on Netlify DNS and copy the nameservers&lt;/h3&gt;
&lt;p&gt;Right after adding the domain, you’ll see &lt;strong&gt;Check DNS configuration&lt;/strong&gt;. Open Options → &lt;strong&gt;Set up Netlify DNS&lt;/strong&gt; to enable Netlify DNS.&lt;/p&gt;
&lt;img width=&quot;600&quot; alt=&quot;Netlify custom domains list with Set up Netlify DNS option&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-03-08-netlify-onamae/2021-03-08-Netlify-custom-domains.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;p&gt;A few confirmation dialogs follow — read through them as you go. At the end, four FQDNs (shaped like &lt;code&gt;dns1.p0X.nsone.net&lt;/code&gt;) appear under &lt;strong&gt;Name servers&lt;/strong&gt;. Leave this browser tab open and copy them.&lt;/p&gt;
&lt;img width=&quot;600&quot; alt=&quot;Netlify Name servers list&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-03-08-netlify-onamae/2021-03-08-Netlify-name-server.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;h3 id=&quot;step-4-switch-the-nameservers-to-netlify-on-onamaecom&quot;&gt;Step 4: Switch the nameservers to Netlify on Onamae.com&lt;/h3&gt;
&lt;p&gt;In another tab, log into Onamae.com Navi. From the top-bar &lt;strong&gt;menu&lt;/strong&gt; → &lt;strong&gt;change nameservers&lt;/strong&gt;.&lt;/p&gt;
&lt;img width=&quot;600&quot; alt=&quot;Onamae.com Navi menu&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-03-08-netlify-onamae/2021-03-08-namae-menu.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;p&gt;Tick the target domain, pick the “Other” tab, and paste the four nameservers from Netlify into the nameserver fields, top to bottom.&lt;/p&gt;
&lt;img width=&quot;600&quot; alt=&quot;Onamae.com nameserver change screen&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-03-08-netlify-onamae/2021-03-08-Onamae-name-server.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;p&gt;Click confirm and a “change request received” email arrives. That’s the active work done.&lt;/p&gt;
&lt;h3 id=&quot;step-5-wait-for-dns-propagation-and-the-https-certificate&quot;&gt;Step 5: Wait for DNS propagation and the HTTPS certificate&lt;/h3&gt;
&lt;p&gt;Propagation lands anywhere from a few minutes to 48 hours. On Netlify’s side, once DNS finishes propagating, Let’s Encrypt certificate issuance runs automatically, and after that you can reach the registered domain over HTTPS.&lt;/p&gt;
&lt;p&gt;A few tips for confirming:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If it’s still not visible after 30 minutes, try &lt;code&gt;nslookup example.com 1.1.1.1&lt;/code&gt; to check name resolution against a different DNS&lt;/li&gt;
&lt;li&gt;If only your home network can’t see it, suspect the router or OS DNS cache&lt;/li&gt;
&lt;li&gt;If the certificate is still &lt;code&gt;pending&lt;/code&gt; after half a day, hit &lt;strong&gt;Renew certificate&lt;/strong&gt; once from the Netlify Domains screen — that re-kicks issuance&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;gotchas--four-common-stumbles&quot;&gt;Gotchas — four common stumbles&lt;/h2&gt;
&lt;p&gt;Short answer: &lt;strong&gt;mistyping the nameservers&lt;/strong&gt;, &lt;strong&gt;redoing the settings before propagation finishes&lt;/strong&gt;, &lt;strong&gt;misclicking the Onamae.com renewal emails&lt;/strong&gt;, and &lt;strong&gt;running email on the same domain&lt;/strong&gt;. Those four.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Mistyping the nameservers&lt;/strong&gt;: copy all four exactly. Order doesn’t matter, but watch the trailing &lt;code&gt;.&lt;/code&gt; and any leading whitespace&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Redoing settings repeatedly before propagation&lt;/strong&gt;: changing the Onamae.com side again mid-propagation because “it’s not working” just resets the TTL and stretches the wait. Give it half a day first&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Misclicking the renewal emails&lt;/strong&gt;: Onamae.com sends a lot of ad emails about similar-looking domains. Build the habit of logging into Navi and checking the contract list to confirm whether a renewal notice is the real one&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Running email on the same domain&lt;/strong&gt;: moving the whole nameserver to Netlify DNS means you have to re-create the MX records on the Netlify DNS side. If email is in play, delegating to Cloudflare DNS is safer (each provider’s MX UI may shift through 2026)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;faq&quot;&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Q. Can I connect this without Netlify DNS — i.e. leaving Onamae.com’s DNS in place?&lt;/strong&gt;
A. Yes. In Onamae.com’s DNS-record settings, point the apex at A record 75.2.60.5, and point www at &lt;code&gt;&amp;lt;site&amp;gt;.netlify.app&lt;/code&gt; via CNAME. Netlify’s load-balancer IP could change in the future, so for the long run, delegating to Netlify DNS or Cloudflare DNS is the safer move.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. What’s different about pointing through Cloudflare DNS instead?&lt;/strong&gt;
A. You delegate the nameservers to Cloudflare and point CNAME at Netlify from there. The upside is you can layer Cloudflare’s CDN and WAF on top, and it’s easier to co-locate multiple services (email, a separate host) on the same domain. Aulvem itself currently runs on Cloudflare Pages, with DNS managed on the Cloudflare side.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. How long does it take to propagate after switching nameservers?&lt;/strong&gt;
A. In practice, most of it lands within a few minutes to a few hours, with up to 48 hours as the outer bound. Mid-propagation, what you see depends on whether the network you’re on has cached the old record, so if it’s still not visible after half a day, try a different network.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. Is Netlify still a reasonable choice in 2026?&lt;/strong&gt;
A. Still reasonable, yes. That said, in 2026 Cloudflare Pages and Vercel are the more natural defaults for a new project. If you’re leaning on Netlify Forms or Identity, Netlify still holds up.&lt;/p&gt;
&lt;h2 id=&quot;closing&quot;&gt;Closing&lt;/h2&gt;
&lt;p&gt;The real question behind pointing an Onamae.com domain at Netlify is “which DNS holds the authoritative copy of the domain”. Only using Netlify? Delegate to Netlify DNS — that’s the lightest path. Bundling multiple services? Go through Cloudflare DNS instead.&lt;/p&gt;
&lt;p&gt;The screenshots are still the 2021 ones, but the basic flow — delegate the nameservers — hasn’t moved in 2026. Netlify itself is still around, and for projects leaning on Forms or Identity it’s still a top pick.&lt;/p&gt;
&lt;p&gt;If you want to revisit the Netlify-side initial setup, see &lt;a href=&quot;https://aulvem.com/blog/2021-03-06-netlify-setup/&quot;&gt;Setting up a static site with VuePress, GitHub, and Netlify&lt;/a&gt;.&lt;/p&gt;
</content:encoded><category>build</category><category>Netlify</category><category>domain</category><category>DNS</category></item><item><title>RATOC RS-WFIREX4 review — a sub-10,000-yen entry point into the smart home</title><link>https://aulvem.com/blog/2021-03-07-rs-wfirex4/</link><guid isPermaLink="true">https://aulvem.com/blog/2021-03-07-rs-wfirex4/</guid><description>A few years with the RS-WFIREX4. A small, unobtrusive infrared smart remote with Alexa / Google Home / Siri support. Setup difficulty and response lag are its weak points.</description><pubDate>Sun, 07 Mar 2021 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;2026 update&lt;/strong&gt;: Ported from the old VuePress blog. The hardware spec and UI described here are from the time of writing. The successor RS-WFIREX5 is now on sale, so check the current line-up before buying new.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The remote always vanished at the exact moment I wanted to use it. That was the steady-state problem.&lt;/p&gt;
&lt;p&gt;To fix it at the physical layer, I bought the RATOC RS-WFIREX4 — an infrared smart remote that lets a phone or a smart speaker drive any infrared appliance in the house. This is the write-up after a few years of use.&lt;/p&gt;
&lt;p&gt;The price sits just under 10,000 yen. As smart remotes go it is on the entry-level end, but the feature set is not far from a Nature Remo or a SwitchBot hub.&lt;/p&gt;
&lt;h2 id=&quot;the-verdict--a-solid-pick-for-a-first-smart-remote&quot;&gt;The verdict — a solid pick for a first smart remote&lt;/h2&gt;
&lt;p&gt;Short answer: as a sub-10,000-yen infrared smart remote with Alexa / Google Home / Siri support, it does the entry-level job well. If you want to take one step of friction out of using the remotes around your home, buy.&lt;/p&gt;
&lt;p&gt;Three reasons.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Small, white body that disappears against a wall&lt;/li&gt;
&lt;li&gt;Built-in temperature, humidity, and illuminance sensors that can drive automation conditions&lt;/li&gt;
&lt;li&gt;Official support for all three major smart-speaker ecosystems&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A few cautions before buying:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;If you expect the immediacy of a physical remote&lt;/strong&gt;: there is a two-to-three-second lag&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;If setup is not your thing&lt;/strong&gt;: the initial configuration does not just flow from the app — plan to read the manual alongside&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;If your room has no line-of-sight for infrared&lt;/strong&gt;: appliances tucked behind a wall or a door may not be reachable&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;the-hardware--a-small-white-box-made-to-live-on-a-wall&quot;&gt;The hardware — a small white box made to live on a wall&lt;/h2&gt;
&lt;p&gt;Short answer: a small white plastic box. There is a hook on the back for wall mounting, so it goes almost anywhere.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;RS-WFIREX4, front view&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-03-07-rs-wfirex4/2021-03-07-RS-WFIREX4-front.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;p&gt;The front is almost blank except for the logo and a small indicator. It melts into a white wall and does not announce itself in a living room.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;RS-WFIREX4 held in a palm, showing scale&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-03-07-rs-wfirex4/2021-03-07-RS-WFIREX4-size.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;p&gt;It fits in the palm of a hand. Height is around 4cm. There are vent slots on the side.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;RS-WFIREX4 back, showing wall-mount hook and lanyard hole&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-03-07-rs-wfirex4/2021-03-07-RS-WFIREX4-back.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;p&gt;The back has a wall-mount hook and a lanyard hole. The base has rubber feet. Whether you set it on a desk or hang it on a wall, nothing about it looks out of place.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;RS-WFIREX4 top, showing the micro-USB Type-B power port&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-03-07-rs-wfirex4/2021-03-07-RS-WFIREX4-upward.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;p&gt;Power is delivered over micro-USB Type-B. In 2026 USB Type-C is the norm, so this dates the unit — but for a device you plug in once and never unplug, the practical cost is small. The side carries a status LED and a reset button.&lt;/p&gt;
&lt;aside class=&quot;aff-card not-prose my-10 rounded-2xl border border-[color:var(--aulvem-border)] bg-[color:var(--aulvem-surface)] px-5 py-5 sm:px-6 sm:py-6 has-image&quot; aria-label=&quot;Buy links for RATOC Smart Home Remote RS-WFIREX4&quot; data-astro-cid-qoq25xnm&gt;&lt;div class=&quot;aff-image&quot; data-astro-cid-qoq25xnm&gt;&lt;img src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-03-07-rs-wfirex4/2021-03-07-RS-WFIREX4.webp&quot; alt=&quot;&quot; aria-hidden=&quot;true&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; data-astro-cid-qoq25xnm&gt;&lt;/div&gt;&lt;p class=&quot;aff-title&quot; data-astro-cid-qoq25xnm&gt;RATOC Smart Home Remote RS-WFIREX4&lt;/p&gt;&lt;div class=&quot;aff-buttons&quot; data-astro-cid-qoq25xnm&gt;&lt;a href=&quot;https://www.amazon.co.jp/dp/B07BLQ4M3M/?language=en_US&amp;amp;tag=aulvem-22&quot; aria-label=&quot;View RATOC Smart Home Remote RS-WFIREX4 on Amazon Japan (primarily sold in Japan)&quot; rel=&quot;sponsored nofollow noopener noreferrer&quot; target=&quot;_blank&quot; class=&quot;aff-btn inline-flex items-center gap-2 rounded-lg border border-[color:var(--aulvem-border)] bg-white px-4 py-2.5 transition-colors hover:border-aulvem-orange&quot; style=&quot;font-size: 14px; font-weight: 500;&quot; data-astro-cid-qoq25xnm&gt;&lt;img src=&quot;https://api.iconify.design/fa6-brands/amazon.svg?color=%23FF9900&quot; width=&quot;16&quot; height=&quot;16&quot; alt=&quot;&quot; aria-hidden=&quot;true&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; style=&quot;display:block&quot; data-astro-cid-qoq25xnm&gt;&lt;span data-astro-cid-qoq25xnm&gt;View on Amazon Japan&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;p class=&quot;aff-note&quot; data-astro-cid-qoq25xnm&gt;
Primarily sold in Japan. amazon.co.jp may ship internationally on select items.
&lt;/p&gt;&lt;/aside&gt;
&lt;h2 id=&quot;what-worked&quot;&gt;What worked&lt;/h2&gt;
&lt;p&gt;Short answer: the core job of replacing infrared remotes is done well. The smart-speaker integration and the on-board sensors are welcome extras.&lt;/p&gt;
&lt;h3 id=&quot;covers-almost-any-infrared-appliance&quot;&gt;Covers almost any infrared appliance&lt;/h3&gt;
&lt;p&gt;Teach it a remote signal and it drives appliances that fall outside the built-in templates. In practice, almost every remote-driven appliance in the house can end up running through a single app.&lt;/p&gt;
&lt;p&gt;After installing it, the number of times per week I went hunting for a remote dropped sharply. To the point that “remote included or smart-compatible” quietly became a purchase criterion for new appliances.&lt;/p&gt;
&lt;p&gt;The headline templated categories are:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Air conditioners&lt;/li&gt;
&lt;li&gt;TVs&lt;/li&gt;
&lt;li&gt;Lights&lt;/li&gt;
&lt;li&gt;Fans&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;App downloads:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;iOS: &lt;a href=&quot;https://apps.apple.com/jp/app/wi-fi-xue-xirimokon/id1063944197&quot; rel=&quot;noopener noreferrer sponsored nofollow&quot; target=&quot;_blank&quot;&gt;Wi-Fi Learning Remote (App Store)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Android: &lt;a href=&quot;https://play.google.com/store/apps/details?id=com.ratoc.wfirex&quot; rel=&quot;noopener noreferrer sponsored nofollow&quot; target=&quot;_blank&quot;&gt;Wi-Fi Learning Remote (Google Play)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;control-from-outside-the-house&quot;&gt;Control from outside the house&lt;/h3&gt;
&lt;p&gt;Your phone does not need to be on home Wi-Fi. As long as the unit itself is online over the house network, the app reaches it from anywhere. Turn the air conditioner on before you get home, switch off a light you forgot — that kind of operation becomes routine.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;RS-WFIREX4 app home screen&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-03-07-rs-wfirex4/2021-03-07-RS-WFIREX4-App-home.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;h3 id=&quot;built-in-temperature-humidity-and-illuminance-sensors&quot;&gt;Built-in temperature, humidity, and illuminance sensors&lt;/h3&gt;
&lt;p&gt;The bottom of the appliance list screen always shows the temperature, humidity, and illuminance at the unit’s location. Illuminance is reported in three levels rather than a raw lux value — personally, I find that granularity more useful.&lt;/p&gt;
&lt;p&gt;You can use these readings as automation triggers, for example “turn on the air conditioner when the temperature rises above 28 °C”.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;RS-WFIREX4 app appliance list, with temperature, humidity, and illuminance at the bottom&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-03-07-rs-wfirex4/2021-03-07-RS-WFIREX4-Home-appliance-selection.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;h3 id=&quot;per-appliance-remote-ui&quot;&gt;Per-appliance remote UI&lt;/h3&gt;
&lt;p&gt;For templated appliances, the app shows a layout designed for that kind of device. If a button you need is missing from the template, you can add it yourself.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;RS-WFIREX4 app remote screen, with a per-appliance UI&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-03-07-rs-wfirex4/2021-03-07-RS-WFIREX4-remote-control.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;p&gt;This is the opposite of the “ten generic buttons on a flat screen” feel of most universal-remote apps. The fact that the layout matches the appliance reads as a small thing and turns out to matter.&lt;/p&gt;
&lt;h3 id=&quot;alexa-google-home-and-siri-all-supported&quot;&gt;Alexa, Google Home, and Siri all supported&lt;/h3&gt;
&lt;p&gt;Official support for all three smart-speaker ecosystems. Finish the integration in the app and you can drive appliances by voice.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;RS-WFIREX4 app Alexa integration screen&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-03-07-rs-wfirex4/2021-03-07-RS-WFIREX4-Alexa.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;p&gt;The wins show up when your hands are busy cooking, when the phone is in the other room at night, when the remote is missing in the morning.&lt;/p&gt;
&lt;h2 id=&quot;what-didnt&quot;&gt;What didn’t&lt;/h2&gt;
&lt;p&gt;Short answer: a two-to-three-second lag from going via the cloud, the inherent line-of-sight problem of infrared, and a non-trivial initial setup.&lt;/p&gt;
&lt;h3 id=&quot;two-to-three-second-response-time&quot;&gt;Two-to-three-second response time&lt;/h3&gt;
&lt;p&gt;The path is phone → RATOC cloud → home unit → appliance. The immediacy of a physical remote is not on the table.&lt;/p&gt;
&lt;p&gt;The trap is the moment you ask “did that work?” and tap again. Two commands arrive, and the air conditioner can flip ON / OFF / ON. The fix is a habit: press once, wait a few seconds.&lt;/p&gt;
&lt;h3 id=&quot;infrared-with-the-obstacle-problem-that-implies&quot;&gt;Infrared, with the obstacle problem that implies&lt;/h3&gt;
&lt;p&gt;This is a property of infrared rather than of this product. Thick doors and walls between the unit and the appliance stop the signal.&lt;/p&gt;
&lt;p&gt;Cranking up the output extends the range, but then it also reaches a near-identical unit a wall away in someone else’s room. Every smart remote on the market lives with this trade-off.&lt;/p&gt;
&lt;p&gt;Pick a “central spot with line-of-sight to the appliances you care about” when you choose where to mount it.&lt;/p&gt;
&lt;h3 id=&quot;initial-setup-needs-the-manual&quot;&gt;Initial setup needs the manual&lt;/h3&gt;
&lt;p&gt;Wi-Fi setup → unit registration → appliance registration → integration setup. The flow is more steps than the app’s UI alone tries to walk you through. The fastest route is to keep the manual or the official setup page open alongside.&lt;/p&gt;
&lt;p&gt;It is not a heavy lift for an experienced user, but it is not a “plug it in and it works in five minutes” device either, and that is worth knowing upfront.&lt;/p&gt;
&lt;h3 id=&quot;micro-usb-type-b-for-power&quot;&gt;micro-USB Type-B for power&lt;/h3&gt;
&lt;p&gt;In 2026, the port is dated. For a once-and-done install it does not bite, but cable management is easier with USB Type-C.&lt;/p&gt;
&lt;aside class=&quot;aff-card not-prose my-10 rounded-2xl border border-[color:var(--aulvem-border)] bg-[color:var(--aulvem-surface)] px-5 py-5 sm:px-6 sm:py-6 has-image&quot; aria-label=&quot;Buy links for RATOC Smart Home Remote RS-WFIREX4&quot; data-astro-cid-qoq25xnm&gt;&lt;div class=&quot;aff-image&quot; data-astro-cid-qoq25xnm&gt;&lt;img src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-03-07-rs-wfirex4/2021-03-07-RS-WFIREX4.webp&quot; alt=&quot;&quot; aria-hidden=&quot;true&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; data-astro-cid-qoq25xnm&gt;&lt;/div&gt;&lt;p class=&quot;aff-title&quot; data-astro-cid-qoq25xnm&gt;RATOC Smart Home Remote RS-WFIREX4&lt;/p&gt;&lt;div class=&quot;aff-buttons&quot; data-astro-cid-qoq25xnm&gt;&lt;a href=&quot;https://www.amazon.co.jp/dp/B07BLQ4M3M/?language=en_US&amp;amp;tag=aulvem-22&quot; aria-label=&quot;View RATOC Smart Home Remote RS-WFIREX4 on Amazon Japan (primarily sold in Japan)&quot; rel=&quot;sponsored nofollow noopener noreferrer&quot; target=&quot;_blank&quot; class=&quot;aff-btn inline-flex items-center gap-2 rounded-lg border border-[color:var(--aulvem-border)] bg-white px-4 py-2.5 transition-colors hover:border-aulvem-orange&quot; style=&quot;font-size: 14px; font-weight: 500;&quot; data-astro-cid-qoq25xnm&gt;&lt;img src=&quot;https://api.iconify.design/fa6-brands/amazon.svg?color=%23FF9900&quot; width=&quot;16&quot; height=&quot;16&quot; alt=&quot;&quot; aria-hidden=&quot;true&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; style=&quot;display:block&quot; data-astro-cid-qoq25xnm&gt;&lt;span data-astro-cid-qoq25xnm&gt;View on Amazon Japan&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;p class=&quot;aff-note&quot; data-astro-cid-qoq25xnm&gt;
Primarily sold in Japan. amazon.co.jp may ship internationally on select items.
&lt;/p&gt;&lt;/aside&gt;
&lt;h2 id=&quot;comparison--rs-wfirex4-vs-switchbot-hub--nature-remo&quot;&gt;Comparison — RS-WFIREX4 vs SwitchBot Hub / Nature Remo&lt;/h2&gt;
&lt;p&gt;Short answer: the core feature set is roughly the same across all three. The differences show up in extras (Matter, hub features, ecosystem) and price band.&lt;/p&gt;

































































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Angle&lt;/th&gt;&lt;th&gt;RS-WFIREX4&lt;/th&gt;&lt;th&gt;SwitchBot Hub 2&lt;/th&gt;&lt;th&gt;Nature Remo 3 / mini 2&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Price (reference)&lt;/td&gt;&lt;td&gt;Under 10,000 yen&lt;/td&gt;&lt;td&gt;~8,000 – 10,000 yen&lt;/td&gt;&lt;td&gt;~6,000 – 13,000 yen&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Temperature sensor&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Humidity sensor&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;No on mini 2&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Illuminance sensor&lt;/td&gt;&lt;td&gt;Yes (3 levels)&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Yes on Remo 3&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Motion sensor&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;td&gt;Yes on Remo 3&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Alexa / Google / Siri&lt;/td&gt;&lt;td&gt;All three&lt;/td&gt;&lt;td&gt;All three&lt;/td&gt;&lt;td&gt;All three&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Matter support&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;td&gt;Partial&lt;/td&gt;&lt;td&gt;Partial&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Ecosystem&lt;/td&gt;&lt;td&gt;Standalone&lt;/td&gt;&lt;td&gt;Broad (button pushers, etc.)&lt;/td&gt;&lt;td&gt;Mostly standalone&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Power&lt;/td&gt;&lt;td&gt;micro-USB Type-B&lt;/td&gt;&lt;td&gt;USB Type-C&lt;/td&gt;&lt;td&gt;USB Type-C&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Spec and price move over time — check each manufacturer’s official page for current numbers.&lt;/p&gt;
&lt;p&gt;A rough buying guide:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Cheap entry-level pick&lt;/strong&gt;: RS-WFIREX4&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Want to combine it with physical button pushers and friends&lt;/strong&gt;: SwitchBot Hub 2&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Want motion-sensor-based automation&lt;/strong&gt;: Nature Remo 3&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Put differently: if you scope the requirement down to the core (infrared remote + sensors + smart-speaker integration), the RS-WFIREX4 does not leave a meaningful gap.&lt;/p&gt;
&lt;h2 id=&quot;faq&quot;&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Q. Does it work with both Alexa and Google Home?&lt;/strong&gt;
A. Yes. Enable the skill or action from the integration screen in the app and the same appliances can be controlled from either side. Siri Shortcuts is officially supported as well.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. Can I control it from my phone when I am out of the house?&lt;/strong&gt;
A. Yes. The RS-WFIREX4 stays connected to the manufacturer’s cloud over your home Wi-Fi, so the app reaches it even when your phone is on 4G or 5G. If your home router goes down, of course, nothing gets through.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. How long does it take for an appliance to respond after I press a button?&lt;/strong&gt;
A. Two to three seconds in real use. The path is phone → cloud → unit → appliance, so it never matches the immediacy of a physical remote. Mashing the button sends duplicate commands, so the safe habit is to press once and wait.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. Which appliances does it support?&lt;/strong&gt;
A. Anything with an infrared remote, basically. Templates are provided for the major categories — air conditioners, TVs, lights, fans. Outside the templates you can teach it the raw remote signal and it still works.&lt;/p&gt;
&lt;h2 id=&quot;verdict--a-sensible-first-one&quot;&gt;Verdict — a sensible “first one”&lt;/h2&gt;
&lt;p&gt;It is not flashy. What it is, is a quiet, complete take on the basics of a smart remote.&lt;/p&gt;
&lt;p&gt;Under 10,000 yen, full Alexa / Google Home / Siri support, three on-board sensors, a small body — that combination is hard to fault as an entry-level pick. The response lag and the setup work are structural, so the call is whether you can live with them.&lt;/p&gt;
&lt;p&gt;If you want to push further — Matter-based ecosystems, motion-sensor automation — it is worth lining up the SwitchBot Hub 2 and Nature Remo 3 alongside.&lt;/p&gt;
&lt;aside class=&quot;aff-card not-prose my-10 rounded-2xl border border-[color:var(--aulvem-border)] bg-[color:var(--aulvem-surface)] px-5 py-5 sm:px-6 sm:py-6 has-image&quot; aria-label=&quot;Buy links for RATOC Smart Home Remote RS-WFIREX4&quot; data-astro-cid-qoq25xnm&gt;&lt;div class=&quot;aff-image&quot; data-astro-cid-qoq25xnm&gt;&lt;img src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-03-07-rs-wfirex4/2021-03-07-RS-WFIREX4.webp&quot; alt=&quot;&quot; aria-hidden=&quot;true&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; data-astro-cid-qoq25xnm&gt;&lt;/div&gt;&lt;p class=&quot;aff-title&quot; data-astro-cid-qoq25xnm&gt;RATOC Smart Home Remote RS-WFIREX4&lt;/p&gt;&lt;div class=&quot;aff-buttons&quot; data-astro-cid-qoq25xnm&gt;&lt;a href=&quot;https://www.amazon.co.jp/dp/B07BLQ4M3M/?language=en_US&amp;amp;tag=aulvem-22&quot; aria-label=&quot;View RATOC Smart Home Remote RS-WFIREX4 on Amazon Japan (primarily sold in Japan)&quot; rel=&quot;sponsored nofollow noopener noreferrer&quot; target=&quot;_blank&quot; class=&quot;aff-btn inline-flex items-center gap-2 rounded-lg border border-[color:var(--aulvem-border)] bg-white px-4 py-2.5 transition-colors hover:border-aulvem-orange&quot; style=&quot;font-size: 14px; font-weight: 500;&quot; data-astro-cid-qoq25xnm&gt;&lt;img src=&quot;https://api.iconify.design/fa6-brands/amazon.svg?color=%23FF9900&quot; width=&quot;16&quot; height=&quot;16&quot; alt=&quot;&quot; aria-hidden=&quot;true&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; style=&quot;display:block&quot; data-astro-cid-qoq25xnm&gt;&lt;span data-astro-cid-qoq25xnm&gt;View on Amazon Japan&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;p class=&quot;aff-note&quot; data-astro-cid-qoq25xnm&gt;
Primarily sold in Japan. amazon.co.jp may ship internationally on select items.
&lt;/p&gt;&lt;/aside&gt;
</content:encoded><category>reviews</category><category>gadget</category><category>smart-home</category><category>iot</category></item><item><title>Setting up a static site with VuePress, GitHub, and Netlify</title><link>https://aulvem.com/blog/2021-03-06-netlify-setup/</link><guid isPermaLink="true">https://aulvem.com/blog/2021-03-06-netlify-setup/</guid><description>The initial setup for wiring a GitHub repository up to Netlify and auto-deploying a static site for free. Walks through account creation, site setup, build configuration, two-factor auth, and the free-tier ceiling — with the original 2021 screenshots — assuming a VuePress site.</description><pubDate>Sat, 06 Mar 2021 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;2026 update&lt;/strong&gt;: A post ported over from the old VuePress blog. Netlify’s admin UI and pricing have moved on since 2021, so parts of this don’t line up one-to-one with the current product. The skeleton — connect GitHub, set a build command, get auto-deploys — is still the same shape, and that’s why I’ve kept the post around.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is the initial setup for picking Netlify as a static host, wiring up a GitHub repository, and getting auto-deploys running. The screenshots are the original 2021 ones; the current Netlify dashboard has a different layout, so read them with that grain of salt.&lt;/p&gt;
&lt;p&gt;The five things covered here are: account creation, repository connection, build configuration, two-factor authentication, and a look at the free tier. Custom-domain setup is in a separate post.&lt;/p&gt;
&lt;h2 id=&quot;the-services-used&quot;&gt;The services used&lt;/h2&gt;
&lt;p&gt;Short answer: GitHub for code, Netlify for static hosting — the minimal pair.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;GitHub&lt;/a&gt; — code hosting&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://app.netlify.com/&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;Netlify&lt;/a&gt; — static site hosting&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The reason is that Netlify watches GitHub and builds and publishes automatically when you push. You write locally, push, and check the result — a short loop.&lt;/p&gt;
&lt;p&gt;The overall flow:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Develop and write locally&lt;/li&gt;
&lt;li&gt;Push the source to GitHub&lt;/li&gt;
&lt;li&gt;Netlify picks it up, builds, and serves&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Note: the steps below assume you already have a GitHub account with 2FA enabled.&lt;/p&gt;
&lt;h2 id=&quot;create-a-netlify-account&quot;&gt;Create a Netlify account&lt;/h2&gt;
&lt;p&gt;Short answer: sign in from the Netlify homepage with your GitHub account.&lt;/p&gt;
&lt;p&gt;The reason is that wiring Netlify to GitHub via OAuth is shorter than running two separate accounts, and you don’t have to set up a Netlify password.&lt;/p&gt;
&lt;p&gt;Open Netlify, and the screen below comes up — sign in with your GitHub account.&lt;/p&gt;
&lt;img width=&quot;600&quot; alt=&quot;Netlify login screen&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-03-06-netlify-setup/2021-03-06-Netlify-login.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;p&gt;Note: as of 2026, Netlify has refreshed the UI, and the sign-up layout and button positions are different from this screenshot. The OAuth-with-GitHub flow itself is the same.&lt;/p&gt;
&lt;h2 id=&quot;connect-a-github-repository&quot;&gt;Connect a GitHub repository&lt;/h2&gt;
&lt;p&gt;Short answer: from the dashboard, click &lt;strong&gt;New site from Git&lt;/strong&gt;, pick GitHub, and select the target repository.&lt;/p&gt;
&lt;p&gt;The reason is that Netlify is built around Git as the source of truth. Drag-and-drop from a local folder exists as a separate option, but if you want auto-deploys, Git is the prerequisite.&lt;/p&gt;
&lt;p&gt;After signing in, &lt;strong&gt;New site from Git&lt;/strong&gt; opens the deploy-source picker. Pick GitHub, then pick the repository.&lt;/p&gt;
&lt;img width=&quot;600&quot; alt=&quot;Netlify create a new site screen&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-03-06-netlify-setup/2021-03-06-Netlify-repository.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;p&gt;Note: private repositories use the same flow. For organisation-owned repos, the organisation may have to approve the Netlify app on their side first.&lt;/p&gt;
&lt;h2 id=&quot;fill-in-the-build-settings&quot;&gt;Fill in the build settings&lt;/h2&gt;
&lt;p&gt;Short answer: set &lt;strong&gt;Branch&lt;/strong&gt;, &lt;strong&gt;Build command&lt;/strong&gt;, and &lt;strong&gt;Publish directory&lt;/strong&gt;, then click &lt;strong&gt;Deploy site&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The reason is that those three fields are how Netlify decides which branch, how to build, and what to serve. They’re the only fields that really change with the framework (VuePress, Next.js, Astro, and so on).&lt;/p&gt;
&lt;p&gt;Once you pick the repository, the build-settings screen comes up.&lt;/p&gt;
&lt;img width=&quot;600&quot; alt=&quot;Netlify build settings screen&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-03-06-netlify-setup/2021-03-06-Netlify-repository-setting.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;p&gt;Example values for a VuePress site:&lt;/p&gt;





















&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Field&lt;/th&gt;&lt;th&gt;Example&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Branch&lt;/td&gt;&lt;td&gt;&lt;code&gt;master&lt;/code&gt; or &lt;code&gt;main&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Build command&lt;/td&gt;&lt;td&gt;&lt;code&gt;npm run build&lt;/code&gt; (for VuePress)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Publish directory&lt;/td&gt;&lt;td&gt;&lt;code&gt;docs/.vuepress/dist&lt;/code&gt; (VuePress default)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;After filling those in, click &lt;strong&gt;Deploy site&lt;/strong&gt; and the build kicks off. When the status reads &lt;strong&gt;Published&lt;/strong&gt;, the deploy worked.&lt;/p&gt;
&lt;p&gt;Note: changing the build command after the fact and breaking the deploy is a classic mistake. &lt;strong&gt;Don’t casually edit a configuration that’s already working.&lt;/strong&gt; Mistyping the publish directory by a single folder is enough to ship a blank page.&lt;/p&gt;
&lt;h2 id=&quot;auto-deploys-and-https&quot;&gt;Auto-deploys and HTTPS&lt;/h2&gt;
&lt;p&gt;Short answer: push to the configured branch and Netlify builds automatically; HTTPS comes on by itself.&lt;/p&gt;
&lt;p&gt;The reason is that Netlify wraps Let’s Encrypt internally, so even after a custom domain is attached, certificate issuance and renewal are handled for you. There’s nothing manual to do in the normal case.&lt;/p&gt;
&lt;p&gt;In practice:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pushing to the configured branch triggers a build&lt;/li&gt;
&lt;li&gt;Once the build succeeds, the result is pushed to the serving CDN&lt;/li&gt;
&lt;li&gt;Attach a custom domain and Netlify issues the certificate automatically&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Note: right after attaching a custom domain, propagation takes a while. At the time, it felt like roughly half a day to settle, though it depends on DNS propagation.&lt;/p&gt;
&lt;h2 id=&quot;turn-on-two-factor-authentication&quot;&gt;Turn on two-factor authentication&lt;/h2&gt;
&lt;p&gt;Short answer: open User settings, go to Security, and enable &lt;strong&gt;Two-factor authentication&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The reason is that this account holds the deploy keys and the custom-domain settings. If it gets taken over, the attacker can swap out a live site. Turning 2FA on at the start saves regret later.&lt;/p&gt;
&lt;p&gt;Steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Click your avatar in the top right and open &lt;strong&gt;User settings&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Security&lt;/strong&gt; in the left menu&lt;/li&gt;
&lt;li&gt;Enable &lt;strong&gt;Two-factor authentication&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Direct link:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://app.netlify.com/user/security#two-factor-authentication/&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;https://app.netlify.com/user/security#two-factor-authentication/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Note: switching phones without backing up your authenticator app (Authy, 1Password, Google Authenticator, and so on) means you can lock yourself out. Keep the recovery codes somewhere separate.&lt;/p&gt;
&lt;h2 id=&quot;about-the-free-tier&quot;&gt;About the free tier&lt;/h2&gt;
&lt;p&gt;Short answer: the Netlify Starter plan was 100GB of bandwidth and 300 build minutes a month (as of 2021).&lt;/p&gt;
&lt;p&gt;The reason is that for a personal blog, if you keep image weight in check, the free tier just about covers you. Commercial use or high-frequency updates is a different conversation.&lt;/p&gt;
&lt;p&gt;The Starter plan at the time:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Bandwidth: 100GB / month&lt;/li&gt;
&lt;li&gt;Build time: 300 minutes / month&lt;/li&gt;
&lt;li&gt;Site count: personal-use range&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For reference, dropping in lots of video or uncompressed PNGs eats both bandwidth and build time fast. Converting to WebP, or offloading images to an external image service, makes it easier to stay inside the free tier.&lt;/p&gt;
&lt;p&gt;Note: pricing has been revised as of 2026. Check the official &lt;a href=&quot;https://www.netlify.com/pricing/&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;Pricing&lt;/a&gt; page for the current limits.&lt;/p&gt;
&lt;h2 id=&quot;faq&quot;&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Q. When a build fails, where do you look first?&lt;/strong&gt;
A. The Build command output in the deploy log. When it builds locally but fails on Netlify, it’s usually a Node.js version mismatch, or a gap between &lt;code&gt;package-lock.json&lt;/code&gt; and your environment variables.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. I changed the build command and the site disappeared — can I roll back?&lt;/strong&gt;
A. Open the Deploys tab, find a past successful build, and use &lt;strong&gt;Publish deploy&lt;/strong&gt; to roll back. Roll back first, then fix the offending commit — that’s the safer order.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. Is custom-domain setup covered here?&lt;/strong&gt;
A. No. The steps for pointing an Onamae.com domain at Netlify are in a separate post.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. How does Netlify compare with Vercel or Cloudflare Pages?&lt;/strong&gt;
A. The core experience — auto-deploying a static site from GitHub — is close. The differences show up in pricing, build minutes, and the edge-runtime story. The reason I picked Netlify in 2021 came down to two things: Japanese-language docs were in better shape at the time, and VuePress sample configs were easier to find.&lt;/p&gt;
&lt;h2 id=&quot;closing&quot;&gt;Closing&lt;/h2&gt;
&lt;p&gt;Netlify’s initial setup is OAuth into GitHub, pick a repository, type one line for the build command and one for the publish folder — that’s it. HTTPS and rebuilds are automatic, and the only things that really trip people up early on are mistyping the build command and forgetting to filter out their own PC from analytics.&lt;/p&gt;
&lt;p&gt;Custom-domain setup is in a separate post. Analytics exclusion rules and how to pick an image host I’ll come back to another time.&lt;/p&gt;</content:encoded><category>build</category><category>VuePress</category><category>Netlify</category></item><item><title>Cup Noodle Refill Lidded Mug review — a wide-bottomed desk mug that resists spills</title><link>https://aulvem.com/blog/2021-03-05-cupnoodlemug/</link><guid isPermaLink="true">https://aulvem.com/blog/2021-03-05-cupnoodlemug/</guid><description>Six-plus months with the Cup Noodle Refill Lidded Mug as a daily desk cup. Wide base that resists tipping, a lid that keeps dust out, lightweight polypropylene that handles the microwave.</description><pubDate>Fri, 05 Mar 2021 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;2026 update&lt;/strong&gt;: Ported from the old VuePress blog. The refill mug itself is still listed on Nissin’s official online shop and at the Cup Noodles Museum shop. The numbers are the manufacturer’s published figures from the original writing; current official specs may differ. Heavily rewritten.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I picked up the “Refill Lidded Mug” on the way home from the Cup Noodles Museum, mostly as a novelty. It was designed for swapping in refill noodles, but it ended up living on my desk as a daily-use cup.&lt;/p&gt;
&lt;p&gt;It feels better suited to that — a desk mug for coffee or tea — than to its stated purpose. The reasoning is below.&lt;/p&gt;
&lt;h2 id=&quot;the-verdict--for-anyone-who-wants-a-desk-mug-that-doesnt-tip&quot;&gt;The verdict — for anyone who wants a desk mug that doesn’t tip&lt;/h2&gt;
&lt;p&gt;Short answer: the wide base and low center of gravity make it hard to knock over, even sitting right next to a keyboard. The lid keeps dust out and the polypropylene body is light. If you can live with the look, the practical value is high for the price (under 1,000 yen).&lt;/p&gt;
&lt;p&gt;Three reasons:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;The base is wider than a typical mug&lt;/strong&gt;: the shape is a direct copy of the Cup Noodle cup, so it absorbs a stray arm or sleeve without going over&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A lid is included&lt;/strong&gt;: it comes with a vented lid, so dust doesn’t get in while it sits on your desk&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Light in the hand&lt;/strong&gt;: polypropylene is much lighter than ceramic, which makes carrying it around easier&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It is harder to recommend if any of these apply:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;You don’t want a loud design on your desk&lt;/strong&gt;: it is the Cup Noodle livery, untouched — not always a great fit for a workplace or a customer meeting&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;You want cold drinks with condensation handled&lt;/strong&gt;: as a plastic mug it insulates worse than ceramic&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;build-and-feel&quot;&gt;Build and feel&lt;/h2&gt;
&lt;p&gt;Short answer: a Cup Noodle cup with a handle bolted on. The material is polypropylene, and because it was designed to hold refill noodles, the base is wide.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Cup Noodle mug, front view&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-03-05-cupnoodlemug/2021-03-05-CupNoodleMug-front.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;p&gt;The front is the Cup Noodle packaging, as-is. To someone who doesn’t know the product, it looks like you are drinking Cup Noodle.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Cup Noodle mug next to a pen for scale&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-03-05-cupnoodlemug/2021-03-05-CupNoodleMug-size.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;p&gt;The width and height are roughly the same as a regular-size Cup Noodle (rated). As a mug it reads as a little wider and a little shorter than usual.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Cup Noodle mug, looking down inside&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-03-05-cupnoodlemug/2021-03-05-CupNoodleMug-upward.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;img width=&quot;800&quot; alt=&quot;Cup Noodle mug, underside&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-03-05-cupnoodlemug/2021-03-05-CupNoodleMug-bottom.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;p&gt;Inside is the molded fill-line rib for hot water. The base has a wide outer diameter and a large footprint. Most mugs taper from a wide rim to a narrower bottom; this one is closer to the opposite.&lt;/p&gt;
&lt;p&gt;The material is polypropylene. Heat resistance is listed as 140 degrees C.&lt;/p&gt;
&lt;h2 id=&quot;what-worked&quot;&gt;What worked&lt;/h2&gt;
&lt;p&gt;Short answer: stability from the wide base, dust protection from the lid, and how light it is.&lt;/p&gt;
&lt;h3 id=&quot;wide-base-hard-to-tip&quot;&gt;Wide base, hard to tip&lt;/h3&gt;
&lt;p&gt;This is the headline difference. I had spent years occasionally knocking over the mug on my desk with a stray arm or sleeve; in the six-plus months since switching to this one, I have not tipped it once.&lt;/p&gt;
&lt;p&gt;The reason is built in. A Cup Noodle cup is designed to stay upright on an unstable surface — low center of gravity, wide base.&lt;/p&gt;
&lt;h3 id=&quot;a-lid-that-keeps-dust-out&quot;&gt;A lid that keeps dust out&lt;/h3&gt;
&lt;p&gt;It comes with a vented lid as standard. There is no locking mechanism, so it is not the cup for commuting with, but for something that stays parked on a desk it is enough.&lt;/p&gt;
&lt;p&gt;Knowing that dust and crumbs aren’t drifting into the cup while I am away from my seat changes how the cup feels day to day.&lt;/p&gt;
&lt;h3 id=&quot;light-with-a-roomy-handle&quot;&gt;Light, with a roomy handle&lt;/h3&gt;
&lt;p&gt;Polypropylene is noticeably lighter than ceramic. The handle is large enough for three fingers, which makes it easy to carry full.&lt;/p&gt;
&lt;p&gt;It is also labeled as microwave-safe, so reheating a cold coffee can happen in place.&lt;/p&gt;
&lt;h2 id=&quot;what-didnt&quot;&gt;What didn’t&lt;/h2&gt;
&lt;p&gt;Short answer: the refill noodles cost more than a regular Cup Noodle, the plastic picks up some smell, and the look isn’t always workplace-safe.&lt;/p&gt;
&lt;h3 id=&quot;refill-noodles-cost-more-than-a-regular-cup-noodle&quot;&gt;Refill noodles cost more than a regular Cup Noodle&lt;/h3&gt;
&lt;p&gt;The intended workflow — drop refill noodles into the mug, pour hot water — doesn’t really pencil out. A regular-size Cup Noodle is often cheaper.&lt;/p&gt;
&lt;p&gt;Given the production scale, the refill premium is understandable, but if you bought the mug specifically for that use, it is a small letdown.&lt;/p&gt;
&lt;h3 id=&quot;some-smell-carries-over&quot;&gt;Some smell carries over&lt;/h3&gt;
&lt;p&gt;Polypropylene picks up a small amount of color and smell after coffee or tea, even after washing. It is something you notice when you compare against a ceramic mug, not something that gets in the way of daily use.&lt;/p&gt;
&lt;h3 id=&quot;the-look-is-hard-to-bring-out-at-work&quot;&gt;The look is hard to bring out at work&lt;/h3&gt;
&lt;p&gt;The packaging is unchanged, so it doesn’t sit naturally in a customer meeting or a more formal office. For a desk you sit at alone it is fine; for shared spaces a plain mug is the safer pick.&lt;/p&gt;
&lt;h2 id=&quot;comparison--versus-other-desk-mugs&quot;&gt;Comparison — versus other desk mugs&lt;/h2&gt;
&lt;p&gt;Short answer: a mug that is both hard to tip and has a lid, for under 1,000 yen, doesn’t have many direct competitors.&lt;/p&gt;





















































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Angle&lt;/th&gt;&lt;th&gt;Cup Noodle Refill Lidded Mug&lt;/th&gt;&lt;th&gt;Typical ceramic mug&lt;/th&gt;&lt;th&gt;Thermos-style tumbler (with lid)&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Tip resistance&lt;/td&gt;&lt;td&gt;Wide base, hard to tip&lt;/td&gt;&lt;td&gt;Roughly the same diameter top-to-bottom, easier to tip&lt;/td&gt;&lt;td&gt;Depends on base; narrow ones tip easily&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Lid&lt;/td&gt;&lt;td&gt;Included (vented, no lock)&lt;/td&gt;&lt;td&gt;Sold separately&lt;/td&gt;&lt;td&gt;Included (some lockable)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Weight&lt;/td&gt;&lt;td&gt;Light (plastic)&lt;/td&gt;&lt;td&gt;Heavy&lt;/td&gt;&lt;td&gt;Medium (metal)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Insulation&lt;/td&gt;&lt;td&gt;Weak (single-wall plastic)&lt;/td&gt;&lt;td&gt;Medium&lt;/td&gt;&lt;td&gt;Strong (vacuum-insulated)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Microwave&lt;/td&gt;&lt;td&gt;Yes (rated)&lt;/td&gt;&lt;td&gt;Depends on the piece&lt;/td&gt;&lt;td&gt;No (metal)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Visual restraint&lt;/td&gt;&lt;td&gt;Loud&lt;/td&gt;&lt;td&gt;Usually neutral&lt;/td&gt;&lt;td&gt;Neutral&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Price&lt;/td&gt;&lt;td&gt;Under 1,000 yen&lt;/td&gt;&lt;td&gt;A few hundred to a few thousand yen&lt;/td&gt;&lt;td&gt;2,000 yen and up&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;If you want full insulation, a Thermos-style tumbler is the right tool. If you want a neutral look and microwave compatibility, a regular ceramic mug. If the requirement is “won’t tip, has a lid, cheap,” this one fits.&lt;/p&gt;
&lt;aside class=&quot;aff-card not-prose my-10 rounded-2xl border border-[color:var(--aulvem-border)] bg-[color:var(--aulvem-surface)] px-5 py-5 sm:px-6 sm:py-6 has-image&quot; aria-label=&quot;Buy links for Nissin Cup Noodle Refill Lidded Mug&quot; data-astro-cid-qoq25xnm&gt;&lt;div class=&quot;aff-image&quot; data-astro-cid-qoq25xnm&gt;&lt;img src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-03-05-cupnoodlemug/2021-03-05-CupNoodleMug.webp&quot; alt=&quot;&quot; aria-hidden=&quot;true&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; data-astro-cid-qoq25xnm&gt;&lt;/div&gt;&lt;p class=&quot;aff-title&quot; data-astro-cid-qoq25xnm&gt;Nissin Cup Noodle Refill Lidded Mug&lt;/p&gt;&lt;div class=&quot;aff-buttons&quot; data-astro-cid-qoq25xnm&gt;&lt;a href=&quot;https://www.amazon.co.jp/dp/B01LYSLENN/?language=en_US&amp;amp;tag=aulvem-22&quot; aria-label=&quot;View Nissin Cup Noodle Refill Lidded Mug on Amazon Japan (primarily sold in Japan)&quot; rel=&quot;sponsored nofollow noopener noreferrer&quot; target=&quot;_blank&quot; class=&quot;aff-btn inline-flex items-center gap-2 rounded-lg border border-[color:var(--aulvem-border)] bg-white px-4 py-2.5 transition-colors hover:border-aulvem-orange&quot; style=&quot;font-size: 14px; font-weight: 500;&quot; data-astro-cid-qoq25xnm&gt;&lt;img src=&quot;https://api.iconify.design/fa6-brands/amazon.svg?color=%23FF9900&quot; width=&quot;16&quot; height=&quot;16&quot; alt=&quot;&quot; aria-hidden=&quot;true&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; style=&quot;display:block&quot; data-astro-cid-qoq25xnm&gt;&lt;span data-astro-cid-qoq25xnm&gt;View on Amazon Japan&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;p class=&quot;aff-note&quot; data-astro-cid-qoq25xnm&gt;
Primarily sold in Japan. amazon.co.jp may ship internationally on select items.
&lt;/p&gt;&lt;/aside&gt;
&lt;h2 id=&quot;faq&quot;&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Q. Is it dishwasher-safe?&lt;/strong&gt;
A. Depending on the package, it may be listed as not supported. As a plastic mug, repeated hot-cycle dishwashing risks deformation, and hand-washing is the safer call.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. Where can I buy it?&lt;/strong&gt;
A. The Nissin Foods online shop, the museum shop at the Cup Noodles Museum, and various marketplaces. Physical retail is limited, so online is the realistic route.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. How much does it hold?&lt;/strong&gt;
A. Roughly the same capacity as a regular-size Cup Noodle. As an everyday drink cup it reads on the larger side.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. Can kids use it?&lt;/strong&gt;
A. It is light and won’t shatter, so it is friendlier than ceramic in that sense. The lid does not lock, though, so for actual spill-proofing a kids’ mug with a locking lid is safer.&lt;/p&gt;
&lt;h2 id=&quot;verdict--bought-as-a-novelty-kept-as-a-tool&quot;&gt;Verdict — bought as a novelty, kept as a tool&lt;/h2&gt;
&lt;p&gt;Short answer: the intended use (refill noodles) is hard to justify on cost, but as a lidded desk mug it earns its place for the price.&lt;/p&gt;
&lt;p&gt;I bought it as a Cup Noodles Museum souvenir, and six-plus months later it is still on my desk every day. That was not the plan.&lt;/p&gt;
&lt;p&gt;If the brief is “a lidded mug that won’t tip, under 1,000 yen,” competitors are thin on the ground. Whether it works for you depends on how much you can live with the look.&lt;/p&gt;
&lt;p&gt;I am quietly considering buying a second one for the office.&lt;/p&gt;</content:encoded><category>reviews</category><category>dailyNecessities</category></item><item><title>Image placement and sitemap setup for VuePress — a 2021 build note (archived)</title><link>https://aulvem.com/blog/2021-03-04-vuepress-image-sitemap/</link><guid isPermaLink="true">https://aulvem.com/blog/2021-03-04-vuepress-image-sitemap/</guid><description>How I split the image directories, declared the favicon, and configured vuepress-plugin-sitemap and robots.txt when I built a personal blog on VuePress 1.x back in 2021 — kept alongside the original config.js and folder layout.</description><pubDate>Thu, 04 Mar 2021 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;2026 update&lt;/strong&gt;: A post ported over from the old VuePress blog. Both VuePress 1.x and vuepress-plugin-sitemap are effectively no longer maintained, so this isn’t a reference for new builds. It’s left up as a record of how image sitemaps and image-directory layout were thought through at the time. All code snippets assume VuePress 1.x as of 2021.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;A record of how image placement and sitemap settings were laid out back when I was building a personal blog on VuePress 1.x. The setup that was standard at the time — managing images in the same folder structure as the Markdown posts, hard-coding the favicon into the head array of config.js, and emitting the sitemap with vuepress-plugin-sitemap — is kept here as-is.&lt;/p&gt;
&lt;p&gt;What this post covers is four things: “how to split the image directory”, “how to declare the favicon”, “how to configure the sitemap plugin”, and “where to place robots.txt”. The broader VuePress directory layout itself is covered separately in &lt;a href=&quot;https://aulvem.com/en/blog/2021-03-01-vuepress-structure/&quot;&gt;VuePress/blog directory structure&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;the-short-answer--split-public-and-publicresources&quot;&gt;The short answer — split public and public/resources&lt;/h2&gt;
&lt;p&gt;Short answer: physically separate the files in image and sitemap territory between those served directly at the root and those organized per article.&lt;/p&gt;
&lt;p&gt;VuePress 1.x copies the contents of src/.vuepress/public to the root of dist as-is. Anything placed directly under public is served from the site root after the build. The split I went with: files where “being at the root has meaning in itself” — the favicon, robots.txt, sitemap.xml — go directly under public, and files that need to be “organized per article” — the article images — go under public/resources.&lt;/p&gt;
&lt;p&gt;The reason is that putting both at the same level kills visibility once the file count grows. With hundreds of article images directly under public, the favicon gets buried in the pile.&lt;/p&gt;
&lt;h2 id=&quot;files-in-scope&quot;&gt;Files in scope&lt;/h2&gt;
&lt;p&gt;Short answer: the two places touched here are the public folder under src/.vuepress and config.js.&lt;/p&gt;
&lt;p&gt;Specifically, the layout looks 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;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;src&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;└─ .vuepress&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   ├─ public&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   │  ├─ resources&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   │  │  └─ category&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   │  │     └─ page&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   │  │        └─ img.jpg&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   │  ├─ top.jpg&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   │  ├─ favicon.ico&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   │  ├─ favicon.png&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   │  └─ robots.txt&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   └─ config.js&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A caveat: the directory layout at a broader scope is covered in &lt;a href=&quot;https://aulvem.com/en/blog/2021-03-01-vuepress-structure/&quot;&gt;VuePress/blog directory structure&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;why-organize-an-image-sitemap&quot;&gt;Why organize an image sitemap&lt;/h2&gt;
&lt;p&gt;Short answer: to tell crawlers where the images live, and to keep me from losing track of images on the authoring side.&lt;/p&gt;
&lt;p&gt;An image sitemap is an extension that, inside sitemap.xml, lists “this page has these images” against each URL. A regular sitemap is just a list of page URLs; an image sitemap also passes image URLs to the crawler. In theory this opens up another inbound path from image search.&lt;/p&gt;
&lt;p&gt;That said, vuepress-plugin-sitemap 2.x on VuePress 1.x doesn’t, by default, emit image entries to the sitemap. What this post covers stops at “images are served correctly and a page-level sitemap is being emitted” — it doesn’t cover a strict image sitemap with image entries included.&lt;/p&gt;
&lt;h2 id=&quot;comparison-image-sitemap-vs-regular-sitemap&quot;&gt;Comparison: image sitemap vs. regular sitemap&lt;/h2&gt;






























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Lens&lt;/th&gt;&lt;th&gt;Regular sitemap (sitemap.xml)&lt;/th&gt;&lt;th&gt;Image sitemap&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;What it conveys&lt;/td&gt;&lt;td&gt;List of page URLs&lt;/td&gt;&lt;td&gt;Each page URL + the images contained on that page&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;How it’s submitted to Google&lt;/td&gt;&lt;td&gt;Search Console / robots.txt&lt;/td&gt;&lt;td&gt;Same (embedded as extension elements)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;vuepress-plugin-sitemap 2.x support&lt;/td&gt;&lt;td&gt;Generated by default&lt;/td&gt;&lt;td&gt;Not supported by default&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;How well it works for a personal blog&lt;/td&gt;&lt;td&gt;Essentially required&lt;/td&gt;&lt;td&gt;Worth considering if you’re targeting image-search traffic&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;The reasoning is that image-search traffic moves the needle for photo media but doesn’t shift much for text-driven tech blogs. Setting up just the regular sitemap first and stepping into the image sitemap only after image-search traffic starts showing up was a good enough order.&lt;/p&gt;
&lt;h2 id=&quot;decide-the-directory-for-per-article-images&quot;&gt;Decide the directory for per-article images&lt;/h2&gt;
&lt;p&gt;Short answer: under src/.vuepress/public/resources, create per-article folders and place the images there.&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&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;└─ .vuepress&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   └─ public&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      └─ resources&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;         └─ category&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            └─ page&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;               └─ img.jpg&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The reason is that aligning the Markdown folder structure with the image folder structure one-to-one makes it easier to trace where images live when posts get moved or deleted later. A single post often contains several images, so I split folders at the page level.&lt;/p&gt;
&lt;p&gt;A caveat: match folder names to the article’s slug. Renaming on the article side and renaming the image folder at different times causes broken links.&lt;/p&gt;
&lt;h2 id=&quot;put-shared-images-and-the-favicon-directly-under-public&quot;&gt;Put shared images and the favicon directly under public&lt;/h2&gt;
&lt;p&gt;Short answer: the top image, profile image, and favicon all sit directly under src/.vuepress/public.&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&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;└─ .vuepress&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   └─ public&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      ├─ favicon.ico&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      └─ favicon.png&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The reason is that shared images at the time were only two or three files — not enough to warrant a folder. The plan was, once shared images grew, to break out a public/resources/common folder and move them in, 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;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;src&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;└─ .vuepress&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   └─ public&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      └─ resources&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;         ├─ category&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;         └─ common&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            └─ img.jpg&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Because VuePress has no index.html, the favicon is declared by writing a link tag in the head array of config.js.&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:#79B8FF&quot;&gt;module&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;exports&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&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  head: [&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:#9ECBFF&quot;&gt;&amp;quot;link&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, { rel: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;icon&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, href: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;/resources/favicon.ico&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:#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;If you want PWA support, prepare a PNG favicon separately from the ico and put it at the same level. At the time the site’s PWA support was only half done, so I’ve left out that part of the description.&lt;/p&gt;
&lt;p&gt;A caveat: the head declaration is reflected in every built HTML file. Get the href path off by even one level and the favicon stops loading across the entire site.&lt;/p&gt;
&lt;h2 id=&quot;install-vuepress-plugin-sitemap-and-set-hostname&quot;&gt;Install vuepress-plugin-sitemap and set hostname&lt;/h2&gt;
&lt;p&gt;Short answer: add vuepress-plugin-sitemap to the plugins array, declare hostname and exclude, and sitemap.xml is generated automatically.&lt;/p&gt;
&lt;p&gt;The site used &lt;a href=&quot;https://www.npmjs.com/package/vuepress-plugin-sitemap&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;vuepress-plugin-sitemap&lt;/a&gt; (at the time of writing, &lt;code&gt;vuepress-plugin-sitemap: ^2.3.1&lt;/code&gt;). The setup is finished entirely in config.js.&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:#79B8FF&quot;&gt;module&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;exports&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&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  plugins: [&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:#9ECBFF&quot;&gt;      &amp;quot;sitemap&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:#E1E4E8&quot;&gt;      {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        hostname: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;https://xxxx&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:#E1E4E8&quot;&gt;        exclude: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;https://xxxx/404.html&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;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 reasoning: hostname is required because it’s used to assemble the URLs inside the sitemap. exclude is where you list URLs you want kept out of the crawl, like the 404 page. The other fine-grained options didn’t really need touching at personal-blog scale.&lt;/p&gt;
&lt;p&gt;A caveat: vuepress-plugin-sitemap 2.x is for VuePress 1.x. For VuePress 2.x, it’s a different package and a different configuration API.&lt;/p&gt;
&lt;h2 id=&quot;place-robotstxt-directly-under-public&quot;&gt;Place robots.txt directly under public&lt;/h2&gt;
&lt;p&gt;Short answer: robots.txt &lt;strong&gt;has to&lt;/strong&gt; sit directly under src/.vuepress/public.&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&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;└─ .vuepress&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   ├─ public&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   │  └─ robots.txt&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   └─ config.js&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The reason is that VuePress copies the contents of public to the root of dist. Place it in a subfolder and it isn’t served from the root, so to crawlers the site looks like one without a robots.txt.&lt;/p&gt;
&lt;p&gt;The contents are the same as for any other framework.&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;User-agent : *&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Disallow :&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Sitemap : https://xxxx/sitemap.xml&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Including a Sitemap line lets crawlers find sitemap.xml even without going through Search Console.&lt;/p&gt;
&lt;p&gt;A caveat: leaving Disallow blank means “allow everything”, but if you’ll later expose a staging environment through the same setup, an operation flow that swaps robots.txt per environment is safer.&lt;/p&gt;
&lt;h2 id=&quot;pitfalls--what-tripped-me-up-at-the-time&quot;&gt;Pitfalls — what tripped me up at the time&lt;/h2&gt;
&lt;p&gt;Short answer: two things tripped me up — image paths colliding with the favicon path, and sitemap.xml caching more aggressively than expected.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Writing image references as &lt;code&gt;/img.jpg&lt;/code&gt; collides with files that already sit directly under public. I standardized on writing article images with full paths like &lt;code&gt;/resources/category/page/img.jpg&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;sitemap.xml caches easily in both CDNs and browsers, so right after a deploy it can still show the old contents when viewed from Search Console. Resubmit the rebuilt URL and confirm it’s picked up&lt;/li&gt;
&lt;li&gt;After every build, check that robots.txt and sitemap.xml are emitted directly under dist. Misplacing them under public is the most easily missed kind of accident — the build passes, but the file simply isn’t at the root&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;faq&quot;&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Q. Is an image sitemap a different thing from a regular sitemap.xml?&lt;/strong&gt;
A. An image sitemap is an extension of sitemap.xml that lists image:image entries against each URL. A regular sitemap is just a list of pages; an image sitemap tells the crawler “which images live on which page” as well. vuepress-plugin-sitemap 2.x doesn’t emit image entries by default, so if you wanted to include images you had to extend it with another plugin or regenerate the sitemap yourself.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. Why split off public/resources instead of putting everything directly under public?&lt;/strong&gt;
A. If everything sits directly under public, article images, shared images, the favicon, and robots.txt all end up at the same level and visibility drops. Slipping public/resources in as one extra layer physically separates per-article images (resources/category/article-name) from things that need to live at the public root (favicon, robots.txt).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. Is the VuePress 1.x sitemap plugin still usable in 2026?&lt;/strong&gt;
A. Technically it still runs, but maintenance on both vuepress-plugin-sitemap and VuePress 1.x itself has effectively stopped. For new builds, picking an SSG with sitemap generation built in officially — Astro or Next.js — is easier in both the short and long term. For maintaining an existing site, pinning Node LTS and plugin versions to extend its life is the realistic move.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. What happens if robots.txt is placed somewhere other than directly under public?&lt;/strong&gt;
A. It won’t be emitted under dist after the build, so it’s not served at the root and crawlers treat the site as one without a robots.txt. Because VuePress copies the contents of public to the root of dist, public is the only place to put robots.txt if you want it served at the same level as sitemap.xml.&lt;/p&gt;
&lt;h2 id=&quot;closing&quot;&gt;Closing&lt;/h2&gt;
&lt;p&gt;The initial setup for image and sitemap territory on VuePress 1.x — splitting the roles of “directly under public” and “public/resources”, letting config.js’s head load the favicon, declaring hostname and exclude through vuepress-plugin-sitemap, and placing robots.txt directly under public — covers the whole loop on its own.&lt;/p&gt;
&lt;p&gt;The settings themselves are small, but fixing the image-directory split later, after the post count has grown, hurts more than it should. Drawing the line once at the start — “per-article images and shared images live at different levels” — saves trouble down the road.&lt;/p&gt;
&lt;p&gt;As of 2026 VuePress 1.x is hard to recommend as a choice for new builds, so this post is kept as material for comparing the build philosophy at the time against Astro and the like.&lt;/p&gt;</content:encoded><category>build</category><category>VuePress</category></item><item><title>JOBY GorillaPod JB01542-PKK review — a small tripod for wrapping a webcam around a pillar</title><link>https://aulvem.com/blog/2021-03-03-jobygorillapod-jb01542-pkk/</link><guid isPermaLink="true">https://aulvem.com/blog/2021-03-03-jobygorillapod-jb01542-pkk/</guid><description>Six months with the JOBY GorillaPod JB01542-PKK. The wide-articulating legs wrap around pillars and handrails, which is the real point. Suited to webcams and phones; not to mirrorless-class loads.</description><pubDate>Wed, 03 Mar 2021 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;2026 update&lt;/strong&gt;: Ported from the old VuePress blog. The JOBY GorillaPod JB01542-PKK is still in circulation as part of the current line-up in 2026, but successors and variants (GorillaPod Mobile / Magnetic / 1K, etc.) have multiplied. Read this as a review of one specific use case — fixing a webcam in place — rather than as a universal recommendation.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;When remote work started, I wanted to wrap a webcam around the pillar next to my desk and fix it slightly above eye level. The generic tripods I had on hand could only extend their legs — none of them could “wrap around a pillar” — so I ended up buying a JOBY GorillaPod to add to the kit.&lt;/p&gt;
&lt;p&gt;What I bought was the &lt;strong&gt;JOBY GorillaPod JB01542-PKK&lt;/strong&gt; (ball head with 1/4-inch screw, mini-size flexible-leg type). After about half a year of leaving it permanently set up for webcam duty, here is the write-up.&lt;/p&gt;
&lt;h2 id=&quot;the-verdict--a-good-match-for-anyone-wanting-to-fix-a-webcam-to-a-pillar-or-handrail&quot;&gt;The verdict — a good match for anyone wanting to fix a webcam to a pillar or handrail&lt;/h2&gt;
&lt;p&gt;Short answer: with its three wide-articulating legs, wrapping it around a pillar to fix a webcam above eye level is something it does honestly well. As a tripod for heavier gear like a mirrorless, though, the 50-something gram body is far too light, and the ball head does not take kindly to fine adjustment. Treat it as a specialist for “light gear, awkward places” and the satisfaction is high.&lt;/p&gt;
&lt;p&gt;Good fit:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You want to wrap a webcam or phone around a &lt;strong&gt;pillar, handrail, or shelf&lt;/strong&gt; for work-from-home use&lt;/li&gt;
&lt;li&gt;You want to travel with just one tripod (for phone or GoPro use)&lt;/li&gt;
&lt;li&gt;You want to &lt;strong&gt;mount unusually&lt;/strong&gt; — on a monitor edge or a desk leg&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Less of a fit:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You want to put a mirrorless plus standard zoom (or heavier) on it — both the load rating and the tripod’s own weight are short&lt;/li&gt;
&lt;li&gt;You want a ball head that adjusts in 1° steps&lt;/li&gt;
&lt;li&gt;You want a quick release for swapping cameras often&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;the-look--all-plastic-with-rubber-leg-tips-a-50-something-gram-mini-tripod&quot;&gt;The look — all plastic with rubber leg tips, a 50-something gram mini tripod&lt;/h2&gt;
&lt;p&gt;Short answer: the body is moulded plastic, the joints in the legs are ball-shaped and rotate 360°, and the leg tips have anti-slip rubber and a small magnet. It sits in the palm of one hand, and paired with a webcam the balance comes out right.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;JOBY GorillaPod JB01542-PKK, close-up of the body&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-03-03-jobygorillapod-jb01542-pkk/2021-03-03-JobyGorillaPod-JB01542-PKK-up.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;p&gt;By category this is a &lt;strong&gt;mini tripod with a 1/4-inch screw and ball head&lt;/strong&gt;. The leg joints are chains of ball segments that each rotate independently, so the legs as a whole bend freely.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;JOBY GorillaPod with its legs bent to show range of motion&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-03-03-jobygorillapod-jb01542-pkk/2021-03-03-JobyGorillaPod-JB01542-PKK-range-of-motion.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;p&gt;The range of motion is enough that, for a handrail-thickness pole (around 4cm diameter), three legs can wrap around it without strain. The head tilts to roughly 90°, so horizontal shooting is also workable.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;JOBY GorillaPod with a GoPro mounted, for scale&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-03-03-jobygorillapod-jb01542-pkk/2021-03-03-JobyGorillaPod-JB01542-PKK-gopro.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;p&gt;This is roughly the size with a GoPro mounted. Own weight is around 52g, maximum load around 325g. With a mirrorless the centre of gravity ends up too high and balance is easily lost, but it pairs cleanly with a phone, a GoPro, a compact, or a webcam.&lt;/p&gt;
&lt;h2 id=&quot;what-worked&quot;&gt;What worked&lt;/h2&gt;
&lt;p&gt;Short answer: the &lt;strong&gt;flexibility of where you can place it&lt;/strong&gt; — “wrap around a pillar”, “clamp onto a monitor edge”, “tangle around a desk leg” — is the biggest difference from an ordinary tripod.&lt;/p&gt;
&lt;h3 id=&quot;wide-leg-range--wraps-around-pillars-handrails-and-shelves&quot;&gt;Wide leg range — wraps around pillars, handrails, and shelves&lt;/h3&gt;
&lt;p&gt;A normal tripod assumes you will set it on the floor. With the JB01542-PKK, each of the three legs bends freely, so &lt;strong&gt;wrapping around&lt;/strong&gt; a cylindrical object to fix the camera in place is genuinely workable. For my permanent home-office setup, wrapping it around the pillar by the desk and placing the webcam slightly above face level worked on the first try.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;JOBY GorillaPod wrapped around a pillar with a webcam attached&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-03-03-jobygorillapod-jb01542-pkk/2021-03-03-JobyGorillaPod-JB01542-PKK-web-camera.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;p&gt;The actual fixed setup. One leg is hooked over the top of the pillar, and the other two are wrapped around it. Wrapping all three works too, but hooking one leg upward stops it from sliding down.&lt;/p&gt;
&lt;h3 id=&quot;light--no-guilt-about-leaving-it-hanging-at-face-height-for-hours&quot;&gt;Light — no guilt about leaving it hanging at face height for hours&lt;/h3&gt;
&lt;p&gt;Around 50g for the tripod itself. Combined with a webcam (about 100g) the total still falls short of 200g. In a setup where the thing is &lt;strong&gt;dangling at head height for long stretches&lt;/strong&gt;, weight translates directly into drop risk, so the lightness itself is reassuring. It did not shift in shaking up to JMA seismic intensity 3 (within my own trial range).&lt;/p&gt;
&lt;h3 id=&quot;magnetic-leg-tips-for-casual-mounting-on-steel-shelving-or-cabinets&quot;&gt;Magnetic leg tips for casual mounting on steel shelving or cabinets&lt;/h3&gt;
&lt;p&gt;Each leg tip has a small magnet inside. It will cling lightly to steel shelving or a cabinet top when set down — useful for casual mounting in places you cannot wrap around. It is not strong enough on its own to hold a camera, so treat it strictly as an aid.&lt;/p&gt;
&lt;h3 id=&quot;no-quick-release-is-actually-a-plus-if-all-your-gear-uses-14-inch-screws&quot;&gt;No quick release is actually a plus if all your gear uses 1/4-inch screws&lt;/h3&gt;
&lt;p&gt;If everything on your camera side — webcam, GoPro mount, compact — already takes a 1/4-inch screw, a quick release is just one more adapter to thread through. The JB01542-PKK screws on directly, so no conversion plate is needed.&lt;/p&gt;
&lt;h2 id=&quot;what-didnt&quot;&gt;What didn’t&lt;/h2&gt;
&lt;p&gt;Short answer: it is too light, so a mirrorless puts the centre of gravity too high. The ball head is stiff and bad at fine adjustment. There is no quick release, so frequent swapping is awkward.&lt;/p&gt;
&lt;h3 id=&quot;a-mirrorless-puts-the-centre-of-gravity-too-high&quot;&gt;A mirrorless puts the centre of gravity too high&lt;/h3&gt;
&lt;p&gt;The 325g load rating is high enough on paper that some entry-level mirrorless bodies clear it. In practice &lt;strong&gt;the higher the centre of gravity, the easier it tips&lt;/strong&gt;. With a mirrorless and a standard zoom on top, it slowly leaned over — not by the head lock giving up, but by the leg joints flexing. Safer to treat it as out of spec, and reach for a larger tripod for anything mirrorless-class and up.&lt;/p&gt;
&lt;h3 id=&quot;the-ball-head-is-stiff-and-bad-at-1-adjustments&quot;&gt;The ball head is stiff and bad at 1° adjustments&lt;/h3&gt;
&lt;p&gt;The head’s angle lock has &lt;strong&gt;no adjustment screw — it is a press-fit&lt;/strong&gt; held by firm resistance from the start. That is good for preventing drops, but for composing in fine steps you can really only move it in 5°–10° increments. Not the right pick for anyone who needs to nail a horizontal in video.&lt;/p&gt;
&lt;h3 id=&quot;no-quick-release-is-a-minus-for-anyone-swapping-gear-often&quot;&gt;No quick release is a minus for anyone swapping gear often&lt;/h3&gt;
&lt;p&gt;The flip side of the “1/4-inch direct” advantage. If you cycle through multiple bodies, every swap means turning a screw. For a permanent install, it is a non-issue.&lt;/p&gt;
&lt;h2 id=&quot;comparison&quot;&gt;Comparison&lt;/h2&gt;
&lt;p&gt;Short answer: against a “tripod you put on the floor”, &lt;strong&gt;placement freedom&lt;/strong&gt; wins by a wide margin. Against “other flexible tripods”, it is cheaper but loses to higher models (GorillaPod 1K / 3K and so on) on load rating and rigidity.&lt;/p&gt;
&lt;h3 id=&quot;vs-a-typical-extendable-tripod&quot;&gt;vs a typical extendable tripod&lt;/h3&gt;








































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Angle&lt;/th&gt;&lt;th&gt;JB01542-PKK&lt;/th&gt;&lt;th&gt;Typical extendable mini tripod&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Placement&lt;/td&gt;&lt;td&gt;Floor, pillar, handrail, shelf edge&lt;/td&gt;&lt;td&gt;Flat floor only&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Height adjustment&lt;/td&gt;&lt;td&gt;By bending the legs&lt;/td&gt;&lt;td&gt;Stepped, via the elevator column&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Own weight&lt;/td&gt;&lt;td&gt;~52g (rated)&lt;/td&gt;&lt;td&gt;~200–500g&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Load rating&lt;/td&gt;&lt;td&gt;~325g (rated)&lt;/td&gt;&lt;td&gt;1–3kg class is common&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Fine adjustment&lt;/td&gt;&lt;td&gt;Weak (ball head is stiff)&lt;/td&gt;&lt;td&gt;Strong on 3-way head models&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Price band&lt;/td&gt;&lt;td&gt;Cheap&lt;/td&gt;&lt;td&gt;Cheap to high-end, full range&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Extendable tripods are good at &lt;strong&gt;placing heavy gear on a flat floor&lt;/strong&gt;. The JB01542-PKK is good at &lt;strong&gt;hooking light gear onto non-flat places&lt;/strong&gt;. The use cases are different, so the choice comes down to “where do you want to put it?“.&lt;/p&gt;
&lt;h3 id=&quot;vs-other-flexible-tripods-inside-the-gorillapod-line&quot;&gt;vs other flexible tripods (inside the GorillaPod line)&lt;/h3&gt;















































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Angle&lt;/th&gt;&lt;th&gt;JB01542-PKK&lt;/th&gt;&lt;th&gt;GorillaPod 1K Kit&lt;/th&gt;&lt;th&gt;GorillaPod 3K Kit&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Target gear&lt;/td&gt;&lt;td&gt;Phone / webcam / GoPro&lt;/td&gt;&lt;td&gt;Mirrorless (light)&lt;/td&gt;&lt;td&gt;Medium DSLR&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Load rating&lt;/td&gt;&lt;td&gt;~325g&lt;/td&gt;&lt;td&gt;~1kg&lt;/td&gt;&lt;td&gt;~3kg&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Head&lt;/td&gt;&lt;td&gt;Simple ball&lt;/td&gt;&lt;td&gt;Ball + pan&lt;/td&gt;&lt;td&gt;Ball + pan + Arca-Swiss compatible&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Quick release&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Size&lt;/td&gt;&lt;td&gt;Mini (palm-sized)&lt;/td&gt;&lt;td&gt;Medium&lt;/td&gt;&lt;td&gt;Large&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Price band&lt;/td&gt;&lt;td&gt;Cheapest&lt;/td&gt;&lt;td&gt;Mid&lt;/td&gt;&lt;td&gt;High&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Inside the GorillaPod line, the JB01542-PKK sits as the smallest, lightest, cheapest entry-level option. &lt;strong&gt;If you are planning around a mirrorless or up, 1K and above is the safer band.&lt;/strong&gt; Conversely, if you will only ever mount a webcam and a phone, the weight and price of the 1K is overspec.&lt;/p&gt;
&lt;aside class=&quot;aff-card not-prose my-10 rounded-2xl border border-[color:var(--aulvem-border)] bg-[color:var(--aulvem-surface)] px-5 py-5 sm:px-6 sm:py-6 has-image&quot; aria-label=&quot;Buy links for JOBY GorillaPod 325 (JB01542-PKK)&quot; data-astro-cid-qoq25xnm&gt;&lt;div class=&quot;aff-image&quot; data-astro-cid-qoq25xnm&gt;&lt;img src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-03-03-jobygorillapod-jb01542-pkk/2021-03-03-JobyGorillaPod-JB01542-PKK.webp&quot; alt=&quot;&quot; aria-hidden=&quot;true&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; data-astro-cid-qoq25xnm&gt;&lt;/div&gt;&lt;p class=&quot;aff-title&quot; data-astro-cid-qoq25xnm&gt;JOBY GorillaPod 325 (JB01542-PKK)&lt;/p&gt;&lt;div class=&quot;aff-buttons&quot; data-astro-cid-qoq25xnm&gt;&lt;a href=&quot;https://www.amazon.co.jp/dp/B07FVRDK87/?language=en_US&amp;amp;tag=aulvem-22&quot; aria-label=&quot;View JOBY GorillaPod 325 (JB01542-PKK) on Amazon Japan (primarily sold in Japan)&quot; rel=&quot;sponsored nofollow noopener noreferrer&quot; target=&quot;_blank&quot; class=&quot;aff-btn inline-flex items-center gap-2 rounded-lg border border-[color:var(--aulvem-border)] bg-white px-4 py-2.5 transition-colors hover:border-aulvem-orange&quot; style=&quot;font-size: 14px; font-weight: 500;&quot; data-astro-cid-qoq25xnm&gt;&lt;img src=&quot;https://api.iconify.design/fa6-brands/amazon.svg?color=%23FF9900&quot; width=&quot;16&quot; height=&quot;16&quot; alt=&quot;&quot; aria-hidden=&quot;true&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; style=&quot;display:block&quot; data-astro-cid-qoq25xnm&gt;&lt;span data-astro-cid-qoq25xnm&gt;View on Amazon Japan&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;p class=&quot;aff-note&quot; data-astro-cid-qoq25xnm&gt;
Primarily sold in Japan. amazon.co.jp may ship internationally on select items.
&lt;/p&gt;&lt;/aside&gt;
&lt;h2 id=&quot;faq&quot;&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Q. Is it okay to mount a mirrorless camera on it?&lt;/strong&gt;
A. The manufacturer’s stated maximum load is around 325g. An entry-level mirrorless body on its own just about clears that, but adding a lens usually pushes it over. In practice it is safer to stick to gear under 300g — phones, compacts, webcams, GoPros.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. Will cameras other than 1/4-inch screw fit?&lt;/strong&gt;
A. The head is 1/4-inch screw only. There is no quick release. You can add a separate Arca-Swiss clamp meant for a DSLR and effectively share gear across tripods, but the added weight cancels out the lightness advantage.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. How strong is the magnet in the legs?&lt;/strong&gt;
A. Each leg tip has a small magnet that lightly clings to steel surfaces like shelving or cabinet tops. It is not strong enough on its own to hold a camera in place — it is meant as an aid to wrapping or to spreading the legs (JOBY does not publish a specific holding force).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. Is it suited to outdoor or travel use?&lt;/strong&gt;
A. At around 50g it is light and packs into a gap in a bag, so portability is high. On the other hand it is weak in wind, so for long exposures or time-lapses outdoors it is safer to weigh it down with a stone or a bag, or to bring a full-size tripod as well.&lt;/p&gt;
&lt;h2 id=&quot;verdict--a-specialist-for-light-gear-in-awkward-places&quot;&gt;Verdict — a specialist for “light gear in awkward places”&lt;/h2&gt;
&lt;p&gt;As a general-purpose tripod it is underpowered, but for someone who wants to do something unusual — like &lt;strong&gt;wrapping a webcam around a pillar&lt;/strong&gt; — there is really no other option. That kind of product.&lt;/p&gt;
&lt;p&gt;Over half a year of permanent use, the webcam + JB01542-PKK pairing ran without trouble. It did not slip down through a JMA seismic intensity 3 quake, and the ball head’s lock did not loosen.&lt;/p&gt;
&lt;p&gt;Conversely, if you want to mount a mirrorless, dial in fine adjustments, or swap cameras often, a higher-end GorillaPod 1K Kit or a straightforward extendable tripod will leave you happier. A tripod that is &lt;strong&gt;strong when the use case is narrow, weak when it is not&lt;/strong&gt;.&lt;/p&gt;
</content:encoded><category>reviews</category><category>tripod</category><category>joby</category><category>camera-equipment</category></item><item><title>VuePress Markdown extensions — Components / Slots / frontmatter (2021 archive)</title><link>https://aulvem.com/blog/2021-03-02-vuepress-markdown/</link><guid isPermaLink="true">https://aulvem.com/blog/2021-03-02-vuepress-markdown/</guid><description>A note on the Markdown extensions I used when building a blog with VuePress 1.x in 2021 — embedded Vue components, named containers, and frontmatter — with a 2026 follow-up.</description><pubDate>Tue, 02 Mar 2021 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;2026 update&lt;/strong&gt;: A post ported over from the old VuePress blog. VuePress 1.x is no longer a choice for new builds, so the body here is kept as an archive of “Markdown extension notes from 2021”. The ideas behind containers and frontmatter still carry over to MDX + Astro / Next.js, so read it as comparison material.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Back in 2021, the precursor blog to Aulvem ran on VuePress 1.x. Plain Markdown couldn’t quite handle table of contents, callout blocks, and article metadata, so I ended up touching VuePress’s own Markdown extensions more than once. This post is a cleaned-up version of those configuration notes, viewed from 2026.&lt;/p&gt;
&lt;p&gt;VuePress 1.x is for all practical purposes unmaintained as of 2026, and I wouldn’t recommend it for new projects. Even so, the thinking behind containers and embedded components has carried over into the MDX side of the world, so there’s still some value in leaving the calls I made then on record.&lt;/p&gt;
&lt;h2 id=&quot;short-answer--split-vuepress-markdown-extensions-into-three-layers&quot;&gt;Short answer — split VuePress Markdown extensions into three layers&lt;/h2&gt;
&lt;p&gt;Short answer: VuePress 1.x Markdown extensions are easier to think about when split into three layers — “embedded Vue components”, “named containers (custom blocks)”, and “frontmatter”.&lt;/p&gt;
&lt;p&gt;The reason is that each layer involves different config files and responsibilities. Components belong on the &lt;code&gt;.vue&lt;/code&gt; side, containers belong in the &lt;code&gt;index.js&lt;/code&gt; plugin config plus styles, and frontmatter belongs in article metadata and the template — keeping them separate stops you from losing track of which setting goes where.&lt;/p&gt;
&lt;p&gt;As a concrete split, repeating elements like a table of contents or footer become components, callout boxes become containers, and titles, categories, and tags go in frontmatter.&lt;/p&gt;
&lt;p&gt;A caveat: as of 2026, MDX + a framework (Astro / Next.js) handles the same roles more directly, so from here on, read this as an archive of “how it worked in VuePress 1.x at the time”.&lt;/p&gt;
&lt;h2 id=&quot;extendmarkdown--the-entry-point-for-overriding-markdown-it-behavior&quot;&gt;extendMarkdown — the entry point for overriding markdown-it behavior&lt;/h2&gt;
&lt;p&gt;Short answer: &lt;code&gt;markdown.extendMarkdown&lt;/code&gt; in &lt;code&gt;config.js&lt;/code&gt; lets you touch the markdown-it instance directly.&lt;/p&gt;
&lt;p&gt;VuePress 1.x parses Markdown with markdown-it internally, and &lt;code&gt;extendMarkdown&lt;/code&gt; is the hook for overriding that configuration. Line break handling, link &lt;code&gt;target&lt;/code&gt;, and the syntax highlighting area all got tuned here.&lt;/p&gt;
&lt;p&gt;The setting I actually used is below. It enables &lt;code&gt;breaks: true&lt;/code&gt;, which turns editor line breaks into &lt;code&gt;&amp;lt;br&amp;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;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;markdown&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:#B392F0&quot;&gt;  extendMarkdown&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;md&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:#E1E4E8&quot;&gt;    md.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;set&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;({ breaks: &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;  }&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;A caveat: &lt;code&gt;breaks: true&lt;/code&gt; is convenient for Japanese blog writing where each sentence is broken to its own line, but it doesn’t sit well with English-style paragraphs written as one block. It’s a setting you pick based on how the article is written, not something that should be on by default.&lt;/p&gt;
&lt;h2 id=&quot;embedding-vue-components-inside-markdown&quot;&gt;Embedding Vue components inside Markdown&lt;/h2&gt;
&lt;p&gt;Short answer: in VuePress you can write a Vue component directly inside a Markdown file.&lt;/p&gt;
&lt;p&gt;The reason is that VuePress’s build converts Markdown to a Vue SFC before rendering. Write the tag with the same syntax you’d use inside a &lt;code&gt;.vue&lt;/code&gt; file, and it gets resolved as a component at build time.&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;&amp;lt;ComponentName /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Repeating blocks (related links under an article, footers, table of contents) were turned into components this way.&lt;/p&gt;
&lt;p&gt;A caveat: Markdown and JSX-ish syntax now coexist, so the writer’s prior knowledge requirement goes up. It works as a design when the writers are editors only and operations are small — not so much if external writers are involved. MDX has the same trade-off.&lt;/p&gt;
&lt;h2 id=&quot;defining-custom-blocks-with-named-containers&quot;&gt;Defining custom blocks with named containers&lt;/h2&gt;
&lt;p&gt;Short answer: the &lt;code&gt;::: type title&lt;/code&gt; … &lt;code&gt;:::&lt;/code&gt; syntax lets you define blocks with custom styles.&lt;/p&gt;
&lt;p&gt;VuePress 1.x ships with &lt;code&gt;tip&lt;/code&gt; / &lt;code&gt;warning&lt;/code&gt; / &lt;code&gt;danger&lt;/code&gt; by default, and you can add more types via the &lt;code&gt;container&lt;/code&gt; plugin config in &lt;code&gt;index.js&lt;/code&gt;. The body inside is regular Markdown.&lt;/p&gt;
&lt;p&gt;The syntax looks 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;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;::: displayType titleName&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Markdown can be used inside.&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;When written, it renders as a block with CSS tied to the type name. Example:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;titleName&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Markdown can be used inside.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The display type is defined in the plugin config in &lt;code&gt;index.js&lt;/code&gt;. &lt;code&gt;type&lt;/code&gt; is the display type name, &lt;code&gt;defaultTitle&lt;/code&gt; is the label used when no title is given, and the &lt;code&gt;&amp;#39;/&amp;#39;&lt;/code&gt; key is the prefix for switching per language (Japanese is the default for this site, so leaving it as &lt;code&gt;/&lt;/code&gt; is enough).&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   &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;└─ .vuepress&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   └─ theme&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      └─ index.js&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&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:#79B8FF&quot;&gt;module&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;exports&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:#FFAB70&quot;&gt;options&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;ctx&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;  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;    plugins: [&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:#9ECBFF&quot;&gt;&amp;#39;container&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;        type: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;#39;typeName&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;        defaultTitle: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;          &amp;#39;/&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;defaultTitleName&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 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;Style definitions lived on the &lt;code&gt;custom-blocks.styl&lt;/code&gt; side. Add a selector for the new type name next to &lt;code&gt;tip&lt;/code&gt; / &lt;code&gt;warning&lt;/code&gt; / &lt;code&gt;danger&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;src   &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;└─ .vuepress&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   └─ theme&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      └─ styles&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;         └─ custom-blocks.styl&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&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:#E1E4E8&quot;&gt;  &amp;amp;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;.tip&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  &amp;amp;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;.warning&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  &amp;amp;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;.danger&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A caveat: containers are a markdown-it-container plugin mechanism, so they’re a lightweight Markdown-side extension. If you want to call arbitrary components JSX-style, leaning toward embedded components or MDX is the better fit.&lt;/p&gt;
&lt;h2 id=&quot;frontmatter--article-metadata-at-the-top-of-markdown&quot;&gt;frontmatter — article metadata at the top of Markdown&lt;/h2&gt;
&lt;p&gt;Short answer: a YAML frontmatter defines the article’s title, publication date, category, tags, image, and so on.&lt;/p&gt;
&lt;p&gt;The VuePress template and plugin-blog’s &lt;code&gt;frontmatters&lt;/code&gt; config read those declared values and reflect the metadata into list pages and individual pages. The frontmatter I was using at the time looked 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;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;title: [How to] Build your own blog with VuePress/plugin-blog — Markdown edition&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;date: 2021-03-02&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;category:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  - skill&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;tag: &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  - VuePress&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;image: {{Path}}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;location: japan &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;tag&lt;/code&gt; shows up in &lt;code&gt;$tag&lt;/code&gt; and &lt;code&gt;$currentTag&lt;/code&gt; and lands on the list pages when its name matches a registered entry in plugin-blog’s &lt;code&gt;frontmatters&lt;/code&gt;. &lt;code&gt;category&lt;/code&gt; works without registration, but I aligned it by hand for internal classification. &lt;code&gt;image&lt;/code&gt; is the OG image and thumbnail.&lt;/p&gt;
&lt;p&gt;A caveat: frontmatter key names differ across frameworks. VuePress 1.x used &lt;code&gt;date&lt;/code&gt; / &lt;code&gt;tag&lt;/code&gt; / &lt;code&gt;category&lt;/code&gt; (singular), while current Aulvem (Astro) uses &lt;code&gt;pubDate&lt;/code&gt; / &lt;code&gt;tags&lt;/code&gt; / &lt;code&gt;category&lt;/code&gt;, and migrations stumble here often.&lt;/p&gt;
&lt;h2 id=&quot;markdown-format-comparison-2026-view&quot;&gt;Markdown format comparison (2026 view)&lt;/h2&gt;









































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Lens&lt;/th&gt;&lt;th&gt;Plain Markdown&lt;/th&gt;&lt;th&gt;VuePress 1.x Markdown&lt;/th&gt;&lt;th&gt;MDX&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Base&lt;/td&gt;&lt;td&gt;CommonMark / GFM&lt;/td&gt;&lt;td&gt;markdown-it + extensions&lt;/td&gt;&lt;td&gt;Markdown + JSX&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Component embedding&lt;/td&gt;&lt;td&gt;not available&lt;/td&gt;&lt;td&gt;Vue component written inline&lt;/td&gt;&lt;td&gt;arbitrary JSX / components&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Custom blocks&lt;/td&gt;&lt;td&gt;blockquotes / lists, roughly&lt;/td&gt;&lt;td&gt;&lt;code&gt;::: type&lt;/code&gt; syntax (container)&lt;/td&gt;&lt;td&gt;replaced by JSX components&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;frontmatter&lt;/td&gt;&lt;td&gt;tool-dependent&lt;/td&gt;&lt;td&gt;yes (YAML)&lt;/td&gt;&lt;td&gt;yes (tool-dependent)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Main use in 2026&lt;/td&gt;&lt;td&gt;README / Issue&lt;/td&gt;&lt;td&gt;maintaining existing VuePress 1.x sites&lt;/td&gt;&lt;td&gt;static sites on Astro / Next.js and similar&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;VuePress 1.x containers and embedded components were an early take on “extending Markdown toward JSX”, and MDX now plays roughly the same role.&lt;/p&gt;
&lt;h2 id=&quot;faq&quot;&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Q. How is VuePress Markdown different from plain Markdown?&lt;/strong&gt;
A. VuePress emits an extended flavor built on markdown-it, adding embedded Vue components, named containers (&lt;code&gt;::: tip&lt;/code&gt; and friends), frontmatter, and PrismJS-based syntax highlighting. It’s more expressive than plain Markdown, but the difference is that the build assumes a Vue runtime.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. How are VuePress containers (::: tip etc.) different from MDX components?&lt;/strong&gt;
A. Containers are a syntax implemented via the markdown-it-container plugin — a lightweight extension that stays close to Markdown. MDX is a separate spec that lets you write JSX directly inside Markdown, so you can embed arbitrary React / Vue components as expressions. Containers are custom blocks, MDX is full JSX — the scope of responsibility is different.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. Is it worth picking VuePress 1.x for a new project in 2026?&lt;/strong&gt;
A. Barely. VuePress 1.x is effectively unmaintained, and if you’re staying on Vue, VitePress has more material and more extension room; for a more general SSG, Astro or Next.js + MDX is the safer pick. Keeping VuePress 1.x around only for maintenance of an existing site is the realistic path.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. Is breaks: true in extendMarkdown necessary?&lt;/strong&gt;
A. It depends on taste. The setting converts editor line breaks into &lt;code&gt;&amp;lt;br&amp;gt;&lt;/code&gt;, which is convenient for Japanese blog writing where each sentence ends on its own line. For English-style writing where paragraphs are treated as one block, it isn’t needed and tends to introduce unintended line breaks.&lt;/p&gt;
&lt;h2 id=&quot;if-i-were-doing-the-same-thing-today&quot;&gt;If I were doing the same thing today&lt;/h2&gt;
&lt;p&gt;Short answer: if you want to stay on Vue, VitePress is the closest fit; if you want something framework-agnostic, Astro + content collections + MDX gets you a similar experience.&lt;/p&gt;
&lt;p&gt;The reason is that VuePress 1.x maintenance has all but stopped, while VitePress is the successor the Vue team put together, and Astro was designed to handle Markdown / MDX natively. Aulvem itself ended up moving to Astro.&lt;/p&gt;
&lt;p&gt;A caveat: the exact state of each tool as of 2026 — latest version, maintenance posture, default features — is something to check against the official documentation. This post is, at heart, a note “someone who wrote on VuePress 1.x in 2021 went back and tidied up later” — not a reference for choosing a current tool.&lt;/p&gt;
&lt;h2 id=&quot;closing&quot;&gt;Closing&lt;/h2&gt;
&lt;p&gt;VuePress 1.x’s Markdown was an extension on top of plain Markdown — component embedding, named containers, and frontmatter on top — and at the time it had enough expressive power for small-to-medium documentation and blog use.&lt;/p&gt;
&lt;p&gt;As of 2026, that role has shifted to MDX + Astro / Next.js + content collections. The thinking behind the VuePress era (keep article metadata in frontmatter, write callout blocks with a syntax, componentize what gets reused) still translates straight across to the new stack, so this post is left up as a design record from that time.&lt;/p&gt;
</content:encoded><category>build</category><category>VuePress</category></item><item><title>Belis wireless numeric keypad review — a slim USB 2.4GHz keypad with a calculator key</title><link>https://aulvem.com/blog/2021-03-01-belis-numerickeypad/</link><guid isPermaLink="true">https://aulvem.com/blog/2021-03-01-belis-numerickeypad/</guid><description>Hands-on with the Belis wireless numeric keypad. Strong on its USB 2.4GHz link and dedicated calculator key; weak on a red LED that keeps shouting at you while you type.</description><pubDate>Mon, 01 Mar 2021 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;2026 update&lt;/strong&gt;: Ported from the old VuePress blog. Belis-branded numeric keypads vary by production run, so before buying, check the product page for the three things that matter: USB 2.4GHz, a dedicated calculator key, and scissor switches. The specs below are from the unit I bought at the time of writing.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;If you do any kind of calculator-style number entry on a tenkeyless keyboard, the cost of stretching your fingers off home row adds up quietly. For work where you punch in numbers many times a day, a separate keypad on the side of the desk ends up faster.&lt;/p&gt;
&lt;p&gt;That is what I bought the Belis wireless numeric keypad for. It sits in the affordable bracket and ticks the three boxes I wanted: USB 2.4GHz, a calculator key, and a slim body. This is the write-up after about six months of use.&lt;/p&gt;
&lt;h2 id=&quot;the-verdict--worth-it-if-you-hit-the-calculator-key-every-day&quot;&gt;The verdict — worth it if you hit the calculator key every day&lt;/h2&gt;
&lt;p&gt;Short answer: a dedicated calculator key, a stable USB 2.4GHz receiver link, and a slim body that drops onto the edge of a desk without fuss. If you launch the calculator often for work, it earns its price.&lt;/p&gt;
&lt;p&gt;The reason is the workflow. Before this, I had the Windows application key mapped to “open Calculator” — now that lives on a single dedicated key. The action that fires a dozen-plus times a day shaves a second or two each time.&lt;/p&gt;
&lt;p&gt;A few cautions before buying:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;If a light in your field of view bothers you&lt;/strong&gt;: the red LED stays lit the whole time the power switch is on&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;If you prefer a mechanical typing feel over a slim one&lt;/strong&gt;: the scissor switches will not feel like mechanical keys&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;If you use a Mac&lt;/strong&gt;: whether the calculator key works on macOS depends on the unit and OS version&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;build-and-feel--semi-gloss-black-6-tilt-runs-on-aaa-batteries&quot;&gt;Build and feel — semi-gloss black, ~6° tilt, runs on AAA batteries&lt;/h2&gt;
&lt;p&gt;Short answer: a semi-gloss black, slim-bodied wireless keypad with a roughly 6° forward tilt and scissor switches.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Belis wireless numeric keypad, top view&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-03-01-belis-numerickeypad/2021-03-01-Belis-Numerickeypad-front.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;p&gt;The top is semi-gloss black. It does not read as cheap, and on the desk it stays visually quiet.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Belis wireless numeric keypad, side view — about 6° of tilt&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-03-01-belis-numerickeypad/2021-03-01-Belis-Numerickeypad-side.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;p&gt;From the side, the near edge is thin and the body rises by roughly 6° toward the back (measured by eye). The angle keeps the wrist from bending too far back while typing.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Belis wireless numeric keypad, underside — power switch and battery cover&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-03-01-belis-numerickeypad/2021-03-01-Belis-Numerickeypad-back.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;p&gt;The power switch sits in the top-left of the underside. Power comes from two AAA batteries, and the rubber feet do their job. Dry cells instead of a built-in battery means no charging cable to manage, at the cost of having to keep spare batteries in a drawer.&lt;/p&gt;
&lt;h2 id=&quot;what-worked--the-calculator-key-the-wireless-link-the-scissor-feel&quot;&gt;What worked — the calculator key, the wireless link, the scissor feel&lt;/h2&gt;
&lt;p&gt;Short answer: the calculator key lands the moment you want it, the USB 2.4GHz link is steadier than expected, and the scissor switches feel better than a typical pantograph.&lt;/p&gt;
&lt;h3 id=&quot;the-calculator-key-is-a-dedicated-key&quot;&gt;The calculator key is a dedicated key&lt;/h3&gt;
&lt;p&gt;This is the main reason I bought the keypad and the part I am happiest about after using it.&lt;/p&gt;
&lt;p&gt;Before this I had “open Calculator” mapped to the Windows application key, but a dedicated, labelled key is something you can hit without looking. &lt;strong&gt;You press it the moment you want it and the calculator pops up&lt;/strong&gt; — that flow is quietly satisfying.&lt;/p&gt;
&lt;p&gt;Expense reports, rough inventory counts, simple arithmetic — the moments where you think “I want the calculator right now” come up more often than you would guess in a day. The gap between a remapped key and a dedicated key is tiny per press, but the press count is high.&lt;/p&gt;
&lt;h3 id=&quot;usb-24ghz-with-no-perceptible-latency&quot;&gt;USB 2.4GHz with no perceptible latency&lt;/h3&gt;
&lt;p&gt;Wireless keypads come in Bluetooth and USB 2.4GHz flavours. I had been bitten before by a Bluetooth keyboard where keystrokes arrived on screen a few dozen milliseconds late, so this time I picked the USB-receiver type.&lt;/p&gt;
&lt;p&gt;Result: in six months of use, I have not once felt latency while entering numbers. Even right after the machine wakes from sleep, there is no warm-up wait. If you can spare one USB port for the receiver, stability is more honest than Bluetooth.&lt;/p&gt;
&lt;h3 id=&quot;scissor-switches-feel-better-than-i-expected&quot;&gt;Scissor switches feel better than I expected&lt;/h3&gt;
&lt;p&gt;Going in, I assumed the feel would be close to a laptop pantograph keyboard, but the real thing has a touch more click to it. This was my first time with scissor switches; the feel sits somewhere between a slim keyboard and a mechanical one, and fingertips do not tire as quickly over long sessions.&lt;/p&gt;
&lt;p&gt;For a number-entry-only role, it is plenty.&lt;/p&gt;
&lt;h2 id=&quot;what-didnt--the-led-shouts-while-you-type&quot;&gt;What didn’t — the LED shouts while you type&lt;/h2&gt;
&lt;p&gt;Short answer: when the power switch is on, the red LED on the body stays lit, and it catches the corner of your eye while you work.&lt;/p&gt;
&lt;img width=&quot;800&quot; alt=&quot;Belis wireless numeric keypad LED — red light on while powered&quot; src=&quot;https://pub-dfb37d47cd654d8aad6fc0ad2b6a6457.r2.dev/images/blog/2021-03-01-belis-numerickeypad/2021-03-01-Belis-Numerickeypad-light.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;/&gt;
&lt;p&gt;It photographs more discreetly than it looks in person — with the unit in front of you, there is a small red dot glowing in your peripheral vision the whole time you are entering numbers. As a battery indicator it does its job, but as visual noise while typing it is, frankly, in the way.&lt;/p&gt;
&lt;p&gt;The workarounds are physical: shift the keypad a little away from the monitor, or place it so the LED is not in your line of sight. There is no way to switch the LED off on the unit (it may vary by production run).&lt;/p&gt;
&lt;p&gt;For long stretches in front of a monitor, plan the placement around the LED from the start.&lt;/p&gt;
&lt;h2 id=&quot;comparison-belis-wireless-keypad-vs-the-alternatives&quot;&gt;Comparison: Belis wireless keypad vs the alternatives&lt;/h2&gt;
&lt;p&gt;Here are the configurations that come up against this one when you filter for USB 2.4GHz, a calculator key, and a slim profile. Prices and specs are reference values from the time of writing and shift by production run and date.&lt;/p&gt;















































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Angle&lt;/th&gt;&lt;th&gt;Belis wireless keypad&lt;/th&gt;&lt;th&gt;Elecom TK-TDM017 series (wired, calculator key)&lt;/th&gt;&lt;th&gt;Sanwa Supply Bluetooth keypad&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Connection&lt;/td&gt;&lt;td&gt;USB 2.4GHz&lt;/td&gt;&lt;td&gt;USB wired&lt;/td&gt;&lt;td&gt;Bluetooth&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Calculator key&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Depends on model&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Switch type&lt;/td&gt;&lt;td&gt;Scissor&lt;/td&gt;&lt;td&gt;Mostly membrane&lt;/td&gt;&lt;td&gt;Pantograph / membrane&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Power&lt;/td&gt;&lt;td&gt;2x AAA&lt;/td&gt;&lt;td&gt;USB bus power&lt;/td&gt;&lt;td&gt;Built-in cell or dry cells&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Latency concern&lt;/td&gt;&lt;td&gt;Low&lt;/td&gt;&lt;td&gt;None (wired)&lt;/td&gt;&lt;td&gt;Slightly higher (environment-dependent)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Desk handling&lt;/td&gt;&lt;td&gt;Good (wireless, slim)&lt;/td&gt;&lt;td&gt;Cable to manage&lt;/td&gt;&lt;td&gt;Good&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;The specs are a rough sketch from the unit I bought and the public info at the time; current production runs may differ.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;If Bluetooth latency does not bother you&lt;/strong&gt; → the Sanwa Supply type is fine, and it leaves your USB ports alone&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;If you want zero latency, no compromises&lt;/strong&gt; → wired Elecom TK-TDM017 series, with plenty of calculator-key options&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;If you can give up one USB port for wireless&lt;/strong&gt; → a USB 2.4GHz unit like the Belis, balancing stability and desk handling&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;faq&quot;&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Q. Does the calculator key work on a Mac?&lt;/strong&gt;
A. If macOS cannot bind a key to the Calculator app, the dedicated calculator key may either do nothing or register as a different key. Windows is confirmed working; on Mac, behaviour depends on the OS version and production run, so check the product page for explicit Mac support before buying.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. How long do the batteries last?&lt;/strong&gt;
A. With two AAA cells and daily number-entry use, the batteries that came in the box lasted about two to three months (varies by unit). Switching off the power when you are done with the day stretches that further.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. Can it sit next to a laptop keyboard?&lt;/strong&gt;
A. The slim body means the step between the laptop keyboard and the keypad is small, so the hand moves between them naturally. Next to a slim desktop keyboard the tilt angles roughly match, which keeps the feel consistent.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. Is the layout the same as a full keyboard’s numeric pad?&lt;/strong&gt;
A. The number block matches the numeric pad on a full keyboard, and NumLock behaves normally. Function keys and some symbol keys are laid out unconventionally, so anyone who wants a perfect full-keyboard replica should check the layout in the product photos first.&lt;/p&gt;
&lt;h2 id=&quot;verdict--easy-pick-if-calculator-key-and-usb-wireless-both-land&quot;&gt;Verdict — easy pick if “calculator key” and “USB wireless” both land&lt;/h2&gt;
&lt;p&gt;This is not a mouse-of-the-year type product.&lt;/p&gt;
&lt;p&gt;If a dedicated calculator key, a USB 2.4GHz link that does not stutter, and a slim body that does not crowd the desk all matter to you, the price is well spent. It fits people who handle a lot of numbers in office work and people pairing it with a tenkeyless keyboard.&lt;/p&gt;
&lt;p&gt;If a glowing LED at the edge of your vision wears on you, if you prefer a heavy mechanical feel, or if your daily driver is a Mac, look at another option — fewer regrets that way.&lt;/p&gt;
</content:encoded><category>reviews</category><category>PCPeripherals</category><category>numeric-keypad</category><category>wireless</category></item><item><title>VuePress/blog directory structure — a 2021 build note (archived)</title><link>https://aulvem.com/blog/2021-03-01-vuepress-structure/</link><guid isPermaLink="true">https://aulvem.com/blog/2021-03-01-vuepress-structure/</guid><description>How I structured a blog with VuePress 1.x and @vuepress/plugin-blog 1.9 back in 2021 — directory layout and config.js settings, kept as an archive of how I made the call at the time.</description><pubDate>Mon, 01 Mar 2021 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;2026 update&lt;/strong&gt;: A post ported over from the old VuePress blog. VuePress 1.x is no longer a viable choice for new development, so the body here is kept as an archive of “how the build looked in 2021”. The idea of splitting directories by concern still applies to current SSGs like Astro, so read it as comparison material.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Back in 2021, the personal blog that became the precursor to Aulvem was built on VuePress 1.x with &lt;code&gt;@vuepress/plugin-blog&lt;/code&gt;. There wasn’t much information out there beyond the official docs, and I got stuck on directory layout and plugin configuration more than once — so once the site was actually running, I wrote this down as a working note.&lt;/p&gt;
&lt;p&gt;As of 2026 I’ve moved over to Astro 5, and VuePress 1.x is for all practical purposes unmaintained (confirm the official EOL announcement for the 1.x line). So read what follows as “a record of how the call was made at the time”.&lt;/p&gt;
&lt;h2 id=&quot;the-short-answer--vuepress-1x-splits-into-_posts-and-vuepress&quot;&gt;The short answer — VuePress 1.x splits into _posts and .vuepress&lt;/h2&gt;
&lt;p&gt;Short answer: put article Markdown under &lt;code&gt;_posts/&lt;/code&gt;, and configuration plus theme under &lt;code&gt;.vuepress/&lt;/code&gt;. That was the standard layout when using plugin-blog.&lt;/p&gt;
&lt;p&gt;The reason is separation of concerns. Content (written often) and framework configuration (written rarely) go in different directories, which keeps deploy logs and git diffs easier to read.&lt;/p&gt;
&lt;p&gt;Concretely, the layout looked 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;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;src&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;├─ _posts                   Markdown for each article&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│  └─ category&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│     └─ page.md&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;└─ .vuepress&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   ├─ components            Article-side components (Vue)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   │  └─ Component.vue&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   ├─ public&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   │  └─ img.jpg&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   ├─ theme&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   │  ├─ components         Components (Vue)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   │  │  └─ Component.vue&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   │  ├─ layouts            Page layouts (Vue)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   │  │  └─ Layout.vue&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   │  └─ styles&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   │     └─ style.styl&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   ├─ config.js             VuePress config (JS)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   └─ enhanceApp.js         Vue plugin entry (JS)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;During the build phase the three things you touch are &lt;code&gt;config.js&lt;/code&gt;, &lt;code&gt;enhanceApp.js&lt;/code&gt;, and &lt;code&gt;theme/&lt;/code&gt;. During operations the files you touch are &lt;code&gt;_posts/&lt;/code&gt; and &lt;code&gt;public/&lt;/code&gt;. Because the roles are different, once the build is done, the set of files you actually edit shifts on its own.&lt;/p&gt;
&lt;p&gt;A caveat: this layout assumes VuePress 1.x + plugin-blog 1.9. VuePress 2.x changed both the config location and the theme model, so a 1.x configuration won’t run on 2.x as-is.&lt;/p&gt;
&lt;h2 id=&quot;glossary-static-site-generator-ssg&quot;&gt;Glossary: Static Site Generator (SSG)&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;SSG (Static Site Generator)&lt;/strong&gt;: A generic name for tools that convert sources like Markdown into static HTML at build time. Unlike a CMS like WordPress that runs on the server for every request, the resulting HTML can simply be served from a CDN. VuePress, Astro, Next.js (output:static), Hugo, and Jekyll all fall into this category.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;VuePress is one such SSG, built on Vue.js and optimized for “Markdown-centric documentation sites”. plugin-blog is the plugin that bolts on “blog-style routing (tags, categories, post lists)” on top — that mental model is enough.&lt;/p&gt;
&lt;h2 id=&quot;configjs--the-site-wide-configuration-file&quot;&gt;config.js — the site-wide configuration file&lt;/h2&gt;
&lt;p&gt;Short answer: &lt;code&gt;config.js&lt;/code&gt; is where both VuePress core and plugin-blog settings live together. The site’s language, title, and routing are decided here.&lt;/p&gt;
&lt;p&gt;The reason is consolidation. You can split plugins and locales into separate files, but keeping it all in one file means the file reads as “the site’s spec”.&lt;/p&gt;
&lt;p&gt;A concrete example:&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:#79B8FF&quot;&gt;module&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;exports&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&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  locales: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    &amp;#39;/&amp;#39;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: { lang: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;#39;ja&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;  title: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;#39;Title(config.js)&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:#E1E4E8&quot;&gt;  plugins: [[&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    &amp;#39;@vuepress/blog&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;    {directories: [&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;        id: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;#39;home&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;        dirname: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;#39;home&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;        path: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;#39;/&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;        id: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;#39;tech&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;        dirname: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;#39;_posts/tech&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;        path: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;#39;/tech/&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;        itemPermalink: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;#39;/tech/:slug&amp;#39;&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;    frontmatters: [&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;        id: &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;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        keys: [&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;],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        path: &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;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        layout: &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;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        scopeLayout: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;Tag&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;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;h3 id=&quot;locales--the-default-language&quot;&gt;locales — the default language&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;locales&lt;/code&gt; sets the site’s default language. For a Japanese site, setting &lt;code&gt;/&lt;/code&gt; to &lt;code&gt;lang: &amp;#39;ja&amp;#39;&lt;/code&gt; is enough. For multilingual setups, you add another key like &lt;code&gt;/en/&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&quot;title--the-site-title&quot;&gt;title — the site title&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;title&lt;/code&gt; is used as the site name. From Vue files you can reference it as &lt;code&gt;$siteTitle&lt;/code&gt;. It becomes the reference point for things like OG image generation and header-logo swaps, so not hard-coding the title elsewhere makes operations easier.&lt;/p&gt;
&lt;h3 id=&quot;plugins--registering-vuepress-plugins&quot;&gt;plugins — registering VuePress plugins&lt;/h3&gt;
&lt;p&gt;You add VuePress plugins to the &lt;code&gt;plugins&lt;/code&gt; array. For any plugin including &lt;code&gt;@vuepress/blog&lt;/code&gt;, if you want to pass options, the rule at the time was to use a &lt;code&gt;[name, options]&lt;/code&gt; tuple rather than just the string name.&lt;/p&gt;
&lt;p&gt;You’ll need to dig into each plugin’s docs for detailed options. Writing it all out in &lt;code&gt;config.js&lt;/code&gt; makes the file balloon, so back then I kept reference URLs in comments.&lt;/p&gt;
&lt;h3 id=&quot;pluginsdirectories--url-directory-structure&quot;&gt;plugins/directories — URL directory structure&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;directories&lt;/code&gt; decides “which Markdown folder maps to which URL”. For the proto-Aulvem blog I wanted the category structure to map straight to URLs, so I added one array entry per category.&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;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  id: &amp;#39;tech&amp;#39;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  dirname: &amp;#39;_posts/tech&amp;#39;,       File path holding articles for this category&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  path: &amp;#39;/tech/&amp;#39;,               /tech/{{article path}}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  itemPermalink: &amp;#39;/tech/:slug&amp;#39;  Format for {{article path}}. :slug is the filename minus the date&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;A caveat: &lt;code&gt;dirname: &amp;#39;_posts/tech&amp;#39;&lt;/code&gt; &lt;strong&gt;only reaches one level deep and does not pick up grandchildren&lt;/strong&gt; (this is plugin-blog 1.9 behavior). So in practice categories could only nest one level. Sub-categories meant adding more &lt;code&gt;directories&lt;/code&gt; entries.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;itemPermalink&lt;/code&gt; lets you toggle whether the date appears in the URL. I didn’t want dates in URLs, so I ran with just &lt;code&gt;:slug&lt;/code&gt;. That followed the conventional wisdom at the time that “dates in URLs make a page feel stale” (whether this actually affects rankings is case by case).&lt;/p&gt;
&lt;h3 id=&quot;pluginsfrontmatters--tag-feature&quot;&gt;plugins/frontmatters — tag feature&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;frontmatters&lt;/code&gt; generates tag pages. Writing &lt;code&gt;keys: [&amp;quot;tag&amp;quot;]&lt;/code&gt; makes the &lt;code&gt;tag&lt;/code&gt; field in a Markdown frontmatter become a tag page.&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;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  id: &amp;quot;tag&amp;quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  keys: [&amp;quot;tag&amp;quot;],          Key set in the Markdown frontmatter&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  path: &amp;quot;/tag/&amp;quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  layout: &amp;quot;Tag&amp;quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  scopeLayout: &amp;quot;Tag&amp;quot;&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;Once this is in place, two globals become available: &lt;code&gt;$tag&lt;/code&gt; and &lt;code&gt;$currentTag&lt;/code&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;$tag&lt;/code&gt; is the list of all tags and the articles bound to each. Used when building a tag index page.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$currentTag&lt;/code&gt; is the “current tag” info when an individual tag page is open.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;$currentTag&lt;/code&gt; looked 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;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;inside the current page&amp;#39;s `$currentTag` object&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;key: &amp;quot;Vue&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;pageKeys: [&amp;quot;xxxxxx&amp;quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;pages: [{...}]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;path: &amp;quot;/tag/Vue/&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;scope: &amp;quot;tag&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A caveat: this style of “API that generates globals” plays badly with TypeScript — there’s no way to type it. Schema-enforced typing, like Astro’s content collections, feels more like the current mainstream approach.&lt;/p&gt;
&lt;h2 id=&quot;enhanceappjs--where-vue-plugins-plug-in&quot;&gt;enhanceApp.js — where Vue plugins plug in&lt;/h2&gt;
&lt;p&gt;Short answer: it’s the entry point for installing ordinary Vue plugins into VuePress. Think of it as “the place where you put Vue.use”.&lt;/p&gt;
&lt;p&gt;The reason is that VuePress creates the Vue instance for you behind the scenes, so you can’t call &lt;code&gt;Vue.use()&lt;/code&gt; from a regular &lt;code&gt;main.js&lt;/code&gt; like in an SPA. Instead, &lt;code&gt;enhanceApp.js&lt;/code&gt; hands you the &lt;code&gt;Vue&lt;/code&gt; instance via its arguments.&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;import&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; VScrollLock &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;v-scroll-lock&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;export&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; default&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;  Vue,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  options,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  router,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  siteData&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:#E1E4E8&quot;&gt;  Vue.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;use&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(VScrollLock)&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;A caveat: putting heavy work here slows the initialization of every page. Better to keep this file to &lt;code&gt;Vue.use&lt;/code&gt; only and push real logic down into components.&lt;/p&gt;
&lt;h2 id=&quot;theme--where-layouts-and-css-live&quot;&gt;theme — where layouts and CSS live&lt;/h2&gt;
&lt;p&gt;Short answer: &lt;code&gt;theme/&lt;/code&gt; is the directory for non-article Vue files and CSS. The workflow was to copy the default theme via &lt;code&gt;npm run eject&lt;/code&gt; and override on top of it.&lt;/p&gt;
&lt;p&gt;The reason is that VuePress’s default theme isn’t directly editable. Running &lt;code&gt;eject&lt;/code&gt; expands the default theme set under &lt;code&gt;.vuepress/theme/&lt;/code&gt;, where you can edit anything.&lt;/p&gt;
&lt;p&gt;Right after eject, the directory looked 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;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;theme&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;├── `global-components`&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│   └── xxx.vue&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;├── `components`&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│   └── xxx.vue&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;├── `layouts`&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│   ├── Layout.vue _(**Mandatory**)_&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│   └── 404.vue&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;├── `styles`&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│   ├── index.styl&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│   └── palette.styl&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;├── `templates`&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│   ├── dev.html&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│   └── ssr.html&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;├── `index.js`&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;├── `enhanceApp.js`&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;└── package.json&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;UI parts get edited or added under &lt;code&gt;components/&lt;/code&gt;, and CSS lives either inside Vue files or under &lt;code&gt;styles/&lt;/code&gt;. &lt;code&gt;layouts/Layout.vue&lt;/code&gt; is required — delete it or rename it and the build dies immediately.&lt;/p&gt;
&lt;p&gt;A caveat: once you eject, you can’t auto-follow upstream theme updates anymore. I knew that going in at the time, but if I were doing this today I’d lean toward “minimal overrides only”, staying on the upstream theme — that’s the easier maintenance path (VuePress 2.x may have a different mechanism here).&lt;/p&gt;
&lt;h2 id=&quot;comparison-table--vuepress-1x-and-the-main-2026-ssgs&quot;&gt;Comparison table — VuePress 1.x and the main 2026 SSGs&lt;/h2&gt;
&lt;p&gt;Lining up VuePress at the time against the SSGs most often used for the same role in 2026:&lt;/p&gt;





























































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Lens&lt;/th&gt;&lt;th&gt;VuePress 1.x (2021)&lt;/th&gt;&lt;th&gt;Astro 5 (2026)&lt;/th&gt;&lt;th&gt;Next.js (App Router)&lt;/th&gt;&lt;th&gt;Hugo&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Primary language&lt;/td&gt;&lt;td&gt;Vue 2&lt;/td&gt;&lt;td&gt;framework-agnostic&lt;/td&gt;&lt;td&gt;React&lt;/td&gt;&lt;td&gt;Go templates&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Target&lt;/td&gt;&lt;td&gt;docs / small blogs&lt;/td&gt;&lt;td&gt;content sites broadly&lt;/td&gt;&lt;td&gt;apps and beyond&lt;/td&gt;&lt;td&gt;static sites with many pages&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Config file&lt;/td&gt;&lt;td&gt;&lt;code&gt;.vuepress/config.js&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;astro.config.mjs&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;next.config.js&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;config.toml&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Article location&lt;/td&gt;&lt;td&gt;&lt;code&gt;_posts/**&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;src/content/**&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;app/**&lt;/code&gt; or freeform MDX&lt;/td&gt;&lt;td&gt;&lt;code&gt;content/**&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Type safety&lt;/td&gt;&lt;td&gt;none (globals)&lt;/td&gt;&lt;td&gt;content collections with zod&lt;/td&gt;&lt;td&gt;TS and RSC&lt;/td&gt;&lt;td&gt;none&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Partial hydration&lt;/td&gt;&lt;td&gt;whole site is an SPA&lt;/td&gt;&lt;td&gt;islands (static by default)&lt;/td&gt;&lt;td&gt;RSC + Client Components&lt;/td&gt;&lt;td&gt;static only&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2026 maintenance&lt;/td&gt;&lt;td&gt;1.x effectively halted&lt;/td&gt;&lt;td&gt;active&lt;/td&gt;&lt;td&gt;active&lt;/td&gt;&lt;td&gt;active&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;The point here isn’t superiority but a difference in how concerns get sliced. For the narrow use case of “output a Markdown-centric blog statically”, VuePress 1.x worked fine. Aulvem itself moved to Astro because the article count grew and I wanted type safety.&lt;/p&gt;
&lt;h2 id=&quot;faq&quot;&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Q. Is VuePress 1.x still usable in 2026?&lt;/strong&gt;
A. You can still get it running. But maintenance — plugin-blog included — has all but stopped, and you can’t expect timely vulnerability patches in dependencies. Not the safe pick for new builds. For keeping an existing site alive, pinning Node versions and locking your &lt;code&gt;package-lock.json&lt;/code&gt; properly is the minimum bar (confirm whether an official EOL announcement exists).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. How is VuePress different from Astro / Next.js?&lt;/strong&gt;
A. VuePress is Vue 2-based, starting from “Markdown-centric documentation sites”. Astro is framework-agnostic and uses partial hydration (islands), which makes mixing Markdown and dynamic parts easier. Next.js is React-based and covers anything from static sites to dynamic apps. Same “static site” label, different scope and assumptions.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. Why split _posts and .vuepress?&lt;/strong&gt;
A. Separation of concerns between “article content” and “framework configuration”. The idea of grouping things that change at different rates into different directories carries over to Astro’s &lt;code&gt;src/content/&lt;/code&gt; vs. &lt;code&gt;src/layouts/&lt;/code&gt; split. The opposite school exists too — Next.js App Router puts everything under &lt;code&gt;app/&lt;/code&gt; — so this is partly a matter of taste in design.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q. What would I pick today for a similar setup?&lt;/strong&gt;
A. For a Markdown-focused blog, Astro + content collections is the closest in feel. If staying on Vue is required, VitePress and Nuxt Content are the successor candidates, but they each cover slightly different ground — check the official docs to see if they fit your use case.&lt;/p&gt;
&lt;h2 id=&quot;closing&quot;&gt;Closing&lt;/h2&gt;
&lt;p&gt;VuePress 1.x’s layout rested on a simple separation: “write in &lt;code&gt;_posts&lt;/code&gt;, configure in &lt;code&gt;.vuepress&lt;/code&gt;”. At the time, that directness was what carried me through to getting the site running.&lt;/p&gt;
&lt;p&gt;As of 2026 Aulvem itself runs on Astro 5. The same idea of splitting concerns across directories survives in a different form — so I’d be glad if this post gets used as a past snapshot, useful for comparing against today’s SSGs.&lt;/p&gt;</content:encoded><category>build</category><category>VuePress</category></item></channel></rss>