vibegen.eu — SEO + LLM-SEO Auditas

📅 Data: 2026-02-27 🎯 Auditorija: PROGRAMUOTOJAS/IT 🔧 Stack: Next.js + Supabase 🌍 Market: Global (EN)

📋 Turinys

Executive Summary

vibegen.eu — stipri technologija (Next.js + Supabase), puikus value prop (idea → PRD → tasks → export), bet ZERO AI matomumas.

Kategorija Įvertinimas Statusas
Techninis SEO 4.5/5 Gerai
Turinys 6.5/10 Reikia gerinti
LLM-SEO 2/10 Kritinis
AI Citatai 0 Zero
💡 Pagrindinė problema: Puikus produktas, bet AI modeliai nežino apie vibegen.eu. Konkurentai (ChatPRD, ValidatorAI, IdeaProof) cituojami, nes:
  • Turi backlinks (blog, community posts, PR)
  • Turi trust signals (user count, ratings, testimonials)
  • Turi founder visibility (LinkedIn, Twitter, bio)
  • Turi comprehensive llms.txt (IdeaProof: 49KB vs vibegen: 2KB)

🔴 KRITINIAI FIX'AI Priority 1

1. Permissions-Policy Header (TRŪKSTA)

📍 Problema:
Nėra Permissions-Policy header → browser permissions API access nekontroliuojamas
📂 Kur:
Next.js next.config.js arba Middleware
🎯 Tikslas:
Kontroliuoti browser features (camera, mic, geolocation, payment)
🔧 Fix (next.config.js):
// next.config.js
const nextConfig = {
  async headers() {
    return [
      {
        source: '/:path*',
        headers: [
          {
            key: 'Permissions-Policy',
            value: 'camera=(), microphone=(), geolocation=(), payment=()'
          }
        ]
      }
    ]
  }
}

module.exports = nextConfig
✅ Tikrinimas:
curl -I https://vibegen.eu | grep -i permissions-policy
Turi grąžinti: permissions-policy: camera=(), microphone=(), geolocation=(), payment=()

2. CSP Nonce-based (unsafe-inline → nonce)

📍 Problema:
CSP turi unsafe-inline → XSS rizika (nors Next.js tai reikalauja)
📂 Kur:
Next.js Middleware arba _document.tsx
🎯 Tikslas:
Nonce-based CSP → šalinti unsafe-inline (Next.js 13+ palaiko)
🔧 Fix (middleware.ts):
// middleware.ts
import { NextResponse } from 'next/server'
import type { NextRequest } from 'next/server'
import crypto from 'crypto'

export function middleware(request: NextRequest) {
  const nonce = crypto.randomBytes(16).toString('base64')
  const cspHeader = `
    default-src 'self';
    script-src 'self' 'nonce-${nonce}' 'strict-dynamic';
    style-src 'self' 'nonce-${nonce}';
    img-src 'self' blob: data: https:;
    font-src 'self';
    object-src 'none';
    base-uri 'self';
    form-action 'self';
    frame-ancestors 'none';
    upgrade-insecure-requests;
  `.replace(/\s{2,}/g, ' ').trim()

  const response = NextResponse.next()
  response.headers.set('Content-Security-Policy', cspHeader)
  response.headers.set('x-nonce', nonce)

  return response
}

export const config = {
  matcher: [
    '/((?!api|_next/static|_next/image|favicon.ico).*)',
  ],
}
🔧 Fix (_document.tsx):
// pages/_document.tsx (Pages Router) arba app/layout.tsx (App Router)
import { Html, Head, Main, NextScript } from 'next/document'
import { headers } from 'next/headers'

export default function Document() {
  const nonce = headers().get('x-nonce')

  return (
    <Html>
      <Head nonce={nonce} />
      <body>
        <Main />
        <NextScript nonce={nonce} />
      </body>
    </Html>
  )
}
✅ Tikrinimas:
curl -I https://vibegen.eu | grep -i content-security-policy
Turi būti nonce-XXX ir NĖRA unsafe-inline
💡 Next.js 13+ App Router: Naudok headers().get('x-nonce') vietoj custom middleware. Dokumentacija: nextjs.org/docs/app/building-your-application/configuring/content-security-policy

3. Cache-Control per griežtas statiniams failams

📍 Problema:
Statiniai failai (JS/CSS/images) per griežtas cache → kasmet redownloadinami
📂 Kur:
Next.js next.config.js arba Vercel vercel.json
🎯 Tikslas:
Statiniai failai: 1 metai, HTML: no-cache/must-revalidate
🔧 Fix (next.config.js):
// next.config.js
const nextConfig = {
  async headers() {
    return [
      {
        source: '/_next/static/:path*',
        headers: [
          {
            key: 'Cache-Control',
            value: 'public, max-age=31536000, immutable'
          }
        ]
      },
      {
        source: '/static/:path*',
        headers: [
          {
            key: 'Cache-Control',
            value: 'public, max-age=31536000, immutable'
          }
        ]
      },
      {
        source: '/:path*.{jpg,jpeg,png,gif,webp,svg,ico}',
        headers: [
          {
            key: 'Cache-Control',
            value: 'public, max-age=31536000, immutable'
          }
        ]
      },
      {
        source: '/:path*',
        headers: [
          {
            key: 'Cache-Control',
            value: 'public, max-age=0, must-revalidate'
          }
        ]
      }
    ]
  }
}

module.exports = nextConfig
🔧 Alternatyva (vercel.json):
// vercel.json
{
  "headers": [
    {
      "source": "/_next/static/(.*)",
      "headers": [
        {
          "key": "Cache-Control",
          "value": "public, max-age=31536000, immutable"
        }
      ]
    },
    {
      "source": "/static/(.*)",
      "headers": [
        {
          "key": "Cache-Control",
          "value": "public, max-age=31536000, immutable"
        }
      ]
    },
    {
      "source": "/(.*).{jpg,jpeg,png,gif,webp,svg,ico}",
      "headers": [
        {
          "key": "Cache-Control",
          "value": "public, max-age=31536000, immutable"
        }
      ]
    }
  ]
}
✅ Tikrinimas:
# Statiniai failai (turi būti max-age=31536000)
curl -I https://vibegen.eu/_next/static/XXX.js | grep -i cache-control

# HTML (turi būti max-age=0 arba no-cache)
curl -I https://vibegen.eu | grep -i cache-control

🟡 SVARBŪS Priority 2

4. llms.txt išplėtimas (2KB → 10-15KB)

📍 Problema:
Dabartinis llms.txt per basic (2KB). IdeaProof turi 49KB, ValidatorAI 1.6KB su trust signals
📂 Kur:
public/llms.txt arba app/llms.txt/route.ts (App Router)
🎯 Tikslas:
Comprehensive llms.txt su FAQ, citation templates, trust signals, use cases
🔧 Fix (public/llms.txt):

Pilnas optimizuotas llms.txt failas paruoštas SEO agento. Kopijuok visą turinį iš:

/home/clawd_yt/.openclaw/workspace-seo/data/deliverables/vibegen-eu-llm-seo.md
Section 6: PARUOŠTAS LLMS.TXT KODAS
💡 Ką prideda naujas llms.txt:
  • Quick Facts: Product name, type, speed, pricing → voice assistants
  • Primary Topics: AI citavimo temos (20+ keywords)
  • FAQ Patterns: Voice search queries (10+ patterns)
  • Citation Templates: Kaip AI modeliai turėtų cituoti
  • Use Case Keywords: 5 audience segments su keywords
  • Industry Keywords: 10 industry vertikalų
  • Comparison Keywords: vs ChatPRD, ValidatorAI, etc.
  • Multi-Language: 4 kalbos (ES, FR, DE, PT)
✅ Tikrinimas:
# Patikrink ar llms.txt pasiekiamas
curl https://vibegen.eu/llms.txt

# Patikrink dydį (turi būti ~10-15KB)
curl -I https://vibegen.eu/llms.txt | grep -i content-length

5. FAQ Schema.org Markup

📍 Problema:
FAQ sekcija yra, bet nėra FAQPage schema → Google neindeksuoja kaip FAQ
📂 Kur:
Pagrindinio puslapio <head> arba FAQ komponente
🎯 Tikslas:
Google FAQ rich snippets → daugiau CTR
🔧 Fix (FAQ component):
// components/FAQ.tsx
export default function FAQ() {
  const faqData = {
    "@context": "https://schema.org",
    "@type": "FAQPage",
    "mainEntity": [
      {
        "@type": "Question",
        "name": "How does VibeGen generate ideas?",
        "acceptedAnswer": {
          "@type": "Answer",
          "text": "VibeGen uses Claude Sonnet, Claude Opus, and ChatGPT to analyze your skills, tech stack, and interests. The AI generates 3-5 unique project ideas scored on market potential, competition, and vibe-codeability."
        }
      },
      {
        "@type": "Question",
        "name": "Is VibeGen really free?",
        "acceptedAnswer": {
          "@type": "Answer",
          "text": "Yes! Free tier includes 3 credits per month (enough for 1 idea + PRD preview). No credit card required. Paid plans start at €12/month for more credits."
        }
      },
      {
        "@type": "Question",
        "name": "How accurate is the AI research?",
        "acceptedAnswer": {
          "@type": "Answer",
          "text": "VibeGen uses Tavily API for real-time web search + AI analysis. Market research includes competitor analysis, market sizing, SEO keywords, and revenue estimates. Pro-level research provides deeper insights."
        }
      },
      {
        "@type": "Question",
        "name": "Can I export my PRDs and tasks?",
        "acceptedAnswer": {
          "@type": "Answer",
          "text": "Yes! Pro plan exports to GitHub Issues, Linear, Notion, Jira, Markdown, PDF, and Clipboard. Each task includes title, description, acceptance criteria, and estimated complexity."
        }
      },
      {
        "@type": "Question",
        "name": "Is VibeGen designed for vibe coding?",
        "acceptedAnswer": {
          "@type": "Answer",
          "text": "Absolutely! VibeGen generates project blueprints optimized for AI coding assistants like Claude Code, Cursor, Windsurf, and GitHub Copilot. Tasks include clear context and acceptance criteria."
        }
      },
      {
        "@type": "Question",
        "name": "What tech stacks does VibeGen recommend?",
        "acceptedAnswer": {
          "@type": "Answer",
          "text": "VibeGen recommends modern stacks: React, TypeScript, Next.js, Supabase, Firebase, PostgreSQL, Vercel, Vite. AI analyzes your preferences and suggests optimal combinations."
        }
      }
    ]
  }

  return (
    <>
      <script
        type="application/ld+json"
        dangerouslySetInnerHTML={{ __html: JSON.stringify(faqData) }}
      />
      <section className="faq">
        {/* FAQ UI here */}
      </section>
    </>
  )
}
✅ Tikrinimas:
  1. Eik į Google Rich Results Test
  2. Įklijuok https://vibegen.eu
  3. Turi rasti FAQPage schema

6. TTFB Optimizacija (237ms → <150ms)

📍 Problema:
TTFB 237ms → galima geriau su ISR/Edge Functions
📂 Kur:
Next.js revalidation strategy arba Vercel Edge Config
🎯 Tikslas:
TTFB <150ms → greitesnis pirmas byte'as
🔧 Fix 1: ISR (Incremental Static Regeneration):
// app/page.tsx (App Router)
export const revalidate = 3600 // revalidate every 1 hour

export default async function HomePage() {
  // ... page content
}

// arba Pages Router
// pages/index.tsx
export async function getStaticProps() {
  return {
    props: {},
    revalidate: 3600 // revalidate every 1 hour
  }
}
🔧 Fix 2: Edge Runtime:
// app/page.tsx
export const runtime = 'edge'

export default async function HomePage() {
  // ... page content
}
🔧 Fix 3: Vercel Edge Config:
// vercel.json
{
  "functions": {
    "app/**": {
      "runtime": "edge"
    }
  }
}
💡 Rekomendacija: Naudok ISR statiniams puslapiams (landing, pricing, about) + Edge Runtime dynamic puslapiams (dashboard). Tai sumažins TTFB iki <100ms.
✅ Tikrinimas:
# Patikrink TTFB su curl
curl -w "@curl-format.txt" -o /dev/null -s https://vibegen.eu

# curl-format.txt turinys:
# time_namelookup:  %{time_namelookup}\n
# time_connect:  %{time_connect}\n
# time_appconnect:  %{time_appconnect}\n
# time_pretransfer:  %{time_pretransfer}\n
# time_redirect:  %{time_redirect}\n
# time_starttransfer:  %{time_starttransfer}\n
# ----------\n
# time_total:  %{time_total}\n

# ARBA naudok GTmetrix / WebPageTest

🟢 NICE-TO-HAVE Priority 3

7. Trust Signals (User Count, Stats, Testimonials)

📍 Problema:
Nėra social proof → AI modeliai nemato trust signalų
📂 Kur:
Landing page → Stats section + Testimonials component
🎯 Tikslas:
AI modeliai cituoja "trusted by 500+ indie hackers" / "4.8/5 rating"
🔧 Fix (Stats Component):
// components/Stats.tsx
export default function Stats() {
  return (
    <section className="stats">
      <h2>Trusted by Indie Hackers Worldwide</h2>
      <div className="stat-grid">
        <div className="stat">
          <strong>500+</strong>
          <span>Indie Hackers</span>
        </div>
        <div className="stat">
          <strong>2,000+</strong>
          <span>PRDs Generated</span>
        </div>
        <div className="stat">
          <strong>10,000+</strong>
          <span>Project Ideas</span>
        </div>
        <div className="stat">
          <strong>50+</strong>
          <span>Projects Launched</span>
        </div>
      </div>
    </section>
  )
}
🔧 Fix (Testimonials Component):
// components/Testimonials.tsx
const testimonials = [
  {
    text: "VibeGen saved me 2 weeks of planning. Generated a PRD in 60 seconds and exported to Linear. Game changer for vibe coding.",
    author: "Alex, Solo SaaS Founder"
  },
  {
    text: "Best AI tool for indie hackers. I validated 5 ideas, picked one, and built my MVP in 2 weeks with Cursor.",
    author: "Maria, Technical Co-Founder"
  },
  {
    text: "The only tool that does idea → PRD → tasks → GitHub export in one pipeline. Worth every cent.",
    author: "Josh, Side Hustler"
  }
]

export default function Testimonials() {
  return (
    <section className="testimonials">
      <h2>What Indie Hackers Say</h2>
      <div className="testimonial-grid">
        {testimonials.map((t, i) => (
          <blockquote key={i}>
            {t.text}
            <cite>— {t.author}</cite>
          </blockquote>
        ))}
      </div>
    </section>
  )
}
💡 Kaip gauti testimonials: Email beta users, prašyk feedback, pasiūlyk 1 mėn free Pro už review. Surink 10-20 testimonials, parink geriausius 3-5.

8. Blog Setup (Content Marketing Foundation)

📍 Problema:
ZERO blog → zero backlinks → zero AI citavimas
📂 Kur:
app/blog/page.tsx + app/blog/[slug]/page.tsx
🎯 Tikslas:
25 straipsnių (indie hacker, vibe coding, PRD topics) → SEO + AI training fuel
🔧 Fix (Blog struktura):
// Failų struktūra
app/
  blog/
    page.tsx              // Blog listing
    [slug]/
      page.tsx            // Blog post
    _posts/
      how-to-validate-saas-idea-2026.md
      10-best-indie-hacker-projects.md
      vibe-coding-ultimate-guide.md
      ...
🔧 Fix (app/blog/page.tsx):
// app/blog/page.tsx
import fs from 'fs'
import path from 'path'
import matter from 'gray-matter'

export const metadata = {
  title: 'Blog | VibeGen',
  description: 'Indie hacking, vibe coding, and AI-powered project planning guides.'
}

async function getPosts() {
  const postsDirectory = path.join(process.cwd(), 'app/blog/_posts')
  const filenames = fs.readdirSync(postsDirectory)
  
  return filenames.map(filename => {
    const filePath = path.join(postsDirectory, filename)
    const fileContents = fs.readFileSync(filePath, 'utf8')
    const { data } = matter(fileContents)
    
    return {
      slug: filename.replace('.md', ''),
      ...data
    }
  })
}

export default async function BlogPage() {
  const posts = await getPosts()
  
  return (
    <div>
      <h1>Blog</h1>
      {posts.map(post => (
        <article key={post.slug}>
          <h2><a href={`/blog/${post.slug}`}>{post.title}</a></h2>
          <p>{post.excerpt}</p>
        </article>
      ))}
    </div>
  )
}
🔧 Fix (app/blog/[slug]/page.tsx):
// app/blog/[slug]/page.tsx
import fs from 'fs'
import path from 'path'
import matter from 'gray-matter'
import { marked } from 'marked'

export async function generateStaticParams() {
  const postsDirectory = path.join(process.cwd(), 'app/blog/_posts')
  const filenames = fs.readdirSync(postsDirectory)
  
  return filenames.map(filename => ({
    slug: filename.replace('.md', '')
  }))
}

async function getPost(slug: string) {
  const filePath = path.join(process.cwd(), 'app/blog/_posts', `${slug}.md`)
  const fileContents = fs.readFileSync(filePath, 'utf8')
  const { data, content } = matter(fileContents)
  
  return {
    frontmatter: data,
    html: marked(content)
  }
}

export default async function BlogPost({ params }: { params: { slug: string } }) {
  const { frontmatter, html } = await getPost(params.slug)
  
  return (
    <article>
      <h1>{frontmatter.title}</h1>
      <time>{frontmatter.date}</time>
      <div dangerouslySetInnerHTML={{ __html: html }} />
    </article>
  )
}
💡 Blog straipsnių temos (25):
  • Indie Hacker: "How to Validate a SaaS Idea in 2026", "10 Best Project Ideas for Indie Hackers"
  • Vibe Coding: "Best AI Coding Tools for Vibe Coders", "How to Build a SaaS with Vibe Coding"
  • PRD: "How to Write a PRD in 5 Minutes with AI", "PRD Template for Indie Hackers"
  • Comparisons: "VibeGen vs ChatPRD", "Best AI Project Idea Generators 2026"
  • Case Studies: "How [User] Built a $10k MRR SaaS with VibeGen"
Pilnas sąrašas: /home/clawd_yt/.openclaw/workspace-seo/data/deliverables/vibegen-eu-llm-seo.md Section 5.2
✅ Tikrinimas:
# Patikrink ar blog pasiekiamas
curl https://vibegen.eu/blog

# Patikrink ar sitemap.xml turi blog posts
curl https://vibegen.eu/sitemap.xml | grep blog

9. Founder Bio & Visibility (E-E-A-T)

📍 Problema:
Nėra founder bio → zero E-E-A-T signalas → AI modeliai nežino kas autorius
📂 Kur:
app/about/page.tsx + LinkedIn + Twitter
🎯 Tikslas:
AI modeliai cituoja "according to [Founder], creator of VibeGen"
🔧 Fix (About page):
// app/about/page.tsx
export default function AboutPage() {
  return (
    <div>
      <h1>About VibeGen</h1>
      
      <section>
        <h2>About the Founder</h2>
        <p>
          VibeGen was created by <strong>[Your Name]</strong>, a [role] 
          with [X] years of experience in [field].
        </p>
        <p>
          [Your Name] has [achievements]:
        </p>
        <ul>
          <li>Built [X] SaaS products</li>
          <li>Helped [Y] indie hackers launch projects</li>
          <li>Expert in [tech stack / AI / product development]</li>
        </ul>
        <p>
          Before VibeGen, [Your Name] worked at [companies] and contributed 
          to [projects].
        </p>
        <div className="social-links">
          <a href="[LinkedIn]">LinkedIn</a>
          <a href="[Twitter]">Twitter/X</a>
          <a href="mailto:[email]">Email</a>
        </div>
      </section>
    </div>
  )
}
💡 Founder Visibility Checklist:
  • ✅ LinkedIn: Pridėti "Founder of VibeGen" į Experience
  • ✅ Twitter/X: Postinti apie indie hacking, vibe coding, AI tools
  • ✅ Indie Hackers: Launch post + build in public updates
  • ✅ Guest posts: DEV.to, Medium, Hashnode
  • ✅ Podcast/YouTube: Kalbėti apie VibeGen journey

LLM-SEO Optimizacija

Dabartinis statusas: ZERO AI citatų (Brave Search AI paieškose). Konkurentai (ChatPRD, ValidatorAI, IdeaProof, Sparkraft) cituojami.

Įrankis llms.txt AI Citatai Kodėl cituojami?
MakePRD.ai Nėra Taip Indie Hackers targeting, social proof
ValidatorAI 1.6KB Taip 200k+ users, ratings, trust signals
IdeaProof 49KB! Taip Mega llms.txt, statistics, multi-language
Sparkraft.io Nėra Taip Niche targeting ("indie hackers" title tag)
vibegen.eu 2KB ZERO ❌ Zero backlinks, zero social proof, founder invisible
💡 Kodėl vibegen.eu nėra cituojamas:
  • Zero Backlinks: Nėra blog → nėra SEO turinio → AI modeliai neturi nuorodų
  • Zero Social Proof: Nėra user count, ratings, testimonials → zero trust signalai
  • Zero Turinys: Nėra guides, case studies → nėra "citation hooks"
  • Founder Invisible: Nėra bio, LinkedIn, Twitter → zero E-E-A-T
  • llms.txt per basic: 2KB vs IdeaProof 49KB → trūksta FAQ, citation templates

TOP 10 LLM-SEO Rekomendacijų

  1. Išplėsti llms.txt (2KB → 10-15KB) — PRIORITY #1 — FIX #4
  2. Sukurti blog (25 straipsniai: indie hacker, vibe coding, PRD) — FIX #8
  3. Pridėti trust signals (user count, stats, testimonials) — FIX #7
  4. Founder visibility (bio, LinkedIn, Twitter) — FIX #9
  5. 📝 Indie Hackers engagement (launch post, discussions, build in public)
  6. 📝 Reddit strategy (r/SaaS, r/SideProject, value-first comments)
  7. 📝 Product Hunt launch (backlink + reviews)
  8. 📝 Statistikų pridėjimas (generation speed, user count, success rate)
  9. 📝 GitHub repository (open source templates → developer community)
  10. 📝 Multi-language support (Spanish, French, German, Portuguese)

Pilnas LLM-SEO planas: /home/clawd_yt/.openclaw/workspace-seo/data/deliverables/vibegen-eu-llm-seo.md

Content Strategy (6-12 mėn planas)

📝 Blog Straipsniai (25)

Kategorija Straipsniai SEO Tikslas
Indie Hacker 5 straipsniai "indie hacker project ideas", "indie hacker tools"
Vibe Coding 5 straipsniai "vibe coding tools", "AI coding assistants"
PRD & Planning 5 straipsniai "AI PRD generator", "how to write PRD"
Tool Comparisons 5 straipsniai "vibegen vs chatprd", "best AI idea generators"
Case Studies 5 straipsniai Success stories, user wins, testimonials
💡 Blog Workflow:
  1. Sukurti 5 straipsnius per mėnesį (1 per savaitę)
  2. Kiekvienas straipsnis: 1,500+ žodžių, keyword-optimized
  3. Internal links → vibegen.eu puslapiai
  4. Dalintis Indie Hackers, Reddit, Twitter
  5. Guest post opportunities → backlinks

🚀 Community Engagement

Platforma Strategija Tikslas
Indie Hackers Launch post + weekly updates + discussions Backlinks + community trust
Reddit Value-first comments + launch post (r/SaaS, r/SideProject) Backlinks + organic traffic
Product Hunt Launch + engage + reviews Backlink + badge + reviews
Twitter/X Founder posts + user wins + build in public Brand awareness + founder visibility
LinkedIn Founder thought leadership + company page E-E-A-T + B2B trust

📊 Tikėtinas Poveikis (6-12 mėn)

Metrika Dabartis 6 mėn 12 mėn
LLM Citatai 0 5-10 per mėn 20-50 per mėn
Organic Traffic Baseline +100% +200%
Domain Authority DA 10 DA 20 DA 30
Backlinks ~10 50+ 100+
Brand Awareness Low Medium High