<?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: MakeInterview</title>
    <description>The latest articles on DEV Community by MakeInterview (@makeinterview).</description>
    <link>https://dev.to/makeinterview</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%2F4153400%2Fa003d4aa-6635-4fd0-8cb2-8148a70261ac.jpg</url>
      <title>DEV Community: MakeInterview</title>
      <link>https://dev.to/makeinterview</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/makeinterview"/>
    <language>en</language>
    <item>
      <title>Why "It Depends" Is a Bad Opening Line in a Technical Interview</title>
      <dc:creator>MakeInterview</dc:creator>
      <pubDate>Fri, 09 Oct 2026 15:11:43 +0000</pubDate>
      <link>https://dev.to/makeinterview/why-it-depends-is-a-bad-opening-line-in-a-technical-interview-48gl</link>
      <guid>https://dev.to/makeinterview/why-it-depends-is-a-bad-opening-line-in-a-technical-interview-48gl</guid>
      <description>&lt;p&gt;"It depends" is technically correct and practically useless as an opening line. The interviewer already knows it depends. What they are waiting for is the sentence that shows &lt;em&gt;how&lt;/em&gt; you decide.&lt;/p&gt;

&lt;h2&gt;
  
  
  Say the constraint first
&lt;/h2&gt;

&lt;p&gt;Almost every design question hides one unstated constraint: read-heavy or write-heavy, one region or many, latency budget, team size, budget. Name the constraint you are assuming before you name your solution.&lt;/p&gt;

&lt;p&gt;Compare:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"It depends. There are several options..." — the room waits.&lt;/li&gt;
&lt;li&gt;"Assuming read-heavy and a few milliseconds of allowed staleness, I would start with a read replica and a short cache." — now we are discussing engineering.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The second version can be argued with, and arguing with it is exactly the point. A wrong assumption out loud gets corrected in two seconds. A vague answer gets marked as vague and never recovers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Commit, then qualify
&lt;/h2&gt;

&lt;p&gt;Give a primary answer, then at most two caveats. Candidates who open with a menu of alternatives lose the thread of their own answer, and the interviewer stops following it. Candidates who commit and then name the one condition that would change their mind sound like someone who has shipped before.&lt;/p&gt;

&lt;p&gt;The caveat is the interesting part. "I would do X unless the write path is the bottleneck, in which case I would do Y" tells the interviewer you know where the bodies are buried. It also gives them an easy follow-up, which is what they were going to ask anyway.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the third beat goes
&lt;/h2&gt;

&lt;p&gt;Structure works the same way outside system design. For behavioural questions, context, action, result beats a chronological retelling every time — most stories collapse because the result arrives last, after the listener has already stopped caring.&lt;/p&gt;

&lt;p&gt;The skill is the same in both cases: land the point early, then add detail only if asked.&lt;/p&gt;

&lt;p&gt;That is the loop worth practising out loud. Speaking an answer exposes filler and buried conclusions that look fine on paper. &lt;a href="https://makeinterview.com" rel="noopener noreferrer"&gt;MakeInterview&lt;/a&gt; runs that drill as a scored mock — you talk, it marks where the structure broke.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Related reading on this blog: practicing answers out loud, and why follow-up questions derail otherwise good answers.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>career</category>
      <category>interview</category>
    </item>
    <item>
      <title>How to practice interview answers out loud (and why silent prep fails)</title>
      <dc:creator>MakeInterview</dc:creator>
      <pubDate>Sun, 04 Oct 2026 12:17:43 +0000</pubDate>
      <link>https://dev.to/makeinterview/how-to-practice-interview-answers-out-loud-and-why-silent-prep-fails-3obb</link>
      <guid>https://dev.to/makeinterview/how-to-practice-interview-answers-out-loud-and-why-silent-prep-fails-3obb</guid>
      <description>&lt;p&gt;I have sat through enough mock interviews to notice the same pattern: the candidate knows the answer, and it still comes out flat.&lt;/p&gt;

&lt;p&gt;The gap is almost never knowledge. It is delivery. In your head an answer sounds complete. Out loud it has filler words, a rushed middle, and a conclusion that trails off. You only hear that when you actually say it to someone — or to something.&lt;/p&gt;

&lt;h2&gt;
  
  
  The part silent prep misses
&lt;/h2&gt;

&lt;p&gt;Reading a question and mentally drafting an answer is recall practice. It trains retrieval, not performance. An interview tests performance under mild stress: someone is listening, the clock is running, and you cannot edit the sentence after you have said it.&lt;/p&gt;

&lt;p&gt;So the useful loop is short:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Answer out loud, once, without notes.&lt;/li&gt;
&lt;li&gt;Listen back for filler words and pace.&lt;/li&gt;
&lt;li&gt;Redo just the weak section.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That is it. Ten minutes of that beats an hour of silent review.&lt;/p&gt;

&lt;p&gt;I built &lt;a href="https://makeinterview.com" rel="noopener noreferrer"&gt;MakeInterview&lt;/a&gt; around exactly this loop — it runs a spoken mock interview and gives feedback on how the answer sounds, not just what you meant. The point is not the tool; it is that you have to hear yourself before you can fix the delivery.&lt;/p&gt;

</description>
      <category>career</category>
      <category>beginners</category>
      <category>ai</category>
      <category>programming</category>
    </item>
    <item>
      <title>Vectorizing a logo vs. a photo: why the same tool gives you junk on one</title>
      <dc:creator>MakeInterview</dc:creator>
      <pubDate>Sun, 04 Oct 2026 09:11:27 +0000</pubDate>
      <link>https://dev.to/makeinterview/vectorizing-a-logo-vs-a-photo-why-the-same-tool-gives-you-junk-on-one-20c2</link>
      <guid>https://dev.to/makeinterview/vectorizing-a-logo-vs-a-photo-why-the-same-tool-gives-you-junk-on-one-20c2</guid>
      <description>&lt;p&gt;"Just vectorize it" hides a fork. A logo and a photo need opposite strategies, and using one tool for both is why half your exports come back as blobs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Logos and icons want sharpening
&lt;/h2&gt;

&lt;p&gt;A logo is flat regions with hard edges and flat color. The right pipeline finds the boundaries between color regions and fits closed paths to them. You want few nodes, exact corners, and solid fills. Trace with too much path detail and you get wobbly edges and thousands of nodes for a shape that should be a dozen control points.&lt;/p&gt;

&lt;p&gt;What to check on the output:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fill the shape with a new color — it should take, because it is a real region.&lt;/li&gt;
&lt;li&gt;Count nodes. A clean 4-color logo should land in the low hundreds, not tens of thousands.&lt;/li&gt;
&lt;li&gt;Zoom to 800% and look at a straight edge. It should stay straight, not ripple.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Photos want smoothing, not detail
&lt;/h2&gt;

&lt;p&gt;A photograph has no hard regions. Chasing per-pixel detail produces a noisy mess of speckles that is larger than the original and looks worse when scaled up. Here you want aggressive merging of near-collinear points, a speckle filter, and a limited palette. The goal is a poster-like reduction that reads cleanly, not a node-per-pixel reproduction.&lt;/p&gt;

&lt;h2&gt;
  
  
  The test that separates them
&lt;/h2&gt;

&lt;p&gt;Open the output in a text editor:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;svg&lt;/span&gt; &lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;path&lt;/span&gt; &lt;span class="na"&gt;d=&lt;/span&gt;&lt;span class="s"&gt;"M12 4 L28 4 L28 20 Z"&lt;/span&gt; &lt;span class="na"&gt;fill=&lt;/span&gt;&lt;span class="s"&gt;"#1a73e8"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;   real geometry, good for a logo
  &lt;span class="nt"&gt;&amp;lt;image&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"data:image/png;base64,...."&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;          wrapped bitmap, not a vector
&lt;span class="nt"&gt;&amp;lt;/svg&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you see &lt;code&gt;&amp;lt;image&amp;gt;&lt;/code&gt;, the extension lied. If you see a handful of &lt;code&gt;&amp;lt;path&amp;gt;&lt;/code&gt; elements, you have something you can scale, recolor, and cut.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the distinction changes your tooling
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cutting (CNC, plotter, Cricut):&lt;/strong&gt; needs closed paths. A wrapped bitmap cannot be cut at all.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Theming (dark mode, brand recolor):&lt;/strong&gt; needs fills, not pixels.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Web weight:&lt;/strong&gt; a few KB of path data beats a 400 KB base64 blob, and it stays crisp at every DPI.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I benchmarked a converter on both classes of image and wrote up the measured differences — edge fidelity, node counts, file sizes — at &lt;a href="https://pic2svg.com" rel="noopener noreferrer"&gt;pic2svg&lt;/a&gt;. The takeaway is boring but load-bearing: match the strategy to the image type, then measure what came out instead of trusting the file extension.&lt;/p&gt;

</description>
      <category>design</category>
      <category>tools</category>
    </item>
    <item>
      <title>The Interview Answer You Can't Defend — and How to Find It Before the Interviewer Does</title>
      <dc:creator>MakeInterview</dc:creator>
      <pubDate>Sun, 04 Oct 2026 05:32:28 +0000</pubDate>
      <link>https://dev.to/makeinterview/the-interview-answer-you-cant-defend-and-how-to-find-it-before-the-interviewer-does-46aa</link>
      <guid>https://dev.to/makeinterview/the-interview-answer-you-cant-defend-and-how-to-find-it-before-the-interviewer-does-46aa</guid>
      <description>&lt;p&gt;Most people prepare for the interview they imagine. They rehearse an introduction, memorize a couple of project stories, and practice "tell me about a time when…" until the words feel smooth.&lt;/p&gt;

&lt;p&gt;Then the interviewer reads the resume line by line and lands on the one sentence you never practiced defending.&lt;/p&gt;

&lt;p&gt;I've seen this from both sides of the table. The pattern holds: the question that sinks an interview is almost never a hard technical question. It's a small factual probe about something you wrote down months ago and haven't thought about since.&lt;/p&gt;

&lt;p&gt;It's worth understanding &lt;em&gt;why&lt;/em&gt; interviewers do this, because the why tells you exactly what to prepare.&lt;/p&gt;

&lt;h2&gt;
  
  
  They aren't being hostile — they're verifying
&lt;/h2&gt;

&lt;p&gt;Structured interviews are one of the better-performing selection tools we have. That finding goes back at least to Schmidt and Hunter's 1998 meta-analysis and was refined by Sackett and colleagues in 2022. The short version: asking every candidate the same job-relevant questions and scoring the answers against a defined rubric predicts job performance better than the unstructured "let's just chat" version.&lt;/p&gt;

&lt;p&gt;A structured interview has a resume-verification component almost by design. The interviewer has a page of facts. Their job is to check whether those facts hold up and whether your stated contribution matches the story. So they probe — and they probe the parts a careful reader would notice.&lt;/p&gt;

&lt;p&gt;That's the useful part: the &lt;em&gt;targets&lt;/em&gt; are predictable, even if the exact questions aren't.&lt;/p&gt;

&lt;h2&gt;
  
  
  The three lines that get probed
&lt;/h2&gt;

&lt;p&gt;Almost every resume drill lands on one of three things. Find them on your own resume before the interview and you can prepare for them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. The gap.&lt;/strong&gt; A stretch with no dates attached, or a range that doesn't follow the previous one. The follow-up is calm but specific: &lt;em&gt;"What were you doing between March and September?"&lt;/em&gt; This isn't automatically a problem — people take time off for a dozen legitimate reasons. The problem is a vague answer, or one that contradicts the timeline you gave earlier in the same conversation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. The short tenure.&lt;/strong&gt; A role that lasted six months, then another that lasted four. The interviewer wants to know whether there's a pattern and whether you can describe it honestly. The follow-up sounds like: &lt;em&gt;"That one was short — what happened?"&lt;/em&gt; "It just wasn't a fit" invites the same question again. Naming the specific mismatch — the mandate shifted, the role was re-scoped, the team was restructured — sounds like someone who understands their own career.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. The number with no method.&lt;/strong&gt; "Improved conversion by 40%." "Reduced latency by 60%." These are the easiest lines to write and the hardest to defend, because the immediate follow-up is: &lt;em&gt;How was that measured? Over what window? Against what baseline? Did you measure it, or did someone hand you the number?&lt;/em&gt; A modest claim you can explain beats a bigger one you can't.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a defensible answer looks like
&lt;/h2&gt;

&lt;p&gt;A defensible answer has three parts, and none of them require you to sound impressive.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The plain fact&lt;/strong&gt;, in one sentence. "I left in June and started the next role in September."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The reason, without spin.&lt;/strong&gt; If it was a layoff, say layoff. If you took time off to care for family, say that. If you were looking, say you were looking. Interviewers have heard everything; what they're testing is whether you'll be straight about it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The forward link&lt;/strong&gt;, one sentence connecting that fact to the job in front of you. "That's part of why I'm targeting smaller teams where the mandate is clearer," or "I used that time to finish a certification, which is why I'm moving toward backend infrastructure."&lt;/p&gt;

&lt;p&gt;The same structure works for a number: the metric, the method, your role. "The 40% was signups over a six-week A/B test; I ran the experiment, my manager set the target." That's stronger than a rounder number you can't account for.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why you have to say it out loud
&lt;/h2&gt;

&lt;p&gt;Here's the part reading notes can't fix.&lt;/p&gt;

&lt;p&gt;When you &lt;em&gt;read&lt;/em&gt; a prepared answer, you're doing recognition: "yep, that's roughly what I meant to say." When you &lt;em&gt;say&lt;/em&gt; it out loud, you're doing recall, and recall is what the interview actually requires. The gap between the two is where trouble lives.&lt;/p&gt;

&lt;p&gt;Speaking also exposes what reading hides: the hedge word you didn't know you used ("I sort of led"), the place you trail off, the sentence that looked fine on paper and comes out defensive. You only catch those by hearing them.&lt;/p&gt;

&lt;p&gt;Which is why the highest-value practice isn't writing better answers. It's answering out loud, getting interrupted mid-answer with a follow-up, and reading the transcript afterward.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I practice this
&lt;/h2&gt;

&lt;p&gt;For the out-loud part I use MockLive. You upload a resume, pick one of five interviewer roles — HR screen, direct manager, technical expert, department director, executive final round — and answer voice questions. It interrogates the weak spots on your resume and returns a report that quotes your own words back at you, flags the sentence that didn't hold up, and lets you replay the audio. The first session is free, so it works as a low-stakes place to get asked the question you're actually afraid of.&lt;/p&gt;

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

&lt;p&gt;Before your next interview:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Read your resume as a stranger would, and mark every gap longer than three months, every role under a year, and every number with no method behind it.&lt;/li&gt;
&lt;li&gt;For each mark, write one plain sentence describing what happened.&lt;/li&gt;
&lt;li&gt;Say it out loud, alone, twice. Notice where you stumble or start over-explaining.&lt;/li&gt;
&lt;li&gt;Have someone interrupt with "why?" after each sentence. If you can answer the follow-up without getting defensive, it's ready.&lt;/li&gt;
&lt;li&gt;If you can't, that's the line to work on before the interview — not the introduction.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The introduction is the part you've already rehearsed. The line you can't defend is the part that decides the interview.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;If you want a place to practice getting asked out loud, try it at &lt;a href="https://makeinterview.com" rel="noopener noreferrer"&gt;https://makeinterview.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Your 'vectorized' SVG may still be a bitmap — 4 checks, with measurements</title>
      <dc:creator>MakeInterview</dc:creator>
      <pubDate>Sun, 04 Oct 2026 04:46:18 +0000</pubDate>
      <link>https://dev.to/makeinterview/your-vectorized-svg-may-still-be-a-bitmap-4-checks-with-measurements-5g6h</link>
      <guid>https://dev.to/makeinterview/your-vectorized-svg-may-still-be-a-bitmap-4-checks-with-measurements-5g6h</guid>
      <description>&lt;p&gt;When you "vectorize" an image, the result is supposed to be &lt;strong&gt;paths&lt;/strong&gt; — geometry you can scale, recolor, and cut. A surprising number of tools, including Inkscape's own Trace Bitmap, instead wrap the original bitmap in an &lt;code&gt;&amp;lt;svg&amp;gt;&lt;/code&gt; tag, so the file is a picture inside a vector wrapper. It looks fine at 100% and falls apart everywhere else.&lt;/p&gt;

&lt;p&gt;You can tell which one you got in about a minute. Here are four checks, then the numbers from a benchmark I ran.&lt;/p&gt;

&lt;h2&gt;
  
  
  Check 1 — count the &lt;code&gt;&amp;lt;image&amp;gt;&lt;/code&gt; elements
&lt;/h2&gt;

&lt;p&gt;Open the SVG in a text editor and search for &lt;code&gt;&amp;lt;image&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;A non-zero count means a raster picture is embedded, and the file is at least partly a bitmap in a vector wrapper. Zero is a good sign, but not the whole story (see check 3).&lt;/p&gt;

&lt;h2&gt;
  
  
  Check 2 — compare bytes with and without the bitmap
&lt;/h2&gt;

&lt;p&gt;Strip every &lt;code&gt;&amp;lt;image&amp;gt;&lt;/code&gt; element and compare the file sizes. The delta is exactly how many bytes of picture were hiding inside.&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;# bytes with the embedded bitmap removed&lt;/span&gt;
python3 - &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;'
import re
s = open("out.svg").read()
print(len(s.encode()), "-&amp;gt;", len(re.sub(r"&amp;lt;image&lt;/span&gt;&lt;span class="se"&gt;\b&lt;/span&gt;&lt;span class="sh"&gt;.*?&amp;lt;/image&amp;gt;|&amp;lt;image&lt;/span&gt;&lt;span class="se"&gt;\b&lt;/span&gt;&lt;span class="sh"&gt;[^&amp;gt;]*/&amp;gt;", "", s).encode()))
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the file drops by 70% when you remove the image, the image &lt;em&gt;was&lt;/em&gt; the artwork.&lt;/p&gt;

&lt;h2&gt;
  
  
  Check 3 — is the visible shape actually made of paths?
&lt;/h2&gt;

&lt;p&gt;Path count is the giveaway. If the artwork you see has rich color but the &lt;code&gt;&amp;lt;svg&amp;gt;&lt;/code&gt; contains 4 &lt;code&gt;&amp;lt;path&amp;gt;&lt;/code&gt; elements, those paths are not drawing your picture — the embedded bitmap is.&lt;/p&gt;

&lt;h2&gt;
  
  
  Check 4 — render it huge
&lt;/h2&gt;

&lt;p&gt;Rasterize the SVG at 20× and zoom in. Real vector paths hold a clean edge; an embedded bitmap goes soft and pixelated the moment you pass the source resolution.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the measurement actually showed
&lt;/h2&gt;

&lt;p&gt;I ran three tracers on three inputs on one Apple-silicon Mac, twice each on two dates (2026-09-28 and 2026-09-29). The harness recorded &lt;code&gt;offline: true&lt;/code&gt; — not one call left the machine. Two inputs kept identical SHA-256 hashes across both runs and produced byte-identical Inkscape and potrace output, so the columns below are reproducible.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Input&lt;/th&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Bytes&lt;/th&gt;
&lt;th&gt;Bytes excl. bitmap&lt;/th&gt;
&lt;th&gt;
&lt;code&gt;&amp;lt;path&amp;gt;&lt;/code&gt; elements&lt;/th&gt;
&lt;th&gt;Distinct colours&lt;/th&gt;
&lt;th&gt;Embedded &lt;code&gt;&amp;lt;image&amp;gt;&lt;/code&gt;
&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;apple-touch-icon.png (180×180)&lt;/td&gt;
&lt;td&gt;Inkscape 1.4.4 Trace Bitmap&lt;/td&gt;
&lt;td&gt;29,689&lt;/td&gt;
&lt;td&gt;20,869&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;apple-touch-icon.png&lt;/td&gt;
&lt;td&gt;potrace 1.16&lt;/td&gt;
&lt;td&gt;1,322&lt;/td&gt;
&lt;td&gt;1,322&lt;/td&gt;
&lt;td&gt;1&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;apple-touch-icon.png&lt;/td&gt;
&lt;td&gt;any2svg engine (VTracer 0.6.15)&lt;/td&gt;
&lt;td&gt;1,027&lt;/td&gt;
&lt;td&gt;1,027&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;og-image.png (1200×630)&lt;/td&gt;
&lt;td&gt;Inkscape 1.4.4 Trace Bitmap&lt;/td&gt;
&lt;td&gt;550,602&lt;/td&gt;
&lt;td&gt;460,883&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;og-image.png&lt;/td&gt;
&lt;td&gt;potrace 1.16&lt;/td&gt;
&lt;td&gt;21,718&lt;/td&gt;
&lt;td&gt;21,718&lt;/td&gt;
&lt;td&gt;88&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;og-image.png&lt;/td&gt;
&lt;td&gt;any2svg engine&lt;/td&gt;
&lt;td&gt;32,583&lt;/td&gt;
&lt;td&gt;32,583&lt;/td&gt;
&lt;td&gt;236&lt;/td&gt;
&lt;td&gt;93&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;synthetic-flat.png (800×600)&lt;/td&gt;
&lt;td&gt;Inkscape 1.4.4 Trace Bitmap&lt;/td&gt;
&lt;td&gt;6,759&lt;/td&gt;
&lt;td&gt;1,605&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;synthetic-flat.png&lt;/td&gt;
&lt;td&gt;potrace 1.16&lt;/td&gt;
&lt;td&gt;771&lt;/td&gt;
&lt;td&gt;771&lt;/td&gt;
&lt;td&gt;1&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;synthetic-flat.png&lt;/td&gt;
&lt;td&gt;any2svg engine&lt;/td&gt;
&lt;td&gt;3,068&lt;/td&gt;
&lt;td&gt;3,068&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;6&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;Three things fall out of this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Inkscape's stock Trace Bitmap exported exactly one embedded &lt;code&gt;&amp;lt;image&amp;gt;&lt;/code&gt; every time&lt;/strong&gt; — all three inputs, both dates. The bare &lt;code&gt;&amp;lt;image&amp;gt;&lt;/code&gt; count is not a perfect verdict on its own, but here it fired on every single run.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;potrace is honest but 1-bit.&lt;/strong&gt; It never embeds a bitmap, and it never produces more than one colour layer. Perfect for a stencil, useless for a logo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Path count tracks "is this really a vector".&lt;/strong&gt; The icon that came out as 3 paths and the photo-derived banner that came out as 236 paths are genuinely editable; the 7-path Inkscape file is a 20 KB bitmap with a thin vector coat of paint.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Why this bites harder than it looks
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;CNC, laser, and vinyl cutters&lt;/strong&gt; consume the &lt;em&gt;paths&lt;/em&gt;, not the pixels. A raster-in-a-wrapper produces a toolpath around the image bounds, not the shape you wanted.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Web use&lt;/strong&gt; means shipping a 550 KB "SVG" that could have been 30 KB, then watching it blur on a retina display.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Editing&lt;/strong&gt; is the loudest tell: try to recolor a single region of an embedded bitmap inside a vector editor. You can't, because there is no path there to select.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Getting a real one
&lt;/h2&gt;

&lt;p&gt;If you'd rather generate than audit: &lt;code&gt;potrace&lt;/code&gt; is the right tool for flat, high-contrast art. For photos, logos, and multi-colour artwork you want a colour tracer that emits genuine filled paths.&lt;/p&gt;

&lt;p&gt;Full disclosure: I build one — &lt;a href="https://pic2svg.com" rel="noopener noreferrer"&gt;pic2svg&lt;/a&gt;, the engine in the table above. It's a hosted tracer (image posted to the API, traced there), free to trace and preview, with a paid tier for downloads. But the point of this post is the checklist, not the pitch: run checks 1–4 on whatever tool you already use, and you'll know in a minute whether you're holding vectors or a picture in a costume.&lt;/p&gt;

&lt;p&gt;The raw measurements and the exact commands are published at &lt;a href="https://pic2svg.com/offline-vector-converter-benchmark" rel="noopener noreferrer"&gt;pic2svg.com/offline-vector-converter-benchmark&lt;/a&gt; if you want to reproduce or dispute them.&lt;/p&gt;

</description>
      <category>svg</category>
      <category>webdev</category>
      <category>design</category>
      <category>tooling</category>
    </item>
    <item>
      <title>I open-sourced the counting tool, and it immediately caught two of its own bugs</title>
      <dc:creator>MakeInterview</dc:creator>
      <pubDate>Fri, 02 Oct 2026 00:10:11 +0000</pubDate>
      <link>https://dev.to/makeinterview/i-open-sourced-the-counting-tool-and-it-immediately-caught-two-of-its-own-bugs-2bhp</link>
      <guid>https://dev.to/makeinterview/i-open-sourced-the-counting-tool-and-it-immediately-caught-two-of-its-own-bugs-2bhp</guid>
      <description>&lt;p&gt;I published a count a while back: the King James Bible says "fear not" &lt;strong&gt;62 times&lt;/strong&gt;, not the 365 the wall art claims. Then I turned the counting code into a small open-source tool — and the first thing it did was prove &lt;em&gt;itself&lt;/em&gt; wrong.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two bugs, both silent
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Bug one: substrings.&lt;/strong&gt; A naive search for &lt;code&gt;fear&lt;/code&gt; also matches &lt;code&gt;fearful&lt;/code&gt;, &lt;code&gt;fearfulness&lt;/code&gt;, and &lt;code&gt;God-fearing&lt;/code&gt;. That inflates a raw count by roughly 15% and looks completely reasonable on the screen.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bug two: punctuation as glue.&lt;/strong&gt; I normalised away punctuation so &lt;code&gt;fear not.&lt;/code&gt; and &lt;code&gt;fear not&lt;/code&gt; would match. But stripping punctuation also turns 1 Peter 2:18 —&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Servants, be subject to your masters with all fear; not only to the good and gentle...&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;— into the string &lt;code&gt;...all fear not only...&lt;/code&gt;, which &lt;em&gt;contains&lt;/em&gt; the phrase "fear not" even though the verse does not say it. One false positive, from a semicolon.&lt;/p&gt;

&lt;p&gt;Neither bug threw an error. Both produced a plausible number. I only caught them because the tool runs over the &lt;strong&gt;whole&lt;/strong&gt; corpus and asserts its output against a published per-verse audit trail.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I ship the corpus, not just the number
&lt;/h2&gt;

&lt;p&gt;The repo includes the full KJV (31,102 verses) and the Chinese Union Version (31,100 verses), plus a test that re-derives every published count:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;node test.mjs
&lt;span class="c"&gt;# ok — tool and audit trail agree over the full KJV (31,102 v) and CUV (31,100 v)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A count with a stated rule can be checked, corrected, and cited. A count without one is a rumor with a decimal point. The rule here is explicit: whole words not substrings, whitespace joins words and punctuation never does, verses for phrase claims and occurrences for word claims, and every rule reported separately instead of silently merged.&lt;/p&gt;

&lt;h2&gt;
  
  
  The takeaway for anyone publishing a number
&lt;/h2&gt;

&lt;p&gt;If you publish a number, publish the rule that produced it &lt;em&gt;next to&lt;/em&gt; the number, and publish the rows so someone can diff your work instead of trusting it. The two bugs above are not exotic. They are what happens when a number travels without its method.&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Method write-up: &lt;a href="https://trustbible.org/blog/how-many-times-does-the-bible-say-fear-not/" rel="noopener noreferrer"&gt;How many times does the Bible say "fear not"?&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Dataset (CC-BY-4.0): &lt;a href="https://trustbible.org/data/fear-not-counts.csv" rel="noopener noreferrer"&gt;fear-not-counts.csv&lt;/a&gt; and &lt;a href="https://trustbible.org/data/fear-not-counts.json" rel="noopener noreferrer"&gt;fear-not-counts.json&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Tool: &lt;a href="https://github.com/szj2ys/bible-phrase-count" rel="noopener noreferrer"&gt;github.com/szj2ys/bible-phrase-count&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you find an error in my count, I would genuinely like to know — that is the whole point of putting the method where people can argue with it.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;I built the counting pipeline while working on &lt;a href="https://trustbible.org/" rel="noopener noreferrer"&gt;TrustBible&lt;/a&gt;, a Bible Q&amp;amp;A tool that quotes the exact verses it cites.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>coding</category>
      <category>debugging</category>
      <category>opensource</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Valve's public achievement endpoint is an underrated analytics feed</title>
      <dc:creator>MakeInterview</dc:creator>
      <pubDate>Thu, 01 Oct 2026 11:47:04 +0000</pubDate>
      <link>https://dev.to/makeinterview/valves-public-achievement-endpoint-is-an-underrated-analytics-feed-mn9</link>
      <guid>https://dev.to/makeinterview/valves-public-achievement-endpoint-is-an-underrated-analytics-feed-mn9</guid>
      <description>&lt;h1&gt;
  
  
  Valve's public achievement endpoint is an underrated analytics feed — here's its shape
&lt;/h1&gt;

&lt;p&gt;While building a small bilingual (Chinese/English) fan guide for a co-op game, I leaned on a Valve endpoint that more people should know about: the &lt;strong&gt;global achievement percentages&lt;/strong&gt; API.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://api.steampowered.com/ISteamUserStats/GetGlobalAchievementPercentagesForApp/v2/?gameid=&amp;lt;APPID&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It returns, for a given app id, the share of all players who have unlocked each achievement. No scraping, no private dashboard — one JSON call.&lt;/p&gt;

&lt;h2&gt;
  
  
  The shape
&lt;/h2&gt;

&lt;p&gt;The response is small: an &lt;code&gt;achievementpercentages.achievements[]&lt;/code&gt; array of &lt;code&gt;{ name, percent }&lt;/code&gt; where &lt;code&gt;name&lt;/code&gt; is the internal API name (not the store display name). For the game I was documenting (app 1478500) it produced a clean funnel:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;achievement (apiname)&lt;/th&gt;
&lt;th&gt;% of players&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Drawbridge&lt;/td&gt;
&lt;td&gt;87.6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Map&lt;/td&gt;
&lt;td&gt;64.7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Backpack&lt;/td&gt;
&lt;td&gt;57.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chairlift&lt;/td&gt;
&lt;td&gt;44.2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Train&lt;/td&gt;
&lt;td&gt;37.8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Holster&lt;/td&gt;
&lt;td&gt;36.2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tunnel&lt;/td&gt;
&lt;td&gt;30.2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Peak&lt;/td&gt;
&lt;td&gt;28.8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Wall&lt;/td&gt;
&lt;td&gt;20.2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ending1&lt;/td&gt;
&lt;td&gt;19.1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Shiny&lt;/td&gt;
&lt;td&gt;9.4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ending2&lt;/td&gt;
&lt;td&gt;6.0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Sorted ascending, that &lt;em&gt;is&lt;/em&gt; a retention curve. Nobody had to build telemetry; Valve already published it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three things that will bite you
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The numbers move.&lt;/strong&gt; These are live shares over a changing denominator. Re-reading the same endpoint ~2.5 weeks later, the rarest achievement had already gone 6.0% → 7.1%. If you display these, store and display the &lt;strong&gt;date you read them&lt;/strong&gt;, or you'll publish a number that quietly goes stale.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;name&lt;/code&gt; is the apiname, not the label.&lt;/strong&gt; &lt;code&gt;Ending2&lt;/code&gt; is not what the store page calls it. You have to maintain a mapping, and the mapping is &lt;em&gt;your&lt;/em&gt; inference — label it as such.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rounding is a choice.&lt;/strong&gt; The endpoint returns floats; how you round is a presentation decision, not data. Say so.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Why it made the site better
&lt;/h2&gt;

&lt;p&gt;The interesting part isn't the API — it's what it lets a small site do honestly. Instead of "10 tips" filler, the guide can lead with a real, primary-source, independently verifiable dataset, and put its methodology and its data-drift caveats on a public &lt;code&gt;/sources&lt;/code&gt; page. It also made i18n matter: the same numbers ship on two locale routes (&lt;code&gt;/zh-CN&lt;/code&gt; and &lt;code&gt;/en&lt;/code&gt;) with identical values mirrored per locale, so the Chinese and English pages can never disagree.&lt;/p&gt;

&lt;p&gt;If you're building anything game-adjacent, this endpoint is worth an afternoon. It's public, it's structured, and it's a genuine story about where players actually stop playing.&lt;/p&gt;

&lt;p&gt;I wrote it up against the game &lt;em&gt;Big Walk&lt;/em&gt; on &lt;a href="https://thebigwalk.world/en/achievements" rel="noopener noreferrer"&gt;the Big Walk Guide's achievements page&lt;/a&gt; — an independent fan project (no affiliation with House House, Panic or Valve), with the collection date and the funnel arithmetic published alongside the figures.&lt;/p&gt;

</description>
      <category>analytics</category>
      <category>api</category>
      <category>gamedev</category>
    </item>
    <item>
      <title>Counting a phrase across the King James Bible — and why "fear not" is not 365 times</title>
      <dc:creator>MakeInterview</dc:creator>
      <pubDate>Thu, 01 Oct 2026 10:59:03 +0000</pubDate>
      <link>https://dev.to/makeinterview/counting-a-phrase-across-the-king-james-bible-and-why-fear-not-is-not-365-times-3po4</link>
      <guid>https://dev.to/makeinterview/counting-a-phrase-across-the-king-james-bible-and-why-fear-not-is-not-365-times-3po4</guid>
      <description>&lt;p&gt;You have probably seen the claim. It circulates in sermons, devotionals, and&lt;br&gt;
wall art: &lt;strong&gt;"The Bible says 'fear not' 365 times — one for every day of the year."&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I wanted to know if it was true. That turned into a small data-engineering&lt;br&gt;
problem, and the answer is a useful example of how a plausible number survives&lt;br&gt;
because nobody checks it.&lt;/p&gt;

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

&lt;p&gt;Counted against the King James Version with a stated, reproducible rule:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Rule&lt;/th&gt;
&lt;th&gt;Verses&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Exact phrase &lt;code&gt;fear not&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;62&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Exact phrase + common inflections (&lt;code&gt;fear not&lt;/code&gt;, &lt;code&gt;feared not&lt;/code&gt;, &lt;code&gt;fearing not&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;70&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;fear&lt;/code&gt; in any form&lt;/td&gt;
&lt;td&gt;400 occurrences in 385 verses&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Not 365. Not close. The popular figure has no documented source — it does not&lt;br&gt;
appear in a concordance, and the "365" was likely chosen because a year has 365&lt;br&gt;
days, not because anyone counted.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this is a counting problem, not a trivia problem
&lt;/h2&gt;

&lt;p&gt;Three things make naive counting wrong, and they are the same three things that&lt;br&gt;
make any text-analysis pipeline wrong:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Define the unit.&lt;/strong&gt; A &lt;em&gt;verse&lt;/em&gt; is the KJV's own versification. An&lt;br&gt;
&lt;em&gt;occurrence&lt;/em&gt; is a substring match. "400 occurrences in 385 verses" and "62&lt;br&gt;
verses" are answering different questions, and both are correct. Most disputes&lt;br&gt;
about counts are really disputes about the unit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Inflection.&lt;/strong&gt; English "fear not" is a fixed phrase, but the underlying&lt;br&gt;
verb inflects: &lt;em&gt;feared not&lt;/em&gt;, &lt;em&gt;fearing not&lt;/em&gt;, &lt;em&gt;fear thou not&lt;/em&gt;. A regex on the&lt;br&gt;
exact string undercounts. And there is no clean place to stop — every added&lt;br&gt;
variant is a judgment call you have to write down.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Translation.&lt;/strong&gt; The KJV and the Chinese Union Version (和合本) do not agree,&lt;br&gt;
because they are not literal mappings of one another. 和合本 uses four separate&lt;br&gt;
&lt;code&gt;不要&lt;/code&gt; constructions. Counting one and reporting it as "the Bible" is a category&lt;br&gt;
error.&lt;/p&gt;

&lt;h2&gt;
  
  
  The rule I used
&lt;/h2&gt;

&lt;p&gt;Be explicit, and let a reader reproduce it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Corpus: KJV (public domain), verse-indexed.&lt;/li&gt;
&lt;li&gt;Normalize: uppercase, collapse whitespace, strip punctuation &lt;strong&gt;except&lt;/strong&gt;
apostrophes (so &lt;code&gt;fear not&lt;/code&gt; and &lt;code&gt;fear not.&lt;/code&gt; match, but &lt;code&gt;fearn't&lt;/code&gt; is not
invented by over-eager stripping).&lt;/li&gt;
&lt;li&gt;Match on word boundaries, not substrings — otherwise &lt;code&gt;fear&lt;/code&gt; matches
&lt;code&gt;fearful&lt;/code&gt;, &lt;code&gt;God-fearing&lt;/code&gt;, and &lt;code&gt;fearfulness&lt;/code&gt;, which inflates the count by
roughly 15%.&lt;/li&gt;
&lt;li&gt;Report verses for phrase claims, occurrences for word claims.&lt;/li&gt;
&lt;li&gt;Publish the matched verse list, not just the total. A count you cannot audit
is not a result.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The full rule and the matched verses are in the dataset (below), one row per&lt;br&gt;
matched verse, so you can diff my work rather than trust it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The dataset
&lt;/h2&gt;

&lt;p&gt;CC-BY-4.0 — reuse it, including commercially, with attribution:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CSV: &lt;a href="https://trustbible.org/data/fear-not-counts.csv" rel="noopener noreferrer"&gt;https://trustbible.org/data/fear-not-counts.csv&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;JSON: &lt;a href="https://trustbible.org/data/fear-not-counts.json" rel="noopener noreferrer"&gt;https://trustbible.org/data/fear-not-counts.json&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Written-up methodology: &lt;a href="https://trustbible.org/blog/how-many-times-does-the-bible-say-fear-not/" rel="noopener noreferrer"&gt;https://trustbible.org/blog/how-many-times-does-the-bible-say-fear-not/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Columns are &lt;code&gt;reference, book, chapter, verse, text, matched_phrase, rule&lt;/code&gt; — the&lt;br&gt;
&lt;code&gt;rule&lt;/code&gt; column is what makes it auditable, because it tells you &lt;em&gt;why&lt;/em&gt; each row is&lt;br&gt;
in the file.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I took away
&lt;/h2&gt;

&lt;p&gt;If you publish a number, publish the rule that produced it. A count with a&lt;br&gt;
stated rule can be checked, corrected, and cited. A count without one is a&lt;br&gt;
rumor with a decimal point.&lt;/p&gt;

&lt;p&gt;If you find an error in mine, I would genuinely like to know — that is the&lt;br&gt;
point of putting the method on the page next to the result.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I built the counting pipeline behind this while working on&lt;br&gt;
&lt;a href="https://trustbible.org/" rel="noopener noreferrer"&gt;TrustBible&lt;/a&gt;, a Bible Q&amp;amp;A tool that quotes the exact&lt;br&gt;
verses it cites. The counts above are independent of the app; the dataset is&lt;br&gt;
the deliverable.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>data</category>
      <category>dataengineering</category>
    </item>
    <item>
      <title>What I learned building an AI voice mock-interview tool</title>
      <dc:creator>MakeInterview</dc:creator>
      <pubDate>Thu, 01 Oct 2026 03:30:11 +0000</pubDate>
      <link>https://dev.to/makeinterview/what-i-learned-building-an-ai-voice-mock-interview-tool-2p25</link>
      <guid>https://dev.to/makeinterview/what-i-learned-building-an-ai-voice-mock-interview-tool-2p25</guid>
      <description>&lt;p&gt;Job seekers in China practice interviews the same way most people do everywhere: by reading question lists, or by rehearsing silently in front of a mirror. Neither gives the one thing that transfers to the real room — being asked out loud, and having to answer in the moment.&lt;/p&gt;

&lt;p&gt;I've been building &lt;a href="https://makeinterview.com" rel="noopener noreferrer"&gt;MakeInterview&lt;/a&gt;, a voice mock-interview tool for Chinese-speaking candidates. Five engineering and product decisions turned out to matter more than the prompt engineering.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. The interviewer has to follow up
&lt;/h2&gt;

&lt;p&gt;A real interviewer does not wait for a perfectly composed 90-second answer. They dig in. The biggest realism gap in the early version was that the model waited, patiently, for a full turn and then moved on.&lt;/p&gt;

&lt;p&gt;Modeling the interview as a turn loop, where the interviewer is allowed to follow up once or twice before moving to the next question, changed the transcript from "candidate monologues" into something that resembles an actual conversation.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Ground the questions in your resume and the JD
&lt;/h2&gt;

&lt;p&gt;Generic questions test generic memory. The product only becomes useful when the question is about the project you actually listed. We parse the candidate's resume and the target job description, then require every generated question to anchor to a specific entity from them. If the parser cannot find something to anchor to, the interviewer asks a clarification instead of inventing a plausible-sounding project.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Show the transcript, not a vague score
&lt;/h2&gt;

&lt;p&gt;Early feedback was a number out of 100. Nobody improves from a number. What moved the needle was showing the verbatim transcript — the exact words the candidate said — next to a model answer. Candidates are often surprised by their own filler words and hedging. The transcript makes that visible without an argument.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. What the research actually says about interviews
&lt;/h2&gt;

&lt;p&gt;The value of structured interviews is not folklore. Schmidt and Hunter's meta-analysis (1998), and its 2022 update by Sackett et al., place structured interviews among the highest-validity selection methods — well ahead of unstructured ones. That is the design constraint: keep the interviewer structured, not chatty.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Multiple personas, not one
&lt;/h2&gt;

&lt;p&gt;A single friendly-interviewer persona produces one kind of practice. We run five — an HR screener, a direct manager, a technical expert, a department head, and an executive. Same candidate, different pressure, which is closer to how a real interview loop feels.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I would tell another builder
&lt;/h2&gt;

&lt;p&gt;If you are building a voice agent for a high-stakes conversation, the interruption and follow-up loop is the part I would spend the most time on. A patient model is easier to build and much less useful. The second most valuable thing was refusing to summarize the candidate's answer for them: the transcript, warts and all, is the feedback.&lt;/p&gt;

&lt;p&gt;MakeInterview is at &lt;a href="https://makeinterview.com" rel="noopener noreferrer"&gt;makeinterview.com&lt;/a&gt; if you want to try it. It is Chinese-first — the questions and the feedback are in Chinese.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>buildinpublic</category>
      <category>career</category>
      <category>startup</category>
    </item>
  </channel>
</rss>
