Why These Markets?
Fish Compatibility Checker (AquaMateCheck)
Problem: Every fish compatibility site I found had low authority (DA 15-25). Fishori, TankBrain, AquariumStocking — all new sites, no traction.
Opportunity:
- Google "can betta live with guppy" → first page has a forum post from 2014
- No algorithm-based tools exist
- All competitors are forum posts or static charts
My approach: Pairwise compatibility scoring based on 4 scientific parameters:
- Temperature overlap (°F range intersection)
- pH overlap (range intersection)
- Temperament match (peaceful + peaceful = good)
- Size predation risk (large mouth + tiny fish = predation)
Yarn Substitution Tool (StitchMatch)
Problem: Discontinued yarns are everywhere. Lion Brand "Homespun" (my grandma's favorite) was discontinued in 2023. People search for substitutes but find:
- Random Reddit posts
- Outdated blog posts from 2019
- Forum threads with contradictory advice
Opportunity:
- No DA 50+ site specializes in yarn substitution
- Yarnize (DA 15-25) is new and low-authority
- Search intent is clear: "yarn substitute for [brand] [name]"
My approach: Match based on 3 physical parameters:
- Gauge (stitches per 4 inches) — most critical
- Weight category (CYC 0-7 classification)
- Yards per gram (yardage ratio)
Technical Architecture
pSEO Strategy
Fish Compatibility:
- 18 fish species → C(18,2) = 153 pairwise pages
- Each page title matches search intent: "Can [Fish A] live with [Fish B]?"
- Natural language titles = users search exactly this
Yarn Substitution:
- 15 yarns indexed → each yarn has a profile page
- Discontinued yarns highlighted with ⚠️ badge
- Top 5 substitutes ranked by gauge/weight/fiber match
Static Site Generator (Python)
Both projects use the same SSG pattern:
# build.py
from jinja2 import Environment, FileSystemLoader
def build_site():
# Load JSON data
fish_data = load_json("fish.json")
# Generate pairwise pages
for (slug_a, fish_a), (slug_b, fish_b) in combinations(fish_data.items(), 2):
compatibility = calculate_compatibility(fish_a, fish_b)
html = render("compatibility.html", {
"fish_a": fish_a,
"fish_b": fish_b,
"compatibility": compatibility
})
write_html(f"compatibility/{slug_a}/{slug_b}", "index.html", html)
Zero dependencies — no Node.js, no npm, no React. Just Python + Jinja2.
Differentiated Design
Fish Compatibility (Deep Ocean Blue Theme)
| Feature | Competitor | My Approach |
|---|---|---|
| Theme | Light generic | Deep ocean blue (#001a0f background) |
| Core Tool | Static chart | Quick Answer box + JS calculator |
| Data Source | Forum posts | FishBase.org (scientific database) |
| Methodology | Vague advice | 4-step algorithmic scoring |
| EEAT Signal | None | Methodology section + FishBase citation |
Key innovation: Water Parameter Overlap Table
- Users see exact temperature/pH overlap (e.g., "72-78°F ✓ 6.5-7.5 ✓")
- No vague "these fish might work"
Yarn Substitution (Morandi Warm Tone)
| Feature | Competitor | My Approach |
|---|---|---|
| Theme | Modern minimalist | Warm craft aesthetic (#f5f3f0 background) |
| Core Tool | Basic search | Gauge + Weight + Fiber matching score |
| Discontinued Alert | No warning | ⚠️ badge + "Discontinued" tag |
| Calculator | None | Yardage calculator (skein conversion) |
| Data Source | User submissions | Brand TDS sheets (official data) |
Key innovation: Yardage Calculator
- Pattern calls for 5 skeins of discontinued yarn → you need X skeins of substitute
- Accounts for yards/gram ratio differences
Results After 1 Week
Fish Compatibility (jw-fishcheck.web.app)
| Metric | Value |
|---|---|
| Pages Built | 143 (153 pairs + 18 profiles + 3 tools + index) |
| Deploy Time | 5 seconds (Firebase Hosting) |
| Zero Cost | Firebase free tier |
| SEO Structure | Clean URLs, sitemap, robots.txt |
Yarn Substitution (jw-yarnswap.web.app)
| Metric | Value |
|---|---|
| Pages Built | 35 (15 profiles + 10 brands + 4 weights + calculator + index) |
| Deploy Time | 5 seconds |
| Zero Cost | Firebase free tier |
Lessons Learned
1. Blue Ocean Markets Are Real
Both markets have zero high-authority competitors. This is not theoretical:
- Fish compatibility: All sites DA < 30
- Yarn substitution: No dedicated site exists
Mainstream publishers avoid these niches because:
- Brand safety: "Can Oscar eat Neon Tetra?" is violent content
- Advertiser pressure: "Yarn substitute for discontinued brand" = product replacement (bad for advertisers)
2. pSEO > Manual Content
Pairwise generation creates natural search-intent titles:
- "Can Betta live with Guppy?" = exactly what users search
- "Red Heart Super Saver substitute" = exactly what users search
No keyword research needed — the titles ARE the keywords.
3. Static Sites Beat CMS
| CMS Approach | Static Site Approach |
|---|---|
| Database query per page | Pre-generated HTML files |
| Server rendering | CDN-delivered static files |
| $10/month hosting | Firebase free tier |
| Slow TTFB | <100ms TTFB |
4. Scientific Data > Forum Wisdom
Fish compatibility based on FishBase.org = authoritative.
Yarn substitution based on brand TDS = authoritative.
Users trust citations over "some guy on Reddit said..."
What's Next
Phase 1 (Completed)
- ✅ Fish compatibility: 18 species → 153 pairwise pages
- ✅ Yarn substitution: 15 yarns → profile pages + brand/weight categories
- ✅ Deployed to Firebase (JW account)
- ✅ Fixed 404 issues (added
/fish/and/yarn/list pages)
Phase 2 (Planned)
- Add 50+ fish species → C(50,2) = 1,225 compatibility pages
- Add 100+ yarns → comprehensive substitution database
- Add GSC verification + submit sitemaps
- Monitor impressions/clicks after 30 days
Links
- Fish Compatibility Checker: https://jw-fishcheck.web.app
- Yarn Substitution Tool: https://jw-yarnswap.web.app
Both are free, no ads, no tracking. Just tools that solve niche problems.
Why This Approach Works
- Zero competition: All mainstream sites avoid these topics
- Clear search intent: Users search "can X live with Y" or "substitute for X"
- Scientific data: FishBase + Brand TDS = authoritative sources
- Static generation: Fast, free hosting, zero maintenance
- pSEO scale: Pairwise pages = exponential growth without manual work
The lesson: Don't compete in crowded markets. Find niches where all competitors have DA < 30, then build authoritative tools with scientific data.
Top comments (0)