<?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: 思源</title>
    <description>The latest articles on DEV Community by 思源 (@resuhive).</description>
    <link>https://dev.to/resuhive</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%2F4017758%2F3b72037a-61a9-4db1-b065-8d73a12c7cfe.png</url>
      <title>DEV Community: 思源</title>
      <link>https://dev.to/resuhive</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/resuhive"/>
    <language>en</language>
    <item>
      <title>I built a free PNG to DXF converter that doesn't ask for your email</title>
      <dc:creator>思源</dc:creator>
      <pubDate>Thu, 29 Oct 2026 13:50:14 +0000</pubDate>
      <link>https://dev.to/resuhive/i-built-a-free-png-to-dxf-converter-that-doesnt-ask-for-your-email-3917</link>
      <guid>https://dev.to/resuhive/i-built-a-free-png-to-dxf-converter-that-doesnt-ask-for-your-email-3917</guid>
      <description>&lt;p&gt;If you have ever tried to get a logo onto a laser cutter or into CAD software, you have met DXF.&lt;/p&gt;

&lt;p&gt;DXF is a vector format machines understand — laser cutters, CNC routers, vinyl plotters and most CAD packages read it. A PNG is pixels, so a machine cannot cut it. Somewhere between "I have a picture" and "the machine cuts it", the image has to become outlines.&lt;/p&gt;

&lt;p&gt;That conversion is the part that keeps going wrong.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why another converter
&lt;/h2&gt;

&lt;p&gt;I went looking for one and found three kinds of result:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Sites that convert, then ask for an email before the download.&lt;/strong&gt; The conversion is the bait.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sites that upload your file to a server&lt;/strong&gt; and are vague about what happens next. For a hobby logo, fine. For a client's artwork, not fine.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sites that are simply broken&lt;/strong&gt; — the button does nothing, or the DXF imports as something the machine won't cut.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;None of this is a hard technical problem. It is a business-model problem: a free converter has to be paid for somehow, and the usual answer is your email address.&lt;/p&gt;

&lt;p&gt;So I built one that runs in the browser and asks for nothing.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;

&lt;p&gt;The whole pipeline is client-side. The file is read into a canvas and never leaves your machine.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Grayscale + threshold.&lt;/strong&gt; Every pixel becomes black or white — DXF has no concept of a gradient, so somewhere you have to decide what is inside the shape and what is outside. Transparent pixels are composited onto white first, otherwise a transparent-background PNG traces as one big rectangle.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Trace.&lt;/strong&gt; &lt;a href="https://github.com/jankovicsandras/imagetracerjs" rel="noopener noreferrer"&gt;imagetracerjs&lt;/a&gt; (Unlicense) turns the black regions into closed contours made of line and quadratic-curve segments, with the palette pinned to exactly two colours so it can't go hunting for extra ones.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Flatten and scale.&lt;/strong&gt; Quadratic segments get subdivided into short lines, everything is scaled to the output width you type in millimetres, and the Y axis is flipped — images count Y downward, CAD counts it upward. Miss that flip and your logo comes out mirrored, which is a fun thing to discover after the cut.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Write DXF R12 (AC1009)&lt;/strong&gt;, closed POLYLINEs on layer 0. R12 is the oldest flavour of the format, which is exactly why LightBurn, xTool Creative Space, Fusion 360, Inkscape and AutoCAD all import it without arguing.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Three things I learned building it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Threshold is the one knob that actually matters.&lt;/strong&gt; A logo with anti-aliased edges traces either fat or ragged depending on where you cut, and no amount of smoothing downstream fixes a badly chosen threshold. So it's a live slider over the preview, not a setting buried in a dialog.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Smoothing is a trade, so it's exposed too.&lt;/strong&gt; Tight tolerance gives you an enormous file; loose tolerance turns circles into polygons you can see.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Holes have to be their own closed shape.&lt;/strong&gt; The inner outline of a letter O or a ring is exported separately, because the machine needs to cut it too. It looks like a bug in the preview until you think about what the cutter is doing.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Line art, logos, silhouettes and stencils convert well. Photographs don't, and that's a limit of the format rather than the tool — with soft gradients, a tracer has to invent an edge that was never in the image.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it costs
&lt;/h2&gt;

&lt;p&gt;Nothing. No signup, no watermark, no daily limit.&lt;/p&gt;

&lt;p&gt;There is a $19 Pro tier on the page — batch conversion to a ZIP, centerline mode for engraving and pen plotters, kerf offset, and true arcs and splines instead of short line segments. I want to be straight about it: &lt;strong&gt;none of that is built yet.&lt;/strong&gt; The button says so when you click it. It's there so I can find out whether anyone wants those four things before I spend my weekends writing them. If nobody clicks, I've learned that cheaply.&lt;/p&gt;

&lt;p&gt;The free converter is finished and is not a trial of anything.&lt;/p&gt;

&lt;p&gt;Try it: &lt;a href="https://ideapanner.resuhive.com/png-to-dxf?ref=devto" rel="noopener noreferrer"&gt;https://ideapanner.resuhive.com/png-to-dxf?ref=devto&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you run a laser cutter or a CNC and the output misbehaves on your machine, I'd genuinely like to hear about it. That failure mode is hard to test for without the machine in front of you.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>showdev</category>
      <category>javascript</category>
      <category>productivity</category>
    </item>
    <item>
      <title>I put up 3 fake-door pages. 5 days in: 42 visitors, 1 buy click, 0 emails</title>
      <dc:creator>思源</dc:creator>
      <pubDate>Thu, 29 Oct 2026 07:34:27 +0000</pubDate>
      <link>https://dev.to/resuhive/i-put-up-3-fake-door-pages-5-days-in-42-visitors-1-buy-click-0-emails-3e4o</link>
      <guid>https://dev.to/resuhive/i-put-up-3-fake-door-pages-5-days-in-42-visitors-1-buy-click-0-emails-3e4o</guid>
      <description>&lt;p&gt;Last week I stopped building first and started selling first.&lt;/p&gt;

&lt;p&gt;I put up 3 pages for products that don't exist yet. Each has a real price ($19) and a real "Buy" button. Clicking it opens a box that says the product isn't ready and asks for an email.&lt;/p&gt;

&lt;p&gt;That's a fake door test. Here are my numbers after 5 days.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Page&lt;/th&gt;
&lt;th&gt;Visitors&lt;/th&gt;
&lt;th&gt;Saw the price&lt;/th&gt;
&lt;th&gt;Clicked buy&lt;/th&gt;
&lt;th&gt;Left email&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;PNG to DXF converter (Pro)&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A Claude Code skill&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A $19 idea check&lt;/td&gt;
&lt;td&gt;29&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;42 visitors. 1 click. 0 emails.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It looks like 3 bad ideas.&lt;/p&gt;

&lt;p&gt;It isn't. Not yet.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I'm not killing anything
&lt;/h2&gt;

&lt;p&gt;My last product ran 8 weeks.&lt;/p&gt;

&lt;p&gt;23 signups. 0 paid.&lt;/p&gt;

&lt;p&gt;I spent those weeks rewriting the landing page. The real problem was that I never asked anyone to pay early.&lt;/p&gt;

&lt;p&gt;So this time I wrote the rules down &lt;strong&gt;before&lt;/strong&gt; launch:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Judge each page only after 28 days.&lt;/li&gt;
&lt;li&gt;Fewer than 30 visitors by then? It's a traffic problem, not an idea problem. Extend 14 days.&lt;/li&gt;
&lt;li&gt;Still under 30 at day 42? Close it.&lt;/li&gt;
&lt;li&gt;Buy-click rate under 2%: kill. 2–5%: talk to the people who clicked. Over 5%: build it.&lt;/li&gt;
&lt;li&gt;Never more than 3 tests at once.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By those rules, all 3 pages are stuck at step one: almost nobody arrived.&lt;/p&gt;

&lt;p&gt;5 visitors can't tell you anything. 1 click out of 5 is "20%", which is noise.&lt;/p&gt;

&lt;h2&gt;
  
  
  Read the funnel one step at a time
&lt;/h2&gt;

&lt;p&gt;One total number hides everything.&lt;/p&gt;

&lt;p&gt;The idea check page has 29 visitors. Only 9 scrolled down to the price.&lt;/p&gt;

&lt;p&gt;That's not "people don't want it". That's "the top of the page didn't hold them". Different problem, different fix.&lt;/p&gt;

&lt;p&gt;On my resume tool, 6 of 7 signups in one stretch reached checkout. None paid. If I had only watched "signups", I'd never have seen it.&lt;/p&gt;

&lt;p&gt;So I track 4 steps per page:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Arrived&lt;/li&gt;
&lt;li&gt;Saw the price&lt;/li&gt;
&lt;li&gt;Clicked buy&lt;/li&gt;
&lt;li&gt;Left an email&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Each step has its own fix:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Step 1 broken → it's distribution.&lt;/li&gt;
&lt;li&gt;Step 2 broken → it's the first screen.&lt;/li&gt;
&lt;li&gt;Step 3 broken → it's the offer.&lt;/li&gt;
&lt;li&gt;Step 4 broken → it's the popup copy or trust.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What I'm doing about step 1
&lt;/h2&gt;

&lt;p&gt;The honest answer: more distribution, every day, for 4 weeks.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;One long-tail guide per page on my own site (Google is slow, so start now).&lt;/li&gt;
&lt;li&gt;Posts like this one.&lt;/li&gt;
&lt;li&gt;Answering questions where the buyers already are.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I'll post the day-28 numbers here, even if all 3 die.&lt;/p&gt;

&lt;h2&gt;
  
  
  The one I'd like you to try
&lt;/h2&gt;

&lt;p&gt;The idea check is the one I care most about.&lt;/p&gt;

&lt;p&gt;You type your idea. It looks at real search demand and at who is already making money in that niche. The free check runs on the page:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ideapanner.resuhive.com/?ref=devto#idea-check" rel="noopener noreferrer"&gt;https://ideapanner.resuhive.com/?ref=devto#idea-check&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What's the smallest number of visitors you'd trust before killing an idea?&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>saas</category>
      <category>startup</category>
      <category>buildinpublic</category>
      <category>productivity</category>
    </item>
    <item>
      <title>How to make Claude Code build new pages that match your existing app</title>
      <dc:creator>思源</dc:creator>
      <pubDate>Thu, 29 Oct 2026 02:31:57 +0000</pubDate>
      <link>https://dev.to/resuhive/how-to-make-claude-code-build-new-pages-that-match-your-existing-app-3cf2</link>
      <guid>https://dev.to/resuhive/how-to-make-claude-code-build-new-pages-that-match-your-existing-app-3cf2</guid>
      <description>&lt;p&gt;Ask Claude Code to "add a pricing page" to a project that already has ten pages, and you often get a beautiful page that belongs to a different website. New font pairing, a fresh accent color, a hand-rolled button, maybe its own &lt;code&gt;&amp;lt;style&amp;gt;&lt;/code&gt; block. On a new project that's great. In an old project it's a clash you now have to undo by hand.&lt;/p&gt;

&lt;p&gt;I hit this enough times across my own side projects (a resume builder and a small Next.js app for checking product ideas) that I stopped fixing pages after the fact and started fixing the instructions instead. This post is the loop I use now, with the prompts and grep commands. Nothing here needs a special tool — it's a &lt;code&gt;SKILL.md&lt;/code&gt; file plus a habit.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why it happens
&lt;/h2&gt;

&lt;p&gt;Most frontend/design skills are written to make output &lt;em&gt;distinctive&lt;/em&gt;. The official &lt;code&gt;frontend-design&lt;/code&gt; skill in &lt;code&gt;anthropics/skills&lt;/code&gt;, for example, pushes for bold, non-generic choices. That's the right goal when there is no existing design. But the model reads the skill, not your codebase, so "be distinctive" wins over "look like the page next door".&lt;/p&gt;

&lt;p&gt;The fix is to reverse the order: &lt;strong&gt;read the project first, write a short summary of its style, build only from what already exists, then check.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Give the agent a design source of truth (if you have one)
&lt;/h2&gt;

&lt;p&gt;In my resume builder repo, the root &lt;code&gt;AGENTS.md&lt;/code&gt; has a short rule:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;Before changing the visual or interaction layer of &lt;span class="sb"&gt;`resume-tailor/`&lt;/span&gt;,
read &lt;span class="sb"&gt;`resume-tailor/docs/design-system.md`&lt;/span&gt; first. Colors, type scale,
radius, buttons, cards, forms, motion, i18n copy and page skeletons
each have exactly one correct way to write them there.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The design doc itself was not written as an ideal. It was written by &lt;strong&gt;measuring the existing code&lt;/strong&gt;: which tokens are defined in &lt;code&gt;globals.css&lt;/code&gt;, how often each className appears, which components are actually imported. That surfaced uncomfortable facts — at one point the codebase had 49 different hand-written button styles while the shared &lt;code&gt;components/ui/button.tsx&lt;/code&gt; was imported zero times.&lt;/p&gt;

&lt;p&gt;A few things that made the doc genuinely useful for an agent, not just for humans:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;List the theme-aware class names explicitly.&lt;/strong&gt; e.g. &lt;code&gt;bg-background&lt;/code&gt;, &lt;code&gt;text-foreground&lt;/code&gt;, &lt;code&gt;bg-card&lt;/code&gt;, &lt;code&gt;bg-muted&lt;/code&gt;, &lt;code&gt;text-muted-foreground&lt;/code&gt;, &lt;code&gt;border-border&lt;/code&gt;. "Use tokens" is vague; a list of allowed names isn't.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Write down the exceptions and why.&lt;/strong&gt; Hard-coded palette classes are allowed in exactly three cases (dark sections, data signal colors, the rendered resume paper). Everything else goes through tokens. After one cleanup pass, hard-coded colors went from roughly 2,370 occurrences to 115, all of them in those exception buckets.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Record the traps.&lt;/strong&gt; In that project &lt;code&gt;rounded-xl&lt;/code&gt; and &lt;code&gt;rounded-2xl&lt;/code&gt; both resolve to 16px because &lt;code&gt;--radius&lt;/code&gt; is recalculated, and a gradient-text class silently disappears if you wrap the text in an extra &lt;code&gt;&amp;lt;span&amp;gt;&lt;/code&gt;. Those are exactly the details a model gets wrong.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you don't have a design doc, don't write one first. Step 2 works without it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Make the agent survey before it writes
&lt;/h2&gt;

&lt;p&gt;This is the core of the skill I wrote, &lt;code&gt;match-existing-style&lt;/code&gt;. The first section is a reading list, and it says "do not skip":&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;## 1. Survey before you design (do not skip)&lt;/span&gt;
&lt;span class="p"&gt;
1.&lt;/span&gt; Design rules — any DESIGN.md, design-system.md, docs/design&lt;span class="err"&gt;*&lt;/span&gt;,
   or a design section in AGENTS.md / CLAUDE.md / README.
   If one exists, it wins over everything below.
&lt;span class="p"&gt;2.&lt;/span&gt; Tokens — CSS variables (:root, @theme), tailwind.config.&lt;span class="err"&gt;*&lt;/span&gt;,
   theme files. Note the token NAMES, not just values.
&lt;span class="p"&gt;3.&lt;/span&gt; Component kit — components/ui/&lt;span class="err"&gt;*&lt;/span&gt; or similar. Which primitives
   exist (Button, Card, Input, Badge, Dialog…) and how they're imported.
&lt;span class="p"&gt;4.&lt;/span&gt; Two sibling pages — the existing pages closest to what you are
   building. Note container width, section spacing, heading sizes,
   card style, how the hero is built.
&lt;span class="p"&gt;5.&lt;/span&gt; Copy voice — languages, i18n helper, sentence vs title case.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;"Two sibling pages" is the part that does the heavy lifting when there's no documentation. Your existing pages &lt;em&gt;are&lt;/em&gt; the design system; the agent just has to open them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Force a style fingerprint before any code
&lt;/h2&gt;

&lt;p&gt;Next, the skill asks for 8–12 lines of summary before touching a file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;## 2. Write a style fingerprint (keep it short)&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; Colors: token names for background / surface / text / muted /
  border / primary action.
&lt;span class="p"&gt;-&lt;/span&gt; Type: font families in use (do not add new ones), heading sizes
  on sibling pages, body size.
&lt;span class="p"&gt;-&lt;/span&gt; Shape: radius per element type, shadow style, border usage.
&lt;span class="p"&gt;-&lt;/span&gt; Spacing rhythm: page container, section gaps, card padding.
&lt;span class="p"&gt;-&lt;/span&gt; Components: which primitives you'll reuse for each part of the page.
&lt;span class="p"&gt;-&lt;/span&gt; Patterns to copy: one concrete snippet from a sibling page to mirror.
&lt;span class="p"&gt;-&lt;/span&gt; Copy: language handling and tone.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two reasons this matters. First, writing it down commits the model to specific token names before it starts generating JSX, which is when drift happens. Second, &lt;em&gt;you&lt;/em&gt; can read 10 lines and catch a wrong assumption in seconds, which is far cheaper than reviewing a 400-line page.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Build by reuse, with hard "no"s
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;## 3. Build by reuse&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; Reuse before you write. Use the project's Button/Card/Input.
&lt;span class="p"&gt;-&lt;/span&gt; Tokens, not values. No raw hex/rgb or arbitrary palette classes
  unless sibling pages do the same thing for the same purpose.
&lt;span class="p"&gt;-&lt;/span&gt; No new fonts, no new accent colors, no new radius scale,
  no new shadow style.
&lt;span class="p"&gt;-&lt;/span&gt; Match the page skeleton of the nearest sibling.
&lt;span class="p"&gt;-&lt;/span&gt; Missing piece? Build it in the project's idiom and say so.
  Do not pull in a new UI library.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The "say so" line is important. When the page genuinely needs something that doesn't exist yet, you want to hear about it in the summary, not discover a new dependency in &lt;code&gt;package.json&lt;/code&gt; later.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5: Self-check with grep, not vibes
&lt;/h2&gt;

&lt;p&gt;The last step is mechanical. Run these against the files the agent created:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# raw colors&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-nE&lt;/span&gt; &lt;span class="s1"&gt;'#[0-9a-fA-F]{3,8}\b|rgb\(|hsl\('&lt;/span&gt; app/new-page/page.tsx

&lt;span class="c"&gt;# raw palette classes the sibling pages don't use&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-nE&lt;/span&gt; &lt;span class="s1"&gt;'\b(bg|text|border)-(slate|gray|zinc|indigo|blue)-[0-9]+'&lt;/span&gt; app/new-page/page.tsx

&lt;span class="c"&gt;# hand-made buttons instead of the project's Button&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="s1"&gt;'&amp;lt;button'&lt;/span&gt; app/new-page/page.tsx

&lt;span class="c"&gt;# new font imports&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="s1"&gt;'next/font'&lt;/span&gt; app/new-page/page.tsx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, if you can render it, screenshot the new page next to a sibling page. A side-by-side picture catches things no grep will: a different hero height, a missing site header, a card that's slightly too round.&lt;/p&gt;

&lt;h2&gt;
  
  
  Does it actually make a difference?
&lt;/h2&gt;

&lt;p&gt;I ran a small test: same project, same prompt, two subagents in separate git worktrees. One followed the official &lt;code&gt;frontend-design&lt;/code&gt; skill, the other followed &lt;code&gt;match-existing-style&lt;/code&gt;. Each built the same new page.&lt;/p&gt;

&lt;p&gt;Round 1 was the resume builder, which &lt;em&gt;has&lt;/em&gt; a design doc. Round 2 was the idea-checking app, which has &lt;strong&gt;no design docs at all&lt;/strong&gt; — only &lt;code&gt;globals.css&lt;/code&gt; tokens and &lt;code&gt;components/ui&lt;/code&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Generic design skill&lt;/th&gt;
&lt;th&gt;match-existing-style&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Hard-coded hex colors (round 1 / round 2)&lt;/td&gt;
&lt;td&gt;17 / 30&lt;/td&gt;
&lt;td&gt;0 / 0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;New fonts added&lt;/td&gt;
&lt;td&gt;2 / 2&lt;/td&gt;
&lt;td&gt;0 / 0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Project token classes used&lt;/td&gt;
&lt;td&gt;0 / 0&lt;/td&gt;
&lt;td&gt;19 / 34&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Own &lt;code&gt;&amp;lt;style&amp;gt;&lt;/code&gt; block&lt;/td&gt;
&lt;td&gt;1 / 1&lt;/td&gt;
&lt;td&gt;0 / 0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;In round 2 the generic-skill page also dropped the site's header (logo, language switch, sign-in) entirely, and came in at 499 lines versus 247.&lt;/p&gt;

&lt;p&gt;To be fair to the official skill: its page was well made. It was just aiming at a different goal. And this is one run per project, two projects — a small sample. But the direction held even without a design doc, which was the case I was most unsure about.&lt;/p&gt;

&lt;h2&gt;
  
  
  The short version
&lt;/h2&gt;

&lt;p&gt;If you only take one thing from this, paste something like this before your next UI request:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Before writing any code: read our design rules (if any), our CSS
tokens, components/ui, and the two existing pages most similar to
what I'm asking for. Write a 10-line style fingerprint (token names,
fonts, radius, spacing, components to reuse, one snippet to mirror).
Then build using only those. No new fonts, colors, or button styles.
When done, grep your new files for hex colors, raw palette classes
and &amp;lt;button&amp;gt;, and list every deviation from the existing style.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I'm packaging the full version as a Claude Code skill — the survey/fingerprint/reuse/check loop plus recipes for the pages people add most (forms, settings, data tables, pricing, empty states). It's in early access here if you want it: &lt;a href="https://ideapanner.resuhive.com/skills?ref=devto" rel="noopener noreferrer"&gt;Match Style&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>claude</category>
      <category>ai</category>
      <category>frontend</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Turning a PNG into a laser-cuttable DXF in the browser (about 150 lines of TypeScript)</title>
      <dc:creator>思源</dc:creator>
      <pubDate>Sat, 24 Oct 2026 16:03:55 +0000</pubDate>
      <link>https://dev.to/resuhive/turning-a-png-into-a-laser-cuttable-dxf-in-the-browser-about-150-lines-of-typescript-155a</link>
      <guid>https://dev.to/resuhive/turning-a-png-into-a-laser-cuttable-dxf-in-the-browser-about-150-lines-of-typescript-155a</guid>
      <description>&lt;p&gt;If you own a laser cutter or a CNC router, you have probably done this: someone sends you a logo as a PNG, your machine software wants vector outlines, and you spend twenty minutes redrawing it by hand or uploading it to a converter that adds a watermark.&lt;/p&gt;

&lt;p&gt;I wanted a converter that runs entirely in the browser (no upload, no signup), so I built one. Here is how the pipeline works. It turned out to be four small steps.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Threshold the image to pure black and white
&lt;/h2&gt;

&lt;p&gt;Laser software only cares about &lt;em&gt;where the shape is&lt;/em&gt;. So the first step throws away colour: convert every pixel to luminance and compare it against a threshold.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;binarize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Uint8ClampedArray&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;threshold&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;invert&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;boolean&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;out&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Uint8ClampedArray&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&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="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;data&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;i&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;4&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;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="c1"&gt;// treat transparent pixels as white background&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;255&lt;/span&gt; &lt;span class="o"&gt;*&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;a&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;g&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&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="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;255&lt;/span&gt; &lt;span class="o"&gt;*&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;a&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;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&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="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;255&lt;/span&gt; &lt;span class="o"&gt;*&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;a&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;lum&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.299&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;r&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mf"&gt;0.587&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;g&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mf"&gt;0.114&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;dark&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;invert&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;lum&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="nx"&gt;threshold&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;lum&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;threshold&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;v&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;dark&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;out&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;out&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&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="nx"&gt;out&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&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="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;v&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;out&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;;&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;out&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two details matter here:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Transparency.&lt;/strong&gt; Many logos are PNGs with an alpha channel. If you ignore alpha, transparent pixels (often stored as &lt;code&gt;0,0,0,0&lt;/code&gt;) count as black and you get a solid rectangle. Compositing onto white first fixes it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A live threshold slider.&lt;/strong&gt; No single value works for every image, so the UI re-traces as you drag. That is the reason the image is downscaled to at most 1600px before tracing.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  2. Trace the black regions into outlines
&lt;/h2&gt;

&lt;p&gt;I didn't write a tracer. &lt;a href="https://github.com/jankovicsandras/imagetracerjs" rel="noopener noreferrer"&gt;imagetracerjs&lt;/a&gt; is public domain (Unlicense), has no dependencies, and works on a plain &lt;code&gt;ImageData&lt;/code&gt;. With a fixed two-colour palette, layer 0 holds the black paths:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;td&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;ImageTracer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;imagedataToTracedata&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;bw&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;width&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;height&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;pal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;r&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;g&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;b&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;255&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;r&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;g&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;b&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;255&lt;/span&gt; &lt;span class="p"&gt;}],&lt;/span&gt;
    &lt;span class="na"&gt;colorquantcycles&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;span class="na"&gt;ltres&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.5&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;smooth&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="c1"&gt;// line error tolerance&lt;/span&gt;
    &lt;span class="na"&gt;qtres&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.5&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;smooth&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="c1"&gt;// curve error tolerance&lt;/span&gt;
    &lt;span class="na"&gt;pathomit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;smooth&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="c1"&gt;// drop specks smaller than this&lt;/span&gt;
    &lt;span class="na"&gt;rightangleenhance&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;blurradius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&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;paths&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;td&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;layers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt; &lt;span class="c1"&gt;// black = shapes to cut&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A single "smooth" slider maps onto three tracer options. A higher value means fewer points, rounder curves, and more noise thrown away.&lt;/p&gt;

&lt;p&gt;The important part for cutting: &lt;strong&gt;holes come out as their own closed paths in the same layer.&lt;/strong&gt; The inside of an "O" or an "A" is a separate outline, so the cutter actually cuts it instead of leaving a solid blob.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Flatten the curves and convert pixels to millimetres
&lt;/h2&gt;

&lt;p&gt;The tracer outputs straight segments (&lt;code&gt;L&lt;/code&gt;) and quadratic Béziers (&lt;code&gt;Q&lt;/code&gt;). Old-style DXF polylines only hold straight segments, so every curve becomes a few line segments:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;flattenQ&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;p0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Pt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Pt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;p1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Pt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;steps&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nx"&gt;Pt&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;pts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Pt&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="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;k&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="nx"&gt;k&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="nx"&gt;steps&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;k&lt;/span&gt;&lt;span class="o"&gt;++&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;t&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;k&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nx"&gt;steps&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;u&lt;/span&gt; &lt;span class="o"&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;t&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;pts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
      &lt;span class="nx"&gt;u&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;u&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;p0&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&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="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;u&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;t&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;t&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;t&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;p1&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="nx"&gt;u&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;u&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;p0&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;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;u&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;t&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;c&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;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;t&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;t&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;p1&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;span class="p"&gt;]);&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;pts&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then scale to the real-world width the user typed in, and &lt;strong&gt;flip Y&lt;/strong&gt;. Image coordinates grow downward and CAD coordinates grow upward. If you forget this, every design comes out upside down, and you only notice after the cut.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;k&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;widthMm&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nx"&gt;imageWidth&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;mm&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;poly&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&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="nx"&gt;y&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="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;k&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;imageHeight&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;k&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I also drop zero-area paths. On a white-background image, the tracer sometimes emits a degenerate frame along the image border.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Write DXF R12 by hand
&lt;/h2&gt;

&lt;p&gt;DXF looks scary but is just alternating lines of &lt;em&gt;group code&lt;/em&gt; and &lt;em&gt;value&lt;/em&gt;. I picked the oldest widely supported flavour, R12 (&lt;code&gt;AC1009&lt;/code&gt;), with closed &lt;code&gt;POLYLINE&lt;/code&gt; entities. LightBurn, xTool Creative Space, Fusion 360, Inkscape and AutoCAD all open it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nf"&gt;g&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;SECTION&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="nf"&gt;g&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;HEADER&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nf"&gt;g&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;$ACADVER&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="nf"&gt;g&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;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;AC1009&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nf"&gt;g&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;$INSUNITS&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="nf"&gt;g&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;70&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;          &lt;span class="c1"&gt;// 4 = millimetres&lt;/span&gt;
&lt;span class="nf"&gt;g&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ENDSEC&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nf"&gt;g&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;SECTION&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="nf"&gt;g&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ENTITIES&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;for &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;p&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;polys&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;g&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;POLYLINE&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="nf"&gt;g&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;0&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="nf"&gt;g&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;66&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;span class="nf"&gt;g&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;70&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;span class="c1"&gt;// 70=1 → closed&lt;/span&gt;
  &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&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="nx"&gt;y&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nf"&gt;g&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;VERTEX&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="nf"&gt;g&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;0&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="nf"&gt;g&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&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="nf"&gt;g&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;y&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nf"&gt;g&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;SEQEND&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;g&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ENDSEC&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="nf"&gt;g&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;EOF&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lessons from testing in real software:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Close the polylines&lt;/strong&gt; (&lt;code&gt;70 = 1&lt;/code&gt;). Open paths make some laser software refuse to fill or offset them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Units are a hint, not a rule.&lt;/strong&gt; R12 predates &lt;code&gt;$INSUNITS&lt;/code&gt;. Newer apps read it, older ones assume whatever you set as default. That is why the tool asks for a width in mm and bakes the scale into the coordinates.&lt;/li&gt;
&lt;li&gt;An SVG export is basically free once you have the polylines, and some people prefer it.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The result
&lt;/h2&gt;

&lt;p&gt;Everything above runs client-side, so the image never leaves the browser and there is nothing to rate-limit. You can try it here: &lt;strong&gt;&lt;a href="https://ideapanner.resuhive.com/png-to-dxf?ref=devto" rel="noopener noreferrer"&gt;PNG to DXF converter&lt;/a&gt;&lt;/strong&gt;. Drop a logo, drag the threshold until the preview looks right, set the width, download.&lt;/p&gt;

&lt;p&gt;Things I'd still like to improve: centreline tracing for engraving single-stroke text, and smarter speck removal on photos. If you cut things for a living, I'd love to hear which file it fails on.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>tutorial</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Data Engineer Resume: How to Show Scale, Reliability, Cost</title>
      <dc:creator>思源</dc:creator>
      <pubDate>Thu, 22 Oct 2026 01:15:51 +0000</pubDate>
      <link>https://dev.to/resuhive/data-engineer-resume-how-to-show-scale-reliability-cost-23f7</link>
      <guid>https://dev.to/resuhive/data-engineer-resume-how-to-show-scale-reliability-cost-23f7</guid>
      <description>&lt;p&gt;Nobody notices a pipeline that runs on time. Your resume's job is to make that invisible work visible.&lt;/p&gt;

&lt;p&gt;Short answer: a strong data engineer resume answers three questions in every bullet — &lt;strong&gt;how much data&lt;/strong&gt;, &lt;strong&gt;how reliably&lt;/strong&gt;, and &lt;strong&gt;at what cost&lt;/strong&gt;. A list of tools (Spark, Airflow, dbt, Snowflake, Kafka) answers none of them. Hiring managers for data roles assume you've touched the stack; what they can't assume is the scale you ran it at or what broke on your watch.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why data engineer resumes read the same
&lt;/h2&gt;

&lt;p&gt;Most data engineering work is maintenance of things that are supposed to be boring. When it succeeds, nothing happens. So the easy resume to write is a stack list plus "built and maintained ETL pipelines" — and because everyone writes that line, it carries no information. Three mistakes show up again and again:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Stack without scale.&lt;/strong&gt; "Spark, Flink, Hive" with no data volume, job count, or latency behind it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Built vs. maintained is blurred.&lt;/strong&gt; A reader can't tell whether you designed the warehouse or inherited it. Both are real work, but they're different jobs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No data quality story.&lt;/strong&gt; In practice, late and dirty data is what breaks first. A resume that never mentions it reads like it's never been on call.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What to put in data engineer resume bullets
&lt;/h2&gt;

&lt;p&gt;Pick the dimensions that apply to each piece of work and use your real numbers. If you don't know a number, find it in your job history, your dashboards, or your team's incident notes before you write the bullet — don't estimate one that sounds right.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Scale:&lt;/strong&gt; rows or TB per day, number of pipelines or DAGs you owned, number of downstream tables or consumers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reliability:&lt;/strong&gt; SLA or on-time rate, how you handled late-arriving data, backfills, and schema changes, and what you changed after an incident.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost and performance:&lt;/strong&gt; warehouse or cluster spend you reduced, query or job runtime before and after, partitioning or file-layout work.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ownership:&lt;/strong&gt; say plainly whether you designed it, migrated it, or ran it. "Designed" and "maintained" are both fine; vague is not.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Who used it:&lt;/strong&gt; the analysts, ML models, or product features downstream. Impact on a data team is almost always someone else's work getting faster or more trustworthy.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Before and after: one bullet rewritten
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Data engineer experience bullet (bracketed values are placeholders for your own numbers)&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Before:&lt;/strong&gt; Built and maintained ETL pipelines using Spark and Airflow.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;After:&lt;/strong&gt; Designed [N] Airflow DAGs moving [X TB/day] from Kafka into the Snowflake warehouse; added freshness and row-count checks that raised on-time delivery to [Y%] for [Z] downstream dashboards.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The rewrite still names Spark-era tools, but every tool is attached to a volume, a reliability result, and a consumer. Fill the brackets with numbers you can defend in an interview — a data engineering interviewer will ask how you measured on-time delivery.&lt;/p&gt;

&lt;h2&gt;
  
  
  Data engineer resume keywords
&lt;/h2&gt;

&lt;p&gt;Keywords only help when they match the posting you're applying to. Data engineering postings vary a lot: one team wants streaming (Kafka, Flink), another wants analytics engineering (dbt, SQL modeling), another wants platform work (Kubernetes, Terraform). Concepts that show up across many of them include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;data warehouse layering / dimensional modeling&lt;/li&gt;
&lt;li&gt;batch and streaming&lt;/li&gt;
&lt;li&gt;SLA and on-time rate&lt;/li&gt;
&lt;li&gt;data quality checks&lt;/li&gt;
&lt;li&gt;backfill&lt;/li&gt;
&lt;li&gt;partitioning&lt;/li&gt;
&lt;li&gt;cost optimization&lt;/li&gt;
&lt;li&gt;data lineage&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Copy the tools and methods out of the actual posting, in its own spelling, and keep only the ones a bullet in your work history backs up. We tested how much that matters in &lt;a href="https://resuhive.com/blog/resume-skills-section" rel="noopener noreferrer"&gt;our skills section experiment&lt;/a&gt;: a stuffed list and a mirrored list scored the same with the parser, which is exactly why the human reader decides.&lt;/p&gt;

&lt;p&gt;Have a specific data engineering posting open? &lt;a href="https://resuhive.com/tools/jd-match" rel="noopener noreferrer"&gt;Check which of its keywords you're missing →&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Format and template
&lt;/h2&gt;

&lt;p&gt;Data engineering bullets are long and structured, so a single-column layout holds them best and parses cleanly in applicant tracking systems. Keep skills out of sidebars and text boxes — &lt;a href="https://resuhive.com/blog/why-ats-filters-your-resume" rel="noopener noreferrer"&gt;we explain why ATS parsing fails on those&lt;/a&gt;. Our &lt;a href="https://resuhive.com/templates/data-engineer" rel="noopener noreferrer"&gt;data engineer resume template page&lt;/a&gt; lists the focus areas, common mistakes, and the layouts we'd pick for this role.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Should a data engineer resume have a projects section?
&lt;/h3&gt;

&lt;p&gt;Yes if you're early in your career or switching in from analytics or software engineering, because a project can show pipeline design your job titles don't. Once your work history already shows data platform ownership, fold projects into experience and keep the page short.&lt;/p&gt;

&lt;h3&gt;
  
  
  What if I don't know the exact data volume I worked with?
&lt;/h3&gt;

&lt;p&gt;Look it up before you write the bullet: warehouse storage reports, job logs, or a former teammate can usually give an order of magnitude. If you truly can't verify it, describe scope in terms you can defend (number of pipelines, number of consumers) rather than inventing a figure.&lt;/p&gt;

&lt;h3&gt;
  
  
  How long should a data engineer resume be?
&lt;/h3&gt;

&lt;p&gt;One page for most people under about ten years of experience; two if you have a longer history of distinct platform work. Length matters less than whether each bullet carries scale, reliability, or cost.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://resuhive.com/blog/data-engineer-resume" rel="noopener noreferrer"&gt;ResuHive&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>career</category>
      <category>dataengineering</category>
      <category>resume</category>
      <category>jobsearch</category>
    </item>
    <item>
      <title>Should a Resume Be One Page or Two? A Clear Rule</title>
      <dc:creator>思源</dc:creator>
      <pubDate>Wed, 21 Oct 2026 01:20:17 +0000</pubDate>
      <link>https://dev.to/resuhive/should-a-resume-be-one-page-or-two-a-clear-rule-26fk</link>
      <guid>https://dev.to/resuhive/should-a-resume-be-one-page-or-two-a-clear-rule-26fk</guid>
      <description>&lt;p&gt;The one-page rule is right more often than it's wrong, and it's applied to a lot of people it was never meant for. Here's where the line actually falls.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The answer, up front.&lt;/strong&gt; With less than roughly ten years of relevant experience, use one page. With more than that, use two — but only if the second page is full of evidence a hiring manager would genuinely weigh. Never go to three unless you're writing an academic CV or applying through a system that explicitly asks for more. The rest of this is why, and what to do when you're stuck between the two.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the one-page rule came from
&lt;/h2&gt;

&lt;p&gt;It's a paper-era artefact. A recruiter worked through a physical stack: one page meant one glance, nothing to unstaple, and no second sheet to get separated from the first. Length was a handling constraint long before anyone treated it as a quality standard.&lt;/p&gt;

&lt;p&gt;That world is gone — your resume is scrolled in a browser tab, usually after being parsed into a database. The rule outlived its cause because the thing underneath it is still true: &lt;strong&gt;attention is front-loaded, and the top of page one does most of the work.&lt;/strong&gt; A second page never gets read with the care the first screen gets.&lt;/p&gt;

&lt;p&gt;Where the advice goes wrong is in treating length as the point. The point is density. A padded one-pager full of responsibility statements is worse than a two-pager where every line earns its space. The useful question is never "how long should this be" — it's &lt;strong&gt;"what's the shortest document that still contains all my evidence?"&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The three things that actually decide it
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Career stage&lt;/strong&gt; dominates. With one degree and two or three jobs there is no honest way to fill two pages. If you're at two pages early on, you have a padding problem rather than a length problem — and the second page is telling the reader you can't distinguish important from unimportant, which is itself part of what they're evaluating.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Role type&lt;/strong&gt; comes second. Some histories are genuinely dense: a senior engineer with a decade across five companies and a real systems list; a salesperson with attainment figures per year and territory; a researcher with publications and grants; a contractor with a long list of engagements. Others aren't — a designer whose portfolio link carries most of the weight doesn't need two pages at any level.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Region&lt;/strong&gt; matters more than most English-language advice admits. One page is largely a US convention, and it's strongest for early career. In the UK and much of Europe a two-page CV is the default at almost any level, and a one-pager can read as thin. Australia commonly runs to two or three. Academic CVs are unbounded everywhere. Some markets use a prescribed form, in which case the question doesn't arise at all. Check what's normal where you're applying instead of importing a rule from somewhere else.&lt;/p&gt;

&lt;h2&gt;
  
  
  When two pages is genuinely correct
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ten-plus years of relevant history&lt;/strong&gt;, where the older roles still support the claim you're making now rather than just filling in a timeline.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deep technical roles&lt;/strong&gt;, where systems, scale figures and stack details are the substance being evaluated — compressing them removes the thing the reader came for.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Academic and research applications.&lt;/strong&gt; A CV listing publications, grants, teaching and conference presentations is a record, not a pitch. It is as long as it is, and trimming it is the mistake.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Public-sector and federal-style applications&lt;/strong&gt;, some of which ask explicitly for hours per week, supervisors, and duty statements written against published criteria. A one-page submission there is simply incomplete, and incompleteness can be scored against you.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Histories with a lot of parallel work&lt;/strong&gt; — consulting engagements, contracts, clinical rotations — where the list itself is the qualification.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The test for any individual line on page two: &lt;strong&gt;could a hiring manager point at it and say it changed their mind?&lt;/strong&gt; If page two exists because you couldn't bring yourself to cut 2009, it isn't a second page. It's an appendix nobody asked for.&lt;/p&gt;

&lt;h2&gt;
  
  
  When two pages reads as padding
&lt;/h2&gt;

&lt;p&gt;The tells are consistent, and a reader spots them without trying:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Bullets describing &lt;strong&gt;responsibilities rather than outcomes&lt;/strong&gt; — "responsible for managing the team calendar."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Every role weighted equally&lt;/strong&gt;, so a job from twelve years ago gets as many bullets as your current one.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;skills section listing things nobody filters on&lt;/strong&gt;: Microsoft Word, email, "communication."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Repetition across roles&lt;/strong&gt; — three separate jobs where you "collaborated with cross-functional teams."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Filler sections&lt;/strong&gt;: an objective statement, hobbies, "references available upon request," a full mailing address.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each of those costs you twice. It uses space, and it tells the reader you couldn't tell what mattered.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to cut first when you're a third of a page over
&lt;/h2&gt;

&lt;p&gt;In this order. Most people get there by step four.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The objective statement.&lt;/strong&gt; It says what you want; the reader is busy deciding what they want. Replace it with a two-line summary, or delete it outright.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Old roles, compressed to a line each.&lt;/strong&gt; Anything beyond roughly the last ten to fifteen years, or predating your current field, moves under an &lt;code&gt;Earlier experience&lt;/code&gt; heading as a single line with no bullets.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Duplicate bullets.&lt;/strong&gt; If two roles make the same point, keep it in the more recent or more impressive one. As a working ratio: four to six bullets on the current role, three on the previous one, one or two on anything older.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bullet preambles.&lt;/strong&gt; "Was responsible for helping to manage the process of…" Cut straight to the verb. Removing the run-up from every bullet collapses a lot of two-line bullets into one line each.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Skills nobody searches on.&lt;/strong&gt; Keep the tools that appear in actual postings for your target role. Delete the software everyone is assumed to have.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Contact and boilerplate bloat.&lt;/strong&gt; City and country is enough — no street address. No "references available upon request." No heading that says "Resume." No photo, in markets where photos aren't customary.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Education detail, last.&lt;/strong&gt; Several years out, coursework, GPA and your school come off. Degree, institution, year is the whole entry.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Old role, compressed to one line&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Before:&lt;/strong&gt; Assistant Store Manager, Retail Co. (2006 – 2009) — Supervised a team of eight. Responsible for opening and closing procedures. Assisted with quarterly inventory counts. Delivered excellent customer service to all customers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;After:&lt;/strong&gt; Assistant Store Manager, Retail Co. — 2006 – 2009&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Five lines become one and nothing of value is lost. The role is still there, the dates are still continuous, and nobody was going to make a hiring decision based on your 2007 opening procedures.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bullet preamble, removed&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Before:&lt;/strong&gt; Was successfully responsible for helping to manage the process of migrating our internal reporting, working closely with cross-functional stakeholders to ensure a smooth transition.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;After:&lt;/strong&gt; Migrated internal reporting to [tool], cutting report turnaround from [X days] to [X days].&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Two lines become one, and the second version says something the first never did. That's the general pattern: &lt;strong&gt;most length problems are writing problems.&lt;/strong&gt; Fix the writing and the length problem often solves itself.&lt;/p&gt;

&lt;h2&gt;
  
  
  Formatting levers: the honest ones and the desperate ones
&lt;/h2&gt;

&lt;p&gt;Layout buys real space, up to a point. The honest levers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Margins&lt;/strong&gt; from 1 inch down to about 0.6–0.7 inch. Below half an inch you risk clipping on print and it starts to look cramped.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Line height&lt;/strong&gt; from 1.4–1.5 down to 1.15–1.25. Usually the single biggest win in a word-processor template.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Space around section headings.&lt;/strong&gt; Most templates leave a full blank line above and below every heading. Halving that across six headings recovers several lines and nobody notices.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Body text at 10–11pt.&lt;/strong&gt; 10.5pt is comfortably readable in most faces.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Your name at 16–18pt instead of 24.&lt;/strong&gt; It's a resume, not a poster.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One line per role header&lt;/strong&gt; — title, employer and dates on a single row rather than stacked over three.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Skills as a comma-separated run&lt;/strong&gt; rather than a bulleted column, which wastes most of the page width.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The desperate levers, which readers notice immediately: body text below 9.5pt, margins under half an inch, horizontally condensed fonts, and deleting whitespace until the page is a solid block. Each trades readability for space, which is the wrong direction — the whole purpose of fitting on one page was to be easy to read, and you've just spent that benefit to buy the format.&lt;/p&gt;

&lt;p&gt;Switching to a two-column layout to save space deserves its own warning. Some parsers read columns in the wrong order and interleave your skills list into the middle of a job description. That's a real cost for a cosmetic gain.&lt;/p&gt;

&lt;p&gt;Formatting can absorb an overflow of a few lines. It cannot absorb half a page. &lt;strong&gt;If you need more than a few lines, it's a content problem&lt;/strong&gt; — go back to the cut list.&lt;/p&gt;

&lt;p&gt;If you're fighting your word processor over margins and line spacing, start from a layout that already handles it — single-column, clean to parse, and holding its spacing at one page or two. &lt;a href="https://resuhive.com/templates" rel="noopener noreferrer"&gt;Browse resume templates →&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The two-page resume that fails worst
&lt;/h2&gt;

&lt;p&gt;One specific version of a two-page resume is worse than either option done properly: &lt;strong&gt;page two with four lines on it.&lt;/strong&gt; The reader scrolls past a break, or turns a sheet, for almost nothing. The empty three-quarters of that page is the most visible whitespace in the document, and it draws attention straight to how little was worth saying.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;There is no such thing as a 1.2-page resume.&lt;/strong&gt; Either fill page two to at least half, ideally two-thirds, or cut back to one. The cut list above will get you there — a page and a bit is always solvable.&lt;/p&gt;

&lt;p&gt;Three mechanics if you do commit to two pages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Put your name and email at the top of page two&lt;/strong&gt;, with &lt;code&gt;Page 2 of 2&lt;/code&gt;. Two-page documents get printed, forwarded, screenshotted and split by systems. An orphaned second page with no name on it is an anonymous sheet of paper.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Don't break a single role across the page boundary.&lt;/strong&gt; Move the whole entry down if you have to. A job with two bullets on page one and two on page two reads as two half-jobs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Put nothing decision-critical on page two.&lt;/strong&gt; It's for supporting depth. If your best achievement lives on the second page, the resume is ordered wrong, not too long.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The answer, plainly
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Under ten years of relevant experience:&lt;/strong&gt; one page. There are very few real exceptions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ten years or more, US market:&lt;/strong&gt; one page if it fits without shrinking the type, two if page two is genuinely full.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;UK, Europe, Australia:&lt;/strong&gt; two pages is the normal default. Don't force one.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Academic, research, or public-sector applications with a prescribed format:&lt;/strong&gt; follow the field's convention. The general rule doesn't apply to you.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Three pages or more:&lt;/strong&gt; academic CVs only.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;And one rule that overrides all of the above: if the choice is between a cramped one-pager set at 9pt and a comfortable two-pager, take the two pages. The one-page rule was always a proxy for readability. The moment it starts costing you readability, it has stopped doing its job.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Should my resume be 1 page or 2?
&lt;/h3&gt;

&lt;p&gt;One page if you have less than roughly ten years of relevant experience, two if you have more and the second page is genuinely full. The number of pages is a consequence of how much evidence you have, not a target to hit.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is a two-page resume ok for a fresher or new graduate?
&lt;/h3&gt;

&lt;p&gt;No. With one degree and an internship or two there is no honest way to fill two pages, and a padded second page tells the reader you can't tell important from unimportant. One page, and probably not a full one.&lt;/p&gt;

&lt;h3&gt;
  
  
  Should a biodata be one page or two?
&lt;/h3&gt;

&lt;p&gt;The same logic applies, with one difference: a biodata in Indian hiring often carries personal details a resume wouldn't, and some employers ask for a prescribed format. If a format is specified, follow it. If not, treat length the way you would a resume — one page early career, two once the second page is full.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does an ATS penalise a two-page resume?
&lt;/h3&gt;

&lt;p&gt;No. Applicant tracking systems parse text and don't score length. What actually breaks parsing is layout — multi-column designs, text boxes, headers and footers — and those break a one-page resume just as thoroughly as a two-page one.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is a CV the same length as a resume?
&lt;/h3&gt;

&lt;p&gt;Not in most of the world. Outside the US, "CV" usually just means resume and two pages is the normal default. An academic CV is a different document entirely — it lists publications, grants and teaching, and it is as long as the record is.&lt;/p&gt;

&lt;h3&gt;
  
  
  What if I'm a page and a bit?
&lt;/h3&gt;

&lt;p&gt;Cut, don't shrink. Delete the objective statement, compress roles older than ten to fifteen years to one line each, remove duplicate bullets, and cut the run-up from every bullet. Most people get back under one page by the fourth of those. A 1.2-page resume is the one outcome you don't want.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://resuhive.com/blog/one-page-vs-two-page-resume" rel="noopener noreferrer"&gt;ResuHive&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This article was written with AI assistance and reviewed and edited by the ResuHive team.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>career</category>
      <category>resume</category>
      <category>jobsearch</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Questions That Are Illegal to Ask in an Interview — and What to Say When One Comes Up</title>
      <dc:creator>思源</dc:creator>
      <pubDate>Tue, 20 Oct 2026 03:18:12 +0000</pubDate>
      <link>https://dev.to/resuhive/questions-that-are-illegal-to-ask-in-an-interview-and-what-to-say-when-one-comes-up-2920</link>
      <guid>https://dev.to/resuhive/questions-that-are-illegal-to-ask-in-an-interview-and-what-to-say-when-one-comes-up-2920</guid>
      <description>&lt;p&gt;Knowing a question is off-limits doesn't help much when you're sitting across from the person asking it. The useful part is what you say next.&lt;/p&gt;

&lt;p&gt;Most articles on this topic stop at the list. The list is easy to find and nearly useless on its own, because the moment that actually matters is the four seconds after the question lands, when you have to decide between answering something you shouldn't have been asked, refusing and looking difficult, or steering it somewhere useful. This piece covers the list quickly and then spends most of its length on that third option.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Not legal advice&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is general information about US federal employment law, not legal advice. State and city laws add protections beyond the federal floor, and rules differ substantially outside the US. If something happened to you that you think crossed a line, talk to an employment lawyer or your state labor agency, not a blog post.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What US federal law actually protects
&lt;/h2&gt;

&lt;p&gt;There is no single statute listing banned interview questions. What exists is a set of protected characteristics, and asking about them creates evidence of discrimination — which is why trained interviewers avoid the subject entirely. The characteristics come from these laws:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Title VII of the Civil Rights Act of 1964&lt;/strong&gt; — race, color, religion, sex, and national origin.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Age Discrimination in Employment Act (ADEA)&lt;/strong&gt; — age, for workers 40 and over.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Americans with Disabilities Act (ADA)&lt;/strong&gt; — disability. The ADA is stricter than the others about timing: before a job offer, an employer generally may not ask about disabilities or require a medical exam at all, even in a friendly way.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pregnancy Discrimination Act&lt;/strong&gt; — pregnancy, childbirth, and related conditions, as an amendment to Title VII.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Genetic Information Nondiscrimination Act (GINA)&lt;/strong&gt; — genetic information, which includes family medical history.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Two things follow from this that surprise people. First, the question doesn't have to be hostile to be a problem — "do you have kids?" as small talk touches the same protected ground as asking it pointedly. Second, an employer &lt;em&gt;is&lt;/em&gt; allowed to ask whether you can perform the specific duties of the job, with or without accommodation. "Can you lift 20 kilos repeatedly?" is fine. "Do you have a back problem?" is not.&lt;/p&gt;

&lt;h2&gt;
  
  
  The questions this turns into, in practice
&lt;/h2&gt;

&lt;p&gt;Grouped by the protected characteristic they touch, with the version that is actually legal beside it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Age&lt;/strong&gt; — Off-limits: "How old are you?", "When did you graduate high school?", "How many years until you retire?" · Legal: "Are you over 18?" (where the role requires it), "Are you able to work the scheduled hours?"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Family and pregnancy&lt;/strong&gt; — Off-limits: "Are you married?", "Do you have children?", "Are you planning to have kids?", "Who watches your kids?" · Legal: "This role requires occasional weekend travel — can you meet that?"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Disability and health&lt;/strong&gt; — Off-limits: "Do you have any medical conditions?", "How many sick days did you take last year?", "Why do you use a cane?" · Legal: "Can you perform the essential functions of this job, with or without reasonable accommodation?"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;National origin and citizenship&lt;/strong&gt; — Off-limits: "Where are you from originally?", "Is English your first language?", "What's your native language?" · Legal: "Are you legally authorized to work in the United States?", and — where the job genuinely requires it — "Which languages do you read or speak fluently?"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Religion&lt;/strong&gt; — Off-limits: "What church do you attend?", "Do you observe any religious holidays?" · Legal: "This role includes Saturday shifts — are you available to work them?"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Race and ethnicity&lt;/strong&gt; — Off-limits: any question about it, including indirect routes like "what does your last name mean?" · Legal: nothing about this belongs in a hiring conversation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Arrest and conviction history&lt;/strong&gt; — Varies more than any other item on this list. Many states and cities restrict when a criminal-history question may be asked (often only after a conditional offer), and asking about &lt;em&gt;arrests&lt;/em&gt; that produced no conviction is treated differently from asking about convictions. Check your own state.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Salary history&lt;/strong&gt; — Not a federal protected characteristic, but banned or restricted in a growing number of states and cities. Where it is banned, "what do you currently make?" is the illegal version and "what are you looking for?" is the legal one.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why you'll still get asked
&lt;/h2&gt;

&lt;p&gt;The most common reason is dull: the person interviewing you has never been trained to interview. In smaller companies, the hiring manager is often the person who will be your boss, doing their fourth interview ever, filling silence with the same small talk they'd use at a party. "So are you from around here?" is a friendliness reflex, not a screening tactic.&lt;/p&gt;

&lt;p&gt;That matters because it changes the right response. A question asked out of social clumsiness, answered with a citation of Title VII, ends the interview in spirit even if it continues on the calendar. A question asked deliberately — probing your pregnancy plans after you mentioned a wedding — tells you something worth knowing about the employer. Your read of which one you're in is doing most of the work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three ways to answer, in order of how often you'll want them
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Answer the job question hiding inside it
&lt;/h3&gt;

&lt;p&gt;Nearly every off-limits question has a legitimate worry underneath it. Answer the worry and skip the question. This works because it gives the interviewer what they actually needed, so it doesn't feel like a dodge.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Do you have kids?" → "If you're asking about availability: I can do the core hours you described, and I've handled on-call rotations before."&lt;/li&gt;
&lt;li&gt;"When did you graduate?" → "I've got [N] years in [field], the last [N] of them doing exactly the work in this posting."&lt;/li&gt;
&lt;li&gt;"Where are you from originally?" → "I'm authorized to work here without sponsorship. I've been based in [city] for the last [N] years."&lt;/li&gt;
&lt;li&gt;"What's your current salary?" → "I'm targeting [range] for this scope. What have you budgeted for the role?"&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Ask what it's for
&lt;/h3&gt;

&lt;p&gt;One neutral sentence — "Can I ask how that factors into the role?" — does three things at once. It gives a clumsy interviewer an exit, it makes a deliberate one say the reason out loud, and it costs you nothing either way. Keep your tone genuinely curious rather than pointed; the words carry the message without help.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Decline, briefly and without heat
&lt;/h3&gt;

&lt;p&gt;"I'd rather keep this to the role, but I'm happy to go deeper on [relevant thing]." Then stop talking and let them redirect. You do not owe an explanation for declining, and adding one usually reopens the subject. This is the right choice when the question is clearly deliberate, or when you've decided you don't want the job and would rather leave with the boundary intact.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Write it down the same day&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Whichever you pick, write down what was asked, by whom, and when, the same day. Not because you're planning anything — because if this turns into a pattern across several interviews at one company, contemporaneous notes are worth far more than a reconstructed memory months later.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What this tells you about the employer
&lt;/h2&gt;

&lt;p&gt;Treat it as data, not just as a problem. A single awkward question from a first-time interviewer at a ten-person company is noise. The same question from an HR professional, or two interviewers in the same loop circling the same protected ground, is a signal about how the place operates once you're inside. You are also interviewing them, and this is one of the few moments that shows you something the careers page can't.&lt;/p&gt;

&lt;h2&gt;
  
  
  Before you get in the room
&lt;/h2&gt;

&lt;p&gt;The questions above are easier to handle when the rest of the interview isn't also a scramble. Two things reduce the odds you'll be improvising: knowing which parts of your background the posting actually cares about, so you can steer toward them, and having your own specifics ready in numbers rather than adjectives. Our guide to &lt;a href="https://resuhive.com/blog/how-much-to-prepare-for-an-interview" rel="noopener noreferrer"&gt;preparing for an interview on a time budget&lt;/a&gt; covers how to do that without over-rehearsing, and &lt;a href="https://resuhive.com/blog/tailor-resume-to-job-description" rel="noopener noreferrer"&gt;tailoring a resume to a job description&lt;/a&gt; covers the earlier step of deciding what to emphasize.&lt;/p&gt;

&lt;p&gt;One last practical note. If a question in an application form — not a live interview — asks for something on the list above, that is worth more caution than the same question asked verbally, because the form is a record and it applies to every candidate. A verbal slip by one manager is a mistake; a field on a form is a policy.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://resuhive.com/blog/illegal-interview-questions" rel="noopener noreferrer"&gt;resuhive.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This article was written with AI assistance and reviewed and edited by the ResuHive team.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>career</category>
      <category>interview</category>
      <category>jobsearch</category>
      <category>beginners</category>
    </item>
    <item>
      <title>How to Accept a Job Offer (and How to Decline One Politely)</title>
      <dc:creator>思源</dc:creator>
      <pubDate>Thu, 15 Oct 2026 09:07:27 +0000</pubDate>
      <link>https://dev.to/resuhive/how-to-accept-a-job-offer-and-how-to-decline-one-politely-3pjd</link>
      <guid>https://dev.to/resuhive/how-to-accept-a-job-offer-and-how-to-decline-one-politely-3pjd</guid>
      <description>&lt;p&gt;&lt;em&gt;You spend weeks proving you want the job, and then — usually within a few days of the final interview — someone calls and asks for a decision. Accepting and declining are both smaller tasks than they feel like in the moment. What makes them feel large is that neither has a script most people have practised. Here are both, with the exact words.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;An offer call is not a test of how grateful you are. It is a short business conversation with two possible endings, and both endings go better when you have decided in advance what you are going to say. The single most useful habit is this: &lt;strong&gt;you almost never have to decide on the call.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The two rules that decide how the call goes
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Thank them, and ask for what you need — details, or time.&lt;/strong&gt; "Thank you, I'm genuinely glad to hear it. Can you send the written offer over so I can read the details? I'd like to give you an answer by [specific day]."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Never accept or decline verbally on the spot unless you are certain.&lt;/strong&gt; A verbal yes is not legally binding in most places, but it is socially binding, and walking it back later costs you far more than one polite day of waiting.&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;If you need a day or two&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Ask for it directly and give a date: "I want to give this a proper yes rather than a rushed one — can I come back to you by Thursday?" Vague stalling reads as shopping the offer around. A specific day reads as professional.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Before you accept: the questions worth asking
&lt;/h2&gt;

&lt;p&gt;Nearly everything that makes people regret an accepted offer was knowable beforehand and simply not asked. These are the ones that change the answer, not the ones that make you look difficult.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;What is the actual start date, and is it flexible?&lt;/strong&gt; Notice periods and relocation both live here.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Is the salary base, or does it include bonus?&lt;/strong&gt; A "total compensation" figure that quietly folds in an at-risk bonus is not the same number.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What happens at the first review, and when is it?&lt;/strong&gt; "We review annually" and "we review at six months" are different jobs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Who will I report to, and has that person been in the role long?&lt;/strong&gt; A manager who started last month changes what the first year looks like.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Is the role remote, hybrid, or in office — in writing?&lt;/strong&gt; Verbal flexibility evaporates when a policy changes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What does the first 90 days look like?&lt;/strong&gt; If nobody can answer this, the role may not be fully scoped yet.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ask these in one email rather than across five messages. One considered list reads as diligence; a drip of questions reads as hesitation.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to accept a job offer
&lt;/h2&gt;

&lt;p&gt;An acceptance has three jobs: confirm clearly, restate the terms so a misunderstanding surfaces now rather than on day one, and express genuine enthusiasm without padding. It can be short. It should be in writing even if you already said yes on the phone.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Acceptance email — vague vs. clear&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;❌ &lt;strong&gt;Before:&lt;/strong&gt; Hi, sounds great, happy to accept! Let me know next steps whenever you get a chance. Thanks so much for this opportunity!!!&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;After:&lt;/strong&gt; Hi Dana — thank you, I'm accepting. To confirm what we discussed: base of $X, start date of November 3rd, reporting to you, hybrid with two days on site. I'll sign and return the paperwork today. Two questions before I give notice at my current job: is the background check started, and is there anything you need from me before the start date?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Confirm in writing even after a verbal yes.&lt;/strong&gt; It costs one email and removes every later disagreement about what was agreed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Restate the four numbers that matter&lt;/strong&gt;: salary, start date, title, and reporting line.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Don't give notice at your current job until the paperwork is signed.&lt;/strong&gt; A written offer is not the same thing as a cleared background check.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How to politely decline a job offer
&lt;/h2&gt;

&lt;p&gt;Declining feels rude and almost never is. The person on the other end makes offers for a living; a clear, prompt no is a courtesy, because it lets them move to the next candidate. What actually damages the relationship is not the no — it is silence, or a no so padded with excuses that it sounds like a negotiation.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The three-sentence structure&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;(1) Thank them and name the decision clearly. (2) Give one honest reason, briefly — or none at all. (3) Leave the door open, if you mean it.&lt;/strong&gt; Anything longer is usually you managing your own guilt, not their expectations.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Declining — padded vs. direct&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;❌ &lt;strong&gt;Before:&lt;/strong&gt; Thank you so much for this incredible opportunity, I've been thinking about it a lot and after long consideration and talking with my family I've decided that unfortunately the timing and some other factors mean I might not be the best fit right now, I'm so sorry to waste your time...&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;After:&lt;/strong&gt; Thank you for the offer and for the time your team spent with me — I enjoyed the conversations. I've decided to accept another position that's a closer fit for where I want to specialise. I'd genuinely like to stay in touch, and I hope our paths cross again.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Two notes on the reason. You are not obliged to give one, and "I've accepted another offer" is always sufficient. If you do give a reason, make it about fit rather than about them — &lt;strong&gt;"the role wasn't quite what I'm looking for" lands very differently from "the salary was too low."&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  When you want to decline but keep the door open
&lt;/h3&gt;

&lt;p&gt;Say so explicitly and specifically: "If a role opens on the [team/product area] side in the next year, I'd be glad to talk." A generic "let's stay in touch" is noise. Naming the thing you'd say yes to is what makes it a real channel — and recruiters do come back, often within a year.&lt;/p&gt;

&lt;h2&gt;
  
  
  Declining after you already said yes
&lt;/h2&gt;

&lt;p&gt;This is the situation people lose sleep over, and it is survivable. Tell them as soon as you know — the same day, not the day before you start. Reneging late costs the company real time and is the one version of this that does damage. Apologise once, briefly, without a long explanation; do not blame the company you're going to; and accept that this particular bridge may be closed. Then take the lesson: this is exactly why you ask for the written offer and a couple of days before answering.&lt;/p&gt;

&lt;h2&gt;
  
  
  The mistakes that actually cost you something
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Accepting to be polite, then reneging a week later.&lt;/strong&gt; The most expensive version of this whole article.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ghosting after an offer.&lt;/strong&gt; People remember. Hiring is a small world and it is the same world in every city.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Negotiating in the same breath as accepting.&lt;/strong&gt; "I accept, but can we do $5k more?" makes the acceptance conditional and reads as a bluff.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Giving notice before the paperwork clears.&lt;/strong&gt; Background checks and references occasionally end offers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Declining with a lecture about what was wrong with them.&lt;/strong&gt; Free advice nobody asked for, delivered to someone who may one day be your colleague.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The short version
&lt;/h2&gt;

&lt;p&gt;Thank them. Ask for the written offer and a specific day to decide. Ask your questions in one email. Accept in writing, restating the terms. Decline in three sentences, promptly, without padding. And if you're still in the earlier part of the search, the thing that determines whether you get an offer at all is upstream: &lt;strong&gt;the resume has to survive an automated read before a human ever sees it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Paste your resume into the free ATS checker and see what a parser actually reads — section headings, dates, contact details, column layout — before you send it to anyone. — &lt;a href="https://resuhive.com/en/tools/ats-check" rel="noopener noreferrer"&gt;Run a free ATS check&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://resuhive.com/blog/how-to-accept-or-decline-a-job-offer" rel="noopener noreferrer"&gt;resuhive.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This article was written with AI assistance and reviewed and edited by the ResuHive team.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>career</category>
      <category>jobsearch</category>
      <category>writing</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Case Interview Prep: The Structure, Math, and Practice That Actually Transfer</title>
      <dc:creator>思源</dc:creator>
      <pubDate>Wed, 14 Oct 2026 05:00:03 +0000</pubDate>
      <link>https://dev.to/resuhive/case-interview-prep-the-structure-math-and-practice-that-actually-transfer-4a2a</link>
      <guid>https://dev.to/resuhive/case-interview-prep-the-structure-math-and-practice-that-actually-transfer-4a2a</guid>
      <description>&lt;p&gt;&lt;em&gt;A case interview is not a test of business knowledge. It is a structured problem you have never seen, solved out loud, with someone watching. That means the prep that works is narrow: a repeatable opening, a handful of calculations you can do without a calculator, and enough reps that none of it falls apart under pressure. Here is the version of case prep I would defend.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A case interview hands you a business problem with no answer key — declining margins at a retail chain, whether a manufacturer should enter a new market, what to pay for an acquisition. The interviewer is not scoring whether you already know the industry. They are scoring four things: can you take an ambiguous question, break it into parts, ask for what you need, and land on a recommendation someone could act on. Everything below is aimed at those four things, and none of it requires a business degree.&lt;/p&gt;

&lt;h2&gt;
  
  
  The two formats you will actually meet
&lt;/h2&gt;

&lt;p&gt;Prep guides describe one generic case. Real interviews come in three shapes, and the shape changes what you rehearse.&lt;/p&gt;

&lt;p&gt;Firms change formats more often than prep guides do. Before you build a plan around one format, read the firm's own candidate materials for the specific round you booked — that page is more current than any third-party guide, including this one.&lt;/p&gt;

&lt;h2&gt;
  
  
  The anatomy of one case
&lt;/h2&gt;

&lt;p&gt;A 30-minute case has the same five beats whether the prompt is about a coffee chain's margins or a pharma launch. Knowing the beats is most of the calm.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Listen and take notes — the first 2 minutes.&lt;/strong&gt; Write the question down verbatim. Every case contains one sentence that defines what success means (restore margin, not grow revenue); find it before you do anything else.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clarifying questions — 30 to 60 seconds.&lt;/strong&gt; Two or three, maximum: objective, scope, constraints. Do not ask what the objective is when the prompt already stated it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Structure out loud — 2 to 3 minutes.&lt;/strong&gt; State your framework, then immediately name the first branch you want to open and why. The structure is a map for the next 20 minutes, not a presentation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Analysis — 10 to 15 minutes.&lt;/strong&gt; Math and exhibits, one branch at a time. Narrate what you are about to compute and why before you compute it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Recommendation — 3 to 5 minutes.&lt;/strong&gt; Answer first, then three reasons, then risks and next steps. If time runs out, skip straight here: a thinner analysis with a clear recommendation scores better than a rich analysis with no answer.&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The rule&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Never open your framework before you can restate the question in one sentence. If your clarifying questions change what the client is actually asking for, the framework you memorized is answering last year's question.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Frameworks: four worth knowing, and how to build your own
&lt;/h2&gt;

&lt;p&gt;The argument against frameworks is that memorized ones produce generic answers. That is true of checklists, not of issue trees. The difference is whether the structure is built from the question or fitted to it — and interviewers can tell within a minute which one they are hearing.&lt;/p&gt;

&lt;p&gt;Build your own the same way every time: start from the question, split into two to four branches that do not overlap, split each branch once more. Two levels deep is almost always enough; a third level is usually procrastination. If two branches could both contain the same fact, they are not a framework — they are a list.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A fitted structure vs. a checklist (prompt: margins falling at a coffee chain)&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;❌ &lt;strong&gt;Before:&lt;/strong&gt; "I'd use the 4Ps: product, price, placement, promotion."&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;After:&lt;/strong&gt; "Revenue grew while profit fell, so this is a cost or mix problem, not a demand problem. I want to look at two things: per-unit cost by product line, and revenue mix between company stores and wholesale accounts."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The six calculations that cover most cases
&lt;/h2&gt;

&lt;p&gt;Cases reuse the same arithmetic. Learn these six and you can compute your way through the large majority of prompts. The skill being scored is not the arithmetic — it is doing it cleanly, out loud, with a sanity check attached.&lt;/p&gt;

&lt;p&gt;One worked example, said the way it should be said: fixed costs of $2M a year, price $50, variable cost $30. Contribution is $20 per unit, so breakeven is 100,000 units — which is $5M of revenue at that volume, and roughly a fifth of the market sized earlier in the case. That last clause is the sentence that gets scored. The bare number is not.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Math hygiene&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Round before you multiply — 2.9M x 0.31 becomes 3M x 0.31 out loud. State units every single time. Write the formula before the numbers, not after. And say the sanity check out loud even when it passes: interviewers score the check, not only the answer.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Reading an exhibit in 30 seconds
&lt;/h2&gt;

&lt;p&gt;Most cases include a chart, a table, or both. The failure mode is reading all of it, out loud, in order. Read in this sequence instead:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Title and units first.&lt;/strong&gt; "Revenue by segment, $M, 2019-2024" already tells you what question the exhibit was built to answer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Axes and legend.&lt;/strong&gt; Absolute or indexed? Does the scale start at zero? A truncated axis exaggerates a small change — noticing that out loud is itself scored.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The outlier.&lt;/strong&gt; The one bar, line, or cell that breaks the pattern. That is almost always why the exhibit is in the case.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One sentence back to the structure.&lt;/strong&gt; Which branch of your framework this belongs to, and whether it confirms or kills that branch. An exhibit you cannot connect to your structure is an exhibit you did not need.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The recommendation is a separate skill
&lt;/h2&gt;

&lt;p&gt;Candidates lose more points in the last three minutes than in the middle fifteen. The format that works is the one consultants use with clients: answer first, support second.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Two recommendations from the same analysis&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;❌ &lt;strong&gt;Before:&lt;/strong&gt; "So overall the market is growing and our costs are high, and I would probably recommend entering, maybe focusing on the premium segment."&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;After:&lt;/strong&gt; "Enter, through a partnership rather than building alone. Three reasons: the market grows 8% a year with no player above 15% share; our variable cost is 20% below the incumbent's, so we can win on price without starting a price war; and a partnership gives us the distribution we would otherwise spend two years building. The main risk is the partner's channel conflicting with our direct sales — I would test that in diligence before signing."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Answer first, three reasons, risks, next steps. If the interviewer pushes back, that is not failure — the case is continuing. Defend what you can defend, concede what you cannot, and do it quickly; a candidate who reverses a position the moment it is questioned scores worse than one who holds a defensible position.&lt;/p&gt;

&lt;h2&gt;
  
  
  A practice plan that survives contact with a real case
&lt;/h2&gt;

&lt;p&gt;Reading cases is not practice. Saying answers out loud to another person is. This plan fits around a job or a degree, and the ordering matters more than the totals:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Ten solo cases, structure only.&lt;/strong&gt; Read the prompt, write your structure and your first question, stop. Twenty minutes each. This is where frameworks actually get built — everything else rehearses what this creates.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ten cases out loud with a partner&lt;/strong&gt;, alternating interviewer and candidate. The partner's only jobs are to interrupt with "why?" and to hand you an exhibit you did not plan for.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Two full mocks, timed, no pausing.&lt;/strong&gt; The first will be bad. That is the point — it calibrates your pace, which is the thing solo practice cannot teach.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep a one-page log per case:&lt;/strong&gt; prompt, structure you used, calculation you fumbled, question you could not answer. The fumbles repeat across cases; the log is how you stop repeating them.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Firm-specific prep is the last 10%, not the first: read the firm's own description of its format, and if it is a written or video case, practice writing answers to fixed questions under a timer, because there is no one to clarify with. Everything above still applies. For where case prep fits in the wider schedule, the &lt;a href="https://resuhive.com/blog/how-much-to-prepare-for-an-interview" rel="noopener noreferrer"&gt;interview prep time budget&lt;/a&gt; splits the hours into reusable and per-interview work — case reps belong in the reusable half, and the same discipline of quantifying what you did is what makes a resume line credible, covered in &lt;a href="https://resuhive.com/blog/resume-work-achievements" rel="noopener noreferrer"&gt;resume work achievements&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The mistakes that cost offers
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Opening with a framework before restating the question.&lt;/strong&gt; You answer the prompt you expected instead of the one you got, and the interviewer hears it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A checklist with no connection to the prompt.&lt;/strong&gt; The 4Ps answer to a margin case tells the interviewer you have one structure and will use it regardless.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Math with no sanity check.&lt;/strong&gt; A number off by 10x that nobody catches, including you, is worse than a slower correct answer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Silence while computing.&lt;/strong&gt; Narrate. An interviewer cannot credit thinking they cannot hear.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No recommendation because you ran out of time.&lt;/strong&gt; The recommendation is the product; the analysis is the receipt.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Treating pushback as failure.&lt;/strong&gt; Cases are built to push. Candidates who get quiet after the first challenge lose the room.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Do I need to memorize frameworks?&lt;/strong&gt; Four is enough, and only as raw material. Build your structure from the prompt in front of you every time — a memorized checklist produces an answer that fits every case and therefore none of them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How much math prep is enough?&lt;/strong&gt; When each of the six calculations above takes you under 30 seconds out loud, including the sanity check, without a calculator. Until then, drill them daily for 15 minutes — it is the cheapest point gain in case prep.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is it acceptable to ask clarifying questions?&lt;/strong&gt; Yes, and you should — two or three, and they should change how you approach the case (scope, objective, constraints). Asking something the prompt already answered does the opposite of building confidence.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How long should the recommendation be?&lt;/strong&gt; 60 to 90 seconds: the answer, three supporting reasons, the main risk, and the next step. Longer than that and you are re-running the analysis instead of concluding it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I have never done a case. Where do I start?&lt;/strong&gt; Ten solo structure-only reps before your first out-loud rep. Structuring is the separable skill — get it automatic first, and the live case becomes a smaller problem. Your opening 60 seconds still matter before any of this; the &lt;a href="https://resuhive.com/blog/60-second-self-introduction" rel="noopener noreferrer"&gt;60-second self-introduction&lt;/a&gt; is the other half of the first impression.&lt;/p&gt;

&lt;p&gt;Want an opponent that asks the follow-up questions a case interviewer would — built from the actual job description? — &lt;a href="https://resuhive.com/interview-prep" rel="noopener noreferrer"&gt;Practice with role-specific questions&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://resuhive.com/blog/case-interview-prep" rel="noopener noreferrer"&gt;resuhive.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This article was written with AI assistance and reviewed and edited by the ResuHive team.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>career</category>
      <category>jobsearch</category>
      <category>writing</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Objective for a Healthcare Resume: 16 Examples by Role</title>
      <dc:creator>思源</dc:creator>
      <pubDate>Tue, 13 Oct 2026 02:03:24 +0000</pubDate>
      <link>https://dev.to/resuhive/objective-for-a-healthcare-resume-16-examples-by-role-djl</link>
      <guid>https://dev.to/resuhive/objective-for-a-healthcare-resume-16-examples-by-role-djl</guid>
      <description>&lt;p&gt;In most fields an objective is filler. In entry-level healthcare it is often the fastest way to show a screener the one thing they check first: whether you are certified to do the job.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A good objective for a healthcare resume is one to two sentences that name the exact role you are applying for, your certification or licence status, and the clinical hours or setting that prove you can start working.&lt;/strong&gt; "Certified Nursing Assistant (state registry, 2026) with 120 clinical hours in long-term care, applying for the night-shift CNA role on your memory care unit" is an objective. "Compassionate individual seeking a rewarding position in healthcare" is not — it tells the reader nothing they can check.&lt;/p&gt;

&lt;p&gt;Healthcare is one of the few areas where objectives still earn their space, because so many roles are entry-level and credential-gated. A hiring manager filling a phlebotomy or medical assistant opening is mostly asking: certified or certification-eligible? Trained in what setting? Available when? An objective can answer all three before the reader reaches your first job.&lt;/p&gt;

&lt;h2&gt;
  
  
  Objective or summary: which one does your healthcare resume need?
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Your situation&lt;/th&gt;
&lt;th&gt;Use&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;Just finished a CNA, MA, phlebotomy, pharmacy tech or EMT program&lt;/td&gt;
&lt;td&gt;Objective&lt;/td&gt;
&lt;td&gt;Your strongest facts are the credential and training hours, not job history&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;New grad RN or LPN&lt;/td&gt;
&lt;td&gt;Objective (or a short summary if you have paid tech/aide experience)&lt;/td&gt;
&lt;td&gt;Licensure status and clinical rotations are what the screen checks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Moving into healthcare from retail, hospitality, admin or the military&lt;/td&gt;
&lt;td&gt;Objective&lt;/td&gt;
&lt;td&gt;It is the one place to connect old experience to the new role in plain words&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2+ years in the same type of clinical role&lt;/td&gt;
&lt;td&gt;Summary&lt;/td&gt;
&lt;td&gt;You have scope and results to show; an objective would undersell you&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If you have a few years in the role you are applying for, skip the objective and write a summary instead — see &lt;a href="https://resuhive.com/blog/what-is-a-resume-summary" rel="noopener noreferrer"&gt;what a resume summary is and how to write one&lt;/a&gt;. Everything below is for people whose credential is newer than their work history.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to write a healthcare resume objective: 3 parts
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Role and credential.&lt;/strong&gt; The job title exactly as the posting writes it, plus your credential with the issuing body — "CMA (AAMA)," "CPT (NHA)," "CPhT (PTCB)," "NREMT-certified EMT." If you have not sat the exam yet, say so honestly: "certification exam scheduled for November 2026." Recruiters can verify most of these online in minutes, so never round up.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Proof you have done the work.&lt;/strong&gt; Clinical or externship hours, the setting (long-term care, urgent care, outpatient lab, retail pharmacy, 911 ambulance), and one countable detail: patients per shift, successful venipunctures, prescriptions filled per day. This is where a student objective stops sounding like a student.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What you will do for them.&lt;/strong&gt; One phrase pulled from the posting: the unit, the shift, the patient population, the EHR. "Applying for the weekend PRN role in your pediatric clinic" shows you read the posting; "seeking growth opportunities" shows you did not.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Keep it to two lines on the page — roughly 25 to 50 words. Drop "I" and skip the adjectives; "caring" and "compassionate" are expected of everyone applying, so they do not separate you from anyone.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Phlebotomist, fresh from a training program:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;❌ &lt;strong&gt;Before:&lt;/strong&gt; Motivated and compassionate individual seeking an entry-level phlebotomy position where I can utilize my skills and grow in the healthcare field.&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;After:&lt;/strong&gt; Certified Phlebotomy Technician (NHA, 2026) with 100+ successful venipunctures and 25 capillary sticks during a 120-hour outpatient lab externship. Applying for the early-morning phlebotomist role at your draw station; comfortable with pediatric and geriatric patients.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The second version is longer by a dozen words and answers every question a lab supervisor screens for: certified by whom, trained where, how many sticks, which shift. Each claim is also something they can ask about in the interview, which is the real test of a good objective.&lt;/p&gt;

&lt;h2&gt;
  
  
  Healthcare resume objective examples by role
&lt;/h2&gt;

&lt;p&gt;Replace every number and name with your own. An objective copied with someone else's hours is easy to catch the moment an interviewer asks about it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Certified entry-level roles
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Certified nursing assistant (CNA):&lt;/strong&gt; State-registered CNA with 120 clinical hours in a 90-bed skilled nursing facility, trained in ADLs, Hoyer lifts and vital signs. Seeking the night-shift CNA position on your memory care unit; BLS certified (AHA).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Medical assistant:&lt;/strong&gt; Certified Medical Assistant (AAMA) with a 160-hour externship in a family medicine practice, rooming 20–25 patients a day and charting in eClinicalWorks. Applying for your clinical MA role; trained in injections, EKGs and point-of-care testing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Phlebotomist:&lt;/strong&gt; Certified Phlebotomy Technician (NHA) with 100+ venipunctures in an outpatient lab externship. Seeking a phlebotomist role in your hospital lab with availability for 5 a.m. draws.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pharmacy technician:&lt;/strong&gt; CPhT (PTCB) with 6 months in a high-volume retail pharmacy filling 250+ prescriptions a day. Applying for your inpatient pharmacy technician role to build sterile compounding experience.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Patient care technician:&lt;/strong&gt; CPCT/A (NHA) trained in EKG, phlebotomy and patient mobility, with 80 clinical hours on a med-surg floor. Seeking a PCT role on your telemetry unit.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;EMT:&lt;/strong&gt; NREMT-certified EMT-Basic with a state licence and 48 ride-along hours on a 911 ALS unit. Applying for a full-time EMT position with your county ambulance service; CPR and EVOC certified.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dental assistant:&lt;/strong&gt; Dental assistant completing DANB's CDA certification, with a 300-hour externship in a general dentistry office covering chairside assisting and radiographs. Seeking a chairside assistant role in your pediatric practice.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sterile processing technician:&lt;/strong&gt; Sterile processing technician with CRCST certification (HSPA) and 400 hands-on hours decontaminating and assembling surgical instrument trays. Applying for your SPD second-shift role.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Home health aide / caregiver:&lt;/strong&gt; Home health aide with state HHA certification and 2 years caring for a family member with Parkinson's, including medication reminders and transfers. Seeking a home health aide role with your agency; valid driver's licence and flexible weekend availability.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  New grad nurses
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;New grad RN:&lt;/strong&gt; BSN graduate (May 2026) who passed the NCLEX-RN, with a 144-hour preceptorship on a 30-bed med-surg unit carrying 4–5 patients. Applying for your New Graduate Residency Program in the ED; BLS and ACLS certified.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LPN:&lt;/strong&gt; Licensed Practical Nurse (NCLEX-PN, 2026) with clinical rotations in long-term care and rehab, passing medications for 20+ residents under supervision. Seeking an LPN role in your skilled nursing facility.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Administrative and support roles
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Medical receptionist / front desk:&lt;/strong&gt; Front desk coordinator with 3 years in hotel guest services, now trained in HIPAA and insurance verification. Applying for your medical receptionist role, bringing experience handling 80+ check-ins a shift.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Medical billing and coding:&lt;/strong&gt; Certified Professional Coder (CPC, AAPC) with practicum experience coding outpatient E/M visits in ICD-10-CM and CPT. Seeking an entry-level remote coding position with your billing team.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Physical therapy aide:&lt;/strong&gt; Kinesiology student with 60 observation hours in an outpatient orthopedic clinic, setting up equipment and cleaning treatment areas. Applying for your part-time PT aide role while preparing for DPT applications.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Career changers and students
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Career changer (retail to patient access):&lt;/strong&gt; Retail store supervisor with 5 years managing a 12-person team and resolving customer escalations, now certified in medical terminology and Epic Cadence scheduling. Applying for your patient access representative role in the ED registration team.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Student with no healthcare experience:&lt;/strong&gt; Pre-nursing student with 150 volunteer hours at a hospital information desk and transport team, BLS certified. Seeking a part-time patient transporter role to gain direct patient contact.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;See the objective in a full resume:&lt;/strong&gt; our resume examples include full US healthcare resumes with the rest of the page filled in: &lt;a href="https://resuhive.com/examples/medical-assistant" rel="noopener noreferrer"&gt;medical assistant&lt;/a&gt;, &lt;a href="https://resuhive.com/examples/registered-nurse" rel="noopener noreferrer"&gt;registered nurse&lt;/a&gt;, &lt;a href="https://resuhive.com/examples/pharmacy-technician" rel="noopener noreferrer"&gt;pharmacy technician&lt;/a&gt; and &lt;a href="https://resuhive.com/examples/dental-assistant" rel="noopener noreferrer"&gt;dental assistant&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What to leave out of a healthcare objective
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Personality adjectives.&lt;/strong&gt; "Compassionate," "caring," "patient-focused." Show it with a setting instead: memory care, pediatrics, hospice.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What you want from the job.&lt;/strong&gt; "Seeking a rewarding position to grow my career" puts your goals first; the reader is filling a shift.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Credentials you do not hold yet, written as if you do.&lt;/strong&gt; "Eligible" and "exam scheduled for [month]" are fine. "Certified" when you are not is the fastest way to lose an offer at the background check.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Your licence number.&lt;/strong&gt; It belongs in a separate Licenses &amp;amp; Certifications section with the issuing state and expiration date, not in the opening lines.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A generic objective sent to every posting.&lt;/strong&gt; If the unit, shift or setting never changes between applications, the objective is not doing its job.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Match the objective to the posting
&lt;/h2&gt;

&lt;p&gt;Healthcare postings are literal. The requirement list is usually a compliance checklist — BLS, a specific certification, an EHR — and applicant tracking systems search for those exact strings. Write each credential the way the posting writes it, including the acronym and the full name once ("Basic Life Support (BLS)"). For the rest of the resume, see &lt;a href="https://resuhive.com/blog/tailor-resume-to-job-description" rel="noopener noreferrer"&gt;how to tailor a resume to a job description&lt;/a&gt;, and if you are also writing the letter, &lt;a href="https://resuhive.com/blog/healthcare-cover-letter" rel="noopener noreferrer"&gt;healthcare cover letters&lt;/a&gt; uses the same credential-first order.&lt;/p&gt;

&lt;p&gt;Paste the posting and your resume — ResuHive shows which required certifications and keywords are missing from your objective and bullets: &lt;a href="https://resuhive.com/tools/jd-match" rel="noopener noreferrer"&gt;Check my resume against a job&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Do healthcare resumes need an objective?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Not always. Use one if you are newly certified, a new grad, or changing careers into healthcare. If you already have two or more years in the same type of role, a professional summary works better.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How long should a healthcare resume objective be?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;One to two sentences, about 25–50 words. It should fit in two lines under your name and contact information.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I put a certification I am still working on in my objective?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yes, if you label it accurately: "completing CDA certification" or "NCLEX-RN scheduled for December 2026." Never write "certified" before the credential is issued.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is a good objective for a healthcare resume with no experience?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Lead with your training: the program or certification, your clinical or volunteer hours, and the setting. Then name the specific role and shift you are applying for. Training hours count as experience on an entry-level healthcare resume.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This article was written with AI assistance and reviewed and edited by the ResuHive team.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>career</category>
      <category>jobsearch</category>
      <category>writing</category>
      <category>beginners</category>
    </item>
    <item>
      <title>I let an AI explain a random profitable SaaS startup in plain English</title>
      <dc:creator>思源</dc:creator>
      <pubDate>Mon, 12 Oct 2026 03:16:20 +0000</pubDate>
      <link>https://dev.to/resuhive/i-let-an-ai-explain-a-random-profitable-saas-startup-in-plain-english-2alo</link>
      <guid>https://dev.to/resuhive/i-let-an-ai-explain-a-random-profitable-saas-startup-in-plain-english-2alo</guid>
      <description>&lt;p&gt;TrustMRR lists 11,000+ startups with Stripe-verified revenue. It's the best place I know to find SaaS ideas that already make money — but browsing it is a trap. You scroll past the same cards, forget why you passed on something, and never actually decide.&lt;/p&gt;

&lt;p&gt;So I built a small Chrome extension, IdeaPanner, that turns TrustMRR browsing into a workflow. One button — "Explain" — sends a startup's public profile to an LLM and returns a plain-language breakdown: who pays, how it makes money, where customers come from, whether a solo founder could build it.&lt;/p&gt;

&lt;p&gt;Here's what the workflow looks like.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mark, don't just scroll
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Mark&lt;/strong&gt; every card Pass / Later / Dig in. Passed ones hide on your next visit, so you only see what's new.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Explain&lt;/strong&gt; any startup. The output isn't a generic summary — it's a verdict: the market, the customer's pain, the money, and a realistic "could you build this alone?" call.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compare&lt;/strong&gt; your shortlist side by side, with MRR change since the day you marked each one.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why this beats scrolling
&lt;/h2&gt;

&lt;p&gt;The hard part of "find a SaaS idea" was never finding them. It was &lt;em&gt;remembering what you looked at and why&lt;/em&gt;. IdeaPanner makes the browse itself decision-shaped: you leave each session with a ranked shortlist and a reason, not a vague "I should build something."&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;The extension is free to start (10 AI explanations/day, no key, no sign-up), or you can plug in your own OpenAI-compatible endpoint. It only runs on trustmrr.com and isn't affiliated with TrustMRR.&lt;/p&gt;

&lt;p&gt;Install IdeaPanner on the Chrome Web Store: &lt;a href="https://chromewebstore.google.com/detail/ibjbnafobdhmofffmjfljclnofeibike" rel="noopener noreferrer"&gt;https://chromewebstore.google.com/detail/ibjbnafobdhmofffmjfljclnofeibike&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you end up building something off a TrustMRR find, I'd love to hear which one.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This article was written with AI assistance and reviewed and edited by the ResuHive team.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>saas</category>
      <category>ai</category>
      <category>sideprojects</category>
      <category>chromeextensions</category>
    </item>
    <item>
      <title>MBA Resume Format: The 1-Page Layout Admissions Committees Expect</title>
      <dc:creator>思源</dc:creator>
      <pubDate>Mon, 12 Oct 2026 02:52:36 +0000</pubDate>
      <link>https://dev.to/resuhive/mba-resume-format-the-1-page-layout-admissions-committees-expect-2n4c</link>
      <guid>https://dev.to/resuhive/mba-resume-format-the-1-page-layout-admissions-committees-expect-2n4c</guid>
      <description>&lt;p&gt;If you're applying to an MBA program, the resume that got you interviews at work is &lt;strong&gt;not&lt;/strong&gt; the one to send the admissions committee. MBA resumes follow a different convention — a hard one-page limit, a different section order, and far more weight on leadership and impact than on day-to-day responsibilities.&lt;/p&gt;

&lt;h3&gt;
  
  
  The one-page rule is not a suggestion
&lt;/h3&gt;

&lt;p&gt;Business schools are explicit and uniform: one page. Not 1.5, not "as long as it's under two." A two-page resume reads as either someone who can't prioritize or someone who doesn't know the convention — both work against you.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The rule:&lt;/strong&gt; One page, PDF, 10–12pt body, 0.5–0.75in margins. If it runs long, cut older and lower-signal items — don't shrink the font below 10pt to make it fit.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Same candidate, two lengths:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;❌ Two-page resume: every role with 6 bullets, 2012 internship included, "References available on request" at the bottom.&lt;/li&gt;
&lt;li&gt;✅ One-page resume: 3 most recent roles, 3–4 bullets each, internships folded into one line, no references line.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Education before experience — or after?
&lt;/h3&gt;

&lt;p&gt;It depends on how much work history you have.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Your history&lt;/th&gt;
&lt;th&gt;Lead with&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;Fewer than ~5 years of full-time work&lt;/td&gt;
&lt;td&gt;Education first&lt;/td&gt;
&lt;td&gt;Your degree, GPA, test score and relevant coursework are still the strongest signal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5+ years of substantive work&lt;/td&gt;
&lt;td&gt;Experience first, education right after the summary&lt;/td&gt;
&lt;td&gt;Your impact at work is now the story&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A defined pre-MBA industry (consulting, banking)&lt;/td&gt;
&lt;td&gt;Experience first&lt;/td&gt;
&lt;td&gt;Adcoms expect the standard industry resume shape&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Either way, education is never buried at the bottom. Within each section the &lt;a href="https://resuhive.com/en/blog/reverse-chronological-resume-format" rel="noopener noreferrer"&gt;reverse chronological order&lt;/a&gt; still applies.&lt;/p&gt;

&lt;h3&gt;
  
  
  What an MBA resume includes that a job resume leaves out
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Test scores:&lt;/strong&gt; GMAT or GRE, with score and percentile if strong.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GPA&lt;/strong&gt;, overall and in your major if the major GPA is higher.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Relevant coursework&lt;/strong&gt; — only the quantitative and business-relevant classes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Leadership and extracurriculars&lt;/strong&gt; as a real section. Clubs and volunteer roles where you held a title matter more here than on any job application.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Languages and technical skills&lt;/strong&gt;, listed plainly.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Quantify leadership, not duties
&lt;/h3&gt;

&lt;p&gt;"Responsible for a team" says nothing. "Led 6 analysts to deliver a model adopted by 3 divisions" does. The &lt;a href="https://resuhive.com/en/blog/resume-skills-section" rel="noopener noreferrer"&gt;resume skills section&lt;/a&gt; is where this discipline shows up most clearly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Same role, two framings:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;❌ Managed the client onboarding process and supported the sales team with reporting.&lt;/li&gt;
&lt;li&gt;✅ Led onboarding for 40+ enterprise accounts; cut time-to-active from 14 to 6 days and built the reporting pack the sales team still uses.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Notice the second names a scope (40+ accounts), a result (14→6 days), and a ripple effect (still in use). That's the evidence adcoms score — and it's what a good &lt;a href="https://resuhive.com/en/blog/what-is-a-resume-summary" rel="noopener noreferrer"&gt;summary line&lt;/a&gt; should foreshadow.&lt;/p&gt;

&lt;h3&gt;
  
  
  Formatting rules admissions committees actually enforce
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;No photo, no objective statement, no "references available" line.&lt;/li&gt;
&lt;li&gt;Consistent date format (MM/YYYY), aligned to one margin.&lt;/li&gt;
&lt;li&gt;Bold section headers, no color, no graphics, no columns that break a parser.&lt;/li&gt;
&lt;li&gt;Action verbs to open every bullet; no "I", no "Responsible for."&lt;/li&gt;
&lt;li&gt;One line per bullet where possible; two at most.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Mistakes that sink otherwise strong files
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;A second page "just this once."&lt;/li&gt;
&lt;li&gt;Listing responsibilities instead of leadership, especially in extracurriculars.&lt;/li&gt;
&lt;li&gt;Hiding a strong GPA or test score because you're "modest."&lt;/li&gt;
&lt;li&gt;Including jobs from 12+ years ago.&lt;/li&gt;
&lt;li&gt;Copying your employer's branded template with logos and color.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  FAQ
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Do I need to list every job I've ever had?&lt;/strong&gt; No. Three to four most relevant roles is plenty.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Should I include my GMAT if it's below the school's average?&lt;/strong&gt; If the rest of your file is strong, you can omit it; many applicants do. If it's your only weak spot, omitting looks evasive — include it and let the rest carry you.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can the resume be two pages with 15 years of experience?&lt;/strong&gt; No. The one-page rule holds even for senior applicants.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does the MBA resume share content with my job resume?&lt;/strong&gt; Same experiences, reframed toward leadership, impact, and contribution to a cohort — which is also the heart of &lt;a href="https://resuhive.com/en/blog/tailor-resume-to-job-description" rel="noopener noreferrer"&gt;tailoring a resume to a posting&lt;/a&gt;, aimed at a committee instead of a hiring manager.&lt;/p&gt;




&lt;p&gt;Want a layout that already enforces these rules — one page, clean to parse, leadership-forward? → &lt;a href="https://resuhive.com/en/wizard" rel="noopener noreferrer"&gt;https://resuhive.com/en/wizard&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This article was written with AI assistance and reviewed and edited by the ResuHive team.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>career</category>
      <category>mba</category>
      <category>resume</category>
      <category>jobsearch</category>
    </item>
  </channel>
</rss>
