I shipped Invest-like — a tool that scores any public stock against four documented value-investing frameworks (Buffett, Graham, Lynch, Greenblatt) — as a solo founder from Kiel, Germany. Free tier covers 12,000+ tickers. Paid tier ships 21 June 2026. Live build metrics live at /open, and every release lands on /changelog.
This post is the unsanitised version of how it came together: the stack, the playbook that took it from "ChatGPT had no idea what Invest-like is" to "indexable across the public web", and the things I would skip if I were starting over tomorrow.
Pull anything from this that's useful. The whole thing is opinionated, not authoritative — your indie SaaS will look different.
Why a stock screener (when there are already a hundred)
Every stock screener I tried was the same trap: an overwhelming wall of metrics, no opinion, no verdict. As a part-time investor I didn't want a P/E ratio in isolation. I wanted to know: "is this stock actually a Buffett-quality business or not?"
So Invest-like applies the four documented frameworks end-to-end — moat, durability, management, balance-sheet health, valuation — and returns one of three verdicts: Yes, No, or Maybe, with the reasoning visible.
Try one yourself: the Apple verdict is a good 60-second tour.
The stack
Nothing exotic. The boring stack is the one that ships.
- Next.js 15 (App Router) — server components for everything that doesn't need to be interactive, client components only at the leaves where they have to be. Most of the marketing pages are zero-JS by the time they hit the browser.
- Supabase + Postgres in
eu-central-1 (Frankfurt) — for GDPR locality and zero ETL between auth, data, and the RLS policies. The @supabase/ssr SDK is awkward but workable; I wrote the PKCE callback fix the hard way.
- Vercel edge —
fra1 region, with trailingSlash: true so the canonical URL pattern matches the sitemap exactly. Lazy-loaded the recharts chunk (~100KB gzipped) out of the homepage to bring LCP under 1.8s.
- Claude + GPT for the verdict prompts. Two providers means I can A/B prompts cheaply, and one outage doesn't kill verdict generation.
- Resend for transactional + welcome emails.
- PostHog (EU region) + Microsoft Clarity for behavioural analytics. PostHog handles events and session replays; Clarity does heatmaps. Both gated by a GDPR consent banner.
- Vercel Analytics + Speed Insights for cookie-less pageview + Web Vitals tracking — the slice that fires regardless of consent under GDPR's "strictly necessary" carve-out.
What's not in the stack on purpose:
- No Redis, no message queue, no read replica. Postgres is fast enough at this scale.
- No microservices. One Next.js app, one database. Two providers (Vercel + Supabase).
- No CMS. The blog you're reading is MDX files in the repo, parsed at build time. Versioned with code, reviewable in PRs, zero-cost to host.
- No Stripe yet. Paid tier launches 21 June. Until then, the question is "is the free tier any good?" — payments would be a distraction.
The SEO + LLM discoverability playbook (the bit most indie founders skip)
A week into launch, I asked ChatGPT "what is Invest-like?" It told me Invest-like wasn't a formal term and gave me a definition based on the words "invest" and "like". The brand didn't exist to it.
Here's exactly what changed in 48 hours to fix that. All in code, all reproducible.
1. /llms.txt
llmstxt.org is the emerging standard LLMs use to discover canonical site content. Anthropic, OpenAI, and Perplexity all check for it before falling back to web crawling.
Mine: invest-like.com/llms.txt
It's just markdown listing your strategy hubs, brand pages, methodology pages, and important content. Five minutes to write, instantly improves your odds of being recognised by every major LLM.
2. Beefed-up Organization JSON-LD
Default Organization schema is just { name, url }. Useless for LLMs. I added: founder name, location (Kiel, Germany), foundingDate, knowsAbout (nine related concepts including "Buffett investing philosophy" and "return on invested capital"), alternateName ("Invest like", "InvestLike"), contactPoint with languages, logo.
Why it matters: "Invest-like" tokenises as two common English words ("invest" + "like"). Without strong structured data, an LLM can't tell it's a brand vs a phrase. With it, the LLM has clear anchors.
3. An /about page where the first sentence starts with the brand name
Rewrote /about so the first heading is "What is Invest-like?" and the first body sentence starts with "Invest-like is a stock-analysis tool that..."
LLMs heavily weight the first 100 words of a page. If your brand name doesn't appear there, you're invisible to brand queries.
4. FAQPage schema with the exact question users ask
Added an FAQ section to the homepage with FAQPage JSON-LD. The first question is literally "What is Invest-like?" with a 3-sentence answer. This is the format LLMs prefer when answering brand queries because it maps directly to their output format.
5. robots.txt with explicit allow rules for 22 LLM crawlers
Default robots.txt with userAgent: "*" technically allows GPTBot, ClaudeBot, and others. But many LLM operators look for an explicit user-agent entry before crawling. I added explicit allow rules for: GPTBot, ChatGPT-User, OAI-SearchBot, ClaudeBot, Claude-Web, anthropic-ai, PerplexityBot, Perplexity-User, Google-Extended, GoogleOther, CCBot, Meta-ExternalAgent, Bytespider, Amazonbot, cohere-ai, Mistral-AI, YouBot, Applebot-Extended, plus the four traditional search bots.
What's still slow
ChatGPT search (which uses Bing's index) takes 7–14 days to find new content. I submitted the sitemap to Bing Webmaster Tools and clicked "Request indexing" on the homepage. Now waiting.
LLM training data has a 6–12 month lag — there's no shortcut. Even if everything is perfect today, the next ChatGPT release won't include Invest-like in its baked-in knowledge until the next training cut.
What I would do differently
A short list of mistakes I made, in case they save you time.
- Cookie-based locale routing was the wrong call. I picked it because it's elegant — same URL, language follows the user. The downside: search engines can't crawl the French / Spanish / Portuguese / German versions because there are no separate URLs. Hreflang loses most of its power. If I were starting over: URL-based locales (
/en/, /fr/, etc) from day one, even though it's more boilerplate.
- I shipped without a public roadmap or changelog for the first three weeks. New visitors had no signal that the product was alive. Adding
/changelog, /roadmap, /status, and /open — the four "this is a real product" pages — should be in the day-one launch list. They take an afternoon and they pay forever.
- I trusted the default
@supabase/ssr setup for too long. The "click Sign in with Google twice" bug ate a week. Root cause was a race between the Next.js middleware and the route handler over the PKCE verifier cookie. Fix: exclude /auth/callback from the matcher, build the redirect response first, then bind setAll to it, then call exchangeCodeForSession. There's a whole post on the changelog about that one.
- I built the strategy playground (the chart) into the homepage's main bundle.
recharts is ~100KB gzipped. Lazy-loading it cut homepage LCP by ~1.5s. Splitting heavy below-the-fold widgets out of the initial bundle is free perf — should have done it on day one.
- I spent too long trying to fix the Google OAuth screen showing
Continue to nveeqjhdanptpmtwddzl.supabase.co. That text comes from the OAuth client's redirect URI domain, which is hardcoded to Supabase's hosted auth host. The only fix is a custom auth domain on Supabase Pro. Cosmetic flaw, not a real blocker — but I burned half a day on it before accepting that.
What's next
Stripe billing on 21 June 2026 unlocks the paid tier (€19/month, unlimited verdicts, all four strategies, watchlist alerts). After that:
- URL-based locale routing — the SEO fix I should have shipped on day one
- Email alerts when a watchlist stock flips verdict
- Public API + docs
- A "compare across all four philosophies" view for any single ticker
Live roadmap: /roadmap.
If you're building something adjacent — value investing, indie SaaS, programmatic SEO, anything — I read every email at hello@invest-like.com and would love to compare notes. The full daily build log lives at /open.
Thanks for reading. If this post was useful, the highest-leverage thing you can do is share it with one person who'd find it useful too.