<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: liubinpm</title>
    <description>The latest articles on DEV Community by liubinpm (@liubinpm).</description>
    <link>https://dev.to/liubinpm</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4181888%2F5c78a219-81db-4e6e-8b16-57216fc278f7.png</url>
      <title>DEV Community: liubinpm</title>
      <link>https://dev.to/liubinpm</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/liubinpm"/>
    <language>en</language>
    <item>
      <title>How a Cut List Optimizer Plans a Plywood Breakdown (and What to Check Before You Cut)</title>
      <dc:creator>liubinpm</dc:creator>
      <pubDate>Tue, 10 Nov 2026 20:08:21 +0000</pubDate>
      <link>https://dev.to/liubinpm/how-a-cut-list-optimizer-plans-a-plywood-breakdown-and-what-to-check-before-you-cut-i9l</link>
      <guid>https://dev.to/liubinpm/how-a-cut-list-optimizer-plans-a-plywood-breakdown-and-what-to-check-before-you-cut-i9l</guid>
      <description>&lt;p&gt;If you have ever drawn cabinet parts on a sheet of paper, then found out at the saw that the last shelf is an eighth of an inch short, you already know why cut list planning matters. A cut list optimizer does the layout arithmetic for you, but you still need to understand what it assumes. This article walks through what goes into a good plan and where the common mistakes are.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a cut list is
&lt;/h2&gt;

&lt;p&gt;A cut list is the list of every piece a project needs: a name, a length, a width and a quantity. For a bookcase it might be two sides, five shelves, a back panel and a top. The optimizer's job is to place those pieces on as few sheets as possible, then tell you how to cut them.&lt;/p&gt;

&lt;p&gt;A tool such as &lt;a href="https://cut-list-optimizer-free.pages.dev/" rel="noopener noreferrer"&gt;Cut List Optimizer&lt;/a&gt; asks for three things: the sheet size, the parts, and the width of your saw blade. It returns the sheet count, the percentage of material used, the leftover area, a drawing of each sheet and a numbered cut order.&lt;/p&gt;

&lt;h2&gt;
  
  
  Input 1: the real sheet size
&lt;/h2&gt;

&lt;p&gt;The common starting point is a 4 x 8 ft sheet, which is 48 x 96 inches. Suppliers do sell other sizes, and some sheets are trimmed slightly smaller than nominal. Measure the sheet you are buying, or ask the supplier, and enter that number. A plan built on the nominal length fails on a sheet that is cut a little shorter.&lt;/p&gt;

&lt;h2&gt;
  
  
  Input 2: the kerf
&lt;/h2&gt;

&lt;p&gt;Every saw cut removes material. A typical table saw blade removes about 1/8 inch (3 mm); thin-kerf blades and track saws remove less. The exact figure is printed on the blade or in its manual.&lt;/p&gt;

&lt;p&gt;Here is why it matters. Say you want two panels, each 24 inches wide, from the 48 inch width of a sheet. On paper, 24 + 24 = 48, a perfect fit. In practice the cut between them takes 1/8 inch, so you need 24 + 1/8 + 24 = 48 1/8 inches. The second panel comes out short, or the layout simply does not fit. A planner that reserves the kerf at every cut will either put those panels on separate sheets or tell you the width is too tight. That is a better outcome than discovering it after the first rip.&lt;/p&gt;

&lt;h2&gt;
  
  
  Input 3: the parts, entered the way you will cut them
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Use finished sizes, not nominal sizes. A "3/4 inch" plywood sheet is often a little thinner, and your part dimensions should come from your drawing.&lt;/li&gt;
&lt;li&gt;Use quantities instead of repeated rows. Eight identical shelves are one row with quantity 8.&lt;/li&gt;
&lt;li&gt;Accept fractions. Good tools understand 23 1/2, 23.5 and 3/4 so you can type straight from a pencil list.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Grain direction
&lt;/h2&gt;

&lt;p&gt;Plywood face veneer runs along the sheet's length. If a visible part, such as a face frame rail or a shelf front, needs the grain running a certain way, the optimizer must not rotate it. Parts nobody will see, like a cabinet back or a drawer bottom, can rotate freely, and allowing that usually saves material. In the tool, this is a rotate switch on each part. Turning it off for visible parts and leaving it on for hidden ones is the simplest way to protect appearance without giving up yield.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why "guillotine cuts" are the practical choice
&lt;/h2&gt;

&lt;p&gt;A guillotine layout is one where every cut runs edge to edge across the piece in front of you. That is how a table saw or a track saw guide works. Some packing algorithms squeeze out extra parts by using cuts that stop in the middle of a board. Those layouts look efficient on screen and are difficult to make accurately and safely. The tool described here only produces edge-to-edge cuts, which is the right trade for a workshop.&lt;/p&gt;

&lt;h2&gt;
  
  
  The cut order matters as much as the diagram
&lt;/h2&gt;

&lt;p&gt;A drawing of parts on a sheet does not tell you what to do first. A useful plan gives a numbered list, for example "1. Rip at 24 in (fence 24 in)". Long rip cuts come first, then cross cuts, and cuts that share a fence setting are grouped so you set the fence once and run every piece that needs that width.&lt;/p&gt;

&lt;p&gt;This addresses a common complaint about layout software: the plan that saves the most material may ask you to move the fence every few cuts, so you spend your time on setup and introduce more chances for error. Sometimes a plan with one slightly higher offcut area but fewer fence changes is the one you will cut accurately.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the plan cannot do
&lt;/h2&gt;

&lt;p&gt;Be clear about the limits before trusting any layout:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;It does not guarantee the best possible arrangement.&lt;/strong&gt; Optimal packing is a hard problem. The tool tries several sorting and placement strategies and keeps the one with the fewest sheets, then the highest yield, then the fewest cuts. A better arrangement might exist.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It cannot see your wood.&lt;/strong&gt; On solid lumber, knots, checks and color differences need a human decision. Treat the diagram as a starting point.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It assumes a clean rectangle.&lt;/strong&gt; Damaged corners or factory-trimmed edges are not modeled.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It uses one sheet size per calculation.&lt;/strong&gt; If your project mixes sheet sizes, run each size separately.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  A short checklist before the first cut
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Measure the actual sheet and the actual kerf.&lt;/li&gt;
&lt;li&gt;Compare the part count in the result against your own list. If the tool's count and your own list disagree, find out why before cutting.&lt;/li&gt;
&lt;li&gt;Mark grain-sensitive parts and confirm they sit lengthwise on the sheet.&lt;/li&gt;
&lt;li&gt;Cut the long rips first, following the numbered order.&lt;/li&gt;
&lt;li&gt;Cut one part, measure it against the plan, then continue.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For a weekend cabinet, a pencil and paper can work with a handful of parts. With fifteen different sizes spread over three sheets, a calculator that recomputes in seconds helps: you can try shortening a shelf by half an inch and see right away whether you still fit on the same number of sheets.&lt;/p&gt;

&lt;p&gt;The principle behind all of this is simple. The saw blade has a width, the grain has a direction, and the fence has a position. A layout that respects all three is one you can actually cut.&lt;/p&gt;

</description>
      <category>woodworking</category>
      <category>tutorial</category>
      <category>beginners</category>
    </item>
    <item>
      <title>How to Convert a Metric Tire Size Like 275/55R20 to Inches</title>
      <dc:creator>liubinpm</dc:creator>
      <pubDate>Fri, 30 Oct 2026 20:17:15 +0000</pubDate>
      <link>https://dev.to/liubinpm/how-to-convert-a-metric-tire-size-like-27555r20-to-inches-46cm</link>
      <guid>https://dev.to/liubinpm/how-to-convert-a-metric-tire-size-like-27555r20-to-inches-46cm</guid>
      <description>&lt;p&gt;Tire sizes are printed in a mix of units. Width is in millimetres, the sidewall is a percentage, and the rim is in inches. That is fine until you want to know how tall a tire actually is, or whether a set you found online will fit like the one you have now. The fix is to convert the code into one unit. Inches are the usual choice in the US, because lift kits, fender clearances and tire shop listings all use them.&lt;/p&gt;

&lt;p&gt;This walkthrough uses 275/55R20 as the example. The same steps work for any metric size.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the three numbers mean
&lt;/h2&gt;

&lt;p&gt;In 275/55R20:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;275&lt;/strong&gt; is the section width in millimetres, measured across the tire from sidewall to sidewall.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;55&lt;/strong&gt; is the aspect ratio. The sidewall height is 55% of the width.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;R20&lt;/strong&gt; means radial construction and a 20-inch rim diameter.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The width and the ratio are the part that trips people up. A 55 does not mean 55 millimetres. It means 55% of 275 mm.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Find the sidewall height
&lt;/h2&gt;

&lt;p&gt;Multiply the width by the aspect ratio and divide by 100. For 275/55R20 that gives a sidewall of 151 mm, which is about 6.0 inches once you divide by 25.4. Do this in millimetres first and convert at the end. Rounding the sidewall to whole inches before the next step is the most common way the final diameter ends up half an inch off.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Add two sidewalls to the rim
&lt;/h2&gt;

&lt;p&gt;The tire has a sidewall above the rim and another below it, so the overall diameter is the rim diameter plus two sidewall heights. For this size the result is 31.9 in. The width converts directly: 275 mm is 10.8 in.&lt;/p&gt;

&lt;p&gt;So a 275/55R20 is about 31.9 inches tall and 10.8 inches wide. These are nominal figures calculated from the size code. A real tire from a given brand can come out a little different, depending on the model, the rim width it is mounted on and its inflation. Tires also grow a little when inflated and sag a little under load, so treat the number as a close estimate, not a measurement.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Get circumference and revolutions per mile
&lt;/h2&gt;

&lt;p&gt;Circumference is the diameter times pi, which comes to 100.2 in for this tire. A mile is 63,360 inches, so dividing by the circumference gives about 632 revolutions per mile.&lt;/p&gt;

&lt;p&gt;This number matters because your speedometer and odometer count wheel rotations. If the new tire turns fewer times per mile than the old one, the car covers more ground per rotation and the speedometer reads low. The actual speed is the displayed speed multiplied by the new diameter and divided by the old diameter, and the odometer is off by the same ratio.&lt;/p&gt;

&lt;h2&gt;
  
  
  Using the numbers to compare two sizes
&lt;/h2&gt;

&lt;p&gt;Take a second size, 265/70R17, which is common on trucks and SUVs. Run the same three steps and it comes out at roughly 31.6 inches tall. The two tires look nothing alike on paper, with a different rim, a different ratio and a different width. But 31.9 in against 31.6 in is a difference of about 1%. The 275/55R20 is slightly taller and noticeably wider, with a much shorter sidewall, which means less cushion over potholes and a sharper look in the wheel well. Converting to inches is what makes all of that visible, because the codes themselves hide it.&lt;/p&gt;

&lt;p&gt;A common rule of thumb is to keep the overall diameter within about 3% of the original size. Past that, the speedometer error gets large enough to matter, and a tire that is taller than the original means you are going faster than the dash says. Gearing, the calibration of ABS and traction control, and clearance in the wheel well are the other things that change with diameter, so a size that is close to the original is the low-risk choice.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common mistakes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Treating the rim size as the tire size.&lt;/strong&gt; A 20-inch rim does not make a 20-inch tire. The 275/55R20 above is nearly 32 inches tall.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Comparing only the width.&lt;/strong&gt; A 285 is not necessarily a bigger tire than a 265 if the aspect ratio drops with it. Check the diameter.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ignoring the rim width.&lt;/strong&gt; A tire has a range of rim widths it is approved for. The nominal width in the code assumes a specific measuring rim.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Assuming fit.&lt;/strong&gt; The conversion tells you the size. It does not tell you whether the tire clears your suspension and fender at full lock and full compression. Measure on the vehicle or ask the shop.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Doing it faster
&lt;/h2&gt;

&lt;p&gt;The arithmetic is short, but doing it for several candidate sizes gets tedious. A &lt;a href="https://tire-size-comparison.pages.dev/tire-size/275-55r20" rel="noopener noreferrer"&gt;275/55R20 in inches&lt;/a&gt; page gives the diameter, width, sidewall and revolutions per mile for that size directly, and the same site has a converter and a two-size comparison for checking speedometer error.&lt;/p&gt;

&lt;p&gt;Whichever way you do it, the order is the same: convert the code to diameter and width, compare against the tire you have now, and keep the diameter change small unless you have a reason to change it.&lt;/p&gt;

</description>
      <category>automobile</category>
      <category>tutorial</category>
      <category>beginners</category>
    </item>
    <item>
      <title>How to Write a 15-Second AI UGC Video Ad Script (and What to Leave Out)</title>
      <dc:creator>liubinpm</dc:creator>
      <pubDate>Thu, 29 Oct 2026 13:03:12 +0000</pubDate>
      <link>https://dev.to/liubinpm/how-to-write-a-15-second-ai-ugc-video-ad-script-and-what-to-leave-out-3b8n</link>
      <guid>https://dev.to/liubinpm/how-to-write-a-15-second-ai-ugc-video-ad-script-and-what-to-leave-out-3b8n</guid>
      <description>&lt;p&gt;If you sell a physical product and search for an AI UGC video generator, you will find tools that promise a finished video in one click. Most small sellers need something earlier in the process: a script worth filming or generating, and a way to compare several angles before spending money on a creator. This article covers that earlier step, how to structure a 15-second script, how to write the selling-point line that feeds it, and which claims to keep out.&lt;/p&gt;

&lt;h2&gt;
  
  
  What "UGC" and "AI UGC" mean
&lt;/h2&gt;

&lt;p&gt;A UGC ad looks like an ordinary person talking about a product, usually shot on a phone and played vertically. Sellers use the format because it reads as a recommendation rather than a studio commercial. "AI UGC" means the person, the script, or both are produced with AI.&lt;/p&gt;

&lt;p&gt;The word "person" is where care is needed. An AI-made actor is a fictional character. It should be labeled as AI-generated, and it should not be presented as a real customer.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 15-second structure
&lt;/h2&gt;

&lt;p&gt;A short ad has room for three jobs and nothing else:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Seconds&lt;/th&gt;
&lt;th&gt;Part&lt;/th&gt;
&lt;th&gt;Job&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0–3&lt;/td&gt;
&lt;td&gt;Hook&lt;/td&gt;
&lt;td&gt;Name a problem or a surprise&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3–10&lt;/td&gt;
&lt;td&gt;Demo&lt;/td&gt;
&lt;td&gt;Show one benefit, in plain words&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10–15&lt;/td&gt;
&lt;td&gt;Call to action&lt;/td&gt;
&lt;td&gt;Tell the viewer the next step&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If a script runs long, cut the demo, not the hook. The hook decides whether anyone sees the rest.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hooks differ by product type
&lt;/h2&gt;

&lt;p&gt;Start from what the buyer already feels:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Skincare: the routine step that annoys people.&lt;/li&gt;
&lt;li&gt;Gadgets: the task the gadget replaces.&lt;/li&gt;
&lt;li&gt;Home goods: the mess it removes.&lt;/li&gt;
&lt;li&gt;Apparel: the fit problem.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Compare a weak line with a usable one:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Weak&lt;/th&gt;
&lt;th&gt;Usable&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;"This is the best product ever."&lt;/td&gt;
&lt;td&gt;"Gym bag smells like old shoes? Here is what this pouch does about it."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"Buy now, limited offer."&lt;/td&gt;
&lt;td&gt;"Link is below if you want to try it."&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The weak lines say nothing a viewer can check. The usable ones name a situation and one action.&lt;/p&gt;

&lt;h2&gt;
  
  
  Write the selling-point line carefully
&lt;/h2&gt;

&lt;p&gt;Whatever tool or process you use, the script is only as good as the one line you give it about the product. Include three things: the buyer, the job the product does, and one proof you can stand behind, such as a material, a size, or a feature.&lt;/p&gt;

&lt;p&gt;Leave out numbers you cannot show, words like "best" or "guaranteed", and any health, income, or before-and-after promise. A useful test: if a claim would need evidence in a shop listing, it needs evidence in an ad.&lt;/p&gt;

&lt;h2&gt;
  
  
  Test three angles on one product
&lt;/h2&gt;

&lt;p&gt;Instead of writing one script and hoping, generate or draft three that take different angles:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A problem the buyer already feels.&lt;/li&gt;
&lt;li&gt;A surprise about how the product works.&lt;/li&gt;
&lt;li&gt;A simple before-and-after of a daily task.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Read them side by side and pick the one that sounds most like your customers. Edit the first line to use their words, then read the whole script aloud and time it. Keep a short note of which angle you tried, so when you run the ad on a platform you know what changed between versions.&lt;/p&gt;

&lt;p&gt;One tool built for this step is &lt;a href="https://ai-ugc-ads.pages.dev/ai-ugc-ads" rel="noopener noreferrer"&gt;AI UGC Ads&lt;/a&gt;, a free tool where you upload a product photo, add one line, and pick a fictional actor. It returns three scripts and a first frame, with a daily free limit and no signup. It does not make video yet, which is why the angle test, not the finished clip, is the useful part today.&lt;/p&gt;

&lt;h2&gt;
  
  
  Check the first frame against the real product
&lt;/h2&gt;

&lt;p&gt;If your tool produces a still of an actor holding the product, treat it as a look test or a thumbnail test, or as a reference image in a brief for a creator. Compare packaging, label text, and colors against the real item. AI image output is not guaranteed to match the product exactly, so do not publish a frame where a buyer would notice the difference.&lt;/p&gt;

&lt;h2&gt;
  
  
  Do not make fake testimonials
&lt;/h2&gt;

&lt;p&gt;The tempting shortcut with AI is the customer-review ad: an AI actor saying "I used this for a month and it changed my skin." That is a made-up experience. In August 2024 the US Federal Trade Commission announced a final rule banning fake reviews and testimonials, including AI-generated ones, and allowing civil penalties (&lt;a href="https://www.ftc.gov/news-events/news/press-releases/2024/08/federal-trade-commission-announces-final-rule-banning-fake-reviews-testimonials" rel="noopener noreferrer"&gt;FTC press release&lt;/a&gt;). Even outside the US, ad platforms treat deceptive testimonials as a risk to your account.&lt;/p&gt;

&lt;p&gt;Safer practice:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Write scripts as a demonstration or a recommendation of a feature, not a personal experience that did not happen.&lt;/li&gt;
&lt;li&gt;Do not use real people's faces or photos without their permission, and do not swap faces.&lt;/li&gt;
&lt;li&gt;Put a visible AI-generated label on the output.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Who this approach suits
&lt;/h2&gt;

&lt;p&gt;It suits sellers testing angles before paying a creator, small stores that need script ideas quickly, and agencies drafting a brief. It does not suit anyone who needs a finished video today or a lookalike of a real person.&lt;/p&gt;

&lt;h2&gt;
  
  
  A short checklist before you use a script
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The hook names a problem or surprise within three seconds.&lt;/li&gt;
&lt;li&gt;The demo shows one benefit only.&lt;/li&gt;
&lt;li&gt;The call to action is one plain next step.&lt;/li&gt;
&lt;li&gt;Every claim is something you could show in a product listing.&lt;/li&gt;
&lt;li&gt;No invented personal experience; the AI actor is labeled.&lt;/li&gt;
&lt;li&gt;The script, read aloud, fits in 15 seconds.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A script that passes these checks is ready to hand to a creator, film yourself, or feed to a video tool.&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>beginners</category>
    </item>
    <item>
      <title>How to Turn an Article URL into a Video Without Rewriting It</title>
      <dc:creator>liubinpm</dc:creator>
      <pubDate>Sun, 25 Oct 2026 21:23:46 +0000</pubDate>
      <link>https://dev.to/liubinpm/how-to-turn-an-article-url-into-a-video-without-rewriting-it-2dp5</link>
      <guid>https://dev.to/liubinpm/how-to-turn-an-article-url-into-a-video-without-rewriting-it-2dp5</guid>
      <description>&lt;p&gt;Most posts never get a video version because the video work is slower than the writing. You need footage for every paragraph, a voiceover that lines up with the text, and captions that stay in sync. If the article is already finished, rebuilding it as a script feels like doing the job twice.&lt;/p&gt;

&lt;p&gt;Converting from a URL cuts out the rewriting. The text stays exactly as you published it, and the tool only handles the parts that are mechanical. Here is how that process works, what to check before you export, and where it goes wrong.&lt;/p&gt;

&lt;h2&gt;
  
  
  What happens when you paste a link
&lt;/h2&gt;

&lt;p&gt;A URL-to-video tool does five things in order:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;It fetches the public page and pulls out the main article text, ignoring menus and footers.&lt;/li&gt;
&lt;li&gt;It splits the text into short scenes at sentence breaks.&lt;/li&gt;
&lt;li&gt;It picks stock footage for each scene based on keywords from the sentences.&lt;/li&gt;
&lt;li&gt;It adds audio: an AI voiceover, a recording you upload, or captions only.&lt;/li&gt;
&lt;li&gt;It burns the captions into the picture and exports a file.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The first step decides how good everything else is. If the extractor grabs a cookie banner or a related-posts list, those lines become scenes. So the one habit worth building is to read the extracted text before doing anything else.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step by step
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Pick an article that suits video
&lt;/h3&gt;

&lt;p&gt;Posts with a clear sequence work best: how-tos, checklists, short explainers. A step-by-step post maps almost one-to-one onto scenes. A long opinion essay with few concrete nouns gives the footage search very little to work with, and you end up with generic clips of people typing.&lt;/p&gt;

&lt;p&gt;Only use articles you own or have permission to use. Converting someone else's post and publishing it as a video is a copyright problem, not a workflow shortcut.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Paste the link and prune the text
&lt;/h3&gt;

&lt;p&gt;Paste the URL into &lt;a href="https://article-to-video.pages.dev/" rel="noopener noreferrer"&gt;Article to Video&lt;/a&gt;. It shows the title and the paragraphs it found. Untick anything that doesn't belong in a spoken video: author bios, "subscribe to my newsletter" blocks, long code samples, tables that only make sense on a page.&lt;/p&gt;

&lt;p&gt;A members-only or paywalled post can't be fetched, since the tool reads the same public page a visitor sees. For those, paste the text directly instead.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Check every scene
&lt;/h3&gt;

&lt;p&gt;Each scene shows its sentence group and the keywords used to search for footage. This is where most of the quality comes from:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Vague keywords give vague clips.&lt;/strong&gt; If a scene about repotting a plant is searching for "process", change it to "repotting plant".&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Abstract sentences need a visual anchor.&lt;/strong&gt; For a sentence like "consistency matters more than intensity", pick a keyword for a concrete image, such as a calendar or a morning routine, rather than leaving the default.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Long scenes drag.&lt;/strong&gt; If a scene holds five sentences, split it so the picture changes with the thought.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Swap any clip that doesn't fit. A few minutes of swapping is the difference between a video that looks assembled and one that looks careless.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Choose the audio
&lt;/h3&gt;

&lt;p&gt;You have three options, and they suit different cases:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AI voiceover&lt;/strong&gt; is fastest and fine for explainers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Your own recording&lt;/strong&gt; sounds more personal. Read the article aloud and upload the file; it works best when you've already edited the text to read well out loud.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Captions only&lt;/strong&gt; suits short vertical videos watched with the sound off, where most viewers read rather than listen.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Whichever you choose, listen to the first thirty seconds before exporting. Numbers, abbreviations and product names are where synthetic voices stumble, and it's cheaper to fix a spelling in the scene text than to re-export.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Pick a ratio and export
&lt;/h3&gt;

&lt;p&gt;Choose 16:9 for YouTube and embedding in the original post, 9:16 for Shorts, Reels and TikTok, 1:1 for feeds that crop to a square. Because captions are burned into the picture, check that they aren't covered by platform interface elements in the vertical format. Keep important text away from the bottom edge.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common mistakes
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Exporting without reading the extracted text.&lt;/strong&gt; The extractor is good but not perfect. Pull-quotes, image captions and inline ads occasionally slip in.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Treating the video as the full article.&lt;/strong&gt; A video built from every paragraph of a long post runs long. Untick the sections that only work on the page and let the video carry the main argument.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Expecting a video downloader.&lt;/strong&gt; This kind of tool builds a new video from text. It does not save existing videos from other sites, and it shouldn't be used for that.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Skipping the hook.&lt;/strong&gt; The first scene is the sentence your article opens with. If that sentence is background rather than the point, move the strongest sentence up front before you export.&lt;/p&gt;

&lt;h2&gt;
  
  
  When to use it, and when not to
&lt;/h2&gt;

&lt;p&gt;URL to video is a good fit when you already have a finished, well-structured post and want a second format for a different audience, such as people who find content on YouTube or Shorts rather than search. It is a poor fit when the article depends on screenshots, charts or code, because stock footage can't show those. In that case, record a screen capture instead.&lt;/p&gt;

&lt;p&gt;For a first test, take your shortest how-to post, convert it, and compare the result with what you would have spent making it by hand. If the scenes need heavy editing, the problem is usually the source text, not the tool: tighten the post and run it again.&lt;/p&gt;

</description>
      <category>video</category>
      <category>marketing</category>
      <category>tutorial</category>
      <category>beginners</category>
    </item>
    <item>
      <title>How to Turn a Generated Book Title Into the Real One</title>
      <dc:creator>liubinpm</dc:creator>
      <pubDate>Mon, 19 Oct 2026 06:09:23 +0000</pubDate>
      <link>https://dev.to/liubinpm/how-to-turn-a-generated-book-title-into-the-real-one-29d6</link>
      <guid>https://dev.to/liubinpm/how-to-turn-a-generated-book-title-into-the-real-one-29d6</guid>
      <description>&lt;p&gt;A title generator will not hand you the finished title of your book. It gives you a pile of candidates, and the useful work starts after that: deciding which one is worth keeping, and what to change so it fits your book. This post covers how to read a list of generated titles, how to test the ones that survive, and what to check before you commit to one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Read the list for shape, not for words
&lt;/h2&gt;

&lt;p&gt;Most generated titles come from sentence patterns with words dropped into slots. A tool such as the &lt;a href="https://plotgenerator.pages.dev/book-title-generator" rel="noopener noreferrer"&gt;PlotGenerator book title generator&lt;/a&gt; shows this openly. It lists 14 patterns, for example "The {noun} of {place}", "Where the {plural noun} {verb}" and "A {adjective} Kind of {noun}", and fills them from word lists for each genre. A run for fantasy might return titles like &lt;em&gt;Before the Oath&lt;/em&gt; or &lt;em&gt;The Heir at Elderwood&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Once you know titles are built this way, you can read a batch differently. Skip the individual words at first and look at the patterns that appeal to you. Maybe you keep stopping at the "Before the ..." titles, or the ones with a place name in them. That tells you what rhythm fits your book. The words are the easy part to replace. If you like the shape of &lt;em&gt;The Orchard at the Island&lt;/em&gt; but your story has no island, keep "The ___ at ___" and write in your own nouns.&lt;/p&gt;

&lt;h2&gt;
  
  
  Match the title to the genre promise
&lt;/h2&gt;

&lt;p&gt;A title tells a browsing reader what kind of book to expect, often before they see the cover or the description. A cozy mystery with a horror-style title will attract readers who then feel misled. A romance called something cold and technical will be passed over by the people it was written for.&lt;/p&gt;

&lt;p&gt;Genre-specific word lists help here, since a horror list leans on bones, whispers and hunger while a romance list leans on letters, roses and vows. If you generate with the genre set to "Any", you will get mixed results and have to filter more. Pick your genre first, then generate several times. Eight titles per click means a few clicks give you a few dozen to scan, which is plenty.&lt;/p&gt;

&lt;h2&gt;
  
  
  Four quick tests
&lt;/h2&gt;

&lt;p&gt;Shortlist three to five titles, then run each through these:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Say it out loud.&lt;/strong&gt; If you trip over it, readers will too, and word of mouth depends on people being able to say the title to a friend.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shrink it.&lt;/strong&gt; Online stores show covers as thumbnails. A short title stays legible at that size, and a long one turns into a smear. Picture the title on a small cover in a store grid.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Search it in quotes.&lt;/strong&gt; Type the exact title in quotation marks into a search engine and then into the bookstores where you plan to sell. If a well-known book in your genre already has it, drop it. A book with the same title from another genre, years ago, is a smaller problem.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Say what it promises.&lt;/strong&gt; Write one sentence about what a reader expects from this title. If that sentence describes a different book from the one you wrote, the title is wrong, however good it sounds.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What the law says about titles
&lt;/h2&gt;

&lt;p&gt;Authors often worry that a generated title is "taken" in a legal sense. In the United States, copyright does not protect titles. The U.S. Copyright Office states this in its circular on short phrases and similar material: &lt;a href="https://www.copyright.gov/circs/circ33.pdf" rel="noopener noreferrer"&gt;Copyright Office Circular 33&lt;/a&gt; says that names, titles and short phrases are not protected by copyright.&lt;/p&gt;

&lt;p&gt;That is not the whole story. A title, and especially a series name, can sometimes function as a trademark if it identifies the source of a line of products. The USPTO explains how trademark protection works on its &lt;a href="https://www.uspto.gov/trademarks/basics/what-trademark" rel="noopener noreferrer"&gt;trademark basics page&lt;/a&gt;. The practical result is the same as test three above: search before you commit, and be more careful if you plan a series or merchandise under the name. Laws differ by country, so if you will publish outside the US, check the local rules.&lt;/p&gt;

&lt;h2&gt;
  
  
  Do not skip the manual edit
&lt;/h2&gt;

&lt;p&gt;The best use of a generated title is as a first draft. Three edits tend to improve one:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Swap in a word from your own book.&lt;/strong&gt; A name, an object or a place that appears in the text makes a generic title belong to you.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cut a word.&lt;/strong&gt; Many patterns produce titles one word longer than they need. "The Last Heart" works better than "The Last Heart of the Island".&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Change the verb.&lt;/strong&gt; Verbs carry the mood. Changing "wake" to "burn" or "sing" to "wait" can move a title from one tone to another.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Keep a running file of every title you like, including the ones you reject, because a rejected title for one book is sometimes the right title for the next.&lt;/p&gt;

&lt;h2&gt;
  
  
  A short workflow
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Choose the genre, then generate until you have a long list in front of you.&lt;/li&gt;
&lt;li&gt;Mark the patterns and words you respond to, not only whole titles.&lt;/li&gt;
&lt;li&gt;Shortlist three to five and edit each by hand.&lt;/li&gt;
&lt;li&gt;Run the four tests, including the quoted search.&lt;/li&gt;
&lt;li&gt;Sleep on it. A title that still sounds right the next morning is usually the one.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These steps work with any list of candidates, whether it comes from a generator, a brainstorm or a notebook.&lt;/p&gt;

</description>
      <category>writing</category>
      <category>education</category>
      <category>tutorial</category>
      <category>beginners</category>
    </item>
    <item>
      <title>How to estimate a child's adult height: the mid-parental method vs. CDC growth-curve projection</title>
      <dc:creator>liubinpm</dc:creator>
      <pubDate>Wed, 14 Oct 2026 06:48:17 +0000</pubDate>
      <link>https://dev.to/liubinpm/how-to-estimate-a-childs-adult-height-the-mid-parental-method-vs-cdc-growth-curve-projection-2klg</link>
      <guid>https://dev.to/liubinpm/how-to-estimate-a-childs-adult-height-the-mid-parental-method-vs-cdc-growth-curve-projection-2klg</guid>
      <description>&lt;p&gt;Most free child height calculators lean on one of two ideas, or a mix of both. One looks at the parents. The other looks at the child's position on a growth chart. Both fit in about 20 lines of JavaScript, and once you have written them you will understand what those calculators can and cannot tell you.&lt;/p&gt;

&lt;p&gt;This post walks through both methods, the formulas behind them, a runnable snippet, and the limits worth knowing before you put a number in front of a worried parent.&lt;/p&gt;

&lt;h2&gt;
  
  
  Method 1: mid-parental height (Tanner)
&lt;/h2&gt;

&lt;p&gt;The simplest approach comes from J. M. Tanner and colleagues in 1970. It assumes a child's adult height is centred on the average of the parents' heights, shifted by the typical difference between men and women.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Boys: (father + mother + 13) / 2&lt;/li&gt;
&lt;li&gt;Girls: (father + mother - 13) / 2&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All values are in centimetres. The 13 cm is the average adult height difference between men and women. The MSD Manual's clinical calculator gives a likely range of 8.5 cm either side of that target, which it describes as about two standard deviations. The AAFP review of short and tall stature uses a rounder rule of thumb: most children end up within 10 cm of their mid-parental height.&lt;/p&gt;

&lt;p&gt;Example: dad 175 cm, mom 162 cm. A son's target is (175 + 162 + 13) / 2 = 175 cm, with a likely range of 166.5 to 183.5 cm. A daughter's target is 162 cm.&lt;/p&gt;

&lt;p&gt;What this method ignores is the child. A tall 9-year-old and a short 9-year-old with the same parents get the same answer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Method 2: CDC growth-curve projection
&lt;/h2&gt;

&lt;p&gt;The second approach uses the child's current height and age. The idea: children past toddlerhood tend to follow one percentile curve on the growth chart, so if your 10-year-old is on the 60th percentile today, a reasonable guess is the 60th percentile at age 20.&lt;/p&gt;

&lt;p&gt;To do that you need the chart as numbers, not a picture. The CDC publishes exactly that. Its file &lt;code&gt;statage.csv&lt;/code&gt; covers stature-for-age from 2 to 20 years and, for each sex and every half month of age, gives three parameters called L, M and S. M is the median height. S is a measure of spread. L corrects for skew.&lt;/p&gt;

&lt;p&gt;With those three numbers, the CDC's own formulas convert any height into a z-score and back:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;z = ((X / M)^L - 1) / (L * S), when L is not 0&lt;/li&gt;
&lt;li&gt;X = M * (1 + L * S * z)^(1 / L)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The projection is two steps: compute z at the child's current age, then plug the same z into the L, M, S row for 240 months (age 20).&lt;/p&gt;

&lt;h2&gt;
  
  
  The code
&lt;/h2&gt;

&lt;p&gt;This snippet hard-codes two rows from &lt;code&gt;statage.csv&lt;/code&gt; so it runs on its own with &lt;code&gt;node&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Two rows from CDC statage.csv (boys): [ageMonths, L, M, S]&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;BOYS_120_5&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;120.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.505564115&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;138.8234114&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.047610108&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;BOYS_240&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;240&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="mf"&gt;1.167279219&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;176.8492322&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.040369574&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;midParental&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;father&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;mother&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;sex&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;est&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;father&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;mother&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sex&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;male&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="mi"&gt;13&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;est&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;low&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;est&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mf"&gt;8.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;high&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;est&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mf"&gt;8.5&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;zScore&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[,&lt;/span&gt; &lt;span class="nx"&gt;L&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;M&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;S&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nx"&gt;M&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;L&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;L&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;S&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;heightAtZ&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[,&lt;/span&gt; &lt;span class="nx"&gt;L&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;M&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;S&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;M&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;L&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;S&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nx"&gt;L&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// A 10-year-old boy, 140 cm. Dad 180 cm, mom 165 cm.&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;mp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;midParental&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;180&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;165&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;male&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;zScore&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;140&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;BOYS_120_5&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;projected&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;heightAtZ&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;BOYS_240&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;mid-parental:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;mp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;est&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;`(&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;mp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;low&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;-&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;mp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;high&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;)`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;z now:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toFixed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;percentile projection:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;projected&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toFixed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mid-parental: 179 (170.5-187.5)
z now: 0.18
percentile projection: 178.1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here the two methods agree to within a centimetre, which is the comfortable case. A z of 0.18 is roughly the 57th percentile.&lt;/p&gt;

&lt;p&gt;A real implementation needs the full table, interpolation between ages, the L = 0 branch, a normal CDF to turn z into a percentile, and input checks. I put a small, dependency-free version with tests on GitHub: &lt;a href="https://github.com/liubinpm/height-estimate" rel="noopener noreferrer"&gt;height-estimate&lt;/a&gt;. It bundles a roughly 4 KB subset of the CDC file and checks the math against the smoothed percentiles the CDC lists in the same CSV. Feed it the CDC's own 97th-percentile height and it returns 97.&lt;/p&gt;

&lt;h2&gt;
  
  
  When the two methods disagree
&lt;/h2&gt;

&lt;p&gt;The interesting cases are the ones where the numbers diverge. Say both parents are tall but the child sits on the 25th percentile. Mid-parental height says "tall adult"; the percentile projection says "below average".&lt;/p&gt;

&lt;p&gt;Neither number is wrong. They answer different questions. Mid-parental height is the genetic expectation. The projection assumes the child keeps their current position. A big gap between them is worth noticing, and it is one of the things doctors look at too. The AAFP review lists a projected height more than 10 cm below mid-parental height as one reason to refer to a pediatric endocrinologist.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limits to know before you ship this
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ages 2 to 20 only.&lt;/strong&gt; &lt;code&gt;statage.csv&lt;/code&gt; starts at 24 months. Infants need a different chart.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Puberty timing breaks the projection.&lt;/strong&gt; The method assumes the child stays on one percentile. An early starter can sit high on the chart for a while and then level off; a late starter can look the opposite. Be careful with ages around puberty.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One measurement is a single point.&lt;/strong&gt; The chart is about a curve over time, so a trend over several visits says more than one reading.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The CDC charts are a US reference.&lt;/strong&gt; Other populations may sit higher or lower.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;It is an estimate, not a diagnosis.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The AAFP review gives some practical red flags. After age 2, children usually track along a percentile, and variation should stay within two large bands on the chart. It lists as reasons for referral growth of less than 5 cm per year and no signs of puberty by age 14 in boys or 13 in girls. If you build a tool on these formulas, say so in plain words next to the result.&lt;/p&gt;

&lt;h2&gt;
  
  
  Trying it without code
&lt;/h2&gt;

&lt;p&gt;If you only want a number, I built a free calculator for ages 8 to 20 that blends the mid-parental estimate with a projection from the child's current height, and widens the range when the two disagree: &lt;a href="https://howtallai.com/?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=backlink_trial_202610" rel="noopener noreferrer"&gt;howtallai.com&lt;/a&gt;. Its projection uses a simpler share-of-adult-height table rather than the full LMS math, so the GitHub repo is the better place to see each method on its own.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Tanner JM, Goldstein H, Whitehouse RH. Standards for children's height at ages 2-9 years allowing for heights of parents. &lt;em&gt;Arch Dis Child&lt;/em&gt;. 1970;45(244):755-62. &lt;a href="https://pubmed.ncbi.nlm.nih.gov/5491878/" rel="noopener noreferrer"&gt;https://pubmed.ncbi.nlm.nih.gov/5491878/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;MSD Manual. Height Potential: A Child's Target Height Based on Midparental Height. &lt;a href="https://www.msdmanuals.com/iframe/manual/medical-calculators/heightpotential.htm" rel="noopener noreferrer"&gt;https://www.msdmanuals.com/iframe/manual/medical-calculators/heightpotential.htm&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Barstow C, Rerucha C. Evaluation of Short and Tall Stature in Children. &lt;em&gt;Am Fam Physician&lt;/em&gt;. 2015;92(1):43-50. &lt;a href="https://www.aafp.org/pubs/afp/issues/2015/0701/p43.html" rel="noopener noreferrer"&gt;https://www.aafp.org/pubs/afp/issues/2015/0701/p43.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;CDC. Growth Charts: Data Files (LMS parameters and formulas). &lt;a href="https://www.cdc.gov/growthcharts/cdc-data-files.htm" rel="noopener noreferrer"&gt;https://www.cdc.gov/growthcharts/cdc-data-files.htm&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;CDC. Stature-for-age, 2 to 20 years (statage.csv). &lt;a href="https://www.cdc.gov/growthcharts/data/zscore/statage.csv" rel="noopener noreferrer"&gt;https://www.cdc.gov/growthcharts/data/zscore/statage.csv&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>javascript</category>
      <category>tutorial</category>
      <category>health</category>
      <category>beginners</category>
    </item>
    <item>
      <title>How to Tell Your Face Shape From a Selfie</title>
      <dc:creator>liubinpm</dc:creator>
      <pubDate>Wed, 14 Oct 2026 06:34:03 +0000</pubDate>
      <link>https://dev.to/liubinpm/how-to-tell-your-face-shape-from-a-selfie-3aa8</link>
      <guid>https://dev.to/liubinpm/how-to-tell-your-face-shape-from-a-selfie-3aa8</guid>
      <description>&lt;p&gt;Most haircut advice starts with "know your face shape", and then skips the part where you actually find it out. Holding a phone up to a mirror and squinting at the outline of your face rarely settles it. You end up somewhere between "oval" and "round" and pick whichever sounds nicer.&lt;/p&gt;

&lt;p&gt;This post walks through a more repeatable way: four measurements, a few rules of thumb for seven common shapes, and the places where a selfie-based estimate goes wrong. At the end there is a small JavaScript function that turns the four numbers into a guess, in case you want to play with the rules yourself.&lt;/p&gt;

&lt;h2&gt;
  
  
  The four measurements
&lt;/h2&gt;

&lt;p&gt;You can take these with a soft tape measure, or on a straight-on photo with any image editor that shows pixel coordinates. Pixels are fine: only the ratios matter, so you never need to convert to centimeters.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Forehead width.&lt;/strong&gt; Measure across the widest part of the forehead, roughly halfway between the eyebrows and the hairline, from one temple to the other.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cheekbone width.&lt;/strong&gt; Find the highest point of each cheekbone (usually just below the outer corner of the eye) and measure straight across.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Jaw width.&lt;/strong&gt; Measure from one jaw angle to the other. The jaw angle is the corner below each ear where the jaw turns forward toward the chin.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Face length.&lt;/strong&gt; Measure from the center of the hairline down to the tip of the chin.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Write all four down. If you are working on a photo, mark the points first and then measure, so you are not tempted to nudge a line toward the answer you expect.&lt;/p&gt;

&lt;h2&gt;
  
  
  Seven shapes and how to tell them apart
&lt;/h2&gt;

&lt;p&gt;These are rules of thumb used in hair and styling guides, not anatomical categories. Real faces sit on a continuum, and a lot of people land between two shapes.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Oval.&lt;/strong&gt; The face is clearly longer than it is wide (often described as about one and a half times). Cheekbones are the widest line, the forehead is slightly wider than the jaw, and the jaw is rounded rather than angular.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Round.&lt;/strong&gt; Length and width are close to equal. Cheekbones are the widest point, and the jawline is soft with no visible corner.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Square.&lt;/strong&gt; Length and width are also close, but forehead, cheekbones and jaw are all about the same width, and the jaw has a sharp, visible angle.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Oblong (rectangle).&lt;/strong&gt; The face is noticeably long, and the three widths are similar to each other. Think of a square that has been stretched vertically.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Heart.&lt;/strong&gt; The forehead is the widest part, and the face narrows steadily to a narrow, sometimes pointed chin.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Diamond.&lt;/strong&gt; Cheekbones are clearly wider than both the forehead and the jaw, which are narrower and similar to each other. The chin is often pointed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Triangle (pear).&lt;/strong&gt; The jaw is the widest line and the forehead is the narrowest, the reverse of a heart.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Two checks do most of the work. First, which of the three widths is the largest? That alone separates heart, diamond and triangle from the rest. Second, how long is the face compared with its widest line? That separates round and square from oval and oblong.&lt;/p&gt;

&lt;p&gt;Round versus square is the one pair the numbers cannot decide. Both have similar length and width. The difference is the jaw corner, so you have to look at it: a defined angle below the ear points to square, a smooth curve points to round.&lt;/p&gt;

&lt;h2&gt;
  
  
  A small function to try the rules
&lt;/h2&gt;

&lt;p&gt;Here is the logic above as code. The thresholds (5%, 10%, 1.2, 1.4) are my own picks to make the rules concrete. They are not from a study, so treat them as knobs to adjust.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Rough rules of thumb, not a validated model.&lt;/span&gt;
&lt;span class="c1"&gt;// All four widths/lengths must use the same unit (cm or pixels).&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;guessFaceShape&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;forehead&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;cheekbones&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;jaw&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;angularJaw&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;width&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;forehead&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;cheekbones&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;jaw&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ratio&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nx"&gt;width&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// how long vs. how wide&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;near&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;abs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mf"&gt;0.05&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;jaw&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;cheekbones&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;jaw&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;forehead&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;triangle&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;forehead&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="nx"&gt;cheekbones&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;forehead&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;jaw&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;1.1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;heart&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cheekbones&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;forehead&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;1.1&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;cheekbones&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;jaw&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;1.1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;diamond&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;even&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;near&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;forehead&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;cheekbones&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nf"&gt;near&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cheekbones&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;jaw&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ratio&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mf"&gt;1.4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;even&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;oblong&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;oval&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ratio&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mf"&gt;1.2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;angularJaw&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;square&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;round&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;oval&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;guessFaceShape&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;forehead&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;cheekbones&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;jaw&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;length&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;19&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;angularJaw&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="c1"&gt;// -&amp;gt; "oval"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you run your own numbers and the answer flips when you change one measurement by a few millimeters, that is useful information: you are close to a boundary, and both shapes are worth reading about.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why selfie estimates go wrong
&lt;/h2&gt;

&lt;p&gt;Whether you measure by hand or let a tool do it, the input photo is usually the weakest link. The common error sources:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Lens distortion.&lt;/strong&gt; Phone front cameras are wide-angle. Held close, they enlarge the middle of the face and shrink the sides, so cheekbones and jaw look narrower than they are. Hold the phone at arm's length or farther, or have someone take the photo from a distance.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Head tilt and rotation.&lt;/strong&gt; Tipping the chin up or down changes the apparent face length. Turning even slightly to one side narrows the far half of the face. Look straight into the lens with your head level.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hairline.&lt;/strong&gt; Bangs, a receding hairline or hair pulled forward make the top of the face a guess, which affects both face length and forehead width. Pull hair back for the photo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hair and beards over the edges.&lt;/strong&gt; Hair falling over the cheeks or a full beard along the jaw hides exactly the lines you need to measure.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Expression.&lt;/strong&gt; A wide smile pushes the cheeks out; an open mouth adds length. Use a neutral face with the mouth closed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inconsistent points.&lt;/strong&gt; "The widest part of the forehead" is a judgment call. Measure twice on separate photos and see if you get the same answer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Borderline faces.&lt;/strong&gt; Many faces genuinely fall between two shapes. A single label hides that, so treat the result as "mostly X, a bit of Y" and read the advice for both.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Turning the result into a haircut
&lt;/h2&gt;

&lt;p&gt;The usual principle behind face-shape advice is balance: add volume where the face is narrow and keep it away from where the face is widest.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Round: height on top and length below the chin; avoid volume at cheek level.&lt;/li&gt;
&lt;li&gt;Square: soft layers or waves around the jaw to take the edge off the corners.&lt;/li&gt;
&lt;li&gt;Oblong: bangs and width at the sides to shorten the overall line.&lt;/li&gt;
&lt;li&gt;Heart: volume around the chin and side-swept bangs to balance a wider forehead.&lt;/li&gt;
&lt;li&gt;Diamond: fringe to widen the forehead, fullness near the jaw.&lt;/li&gt;
&lt;li&gt;Triangle: volume at the crown and temples to balance a wider jaw.&lt;/li&gt;
&lt;li&gt;Oval: most cuts work; choose by hair texture and upkeep.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you would rather not mark points by hand, I built &lt;a href="https://hair-tryon-f0w.pages.dev/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=launch_hair-tryon_202610" rel="noopener noreferrer"&gt;HairTryOn&lt;/a&gt;, a free face shape detector that runs in the browser: it estimates your face shape from a selfie and shows haircuts that tend to suit it. The photo is processed on your device and not uploaded. It is subject to every error source in the list above, so a well-lit, straight-on photo still matters.&lt;/p&gt;

&lt;p&gt;Whichever way you measure, take the result as a starting point for a conversation with your hairdresser, not a rule.&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>beginners</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
