First Init
Deploy to Production / Build & Verify (push) Failing after 5m56s
Ping Search Engines / Notify Search Engines (push) Successful in 2s
Deploy to Production / Pre-Deploy Tests (push) Has been skipped
Deploy to Production / Deploy to Railway (push) Has been skipped
Deploy to Production / Deploy to Render (push) Has been skipped
Deploy to Production / Deploy to VPS (PM2) (push) Has been skipped
Deploy to Production / Deploy to Fly.io (push) Has been skipped
Deploy to Production / Post-Deploy Verification (push) Has been skipped
Deploy to Production / Notify on Failure (push) Successful in 2s
E2E Test Suite / Critical User Journeys (push) Has been skipped
E2E Test Suite / API Integration Tests (push) Has been skipped
E2E Test Suite / Smoke Tests (P0) (push) Failing after 11m26s
E2E Test Suite / Form Interaction Tests (push) Failing after 11m42s
E2E Test Suite / Destructive & Chaos Tests (push) Failing after 12m2s
E2E Test Suite / Cross-Browser Regression (chromium) (push) Failing after 16m14s
E2E Test Suite / Cross-Browser Regression (webkit) (push) Failing after 17m45s
E2E Test Suite / Cross-Browser Regression (firefox) (push) Failing after 25m23s
E2E Test Suite / Security Header Tests (push) Failing after 7m55s
E2E Test Suite / Test Report Summary (push) Failing after 20s
E2E Test Suite / Mobile Device Tests (push) Failing after 2h49m9s
Uptime Monitor / Health & Response Time (push) Failing after 2s
Uptime Monitor / SSL Certificate (push) Successful in 2s
Uptime Monitor / Send Alerts (push) Failing after 3s
Uptime Monitor / Record Uptime Success (push) Has been skipped
Deploy to Production / Build & Verify (push) Failing after 5m56s
Ping Search Engines / Notify Search Engines (push) Successful in 2s
Deploy to Production / Pre-Deploy Tests (push) Has been skipped
Deploy to Production / Deploy to Railway (push) Has been skipped
Deploy to Production / Deploy to Render (push) Has been skipped
Deploy to Production / Deploy to VPS (PM2) (push) Has been skipped
Deploy to Production / Deploy to Fly.io (push) Has been skipped
Deploy to Production / Post-Deploy Verification (push) Has been skipped
Deploy to Production / Notify on Failure (push) Successful in 2s
E2E Test Suite / Critical User Journeys (push) Has been skipped
E2E Test Suite / API Integration Tests (push) Has been skipped
E2E Test Suite / Smoke Tests (P0) (push) Failing after 11m26s
E2E Test Suite / Form Interaction Tests (push) Failing after 11m42s
E2E Test Suite / Destructive & Chaos Tests (push) Failing after 12m2s
E2E Test Suite / Cross-Browser Regression (chromium) (push) Failing after 16m14s
E2E Test Suite / Cross-Browser Regression (webkit) (push) Failing after 17m45s
E2E Test Suite / Cross-Browser Regression (firefox) (push) Failing after 25m23s
E2E Test Suite / Security Header Tests (push) Failing after 7m55s
E2E Test Suite / Test Report Summary (push) Failing after 20s
E2E Test Suite / Mobile Device Tests (push) Failing after 2h49m9s
Uptime Monitor / Health & Response Time (push) Failing after 2s
Uptime Monitor / SSL Certificate (push) Successful in 2s
Uptime Monitor / Send Alerts (push) Failing after 3s
Uptime Monitor / Record Uptime Success (push) Has been skipped
This commit is contained in:
@@ -0,0 +1,401 @@
|
||||
# Sitemap & Robots.txt Setup Guide
|
||||
|
||||
> **SEO Foundation**: Automated sitemap generation and search engine crawl directives for WorkRoot IT Solutions
|
||||
|
||||
---
|
||||
|
||||
## Overview
|
||||
|
||||
| File | Purpose | Location |
|
||||
|------|---------|----------|
|
||||
| **sitemap.xml** | Dynamic XML sitemap | `src/pages/sitemap.xml.ts` |
|
||||
| **sitemap-index.xml** | Sitemap index (scalability) | `src/pages/sitemap-index.xml.ts` |
|
||||
| **robots.txt** | Crawl directives | `public/robots.txt` |
|
||||
|
||||
**Site URL**: `https://workroot.in`
|
||||
|
||||
---
|
||||
|
||||
## Sitemap Implementation
|
||||
|
||||
### Current Coverage
|
||||
|
||||
| Content Type | Included | Priority | Change Frequency |
|
||||
|--------------|----------|----------|------------------|
|
||||
| Homepage | ✅ | 1.0 | Weekly |
|
||||
| Services | ✅ | 0.9 | Monthly |
|
||||
| Portfolio Index | ✅ | 0.8 | Weekly |
|
||||
| About | ✅ | 0.8 | Monthly |
|
||||
| Blog Index | ✅ | 0.8 | Weekly |
|
||||
| Blog Posts | ✅ | 0.7 | Monthly |
|
||||
| Portfolio Items | ✅ | 0.7 | Monthly |
|
||||
| Contact | ✅ | 0.7 | Monthly |
|
||||
| Legal Pages | ✅ | 0.3 | Yearly |
|
||||
|
||||
### Features
|
||||
|
||||
- ✅ **Dynamic generation** - Automatically includes all published blog posts
|
||||
- ✅ **Draft filtering** - Excludes draft content from sitemap
|
||||
- ✅ **Portfolio support** - Ready for portfolio content collection
|
||||
- ✅ **Last modified dates** - Uses `updatedDate` or `pubDate` from frontmatter
|
||||
- ✅ **Proper namespaces** - Includes news, image, video schemas for future use
|
||||
- ✅ **Caching headers** - 1-hour cache for performance
|
||||
- ✅ **XML formatting** - Valid sitemap protocol
|
||||
|
||||
---
|
||||
|
||||
## Robots.txt Configuration
|
||||
|
||||
### Key Directives
|
||||
|
||||
```
|
||||
User-agent: *
|
||||
Allow: /
|
||||
|
||||
# Block private areas
|
||||
Disallow: /admin/
|
||||
Disallow: /private/
|
||||
Disallow: /_astro/
|
||||
|
||||
# Sitemap location
|
||||
Sitemap: https://workroot.in/sitemap.xml
|
||||
```
|
||||
|
||||
### AI Crawler Support (GEO)
|
||||
|
||||
The robots.txt explicitly allows **AI search engines** for Generative Engine Optimization:
|
||||
|
||||
| Bot | Purpose | Allowed |
|
||||
|-----|---------|---------|
|
||||
| GPTBot | ChatGPT training/search | ✅ |
|
||||
| ChatGPT-User | ChatGPT browsing | ✅ |
|
||||
| anthropic-ai | Claude AI training | ✅ |
|
||||
| Claude-Web | Claude search | ✅ |
|
||||
| PerplexityBot | Perplexity AI | ✅ |
|
||||
| Google-Extended | Gemini/Bard | ✅ |
|
||||
| CCBot | Common Crawl (many AIs) | ✅ |
|
||||
| FacebookBot | Meta AI | ✅ |
|
||||
|
||||
**Why?** AI search engines can cite your content in responses, increasing brand visibility.
|
||||
|
||||
---
|
||||
|
||||
## Search Engine Submission
|
||||
|
||||
### 1. Google Search Console
|
||||
|
||||
**URL**: https://search.google.com/search-console
|
||||
|
||||
#### Steps:
|
||||
1. **Verify ownership**:
|
||||
- Add `google-site-verification` meta tag to `<head>`
|
||||
- Or upload HTML file to `public/`
|
||||
- Or use DNS TXT record
|
||||
|
||||
2. **Submit sitemap**:
|
||||
```
|
||||
Property: https://workroot.in
|
||||
Sitemaps → Add new sitemap
|
||||
URL: https://workroot.in/sitemap.xml
|
||||
```
|
||||
|
||||
3. **Monitor**:
|
||||
- Coverage report (indexed pages)
|
||||
- Enhancement reports (Core Web Vitals)
|
||||
- Performance (search analytics)
|
||||
|
||||
#### Verification Tag
|
||||
Add to `src/components/SEO.astro`:
|
||||
```html
|
||||
<meta name="google-site-verification" content="YOUR_CODE_HERE" />
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 2. Bing Webmaster Tools
|
||||
|
||||
**URL**: https://www.bing.com/webmasters
|
||||
|
||||
#### Steps:
|
||||
1. **Import from Google** (easiest):
|
||||
- Use same Google Search Console account
|
||||
- One-click import
|
||||
|
||||
2. **Or verify manually**:
|
||||
- Add `<meta name="msvalidate.01" content="..." />`
|
||||
- Or upload XML file
|
||||
|
||||
3. **Submit sitemap**:
|
||||
```
|
||||
Sitemaps → Submit sitemap
|
||||
URL: https://workroot.in/sitemap.xml
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 3. Yandex Webmaster
|
||||
|
||||
**URL**: https://webmaster.yandex.com
|
||||
|
||||
#### Steps:
|
||||
1. **Add site**: `https://workroot.in`
|
||||
2. **Verify**: Upload HTML file or add meta tag
|
||||
3. **Submit sitemap**:
|
||||
```
|
||||
Indexing → Sitemap files
|
||||
https://workroot.in/sitemap.xml
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 4. IndexNow (Instant Indexing)
|
||||
|
||||
**What**: Real-time indexing API for Bing, Yandex, and others
|
||||
|
||||
**URL**: https://www.indexnow.org
|
||||
|
||||
#### Implementation:
|
||||
```bash
|
||||
# Generate API key
|
||||
openssl rand -hex 32 > public/[KEY].txt
|
||||
|
||||
# Submit URLs on publish/update
|
||||
curl -X POST "https://api.indexnow.org/indexnow" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{
|
||||
"host": "workroot.in",
|
||||
"key": "YOUR_API_KEY",
|
||||
"urlList": [
|
||||
"https://workroot.in/blog/new-post/"
|
||||
]
|
||||
}'
|
||||
```
|
||||
|
||||
**When to use**: After publishing new blog posts or major updates
|
||||
|
||||
---
|
||||
|
||||
## Sitemap Automation
|
||||
|
||||
### Build-Time Generation
|
||||
|
||||
Sitemap is automatically generated on every build:
|
||||
|
||||
```bash
|
||||
npm run build
|
||||
# Sitemap available at: dist/client/sitemap.xml
|
||||
```
|
||||
|
||||
### Post-Publish Hook (Recommended)
|
||||
|
||||
Create `.github/workflows/sitemap-ping.yml`:
|
||||
|
||||
```yaml
|
||||
name: Ping Search Engines
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [main]
|
||||
paths:
|
||||
- 'src/content/blog/**'
|
||||
- 'src/pages/**'
|
||||
|
||||
jobs:
|
||||
ping:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Ping Google
|
||||
run: |
|
||||
curl "https://www.google.com/ping?sitemap=https://workroot.in/sitemap.xml"
|
||||
|
||||
- name: Ping Bing
|
||||
run: |
|
||||
curl "https://www.bing.com/ping?sitemap=https://workroot.in/sitemap.xml"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Testing & Validation
|
||||
|
||||
### 1. XML Validation
|
||||
|
||||
**Test locally**:
|
||||
```bash
|
||||
# Check XML is valid
|
||||
curl http://localhost:10000/sitemap.xml | xmllint --noout -
|
||||
|
||||
# View in browser
|
||||
open http://localhost:10000/sitemap.xml
|
||||
```
|
||||
|
||||
**Online validators**:
|
||||
- https://www.xml-sitemaps.com/validate-xml-sitemap.html
|
||||
- https://validator.w3.org/feed/
|
||||
|
||||
### 2. Google Sitemap Tester
|
||||
|
||||
```
|
||||
Google Search Console → Sitemaps → Test sitemap
|
||||
```
|
||||
|
||||
### 3. Check Coverage
|
||||
|
||||
**Verify all important pages are included**:
|
||||
```bash
|
||||
curl https://workroot.in/sitemap.xml | grep -o '<loc>[^<]*</loc>'
|
||||
```
|
||||
|
||||
**Expected count**:
|
||||
- Static pages: 9
|
||||
- Blog posts: 3+ (grows with content)
|
||||
- Portfolio items: 0+ (when added)
|
||||
|
||||
---
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
| Issue | Solution |
|
||||
|-------|----------|
|
||||
| Sitemap returns 404 | Check `src/pages/sitemap.xml.ts` exists, rebuild |
|
||||
| Empty sitemap | Check blog posts aren't all `draft: true` |
|
||||
| Search Console errors | Use Sitemap Tester, check XML validity |
|
||||
| Pages not indexed | Check robots.txt doesn't block, verify HTTPS |
|
||||
| Slow indexing | Submit via IndexNow, ping search engines |
|
||||
|
||||
---
|
||||
|
||||
## Maintenance Checklist
|
||||
|
||||
- [ ] **Monthly**: Check Search Console coverage report
|
||||
- [ ] **When publishing**: Ping search engines (manual or automated)
|
||||
- [ ] **Quarterly**: Validate sitemap XML structure
|
||||
- [ ] **When adding collections**: Update `sitemap.xml.ts` to include new content types
|
||||
- [ ] **Annually**: Review robots.txt directives, update AI bot list
|
||||
|
||||
---
|
||||
|
||||
## Adding New Content Types
|
||||
|
||||
### Example: Portfolio Collection
|
||||
|
||||
1. **Create collection** (`src/content/config.ts`):
|
||||
```typescript
|
||||
const portfolio = defineCollection({
|
||||
type: 'content',
|
||||
schema: z.object({
|
||||
title: z.string(),
|
||||
description: z.string(),
|
||||
date: z.coerce.date(),
|
||||
updatedDate: z.coerce.date().optional(),
|
||||
// ... other fields
|
||||
}),
|
||||
});
|
||||
|
||||
export const collections = { blog, portfolio };
|
||||
```
|
||||
|
||||
2. **Sitemap auto-includes** (already implemented in `sitemap.xml.ts`):
|
||||
```typescript
|
||||
// Already done! ✅
|
||||
let portfolioItems: any[] = [];
|
||||
try {
|
||||
portfolioItems = await getCollection('portfolio');
|
||||
} catch (e) {
|
||||
// Collection doesn't exist yet
|
||||
}
|
||||
|
||||
const portfolioPages: SitemapEntry[] = portfolioItems.map((item) => ({
|
||||
url: `/portfolio/${item.slug}/`,
|
||||
lastmod: item.data.updatedDate?.toISOString().split('T')[0],
|
||||
changefreq: 'monthly',
|
||||
priority: 0.7,
|
||||
}));
|
||||
```
|
||||
|
||||
3. **Rebuild & verify**:
|
||||
```bash
|
||||
npm run build
|
||||
curl https://workroot.in/sitemap.xml | grep portfolio
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Performance Optimizations
|
||||
|
||||
### Current Implementation
|
||||
|
||||
| Optimization | Status |
|
||||
|--------------|--------|
|
||||
| Cache-Control header | ✅ 1 hour |
|
||||
| Gzip compression | ✅ Via Nginx/CDN |
|
||||
| XML minification | ✅ No whitespace waste |
|
||||
| Conditional inclusion | ✅ Drafts excluded |
|
||||
| X-Robots-Tag | ✅ Sitemap not indexed |
|
||||
|
||||
### Advanced: Sitemap Index
|
||||
|
||||
**When sitemap exceeds 50,000 URLs**:
|
||||
|
||||
Use `sitemap-index.xml.ts` to split into multiple sitemaps:
|
||||
- `sitemap-blog.xml` - Blog posts
|
||||
- `sitemap-portfolio.xml` - Portfolio
|
||||
- `sitemap-static.xml` - Static pages
|
||||
|
||||
Currently not needed (< 100 URLs), but implementation ready.
|
||||
|
||||
---
|
||||
|
||||
## AI Search Visibility (GEO)
|
||||
|
||||
### Why Allow AI Crawlers?
|
||||
|
||||
| Benefit | Impact |
|
||||
|---------|--------|
|
||||
| **Brand mentions** | Cited in AI responses |
|
||||
| **Authority** | Recognized as source |
|
||||
| **Traffic** | Users click through from AI |
|
||||
| **Future-proof** | AI search is growing |
|
||||
|
||||
### Monitoring AI Citations
|
||||
|
||||
**Track manually**:
|
||||
- Search "[your topic]" in ChatGPT, Claude, Perplexity
|
||||
- Check if workroot.in is cited
|
||||
|
||||
**Tools** (emerging):
|
||||
- https://citationtracker.ai (concept)
|
||||
- Monitor referrer traffic from AI platforms
|
||||
|
||||
---
|
||||
|
||||
## Resources
|
||||
|
||||
| Resource | URL |
|
||||
|----------|-----|
|
||||
| Sitemap Protocol | https://www.sitemaps.org/protocol.html |
|
||||
| Google Sitemap Guide | https://developers.google.com/search/docs/crawling-indexing/sitemaps/overview |
|
||||
| Robots.txt Spec | https://www.robotstxt.org/ |
|
||||
| IndexNow Docs | https://www.indexnow.org/documentation |
|
||||
| AI Crawler List | https://darkvisitors.com/ |
|
||||
|
||||
---
|
||||
|
||||
## Summary
|
||||
|
||||
✅ **Automated sitemap** - Dynamically includes all blog posts
|
||||
✅ **Portfolio-ready** - Supports future portfolio collection
|
||||
✅ **AI-friendly robots.txt** - Allows all major AI crawlers
|
||||
✅ **SEO best practices** - Proper priorities, change frequencies
|
||||
✅ **Scalable architecture** - Sitemap index ready for growth
|
||||
|
||||
**Next steps**:
|
||||
1. Submit sitemap to Google Search Console
|
||||
2. Submit sitemap to Bing Webmaster Tools
|
||||
3. Set up IndexNow for instant indexing
|
||||
4. Monitor coverage reports monthly
|
||||
|
||||
---
|
||||
|
||||
**Generated**: 2026-03-21
|
||||
**Domain**: workroot.in
|
||||
**Agent**: seo-specialist
|
||||
Reference in New Issue
Block a user