<?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: Spark</title>
    <description>The latest articles on DEV Community by Spark (@spark88).</description>
    <link>https://dev.to/spark88</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%2F4068929%2Fb8011c05-7e76-46ae-ba40-671c7e82855d.jpg</url>
      <title>DEV Community: Spark</title>
      <link>https://dev.to/spark88</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/spark88"/>
    <language>en</language>
    <item>
      <title>The Indie Developer's Visibility Playbook: From Zero to Your First 100 Users</title>
      <dc:creator>Spark</dc:creator>
      <pubDate>Tue, 29 Sep 2026 11:05:12 +0000</pubDate>
      <link>https://dev.to/spark88/the-indie-developers-visibility-playbook-from-zero-to-your-first-100-users-6mo</link>
      <guid>https://dev.to/spark88/the-indie-developers-visibility-playbook-from-zero-to-your-first-100-users-6mo</guid>
      <description>&lt;p&gt;You shipped. Nobody cares. Not because the product is bad, but because 30,000+ SaaS products launch every year and yours is one drop in a fire hose.&lt;/p&gt;

&lt;p&gt;Here is the 30-day sequence that gets you to 100 users with no audience, no budget, and no spamming. Seven steps, in order, because doing them out of order is how most launches waste their one good shot.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Heads up:&lt;/strong&gt; Do not start at Product Hunt. It is an amplifier, not a foundation. Steps 1 to 5 are what it amplifies.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Step 1: Fix the foundation (Day 1)
&lt;/h2&gt;

&lt;p&gt;Your landing page has five seconds to answer three questions: what does this do, who is it for, why now.&lt;/p&gt;

&lt;p&gt;If it says "revolutionizing the paradigm of collaborative synergy" instead of "track your expenses in 30 seconds", you have already lost.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Tagline under 10 words, says what the product does&lt;/li&gt;
&lt;li&gt;[ ] Screenshot or GIF above the fold&lt;/li&gt;
&lt;li&gt;[ ] Pricing visible, even if it is free&lt;/li&gt;
&lt;li&gt;[ ] CTA says "Get started free", not "Learn more"&lt;/li&gt;
&lt;li&gt;[ ] Page loads in under 3 seconds&lt;/li&gt;
&lt;li&gt;[ ] OG meta tags set, so shared links preview properly&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 2: Directory submissions (Day 1-7)
&lt;/h2&gt;

&lt;p&gt;The single highest-ROI activity for a new product. Over 30 legitimate directories, most free, ten minutes each. Every one is a backlink, a permanent listing, and exposure to people actively shopping.&lt;/p&gt;


&lt;div&gt;
    &lt;iframe src="https://www.youtube.com/embed/QMdrxa8XH1A" width="315" height="560"&gt;
    &lt;/iframe&gt;
  &lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Start high, work down:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Directory&lt;/th&gt;
&lt;th&gt;DA&lt;/th&gt;
&lt;th&gt;Why it matters&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Hacker News (Show HN)&lt;/td&gt;
&lt;td&gt;93&lt;/td&gt;
&lt;td&gt;Technical audiences, if you have one&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Product Hunt&lt;/td&gt;
&lt;td&gt;91&lt;/td&gt;
&lt;td&gt;The gold standard, but save it for Step 6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;G2, Capterra&lt;/td&gt;
&lt;td&gt;92, 90&lt;/td&gt;
&lt;td&gt;B2B buyers with purchasing intent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Crunchbase&lt;/td&gt;
&lt;td&gt;91&lt;/td&gt;
&lt;td&gt;Credibility and investor visibility&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AlternativeTo&lt;/td&gt;
&lt;td&gt;82&lt;/td&gt;
&lt;td&gt;Appear in "[competitor] alternatives" searches&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Indie Hackers&lt;/td&gt;
&lt;td&gt;67&lt;/td&gt;
&lt;td&gt;The bootstrapped community&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BetaList&lt;/td&gt;
&lt;td&gt;65&lt;/td&gt;
&lt;td&gt;Pre-launch products&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SaaSHub&lt;/td&gt;
&lt;td&gt;56&lt;/td&gt;
&lt;td&gt;SaaS-focused, alternative positioning&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DevHunt&lt;/td&gt;
&lt;td&gt;45&lt;/td&gt;
&lt;td&gt;Developer tools&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Tip:&lt;/strong&gt; Prepare logo, tagline, short and long descriptions and screenshots ONCE, then reuse them everywhere. The full list of 35 with character limits is in &lt;a href="https://sellular.online/guides/best-directories-to-submit-your-app-2026" rel="noopener noreferrer"&gt;the directories guide&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Step 3: Write one genuinely useful article (Day 7-10)
&lt;/h2&gt;

&lt;p&gt;Not a blog post about your product. An article that solves a problem your users have &lt;em&gt;before&lt;/em&gt; they need you.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Find the problem they hit before your product is relevant&lt;/li&gt;
&lt;li&gt;Write the guide that solves it&lt;/li&gt;
&lt;li&gt;Mention your product once, where it is genuinely the answer&lt;/li&gt;
&lt;li&gt;Publish on your site, cross-post to Dev.to and Hashnode&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;What that looks like by product type:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Scheduling tool: "How to manage client bookings without losing your mind"&lt;/li&gt;
&lt;li&gt;Analytics tool: "The 5 metrics that actually matter for your SaaS"&lt;/li&gt;
&lt;li&gt;Dev tool: "What I got wrong launching my first developer tool"&lt;/li&gt;
&lt;li&gt;Marketing tool: "35 directories to submit your app to in 2026"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It works because Google indexes it, nobody feels sold to, people share useful things, and by the time a reader needs a tool like yours they have already seen your name.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Tip:&lt;/strong&gt; Always set the canonical URL to YOUR site when cross-posting. Rewrite the intro slightly per platform and use platform-appropriate tags.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Step 4: The safe outreach (Day 10-14)
&lt;/h2&gt;

&lt;p&gt;Do not cold email customers. Email the people who WRITE about tools like yours: newsletter authors, roundup bloggers, YouTube reviewers, podcast hosts.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Hi [name], I built [product] - [one sentence]. Free tier, no catch. Thought it might be useful for your readers. Here's the link: [link]. No pressure, just relevant to [specific thing they published]. Cheers.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Under 100 words. &lt;strong&gt;Five to ten per week, not fifty.&lt;/strong&gt; Publishers &lt;em&gt;want&lt;/em&gt; to discover tools, so there is no downside if they ignore you, and one mention in a 5,000-subscriber newsletter beats 500 cold emails.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5: Participate without promoting (Day 14+)
&lt;/h2&gt;

&lt;p&gt;The hardest part for builders: show up where your users are and do not talk about your product.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Answer questions genuinely, with no link in the answer&lt;/li&gt;
&lt;li&gt;Put your URL in your profile, never in comments&lt;/li&gt;
&lt;li&gt;Mention the product only when someone asks "what do you use for X?"&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Reddit (r/SideProject, r/indiehackers, r/webdev), Indie Hackers, niche Discords, Quora. One helpful comment at 50 upvotes drives more qualified traffic through your profile than 100 promotional posts that get downvoted.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 6: The launch event (Day 21-30)
&lt;/h2&gt;

&lt;p&gt;By now: 20-35 listings live, one article published, early users arriving, a few newsletter authors aware of you.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Now&lt;/strong&gt; you launch on Product Hunt.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Tuesday to Thursday, 12:01am Pacific&lt;/li&gt;
&lt;li&gt;[ ] 30-second demo GIF or video ready&lt;/li&gt;
&lt;li&gt;[ ] Genuine maker comment explaining why you built it&lt;/li&gt;
&lt;li&gt;[ ] Tagline at 60 characters or under&lt;/li&gt;
&lt;li&gt;[ ] Early users nudged to look (never say "upvote")&lt;/li&gt;
&lt;li&gt;[ ] Your whole day cleared to reply to comments&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Heads up:&lt;/strong&gt; One shot. You get one good Product Hunt launch per product, and spending it before Steps 1 to 5 are done is the most common way indie launches are wasted.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Step 7: Let the flywheel spin (Day 30+)
&lt;/h2&gt;

&lt;p&gt;More backlinks means better ranking, which means more organic traffic, which means more users, which means more word-of-mouth, which means more backlinks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Keep it turning:&lt;/strong&gt; one useful article a month, listings refreshed with new screenshots, testimonials collected and shown, comparison articles written against your alternatives.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to avoid
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Spamming communities.&lt;/strong&gt; You get banned and the stain follows the product for years&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Buying reviews.&lt;/strong&gt; Platforms detect them, and getting caught means permanent delisting&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Paying for "growth hacking".&lt;/strong&gt; $2-5K to do the afternoon described above&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Launching on Product Hunt first.&lt;/strong&gt; See Step 6&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Comparing yourself to VC-funded competitors.&lt;/strong&gt; You are not competing on ad spend, you are competing on being useful and findable&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The realistic timeline
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Week&lt;/th&gt;
&lt;th&gt;Activity&lt;/th&gt;
&lt;th&gt;Expected result&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;Directory submissions&lt;/td&gt;
&lt;td&gt;5-20 visitors/day&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;First article published and cross-posted&lt;/td&gt;
&lt;td&gt;50-500 views&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2-3&lt;/td&gt;
&lt;td&gt;Outreach to 10-15 authors&lt;/td&gt;
&lt;td&gt;1-3 mentions, 100-1000 visitors&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3-4&lt;/td&gt;
&lt;td&gt;Product Hunt launch&lt;/td&gt;
&lt;td&gt;200-2000 visitors on the day&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Month 2&lt;/td&gt;
&lt;td&gt;SEO compounds&lt;/td&gt;
&lt;td&gt;10-50 organic visitors/day&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Month 3&lt;/td&gt;
&lt;td&gt;Directories + SEO + word-of-mouth&lt;/td&gt;
&lt;td&gt;50-200 visitors/day&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Conservative numbers. One article that travels can 10x them overnight.&lt;/p&gt;

&lt;h2&gt;
  
  
  The bottom line
&lt;/h2&gt;

&lt;p&gt;No following, no ad budget, no influencer act. Just: a product that solves something, a clear landing page, 32 directory submissions (5 hours), one useful article (3 hours), a few emails to the right people (1 hour), and a well-timed launch.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Two to three weeks of part-time work. $0.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The hard part is not the execution. It is accepting that nobody owes you their attention, and acting accordingly.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;&lt;a href="https://sellular.online" rel="noopener noreferrer"&gt;Sellular&lt;/a&gt; is a free visibility toolkit for indie developers: 30+ directories pre-filled with the right character limits and submission times, plus a visibility score for what search engines and AI answer engines actually read.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://sellular.online/guides/indie-dev-visibility-playbook-first-100-users" rel="noopener noreferrer"&gt;sellular.online&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>marketing</category>
      <category>saas</category>
      <category>seo</category>
      <category>indiehackers</category>
    </item>
    <item>
      <title>Check your company accounts before Companies House does</title>
      <dc:creator>Spark</dc:creator>
      <pubDate>Mon, 21 Sep 2026 16:31:27 +0000</pubDate>
      <link>https://dev.to/spark88/check-your-company-accounts-before-companies-house-does-5c3d</link>
      <guid>https://dev.to/spark88/check-your-company-accounts-before-companies-house-does-5c3d</guid>
      <description>&lt;p&gt;&lt;em&gt;Rejected filings are almost never fraud. They are arithmetic, and the letter arrives weeks after the deadline has gone.&lt;/em&gt;&lt;/p&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;Rating&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;DuckTax&lt;/td&gt;
&lt;td&gt;4.0 / 5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FreeAgent&lt;/td&gt;
&lt;td&gt;3.5 / 5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TinyTax&lt;/td&gt;
&lt;td&gt;3.5 / 5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WeFile&lt;/td&gt;
&lt;td&gt;2.5 / 5&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Disclosure:&lt;/strong&gt; I build DuckTax, so its rating here is an interested party's. I have tried to be straight about what the others do better, and where one of them is the right choice I have said so.&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;p&gt;These four sit at different points of the same year. DuckTax is the last mile: enter your company number, it pulls your name, registered office, officers and the real filing deadline from Companies House, then validates a balance sheet built from seven figures. FreeAgent is full bookkeeping for people who want the ledger maintained continuously. TinyTax and WeFile are filing tools with an account and a subscription attached. For a dormant or micro-entity company, a full bookkeeping suite is overkill.&lt;/p&gt;

&lt;h2&gt;
  
  
  What actually separates them
&lt;/h2&gt;

&lt;p&gt;The difference that decides it is where the arithmetic runs and what it checks. DuckTax does the calculation in your browser, so the figures never leave the machine. It validates against the rules that actually cause rejections rather than simply accepting what you type. It also explains what each number means in plain English. It covers Ireland, Australia and the United States, saying plainly when a country does not require public filing at all. The subscription tools submit what you give them and let Companies House find the problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you get free
&lt;/h2&gt;

&lt;p&gt;DuckTax is &lt;strong&gt;free&lt;/strong&gt; to use, including the Companies House lookup and the validation, which is the part that prevents a rejection. FreeAgent's &lt;strong&gt;free&lt;/strong&gt; route depends on your business bank account rather than being a plan you can choose. TinyTax and WeFile both charge annually, so the &lt;strong&gt;free&lt;/strong&gt; tier is a preview of the form rather than a filing you can complete.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who should pick what
&lt;/h2&gt;

&lt;p&gt;A director of a micro-entity or dormant company should use DuckTax and check the figures before submitting anything. A business with staff, invoices and monthly reconciliation needs FreeAgent or an accountant. Someone who wants a guided form and does not mind paying yearly should look at TinyTax. WeFile suits a director who wants a person on live chat while filing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Worth knowing
&lt;/h2&gt;

&lt;p&gt;The bookkeeping suites assume you keep books all year. DuckTax assumes you have seven figures and a deadline, and it checks them in the browser.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://sellular.online/reviews/ducktax" rel="noopener noreferrer"&gt;sellular.online&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>finance</category>
      <category>saas</category>
      <category>tools</category>
    </item>
    <item>
      <title>Turn your app into a narrated demo without recording</title>
      <dc:creator>Spark</dc:creator>
      <pubDate>Mon, 21 Sep 2026 16:28:06 +0000</pubDate>
      <link>https://dev.to/spark88/turn-your-app-into-a-narrated-demo-without-recording-3ka4</link>
      <guid>https://dev.to/spark88/turn-your-app-into-a-narrated-demo-without-recording-3ka4</guid>
      <description>&lt;p&gt;&lt;em&gt;Nobody enjoys re-recording a demo because one click went wrong. One of these three never asks you to click at all.&lt;/em&gt;&lt;/p&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;Rating&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;QuickPeek&lt;/td&gt;
&lt;td&gt;4.5 / 5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Loom&lt;/td&gt;
&lt;td&gt;3.5 / 5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Synthesia&lt;/td&gt;
&lt;td&gt;3.5 / 5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Descript&lt;/td&gt;
&lt;td&gt;2.5 / 5&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Disclosure:&lt;/strong&gt; I build QuickPeek, so its rating here is an interested party's. I have tried to be straight about what the others do better, and where one of them is the right choice I have said so.&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;p&gt;All three end with a video, and they get there in completely different ways. QuickPeek walks through your product, captures the run and narrates it, so the demo is generated rather than performed. Loom is the screen recorder everyone already knows, which means a retake every time you fumble a step. Synthesia builds a polished avatar reading a script, which is lovely for a training module and strange for a product walkthrough. Retakes are the real cost here, and only one of the three removes them.&lt;/p&gt;

&lt;h2&gt;
  
  
  What actually separates them
&lt;/h2&gt;

&lt;p&gt;The split is whether an AI assistant can produce the video or only help you plan it. QuickPeek ships MCP tools, so an assistant lists what a demo can cover, generates one from a script, picks the voice. Opens the result in an editor for a trim. That turns a demo into something you ask for between two other tasks. The screen recorder still needs your hands and your voice, on the day, in one take.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you get free
&lt;/h2&gt;

&lt;p&gt;QuickPeek and Loom both have a &lt;strong&gt;free&lt;/strong&gt; tier you can live on for a while. QuickPeek's covers real generated demos rather than a watermarked sample. Loom's &lt;strong&gt;free&lt;/strong&gt; plan caps recording length and the number of videos you keep. Synthesia's &lt;strong&gt;free&lt;/strong&gt; route is a short trial video, which is enough to judge the avatars and not enough to ship with.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who should pick what
&lt;/h2&gt;

&lt;p&gt;Someone shipping an app who needs a demo on the landing page today should pick QuickPeek. A person explaining a bug to a colleague in two minutes should open Loom and stop reading here. A team producing training modules in eight languages should pick Synthesia. Anyone who dreads hearing their own voice on a recording has one obvious option of the three.&lt;/p&gt;

&lt;h2&gt;
  
  
  Worth knowing
&lt;/h2&gt;

&lt;p&gt;Loom records you doing it. Synthesia builds a presenter. QuickPeek drives the app itself and narrates what it did.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://sellular.online/reviews/quickpeek" rel="noopener noreferrer"&gt;sellular.online&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>developertools</category>
      <category>saas</category>
    </item>
    <item>
      <title>Get your app found without learning SEO first</title>
      <dc:creator>Spark</dc:creator>
      <pubDate>Mon, 21 Sep 2026 16:13:34 +0000</pubDate>
      <link>https://dev.to/spark88/get-your-app-found-without-learning-seo-first-15i</link>
      <guid>https://dev.to/spark88/get-your-app-found-without-learning-seo-first-15i</guid>
      <description>&lt;p&gt;&lt;em&gt;The audit tools all grade your page. Only one of them will go and submit it to thirty directories while you watch.&lt;/em&gt;&lt;/p&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;Rating&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Sellular&lt;/td&gt;
&lt;td&gt;4.5 / 5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Semrush&lt;/td&gt;
&lt;td&gt;4.5 / 5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SEOptimer&lt;/td&gt;
&lt;td&gt;2.5 / 5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SE Ranking&lt;/td&gt;
&lt;td&gt;3.5 / 5&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Disclosure:&lt;/strong&gt; I build Sellular, so treat its rating as the opinion of an interested party. I have tried to be straight about what the other three genuinely do better, and where they are the right choice I have said so.&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;p&gt;All four tell you why a page is invisible to search. The difference is what happens next. Sellular carries a directory kit, a submission tracker and a badge, so the finding turns into a listing. Semrush and SE Ranking are research suites built for agencies reporting to clients, and both are overkill for one person with one app. SEOptimer sits in the middle: a fast audit, a tidy PDF, and nothing that follows through.&lt;/p&gt;

&lt;h2&gt;
  
  
  What actually separates them
&lt;/h2&gt;

&lt;p&gt;The split is whether an AI assistant can do the work or only read about it. Sellular ships MCP tools, so an assistant scans a domain, pulls the visibility score, checks a product is ready to submit, records each directory submission as it lands. Generates the llms.txt file that tells other assistants what your product is. That turns a Saturday of copying the same tagline into thirty forms into a conversation. The audit suites hand back a report and leave the doing to you.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you get free
&lt;/h2&gt;

&lt;p&gt;All four let you start for nothing, but they give away different things. Sellular's &lt;strong&gt;free&lt;/strong&gt; tier covers the audit, the directory kit and one tracked product. Semrush and SE Ranking cap &lt;strong&gt;free&lt;/strong&gt; accounts at a handful of daily lookups, which runs out in an afternoon. SEOptimer's &lt;strong&gt;free&lt;/strong&gt; audit is a single page report with the fixes behind the paid plan.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who should pick what
&lt;/h2&gt;

&lt;p&gt;Someone shipping their own app and dreading the launch admin should pick Sellular and let the assistant file the listings. An agency reporting rankings to ten clients every month should pick Semrush. A freelancer who sells audits as a deliverable should pick SEOptimer for the white label reports. SE Ranking suits a small agency that wants most of Semrush for less.&lt;/p&gt;

&lt;h2&gt;
  
  
  Worth knowing
&lt;/h2&gt;

&lt;p&gt;The incumbents audit and report. Sellular audits, then does the submitting, and an assistant can drive the whole thing without you opening the dashboard.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://sellular.online/reviews/sellular" rel="noopener noreferrer"&gt;sellular.online&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>marketing</category>
      <category>saas</category>
      <category>tools</category>
    </item>
    <item>
      <title>The Indie Dev Visibility Playbook: From Zero Users to Your First 100</title>
      <dc:creator>Spark</dc:creator>
      <pubDate>Sun, 20 Sep 2026 22:08:44 +0000</pubDate>
      <link>https://dev.to/spark88/the-indie-dev-visibility-playbook-from-zero-users-to-your-first-100-e2j</link>
      <guid>https://dev.to/spark88/the-indie-dev-visibility-playbook-from-zero-users-to-your-first-100-e2j</guid>
      <description>&lt;p&gt;You shipped. Congratulations. Now comes the part nobody warned you about: nobody cares.&lt;/p&gt;

&lt;p&gt;Not because your product is bad. Because the internet is a fire hose and you're a single drop. There are 30,000+ SaaS products launched every year. Most die in obscurity - not because they aren't good, but because their builders assumed the product would sell itself.&lt;/p&gt;

&lt;p&gt;It won't. Here's what will actually get you from zero to your first 100 users without spending money, without an audience, and without being "that guy" who spams every community.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Fix the foundation (Day 1)
&lt;/h2&gt;

&lt;p&gt;Before you promote anything, make sure your house is in order.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Your landing page must answer three questions in 5 seconds:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;What does this do?&lt;/li&gt;
&lt;li&gt;Who is it for?&lt;/li&gt;
&lt;li&gt;Why should I care right now?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If your homepage says "Revolutionizing the paradigm of collaborative synergy" instead of "Track your expenses in 30 seconds", you've already lost.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Check these:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Tagline is under 10 words and says what the product does&lt;/li&gt;
&lt;li&gt;[ ] There's a screenshot or GIF above the fold&lt;/li&gt;
&lt;li&gt;[ ] Pricing is visible (even if it's free)&lt;/li&gt;
&lt;li&gt;[ ] There's a clear CTA button ("Get started free", not "Learn more")&lt;/li&gt;
&lt;li&gt;[ ] The page loads in under 3 seconds&lt;/li&gt;
&lt;li&gt;[ ] OG meta tags are set (so link previews look good when shared)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 2: Directory submissions (Day 1-7)
&lt;/h2&gt;

&lt;p&gt;This is the single highest-ROI activity for a new product. Submit to app directories.&lt;/p&gt;

&lt;p&gt;There are over 30 legitimate directories worth listing your product on, most of them free. Each submission takes 5-15 minutes and gives you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A backlink (improves your Google ranking)&lt;/li&gt;
&lt;li&gt;A permanent listing (drives traffic for years)&lt;/li&gt;
&lt;li&gt;Exposure to active buyers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Start with the highest Domain Authority directories:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Product Hunt (DA 91) - the gold standard for launches&lt;/li&gt;
&lt;li&gt;Hacker News Show HN (DA 93) - if you have a technical audience&lt;/li&gt;
&lt;li&gt;G2 (DA 92), Capterra (DA 90) - B2B buyers with purchasing intent&lt;/li&gt;
&lt;li&gt;Crunchbase (DA 91) - credibility and investor visibility&lt;/li&gt;
&lt;li&gt;AlternativeTo (DA 82) - show up when people search "[competitor] alternatives"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Then work down to niche directories:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Indie Hackers (DA 67) - bootstrapped community&lt;/li&gt;
&lt;li&gt;BetaList (DA 65) - pre-launch products&lt;/li&gt;
&lt;li&gt;DevHunt (DA 45) - developer tools&lt;/li&gt;
&lt;li&gt;SaaSHub (DA 56) - SaaS-focused&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Prepare your assets once (logo, tagline, short description, long description, screenshots) and reuse them everywhere. A directory submission tool can pre-fill these for you.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Write one genuinely useful article (Day 7-10)
&lt;/h2&gt;

&lt;p&gt;Not a blog post about your product. An article that solves a problem your target users have.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The formula:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Think about what problem your users face BEFORE they need your product&lt;/li&gt;
&lt;li&gt;Write a genuinely helpful guide solving that problem&lt;/li&gt;
&lt;li&gt;Mention your product once, naturally, where it's relevant&lt;/li&gt;
&lt;li&gt;Publish it on your own site AND cross-post to Dev.to, Hashnode, or Medium&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Examples by product type:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Built a scheduling tool? Write "How to manage client bookings without losing your mind"&lt;/li&gt;
&lt;li&gt;Built an analytics tool? Write "The 5 metrics that actually matter for your SaaS"&lt;/li&gt;
&lt;li&gt;Built a dev tool? Write "X mistakes I made launching my first developer tool"&lt;/li&gt;
&lt;li&gt;Built a marketing tool? Write "35 directories to submit your app to in 2026"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why this works:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Google indexes it (long-term organic traffic)&lt;/li&gt;
&lt;li&gt;It's not a sales pitch, so nobody feels sold to&lt;/li&gt;
&lt;li&gt;People share useful content naturally&lt;/li&gt;
&lt;li&gt;When readers need a tool like yours, they've already seen your name&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cross-posting rules:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Always set the canonical URL to YOUR site (this tells Google where the original lives)&lt;/li&gt;
&lt;li&gt;Slightly rewrite the intro for each platform&lt;/li&gt;
&lt;li&gt;Add platform-appropriate tags&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 4: The safe outreach (Day 10-14)
&lt;/h2&gt;

&lt;p&gt;You don't need to cold email potential customers. Email people who WRITE about tools like yours.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who to contact:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Newsletter authors who cover indie dev tools&lt;/li&gt;
&lt;li&gt;Bloggers who write "best tools for X" roundups&lt;/li&gt;
&lt;li&gt;YouTube creators who review dev tools&lt;/li&gt;
&lt;li&gt;Podcast hosts who interview indie founders&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What to say (under 100 words):&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Hi [name], I built [product] - [one sentence what it does]. Free tier, no catch. Thought it might be useful for your readers/viewers. Here's the link: [link]. No pressure, just thought it was relevant to [specific piece of their content you reference]. Cheers.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Why this is safe:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You're reaching out to PUBLISHERS, not random people&lt;/li&gt;
&lt;li&gt;Publishers WANT to discover new tools to write about&lt;/li&gt;
&lt;li&gt;One mention in a newsletter with 5,000 subscribers beats 500 cold emails&lt;/li&gt;
&lt;li&gt;If they ignore you, no harm done - no public backlash&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Send 5-10 of these per week. Not 50.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5: Participate without promoting (Day 14+)
&lt;/h2&gt;

&lt;p&gt;This is the hardest part for builders. You need to show up in communities and NOT talk about your product.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The rules:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Find communities where your target users hang out&lt;/li&gt;
&lt;li&gt;Answer questions genuinely (no links to your product in the answer)&lt;/li&gt;
&lt;li&gt;Put your product URL in your BIO/profile, not in comments&lt;/li&gt;
&lt;li&gt;Only mention your product when someone explicitly asks "what tools do you use for X?"&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Where to show up:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reddit (relevant subreddits - r/SideProject, r/indiehackers, r/webdev, etc.)&lt;/li&gt;
&lt;li&gt;Indie Hackers forums&lt;/li&gt;
&lt;li&gt;Discord communities for your niche&lt;/li&gt;
&lt;li&gt;Quora (answer questions related to your domain)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The math:&lt;/strong&gt; One genuinely helpful Reddit comment that gets 50 upvotes drives more qualified traffic (from people clicking your profile) than 100 promotional posts that get downvoted.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 6: The launch event (Day 21-30)
&lt;/h2&gt;

&lt;p&gt;By now you should have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;20-35 directory listings live&lt;/li&gt;
&lt;li&gt;At least one article published and cross-posted&lt;/li&gt;
&lt;li&gt;Some early users from directory traffic&lt;/li&gt;
&lt;li&gt;A few newsletter authors aware of your product&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;NOW you launch on Product Hunt.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Product Hunt launch checklist:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Launch Tuesday-Thursday at 12:01 AM Pacific&lt;/li&gt;
&lt;li&gt;[ ] Have a 30-second demo GIF or video&lt;/li&gt;
&lt;li&gt;[ ] Write a genuine "maker comment" explaining why you built it&lt;/li&gt;
&lt;li&gt;[ ] Prepare a one-line tagline (60 chars max)&lt;/li&gt;
&lt;li&gt;[ ] Ask early users to check it out on launch day (don't say "upvote")&lt;/li&gt;
&lt;li&gt;[ ] Be available ALL DAY to respond to comments&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;One shot.&lt;/strong&gt; You get one good Product Hunt launch per product. Don't waste it before you have your foundation in place.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 7: Let the flywheel spin (Day 30+)
&lt;/h2&gt;

&lt;p&gt;After 30 days, you should have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Backlinks from over 30 directories improving your Google ranking&lt;/li&gt;
&lt;li&gt;At least one article driving organic search traffic&lt;/li&gt;
&lt;li&gt;Some early users and maybe a few paying customers&lt;/li&gt;
&lt;li&gt;A Product Hunt launch giving you a traffic spike&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now the flywheel kicks in:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;More backlinks = better Google ranking&lt;/li&gt;
&lt;li&gt;Better ranking = more organic traffic&lt;/li&gt;
&lt;li&gt;More traffic = more users&lt;/li&gt;
&lt;li&gt;More users = more word-of-mouth&lt;/li&gt;
&lt;li&gt;More word-of-mouth = more backlinks&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Keep the flywheel going by:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Publishing one useful article per month&lt;/li&gt;
&lt;li&gt;Updating your directory listings with new features/screenshots&lt;/li&gt;
&lt;li&gt;Collecting and showcasing user testimonials&lt;/li&gt;
&lt;li&gt;Writing comparison articles (your product vs. alternatives)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What to avoid
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Don't spam communities.&lt;/strong&gt; You'll get banned, and the stain follows you. One bad reputation incident can haunt an indie product for years.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Don't buy fake reviews.&lt;/strong&gt; Platforms detect them. Getting caught means permanent delisting.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Don't pay for "PR" or "growth hacking" services.&lt;/strong&gt; Most charge $2-5K and do exactly what you can do yourself for free.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Don't launch on Product Hunt first.&lt;/strong&gt; Build your foundation first. PH is an amplifier, not a foundation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Don't compare yourself to VC-funded competitors.&lt;/strong&gt; You're not competing on ad spend. You're competing on being genuinely useful and easy to find.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The realistic timeline
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Week&lt;/th&gt;
&lt;th&gt;Activity&lt;/th&gt;
&lt;th&gt;Expected result&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;Directory submissions (all 35)&lt;/td&gt;
&lt;td&gt;5-20 visitors/day from directory traffic&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Publish + cross-post first article&lt;/td&gt;
&lt;td&gt;Additional 50-500 views depending on platform&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2-3&lt;/td&gt;
&lt;td&gt;Outreach to 10-15 newsletter authors&lt;/td&gt;
&lt;td&gt;1-3 mentions = 100-1000 visitors&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3-4&lt;/td&gt;
&lt;td&gt;Product Hunt launch&lt;/td&gt;
&lt;td&gt;200-2000 visitors on launch day&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Month 2&lt;/td&gt;
&lt;td&gt;SEO starts compounding&lt;/td&gt;
&lt;td&gt;10-50 organic visitors/day&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Month 3&lt;/td&gt;
&lt;td&gt;Directory + SEO + word-of-mouth&lt;/td&gt;
&lt;td&gt;50-200 visitors/day&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These are conservative numbers. One viral Dev.to article can 10x these figures overnight.&lt;/p&gt;

&lt;h2&gt;
  
  
  The bottom line
&lt;/h2&gt;

&lt;p&gt;Getting your first 100 users doesn't require a following, an ad budget, or being an influencer. It requires:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A product that actually solves a problem&lt;/li&gt;
&lt;li&gt;A clear landing page&lt;/li&gt;
&lt;li&gt;35 directory submissions (6 hours of work)&lt;/li&gt;
&lt;li&gt;One genuinely useful article (3 hours of work)&lt;/li&gt;
&lt;li&gt;A few emails to the right people (1 hour)&lt;/li&gt;
&lt;li&gt;A well-timed Product Hunt launch (1 day)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Total time investment: roughly 2-3 weeks of part-time work. Total cost: $0.&lt;/p&gt;

&lt;p&gt;The hardest part isn't the execution. It's accepting that nobody owes you their attention and acting accordingly.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Need help with directory submissions? &lt;a href="https://sellular.online" rel="noopener noreferrer"&gt;Sellular&lt;/a&gt; is a free visibility toolkit that helps indie developers submit to over 30 curated directories with pre-filled forms, domain authority scores, and optimal submission timing.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://sellular.online/guides/indie-dev-visibility-playbook-first-100-users" rel="noopener noreferrer"&gt;sellular.online&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>marketing</category>
      <category>saas</category>
      <category>seo</category>
      <category>indiehackers</category>
    </item>
    <item>
      <title>12 Free Tools Every Indie Developer Needs for Marketing (2026)</title>
      <dc:creator>Spark</dc:creator>
      <pubDate>Sun, 20 Sep 2026 22:06:11 +0000</pubDate>
      <link>https://dev.to/spark88/12-free-tools-every-indie-developer-needs-for-marketing-2026-2p9e</link>
      <guid>https://dev.to/spark88/12-free-tools-every-indie-developer-needs-for-marketing-2026-2p9e</guid>
      <description>&lt;p&gt;You are a developer, not a marketer. You would rather write code than write ad copy. The problem is that a great product with no distribution loses to a mediocre one with some. Every time.&lt;/p&gt;

&lt;p&gt;Every tool below is free to start. &lt;strong&gt;Eight of the twelve I built myself&lt;/strong&gt;, because I ship a lot of small products and none of the free options did the job without a watermark or a subscription. They are marked, so you can weigh that however you like. The other four are free because their owners can afford it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Make the assets (before you promote anything)
&lt;/h2&gt;

&lt;p&gt;Every directory, store page and launch post wants the same five things: an icon, screenshots, a short description, a long one, and a demo video. Make them once.&lt;/p&gt;

&lt;h3&gt;
  
  
  PicLet
&lt;/h3&gt;

&lt;p&gt;Remove backgrounds, replace colours, add borders, generate icons and store assets. Nothing is uploaded, so it runs on your machine and your unreleased screenshots stay there.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use it for:&lt;/strong&gt; app icons at every size a store asks for, and the 1366x768 screenshots the B2B directories insist on. &lt;strong&gt;Free, no account.&lt;/strong&gt; &lt;a href="https://piclet.app" rel="noopener noreferrer"&gt;piclet.app&lt;/a&gt; &lt;em&gt;(mine)&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  QuickPeek
&lt;/h3&gt;

&lt;p&gt;Turn any website into a demo video with AI narration, smooth animations and correct timing, in under two minutes. Point it at your own URL and it writes the walkthrough.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use it for:&lt;/strong&gt; the &lt;code&gt;videoUrl&lt;/code&gt; field that Product Hunt, G2 and Capterra all have and most indie listings leave empty. &lt;strong&gt;Free tier.&lt;/strong&gt; &lt;a href="https://quickpeek.co" rel="noopener noreferrer"&gt;quickpeek.co&lt;/a&gt; &lt;em&gt;(mine)&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Vidlet
&lt;/h3&gt;

&lt;p&gt;Auto-captions, compression, voice cleanup and 15+ other video tools. Nothing leaves your device. It is the CapCut replacement for people who do not want a subscription.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use it for:&lt;/strong&gt; cutting the QuickPeek demo into vertical shorts with burnt-in captions, which is the only format that travels on TikTok, Reels and YouTube Shorts. &lt;strong&gt;Free.&lt;/strong&gt; &lt;a href="https://vidlet.app" rel="noopener noreferrer"&gt;vidlet.app&lt;/a&gt; &lt;em&gt;(mine)&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Canva
&lt;/h3&gt;

&lt;p&gt;For the one job the above do not: a poster, a carousel, an OG image with real typography.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Free tier:&lt;/strong&gt; 250,000+ templates and 5GB storage. &lt;a href="https://canva.com" rel="noopener noreferrer"&gt;canva.com&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Get found
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Sellular
&lt;/h3&gt;

&lt;p&gt;Pre-fills your app across 30+ curated directories with each one's character limits, screenshot dimensions and best submission time, and scores your site on the 18 signals search engines and AI answer engines actually read.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use it for:&lt;/strong&gt; the single highest-ROI afternoon available to a new product. Every listing is a permanent backlink. &lt;strong&gt;Free tier:&lt;/strong&gt; 5 listings, Chrome auto-fill, visitor analytics, plus &lt;a href="https://sellular.online/roast" rel="noopener noreferrer"&gt;Roast My Landing Page&lt;/a&gt; (paste a URL, get a Lighthouse-backed critique, no signup) and an auto-updating &lt;a href="https://sellular.online" rel="noopener noreferrer"&gt;visibility badge&lt;/a&gt; for your README. &lt;a href="https://sellular.online" rel="noopener noreferrer"&gt;sellular.online&lt;/a&gt; &lt;em&gt;(mine)&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Dev.to
&lt;/h3&gt;

&lt;p&gt;A million developers, and Google indexes it within a day. Cross-post your articles here with &lt;code&gt;canonical_url&lt;/code&gt; pointing back at your site, so the SEO credit goes home.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Free.&lt;/strong&gt; There is no paid tier for writers. &lt;a href="https://dev.to"&gt;dev.to&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Hashnode
&lt;/h3&gt;

&lt;p&gt;A second developer audience for the same article, with the same canonical trick.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Read this before you rely on it:&lt;/strong&gt; I cross-posted these three guides there and its auto-moderation archived all three inside an hour, with a note saying marketing-shaped writing is discouraged on free &lt;code&gt;*.hashnode.dev&lt;/code&gt; subdomains and pointing at Hashnode Pro. Dev.to took the identical text without a murmur. Treat Hashnode as a bonus, not a plan.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Free tier:&lt;/strong&gt; blog, newsletter, analytics. The custom domain is Pro. &lt;a href="https://hashnode.com" rel="noopener noreferrer"&gt;hashnode.com&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep the drum beating
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Viral Cat
&lt;/h3&gt;

&lt;p&gt;Finds content worth posting and auto-posts to YouTube, TikTok, Instagram and four more platforms on a schedule.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use it for:&lt;/strong&gt; the follow-through nobody manages by hand. One demo video becomes six weeks of posts. &lt;strong&gt;Free tier.&lt;/strong&gt; &lt;a href="https://viral-cat.com" rel="noopener noreferrer"&gt;viral-cat.com&lt;/a&gt; &lt;em&gt;(mine)&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Bottled
&lt;/h3&gt;

&lt;p&gt;Professional email on your own domain, with an API when you need one. Start collecting addresses on day one: it is the only channel you own.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Free to start.&lt;/strong&gt; &lt;a href="https://bottled.email" rel="noopener noreferrer"&gt;bottled.email&lt;/a&gt; &lt;em&gt;(mine)&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Google Search Console
&lt;/h3&gt;

&lt;p&gt;Shows which searches already almost rank you, position 8 to 20. That list is your content calendar; you do not need keyword research beyond it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Free.&lt;/strong&gt; &lt;a href="https://search.google.com/search-console" rel="noopener noreferrer"&gt;search.google.com/search-console&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  When it works, be ready
&lt;/h2&gt;

&lt;h3&gt;
  
  
  SparkStack
&lt;/h3&gt;

&lt;p&gt;The full-stack Next.js starter I use for every one of these. Auth, database, payments and SEO wired up, so the next product starts at the interesting part.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Free and open.&lt;/strong&gt; &lt;a href="https://sparkstack.dev" rel="noopener noreferrer"&gt;sparkstack.dev&lt;/a&gt; &lt;em&gt;(mine)&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  SparkPay
&lt;/h3&gt;

&lt;p&gt;Checkout, subscriptions, invoices, webhooks, coupons and referrals, with no Stripe SDK in your code. One deploy covers every app you own.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use it for:&lt;/strong&gt; the day someone actually wants to pay you, which is a bad day to start reading payment docs. &lt;a href="https://sparkpay.dev" rel="noopener noreferrer"&gt;sparkpay.dev&lt;/a&gt; &lt;em&gt;(mine)&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The order to do it in
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Assets&lt;/strong&gt; with PicLet, QuickPeek and Vidlet. One afternoon.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Submit&lt;/strong&gt; to 30+ directories with Sellular. Another afternoon, and the backlinks compound for years.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Write one genuinely useful article&lt;/strong&gt;, publish on your own site, cross-post to Dev.to and Hashnode with the canonical set.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Schedule&lt;/strong&gt; the demo clips through Viral Cat so you are not posting manually at midnight.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Measure&lt;/strong&gt; in Search Console, and write the next article about whatever sits at position 11.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Total cost: nothing. Total time: about a week of evenings.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is deliberately not on this list
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Social schedulers you pay for.&lt;/strong&gt; You have no audience yet. Fix discovery first.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Paid ads.&lt;/strong&gt; Not until you know which page converts. You will burn the budget learning targeting.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PR and growth-hacking retainers.&lt;/strong&gt; They charge thousands to do the afternoon described above.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CRMs.&lt;/strong&gt; A spreadsheet is fine until you have more leads than rows you can read.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI article generators.&lt;/strong&gt; They write forgettable prose that ranks like it. Write from what you actually shipped.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;&lt;a href="https://sellular.online" rel="noopener noreferrer"&gt;Sellular&lt;/a&gt; is a free visibility toolkit for indie developers: 30+ directories pre-filled, AI competitor reviews, and a visibility score that checks what search engines and AI answer engines read.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://sellular.online/guides/free-tools-indie-developer-marketing-2026" rel="noopener noreferrer"&gt;sellular.online&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>marketing</category>
      <category>saas</category>
      <category>seo</category>
      <category>indiehackers</category>
    </item>
    <item>
      <title>35 Best Directories to Submit Your App in 2026 (With Domain Authority Scores)</title>
      <dc:creator>Spark</dc:creator>
      <pubDate>Sun, 20 Sep 2026 22:01:34 +0000</pubDate>
      <link>https://dev.to/spark88/35-best-directories-to-submit-your-app-in-2026-with-domain-authority-scores-32k6</link>
      <guid>https://dev.to/spark88/35-best-directories-to-submit-your-app-in-2026-with-domain-authority-scores-32k6</guid>
      <description>&lt;p&gt;You built something great. Now nobody knows it exists.&lt;/p&gt;

&lt;p&gt;That's the reality for most indie developers. You spend months building, ship a solid product, and then realize that "build it and they will come" is the biggest lie in tech.&lt;/p&gt;

&lt;p&gt;Directory submissions are the lowest-effort, highest-ROI marketing activity for indie devs. Each submission takes 5-15 minutes, gives you a backlink (some dofollow from DA 90+ sites), and puts your product in front of buyers who are actively looking for tools like yours.&lt;/p&gt;

&lt;p&gt;I've compiled every directory worth submitting to in 2026, ranked by Domain Authority. DA matters because higher-DA backlinks signal Google that your site is legitimate, which improves your own search rankings over time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tier 1: The heavyweights (DA 80+)
&lt;/h2&gt;

&lt;p&gt;These directories have massive organic traffic and carry real SEO weight. Submit here first.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Hacker News - Show HN (DA 93)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;URL:&lt;/strong&gt; news.ycombinator.com/submit&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best time:&lt;/strong&gt; Monday-Friday, 8-10 AM ET&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Format:&lt;/strong&gt; Title must be "Show HN: [Name] - [Tagline]" (80 char limit)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tips:&lt;/strong&gt; No logo upload. Text post optional but recommended. Dev-focused audience that values technical depth over polish. Don't post the same product twice unless it's substantially different.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Product Hunt (DA 91)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;URL:&lt;/strong&gt; producthunt.com/launch&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best time:&lt;/strong&gt; Tuesday-Thursday, 12:01 AM PT&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Format:&lt;/strong&gt; Name, tagline (60 chars), description (260 chars), logo, screenshots, optional video&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tips:&lt;/strong&gt; GIFs in the gallery get significantly more engagement than static images. Add a Loom or YouTube demo link. You get ONE good launch per product - don't waste it before you're ready.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Crunchbase (DA 91)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;URL:&lt;/strong&gt; crunchbase.com/add-new&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best time:&lt;/strong&gt; Weekdays&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Format:&lt;/strong&gt; Name, URL, description (500 chars), logo, category&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tips:&lt;/strong&gt; Free basic profile. High-authority dofollow backlink. Useful for credibility even if you're a solo founder. Add milestones and team info to look established.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. G2 (DA 92)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;URL:&lt;/strong&gt; sell.g2.com/create-a-profile&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best time:&lt;/strong&gt; Weekdays (3-5 business day review)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Format:&lt;/strong&gt; Name, URL, description (500 chars), logo, category, pricing, screenshots (1366x768)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tips:&lt;/strong&gt; Reviews are heavily weighted in rankings. Once listed, actively collect user reviews. Gartner-owned, high buyer intent traffic.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. Capterra (DA 90)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;URL:&lt;/strong&gt; capterra.com/vendors/&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best time:&lt;/strong&gt; Weekdays&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Format:&lt;/strong&gt; Name, URL, description (1000 chars), logo, category, pricing, screenshots (1366x768), video URL&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tips:&lt;/strong&gt; Also Gartner-owned. Free basic listing. Add a YouTube demo link for better visibility. B2B buyers use this for shortlisting.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  6. SourceForge (DA 88)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;URL:&lt;/strong&gt; sourceforge.net/software/vendors/new&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best time:&lt;/strong&gt; Weekdays&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Format:&lt;/strong&gt; Name, URL, description (1000 chars), logo, category, screenshots (1280x720)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tips:&lt;/strong&gt; Legacy platform but massive DA. Great purely for the SEO backlink. B2B discovery traffic is a bonus.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  7. AlternativeTo (DA 82)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;URL:&lt;/strong&gt; alternativeto.net (sign in first, then use the site's own "Add application" flow)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best time:&lt;/strong&gt; Weekdays, EU/US daytime&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Format:&lt;/strong&gt; Name, URL, description (500 chars), category, tags&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tips:&lt;/strong&gt; Community-driven, and submission requires a free account, so there is no direct submit link to bookmark. The real power move is adding your product as an alternative to popular competitors. You show up whenever someone searches "[competitor] alternatives".&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  8. GetApp (DA 82)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;URL:&lt;/strong&gt; getapp.com/vendors/&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best time:&lt;/strong&gt; Weekdays&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Format:&lt;/strong&gt; Name, URL, description (1000 chars), logo, category, pricing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tips:&lt;/strong&gt; Another Gartner property. Free basic listing. Moderated.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Tier 2: Strong directories (DA 50-79)
&lt;/h2&gt;

&lt;p&gt;Good traffic, solid backlinks, and engaged audiences. These compound over time.&lt;/p&gt;

&lt;h3&gt;
  
  
  9. Wellfound / AngelList (DA 75)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;URL:&lt;/strong&gt; wellfound.com/recruit/overview&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best time:&lt;/strong&gt; Weekdays, US hours&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Format:&lt;/strong&gt; Name, URL, tagline (80 chars), description (500 chars), logo, category&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tips:&lt;/strong&gt; Strong dofollow backlink. Company profile doubles as a hiring page.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  10. StackShare (DA 72)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;URL:&lt;/strong&gt; stackshare.io/vendors&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best time:&lt;/strong&gt; Tuesday-Thursday, US business hours&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Format:&lt;/strong&gt; Name, URL, description (300 chars), logo, category&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tips:&lt;/strong&gt; Best for developer tools and infrastructure. Claim your listing via the vendor portal.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  11. TrustRadius (DA 72)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;URL:&lt;/strong&gt; trustradius.com/vendors&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best time:&lt;/strong&gt; Weekdays&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Format:&lt;/strong&gt; Name, URL, description (1000 chars), logo, category, pricing, screenshots (1366x768)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tips:&lt;/strong&gt; B2B buyer trust platform. Reviews are gated and verified, which means they carry more weight than open platforms.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  12. Indie Hackers (DA 67)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;URL:&lt;/strong&gt; indiehackers.com/products/new&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best time:&lt;/strong&gt; Weekdays, US hours&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Format:&lt;/strong&gt; Name, URL, tagline (80 chars), description (500 chars)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tips:&lt;/strong&gt; THE community for bootstrapped products. Post revenue milestones and updates as separate posts to stay visible. Community engagement matters.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  13. Slant (DA 66) - down
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;URL:&lt;/strong&gt; &lt;del&gt;slant.co/improve&lt;/del&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Status:&lt;/strong&gt; The origin server has been unreachable behind Cloudflare (error 526)
since September 2026. Nothing to submit to while that lasts. It was
comparison-focused, so AlternativeTo below fills the same slot.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  14. BetaList (DA 65)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;URL:&lt;/strong&gt; betalist.com/submit&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best time:&lt;/strong&gt; Monday-Wednesday morning&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Format:&lt;/strong&gt; Name, URL, tagline (60 chars), description (300 chars), logo, category&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tips:&lt;/strong&gt; Best for pre-launch or beta products. Free queue takes 2-3 weeks. $129 fast-track option. Great for building an early waitlist.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  15. GoodFirms (DA 64)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;URL:&lt;/strong&gt; goodfirms.co/add-product&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best time:&lt;/strong&gt; Weekdays&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Format:&lt;/strong&gt; Name, URL, description (500 chars), logo, category, pricing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tips:&lt;/strong&gt; B2B software review platform. Free listing with moderation. Good for lead generation from buyer-intent searches.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  16. There's An AI For That (DA 62)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;URL:&lt;/strong&gt; theresanaiforthat.com/get-featured/&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best time:&lt;/strong&gt; Weekdays, morning US&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Format:&lt;/strong&gt; Name, URL, tagline (80 chars), description (300 chars), category, pricing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tips:&lt;/strong&gt; Largest AI directory. Only relevant if your product has AI features. Paid submission ($347) or free via their monthly thread.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  17. Futurepedia (DA 58) - paid only
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;URL:&lt;/strong&gt; futurepedia.io/submit-tool&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Status:&lt;/strong&gt; Not a free listing. The submission page reads as an ordinary
sign-in-gated form and is not one: when it was last measured the tiers were
$247 basic (sold out) and $497 verified. Check the current figure on their own
page before paying, and treat any free-submission write-up as out of date.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tips:&lt;/strong&gt; AI tools directory with 400K+ monthly visitors, so it may be worth the
spend if your product is AI-related. It is excluded from the Sellular kit for
this reason, so nothing here will pre-fill it.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  18. SaaSHub (DA 56)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;URL:&lt;/strong&gt; saashub.com/services/submit&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best time:&lt;/strong&gt; Weekdays, morning US&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Format:&lt;/strong&gt; Name, URL, tagline (80 chars), description (500 chars), logo, category, pricing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tips:&lt;/strong&gt; SaaS-focused. Good for "alternative to" positioning. Free listing.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  19. Startup Stash (DA 55)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;URL:&lt;/strong&gt; startupstash.com/add-listing/&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best time:&lt;/strong&gt; Weekdays&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Format:&lt;/strong&gt; Name, URL, description (500 chars), logo, category, pricing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tips:&lt;/strong&gt; Curated directory of startup resources and tools. Free listing.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  20. Toolify.ai (DA 55)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;URL:&lt;/strong&gt; toolify.ai/submit&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best time:&lt;/strong&gt; Weekdays, morning US/EU&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Format:&lt;/strong&gt; Name, URL, tagline (80 chars), description (500 chars), logo, category, pricing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tips:&lt;/strong&gt; One of the largest AI directories with 500K+ monthly visitors. Free submission with editorial review. Only for AI products.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  21. Software Suggest (DA 55)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;URL:&lt;/strong&gt; softwaresuggest.com/vendors&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best time:&lt;/strong&gt; Weekdays&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Format:&lt;/strong&gt; Name, URL, description (500 chars), logo, category, pricing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tips:&lt;/strong&gt; B2B software discovery with buyer-intent traffic. Free vendor listing.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  22. AlternativeMe (DA 52)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;URL:&lt;/strong&gt; alternative.me/how-to/submit-software/&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best time:&lt;/strong&gt; Weekdays&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Format:&lt;/strong&gt; Name, URL, description (500 chars), category&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tips:&lt;/strong&gt; Similar to AlternativeTo. Position your product against competitors to appear in comparison searches.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  23. SaaSWorthy (DA 51)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;URL:&lt;/strong&gt; saasworthy.com/offerings&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best time:&lt;/strong&gt; Weekdays&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Format:&lt;/strong&gt; Name, URL, description (500 chars), logo, category, pricing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tips:&lt;/strong&gt; Free listing. Moderated. Keep your profile updated.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Tier 3: Indie and niche directories (DA 30-49)
&lt;/h2&gt;

&lt;p&gt;Smaller audiences but highly targeted. These are YOUR people - indie devs, builders, hackers.&lt;/p&gt;

&lt;h3&gt;
  
  
  24. DevHunt (DA 45)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;URL:&lt;/strong&gt; devhunt.org&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best time:&lt;/strong&gt; Monday-Thursday, morning US/EU&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Format:&lt;/strong&gt; Name, URL, tagline (60 chars), description (300 chars), logo&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tips:&lt;/strong&gt; Dev tools launchpad. Requires GitHub login. Submissions via GitHub PR. Community voting. Relaunch allowed for major updates.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  25. SideProjectors (DA 45)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;URL:&lt;/strong&gt; sideprojectors.com/project/submit&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best time:&lt;/strong&gt; Weekdays, morning US&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Format:&lt;/strong&gt; Name, URL, tagline (100 chars), description (1000 chars), logo, category&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tips:&lt;/strong&gt; Also a marketplace for buying/selling side projects. Account required.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  26. OpenAlternative (DA 42)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;URL:&lt;/strong&gt; openalternative.co/submit&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best time:&lt;/strong&gt; Weekdays&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Format:&lt;/strong&gt; Name, URL, description (300 chars), category&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tips:&lt;/strong&gt; Open-source alternative directory. Best if your product is open source or has a generous free tier. Dev-focused.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  27. LaunchingNext (DA 42)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;URL:&lt;/strong&gt; launchingnext.com/submit/&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best time:&lt;/strong&gt; Monday-Wednesday&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Format:&lt;/strong&gt; Name, URL, tagline (80 chars), description (500 chars), logo, category&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tips:&lt;/strong&gt; Free submission. Startup-focused. Moderated.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  28. PitchWall (DA 41)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;URL:&lt;/strong&gt; pitchwall.co/submit&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best time:&lt;/strong&gt; Monday-Wednesday, morning&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Format:&lt;/strong&gt; Name, URL, tagline (60 chars), description (400 chars), logo, category&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tips:&lt;/strong&gt; Free submission. Beta/early-stage focused. Good for very early products.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  29. Uneed (DA 40)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;URL:&lt;/strong&gt; uneed.best/submit-a-tool&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best time:&lt;/strong&gt; Early week for best exposure&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Format:&lt;/strong&gt; Name, URL, tagline (60 chars), description (300 chars), logo&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tips:&lt;/strong&gt; Daily launches. Free queue or $29.99 to skip. Includes a DR 74 dofollow backlink and exposure to 11K newsletter subscribers.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  30. ToolFinder (DA 38)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;URL:&lt;/strong&gt; toolfinder.com/submit&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best time:&lt;/strong&gt; Weekdays, morning US&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Format:&lt;/strong&gt; Name, URL, tagline (80 chars), description (300 chars), logo, category, pricing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tips:&lt;/strong&gt; AI and SaaS tool directory. Free listing.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  31. Launched (DA 36) - defunct
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;URL:&lt;/strong&gt; &lt;del&gt;launched.io/SubmitStartup&lt;/del&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Status:&lt;/strong&gt; The domain no longer resolves as of August 2026. Skip it and spend
the slot on Uneed or MicroLaunch instead.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  32. StartupBuffer (DA 35)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;URL:&lt;/strong&gt; startupbuffer.com/site/submit&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best time:&lt;/strong&gt; Monday-Wednesday&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Format:&lt;/strong&gt; Name, URL, tagline (80 chars), description (500 chars), logo&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tips:&lt;/strong&gt; Free submission. Startup-focused.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  33. MicroLaunch (DA 35)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;URL:&lt;/strong&gt; microlaunch.net/premium&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best time:&lt;/strong&gt; Monday-Wednesday for community votes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Format:&lt;/strong&gt; Name, URL, tagline (60 chars), description (300 chars), logo&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tips:&lt;/strong&gt; Indie-focused micro launches. Community voting. Premium option available.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  34. Fazier (DA 35)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;URL:&lt;/strong&gt; fazier.com/submit&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best time:&lt;/strong&gt; Monday-Thursday&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Format:&lt;/strong&gt; Name, URL, tagline (60 chars), description (300 chars), logo&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tips:&lt;/strong&gt; Product Hunt alternative with a growing community. Free launch with upvoting system.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  35. 1000.tools (DA 30) - down
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;URL:&lt;/strong&gt; &lt;del&gt;1000.tools/my/tools/create&lt;/del&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Status:&lt;/strong&gt; The site removed its submission path (404) and no submit link remains
on the homepage, as of September 2026. Spend the slot on Uneed or Fazier instead.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The submission strategy
&lt;/h2&gt;

&lt;p&gt;Don't just blast all 35 in one afternoon. Here's the order that maximizes impact:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Week 1:&lt;/strong&gt; Tier 1 directories (DA 80+). These take the longest to approve but carry the most SEO weight.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Week 2:&lt;/strong&gt; Tier 2 directories (DA 50-79). Good balance of authority and speed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Week 3:&lt;/strong&gt; Tier 3 directories (DA 30-49). Fast approvals, targeted audiences.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;After submission:&lt;/strong&gt; Track which directories actually send traffic. Double down on those. Update your listings monthly with fresh screenshots, updated descriptions, and new features.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you'll need before you start
&lt;/h2&gt;

&lt;p&gt;Prepare these assets once and reuse them across all 35:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;App name&lt;/strong&gt; and &lt;strong&gt;URL&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tagline&lt;/strong&gt; (keep it under 60 characters for maximum compatibility)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Short description&lt;/strong&gt; (300 characters - fits every directory)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Long description&lt;/strong&gt; (500-1000 characters - for directories that allow it)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Logo&lt;/strong&gt; (square, at least 512x512px, PNG with transparent background)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Screenshots&lt;/strong&gt; (1366x768 for B2B directories, 1270x760 for Product Hunt)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Demo video URL&lt;/strong&gt; (YouTube or Loom, under 2 minutes)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pricing info&lt;/strong&gt; (even if it's "Free with paid plans")&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Category tags&lt;/strong&gt; (SaaS, Developer Tools, Marketing, AI)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Or use a directory submission tool like &lt;a href="https://sellular.online" rel="noopener noreferrer"&gt;Sellular&lt;/a&gt; that pre-fills these fields across every directory in its catalogue and tells you exactly what each one requires.&lt;/p&gt;

&lt;h2&gt;
  
  
  The math
&lt;/h2&gt;

&lt;p&gt;Three of the 35 above are down, so 32 are actually submittable. Average submission&lt;br&gt;
time: 10 minutes each. Total time: roughly 5 hours.&lt;/p&gt;

&lt;p&gt;In exchange, you get:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;32 backlinks (some dofollow from DA 90+ sites)&lt;/li&gt;
&lt;li&gt;Permanent listings that drive traffic for years&lt;/li&gt;
&lt;li&gt;SEO authority that improves your Google ranking for every page on your site&lt;/li&gt;
&lt;li&gt;Direct exposure to millions of monthly visitors across these platforms&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Five hours of work for years of compounding returns. There is no marketing activity with a better ROI for indie developers.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Have a product that needs visibility? &lt;a href="https://sellular.online" rel="noopener noreferrer"&gt;Sellular&lt;/a&gt; is a free toolkit that helps indie developers submit to over 30 curated directories, the ones listed above among them, with pre-filled forms, character limits, and optimal submission timing built in.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://sellular.online/guides/best-directories-to-submit-your-app-2026" rel="noopener noreferrer"&gt;sellular.online&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>marketing</category>
      <category>saas</category>
      <category>seo</category>
      <category>indiehackers</category>
    </item>
    <item>
      <title>NHS Jobs will not let you upload a CV, and that changes all the advice</title>
      <dc:creator>Spark</dc:creator>
      <pubDate>Sun, 20 Sep 2026 17:21:09 +0000</pubDate>
      <link>https://dev.to/spark88/nhs-jobs-will-not-let-you-upload-a-cv-and-that-changes-all-the-advice-2jg6</link>
      <guid>https://dev.to/spark88/nhs-jobs-will-not-let-you-upload-a-cv-and-that-changes-all-the-advice-2jg6</guid>
      <description>&lt;p&gt;If you are applying for a developer role at NHS England, an NHS trust, or through the Civil Service, the CV you spent a weekend polishing is not going to be read. Not because it is bad. Because there is nowhere to put it.&lt;/p&gt;

&lt;p&gt;NHS Jobs states it in their own help article, in one sentence: "You cannot upload your CV to NHS Jobs service."&lt;/p&gt;

&lt;p&gt;That page has been viewed just over six thousand times at the time of writing, which tells you roughly how many people discover this at the worst possible moment.&lt;/p&gt;

&lt;h2&gt;
  
  
  It is stricter than "no upload"
&lt;/h2&gt;

&lt;p&gt;There is a second option that sounds like a reprieve and is not.&lt;/p&gt;

&lt;p&gt;When an employer posts a vacancy, they can allow applicants to apply using an online application form or a "CV application". If they pick the CV route, you still do not attach a file. You copy and paste the contents of your CV into a mandatory section, next to these, which are required either way:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Contact details&lt;/li&gt;
&lt;li&gt;Right to work status&lt;/li&gt;
&lt;li&gt;Your CV, as typed text&lt;/li&gt;
&lt;li&gt;Unspent criminal convictions and cautions&lt;/li&gt;
&lt;li&gt;Guaranteed interview scheme questions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So the "CV application" is still a form. There is no path through NHS Jobs that accepts a document. Civil Service is a different system with the same shape of problem: Success Profiles, written statements of around 250 words per behaviour, frequently blind sifted so the reviewer sees neither your name nor your employer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this breaks the advice you have been given
&lt;/h2&gt;

&lt;p&gt;Nearly all job hunting advice aimed at developers assumes an applicant tracking system. Get the keywords in, keep the formatting machine readable, run it through a free checker, upload, move on. That advice is fine, and several of those checkers are genuinely good.&lt;/p&gt;

&lt;p&gt;None of it applies here. These applications are scored by a person against a published person specification, criterion by criterion.&lt;/p&gt;

&lt;p&gt;What actually changes:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Keyword density does nothing.&lt;/strong&gt; A human is checking whether you evidenced each listed criterion. Evidence, not vocabulary. Salting your application with terms from the advert is at best neutral and at worst reads as padding to someone who has sifted two hundred of these.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Your employer's name does nothing under a blind sift.&lt;/strong&gt; "Senior engineer at a company you have heard of" is exactly as persuasive as the same sentence with the company removed, because the company is removed. Everything has to be carried by what you did.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The marking scheme is published in advance.&lt;/strong&gt; That is the genuinely good news, and most applicants waste it. The person specification lists essential and desirable criteria. Answer them in the order they are printed and you have made the sifter's job trivial. Answer them in your own preferred order and you have made them hunt for points they are allowed to award you zero for not finding.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The real cost is retyping.&lt;/strong&gt; Every trust runs its own recruitment. Apply to ten and you will type the same employment history, the same dates, the same referees, the same right to work answers into ten fresh sets of boxes. This is where the hours actually go, and it is not the interesting part of applying for a job.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I built, and what it does not do
&lt;/h2&gt;

&lt;p&gt;That last point is the one I could fix, so I did. Still Applying is mine, so treat it as disclosed: you enter your history once and a browser extension fills it into the application form you have open. It is triggered from the toolbar on whatever page you are on, rather than from a fixed list of supported career sites, which matters here because NHS trusts and Civil Service departments are exactly the sites that never appear on those lists.&lt;/p&gt;

&lt;p&gt;Being straight about the limits, because in this context they are large:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It does &lt;strong&gt;not&lt;/strong&gt; write your person specification evidence for you. That is the part that gets you sifted in, and it is yours.&lt;/li&gt;
&lt;li&gt;It shows an ATS compatibility score, and on an NHS application that number is close to meaningless. It is scoring a CV, and as above, a CV is not the instrument being used. Ignore it here.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So the tool saves you the retyping. It does not save you the thinking, and any tool claiming otherwise for this particular process is selling you something.&lt;/p&gt;

&lt;p&gt;The habit that is worth more than any of it: before you apply anywhere in the NHS, open the person specification and the application form side by side, and answer the criteria in the order they are printed. It costs nothing and almost nobody does it.&lt;/p&gt;

&lt;p&gt;Enter your history once at &lt;a href="https://stillapplying.com" rel="noopener noreferrer"&gt;stillapplying.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Jake&lt;/p&gt;

</description>
      <category>career</category>
      <category>productivity</category>
      <category>jobsearch</category>
    </item>
    <item>
      <title>You can ask Companies House for more time, but only until the day you are late</title>
      <dc:creator>Spark</dc:creator>
      <pubDate>Sun, 20 Sep 2026 17:18:34 +0000</pubDate>
      <link>https://dev.to/spark88/you-can-ask-companies-house-for-more-time-but-only-until-the-day-you-are-late-2fjp</link>
      <guid>https://dev.to/spark88/you-can-ask-companies-house-for-more-time-but-only-until-the-day-you-are-late-2fjp</guid>
      <description>&lt;p&gt;I run a UK limited company on my own, and I build small tools. One of those tools knew my filing deadline, knew exactly what missing it would cost, and never once mentioned the thing that would actually have helped. That omission is worth about £150, so here it is written down plainly.&lt;/p&gt;

&lt;h2&gt;
  
  
  The part everybody knows
&lt;/h2&gt;

&lt;p&gt;Miss your Companies House accounts deadline and the penalty is automatic. No warning letter first, no discretion. The published scale for a private company:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;How late&lt;/th&gt;
&lt;th&gt;Penalty&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Not more than 1 month&lt;/td&gt;
&lt;td&gt;£150&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;More than 1 month, up to 3 months&lt;/td&gt;
&lt;td&gt;£375&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;More than 3 months, up to 6 months&lt;/td&gt;
&lt;td&gt;£750&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;More than 6 months&lt;/td&gt;
&lt;td&gt;£1,500&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;And the one that catches people twice: the penalty &lt;strong&gt;doubles&lt;/strong&gt; if you file late in two successive financial years.&lt;/p&gt;

&lt;h2&gt;
  
  
  The part almost nobody mentions
&lt;/h2&gt;

&lt;p&gt;You can ask Companies House for more time. It is free, the application takes about fifteen minutes, and you do it on their own service.&lt;/p&gt;

&lt;p&gt;But you have to apply &lt;em&gt;before&lt;/em&gt; your filing deadline. From the gov.uk guidance, in their words: you must apply for the extension, or file your accounts, before your filing deadline, or you will receive a late filing penalty.&lt;/p&gt;

&lt;p&gt;Read that again, because it is the entire point of this post. &lt;strong&gt;The window to ask for more time closes on exactly the day the penalty starts.&lt;/strong&gt; There is no grace period in which you notice you are late and then apply. The moment you are late, the option you had is gone, permanently, for that set of accounts.&lt;/p&gt;

&lt;p&gt;So the date that belongs in your calendar is not "file by 30 September". It is "by 30 September, either file or ask for more time", and those are two very different amounts of work. One is a year of bookkeeping. The other is a form.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three things that get an application refused
&lt;/h2&gt;

&lt;p&gt;Companies House is judging whether an event outside your control stopped you filing. The event is what is being assessed, not the inconvenience. Their own published examples are an unexpected illness, or a fire that destroyed the company records a few days before the deadline.&lt;/p&gt;

&lt;p&gt;What goes wrong:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Ordinary delay dressed up as an emergency.&lt;/strong&gt; This is the commonest refusal. Being busy, a client paying late, a bookkeeper being slow: none of these are events outside your control in the sense meant here.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A reason with no dates in it.&lt;/strong&gt; If nobody can line your event up against your deadline, nobody can check that it caused anything.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Anything you could not evidence if they asked.&lt;/strong&gt; Supporting documents are optional on the form. Being able to produce them is not.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;There is a fourth mistake that is not about the form at all: do not down tools while you wait for a decision. Companies House tells you to carry on preparing the accounts regardless, and if the answer comes back no, you have burned the days you had left.&lt;/p&gt;

&lt;h2&gt;
  
  
  The ceiling no reason gets you past
&lt;/h2&gt;

&lt;p&gt;The law caps the whole filing period at twelve months from your accounting reference date. If your period ended on 15 January, nothing later than 15 January the following year can be granted, however good your reason and however sympathetic the reviewer.&lt;/p&gt;

&lt;p&gt;So the extension is real, but finite. If your deadline is already eleven months out from your period end, there is very little left to give you, and it is better to know that now than on the day you apply.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where I ended up
&lt;/h2&gt;

&lt;p&gt;The tool is Duck Tax, and it is mine, so take that as disclosed. It is a free micro-entity accounts checker: seven figures in, a validated FRS 105 balance sheet out, no account needed and nothing sent anywhere unless you ask for it. Its MCP server has a tool that answers the only question that matters on the day you find out, which is whether the extension window is still open and how many days are left in it.&lt;/p&gt;

&lt;p&gt;Being precise about the limits, because this is exactly the area where vague marketing does real damage: it prepares an application, it cannot submit one, and &lt;strong&gt;it does not file accounts with anybody&lt;/strong&gt;. A director makes the application on Companies House's own service, and the checked numbers go to whoever does your filing. None of this is accounting advice.&lt;/p&gt;

&lt;p&gt;Honestly, if you take one thing from this post, let it be the calendar entry rather than the tool. Put the real date in: not the filing deadline, but the last day you can still ask for more time. They are the same day, and that is the problem.&lt;/p&gt;

&lt;p&gt;Check your figures free at &lt;a href="https://ducktax.com" rel="noopener noreferrer"&gt;ducktax.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Jake&lt;/p&gt;

</description>
      <category>startup</category>
      <category>business</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Playwright on Vercel: four things Next.js file tracing will not do for you</title>
      <dc:creator>Spark</dc:creator>
      <pubDate>Sun, 20 Sep 2026 17:16:14 +0000</pubDate>
      <link>https://dev.to/spark88/playwright-on-vercel-four-things-nextjs-file-tracing-will-not-do-for-you-2g3e</link>
      <guid>https://dev.to/spark88/playwright-on-vercel-four-things-nextjs-file-tracing-will-not-do-for-you-2g3e</guid>
      <description>&lt;p&gt;I ship a tool that drives a real browser through a website and records a narrated demo video. Moving that from a CLI to a Next.js API route on Vercel took four separate fixes, and every one of them failed in a way that pointed somewhere else.&lt;/p&gt;

&lt;p&gt;Writing them down in case it saves you the week it cost me.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. process.env.VERCEL is not a runtime signal
&lt;/h2&gt;

&lt;p&gt;Start here, because this is the one that will waste the most of your time.&lt;/p&gt;

&lt;p&gt;The obvious way to choose between local Playwright and serverless chromium is to ask whether you are running on Vercel:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;isServerless&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;!!&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;VERCEL&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is wrong the moment anyone runs &lt;code&gt;vercel env pull&lt;/code&gt;. It writes &lt;code&gt;VERCEL=1&lt;/code&gt; and &lt;code&gt;VERCEL_ENV=production&lt;/code&gt; straight into &lt;code&gt;.env.local&lt;/code&gt;, so your laptop now reads as production and takes the serverless path, against a chromium binary that is not there. Nothing about the failure points at your env file.&lt;/p&gt;

&lt;p&gt;The variables that only exist inside the deployed function are the Lambda ones:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;BrowserTarget&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;serverless&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;local&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;resolveBrowserTarget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Record&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nx"&gt;BrowserTarget&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;QUICKPEEK_BROWSER&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;serverless&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;serverless&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;QUICKPEEK_BROWSER&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;local&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;local&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="c1"&gt;// Set by the Lambda runtime Vercel functions execute in. Never present in a&lt;/span&gt;
  &lt;span class="c1"&gt;// pulled .env file, which is exactly why it is the one usable signal.&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;AWS_LAMBDA_FUNCTION_NAME&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;LAMBDA_TASK_ROOT&lt;/span&gt;
    &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;serverless&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
    &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;local&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two things worth copying. It is a pure exported function, because getting this wrong is invisible until either production or local dev quietly stops working, and you want a test sitting on it. And the manual override exists so you can force either branch while you are debugging the other one.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. The file tracer cannot see a dynamic import or an fs read
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;@sparticuz/chromium&lt;/code&gt; ships chromium as a brotli archive that it unpacks into &lt;code&gt;/tmp&lt;/code&gt; on first use. You load it through a dynamic import, and it then reads its own payload off disk. Next's file tracer sees neither the require nor the file, so it packs your function without the binary. The route deploys cleanly and throws at launch.&lt;/p&gt;

&lt;p&gt;You have to name it by hand, per route, because each API route becomes its own serverless function:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;outputFileTracingIncludes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/api/record-video&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./node_modules/@sparticuz/chromium/bin/**/*&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/api/validate-plan&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./node_modules/@sparticuz/chromium/bin/**/*&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The same trap catches anything read with &lt;code&gt;fs&lt;/code&gt; at runtime. Fonts and images used by OG image routes are the usual other victims.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Native packages have to be made external twice
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;serverExternalPackages&lt;/code&gt; keeps Node native packages out of the webpack bundle. Playwright pulls in electron and ws internals that break the build when bundled, and &lt;code&gt;@sparticuz/chromium&lt;/code&gt; is a 67MB archive webpack must not touch:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;serverExternalPackages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@sparticuz/chromium&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;playwright&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;playwright-core&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;sharp&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That handles imports resolving inside &lt;code&gt;node_modules&lt;/code&gt;. If you also depend on a local package by &lt;code&gt;file:&lt;/code&gt; path, its internal imports resolve &lt;em&gt;outside&lt;/em&gt; &lt;code&gt;node_modules&lt;/code&gt; and slip past the list entirely. You need the escape hatch as well:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;webpack&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;isServer&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;isServer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;externals&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;playwright&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;playwright-core&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@sparticuz/chromium&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  4. A file: dependency can make the build never finish
&lt;/h2&gt;

&lt;p&gt;This one did not error, which is why it took longest. &lt;code&gt;next build&lt;/code&gt; sat on "Creating an optimized production build" until I killed it, first at ten minutes, then at fifty five.&lt;/p&gt;

&lt;p&gt;The cause: bun resolves a &lt;code&gt;file:..&lt;/code&gt; dependency by copying the whole directory into &lt;code&gt;node_modules&lt;/code&gt;, and the &lt;code&gt;files&lt;/code&gt; field in package.json does not restrict that copy the way &lt;code&gt;npm pack&lt;/code&gt; would. So the copy contained &lt;code&gt;web/&lt;/code&gt;, which contained &lt;code&gt;node_modules&lt;/code&gt;, which contained another copy, roughly twelve levels deep. Next had also picked the repo root as its workspace because of a stray lockfile sitting up there, and was walking that whole tree.&lt;/p&gt;

&lt;p&gt;One line:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;outputFileTracingRoot&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;__dirname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If a build hangs with no output at all, suspect file tracing walking somewhere enormous before you suspect anything else.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two smaller ones at launch time
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Do not pass &lt;code&gt;headless: true&lt;/code&gt;.&lt;/strong&gt; The args from &lt;code&gt;@sparticuz/chromium&lt;/code&gt; already contain &lt;code&gt;--headless='shell'&lt;/code&gt;, quotes included, and Playwright appends its own switch on top, which leaves chromium holding two conflicting flags. The vendor's own Playwright example omits it for this reason.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;serverless&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;chromium&lt;/span&gt; &lt;span class="p"&gt;}]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
  &lt;span class="k"&gt;import&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@sparticuz/chromium&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="k"&gt;import&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;playwright-core&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;]);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;executablePath&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;serverless&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;executablePath&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;executablePath&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Serverless chromium did not unpack, no executable path was returned&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;chromium&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;launch&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;executablePath&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;args&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[...&lt;/span&gt;&lt;span class="nx"&gt;serverless&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...(&lt;/span&gt;&lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;args&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="p"&gt;[])],&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Think twice before disabling the graphics stack&lt;/strong&gt; to shave cold start time. Leaving it on costs about 1.6MB of extra unpack per cold start. Turning it off disables WebGL and canvas acceleration, which is the difference between recording a canvas based app and recording a blank rectangle.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this is all for
&lt;/h2&gt;

&lt;p&gt;The product is QuickPeek, which is mine, so treat that as disclosed: you give it a URL, it drives a real browser through your site, writes and speaks the narration, and cuts the result into a demo video with captions. Everything above is why that runs in a serverless function instead of on a machine I have to keep alive.&lt;/p&gt;

&lt;p&gt;If you are putting Playwright behind a Next.js route, the ordering that actually worked was: get the target resolution honest first, then trace the binary in, then fight webpack. Doing it in any other order means debugging three problems wearing the same error message.&lt;/p&gt;

&lt;p&gt;Point it at your own URL: &lt;a href="https://quickpeek.co" rel="noopener noreferrer"&gt;quickpeek.co&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Jake&lt;/p&gt;

</description>
      <category>nextjs</category>
      <category>vercel</category>
      <category>webdev</category>
      <category>testing</category>
    </item>
    <item>
      <title>My landing page had no hero. The HTML was correct the whole time.</title>
      <dc:creator>Spark</dc:creator>
      <pubDate>Sun, 20 Sep 2026 11:48:45 +0000</pubDate>
      <link>https://dev.to/spark88/my-landing-page-had-no-hero-the-html-was-correct-the-whole-time-3kka</link>
      <guid>https://dev.to/spark88/my-landing-page-had-no-hero-the-html-was-correct-the-whole-time-3kka</guid>
      <description>&lt;p&gt;I found this while taking screenshots for a Product Hunt listing, which is an embarrassing way to discover that the top of your own marketing site has been missing.&lt;/p&gt;

&lt;p&gt;The page opened on its second section. The headline, the subheading, the platform badges, the animated terminal and the single call to action button were all absent. Not mispositioned. Absent.&lt;/p&gt;

&lt;h2&gt;
  
  
  Everything I would normally check said it was fine
&lt;/h2&gt;

&lt;p&gt;This is the part worth writing down, because every instinct I reached for came back green.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;curl&lt;/code&gt; returned the headline. It is right there in the served HTML:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; https://example.dev | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="s2"&gt;"Your Next Stack, Sparked"&lt;/span&gt;
&lt;span class="c"&gt;# Your Next Stack, Sparked&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The element existed in the DOM. It had real dimensions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;h1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;getBoundingClientRect&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="c1"&gt;// { x: 83, y: 336.9, width: 536, height: 48.4 }&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No console errors. No failed requests. No hydration warning. A 536x48 heading, sitting at y=337, which is on screen.&lt;/p&gt;

&lt;p&gt;So the markup was right, the element was right, the element had a size, and the element was invisible.&lt;/p&gt;

&lt;h2&gt;
  
  
  The measurement that actually found it
&lt;/h2&gt;

&lt;p&gt;I stopped checking whether things existed and started measuring what the layout was doing. Specifically, the height of every direct child of the scroll container:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;sc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;div.flex-1.min-h-0.overflow-y-auto&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;[...&lt;/span&gt;&lt;span class="nx"&gt;sc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;children&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;tag&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tagName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;offsetTop&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;offsetTop&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getBoundingClientRect&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;height&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;slice&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;30&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;}));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Which gave me this:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;element&lt;/th&gt;
&lt;th&gt;offsetTop&lt;/th&gt;
&lt;th&gt;height&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;hero &lt;code&gt;&amp;lt;section&amp;gt;&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;57&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;demo video &lt;code&gt;&amp;lt;section&amp;gt;&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;57&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;654&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;features &lt;code&gt;&amp;lt;section&amp;gt;&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;711&lt;/td&gt;
&lt;td&gt;919&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Two sections claiming the same &lt;code&gt;offsetTop&lt;/code&gt;. The hero was zero pixels tall, so the next section laid out on top of it, and the hero's own &lt;code&gt;overflow-hidden&lt;/code&gt; clipped its contents out of existence.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;h1&lt;/code&gt; genuinely was 536x48. It was just 536x48 inside a box with no height, painted underneath the section that came after it.&lt;/p&gt;

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

&lt;p&gt;The page shell is one viewport tall and never scrolls itself. A fixed-height flex column holds everything, and one inner div does the scrolling:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"h-dvh overflow-hidden flex flex-col"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;nav&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"shrink-0"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;...&lt;span class="nt"&gt;&amp;lt;/nav&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"flex-1 min-h-0 overflow-y-auto flex flex-col"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;section&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"relative overflow-hidden"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;...&lt;span class="nt"&gt;&amp;lt;/section&amp;gt;&lt;/span&gt;  &lt;span class="c"&gt;&amp;lt;!-- the hero --&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;section&amp;gt;&lt;/span&gt;...&lt;span class="nt"&gt;&amp;lt;/section&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;section&amp;gt;&lt;/span&gt;...&lt;span class="nt"&gt;&amp;lt;/section&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every section is a flex item in a fixed-height column, so every section is shrinkable. &lt;code&gt;flex-shrink&lt;/code&gt; defaults to &lt;code&gt;1&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Normally that does not matter, because a flex item's automatic minimum size (&lt;code&gt;min-height: auto&lt;/code&gt;) stops it shrinking below its content. That default is what keeps flex columns from crushing themselves.&lt;/p&gt;

&lt;p&gt;But &lt;code&gt;min-height: auto&lt;/code&gt; only applies when the item's overflow is visible. From the CSS Flexible Box spec: the automatic minimum size is zero when the box is a scroll container, and &lt;code&gt;overflow: hidden&lt;/code&gt; makes it one.&lt;/p&gt;

&lt;p&gt;The hero was the only section with &lt;code&gt;overflow-hidden&lt;/code&gt; on it. So it was the only section whose minimum size was zero. Every other section held its ground, the column still needed to give up space, and the one item that could shrink to nothing did exactly that.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;overflow-hidden&lt;/code&gt; was there to clip a decorative background. It was not doing anything I would have thought of as layout.&lt;/p&gt;

&lt;h2&gt;
  
  
  Proving it before changing anything
&lt;/h2&gt;

&lt;p&gt;Two one line experiments in the console on the live page, before I touched the source:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;hero&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;div.flex-1.min-h-0.overflow-y-auto &amp;gt; section:first-child&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;h&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;hero&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getBoundingClientRect&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;height&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nf"&gt;h&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;                                 &lt;span class="c1"&gt;// 0&lt;/span&gt;
&lt;span class="nx"&gt;hero&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;flexShrink&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;0&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nf"&gt;h&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;    &lt;span class="c1"&gt;// 716&lt;/span&gt;
&lt;span class="nx"&gt;hero&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;flexShrink&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;hero&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;minHeight&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;auto&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nf"&gt;h&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;  &lt;span class="c1"&gt;// 0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;flex-shrink: 0&lt;/code&gt; brings it back. &lt;code&gt;min-height: auto&lt;/code&gt; does not, which is the tell: the automatic minimum is already being computed as zero because of the overflow, so restating it changes nothing. That second result is what turns a plausible theory into the actual mechanism.&lt;/p&gt;

&lt;h2&gt;
  
  
  The fix
&lt;/h2&gt;

&lt;p&gt;One class.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;&lt;span class="gd"&gt;- &amp;lt;section className="relative overflow-hidden"&amp;gt;
&lt;/span&gt;&lt;span class="gi"&gt;+ &amp;lt;section className="relative shrink-0 overflow-hidden"&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I left a comment on it, because the next person to tidy up a "redundant" utility class will delete it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;shrink-0 is load-bearing. This section is a flex item in the fixed-height
flex column above, so it is shrinkable by default. Every other section keeps
min-height: auto and resists, but overflow-hidden forces this one's automatic
minimum size to zero, so it absorbed the whole overflow and collapsed to 0px.
Do not remove without also removing overflow-hidden.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  How to check your own
&lt;/h2&gt;

&lt;p&gt;If you have a fixed-height flex column anywhere, measure the children rather than trusting that the content is present:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="p"&gt;[...&lt;/span&gt;&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelectorAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;section, main &amp;gt; div&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;slice&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;40&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getBoundingClientRect&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;height&lt;/span&gt;&lt;span class="p"&gt;)])&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(([,&lt;/span&gt; &lt;span class="nx"&gt;h&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;h&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Anything returning zero while containing real content is this bug. The combination to look for is a flex or grid item that sets &lt;code&gt;overflow&lt;/code&gt; to anything other than &lt;code&gt;visible&lt;/code&gt;, inside a container with a constrained height.&lt;/p&gt;

&lt;p&gt;Worth saying plainly: none of my usual checks could have caught this. Server rendered HTML tests pass, because the HTML is correct. Snapshot tests pass, because the tree is correct. A smoke test asserting the headline is in the document passes. The only thing that catches it is asking the browser how tall the box actually is.&lt;/p&gt;

&lt;h2&gt;
  
  
  Disclosure
&lt;/h2&gt;

&lt;p&gt;The site is &lt;a href="https://sparkstack.dev" rel="noopener noreferrer"&gt;SparkStack&lt;/a&gt;, a Next.js starter I sell, so this was my own shop window with the lights off. I do not know exactly how long it was broken, which is its own lesson: I had no check that would have told me. The fix is deployed and the hero has been back at 716 pixels since.&lt;/p&gt;

&lt;p&gt;If you take one thing from this, make it the measurement rather than the fix. &lt;code&gt;getBoundingClientRect().height&lt;/code&gt; on your layout wrappers costs nothing and tells you something that reading the markup cannot.&lt;/p&gt;

</description>
      <category>css</category>
      <category>webdev</category>
      <category>nextjs</category>
      <category>debugging</category>
    </item>
    <item>
      <title>I checked 14 domains. None had ever submitted a sitemap.</title>
      <dc:creator>Spark</dc:creator>
      <pubDate>Thu, 17 Sep 2026 08:52:53 +0000</pubDate>
      <link>https://dev.to/spark88/i-checked-14-domains-none-had-ever-submitted-a-sitemap-14c5</link>
      <guid>https://dev.to/spark88/i-checked-14-domains-none-had-ever-submitted-a-sitemap-14c5</guid>
      <description>&lt;p&gt;I run fourteen small SaaS sites. Last week I went to check how they were doing in search and found something embarrassing: &lt;strong&gt;not one of them had ever had a sitemap submitted&lt;/strong&gt;. Not to Google, not to Bing. Fourteen domains, 188 URLs, sitting there for months.&lt;/p&gt;

&lt;p&gt;The annoying part is that every single site was doing the work correctly. Each served a valid &lt;code&gt;sitemap.xml&lt;/code&gt;. Each declared it in &lt;code&gt;robots.txt&lt;/code&gt;. The framework generated it automatically. Everything a tutorial tells you to do was done.&lt;/p&gt;

&lt;p&gt;Nobody had pressed the last button.&lt;/p&gt;

&lt;h2&gt;
  
  
  Serving a sitemap is not submitting one
&lt;/h2&gt;

&lt;p&gt;This is the gap I want to flag, because I suspect it is common.&lt;/p&gt;

&lt;p&gt;A sitemap in &lt;code&gt;robots.txt&lt;/code&gt; is a passive hint. A crawler that already visits your site will eventually find it. Submitting it in Search Console is an active declaration: here is the list, please read it now, and here is where I will tell you when it changes.&lt;/p&gt;

&lt;p&gt;For a site with existing traffic the difference is small. For a new site with no inbound links, the passive route can mean waiting a long time to be discovered at all, because nothing is prompting a crawler to come in the first place.&lt;/p&gt;

&lt;p&gt;Checking takes a minute per property:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Google: Search Console, Indexing, Sitemaps&lt;/li&gt;
&lt;li&gt;Bing: Bing Webmaster Tools, Sitemaps&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the table is empty, that is the whole problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bing matters more than its market share suggests
&lt;/h2&gt;

&lt;p&gt;The reflex is to do Google and stop. That reflex is now out of date, for a reason that has nothing to do with how many people use Bing.&lt;/p&gt;

&lt;p&gt;ChatGPT's browsing is built on Bing's index. If you care about being mentioned when somebody asks an assistant for a tool like yours, Bing is not the afterthought, it is the channel. Claude leans on Brave, which has its own &lt;a href="https://search.brave.com/submit-url" rel="noopener noreferrer"&gt;submission form&lt;/a&gt;. Perplexity runs its own crawler.&lt;/p&gt;

&lt;p&gt;So "SEO" quietly became several different indexes with different front doors. Submitting to Google alone covers fewer of them than it used to.&lt;/p&gt;

&lt;p&gt;Bing was also the bigger miss in my case. One of my domains was not even registered in Bing Webmaster Tools, so its 30 URLs were invisible to that whole side of the map.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two things that cost me time
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;A domain property rejects a bare path.&lt;/strong&gt; In Google Search Console, if your property is a Domain property (&lt;code&gt;sc-domain:example.com&lt;/code&gt;), the sitemap field will not accept &lt;code&gt;sitemap.xml&lt;/code&gt;. It returns "Invalid sitemap address" with no hint as to why. It wants the full &lt;code&gt;https://example.com/sitemap.xml&lt;/code&gt;. A URL-prefix property takes the bare path. Same field, same console, opposite requirement.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Deploy the verification file before you create the property.&lt;/strong&gt; If you add a URL-prefix property and the verification file is already live, Google skips the verification step entirely and shows "Ownership auto verified". If you create the property first you get sent round a download-upload-verify loop instead.&lt;/p&gt;

&lt;p&gt;Worth knowing: the Google HTML verification token is per account, not per site. The same &lt;code&gt;googleXXXX.html&lt;/code&gt; file verifies every domain you own. Once you have it, adding a new site is one file and one click.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I would check on your own projects
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Open Search Console and Bing Webmaster Tools and look at the Sitemaps table. Empty is the common case.&lt;/li&gt;
&lt;li&gt;Check every domain is actually registered in both. One of mine was missing from Bing entirely and I had never noticed.&lt;/li&gt;
&lt;li&gt;After submitting, wait and check the status reads Success with a page count, not just "submitted". Mine sat on "Couldn't fetch" for a few minutes before flipping.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;None of this is clever. It is the boring last step that the tutorials imply happens by itself.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I build &lt;a href="https://spark-apps.co" rel="noopener noreferrer"&gt;a set of small SaaS tools&lt;/a&gt;, one of which is a visibility auditor, which is how I noticed. It scored several of these sites highly while their sitemaps had never been submitted, because it only fetched the URL it was given. I have since fixed that too.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>seo</category>
      <category>webdev</category>
      <category>saas</category>
    </item>
  </channel>
</rss>
