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.contentLoop 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.
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:
Let me know if you have any questions about the Astro + DeepSeek workflow! 👇

Top comments (0)