<?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: Illeana Vowies</title>
    <description>The latest articles on DEV Community by Illeana Vowies (@illeanavoviews).</description>
    <link>https://dev.to/illeanavoviews</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%2F4031867%2F6728e55a-e3ab-4046-b87f-5191294facfa.png</url>
      <title>DEV Community: Illeana Vowies</title>
      <link>https://dev.to/illeanavoviews</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/illeanavoviews"/>
    <language>en</language>
    <item>
      <title>InstaHeadshots review: $59, 10 selfies and a $3 alternative</title>
      <dc:creator>Illeana Vowies</dc:creator>
      <pubDate>Thu, 15 Oct 2026 04:10:50 +0000</pubDate>
      <link>https://dev.to/illeanavoviews/instaheadshots-review-59-10-selfies-and-a-3-alternative-4h50</link>
      <guid>https://dev.to/illeanavoviews/instaheadshots-review-59-10-selfies-and-a-3-alternative-4h50</guid>
      <description>&lt;p&gt;InstaHeadshots is now part of Magic Studio, and its current offer starts at $59 for 50 headshots and five looks, generated from 10 selfies. It does the job, but for most people &lt;a href="https://pfpmaker.ai" rel="noopener noreferrer"&gt;PFPMaker&lt;/a&gt; is the better buy: it starts at $3, works from a single photo and charges once.&lt;/p&gt;

&lt;p&gt;That is my InstaHeadshots review in two sentences. The rest of this post is about why the input requirement and the refund terms matter more than the headline price, and the one kind of buyer for whom InstaHeadshots still makes sense.&lt;/p&gt;

&lt;h2&gt;
  
  
  The old domain now points at Magic Studio
&lt;/h2&gt;

&lt;p&gt;Request the old domain today and you get a permanent redirect:&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="nv"&gt;$ &lt;/span&gt;curl &lt;span class="nt"&gt;-sI&lt;/span&gt; https://instaheadshots.com | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-iE&lt;/span&gt; &lt;span class="s2"&gt;"^HTTP|^location"&lt;/span&gt;
HTTP/2 308
location: https://magicstudio.com/headshots/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The landing page is titled "InstaHeadshots (now Magic Studio) - #1 AI Headshot Generator", with a banner explaining the rebrand. Plenty of older reviews and Reddit threads still use the old name and quote tiers that do not match the live page, so I'd trust the &lt;a href="https://magicstudio.com/headshots/" rel="noopener noreferrer"&gt;current Magic Studio headshot page&lt;/a&gt; over any screenshot from before the move.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the live offer includes
&lt;/h2&gt;

&lt;p&gt;The page leads with $59 for 50 headshots and five looks, on a pay-after-review model. You see the results first and pay only if you keep them. That is a good policy and I'll give it credit below.&lt;/p&gt;

&lt;p&gt;Here is how the specs line up against PFPMaker:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Spec&lt;/th&gt;
&lt;th&gt;PFPMaker&lt;/th&gt;
&lt;th&gt;InstaHeadshots (Magic Studio)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Entry price&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$3 one-time for 10 photos&lt;/td&gt;
&lt;td&gt;$59 for 50 headshots&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Source photos&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1 photo works, 2 to 10 add variety&lt;/td&gt;
&lt;td&gt;10 selfies with varied backgrounds, angles and lighting&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;File types&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;JPG, JPEG, PNG, HEIC&lt;/td&gt;
&lt;td&gt;Not listed on the page&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Styles&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;50+ on every plan&lt;/td&gt;
&lt;td&gt;5 looks in the headline offer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Output types&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Headshots, full-body and creative shots&lt;/td&gt;
&lt;td&gt;Headshots&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Stated turnaround&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;About 60, 30 or 10 minutes by plan&lt;/td&gt;
&lt;td&gt;About 15 minutes, FAQ says 2 to 60&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Default size&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Not listed&lt;/td&gt;
&lt;td&gt;1024 x 1024, paid upscaling for print&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Fixing a bad result&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Regenerate the batch&lt;/td&gt;
&lt;td&gt;Editing and recreating cost extra&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Commercial rights&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Full, every plan, no attribution&lt;/td&gt;
&lt;td&gt;Full&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Refund&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;100% if no usable photo, 7 days&lt;/td&gt;
&lt;td&gt;Fewer than 4 decent shots, none downloaded, 3 days&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The default size line surprised me. A 1024 x 1024 square is fine for an avatar, but anyone planning a printed conference banner or a large hero image on a personal site should budget for the paid upscale.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ten selfies is the real cost
&lt;/h2&gt;

&lt;p&gt;Money is the obvious gap. The input requirement is the one that actually slows you down.&lt;/p&gt;

&lt;p&gt;InstaHeadshots wants 10 selfies with different backgrounds, face angles and lighting. Most people do not have ten recent, well-lit photos of themselves sitting in one folder. They have two decent ones and a camera roll full of group shots, so the first half hour goes on finding, cropping and reshooting before anything is generated.&lt;/p&gt;

&lt;p&gt;PFPMaker starts from one photo. Two to ten add variety, but a single JPG, PNG or HEIC is enough to get a batch back. For a developer who already has a usable profile picture on GitHub, that removes the whole setup step.&lt;/p&gt;

&lt;p&gt;There is a fair counterpoint: ten varied images give a model more information about a face than one image does, and I suspect that is exactly why InstaHeadshots asks for them. PFPMaker answers with breadth instead: 50+ styles on every plan, multiple backgrounds and full-body and creative shots alongside headshots. And at $3 a batch, a rerun with a second photo costs less than the coffee you drink while waiting.&lt;/p&gt;

&lt;p&gt;Cost per photo makes the gap concrete:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PFPMaker Pro       $7 / 60 photos  = $0.12 per photo
PFPMaker Starter   $3 / 10 photos  = $0.30 per photo
InstaHeadshots    $59 / 50 photos  = $1.18 per photo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The 15-minute promise and the 60-minute FAQ
&lt;/h2&gt;

&lt;p&gt;The homepage says headshots are ready in about 15 minutes. The FAQ on the same page says training takes 2 to 60 minutes depending on the package, and that the Starter pack can take about 60. I'd plan for the hour.&lt;/p&gt;

&lt;p&gt;PFPMaker ties its times to the plan instead: about 60 minutes for Starter, 30 for Signature and 10 for Pro. Those are still estimates, but you know which one you are buying.&lt;/p&gt;

&lt;h2&gt;
  
  
  Refund terms favour the buyer who never downloads
&lt;/h2&gt;

&lt;p&gt;Pay-after-review lowers the upfront risk, and that is the strongest thing InstaHeadshots has going for it. The refund policy is narrower than it first looks, though. You qualify only if you have fewer than four decent headshots, have not downloaded any of them and email within 3 days.&lt;/p&gt;

&lt;p&gt;That "none downloaded" condition bothers me. Downloading a headshot and dropping it into your LinkedIn profile is how most people judge whether it actually looks like them at thumbnail size. Once you have done that, the refund is gone.&lt;/p&gt;

&lt;p&gt;PFPMaker's guarantee is simpler. If you do not get at least one usable photo, you email support within 7 days of receiving the batch and get your money back.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimages.unsplash.com%2Fphoto-1471341971476-ae15ff5dd4ea%3Fauto%3Dformat%26fit%3Dcrop%26w%3D1200%26h%3D675%26q%3D80" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimages.unsplash.com%2Fphoto-1471341971476-ae15ff5dd4ea%3Fauto%3Dformat%26fit%3Dcrop%26w%3D1200%26h%3D675%26q%3D80" alt="Empty photo studio with softbox lights and a white backdrop" width="1200" height="675"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On privacy the two are close. PFPMaker deletes uploads after training, deletes the remaining data within 30 days and does not use photos to train public models. InstaHeadshots deletes images automatically 30 days after creation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pricing tiers depend on who you ask
&lt;/h2&gt;

&lt;p&gt;The live page leads with $59. Its FAQ mentions Starter, Basic and Premium packs without listing prices. PFPMaker's &lt;a href="https://pfpmaker.ai/compare/pfpmaker-vs-instaheadshots" rel="noopener noreferrer"&gt;InstaHeadshots comparison&lt;/a&gt; lists three tiers at $49, $59 and $69 with roughly 40, 100 and 200 photos, and a testimonial on the Magic Studio page mentions paying $49. There is no single public tier list that matches across all of these, which is one more reason to check the checkout page instead of a review.&lt;/p&gt;

&lt;p&gt;Even at the top of that range, $69 for around 200 photos works out to about 35 cents a photo, nearly three times PFPMaker Pro's 12 cents.&lt;/p&gt;

&lt;h2&gt;
  
  
  Verdict
&lt;/h2&gt;

&lt;p&gt;PFPMaker is the better choice for most buyers. It costs less on every tier, needs one photo instead of ten, offers 50+ styles plus full-body and creative shots, includes commercial rights on every plan and has a longer, simpler refund window.&lt;/p&gt;

&lt;p&gt;InstaHeadshots fits a narrow buyer: someone who already has ten good selfies, wants headshots only and values seeing results before paying. The pay-after-review model is real, and it is the best part of the product.&lt;/p&gt;

&lt;p&gt;If you have one decent photo of yourself on your laptop right now, the $3 Starter batch is the cheapest way to find out whether you need anything bigger.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>ReviewInc reviews: cost, features and honest verdict</title>
      <dc:creator>Illeana Vowies</dc:creator>
      <pubDate>Thu, 15 Oct 2026 03:56:35 +0000</pubDate>
      <link>https://dev.to/illeanavoviews/reviewinc-reviews-cost-features-and-honest-verdict-2ce9</link>
      <guid>https://dev.to/illeanavoviews/reviewinc-reviews-cost-features-and-honest-verdict-2ce9</guid>
      <description>&lt;p&gt;ReviewInc is a capable, serious piece of reputation software, and for most single-location businesses I think it is more than they need at a price they cannot see. It is built for practices and multi-location groups that already run a CRM or a patient system. If that is you, it deserves a demo. If you run one shop with two staff, the quote process alone should give you pause.&lt;/p&gt;

&lt;p&gt;There is very little public forum chatter about it, which fits a product sold through demos and sales calls rather than a self-serve checkout. So most ReviewInc reviews you will find are on software directories and on the company's own testimonials page, and both need reading with some care.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it actually does
&lt;/h2&gt;

&lt;p&gt;ReviewInc calls itself reputation and review management software that monitors more than 600 review sites, naming Google, Facebook, Healthgrades, Angi and Cars.com among them. It also sells business listings, local SEO and what it calls AI search visibility. That puts it closer to a reputation operations platform than a review request tool.&lt;/p&gt;

&lt;p&gt;The product is split into Monitor, Collect, Amplify and Communicate, plus a listings module. Monitor tracks reviews and sends alerts. Collect sends review requests by text and email, with QR codes, NFC tags and pre-built or custom templates. Amplify schedules social posts of your best reviews and adds testimonial widgets to your site. Communicate handles two-way text and email, contactless office check-in and intake forms. The listings piece keeps your business details in sync across Google, Apple and Bing.&lt;/p&gt;

&lt;p&gt;One detail in Collect made me stop. ReviewInc says its AI "helps customers write impactful reviews with relevant keywords". I can see why a busy patient staring at an empty box might welcome a prompt. I'm less sure a business wants its reviews to start sounding alike, because keyword-rich reviews are exactly what wary readers have learned to distrust.&lt;/p&gt;

&lt;h2&gt;
  
  
  The price is a sales conversation
&lt;/h2&gt;

&lt;p&gt;There is no public dollar figure anywhere. The pricing page lists four plans, says pricing is "based on your needs" and sends Monitor, Basic and Pro buyers to a quote form and Enterprise buyers to sales.&lt;/p&gt;

&lt;p&gt;The most telling line on that page is a footnote. "*Additional fees may apply" is attached to exactly two rows, custom text campaigns and the number of business locations. Those are the two things a growing local business is most likely to add, so I read that footnote as the place where a quote grows after the first call.&lt;/p&gt;

&lt;p&gt;The plan limits say a lot too. Basic allows one location and two users. Monitor and Pro both allow unlimited locations and up to 1,000 users, and Enterprise removes the user cap. A two-user ceiling is fine for an owner and a manager. It gets tight the moment a front desk team wants its own logins. Setup fees and contract length are not stated anywhere I could find.&lt;/p&gt;

&lt;p&gt;G2 puts ReviewInc at the top of its five-dollar-sign perceived cost scale and estimates implementation at around two months. That is one directory's aggregate from user reviews, so I treat it as a rough signal, but it matches the shape of the product.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who it is really sold to
&lt;/h2&gt;

&lt;p&gt;The integration list answers this better than the marketing does. It names ModMed and MEDENT (medical practice systems), Litify (legal), FieldRoutes (pest control), JobNimbus (roofing), Housecall Pro, ServiceTitan, Salesforce, HubSpot, Lightspeed, Hootsuite and Zapier, plus custom API access. The pricing page adds "HIPAA compliant and certified", SOC 2 and ISO 27001, an assigned toll-free 800 SMS number and one-on-one onboarding with a US-based support team.&lt;/p&gt;

&lt;p&gt;Put that together and the buyer is a dental or medical group, a law firm or a home services company with a dispatch system, where review requests should fire automatically when a job closes. That is a real need and ReviewInc seems well equipped for it.&lt;/p&gt;

&lt;p&gt;The Zapier connector also exposes separate triggers for a "New Public Review" and a "New Private Review", so the platform keeps private feedback apart from public reviews. Useful operationally. How a business uses that split still has to respect Google's rules, which I come back to below.&lt;/p&gt;

&lt;h2&gt;
  
  
  How far to trust the five-star wall
&lt;/h2&gt;

&lt;p&gt;ReviewInc's own testimonials page shows 668 reviews pulled from Google, Facebook and Capterra, nearly all five stars. The small print is more interesting than the stars. It says reviews may be removed if they come from "non-current customers", among other reasons, and that reviewers may have received an incentive that was the same regardless of rating.&lt;/p&gt;

&lt;p&gt;None of that suggests anything improper. A flat incentive regardless of rating is the arrangement the FTC's consumer reviews rule allows. But a page curated by the vendor, partly incentivised and filtered to current customers, is a showcase, and I would read it as examples of what happy customers like rather than as a satisfaction score.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.capterra.co.uk/software/141023/reviewinc" rel="noopener noreferrer"&gt;Capterra's ReviewInc listing&lt;/a&gt; shows 4.8 out of 5 from 35 reviews, which is a small base. The praise is consistent: easy to use, prompt support, one dashboard for several stores. The complaints are more useful. One reviewer wanted "an idea of the price range", another wished for "a more affordable option" and one said review-site integrations "are not in sync" and could handle more languages. A few reviewers are tagged with industries like accounting software and arts and crafts, which are not among ReviewInc's listed verticals. That may just be how Capterra categorises reviewers, but it is a reason to read individual comments over the headline score.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimages.unsplash.com%2Fphoto-1519494026892-80bbd2d6fd0d%3Fauto%3Dformat%26fit%3Dcrop%26w%3D1200%26h%3D675%26q%3D80" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimages.unsplash.com%2Fphoto-1519494026892-80bbd2d6fd0d%3Fauto%3Dformat%26fit%3Dcrop%26w%3D1200%26h%3D675%26q%3D80" alt="Medical practice reception lobby" width="1200" height="675"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Reading these well comes down to a few habits. Credible reviews name a feature the person actually used, like text campaigns or a specific integration. They usually mention at least one irritation. They say where they came from, and a vendor-hosted testimonial is different evidence from an independent directory. And they sound like a person, not like the product page.&lt;/p&gt;

&lt;p&gt;The rules sit behind all of this. The &lt;a href="https://www.ftc.gov/business-guidance/resources/consumer-reviews-testimonials-rule-questions-answers" rel="noopener noreferrer"&gt;FTC's consumer reviews Q&amp;amp;A&lt;/a&gt; explains that the rule, in force since October 21, 2024, allows incentives when no particular sentiment is required and makes businesses liable for fake reviews they create or buy. Google is stricter. Its &lt;a href="https://support.google.com/contributionpolicy/answer/7400114" rel="noopener noreferrer"&gt;Maps user contributed content policy&lt;/a&gt; bars incentives for any review and bars businesses from selectively soliciting positive ones. If you buy ReviewInc, or anything like it, set up your request flow with that second document open.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where I land
&lt;/h2&gt;

&lt;p&gt;For a practice group or a multi-location operator that will use listings, messaging, integrations and monitoring together, ReviewInc looks like a legitimate, well-built option, and the sales-led process is the price of that breadth.&lt;/p&gt;

&lt;p&gt;For a single location that mainly wants more customers to leave a review, I would keep looking. Someone has to configure templates, listings and reports, and the bill is unknown until a sales call. The alternative at the other end of the scale is a simple review page with a QR code and link. &lt;a href="https://ratingflow.co" rel="noopener noreferrer"&gt;RatingFlow&lt;/a&gt; does that one job, and its &lt;a href="https://ratingflow.co/pricing" rel="noopener noreferrer"&gt;one-time review page pricing&lt;/a&gt; currently lists $97 for one business, $47 for each extra location, no monthly fee and a 14-day trial without a card. Prices adjust by region, but you can do the sum before you sign anything.&lt;/p&gt;

&lt;p&gt;If you do book the ReviewInc demo, ask for the quote with separate lines for each location, custom text campaigns, onboarding, integrations and the minimum contract term. The footnote on the pricing page suggests that is where the number will move.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Maternity photoshoot generator: quality and speed compared</title>
      <dc:creator>Illeana Vowies</dc:creator>
      <pubDate>Tue, 13 Oct 2026 04:21:49 +0000</pubDate>
      <link>https://dev.to/illeanavoviews/maternity-photoshoot-generator-quality-and-speed-compared-4nab</link>
      <guid>https://dev.to/illeanavoviews/maternity-photoshoot-generator-quality-and-speed-compared-4nab</guid>
      <description>&lt;p&gt;For a maternity photoshoot generator, &lt;a href="https://pfpmaker.ai" rel="noopener noreferrer"&gt;PFPMaker&lt;/a&gt; is my pick. It is built for maternity portraits specifically, asks for 3-5 clear face photos, delivers dozens of images in under 10 minutes and estimates that 60-80% of each batch is usable. General photo AI tools can make a nice portrait of you, but none I looked at ship a maternity brief.&lt;/p&gt;

&lt;h2&gt;
  
  
  Six axes, one specialist
&lt;/h2&gt;

&lt;p&gt;I'm comparing on six practical axes: input spec, speed, output volume, privacy, cost model and how specifically the tool handles maternity styling. Photo AI is the reference point for the generic category because it publishes enough numbers to compare against.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Axis&lt;/th&gt;
&lt;th&gt;PFPMaker&lt;/th&gt;
&lt;th&gt;Photo AI&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Input photos&lt;/td&gt;
&lt;td&gt;2-10, with 3-5 recommended&lt;/td&gt;
&lt;td&gt;5-15&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Formats&lt;/td&gt;
&lt;td&gt;JPG, JPEG, PNG, HEIC&lt;/td&gt;
&lt;td&gt;Not listed on the homepage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Speed&lt;/td&gt;
&lt;td&gt;Under 10 minutes for the full set, email on completion&lt;/td&gt;
&lt;td&gt;~5 min training, ~20 s per photo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Output&lt;/td&gt;
&lt;td&gt;Dozens of photos per run&lt;/td&gt;
&lt;td&gt;Per-photo generation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Maternity styling&lt;/td&gt;
&lt;td&gt;Dedicated style: soft warm light, elegant styling, tender framing&lt;/td&gt;
&lt;td&gt;No maternity or pregnancy pack mentioned&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cost model&lt;/td&gt;
&lt;td&gt;One-time purchase, no subscription&lt;/td&gt;
&lt;td&gt;No prices on the homepage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rights&lt;/td&gt;
&lt;td&gt;Full commercial rights, no attribution&lt;/td&gt;
&lt;td&gt;Not stated on the homepage&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;PFPMaker leads on every row. The one that matters most is styling. &lt;a href="https://photoai.com/" rel="noopener noreferrer"&gt;Photo AI&lt;/a&gt; does not mention a maternity pack at all, and its closest feature is an AI Baby Generator that predicts what a future child might look like, which is a different product for a different moment.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 3-5 photo recommendation comes from the method
&lt;/h2&gt;

&lt;p&gt;PFPMaker accepts 2-10 face photos and recommends 3-5, in JPG, JPEG, PNG or HEIC. The rules are strict about faces: no filters, sunglasses, hats or group shots, and nothing blurry, dark or backlit.&lt;/p&gt;

&lt;p&gt;I assumed the 3-5 figure was marketing copy. It turns out to line up exactly with the &lt;a href="https://dreambooth.github.io/" rel="noopener noreferrer"&gt;DreamBooth paper&lt;/a&gt; from Google Research, which fine-tunes a text-to-image diffusion model on a handful of photos of one subject and reports that "typically 3-5 images suffice" to bind an identifier to that person. I can't say PFPMaker runs DreamBooth code, and there is no public statement either way. But the input contract looks set by the fine-tuning technique, and that makes me trust it more than an arbitrary "upload 20 selfies" instruction.&lt;/p&gt;

&lt;p&gt;It also exposes something people miss. A selfie-trained generator only learns your face. Every upload rule is about facial identity, so the bump, the dress, the light and the setting all come from the maternity style. That is the reason a specialist style matters so much here, and also the reason to check hands and body shape carefully in the results.&lt;/p&gt;

&lt;p&gt;Edits work by regenerating. You can't retouch a single image inside the tool, so the workflow is pick-from-the-batch rather than fix-one-frame.&lt;/p&gt;

&lt;h2&gt;
  
  
  A pre-upload check
&lt;/h2&gt;

&lt;p&gt;Most failed runs start with bad inputs, and the published rules are easy to check before you upload anything:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pathlib&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;

&lt;span class="n"&gt;ALLOWED&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;.jpg&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;.jpeg&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;.png&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;.heic&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;files&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;uploads&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;iterdir&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;files&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;SystemExit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Need 2-10 photos, found &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;files&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;bad&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;files&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;suffix&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;ALLOWED&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;bad&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;SystemExit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Unsupported formats: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;bad&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;files&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Allowed, but 3-5 photos is the recommended range&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A script can't tell you whether a face is backlit or half hidden by sunglasses. Do that part by eye. I'd take three sharp, evenly lit photos with the same hairstyle over ten mixed ones, since the model has to work out which features are you.&lt;/p&gt;

&lt;h2&gt;
  
  
  Speed only means something with a unit
&lt;/h2&gt;

&lt;p&gt;Photo AI's own homepage shows why speed claims need care. The meta description promises first photos in "less than a minute," while the body copy says model training "takes about 5 minutes" and each photo takes about 20 seconds. Both can be true, but they measure different things, and neither is the time until you have a full set to choose from.&lt;/p&gt;

&lt;p&gt;The PFPMaker &lt;a href="https://pfpmaker.ai/maternity-photos" rel="noopener noreferrer"&gt;maternity photos&lt;/a&gt; page states the number that matters to a buyer: under 10 minutes until the whole batch is ready, with an email when it lands. Because the batch has dozens of images, that 10 minutes buys you a contact sheet instead of a single attempt.&lt;/p&gt;

&lt;p&gt;The 60-80% figure needs a sensible reading. It is PFPMaker's estimate of how many results most customers rate as great, which I'd use as a selection ratio. On a batch of dozens, even the low end leaves plenty of options for an album, and you should still expect a few frames with odd fingers or a fabric edge melting into the background. Check faces, hands and clothing edges before you print anything.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimages.unsplash.com%2Fphoto-1538678867871-8a43e7487746%3Fauto%3Dformat%26fit%3Dcrop%26w%3D1200%26h%3D675%26q%3D80" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimages.unsplash.com%2Fphoto-1538678867871-8a43e7487746%3Fauto%3Dformat%26fit%3Dcrop%26w%3D1200%26h%3D675%26q%3D80" alt="Pregnant woman in a striped dress in a sunlit field" width="1200" height="675"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Privacy and money
&lt;/h2&gt;

&lt;p&gt;Pregnancy portraits are personal, so the data terms deserve more attention than they usually get. PFPMaker says it never sells your data or uses your photos to train public models. Files are encrypted, uploaded photos are deleted immediately after your model is trained, remaining data is deleted within 30 days and you can ask for instant deletion. That is specific enough to hold a company to, which is more than a "we take privacy seriously" line.&lt;/p&gt;

&lt;p&gt;On cost, it is a one-time purchase with no subscription. The maternity page doesn't list the exact price, so check it at checkout. It does compare itself with studio maternity sessions at "$150-$1,200+ per session," and backs the purchase with a money-back guarantee if you don't get at least one usable photo. You email within 7 days of delivery, the request is reviewed within 24 hours and refunds take 3-5 business days. Commercial rights are included, which matters if a portrait ends up on a printed announcement or a small business page.&lt;/p&gt;

&lt;h2&gt;
  
  
  The studio window doesn't apply
&lt;/h2&gt;

&lt;p&gt;Maternity photographers commonly book sessions around 28-34 weeks, mainly because the bump is usually visible by then. A &lt;a href="https://kellytareskiphotography.com/best-weeks-for-maternity-photos-perfect-timing-guide/" rel="noopener noreferrer"&gt;photographer's timing guide&lt;/a&gt; is careful to call that a common range rather than a rule, and sends medical questions to your healthcare professional.&lt;/p&gt;

&lt;p&gt;A generator has no such window. Since it only needs face photos, you can make the set at 20 weeks, at 39 weeks or after the baby has arrived. I think this is the most underrated part of the format, and also its honest limit. What you get is a styled maternity portrait of you, so it won't replace photos of your actual pregnancy if those are what you want to keep.&lt;/p&gt;

&lt;h2&gt;
  
  
  Verdict
&lt;/h2&gt;

&lt;p&gt;PFPMaker wins on all six axes: a maternity-specific style, a smaller recommended upload set, a stated under-10-minute delivery for the full batch, dozens of outputs, written deletion terms and one-time pricing with commercial rights. Photo AI is a reasonable generic tool, but it gives you nothing built for this occasion.&lt;/p&gt;

&lt;p&gt;Run the script above on your folder, keep the three best face photos, then pick the maternity style and wait for the email.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How to get more Google reviews for electricians: 7 steps</title>
      <dc:creator>Illeana Vowies</dc:creator>
      <pubDate>Mon, 12 Oct 2026 04:18:45 +0000</pubDate>
      <link>https://dev.to/illeanavoviews/how-to-get-more-google-reviews-for-electricians-7-steps-1k8l</link>
      <guid>https://dev.to/illeanavoviews/how-to-get-more-google-reviews-for-electricians-7-steps-1k8l</guid>
      <description>&lt;p&gt;Meta title: How to get more Google reviews for electricians&lt;br&gt;&lt;br&gt;
Meta description: Seven steps electricians can use to get more Google reviews: when to ask, Google's own link and QR code, what to text and the automation trap after 9 PM.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Featured image prompt (Nano Banana)&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Hero image for an article on how to get more Google reviews for electricians. An electrician in a grey work shirt stands at a homeowner's front door after a job, handing over a printed invoice folder with a small QR code card clipped to the front. Behind them the hallway shows a newly fitted breaker panel with its cover open and neat handwritten labels. The card reads "Scan to review" in bold rounded sans-serif, #1F4E79. Late-afternoon daylight from the doorway, photorealistic, 35mm lens at eye level, 16:9 landscape, warm amber and navy tones, calm and trustworthy mood.&lt;/p&gt;

&lt;p&gt;Electricians get more Google reviews by asking every customer at the moment the job is visibly finished, handing over a direct review link or QR code and sending one follow-up while the work is still fresh. Most of the gain comes from making that ask routine, because the ask is the part that gets skipped.&lt;/p&gt;

&lt;p&gt;Customers rarely remember an electrician three weeks later and decide to write something. They review when the lights are back on, the new panel has been explained to them and the person who did the work asks without making it awkward. The trouble is that asking feels awkward, so it gets forgotten on the busy days, and the busy days are most days.&lt;/p&gt;

&lt;p&gt;At &lt;a href="https://ratingflow.co" rel="noopener noreferrer"&gt;RatingFlow&lt;/a&gt; we make review pages for local businesses: a branded page, a shareable link and a QR code, so the ask takes a few seconds. It costs $97 once for one business, $47 once for each extra location, and there is a 14-day trial with no card. The steps below work with or without it.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Finish the job in front of the customer
&lt;/h2&gt;

&lt;p&gt;The request starts before you pick up your phone. Walk the customer through what you changed, show them the breaker or the new switch and answer the question they were holding back while you worked. On a fault call, confirm the original problem is gone. On an install, tell them where the paperwork is and what happens next.&lt;/p&gt;

&lt;p&gt;If you run Jobber or a similar job system, mark the work complete only after this handover. Asking while you are still pulling cable through the attic feels early. Asking while the customer is reaching for the invoice feels normal.&lt;/p&gt;

&lt;p&gt;One line is enough:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;If everything's working the way you wanted, would you leave us an honest Google review? It helps people nearby know what to expect.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;We keep the word "honest" in there on purpose. It gives the customer room to praise the work, mention a niggle or say no.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Make the review link and QR code once, at a desk
&lt;/h2&gt;

&lt;p&gt;Open your Google Business Profile on a computer, select &lt;strong&gt;Read Reviews&lt;/strong&gt;, then &lt;strong&gt;Get more reviews&lt;/strong&gt;. Google gives you a link to copy and a QR code to save. The full steps are in Google's &lt;a href="https://support.google.com/business/answer/16816815" rel="noopener noreferrer"&gt;help page on review links and QR codes&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The detail that trips people up is on that same page: the QR code can only be generated from a computer browser, not from a phone. Plenty of electricians run the whole business from a phone in the van, so this step tends to get put off indefinitely. Do it once at a desk, save the image somewhere obvious and send it to whoever prints your cards.&lt;/p&gt;

&lt;p&gt;Then scan it yourself. It should open the right profile and land close to the review box.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Put the code where the handover happens
&lt;/h2&gt;

&lt;p&gt;A QR code on your website asks the customer to remember a chore. A card handed over with the invoice asks at the right moment. Good spots for an electrician are the completion folder, the printed invoice, a sticker next to the panel and a small card kept with the card reader.&lt;/p&gt;

&lt;p&gt;Keep the card plain: your name, the code and "Scan to leave an honest Google review".&lt;/p&gt;

&lt;p&gt;Ask everyone the same way. Google's &lt;a href="https://support.google.com/contributionpolicy/answer/7400114" rel="noopener noreferrer"&gt;Maps content policy&lt;/a&gt; bans businesses from discouraging negative reviews or selectively asking for positive ones, says merchants should not pressure people into leaving a rating and lists staff review quotas as an example of what it prohibits. Discounts or freebies in exchange for a review are also out. If the work was good, the card does the asking and no reward is needed.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Text while the job is still fresh
&lt;/h2&gt;

&lt;p&gt;Some customers will be busy at handover. Others will say yes, put the card on the counter and forget it exists. Send a short text after the invoice is paid or once they confirm the fault is fixed:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Thanks for having us out today. If the work is doing what you needed, you can leave an honest Google review here: [link]. Northside Electrical.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Swap in your own name. Leave out the list of services and any offer. They know who you are and they just need a link they can find again.&lt;/p&gt;

&lt;p&gt;One reminder at most. A second chaser turns a polite request into an obligation, and after a twenty-minute socket repair that feels out of proportion.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Check what your automation does after hours
&lt;/h2&gt;

&lt;p&gt;Automation fixes the forgetting, as long as the trigger makes sense. Jobber's Reviews feature sends a Google review request by text, email or both when a visit is completed, a job is closed or an invoice is paid, and for part-payments it waits until the balance hits $0.00. It sends no more than one request per client every six months and follows up at most twice, three and five days later. The settings are in &lt;a href="https://help.getjobber.com/hc/en-us/articles/20621046897559" rel="noopener noreferrer"&gt;Jobber's review request guide&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;We think one rule in there matters more for electricians than for most trades. If the trigger fires between 9 PM and 9 AM, the first request goes by email only, never by text. Emergency call-outs are where that bites. The customer whose power you restored at 11 PM is probably the most grateful person you will deal with all month, and the automation quietly drops their request into an inbox they may not open for days. We'd send those a personal text the next morning instead of trusting the default.&lt;/p&gt;

&lt;p&gt;The same goes for jobs that went sideways. A customer who needed a second visit should get a message written by a person, not the template.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Give unhappy customers a way to reach you
&lt;/h2&gt;

&lt;p&gt;Some jobs will leave someone annoyed: a missed arrival window, a charge they did not expect, a cover plate left crooked. Put a reply option or a direct number in your follow-up so they can tell you, and you get the chance to send someone back.&lt;/p&gt;

&lt;p&gt;That route sits beside the Google link. Everyone still gets the public option. A complaint that comes to you privately is useful in its own way, because it often points at the invoice wording or the arrival window rather than the wiring.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Reply each week and keep four numbers
&lt;/h2&gt;

&lt;p&gt;Open your profile once or twice a week and reply to new reviews, picking up something the customer actually wrote. If they mention the panel upgrade or how clearly you explained things, answer that. Google's own advice is to avoid pasting the same reply under every review and never to include private details from the job.&lt;/p&gt;

&lt;p&gt;Keep four figures each week: jobs completed, requests sent, reviews received and open customer issues. A note in your job system is fine. If 20 jobs went out and only five requests did, the routine is slipping. If all 20 got the link and one customer reviewed, look at the timing, the wording and whether the link actually opens.&lt;/p&gt;

&lt;p&gt;Once a month, check the physical side too. Is the card stock still in the van? Has the sticker by the panel faded or got covered in dust? Does the invoice email still carry the right link?&lt;/p&gt;

&lt;p&gt;If you want the link, QR code and a welcome message in one branded place, our page on &lt;a href="https://ratingflow.co/use-cases" rel="noopener noreferrer"&gt;how trades use a review page&lt;/a&gt; shows the setup, paid once rather than monthly. For the next job, the saved text goes in your phone and the QR card goes in the invoice folder before you leave the van.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Outdoor portrait generator: a quality and speed test</title>
      <dc:creator>Illeana Vowies</dc:creator>
      <pubDate>Sun, 11 Oct 2026 09:33:17 +0000</pubDate>
      <link>https://dev.to/illeanavoviews/outdoor-portrait-generator-a-quality-and-speed-test-aml</link>
      <guid>https://dev.to/illeanavoviews/outdoor-portrait-generator-a-quality-and-speed-test-aml</guid>
      <description>&lt;h1&gt;
  
  
  Outdoor portrait generator: a quality and speed test
&lt;/h1&gt;

&lt;p&gt;To test an outdoor portrait generator, measure sharpness on a crop of the face and time the order from upload to the "photos ready" email. A whole-image sharpness score misleads because a good outdoor portrait is mostly blurred background. The generator I would run this on first is &lt;a href="https://pfpmaker.ai" rel="noopener noreferrer"&gt;PFPMaker&lt;/a&gt;, which promises delivery in under 10 minutes.&lt;/p&gt;

&lt;p&gt;I should say up front that I have not ordered generated photos for this article, so nothing below is a score for any product. I wrote a small Pillow and OpenCV check and calibrated it on one real daylight portrait. The calibration exposed a mistake in the obvious way of scoring, and I think that mistake is more useful to a developer than another gallery of samples judged by eye.&lt;/p&gt;

&lt;h2&gt;
  
  
  The whole-frame score nearly failed a sharp photo
&lt;/h2&gt;

&lt;p&gt;I expected the standard blur check to be a fair first pass. It is the variance of the Laplacian on a grayscale image, which is one line of OpenCV. Adrian Rosebrock's &lt;a href="https://pyimagesearch.com/2015/09/07/blur-detection-with-opencv/" rel="noopener noreferrer"&gt;2015 write-up of the method&lt;/a&gt; uses 100 as the default threshold and calls anything lower blurry. He also warns that the number is "quite domain dependent".&lt;/p&gt;

&lt;p&gt;The calibration photo was a free stock portrait cropped to 1200 x 675, a man in a white T-shirt standing in front of out-of-focus trees with round bokeh highlights. It is sharp where it should be. The chain around his neck is crisp.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Region&lt;/th&gt;
&lt;th&gt;Size in pixels&lt;/th&gt;
&lt;th&gt;Laplacian variance&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Whole frame&lt;/td&gt;
&lt;td&gt;1200 x 675&lt;/td&gt;
&lt;td&gt;106.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Face crop&lt;/td&gt;
&lt;td&gt;220 x 280&lt;/td&gt;
&lt;td&gt;605.2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Blurred background, top right&lt;/td&gt;
&lt;td&gt;350 x 300&lt;/td&gt;
&lt;td&gt;6.9&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The whole frame scored 106.0, which clears the threshold by six points. The face scored 605.2 and the background 6.9, and the background is most of the picture. A batch script with a single cut-off at 100 came within six points of rejecting a photo whose face is six times over the line.&lt;/p&gt;

&lt;p&gt;I think this matters more for outdoor portraits than for studio headshots, because shallow depth of field against trees is the look people are paying for. The better a generator imitates a fast lens, the worse its files do on a whole-frame score. So the script takes a crop box and reports the face separately.&lt;/p&gt;

&lt;h2&gt;
  
  
  The script
&lt;/h2&gt;

&lt;p&gt;It prints the pixel size, the per-channel means, a red-to-blue ratio and the Laplacian variance, first for the whole frame and then for the face box you pass in. The channel means come from Pillow's &lt;a href="https://pillow.readthedocs.io/en/stable/reference/ImageStat.html" rel="noopener noreferrer"&gt;ImageStat module&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python3 &lt;span class="nt"&gt;-m&lt;/span&gt; pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--upgrade&lt;/span&gt; Pillow
python3 &lt;span class="nt"&gt;-m&lt;/span&gt; pip &lt;span class="nb"&gt;install &lt;/span&gt;opencv-python numpy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On a server or in Docker, the &lt;a href="https://pypi.org/project/opencv-python/" rel="noopener noreferrer"&gt;opencv-python package page&lt;/a&gt; says to install &lt;code&gt;opencv-python-headless&lt;/code&gt; instead, and to install only one of the two because they share the &lt;code&gt;cv2&lt;/code&gt; namespace.&lt;/p&gt;

&lt;p&gt;Save this as &lt;code&gt;portrait_check.py&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;cv2&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;numpy&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;PIL&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Image&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ImageStat&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;measure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pil_image&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;means&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ImageStat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Stat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pil_image&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;mean&lt;/span&gt;
    &lt;span class="n"&gt;red_blue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;means&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="n"&gt;means&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="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;means&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="k"&gt;else&lt;/span&gt; &lt;span class="nf"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;nan&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;gray&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cv2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cvtColor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;asarray&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pil_image&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;cv2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;COLOR_RGB2GRAY&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;sharpness&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cv2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Laplacian&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gray&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cv2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CV_64F&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;var&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;means&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;red_blue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sharpness&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;report&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pil_image&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;means&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;red_blue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sharpness&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;measure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pil_image&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; means: R &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;means&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="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;, G &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;means&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="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;, B &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;means&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="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; R/B ratio: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;red_blue&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; Laplacian variance: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;sharpness&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;SystemExit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Usage: python portrait_check.py IMAGE LEFT TOP RIGHT BOTTOM&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;image&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&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;convert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;RGB&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;box&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;tuple&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&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="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;size: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;size&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="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; x &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;size&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="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;report&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;whole frame&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;report&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;face crop&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;crop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;box&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run it as &lt;code&gt;python portrait_check.py photo.jpg 530 40 750 320&lt;/code&gt;, where the four numbers are the left, top, right and bottom of the face. Those are the coordinates I used on the calibration photo. Keep the box tight, because hair, sky and background inside it drag the score back toward the whole-frame number.&lt;/p&gt;

&lt;h2&gt;
  
  
  Warmth is a rougher check than I wanted
&lt;/h2&gt;

&lt;p&gt;The same run gave channel means of R 142.5, G 131.5 and B 108.5 for the whole frame, a red-to-blue ratio of 1.31. The face crop came out at R 78.1, G 65.0 and B 57.8, a ratio of 1.35.&lt;/p&gt;

&lt;p&gt;My first plan was to flag any sunlit portrait whose face reads cooler than its background as a relighting error. I dropped that once I looked at how far apart real daylight sources are. Nikon's Z 7 manual lists its direct sunlight preset at about 5200 K and its shade preset at about 8000 K, so a person standing in open shade in front of sunlit trees really is lit by bluer light than the leaves behind them. A cooler face is what a camera would record there. Skin is also redder than foliage to begin with, which is probably most of why the face came out slightly warmer than the frame in my photo.&lt;/p&gt;

&lt;p&gt;So the ratio is only good for comparing frames inside one batch. If most of the batch sits near one value and two frames land far from it, open those two at full size. I have not worked out where the cut-off should be.&lt;/p&gt;

&lt;p&gt;The check I cannot script is shadow direction. Adobe's golden hour guide says a low sun throws longer shadows and that shooting into the light leaves the subject's face in shadow. A generated portrait with a bright rim of light behind the hair and an evenly lit face is implying a second light source. Photographers get that look with a reflector or fill flash, so it proves nothing by itself, but it is where I look first.&lt;/p&gt;

&lt;p&gt;[In-body image goes here: outdoor-portrait-inbody.jpg, see source below]&lt;/p&gt;

&lt;h2&gt;
  
  
  Timing the order
&lt;/h2&gt;

&lt;p&gt;I have no delivery time to report. The speed half of the test is a procedure:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Fix the input set. PFPMaker's pages give two upload counts, 2-10 clear photos in the how-it-works step and 3-5 recent, well-lit photos in the FAQ on best results. Pick a number, write it down and reuse the same files on every run.&lt;/li&gt;
&lt;li&gt;Use JPG, JPEG, PNG or HEIC, the formats the page lists.&lt;/li&gt;
&lt;li&gt;Note the wall-clock time when you submit the upload.&lt;/li&gt;
&lt;li&gt;Note the timestamp on the email that says the photos are ready. The difference between the two is your number, and the claim to check it against is "under 10 minutes".&lt;/li&gt;
&lt;li&gt;Download the batch and run the script on every file.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Why PFPMaker gets the first run
&lt;/h2&gt;

&lt;p&gt;PFPMaker is my pick, and the reason is dull. The &lt;a href="https://pfpmaker.ai/outdoor-photos" rel="noopener noreferrer"&gt;outdoor portrait generator&lt;/a&gt; on its site puts claims in writing that a script and a stopwatch can check. The page says the portraits come with natural sunlight, green landscapes and open-air settings, that an order returns dozens of photos and that they are ready in under 10 minutes. Dozens of files per order is what makes a batch statistic like the red-to-blue ratio usable at all.&lt;/p&gt;

&lt;p&gt;The commercial terms are specific too. It is a one-time purchase with no subscription, and full commercial rights are included with every order. There is a money-back guarantee if you do not get at least one usable photo, provided you email within 7 days of receiving the batch.&lt;/p&gt;

&lt;p&gt;Three things on that page would go in my notes as constraints. There is no retouching of individual photos, so the fix for a bad frame is to regenerate. The page says customers find 60-80% of a batch great, which means planning to discard somewhere between a fifth and two fifths of the frames. And it gives no pixel dimensions, only "high resolution".&lt;/p&gt;

&lt;p&gt;No other generator goes on my list until this one has been through the script.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I would write down
&lt;/h2&gt;

&lt;p&gt;For each generated file:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the face box and its Laplacian variance&lt;/li&gt;
&lt;li&gt;the whole-frame and face red-to-blue ratios&lt;/li&gt;
&lt;li&gt;whether the light on the face agrees with the light behind it&lt;/li&gt;
&lt;li&gt;the pixel size from &lt;code&gt;im.size&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Per order, I would add the two timestamps and the number of input photos.&lt;/p&gt;

&lt;p&gt;The pixel size is the first thing I would look at, since it is the one figure the page leaves out and the script prints it on its first line.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>python</category>
      <category>software</category>
      <category>tools</category>
    </item>
    <item>
      <title>Is Weave worth it? Only if you need the phones too</title>
      <dc:creator>Illeana Vowies</dc:creator>
      <pubDate>Sat, 10 Oct 2026 04:25:31 +0000</pubDate>
      <link>https://dev.to/illeanavoviews/is-weave-worth-it-only-if-you-need-the-phones-too-39i0</link>
      <guid>https://dev.to/illeanavoviews/is-weave-worth-it-only-if-you-need-the-phones-too-39i0</guid>
      <description>&lt;p&gt;Is Weave worth it? For a dental, optometry or veterinary practice that will run its phones, patient texting, reminders and payments through it every day, yes. It is hard to justify if what you mostly want is more Google reviews. The published price starts at $199 a month, every plan above that floor is by quote and the contract terms aren't on the pricing page at all.&lt;/p&gt;

&lt;p&gt;I haven't run a practice on Weave, so this is a reading of what's public: the pricing page, the terms of service, the company's annual report and the ratings and reviews on software directories. I looked for Reddit threads and found very little. The people who use this software are office managers and front-desk staff, and they seem to do their complaining on Capterra.&lt;/p&gt;

&lt;p&gt;Weave's review requests are a small part of a big platform. If reviews are the whole job, you're shopping in a different category, something like &lt;a href="https://ratingflow.co" rel="noopener noreferrer"&gt;RatingFlow&lt;/a&gt;, which is a review funnel built on a QR code and a shareable link. It has no phones and no scheduling, so it only competes with one corner of Weave.&lt;/p&gt;

&lt;h2&gt;
  
  
  One number on the pricing page
&lt;/h2&gt;

&lt;p&gt;Weave costs at least $199 a month. Past that I can't tell you, and neither can the pricing page.&lt;/p&gt;

&lt;p&gt;The page names three plans, Pro, Elite and Ultimate, plus enterprise pricing. It carries exactly one dollar figure, "starting from $199 per month", and the button under every plan says "Get Pricing". In the comparison table the only differences spelled out in numbers are the monthly bulk-texting allowance, which is 1,500 messages on Pro, 3,000 on Elite and 15,000 on Ultimate, and "Up to 15 phones" on Ultimate.&lt;/p&gt;

&lt;p&gt;Plenty of blogs publish per-plan prices for Weave. I couldn't match any of them to something Weave itself has put in writing, so I'm leaving them out.&lt;/p&gt;

&lt;p&gt;There is also a setup charge that the page doesn't mention. I only know it exists because coverage of Weave's second-quarter 2026 results said onboarding revenue was down because of lower setup fees. How much it is, and whether it's negotiable, is a question for the salesperson, and I'd want the answer in writing.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the terms of service add
&lt;/h2&gt;

&lt;p&gt;I expected a standard monthly software agreement and mostly that is what the terms are, apart from two clauses.&lt;/p&gt;

&lt;p&gt;The first is about price. Weave can raise fees by "up to ten percent (10%) in any twelve month period without notice". On the $199 floor that is $218.90 a year later. A 10% cap is fairly normal for software, and I would still rather hear about an increase before it shows up on a card statement.&lt;/p&gt;

&lt;p&gt;The second is about leaving. With no fixed term you have to cancel "at least thirty (30) days prior" to the next billing period. If you're billed on the 1st and decide to go on the 20th, you pay for one more month. On a fixed-term order you owe the fees for the whole term. Anything of a year or longer renews automatically unless you give 30 days' notice before it ends, and prepaid fees aren't refunded. Leased phones stay Weave's property and have to be shipped back within ten business days at your cost.&lt;/p&gt;

&lt;p&gt;None of this is unusual for subscription software. One Capterra reviewer in January 2025 said their cancellation request at the end of a 12-month contract was ignored and the charges kept coming. That is a single account and I can't verify it. I'd still send any cancellation in writing and keep the date.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who it is built for
&lt;/h2&gt;

&lt;p&gt;In its &lt;a href="https://www.sec.gov/Archives/edgar/data/1609151/000160915126000016/weav-20251231.htm" rel="noopener noreferrer"&gt;FY2025 annual report&lt;/a&gt; Weave describes itself as a patient communications, engagement and payments platform for small and medium-sized healthcare practices. It lists four markets: dental, optometry, veterinary and specialty medical. It reported nearly 40,000 locations under subscription at the end of 2025 and $239.0 million in revenue for the year.&lt;/p&gt;

&lt;p&gt;The integration list makes the same point more bluntly. &lt;a href="https://www.softwareadvice.com/product/158992-Weave/" rel="noopener noreferrer"&gt;Software Advice&lt;/a&gt; counts 53 integrations, and the ones it names are Dentrix, Open Dental, Curve Dental, RevolutionEHR, DaySmart Vet, Covetrus Pulse and Carestream Dental. Every one of those is practice management software for a dentist, an optometrist or a vet. If your office runs on one of them, Weave sits on top of the system that already knows who your patients are and when they came in. That connection is what you're paying for. The reminder goes out on its own, the missed call gets a text back and the review request follows the appointment.&lt;/p&gt;

&lt;p&gt;Software Advice's overview does mention home services among Weave's customers. None of the integrations it names serves them, and I suspect a lot of the value goes missing without one.&lt;/p&gt;

&lt;h2&gt;
  
  
  The reviews part, on its own
&lt;/h2&gt;

&lt;p&gt;Staff can text a review link while the patient is still in the office, or Weave sends the invite automatically after the appointment, with the delay set by the practice. A manual invite cancels the pending automatic one, so nobody gets asked twice. I like that detail, which reads like something added by people who had watched a front desk annoy its own patients.&lt;/p&gt;

&lt;p&gt;The practice sets the order of review sites, with Google, Facebook and Healthgrades named. There is also a private feedback option, a form or an email that goes straight to the practice.&lt;/p&gt;

&lt;p&gt;It's a good review workflow. It is also one feature of a communications platform, and nothing on the pricing page suggests you can buy it on its own.&lt;/p&gt;

&lt;h2&gt;
  
  
  The support scores lower than the product
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.capterra.com/p/141842/Weave/reviews/" rel="noopener noreferrer"&gt;Capterra&lt;/a&gt; has Weave at 4.4 out of 5 from 700 reviews. G2 has it at 4.6 from 501. Those are good scores, and I'd discount them a little, since vendors routinely nudge happy customers toward these sites.&lt;/p&gt;

&lt;p&gt;The sub-ratings are more interesting. On Capterra, ease of use is 4.5 and customer service is 3.9. Software Advice's sentiment breakdown agrees, with patient communication 70% positive, customer service 48% negative and call management 39% negative. People like the product more than they like the support behind it.&lt;/p&gt;

&lt;p&gt;The praise is consistent: two-way texting, the automatic text after a missed call, reminders, everything in one place. The complaints are just as consistent. One reviewer in April 2025 described a 90-minute support call that fixed nothing. Another in December 2025 said issues were closed without being resolved. Softphone freezes and crashes come up in reviews from April 2025 and June 2026.&lt;/p&gt;

&lt;p&gt;For a phone system, that last complaint matters more than it would for most software. When a texting app is slow, you wait. When the phone freezes, a patient may not get through.&lt;/p&gt;

&lt;p&gt;Against that, Weave reported gross revenue retention of 89% for 2025. Roughly a tenth of subscription revenue leaves each year and the rest stays. I read that as most practices finding it worth the bill once it's installed. Replacing a phone system is painful, though, so staying isn't always the same as being happy.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimages.unsplash.com%2Fphoto-1629909614456-6b1c5c94cecc%3Fauto%3Dformat%26fit%3Dcrop%26w%3D1200%26h%3D675%26q%3D80" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimages.unsplash.com%2Fphoto-1629909614456-6b1c5c94cecc%3Fauto%3Dformat%26fit%3Dcrop%26w%3D1200%26h%3D675%26q%3D80" alt="Clinic waiting room with a reception desk and a wall phone" width="1200" height="675"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The comparison that's fair to make
&lt;/h2&gt;

&lt;p&gt;The two products only overlap on the review job. RatingFlow charges a &lt;a href="https://ratingflow.co/pricing" rel="noopener noreferrer"&gt;one-time price&lt;/a&gt; of $97 for one business and $47 for each extra location, with a 14-day free trial that doesn't ask for a card. Its site describes a funnel where ratings at or above a threshold you set go on to Google and lower ones go to a private feedback form.&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;Weave&lt;/th&gt;
&lt;th&gt;RatingFlow&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Published price&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;From $199 a month, plans by quote&lt;/td&gt;
&lt;td&gt;$97 once, $47 once per extra location&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;First year at the published floor&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$2,388 before setup fees or equipment&lt;/td&gt;
&lt;td&gt;$97&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Leaving&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;30 days' notice, fixed terms owed in full&lt;/td&gt;
&lt;td&gt;No recurring fee, 30-day money-back guarantee&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Review requests&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Text after the appointment, manual or automatic&lt;/td&gt;
&lt;td&gt;QR code and shareable link&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Phones, reminders, payments&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For a practice that uses the phones all day, $2,388 is the starting cost of a phone system and should be judged against other phone systems. For a business that only wanted more reviews, it is more than 24 times the price of the narrow tool in the first year alone.&lt;/p&gt;

&lt;h2&gt;
  
  
  My verdict
&lt;/h2&gt;

&lt;p&gt;If you run a dental, optometry, veterinary or specialty medical practice on one of the integrated systems, and you'd use the phones, the texting and the reminders daily, I think Weave is worth getting a quote for. Before signing I'd ask for five things in writing: the monthly price for your phone count, the setup fee, whether the phones are leased or bought, the term length and the renewal date.&lt;/p&gt;

&lt;p&gt;If reviews are the main reason you're looking, I'd pass.&lt;/p&gt;

&lt;p&gt;I don't have a clean answer for practices in between, the ones that want the texting but aren't sure about replacing their phones. Weave's annual report says it offers softphones that need no desk hardware. What a softphone-only setup costs is not on the pricing page.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>AI avatar generator: a small test for quality and speed</title>
      <dc:creator>Illeana Vowies</dc:creator>
      <pubDate>Fri, 09 Oct 2026 17:26:19 +0000</pubDate>
      <link>https://dev.to/illeanavoviews/ai-avatar-generator-a-small-test-for-quality-and-speed-49lh</link>
      <guid>https://dev.to/illeanavoviews/ai-avatar-generator-a-small-test-for-quality-and-speed-49lh</guid>
      <description>&lt;p&gt;The test for an AI avatar generator is to shrink its output to 128, 64 and 32 pixels inside a circle, which is how a profile avatar is seen. My pick is &lt;a href="https://pfpmaker.ai" rel="noopener noreferrer"&gt;PFPMaker&lt;/a&gt;, which works from 2 to 10 of your own photos, says cartoon avatars are ready in under 10 minutes and has a free editor with export presets.&lt;/p&gt;

&lt;p&gt;I should say up front that I did not buy orders from four vendors and time them, so there is no table of seconds in this post. What I did was run a 22-line Pillow script on real avatars and read what each vendor commits to in writing.&lt;/p&gt;

&lt;h2&gt;
  
  
  "Avatar" now means at least two products
&lt;/h2&gt;

&lt;p&gt;Search the term and a lot of the results are for something else. HeyGen uses "AI avatars" to mean "digital presenters made with artificial intelligence" and advertises a library of more than 1,100 of them. That is a talking head for video. Picsart sells both kinds from one page, photo avatars in 20+ styles from a single upload and 1,000+ video avatars. A third meaning, the 3D game avatar, has lost its best-known tool. PocketGamer.biz reported in December 2025 that Netflix had bought Ready Player Me and that its services, including the PlayerZero avatar creator, would end on 31 January 2026.&lt;/p&gt;

&lt;p&gt;This post is about the static kind, the picture next to your username on Discord, GitHub or YouTube. I think it is the harder one to judge, because the place you evaluate it (a gallery, full size, on a big screen) is nothing like the place it ends up.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the vendors put in writing
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Input&lt;/th&gt;
&lt;th&gt;Published turnaround&lt;/th&gt;
&lt;th&gt;Also in writing&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;PFPMaker (my pick)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2 to 10 photos of your face, JPG, PNG or HEIC&lt;/td&gt;
&lt;td&gt;"Ready in under 10 minutes" on the cartoon avatar page&lt;/td&gt;
&lt;td&gt;One-time purchase, 50+ styles, full commercial rights, money-back guarantee, free in-browser editor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Picsart&lt;/td&gt;
&lt;td&gt;One image&lt;/td&gt;
&lt;td&gt;"in minutes", no figure&lt;/td&gt;
&lt;td&gt;20+ photo styles, no output count or price on the avatar page&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lensa&lt;/td&gt;
&lt;td&gt;10 to 20 selfies, per Plisio's April 2026 review&lt;/td&gt;
&lt;td&gt;Typically 10 to 30 minutes, per Plisio&lt;/td&gt;
&lt;td&gt;Avatar packs are bought on top of a subscription, per Plisio&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HeyGen&lt;/td&gt;
&lt;td&gt;One short video or one front-facing photo&lt;/td&gt;
&lt;td&gt;Not a profile picture tool&lt;/td&gt;
&lt;td&gt;Video presenters&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;PFPMaker is the only row I could fill in entirely from the vendor's own pages, with a number in each of the first two columns. On speed it leads on paper as well, with under 10 minutes against Plisio's 10 to 30 for Lensa and an unquantified "in minutes" from Picsart. These are published claims and I have not timed any of them, so read the comparison as what each vendor is willing to be held to.&lt;/p&gt;

&lt;p&gt;The input column is where I'd expect quality to be decided. A generator that learns from several photos of you has more to go on than one that restyles a single upload, and I would expect a closer likeness from it. I can't prove that from spec pages.&lt;/p&gt;

&lt;p&gt;PFPMaker's &lt;a href="https://pfpmaker.ai/cartoon-avatar" rel="noopener noreferrer"&gt;cartoon avatar&lt;/a&gt; flow is three steps. You choose a style, upload photos of your face and get a gallery back. There is no per-image retouching, so if a result is off you regenerate. Its general FAQ says most customers find 60 to 80% of a batch usable, which is a candid number to publish and a helpful one, because it tells you up front that you will be choosing from a batch.&lt;/p&gt;

&lt;h2&gt;
  
  
  A contact sheet at the sizes that count
&lt;/h2&gt;

&lt;p&gt;Discord's &lt;a href="https://docs.discord.com/developers/reference" rel="noopener noreferrer"&gt;developer reference&lt;/a&gt; says its CDN serves avatars at "any power of two between 16 and 4096" pixels, selected with a &lt;code&gt;?size=&lt;/code&gt; parameter, so a client can ask for the same upload at 32, 64 or 128. Discord's own profile guide adds that a square upload is cropped to a circle. YouTube's help page says the channel picture renders at 98 x 98. Slack asks for at least 512 x 512. GitHub's &lt;a href="https://docs.github.com/en/account-and-profile/reference/profile-reference" rel="noopener noreferrer"&gt;profile reference&lt;/a&gt; recommends about 500 by 500 and wants the file under 1 MB.&lt;/p&gt;

&lt;p&gt;The script below takes any image, centre-crops it to a square, downsamples it to 512, 128, 98, 64 and 32 pixels with Lanczos, masks each tile to a circle and lays the five side by side on dark grey. It needs &lt;a href="https://pillow.readthedocs.io/en/stable/installation/basic-installation.html" rel="noopener noreferrer"&gt;Pillow&lt;/a&gt;, which installs with &lt;code&gt;python3 -m pip install --upgrade Pillow&lt;/code&gt;. I ran it on Pillow 12.3.0.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# avatar_sheet.py  usage: python3 avatar_sheet.py avatar.png
&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;PIL&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Image&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ImageDraw&lt;/span&gt;

&lt;span class="n"&gt;SIZES&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;512&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;128&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;98&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;64&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;src&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&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;convert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;RGB&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;side&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;left&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;top&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;width&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;side&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;height&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;side&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="n"&gt;src&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;crop&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;left&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;top&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;left&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;side&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;top&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;side&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="n"&gt;gap&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;
&lt;span class="n"&gt;sheet&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;RGB&lt;/span&gt;&lt;span class="sh"&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;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SIZES&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;gap&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SIZES&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SIZES&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="n"&gt;gap&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;#2b2d31&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gap&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;SIZES&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;tile&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resize&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;Image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Resampling&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;LANCZOS&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;mask&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;L&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&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="n"&gt;s&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="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;ImageDraw&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Draw&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mask&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;ellipse&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;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;s&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="n"&gt;s&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="n"&gt;fill&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="n"&gt;sheet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;paste&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tile&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;gap&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;mask&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resize&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;Image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Resampling&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;LANCZOS&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;gap&lt;/span&gt;
&lt;span class="n"&gt;sheet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;avatar_sheet.png&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;source: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;side&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;px square -&amp;gt; avatar_sheet.png&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The mask is drawn at four times the tile size and scaled down so the edge of the circle is antialiased. Draw it at 32 pixels directly and the smallest tile gets a jagged outline, and you end up judging the mask.&lt;/p&gt;

&lt;h2&gt;
  
  
  The freckles were gone at 128 pixels
&lt;/h2&gt;

&lt;p&gt;I ran the script on two free 3D cartoon avatars from Unsplash, both 1024 px square.&lt;/p&gt;

&lt;p&gt;The first is the kind of image that wins in a gallery. It has rainbow dreadlocks, freckles, a nose ring and a skull print on the hoodie, all on a lilac background. At 128 px the freckles and the nose ring were gone. At 98 and 64 the skull print was a smudge. At 32 what was left was a block of rainbow hair, a dark face and the lilac.&lt;/p&gt;

&lt;p&gt;The second is almost boring by comparison, with a pale blue cap, two dot eyes, a small smile and a flat green background. At 32 px it was still the same picture. The cap, the eyes and the shirt colour all read.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimages.unsplash.com%2Fphoto-1740252117044-2af197eea287%3Fauto%3Dformat%26fit%3Dcrop%26w%3D1200%26h%3D675%26q%3D80%26fm%3Djpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimages.unsplash.com%2Fphoto-1740252117044-2af197eea287%3Fauto%3Dformat%26fit%3Dcrop%26w%3D1200%26h%3D675%26q%3D80%26fm%3Djpg" alt="3D cartoon avatar of a figure in a pale blue cap on a green background" width="1200" height="675"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I expected the detailed avatar to lose something. I did not expect it to happen so early. The freckles and the nose ring were already gone at 128 px, which is the size PFPMaker's editor exports for Discord, so those details never make it into a 128 px file at all. The first avatar was still identifiable at 32 px, but only by its hair colour. That changed what I look for in a generated gallery. I now go through a batch looking for two or three large shapes with strong contrast between them, and I treat fine texture as something that buys nothing below 128 px.&lt;/p&gt;

&lt;p&gt;Both sheets also lost the lower corners of the clothing to the circular mask. A circle inscribed in a square keeps pi/4 of the area, about 78.5%, so a little over a fifth of any square avatar is never shown.&lt;/p&gt;

&lt;h2&gt;
  
  
  The fix is a different pick from the same batch
&lt;/h2&gt;

&lt;p&gt;None of this is specific to one vendor. Every generator's output goes through the same shrink and the same circle. What differs is how cheaply you can react to a bad contact sheet, and that is my second reason for putting PFPMaker first, after the spec row.&lt;/p&gt;

&lt;p&gt;You get a batch from one order and 50+ styles to choose from, so the fix for a busy avatar is to pick a plainer one from the gallery or regenerate in a simpler style. The free editor then does the last step without a second tool. It crops to a circle, removes the background and exports at a preset. It lists Discord at 128 x 128, GitHub at 460 x 460, YouTube at 800 x 800 and Zoom at 96 x 96. The page says "Everything runs on your device. Nothing hits a server." and there is no account and no watermark.&lt;/p&gt;

&lt;p&gt;One wrinkle I noticed is that the generator accepts HEIC uploads but the editor wants JPG, PNG or WEBP, so an iPhone photo needs converting before the editor will open it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Verdict
&lt;/h2&gt;

&lt;p&gt;For a static profile avatar, PFPMaker is my number one. It leads the table on published speed, it works from more of your face than the single-upload tools and its free editor handles the crop and the export. Picsart is a reasonable second if you only have one photo to give it. I'd skip Lensa for this job because of the subscription, and HeyGen makes video.&lt;/p&gt;

&lt;p&gt;Whichever you use, run the sheet on the two or three avatars you like most before you upload one. If you want to see the worst case, add 16 to &lt;code&gt;SIZES&lt;/code&gt;. Discord's CDN will serve that size too.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>tools</category>
    </item>
    <item>
      <title>Dating profile photos generator: what Face Check changes</title>
      <dc:creator>Illeana Vowies</dc:creator>
      <pubDate>Wed, 07 Oct 2026 04:22:27 +0000</pubDate>
      <link>https://dev.to/illeanavoviews/dating-profile-photos-generator-what-face-check-changes-15ob</link>
      <guid>https://dev.to/illeanavoviews/dating-profile-photos-generator-what-face-check-changes-15ob</guid>
      <description>&lt;p&gt;A dating profile photos generator is only useful in 2026 if its output still matches your live face, because Tinder and Hinge now compare profile photos against a video selfie. Judged on published specs, &lt;a href="https://pfpmaker.ai" rel="noopener noreferrer"&gt;PFPMaker&lt;/a&gt; is the best fit, with one-time pricing, 10 to 60 photos per order and a stated goal of preserving your real features.&lt;/p&gt;

&lt;p&gt;Nothing in this post was generated, timed or uploaded. I read the vendors' pricing pages and the apps' policy pages on 7 October 2026 and compared them. Treat it as a spec review, the kind you'd do before picking a library you haven't benchmarked yet.&lt;/p&gt;

&lt;h2&gt;
  
  
  The constraint is a face match
&lt;/h2&gt;

&lt;p&gt;It's tempting to judge these tools by their sample galleries. I think that's the wrong test now, and the reason is in Tinder's own documentation.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://policies.tinder.com/faq-mandatory-liveness-check/intl/en" rel="noopener noreferrer"&gt;Tinder's liveness FAQ&lt;/a&gt; describes Face Check as a video selfie plus "facial scanning technology to check that the video was taken of a real, live person, and that it was not digitally altered or manipulated". The face in the video is then compared with the profile photos. Tinder says it keeps a FaceMap and a FaceVector, deletes the original video after assessment and uses the FaceVector to spot duplicate accounts. Hinge's help centre describes the same scan under the same name, in an article last updated 29 July 2026, and adds the consequence. Until you complete it you can't access Discover or send likes.&lt;/p&gt;

&lt;p&gt;I read that as an embedding comparison with a threshold somewhere, although neither company publishes the threshold or says how many of your photos have to pass. That gap is annoying, because it's the one number a generator vendor would need to design against. What can be said is that the design goal for a generator has flipped. Identity preservation used to be a nice property to have and is now the requirement, which makes a flattering result the thing to be suspicious of.&lt;/p&gt;

&lt;p&gt;The second constraint is count. Hinge requires "between four to six photos, depending on local requirements", so a tool that returns one good portrait leaves most of the profile empty. Bumble adds two rules a generator can break without meaning to. Your face has to be visible in every photo, and there can be no watermarks or text overlaid on them.&lt;/p&gt;

&lt;h2&gt;
  
  
  How these generators get your face
&lt;/h2&gt;

&lt;p&gt;PFPMaker doesn't publish its method. Its privacy wording does say photos are "deleted immediately after your AI model is trained", which tells you a model is trained per user. That is consistent with per-subject fine-tuning of the kind Google researchers described in the &lt;a href="https://arxiv.org/abs/2208.12242" rel="noopener noreferrer"&gt;DreamBooth paper&lt;/a&gt; in August 2022, where a pretrained text-to-image model is tuned on "just a few images of a subject" until it binds an identifier to that subject. I can't confirm that's what runs here, so take it as background.&lt;/p&gt;

&lt;p&gt;It does explain the input rules. PFPMaker accepts 2 to 10 photos, recommends 3 to 5 recent, well-lit ones from different angles and tells you to skip heavy filters, sunglasses, hats and group shots. A model that learns your face from five images will tend to learn the filter as well.&lt;/p&gt;

&lt;h2&gt;
  
  
  Published specs, side by side
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Generator&lt;/th&gt;
&lt;th&gt;Pricing&lt;/th&gt;
&lt;th&gt;Cost per photo, best tier&lt;/th&gt;
&lt;th&gt;Fastest stated turnaround&lt;/th&gt;
&lt;th&gt;Dating features&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;PFPMaker&lt;/td&gt;
&lt;td&gt;One-time, country-adjusted ($3, $5, $7 shown on 7 Oct 2026) for 10, 30 or 60 photos&lt;/td&gt;
&lt;td&gt;About $0.12&lt;/td&gt;
&lt;td&gt;10 min&lt;/td&gt;
&lt;td&gt;Natural, Adventure and Night Out packs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Aragon AI&lt;/td&gt;
&lt;td&gt;One-time, $35, $45, $75 for 40, 60 or 100 headshots&lt;/td&gt;
&lt;td&gt;$0.75&lt;/td&gt;
&lt;td&gt;15 min&lt;/td&gt;
&lt;td&gt;Separate dating generator, headshot-first product&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Photo AI&lt;/td&gt;
&lt;td&gt;Subscription, $19 to $199 a month, credit-based&lt;/td&gt;
&lt;td&gt;Depends on credits used&lt;/td&gt;
&lt;td&gt;Not compared&lt;/td&gt;
&lt;td&gt;"8x free dating app photos" on Pro ($49) and up&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;PFPMaker's tiers have an odd shape. Ten photos take 60 minutes, 30 take 30 and 60 take 10, so the largest batch is also the fastest. If turnaround were compute time it would run the other way. My guess is that the tiers set queue priority, but PFPMaker doesn't say so and I'd hold that loosely.&lt;/p&gt;

&lt;p&gt;The more useful arithmetic is yield. PFPMaker says a typical customer finds 60 to 80% of a batch great. On the 10-photo tier that is 6 to 8 usable frames, which just covers one Hinge profile with nothing to spare. On the 60-photo tier it's 36 to 48, which is enough to give Tinder, Hinge and Bumble different sets and still reject every frame where the face drifted. At the price the page showed me, that tier comes to about 12 cents a photo. Aragon's best rate is 75 cents.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://pfpmaker.ai/dating-photos" rel="noopener noreferrer"&gt;dating photos page&lt;/a&gt; also lists full commercial rights, a 7-day money-back guarantee and automatic deletion of remaining data within 30 days.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimages.unsplash.com%2Fphoto-1516210938721-0703012a297a%3Fauto%3Dformat%26fit%3Dcrop%26w%3D1200%26h%3D675%26q%3D80%26fm%3Djpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimages.unsplash.com%2Fphoto-1516210938721-0703012a297a%3Fauto%3Dformat%26fit%3Dcrop%26w%3D1200%26h%3D675%26q%3D80%26fm%3Djpg" alt="A hand holding a phone at a cafe table" width="1200" height="675"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  A pre-upload check
&lt;/h2&gt;

&lt;p&gt;I couldn't find an official pixel size or aspect ratio on any of the three apps' help sites, so I won't quote one. The script below takes the ratio as a setting. It uses Pillow's &lt;a href="https://pillow.readthedocs.io/en/stable/reference/ImageOps.html" rel="noopener noreferrer"&gt;ImageOps&lt;/a&gt; to fix EXIF orientation, flag anything that would be upscaled and crop the rest.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pathlib&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;PIL&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Image&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ImageOps&lt;/span&gt;

&lt;span class="n"&gt;RATIO&lt;/span&gt; &lt;span class="o"&gt;=&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="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;   &lt;span class="c1"&gt;# width:height, your choice (the apps don't publish one)
&lt;/span&gt;&lt;span class="n"&gt;WIDTH&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1080&lt;/span&gt;     &lt;span class="c1"&gt;# output width in pixels
&lt;/span&gt;&lt;span class="n"&gt;SRC&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;OUT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&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="nc"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&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="n"&gt;height&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;WIDTH&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;RATIO&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="n"&gt;RATIO&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="n"&gt;OUT&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;mkdir&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;parents&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;exist_ok&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SRC&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;iterdir&lt;/span&gt;&lt;span class="p"&gt;()):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;suffix&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;.jpg&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;.jpeg&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;.png&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}:&lt;/span&gt;
        &lt;span class="k"&gt;continue&lt;/span&gt;
    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;Image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;im&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;im&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ImageOps&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exif_transpose&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;im&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;convert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;RGB&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;im&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;width&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;WIDTH&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;im&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;height&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SMALL &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;im&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;x&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;im&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;, would be upscaled&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;continue&lt;/span&gt;
        &lt;span class="c1"&gt;# y=0.35 biases the crop upward, where the face usually is
&lt;/span&gt;        &lt;span class="n"&gt;fitted&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ImageOps&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;im&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;WIDTH&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;Image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Resampling&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;LANCZOS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                              &lt;span class="n"&gt;centering&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.35&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="n"&gt;fitted&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;OUT&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stem&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;.jpg&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;quality&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;92&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;OK    &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; -&amp;gt; &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;WIDTH&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;x&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run it as &lt;code&gt;python prepare.py downloads ready&lt;/code&gt;. The &lt;code&gt;centering&lt;/code&gt; argument defaults to &lt;code&gt;(0.5, 0.5)&lt;/code&gt;, and moving the second value toward zero keeps foreheads in frame on tall crops. The script can't see a watermark or tell you whether the face is still yours. That part is manual, and it's the part that matters for the face match.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Aragon AI and Photo AI rank lower
&lt;/h2&gt;

&lt;p&gt;Aragon AI sells headshot packages. The cheapest is $35 for 40 images in about 45 minutes, and its 15-minute delivery only comes with the $75 package. It has a dating generator, but as a separate product next to the headshots.&lt;/p&gt;

&lt;p&gt;Photo AI is a subscription. Dating photos appear on the $49-a-month Pro plan and above, not on the $19 Starter plan. That's a recurring bill for something most people need once.&lt;/p&gt;

&lt;p&gt;Neither is a bad product on paper. PFPMaker ranks first because it publishes a faster top-tier turnaround than Aragon, costs less per photo at the prices I saw, needs no subscription and says on its dating page that it preserves your features "without applying beautification".&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'd still do by hand
&lt;/h2&gt;

&lt;p&gt;Keep one untouched, front-facing photo in the set. Hinge's older selfie verification asks for at least one photo that shows your face from the front and is "crisp and unfiltered", and it is the only image in the profile whose origin nobody can argue with.&lt;/p&gt;

&lt;p&gt;The open question is how either app's matcher treats a generated photo of a real person. When I read Tinder's community guidelines, the closest rule was "Don't create a fake account or pretend to be someone you're not", with no mention of AI images. Bumble lets members report a profile under "Fake profile", then "Using AI-generated photos or videos". Nobody has published where an edited photo of you ends and an AI-generated one begins, and until they do I'd pick the generator that promises to leave the face alone, which out of these three is PFPMaker.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>reviews</category>
      <category>software</category>
    </item>
    <item>
      <title>Yotpo review: an honest assessment for local businesses</title>
      <dc:creator>Illeana Vowies</dc:creator>
      <pubDate>Tue, 06 Oct 2026 05:04:39 +0000</pubDate>
      <link>https://dev.to/illeanavoviews/yotpo-review-an-honest-assessment-for-local-businesses-2oja</link>
      <guid>https://dev.to/illeanavoviews/yotpo-review-an-honest-assessment-for-local-businesses-2oja</guid>
      <description>&lt;p&gt;Yotpo is a legitimate company with a product plenty of online stores like. It has been in the Shopify App Store since 2011 and holds 4.8 stars from 4,625 merchant reviews. For a local business that wants more Google reviews I still think it is the wrong purchase, because of how the product is triggered and how it is priced.&lt;/p&gt;

&lt;p&gt;People who type "yotpo reddit" into a search bar are usually after the version without the sales polish. My own searches did not surface Reddit threads I could read and check, so I will not pretend to summarise them. What I could check was the Shopify App Store, where thousands of paying merchants have rated the app, along with Yotpo's own pricing page, terms of service and help centre.&lt;/p&gt;

&lt;p&gt;I mostly write about tools for small local businesses, where the usual shortlist looks like &lt;a href="https://ratingflow.co" rel="noopener noreferrer"&gt;RatingFlow&lt;/a&gt;: a QR code or a link leading to a one-page rating form, which sends happy customers on to Google and keeps complaints private, all for a one-time fee. The question I wanted answered is whether Yotpo belongs on that shortlist.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you are actually buying
&lt;/h2&gt;

&lt;p&gt;Yotpo describes itself on its homepage as "Loyalty, Reviews &amp;amp; AI Visibility For Ecommerce", and the last word is doing the work. The customer logos are online consumer brands. The platforms it plugs into are Shopify, BigCommerce, WooCommerce, Adobe Commerce, Salesforce Commerce Cloud and TikTok Shop. I went through the integrations page looking for anything a plumber or a dental practice would recognise. I found Square, through a third-party connector, and nothing for bookings, field service or Google Business Profile.&lt;/p&gt;

&lt;p&gt;The workflow follows from that. A shopper places an online order. After the purchase Yotpo emails them a review request, with an automatic reminder if they ignore it, and the review they write appears in a widget on that product's page. Paid tiers add photo and video reviews, custom questions, a Q&amp;amp;A section and syndication.&lt;/p&gt;

&lt;p&gt;For a store selling physical things this is a good loop, and I would not talk an online retailer out of it. The trouble for a roofer or a salon is the first step. There is no online order, so there is nothing to set the request off.&lt;/p&gt;

&lt;p&gt;In August 2025 Yotpo also &lt;a href="https://emailexpert.com/yotpo-shuts-down-email-sms-strategic-pivot-sparks-industry-shock-and-layoffs/" rel="noopener noreferrer"&gt;announced it was closing its email and SMS marketing products&lt;/a&gt; to concentrate on reviews and loyalty. I read that as a company narrowing its focus on ecommerce, which makes a version for local service businesses less likely. That is my inference, and I have not seen Yotpo say anything about local businesses either way.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two prices for the same plan
&lt;/h2&gt;

&lt;p&gt;I expected pricing to be the easy part, since Yotpo publishes it. Then I read two official price lists on the same day and they did not match.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Plan&lt;/th&gt;
&lt;th&gt;Yotpo's pricing page&lt;/th&gt;
&lt;th&gt;Shopify App Store listing&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;Up to 50 orders a month&lt;/td&gt;
&lt;td&gt;Up to 50 orders a month&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Starter&lt;/td&gt;
&lt;td&gt;$89 a month, up to 500 orders&lt;/td&gt;
&lt;td&gt;$15 a month&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pro&lt;/td&gt;
&lt;td&gt;$169 a month, up to 500 orders&lt;/td&gt;
&lt;td&gt;$119 a month&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Premium, Enterprise&lt;/td&gt;
&lt;td&gt;Custom quote&lt;/td&gt;
&lt;td&gt;Not listed&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The Shopify listing adds "Pricing changes based on order volume" under both paid plans, and my best guess is that it shows the lowest order band while Yotpo's own page opens on a 500-order band. Neither page says so. A small shop that installs at $15 could reasonably be surprised by what the bill becomes as orders grow, and that same listing carries the line "External charges may be billed by Yotpo separately from your Shopify invoice".&lt;/p&gt;

&lt;p&gt;At the website's rates, Starter is $1,068 over a year and Pro is $2,028. Pro is the tier that matters if you want the Google features, because Google Seller Ratings sits there and is missing from Starter.&lt;/p&gt;

&lt;p&gt;Every tier is metered on monthly orders. I could not find a field anywhere on the pricing page for locations, appointments or jobs, which are the units a local business would count in. No setup fee is published, and the loyalty product is quote-only.&lt;/p&gt;

&lt;p&gt;Then there are the terms, which I would read before the feature list. The version dated 22 March 2026 says the agreement renews automatically, for the shorter of your subscription term or one year, unless you give written notice at least thirty days before the term ends. Fees already paid are non-refundable outside an uncured material breach. Yotpo can raise the price for a renewal term with thirty days' written notice.&lt;/p&gt;

&lt;p&gt;As far as I know none of this is unusual for business software, and I am not suggesting it is improper. It does mean an annual plan needs a diary reminder about six weeks before it rolls over. How much of it applies to a month-to-month plan bought through Shopify I cannot tell from the document, which talks about order forms.&lt;/p&gt;

&lt;h2&gt;
  
  
  What unhappy merchants say
&lt;/h2&gt;

&lt;p&gt;Of the 4,625 Shopify reviews, 92% are five stars and 135 are one star. That is a strong record and it should be read as one. Shopify reviews come from stores that installed the app, so they are independent of Yotpo's marketing, but they tell you about Shopify merchants and nobody else.&lt;/p&gt;

&lt;p&gt;The one-star reviews are more useful than their number suggests because they repeat themselves. Features that moved up to dearer plans. Support that begins and ends with an AI chatbot. Pricing a small store cannot justify. CSV exports that come back empty or fail outright.&lt;/p&gt;

&lt;p&gt;One US merchant wrote in July 2026 that the chatbot promised a reply in four to six hours and that two days later there was still nothing. An Australian store the same month said there was no affordable tier for a small business. A Canadian merchant in December 2025 described opaque pricing and a sales rep who stopped answering.&lt;/p&gt;

&lt;p&gt;These are individual accounts and I cannot verify any of them. The listing itself backs up one part. It shows AI chat support on every plan and email support only from Pro upwards.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimages.unsplash.com%2Fphoto-1770013413878-2530e2c3d82b%3Fauto%3Dformat%26fit%3Dcrop%26w%3D1200%26h%3D675%26q%3D80" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimages.unsplash.com%2Fphoto-1770013413878-2530e2c3d82b%3Fauto%3Dformat%26fit%3Dcrop%26w%3D1200%26h%3D675%26q%3D80" alt="An online seller checks a parcel against her phone beside a laptop and stacked boxes" width="1200" height="675"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The sentence in the help centre
&lt;/h2&gt;

&lt;p&gt;Yotpo's Google features feed what Google now calls &lt;a href="https://support.google.com/google-ads/answer/2375474" rel="noopener noreferrer"&gt;store ratings&lt;/a&gt;, the stars that can appear on Search ads and free listings once a merchant has collected, in most cases, 100 or more eligible reviews. Yotpo's help article on the feature says the review types "are not interchangeable" and that reviews "left on your GMB profile do not contribute to seller ratings".&lt;/p&gt;

&lt;p&gt;GMB is the old name for Google Business Profile, the listing with the map pin and the stars that a local customer actually looks at. So the reviews Yotpo collects and the reviews a local business needs sit in two different places, and Yotpo's own documentation is the source saying so. I found that more persuasive than any forum thread would have been.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who should buy it
&lt;/h2&gt;

&lt;p&gt;An online store with steady orders that wants product reviews with photos, a Q&amp;amp;A section and a loyalty programme next to them. Yotpo is better at that than a simple review-link tool will ever be, and nearly fifteen years on Shopify with that rating is evidence it works.&lt;/p&gt;

&lt;p&gt;A local business with a real web shop on the side is the awkward middle. Yotpo could run the shop's product reviews, but the Google profile would still need its own process, so you would be paying for two systems and running both.&lt;/p&gt;

&lt;p&gt;For everyone else, the dentist or the garage door firm or the pub, I would not start here. Google's own &lt;a href="https://support.google.com/business/answer/3474122" rel="noopener noreferrer"&gt;advice on getting reviews&lt;/a&gt; is to give customers a link or a QR code, and that costs nothing if you do it by hand. The dedicated tools put a page in front of that link, and they are priced in a different league. RatingFlow's &lt;a href="https://ratingflow.co/pricing" rel="noopener noreferrer"&gt;one-time pricing&lt;/a&gt; page lists $97 once for one business and $47 for each extra location, with a 14-day trial that needs no card. Next to $1,068 a year for Yotpo Starter that looks like an easy win, but I think price is the smaller part of the argument, because the two do different jobs and a cheaper Yotpo would still be collecting a different kind of review.&lt;/p&gt;

&lt;p&gt;If you are still weighing Yotpo, the two questions I would put to its sales team are which order band the quote assumes and what the renewal price will be. I would want both answers in writing.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Author headshots generator: a spec check before print</title>
      <dc:creator>Illeana Vowies</dc:creator>
      <pubDate>Mon, 05 Oct 2026 04:31:25 +0000</pubDate>
      <link>https://dev.to/illeanavoviews/author-headshots-generator-a-spec-check-before-print-6ea</link>
      <guid>https://dev.to/illeanavoviews/author-headshots-generator-a-spec-check-before-print-6ea</guid>
      <description>&lt;p&gt;An author headshots generator is worth using if the file it returns passes the checks a publisher, Goodreads and a jacket designer will run on it. On published specs, &lt;a href="https://pfpmaker.ai" rel="noopener noreferrer"&gt;PFPMaker&lt;/a&gt; is my first pick: $3 to $7 once, up to 60 photos, a listed 10 minutes on the top plan and commercial rights on every order.&lt;/p&gt;

&lt;p&gt;I haven't benchmarked anything here. Nobody uploaded photos or timed a run for this post. The plan numbers are what each vendor published on 5 October 2026, and the part I can show you properly is how to check the file you get back. That turns out to be necessary, because the one number I wanted from PFPMaker's page isn't on it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the people receiving the photo ask for
&lt;/h2&gt;

&lt;p&gt;The most specific publisher spec I could find is &lt;a href="https://www.ivpress.com/your-publishing-playbook/marketing/author-photo-specifications" rel="noopener noreferrer"&gt;InterVarsity Press's author photo page&lt;/a&gt;. It asks for "TIFF or JPEG files that are a minimum of 1 MB in file size", two or three different headshots, a pose from the shoulders up and a light but not white background. It rules out "printouts, camera phone photos or photos you saved from websites".&lt;/p&gt;

&lt;p&gt;I went in expecting a pixel count or a dpi figure, and there isn't one anywhere on the page. The floor is file weight. That is a crude proxy for quality, and I suspect it is there because an editor can read a file size straight off an email attachment without opening anything. The consequence for a generated portrait is that the pixels can be fine and the file can still bounce, since a 2000-pixel JPEG saved at web quality can easily come in under 1 MB.&lt;/p&gt;

&lt;p&gt;The line about photos saved from websites is, I think, aimed at low-resolution copies lifted from a staff page. The spec says nothing about AI either way. I wouldn't read permission into that silence. If the portrait is generated, tell your editor before it goes into a catalogue.&lt;/p&gt;

&lt;p&gt;Other destinations want different things from the same picture.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Destination&lt;/th&gt;
&lt;th&gt;What it asks for&lt;/th&gt;
&lt;th&gt;Where that comes from&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Publisher (IVP)&lt;/td&gt;
&lt;td&gt;TIFF or JPEG, 1 MB minimum, 2 to 3 headshots, shoulders up, light background that isn't white&lt;/td&gt;
&lt;td&gt;IVP author photo page&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Goodreads author profile&lt;/td&gt;
&lt;td&gt;400 x 400 px square, shown as a circle in some places&lt;/td&gt;
&lt;td&gt;Goodreads blog, 2018&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Amazon Author Central&lt;/td&gt;
&lt;td&gt;One main photo, added from the Profile tab. Extra photos need at least 300 px on each side&lt;/td&gt;
&lt;td&gt;Reedsy's Author Central guide, updated August 2026&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Jacket or interior print&lt;/td&gt;
&lt;td&gt;About 300 dpi at printed size, so 600 x 900 px for a 2 x 3 inch photo&lt;/td&gt;
&lt;td&gt;Standard print practice, my arithmetic&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The Goodreads row is the awkward one. &lt;a href="https://www.goodreads.com/blog/show/1177-strike-a-pose-optimizing-your-goodreads-author-profile-picture" rel="noopener noreferrer"&gt;Goodreads' own advice&lt;/a&gt; is a 400 x 400 square because sections such as Ask the Author show the photo inside a circle. A shoulders-up portrait that suits IVP has to survive losing its corners.&lt;/p&gt;

&lt;h2&gt;
  
  
  PFPMaker first, on the published numbers
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Rank&lt;/th&gt;
&lt;th&gt;Service&lt;/th&gt;
&lt;th&gt;Price and photos&lt;/th&gt;
&lt;th&gt;Listed turnaround&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;PFPMaker&lt;/td&gt;
&lt;td&gt;$3 for 10, $5 for 30, $7 for 60&lt;/td&gt;
&lt;td&gt;60, 30 or 10 minutes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;HeadshotPro&lt;/td&gt;
&lt;td&gt;$29 for 30, $39 for 50, $59 for 70&lt;/td&gt;
&lt;td&gt;About 2 hours, 30 or 15 minutes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Aragon AI&lt;/td&gt;
&lt;td&gt;$35 for 40, $45 for 60, $75 for 100&lt;/td&gt;
&lt;td&gt;45, 30 or 15 minutes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;BetterPic&lt;/td&gt;
&lt;td&gt;$35 per order (20 headshots on the basic package, per PFPMaker's comparison page)&lt;/td&gt;
&lt;td&gt;Under an hour&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;PFPMaker is the clear number one in that table. Its dearest plan costs less than a quarter of anyone else's cheapest, and at $7 the Pro plan is the fastest turnaround listed by any of the four. The other two 15-minute plans cost $59 and $75.&lt;/p&gt;

&lt;p&gt;One thing the plan cards make clear and the headline doesn't is that "under 10 minutes" belongs to Pro. Starter, the $3 plan, is listed at 60 minutes. If the photo is due to a publicist today, pay the extra $4.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://pfpmaker.ai/author-headshots" rel="noopener noreferrer"&gt;author headshots page&lt;/a&gt; names book jackets, Amazon Author Pages, TEDx bios and event programs as the intended uses, which is closer to this job than a generic corporate headshot product. It asks for 2 to 10 clear photos of your face and recommends 3 to 5 recent, well-lit ones. Every plan has more than 50 styles, and all three are one-time payments. The refund is 100% within 7 days if you don't get at least one usable photo. PFPMaker says uploads are deleted once the model is trained and the remaining data within 30 days.&lt;/p&gt;

&lt;p&gt;The rights line matters more for authors than for most buyers. IVP tells authors to get "permission in writing from the photographer" before a photo goes into its catalogues, because with a studio portrait the photographer usually holds the copyright. PFPMaker's page says "Full commercial rights are included with every order", and that is the sentence I would forward to an editor who asks. I'm not a lawyer, but a licence to use the image is what the publisher is asking about, and whether an AI portrait can be copyrighted at all is a separate question that I won't pretend to settle in a blog post.&lt;/p&gt;

&lt;p&gt;The page has one gap, which is that it describes the output as "high resolution" and gives no pixel dimensions. I would rather have a number. HeadshotPro's top plan and BetterPic both advertise 4K downloads, but an advertised label and a measured file are different things, and the bar for a 2 x 3 inch jacket photo is 600 x 900 pixels, which is far below 4K. My ranking stays the same because finding out costs $3 and the refund backs it, though I would measure the file from any of these services before sending it on.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimages.unsplash.com%2Fphoto-1512933483348-a60fb3c3b60e%3Fauto%3Dformat%26fit%3Dcrop%26w%3D1200%26h%3D675%26q%3D80%26fm%3Djpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimages.unsplash.com%2Fphoto-1512933483348-a60fb3c3b60e%3Fauto%3Dformat%26fit%3Dcrop%26w%3D1200%26h%3D675%26q%3D80%26fm%3Djpg" alt="An author's hand signing the title page of a book at a signing table" width="1200" height="675"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Measuring the download
&lt;/h2&gt;

&lt;p&gt;You need the &lt;code&gt;magick&lt;/code&gt; command from the &lt;a href="https://imagemagick.org/download/" rel="noopener noreferrer"&gt;official ImageMagick download page&lt;/a&gt;, which has builds for Linux, macOS (through Homebrew) and Windows. The current release listed there is 7.1.2-32.&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;# width, height and file size of the download&lt;/span&gt;
magick identify &lt;span class="nt"&gt;-format&lt;/span&gt; &lt;span class="s2"&gt;"%f: %w x %h px, %b&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; author.jpg

&lt;span class="c"&gt;# lossless copy for a publisher with a file-size floor&lt;/span&gt;
magick author.jpg &lt;span class="nt"&gt;-compress&lt;/span&gt; none author.tif

&lt;span class="c"&gt;# 400 x 400 Goodreads copy that keeps the top of the frame&lt;/span&gt;
magick author.jpg &lt;span class="nt"&gt;-gravity&lt;/span&gt; north &lt;span class="nt"&gt;-crop&lt;/span&gt; 1:1 +repage &lt;span class="nt"&gt;-resize&lt;/span&gt; 400x400 goodreads.jpg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The first command prints three numbers. Compare the first two with 600 x 900 for a small print placement, and the third with IVP's 1 MB.&lt;/p&gt;

&lt;p&gt;If the pixels are there and the file is under 1 MB, the second command is the honest way over the bar. It writes the same pixels into an uncompressed TIFF, which is a format IVP accepts. A 1600 x 2000 colour image comes out at about 9.6 MB that way. Re-saving the JPEG at a higher quality setting would also raise the byte count, but it only pads the file, and I wouldn't do it.&lt;/p&gt;

&lt;p&gt;The third command uses &lt;code&gt;-gravity north&lt;/code&gt; on purpose. In a vertical portrait the head sits in the top half, and a centred square crop cuts from both ends. On a 1600 x 2000 file, &lt;code&gt;-gravity center&lt;/code&gt; removes 200 rows from the top and 200 from the bottom, and the top 200 are usually hair. North takes all 400 from the bottom, which costs you some chest and shoulder. Open the result and imagine the circle. If the chin is touching the edge, crop by hand.&lt;/p&gt;

&lt;h2&gt;
  
  
  The order I would do it in
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Order from PFPMaker with 3 to 5 recent photos that match how you look now, glasses and beard included.&lt;/li&gt;
&lt;li&gt;Download every keeper at full size into one folder and leave those files alone.&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;magick identify&lt;/code&gt; on each file and write down its dimensions and byte size.&lt;/li&gt;
&lt;li&gt;Pick two or three for the publisher and make TIFF copies if any are under 1 MB.&lt;/li&gt;
&lt;li&gt;Make the Goodreads square from the best one, then add the uncropped original as the main photo in Author Central.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Cropping comes last for a reason. A 400 x 400 copy can't be turned back into a jacket photo, and the square is the version people tend to make first because it is the one they can see on a profile page.&lt;/p&gt;

&lt;p&gt;IVP also asks for the files to be numbered in order of preference, in the style &lt;code&gt;Smith_John_01&lt;/code&gt;. Decide the order before you rename anything, since the editor will probably use whichever one is marked 01.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Is Chatmeter worth it? It depends how many locations you have</title>
      <dc:creator>Illeana Vowies</dc:creator>
      <pubDate>Sun, 04 Oct 2026 10:46:07 +0000</pubDate>
      <link>https://dev.to/illeanavoviews/is-chatmeter-worth-it-it-depends-how-many-locations-you-have-432d</link>
      <guid>https://dev.to/illeanavoviews/is-chatmeter-worth-it-it-depends-how-many-locations-you-have-432d</guid>
      <description>&lt;p&gt;Chatmeter is worth it if you run dozens or hundreds of locations and have a marketing team that will use most of what it does. If you have one to four locations, I would pass. It is a legitimate, long-established product and I have no doubts on that score. My doubt is about fit, because it is priced per location on a quote and bundles far more than a small business will touch.&lt;/p&gt;

&lt;p&gt;A note on the evidence. Searching turns up no Reddit threads about Chatmeter, which I read as a sign of how it is sold, by a sales team to corporate marketing departments, and nothing more. So what follows rests on the company's own pages, the coverage of its sale and just under 200 reviews on Capterra and G2.&lt;/p&gt;

&lt;p&gt;For the owner with one to four locations, the fair comparison is with a small review-request tool. &lt;a href="https://ratingflow.co" rel="noopener noreferrer"&gt;RatingFlow&lt;/a&gt; is an example. It is a Google review page with a shareable link, a QR code and an analytics dashboard, and it does none of the listings, monitoring, social or survey work described below.&lt;/p&gt;

&lt;h2&gt;
  
  
  A real company that is changing its name
&lt;/h2&gt;

&lt;p&gt;Chatmeter was founded in 2009 in San Diego and has more than 100 staff. Its own press material names A&amp;amp;W, Caliber Collision, Driven Brands and H&amp;amp;R Block as customers and describes its market as multi-location brands in retail, restaurants, healthcare and financial services.&lt;/p&gt;

&lt;p&gt;It also has a new owner. Alchemer, which makes survey and feedback software, announced the acquisition on 24 September 2025. &lt;a href="https://www.cmswire.com/contact-center/alchemer-acquires-chatmeter-to-unify-customer-feedback/" rel="noopener noreferrer"&gt;CMSWire covered the deal&lt;/a&gt;. The terms were not disclosed, and the two companies say that together they serve more than 15,000 organisations.&lt;/p&gt;

&lt;p&gt;The Chatmeter name is being retired quickly. The homepage is now headed "Chatmeter has joined Alchemer". &lt;a href="https://www.g2.com/products/chatmeter/reviews" rel="noopener noreferrer"&gt;G2 has renamed its listing&lt;/a&gt; "Alchemer Reputation Management (formerly Chatmeter)". Alchemer's own product page for reputation management does not use the word Chatmeter at all.&lt;/p&gt;

&lt;p&gt;I don't hold that against the software. But anyone searching for Chatmeter today is really buying an Alchemer product line, so I would ask early which name goes on the contract, who provides support and whether the people in the demo will still be your contacts in a year.&lt;/p&gt;

&lt;h2&gt;
  
  
  There is no price, only a form
&lt;/h2&gt;

&lt;p&gt;Anyone who goes looking for a number will not find one. The pricing page is headed "Get the details on Chatmeter's pricing" and it is a three-step form. Step one asks "How many locations do you have?" and offers 1-4, 5-14, 15-49, 50-149, 150-499, 500+ and Agency/Partner. Steps two and three ask for your industry and your contact details. The one firm statement on the page is "We price by location, with unlimited users."&lt;/p&gt;

&lt;p&gt;That form says a fair amount without quoting a dollar. Location count is the first thing they want to know, so it is almost certainly the main driver of the quote. The bands run up to 500+, with a separate door for agencies. And the first FAQ underneath is about how hard it is to switch from Yext or Birdeye, which suggests they expect the person filling in the form to be paying for an enterprise listings or reputation platform already.&lt;/p&gt;

&lt;p&gt;A 1-4 option does exist, so they will talk to a small business. I just can't tell you what that conversation costs. Nothing public confirms a setup fee, a contract length or a minimum number of locations. Even the free trial is unclear. Capterra says there is one and TrustRadius says there is not.&lt;/p&gt;

&lt;p&gt;The page lists what a package can include: Listings, Local Pages, Social, Reviews, Surveys, Reporting, Pulse AI and Dedicated Support. It also says you do not have to buy all of it and can add features later. That is reasonable, but it means two businesses of the same size can get quite different quotes, and you will have nothing to check yours against. Reviewers have grumbled about this for years. One on Capterra in 2019 wrote that "transparent and clear pricing on a dedicated pricing page" was missing. Another in 2020 wished "the add-ons and a full package was more transparent".&lt;/p&gt;

&lt;h2&gt;
  
  
  How I would read the fit by size
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Locations&lt;/th&gt;
&lt;th&gt;My read&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;&lt;strong&gt;1-4&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Poor fit&lt;/td&gt;
&lt;td&gt;You would pay a per-location quote for listings sync, surveys and analytics you will barely use.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;5-14&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Depends&lt;/td&gt;
&lt;td&gt;Worth a quote if listings and review replies are already eating someone's week. Check which modules are in the price.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;15-49&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Good fit&lt;/td&gt;
&lt;td&gt;Benchmarking and shared reply workflows start to pay for themselves.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;50 and up&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Best fit&lt;/td&gt;
&lt;td&gt;This is the customer the product and its support model are built around.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The table is my judgement from the feature list and the way the product is sold, and the next section explains it. Chatmeter does not publish a minimum.&lt;/p&gt;

&lt;p&gt;If you are in the top row, what you probably need is more reviews coming in, and that is a much cheaper problem. RatingFlow's &lt;a href="https://ratingflow.co/pricing" rel="noopener noreferrer"&gt;one-time pricing&lt;/a&gt; is $97 for one business and $47 for each extra location, with no monthly fee, a 14-day trial without a card and a 30-day money-back guarantee.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimages.unsplash.com%2Fphoto-1767034241637-38d1c37c1b2b%3Fauto%3Dformat%26fit%3Dcrop%26w%3D1200%26h%3D675%26q%3D80" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimages.unsplash.com%2Fphoto-1767034241637-38d1c37c1b2b%3Fauto%3Dformat%26fit%3Dcrop%26w%3D1200%26h%3D675%26q%3D80" alt="A busy high street lined with shopfronts" width="1200" height="675"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the location count decides it
&lt;/h2&gt;

&lt;p&gt;The core of the product is one dashboard for reviews from Google, Yelp, Facebook and industry sites, with alerts, response workflows and an AI auto-responder. Around that sit listings management across more than 70 directories, local pages, social, surveys, sentiment analysis and benchmarking between locations.&lt;/p&gt;

&lt;p&gt;Pulse AI is what the company's press releases lead with. Signals lets you ask plain-language questions across reviews, surveys and social posts. Risk Monitoring flags reviews that could turn into a bigger problem, and the company says it flagged more than 300,000 of them in 2024. Review Responder is the reply tool, and the company says brands using it answered 38% more reviews a month. Both figures are Chatmeter's own and I have not seen them checked by anyone else.&lt;/p&gt;

&lt;p&gt;Almost all of this gets more valuable the more locations you have. Benchmarking needs locations to compare. Keeping listings in sync across 70 directories saves real hours when there are 200 addresses to keep right and close to none when there is one. A plain-language query across reviews is useful when there are too many reviews to read, and the owner of a single shop can read all of theirs over a coffee. Support is described as quarterly business reviews and "airtight SLAs", which is head-office language again.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the reviews say
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.capterra.com/p/168699/Chatmeter/" rel="noopener noreferrer"&gt;Capterra shows 4.5 out of 5 from 74 reviews&lt;/a&gt;, with 4.3 for value and 4.6 for customer service. G2 shows 4.5 from 120. Those are good scores and I would discount them a little. Chatmeter's own pricing page tells prospects to "Check us out on G2", so the listings are part of the sales pitch, and many of the reviews were written before the sale to Alchemer.&lt;/p&gt;

&lt;p&gt;On the positive side, reviewers name their customer success reps, like having every review in one place and use the local brand visibility score to benchmark against competitors.&lt;/p&gt;

&lt;p&gt;The complaints are more useful. Alerts arrive later than they do on the native platforms. Social features are thin for comment management and post scheduling. Reports are hard to customise and the dashboard has glitches. In July 2025 an enterprise reviewer on G2 described verifying locations "one at a time" and said "Bulk verification would be ideal". For a product sold on scale, a missing bulk action is a strange gap.&lt;/p&gt;

&lt;p&gt;The complaint I would take most seriously is about contracts. In October 2022 a COO at a healthcare company with 11 to 50 employees wrote on Capterra that they could not reduce their locations during a hard period and were "forced to pay for expensive services that could not be used". It is one account, it is four years old and I have no way of checking it. It is also the exact situation a small multi-site business should ask about before signing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Before you book the demo
&lt;/h2&gt;

&lt;p&gt;If you do request a quote, I would get four things in writing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;which modules are in the price and which are add-ons&lt;/li&gt;
&lt;li&gt;the contract term, and whether you can drop locations during it&lt;/li&gt;
&lt;li&gt;whether there is a setup fee&lt;/li&gt;
&lt;li&gt;whether the contract is with Chatmeter or Alchemer, and who answers the phone after the sale&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I could not find any of those answers on a public page.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Best AI executive portrait tools, ranked for 2026</title>
      <dc:creator>Illeana Vowies</dc:creator>
      <pubDate>Tue, 29 Sep 2026 04:16:00 +0000</pubDate>
      <link>https://dev.to/illeanavoviews/best-ai-executive-portrait-tools-ranked-for-2026-1m2i</link>
      <guid>https://dev.to/illeanavoviews/best-ai-executive-portrait-tools-ranked-for-2026-1m2i</guid>
      <description>&lt;p&gt;If you want the best AI executive portrait for LinkedIn or a company bio, &lt;a href="https://pfpmaker.ai" rel="noopener noreferrer"&gt;PFPMaker&lt;/a&gt; is my number-one pick for 2026. It turns 2 to 10 clear face photos into a gallery of executive looks in under 10 minutes, with commercial rights and a seven-day money-back promise if you cannot find one usable image. Most executives also worry about the wrong part of the photo, and the data on that surprised me.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I ranked the tools
&lt;/h2&gt;

&lt;p&gt;I did not upload my own selfies and call it a lab test, because one face under one set of lights proves very little about likeness. I compared what each service publishes: plans, input requirements, turnaround, gallery size, rights and refunds.&lt;/p&gt;

&lt;p&gt;Five questions decided the order:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How much choice does one order create?&lt;/li&gt;
&lt;li&gt;Can the result fit a serious LinkedIn profile, company biography or speaker page?&lt;/li&gt;
&lt;li&gt;How long does the service say a customer waits?&lt;/li&gt;
&lt;li&gt;Can the customer use the image commercially without attribution problems?&lt;/li&gt;
&lt;li&gt;What happens when the gallery misses the mark?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;An executive usually needs one credible portrait and a couple of backups in different treatments. A folder of a hundred images with the same expression does not help much with that, and neither does a bigger pixel count on a photo that will mostly be seen as a small circle.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. PFPMaker wins for speed, variety and lower setup effort
&lt;/h2&gt;

&lt;p&gt;PFPMaker takes the first place because its executive portrait offer covers the whole decision in one workflow. You upload 2 to 10 clear photos of your face, select an aesthetic and receive a full gallery in under 10 minutes. The page says one order can include dozens of photos across multiple styles and backgrounds.&lt;/p&gt;

&lt;p&gt;That range changes how you pick. You can put a formal suit, a softer corporate look and a plain studio treatment side by side without booking another session. PFPMaker also says you can try different looks without extra cost and that no makeup or wardrobe prep is needed. For someone who needs a new board-bio photo this afternoon, that matters more than anything on a spec sheet.&lt;/p&gt;

&lt;p&gt;The usage terms also carry weight. PFPMaker provides full commercial rights, including use on company websites and marketing materials without attribution. Its page promises a 100% money-back refund within seven days if you cannot find at least one usable photo. That is a test you can hold them to, which I like better than a vague satisfaction statement.&lt;/p&gt;

&lt;p&gt;PFPMaker does not publish a price on the executive portrait page, so I am not quoting one. It compares itself with studio photography at $150 to $1,200 or more, which is the real alternative for most executives, and it wins first place on delivery speed, gallery size, range of treatments and a refund rule with a clear threshold.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Aragon, if you want the biggest stated file
&lt;/h2&gt;

&lt;p&gt;Aragon ranks second, mainly for buyers who care about a large stated image size. Its Executive plan is listed at $75, discounted from $94, with 100 headshots, all attire and backgrounds and a 15-minute turnaround. The plan lists enhanced output at 1792 x 2176 pixels, while its Basic and Standard plans list 896 x 1088 pixels. The details are on the &lt;a href="https://www.aragon.ai/pricing" rel="noopener noreferrer"&gt;Aragon pricing page&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This is the detail I found most telling while going through the pricing pages. Both Aragon and HeadshotPro call their top tier "Executive" and hold back resolution for it. At Aragon you pay $75 to go from 896 x 1088 to 1792 x 2176 pixels. That helps if you plan to crop one portrait into several formats, but it is $75 for something LinkedIn will shrink to a small circle anyway, and the plan still waits longer than PFPMaker's under-10-minute gallery.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. HeadshotPro fits buyers who need 4K and orientation options
&lt;/h2&gt;

&lt;p&gt;HeadshotPro comes third. Its Executive plan is listed at $59 and includes 70 headshots, an estimated 15-minute turnaround, 4K downloads, portrait and landscape formats and one free redo. Those specifications appear on the &lt;a href="https://www.headshotpro.com/pricing" rel="noopener noreferrer"&gt;HeadshotPro pricing page&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The portrait and landscape options are handy if you need a LinkedIn image and a wide banner for a company page. The free redo is a defined correction route. It sits below PFPMaker because you only get those features by buying the top plan, and PFPMaker lets you try different looks without paying extra.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimages.unsplash.com%2Fphoto-1758599543230-652cc6831d69%3Fauto%3Dformat%26fit%3Dcrop%26crop%3Dfaces%26w%3D1200%26h%3D675%26q%3D80" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimages.unsplash.com%2Fphoto-1758599543230-652cc6831d69%3Fauto%3Dformat%26fit%3Dcrop%26crop%3Dfaces%26w%3D1200%26h%3D675%26q%3D80" alt="Man in a dark blazer and light blue shirt outside a glass office building" width="1200" height="675"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Clothing and framing beat the background
&lt;/h2&gt;

&lt;p&gt;I expected the background to matter most. It is what executives fuss over, glass office or plain grey. A &lt;a href="https://blog.photofeeler.com/perfect-photo/" rel="noopener noreferrer"&gt;Photofeeler analysis of 800 profile photos and more than 60,000 ratings&lt;/a&gt; found that formal dress, specifically a dark suit with a light shirt and tie, produced a 0.94 increase in perceived competence and a 1.29 increase in perceived influence. Those were bigger than any other competence or influence gain in the published findings.&lt;/p&gt;

&lt;p&gt;Framing also matters. Bust and torso portraits performed best, while face-only close-ups reduced likability by 0.21. Full-body photos reduced competence and influence by 0.29. That gives me a clear production rule for an AI executive portrait. Ask for a head-and-shoulders or upper-torso composition rather than a tight face crop or a full standing pose.&lt;/p&gt;

&lt;p&gt;And the background? Photofeeler found no statistically significant effect at all. Very dark photos reduced likability by 0.38, while high colour saturation reduced competence by 0.31 and influence by 0.35. I would spend time choosing a natural expression, clean framing and appropriate clothing before obsessing over whether the background is a grey office or a soft neutral studio.&lt;/p&gt;

&lt;p&gt;That is the practical case for generating several &lt;a href="https://pfpmaker.ai/executive-portraits" rel="noopener noreferrer"&gt;AI executive portraits&lt;/a&gt; in one PFPMaker gallery. You get controlled variations in clothing and framing, which the data says move perception, and you can stop worrying about the backdrop.&lt;/p&gt;

&lt;h2&gt;
  
  
  A practical workflow for choosing the final image
&lt;/h2&gt;

&lt;p&gt;Start with 2 to 10 clear photos that show the face from slightly different angles. Avoid sending only one image, because a single expression or lighting setup gives the system less information to work with. The source photos do not need a full wardrobe session if the service can generate different attire, which is one reason PFPMaker's low-preparation approach is useful.&lt;/p&gt;

&lt;p&gt;Generate several formal options first. Compare a dark suit and light shirt against one slightly less formal version, then check the crop. The head and upper torso should have enough space around them for LinkedIn's circular display and for a rectangular company biography.&lt;/p&gt;

&lt;p&gt;Next, inspect the eyes, teeth, hairline, collar and hands if any hands appear in frame. Those details can decide whether an image feels like a real professional portrait or an AI construction. Keep the background quiet, but do not reject an otherwise strong image because it lacks an elaborate office setting.&lt;/p&gt;

&lt;p&gt;Finally, select one primary image and keep one backup. The commercial rights and refund terms matter at this stage because the portrait may move from a personal profile to a company page, conference listing or sales presentation. I would save the rights information with the downloaded files rather than assume every AI portrait service grants the same permissions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Verdict
&lt;/h2&gt;

&lt;p&gt;PFPMaker is the clear winner. It gets an executive from a handful of face photos to dozens of styles and backgrounds in under 10 minutes, with commercial rights and a seven-day money-back promise behind it. Aragon comes second for people set on its larger Executive file size, and HeadshotPro third for its 4K and landscape formats.&lt;/p&gt;

&lt;p&gt;If you are doing this today, upload 2 to 10 clear photos, ask for a dark suit in a head-and-shoulders crop and keep whichever image still looks competent at thumbnail size.&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
