<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Michael Shadpour]]></title><description><![CDATA[Michael Shadpour]]></description><link>https://realmichaelshad.hashnode.dev</link><generator>RSS for Node</generator><lastBuildDate>Mon, 02 Nov 2026 03:59:11 GMT</lastBuildDate><atom:link href="https://realmichaelshad.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[I'm really stuck with my app. Can someone help me figure out what to do?]]></title><description><![CDATA[I'll be honest: I'm stuck, and I could really use help from people who've been here. A few weeks ago I posted about trying to sell Starling, an app I built…]]></description><link>https://realmichaelshad.hashnode.dev/i-m-really-stuck-with-my-app-can-someone-help-me-figure-out-what-to-do</link><guid isPermaLink="true">https://realmichaelshad.hashnode.dev/i-m-really-stuck-with-my-app-can-someone-help-me-figure-out-what-to-do</guid><category><![CDATA[startup]]></category><category><![CDATA[side project]]></category><category><![CDATA[AI]]></category><dc:creator><![CDATA[Michael Shadpour]]></dc:creator><pubDate>Sun, 01 Nov 2026 23:59:41 GMT</pubDate><content:encoded><![CDATA[<p>I'll be honest: I'm stuck, and I could really use help from people who've been here.</p>
<p>A few weeks ago I posted about trying to sell Starling, an app I built that nobody had used yet. A lot of you told me the same thing: the price wasn't the problem, proof was. Get real users first.</p>
<p>So I listened. I cancelled the Flippa auction (582 views, 4 watchers, 0 bids), and on 31 October I put Starling online as a free beta.</p>
<p>What it does: Starling drafts replies on X in your own voice. You give it a few of your old posts, it learns how you write, and you get drafts that sound like you. There's a Chrome extension and a page that works on your phone. Nothing posts unless you press Post yourself. It works, and I'm proud of it.</p>
<p><strong>Here's where I'm stuck</strong></p>
<p>The more I look into it, the worse it looks:</p>
<ul>
<li>X reply tools are everywhere, and anyone can ask ChatGPT or Grok to write a reply for free.</li>
<li>I looked at 11 X writing tools that launched in 2025-2026 and show their revenue publicly. The median made about $10 in its first 60 days, and some of those founders had 20,000+ followers. I have almost no followers. My X posts get single-digit views.</li>
<li>My honest guess for the next two months, even if I push hard: 30-90 sign-ups and 0-2 paying users.</li>
</ul>
<p>So I don't know what to do with it, and I keep going back and forth between:</p>
<ol>
<li><strong>Selling it now for whatever it gets</strong> (probably $50-250) and moving on.</li>
<li><strong>Changing who it's for:</strong> people who reply online for work, like founders, salespeople and recruiters. Add LinkedIn and a right-click "reply in my voice" that works on any site, charge $19-29 a month, and give it until 1 February. If nobody pays by then, sell it.</li>
<li><strong>Finding a partner with an audience</strong> who'd sell it for a real share. But people with real audiences don't usually team up with apps that have no users.</li>
<li><strong>Shutting it down.</strong></li>
</ol>
<p>I'm leaning toward 2, but I really don't want to spend three more months on something that was never going to work.</p>
<p><strong>If you've been here before, please help</strong></p>
<ul>
<li>What would you do in my shoes?</li>
<li>Is LinkedIn a real step up, or just as crowded as X?</li>
<li>Would you pay $19 a month for replies in your own voice? What would make it worth it?</li>
<li>Has anyone found a partner with an audience for a small product? How?</li>
</ul>
<p>Any advice helps, even "shut it down." I'd rather hear it now than in three months.</p>
<p>If you want to try it, it's free at starlingwriter.com, and honest feedback on the drafts would mean a lot.</p>
<p>Thank you. Your advice last time is the reason it's live at all.</p>
]]></content:encoded></item><item><title><![CDATA[Your PDFs are putting page numbers into your AI's answers]]></title><description><![CDATA[Ask a chatbot built on company PDFs a question, and sometimes the answer comes back with "Page 3 of 10" or "Confidential - Internal Use Only" in the middle…]]></description><link>https://realmichaelshad.hashnode.dev/your-pdfs-are-putting-page-numbers-into-your-ai-s-answers</link><guid isPermaLink="true">https://realmichaelshad.hashnode.dev/your-pdfs-are-putting-page-numbers-into-your-ai-s-answers</guid><category><![CDATA[RAG ]]></category><category><![CDATA[pdf]]></category><category><![CDATA[AI]]></category><category><![CDATA[Python]]></category><category><![CDATA[llm]]></category><dc:creator><![CDATA[Michael Shadpour]]></dc:creator><pubDate>Sat, 31 Oct 2026 23:36:19 GMT</pubDate><content:encoded><![CDATA[<p>Ask a chatbot built on company PDFs a question, and sometimes the answer comes back with "Page 3 of 10" or "Confidential - Internal Use Only" in the middle of it. That's not the model making things up. That text really is in what you gave it.</p>
<p>When you pull the text out of a PDF, the running header, the footer and the page number come out as ordinary lines, mixed in with the body. Nothing marks them as different. Then your RAG pipeline cuts the text into chunks, and three things go wrong:</p>
<ul>
<li><strong>The same footer lands in chunk after chunk</strong>, so those chunks look alike to the embedding model, and a question that shares a word with the footer can pull up the wrong chunk.</li>
<li><strong>Any chunk that crosses a page break gets a header stuck in the middle of a sentence.</strong></li>
<li><strong>You pay for it</strong>: every copy is embedded, stored, and sent to the model each time the chunk is retrieved.</li>
</ul>
<h2>Check your own PDF in 2 minutes</h2>
<p><strong>No code:</strong> drop a PDF into this free tool. It runs in your browser and your file isn't uploaded. It lists the lines that repeat across pages and the pages with no text layer: <a href="https://agnos.cloud/tools/pdf-repeated-lines/">https://agnos.cloud/tools/pdf-repeated-lines/</a></p>
<p><strong>Or with Python</strong> (<code>pip install pdfplumber==0.11.10</code>, the version the study used). It masks digits, so "Page 3 of 12" and "Page 4 of 12" count as the same line, then counts how many pages each line is on:</p>
<pre><code class="language-python">import re, sys
from collections import defaultdict
import pdfplumber

def shape(line):
    return re.sub(r"\d+", "#", " ".join(line.lower().split()))

with pdfplumber.open(sys.argv[1]) as pdf:
    pages = [(p.extract_text() or "").splitlines() for p in pdf.pages]

on_pages, first = defaultdict(set), {}
for n, lines in enumerate(pages, 1):
    for line in lines:
        if line.strip():
            on_pages[shape(line)].add(n)
            first.setdefault(shape(line), line.strip())

need = max(3, 0.3 * len(pages))
for s, seen in sorted(on_pages.items(), key=lambda kv: -len(kv[1])):
    if len(seen) &gt;= need:
        print(f"on {len(seen)} of {len(pages)} pages: {first[s]!r}")
</code></pre>
<p>On a four-page sample handbook it prints the header, the "Confidential" footer and "Page 1 of 4", each on 4 of 4 pages.</p>
<h2>What I found in 25 real government PDFs</h2>
<p>I make a Windows app called Agnos at Gidion that cleans this out, so I tested it in public on 25 PDFs from US federal agencies, 1,342 pages, and published everything, including what it got wrong:</p>
<ul>
<li>It removed <strong>2,063 lines</strong> as page furniture: running headers, footers, page numbers, form IDs. That's only 1.45% of the text, but it sits at <strong>every page break</strong>, which is exactly where chunks get split.</li>
<li><strong>200 of those lines were actually content</strong>: table cells, column headings, table labels and phone numbers. They had the same shape as a footer once the digits were masked. A simple repeat rule makes this mistake, which is why you should read what gets removed before you trust it.</li>
<li>It also <strong>missed things</strong>. A four-line NASA footer on all 89 pages stayed, because it sat just past the lines Agnos checks at the edge of the page.</li>
</ul>
<p>The full study, with every document, the method and the data (CSV, CC BY 4.0): <a href="https://agnos.cloud/guides/page-furniture-study/">https://agnos.cloud/guides/page-furniture-study/</a></p>
<h2>How to clean this safely</h2>
<ol>
<li><strong>Look only at the edges of each page</strong>, not the whole page, so you don't delete real sentences.</li>
<li><strong>Read the repeated lines before you delete them.</strong> Table labels and phone numbers look like furniture.</li>
<li><strong>Keep a log of every removed line with its page</strong>, so a missing table label can be found later.</li>
<li><strong>Open a few chunks that cross a page break and read them.</strong> That's where the junk shows up.</li>
</ol>
<h2>If you don't want to script it</h2>
<p>That's what I built Agnos for. You drop in a folder of text-based PDFs, Word, Excel, PowerPoint files or web pages, and it removes repeated headers and footers, page numbers, cookie banners, boilerplate and duplicates on your own Windows PC. Nothing is uploaded. Then it shows you what it removed with the rule behind each removal, so you can keep a piece where its rule allows, or switch the rule off, and exports clean text or JSONL chunks for your index.</p>
<p>It's honest about its limits: Windows 10 and 11 only, and no OCR, so scanned pages are skipped and named rather than cleaned badly.</p>
<p>It's free for 14 days with everything, no card and no account, then $99 once (no subscription): <a href="https://apps.microsoft.com/detail/9N11TLPX6K47?cid=hashnode">https://apps.microsoft.com/detail/9N11TLPX6K47?cid=hashnode</a></p>
<p>If you try the free tool or the app on your own files, tell me what it gets wrong. I read every reply.</p>
<p><em>Drafted with help from an AI assistant (Claude) and reviewed by me before publishing.</em></p>
]]></content:encoded></item><item><title><![CDATA[What I learned trying to sell an app nobody has used]]></title><description><![CDATA[This summer I built Starling, a Chrome extension that drafts replies, quote posts and posts on X in your own voice. It learns how you write from your old…]]></description><link>https://realmichaelshad.hashnode.dev/what-i-learned-trying-to-sell-an-app-nobody-has-used</link><guid isPermaLink="true">https://realmichaelshad.hashnode.dev/what-i-learned-trying-to-sell-an-app-nobody-has-used</guid><category><![CDATA[side project]]></category><category><![CDATA[startup]]></category><category><![CDATA[webdev]]></category><dc:creator><![CDATA[Michael Shadpour]]></dc:creator><pubDate>Fri, 30 Oct 2026 16:57:16 GMT</pubDate><content:encoded><![CDATA[<p>This summer I built Starling, a Chrome extension that drafts replies, quote posts and posts on X in your own voice. It learns how you write from your old posts, and nothing goes out until you press Post. Behind it there's a FastAPI backend, Stripe billing, an owner dashboard and about 5,500 automated tests.</p>
<p>Then I realized I don't want to run a subscription business: support, payments, servers, all of it. So I tried to sell it instead. It has never launched, so it has 0 users and $0 revenue.</p>
<p>Here's what a month of trying to sell it taught me.</p>
<p><strong>1. Cold email gets you read, not bought.</strong> I sent about 700 personal emails to companies that build X tools or AI writing tools, and to people who buy small apps. 13 people wrote back. Most were polite no's, a couple were curious, and nobody made an offer.</p>
<p><strong>2. Check your spam folder.</strong> The most serious buyer replied within a day of my email. His reply went straight to spam, and I found it 10 days later. By then he'd moved on.</p>
<p><strong>3. Price wasn't the problem.</strong> I went from $1,950 to $1,200, then to an auction starting at $299. Views went up. Bids didn't. For a product with no users, a buyer isn't really pricing the code, they're pricing the risk that it won't work for them.</p>
<p><strong>4. Proof beats pitch.</strong> I re-ran the full test suite on the exact version a buyer would get (4,838 tests passed, 0 failed) and put the result in the listing. What buyers really want, though, is to see it running for someone who isn't me, and that's the proof I'm still missing.</p>
<p><strong>5. Communities beat outreach.</strong> One honest post on Indie Hackers about not being able to sell it got more than 20 comments and better advice than weeks of email.</p>
<p><strong>6. Have a backup.</strong> A developer I emailed offered to launch it with me for free if it doesn't sell. That took a lot of pressure off.</p>
<p><strong>Update (30 October):</strong> I've stopped the sale and taken Starling off Flippa. Every piece of advice I got pointed the same way: the missing piece is real users, not a lower price. So I'm launching Starling as a real product instead, and I'll share how that goes.</p>
<ul>
<li>90-second demo: <a href="https://www.youtube.com/watch?v=QJUr3JpdA3s">https://www.youtube.com/watch?v=QJUr3JpdA3s</a></li>
<li>Website: <a href="https://starlingwriter.com">https://starlingwriter.com</a></li>
</ul>
<p>If you've launched something with no audience, I'd love to hear what worked for you.</p>
]]></content:encoded></item></channel></rss>