DEV Community

Cover image for I Built a Programmatic SEO Site with Astro & DeepSeek API (300+ Pages for $1.65
Rasel Khan
Rasel Khan

Posted on

I Built a Programmatic SEO Site with Astro & DeepSeek API (300+ Pages for $1.65

The Problem: AI Fatigue 🤯

There are too many AI tools. I wanted to build a "Referee" site that compares them (e.g., ChatGPT vs Claude, Notion vs Obsidian) and gives a definitive verdict.

But I had two constraints:

Zero Budget: I didn't want to pay for a database or expensive hosting.

Scalability: I needed to generate 300+ pages, but I didn't want to write them manually.

The Solution: The "pSEO" Stack 🛠️

I chose a JAMstack architecture focused on speed and low cost:

Frontend: Astro (SSG mode)

Styling: Tailwind CSS

Content Engine: Python + DeepSeek V3 API

Database: A single JSON file

Hosting: Vercel (Free Tier)

Here is the live demo: PrismKit.xyz

Step 1: The "Database" (JSON) 📂

Instead of setting up Postgres or MongoDB, I just used a flat JSON file. It's fast, free, and version-controllable.

// tools_database.json
[
{
"id": "notion",
"name": "Notion",
"category": "Productivity",
"alternatives": ["obsidian", "evernote"]
},
{
"id": "obsidian",
"name": "Obsidian",
"category": "Productivity",
"alternatives": ["notion"]
}
]

Step 2: The Content Factory (Python + DeepSeek) 🤖

This is the magic part. I needed unique comparisons for every pair. Writing them by hand is impossible. Using GPT-4o is expensive.

I used DeepSeek V3 via their API (OpenAI compatible). It's incredibly cheap (~$0.05 for the whole site).

Here is the simplified logic of my content_factory.py:

from openai import OpenAI
import json
client = OpenAI(
api_key="sk-...",
base_url="https://api.deepseek.com"
)
def generate_verdict(tool_a, tool_b):
prompt = f"Compare {tool_a} and {tool_b}. Who should use which? Be concise."

response = client.chat.completions.create(
    model="deepseek-chat",
    messages=[{"role": "user", "content": prompt}]
)

return response.choices[0].message.content

Loop through tools and save to JSON...

The script runs locally, updates the JSON file with the AI-generated insights, and then I push the JSON to GitHub.

Step 3: Dynamic Routing in Astro 🚀

Astro makes Programmatic SEO (pSEO) trivial with getStaticPaths. I created one file: src/pages/vs/[...slug].astro.

// src/pages/vs/[...slug].astro
export async function getStaticPaths() {
const tools = await import('../../data/tools_database.json');

// Generate all possible pairs
const paths = [];
tools.forEach(tool => {
tool.alternatives.forEach(altId => {
paths.push({
params: { slug: ${tool.id}-vs-${altId} },
props: { toolA: tool, toolB: getToolById(altId) }
});
});
});
return paths;
}
const { toolA, toolB } = Astro.props;

This single file generates hundreds of static HTML pages at build time. No client-side JS is needed to fetch data.

Step 4: Deployment ⚡

I pushed the code to GitHub, and Vercel automatically built the site.
Because it's pure HTML/CSS, the performance is insane.

Vercel Dashboard Screenshot

The Result

Cost: $1.65 (Domain) + $0.05 (API) = $1.70

Performance: 100/100 Lighthouse

Content: Unique, useful AI verdicts for 300+ pairs.

Check it out here:

Project Prism - Compare 50+ AI Tools & Find the Best Alternatives

Discover and compare 103 AI tools across 39 categories. Find features, pricing, pros, cons, and alternatives.

favicon PrismKit.xyz

Let me know if you have any questions about the Astro + DeepSeek workflow! 👇

Top comments (0)