### Install Dependencies and Run Dev Server
Source: https://specivo.io/docs/specivo/install
Use these make commands to install development dependencies and start the dev server with hot-reloading. This setup is intended for evaluation or contributing to Specivo.
```bash
make install
# install dependencies
make dev-up
# run the dev server with hot-reload
```
--------------------------------
### Copy Example .env File
Source: https://specivo.io/docs/specivo/install/configuration
Copy the example .env file to start configuring your environment.
```bash
cp .env.example .env
```
--------------------------------
### Install Django SEO Suite Package
Source: https://specivo.io/docs/django-seo-suite/installation
Use pip to install the django-seo-suite package.
```bash
pip install django-seo-suite
```
--------------------------------
### Example Robots.txt Output with Sitemaps
Source: https://specivo.io/docs/django-seo-suite/guides/robots-txt
This is an example of how the robots.txt file might look with sitemap URLs appended.
```text
User-agent: *
Allow: /
Sitemap: https://example.com/sitemap.xml
Sitemap: https://example.com/news-sitemap.xml
```
--------------------------------
### Install seopath App
Source: https://specivo.io/docs/django-seo-suite/guides/seopath
Add 'seo_suite' and 'seo_suite.contrib.seopath' to your INSTALLED_APPS.
```python
INSTALLED_APPS = [
"seo_suite",
"seo_suite.contrib.seopath",
]
```
--------------------------------
### Install seoobject
Source: https://specivo.io/docs/django-seo-suite/guides/seoobject
Add seo_suite and seo_suite.contrib.seoobject to your INSTALLED_APPS. Ensure django.contrib.contenttypes is also present.
```python
INSTALLED_APPS = [
"django.contrib.contenttypes", # usually already present
"seo_suite",
"seo_suite.contrib.seoobject",
]
```
--------------------------------
### Run Database Migrations
Source: https://specivo.io/docs/django-seo-suite/guides/seopath
Apply database migrations after installing the seopath app.
```python
python manage.py migrate
```
--------------------------------
### Clone Specivo and Start Docker Compose
Source: https://specivo.io/docs/specivo/install/docker
Clone the Specivo repository and start all services in detached mode using Docker Compose. This command also pulls the necessary Docker images if they are not already present.
```bash
git clone https://github.com/specivo/specivo.git
cd specivo
docker compose up -d
```
--------------------------------
### Complete SEO Suite Settings Example
Source: https://specivo.io/docs/django-seo-suite/reference/settings
This snippet shows a comprehensive example of how to configure the SEO_SUITE dictionary in your Django settings. It covers global defaults, site-specific settings, canonical URL configurations, hreflang settings, caching options, and JSON-LD serializer settings.
```python
SEO_SUITE = {
# ---- resolution ----
"RESOLVER_CLASS": "seo_suite.resolver.Resolver",
"SITE_ID_RESOLVER": None,
# ---- global metadata defaults ----
"DEFAULTS": {
"title_suffix": " | My Site",
"robots": "index,follow",
"og": {
"type": "website",
"site_name": "My Site",
},
"twitter": {},
},
# ---- per-site defaults ----
"SITE_DEFAULTS": {},
# ---- canonical ----
"CANONICAL_DOMAIN": "www.mysite.com",
"FORCE_HTTPS_CANONICAL": True,
"LIST_CANONICAL_INCLUDES_PAGE": True,
# ---- hreflang ----
"HREFLANG_X_DEFAULT": True,
# ---- caching ----
"CACHE_TTL": 300,
"CACHE_BACKEND": "default",
"CACHE_KEY_PREFIX": "seosuite:v1",
# ---- optional providers ----
"OBJECT_MODELS": [],
# ---- JSON-LD ----
"DEFAULT_SCHEMA_PROFILES": [],
"JSONLD_SERIALIZER": "seo_suite.schema.default_serializer",
# ---- admin ----
"ADMIN_GROUP_APPS": True,
# ---- robots.txt ----
"ROBOTS_TXT_FALLBACK": "User-agent: *\nAllow: /",
"ROBOTS_SITEMAP_URLS": [],
"ROBOTS_CACHE_TTL": 0,
}
```
--------------------------------
### Start Specivo Stack with Docker Compose
Source: https://specivo.io/docs/specivo/install/air-gapped
Bring up the Specivo services in detached mode using Docker Compose on the offline host.
```bash
docker compose up -d
```
--------------------------------
### Example: SEO for django-oscar Product Model
Source: https://specivo.io/docs/django-seo-suite/guides/seoobject
Demonstrates how to configure seoobject for a third-party model like django-oscar's Product and integrate it with a Django view using SeoViewMixin.
```python
# settings.py
SEO_SUITE = {
"OBJECT_MODELS": ["catalogue.product"],
}
```
```python
# yourapp/views.py
from django.views.generic import DetailView
from seo_suite.mixins import SeoViewMixin
from oscar.apps.catalogue.models import Product
class ProductDetailView(SeoViewMixin, DetailView):
model = Product
template_name = "catalogue/product_detail.html"
```
--------------------------------
### Basic List View Setup
Source: https://specivo.io/docs/django-seo-suite/guides/listing-pages
Integrate SeoListViewMixin into a Django ListView to automatically handle SEO for listing pages. Set seo_title and seo_description directly on the view.
```python
# blog/views.py
from django.views.generic import ListView
from seo_suite.mixins import SeoListViewMixin
from .models import Article
class ArticleList(SeoListViewMixin, ListView):
model = Article
queryset = Article.objects.filter(published=True).order_by("-published_at")
paginate_by = 20
seo_title = "All Articles"
seo_description = "Browse the full archive."
```
--------------------------------
### Rendered SEO Head Block Example
Source: https://specivo.io/docs/django-seo-suite/quickstart
Example of the rendered HTML head block with SEO metadata, including title, description, robots, canonical URL, and Open Graph tags.
```html
How Django Routing Works
```
--------------------------------
### Example Subtask Hierarchy
Source: https://specivo.io/docs/specivo/issues/subtasks
Illustrates a typical parent-child relationship for issues, showing how subtasks are nested under a parent issue.
```text
ACME-1 Checkout redesign (parent)
├─ ACME-2 Cart page
│ ├─ ACME-5 Update line-item layout
│ └─ ACME-6 Wire up quantity stepper
└─ ACME-3 Payment step
└─ ACME-7 Add saved-card selector
```
--------------------------------
### Clone Specivo Repository
Source: https://specivo.io/docs/specivo/install/air-gapped
Clone the Specivo repository to obtain the `docker-compose.yml`, nginx configuration, and `.env.example` file needed for the offline installation.
```bash
git clone https://github.com/specivo/specivo.git
```
--------------------------------
### Render hreflang alternates in HTML
Source: https://specivo.io/docs/django-seo-suite/guides/hreflang
Example of the generated hreflang link tags for a specific URL.
```html
```
--------------------------------
### Example Open Graph HTML Output
Source: https://specivo.io/docs/django-seo-suite/guides/open-graph
This snippet shows the typical HTML output for Open Graph meta tags on an article page, including type, site name, title, description, URL, and image.
```html
```
--------------------------------
### Run Migrations
Source: https://specivo.io/docs/django-seo-suite/guides/seoobject
After adding the apps to INSTALLED_APPS, run the Django migrations to set up the necessary database tables.
```bash
python manage.py migrate
```
--------------------------------
### Create First Admin User
Source: https://specivo.io/docs/specivo/install/docker
Create the initial administrator account from the command line. Ensure you use a strong password and a valid email address.
```bash
docker compose exec api python -m specivo.cli.admin create \
--login admin --email you@example.com --password 'choose-a-strong-one'
```
--------------------------------
### Create Initial Admin User
Source: https://specivo.io/docs/specivo/install/air-gapped
Create the first administrator user for Specivo using the command-line interface on the offline host. Ensure a strong password is used.
```bash
docker compose exec api python -m specivo.cli.admin create \
--login admin --email you@example.com --password 'choose-a-strong-one'
```
--------------------------------
### Generate Configuration Files
Source: https://specivo.io/docs/specivo/install/configuration
Use the make command or a Python script to generate both .env and .env.local files, including a strong SECRET_KEY.
```bash
make configure # or: python scripts/configure.py
```
--------------------------------
### Rendered Title with Suffix
Source: https://specivo.io/docs/django-seo-suite/quickstart
Example of the rendered HTML title tag including the site-wide suffix.
```html
How Django Routing Works | My Blog
```
--------------------------------
### Markdown Headings
Source: https://specivo.io/docs/specivo/reference/markdown
Use '#' for headings in Markdown. Start with '##' in wikis as the page title is already H1.
```markdown
# Heading 1
## Heading 2
### Heading 3
```
--------------------------------
### Pull New Image and Restart Containers
Source: https://specivo.io/docs/specivo/install/upgrading
Fetch the latest Docker image and restart your services to apply the upgrade. The entrypoint automatically handles database migrations on startup.
```bash
docker compose pull
docker compose up -d
```
--------------------------------
### Article Model with SeoModelMixin
Source: https://specivo.io/docs/django-seo-suite/guides/blog-posts
Example of a Django model inheriting from SeoModelMixin, automatically picking up conventional field names for SEO metadata.
```python
from django.db import models
from seo_suite.mixins import SeoModelMixin
class Article(SeoModelMixin, models.Model):
title = models.CharField(max_length=200)
description = models.TextField(blank=True)
image = models.ImageField(upload_to="articles/", blank=True)
slug = models.SlugField(unique=True)
def get_absolute_url(self):
return f"/articles/{self.slug}/"
```
--------------------------------
### Basic SEO Suite Settings Configuration
Source: https://specivo.io/docs/django-seo-suite/reference/settings
Configure the SEO Suite by defining the `SEO_SUITE` dictionary in your `settings.py`. Only include keys you wish to modify, as unspecified keys will use package defaults.
```python
# settings.py
SEO_SUITE = {
# ... only the keys you want to change ...
}
```
--------------------------------
### Register Custom Provider via pyproject.toml Entry Point
Source: https://specivo.io/docs/django-seo-suite/extending
Alternatively, publish an entry point in your package's `pyproject.toml` under the `seo_suite.extensions` group to register custom providers. This mechanism is idempotent and safe with Django's autoreload.
```toml
[project.entry-points."seo_suite.extensions"]
mypackage = "mypackage.seo_extensions"
```
--------------------------------
### Monitor API Logs After Upgrade
Source: https://specivo.io/docs/specivo/install/upgrading
Watch the API service logs to confirm a successful startup and that the upgrade is complete. The upgrade is finished when the API service reports healthy.
```bash
docker compose logs -f api
```
--------------------------------
### Custom Site ID Resolver Example
Source: https://specivo.io/docs/django-seo-suite/guides/site-defaults
Implement a custom callable for SITE_ID_RESOLVER in settings.py to dynamically determine the current site ID based on request logic, such as subdomain routing.
```python
# myapp/utils.py
def my_site_id_resolver(request):
if request.get_host().startswith("shop."):
return 2
return 1
```
```python
# settings.py
SEO_SUITE = {
"SITE_ID_RESOLVER": "myapp.utils.my_site_id_resolver",
}
```
--------------------------------
### Accessing Seo Object in Django Views/Middleware
Source: https://specivo.io/docs/django-seo-suite/reference/seo-metadata
Use resolve_seo to get the seo object without memoization, or attach_seo to resolve and memoize it on the request. get_attached retrieves a memoized result.
```python
from seo_suite.context import resolve_seo, attach_seo
# Resolve (not memoized):
seo = resolve_seo(request, view=view, obj=obj)
# Resolve and memoize on the request:
seo = attach_seo(request, view=view, obj=obj)
# Read back a memoized result without re-resolving:
from seo_suite.context import get_attached
seo = get_attached(request) # None if not yet resolved
```
--------------------------------
### Accessing Resolved SEO Metadata in Django Views
Source: https://specivo.io/docs/django-seo-suite/how-resolution-works
Use the `resolve_seo` function to get the finalized SEO metadata object within your Django views or other Python code. This object contains all resolved fields ready for use.
```python
from seo_suite.context import resolve_seo
def my_view(request):
seo = resolve_seo(request)
print(seo.title)
print(seo.canonical_url)
print(seo.jsonld)
```
--------------------------------
### Configure Sitemap URLs for Robots.txt
Source: https://specivo.io/docs/django-seo-suite/guides/robots-txt
Specify a list of sitemap URLs to be appended to the robots.txt file. Relative URLs will be made absolute based on the request.
```python
SEO_SUITE = {
"ROBOTS_SITEMAP_URLS": [
"https://example.com/sitemap.xml",
"/news-sitemap.xml", # relative URLs are made absolute against the request
],
}
```
--------------------------------
### Basic Article Sitemap Configuration
Source: https://specivo.io/docs/django-seo-suite/guides/sitemaps
Define a sitemap for Article objects using `SeoSitemap`. Set change frequency and priority. Ensure your `Article` model is filterable.
```python
from seo_suite.sitemaps import SeoSitemap
from .models import Article
class ArticleSitemap(SeoSitemap):
changefreq = "weekly"
priority = 0.8
def items(self):
return Article.objects.filter(published=True)
```
--------------------------------
### Django SEO Suite - Metadata Layer
Source: https://specivo.io
An example of the Django SEO Suite's functionality for managing SEO metadata. This library provides a consistent API for titles, meta tags, and other SEO elements across Django models and views.
```python
from seo_suite.models import SeoTags
# Example usage within a Django view or model
seo_tags = SeoTags.objects.create(
title="My Awesome Page",
meta_description="This is a description for my awesome page.",
# ... other SEO fields
)
```
--------------------------------
### Import Precedence Constants
Source: https://specivo.io/docs/django-seo-suite/extending
Use public constants like `PRECEDENCE_GLOBAL`, `PRECEDENCE_SITE`, `PRECEDENCE_PATH`, `PRECEDENCE_OBJECT`, and `PRECEDENCE_VIEW` when registering providers to control their position in the precedence ladder.
```python
from seo_suite.extension import (
PRECEDENCE_GLOBAL, # 10
PRECEDENCE_SITE, # 20
PRECEDENCE_PATH, # 30
PRECEDENCE_OBJECT, # 40
PRECEDENCE_VIEW, # 50
)
```
--------------------------------
### Import Signal Handlers
Source: https://specivo.io/docs/django-seo-suite/extending
Import signals like `seo_metadata_resolved`, `seo_head_rendering`, and `seo_cache_invalidate` from `seo_suite.extension` to hook into specific events within the SEO suite.
```python
from seo_suite.extension import seo_metadata_resolved, seo_head_rendering, seo_cache_invalidate
```
--------------------------------
### SeoViewMixin with a Generic View
Source: https://specivo.io/docs/django-seo-suite/guides/detail-views
Demonstrates using `SeoViewMixin` with a generic `View` that implements `get_context_data`. The `object` attribute is optional but passed to the resolver if present.
```python
from django.views.generic.base import View
from django.shortcuts import get_object_or_404
from seo_suite.mixins import SeoViewMixin
from seo_suite.context import attach_seo
class MyCustomView(SeoViewMixin, View):
seo_title = "Custom Page"
def get(self, request, pk):
self.object = get_object_or_404(Article, pk=pk)
seo = attach_seo(request, view=self, obj=self.object)
# ... render response ...
```
--------------------------------
### Add Django SEO Suite to INSTALLED_APPS
Source: https://specivo.io/docs/django-seo-suite/installation
Configure your Django settings to include the 'seo_suite' app and any desired optional contrib apps.
```python
# settings.py
INSTALLED_APPS = [
# ... your existing apps ...
"seo_suite",
# Optional: admin-editable SEO keyed by URL path
# Adds one table, one migration, Django Admin integration.
"seo_suite.contrib.seopath",
# Optional: admin-editable SEO for third-party models via generic relation
# Requires django.contrib.contenttypes (usually already present).
"seo_suite.contrib.seoobject",
]
```
--------------------------------
### Include Robots.txt URLs in Root Conf
Source: https://specivo.io/docs/django-seo-suite/guides/robots-txt
Add this path to your project's root urls.py to enable serving robots.txt.
```python
# urls.py
from django.urls import include, path
urlpatterns = [
# ...
path("", include("seo_suite.urls")), # serves /robots.txt
]
```
--------------------------------
### Provide Rich Images with get_schema_image
Source: https://specivo.io/docs/django-seo-suite/guides/json-ld
Implement `get_schema_image` to return a schema.org `ImageObject` instead of a bare URL. This allows you to include `contentUrl`, `thumbnailUrl`, `width`, and `height` for richer image results. The `key` argument allows you to specify which profiles this applies to.
```python
class Article(SeoModelMixin, models.Model):
cover = models.ImageField(upload_to="covers/")
SEO_SCHEMA_PROFILES = ["Article", "BreadcrumbList"]
def get_schema_image(self, key, context=None):
# The `key` argument is a per-profile switch: return a value only
# for the profiles you want, and None to fall back / skip.
if key != "Article":
return None
thumb = get_thumbnailer(self.cover)["card"] # your thumbnail backend
return {
"@type": "ImageObject",
"contentUrl": self.cover.url,
"thumbnailUrl": thumb.url,
"width": self.cover.width,
"height": self.cover.height,
}
```
--------------------------------
### Implement FAQPage Schema
Source: https://specivo.io/docs/django-seo-suite/guides/json-ld
Provide a get_faqs method that returns a list of (question, answer) tuples or dictionaries for FAQPage schema.
```python
def get_faqs(self):
return self.faq_items.values_list("question", "answer")
# or:
return [
{"question": "What is …?", "answer": "It is …"},
{"q": "How do I …?", "a": "You can …"},
]
```
--------------------------------
### SSE Client Configuration for Specivo
Source: https://specivo.io/docs/specivo/ai-agents/connecting
Add this JSON configuration to your client's MCP settings for SSE-compatible clients (Claude Code, Cursor, Windsurf, Cline). Ensure you replace 'your-specivo-host' and 'spv_your_api_key_here' with your actual details.
```json
{
"mcpServers": {
"specivo": {
"type": "sse",
"url": "https://your-specivo-host/mcp/sse/",
"headers": { "Authorization": "Bearer spv_your_api_key_here" }
}
}
}
```
--------------------------------
### Configure External Database and Redis
Source: https://specivo.io/docs/specivo/install/configuration
Point DATABASE_URL and REDIS_URL to external services if you prefer not to use the bundled ones. Ensure your PostgreSQL has the pgvector extension.
```dotenv
# .env
DATABASE_URL=postgresql+asyncpg://user:pass@db.example.com:5432/specivo
REDIS_URL=redis://cache.example.com:6379/0
```
--------------------------------
### Download Semantic Search Model
Source: https://specivo.io/docs/specivo/install/configuration
Download the semantic search model using the make command. This model is approximately 393 MB and is stored under SPECIVO_DATA_DIR.
```bash
make download-model # ~393 MB, stored under SPECIVO_DATA_DIR
```
--------------------------------
### Configure seopath for Multi-site and Multilingual
Source: https://specivo.io/docs/django-seo-suite/guides/seopath
Create separate SeoPath rows for each site and language combination to manage SEO metadata effectively.
```django
Path | Site ID | Language | Title
---|---|---|---
/about/ | 1 | | About Us
/about/ | 2 | | About Our UK Team
/about/ | 1 | fr | À propos de nous
```
--------------------------------
### Configure SMTP for Email Notifications
Source: https://specivo.io/docs/specivo/install/configuration
Configure SMTP settings in .env to enable Specivo to send email notifications. Sensitive credentials like SMTP_PASSWORD should be placed in .env.local.
```dotenv
# .env
SMTP_HOST=smtp.example.com
SMTP_PORT=587
SMTP_TLS=true
SMTP_USER=notifications@example.com
SMTP_PASSWORD=... # put the password in .env.local
```
--------------------------------
### Configure Robots.txt Sitemap Directive
Source: https://specivo.io/docs/django-seo-suite/guides/sitemaps
Add your sitemap URL to the `SEO_SUITE` setting to have it automatically included in the `robots.txt` file as a `Sitemap:` directive. This helps crawlers discover your sitemap.
```python
SEO_SUITE = {
"ROBOTS_SITEMAP_URLS": ["https://example.com/sitemap.xml"],
}
```
--------------------------------
### Configure Robots.txt Fallback Content
Source: https://specivo.io/docs/django-seo-suite/guides/robots-txt
Define the default content for robots.txt when no active version is set. This setting is used if SEO_SUITE["ROBOTS_TXT_FALLBACK"] is not explicitly configured.
```python
SEO_SUITE = {
"ROBOTS_TXT_FALLBACK": "User-agent: *\nAllow: /",
}
```
--------------------------------
### Load SEO Suite Library and Render Head
Source: https://specivo.io/docs/django-seo-suite/reference/template-tags
Load the SEO Suite library using {% load seo_suite %} and render the complete head metadata block with {% seo_head %}. This tag internally includes all granular partials for title, meta description, keywords, robots, canonical, hreflang, OpenGraph, Twitter cards, and JSON-LD.
```django
{% load seo_suite %}
{% seo_head %}
```
--------------------------------
### Upload File via Specivo REST API
Source: https://specivo.io/docs/specivo/ai-agents/capabilities
Use this snippet to upload binary files to Specivo. It requires the Specivo host URL, your API key, and the file path. Ensure the Authorization header and URL format are correct.
```bash
curl -X POST https://your-specivo-host/api/v1/attachments/ \
-H "Authorization: Bearer spv_your_api_key_here" \
-F "file=@./diagram.png"
```
--------------------------------
### Specivo Wiki Cross-links
Source: https://specivo.io/docs/specivo/reference/markdown
Link to other wiki pages within the same project using double brackets, by title or slug.
```markdown
See [[Release Process]] for the steps.
```
--------------------------------
### Static Pages Sitemap
Source: https://specivo.io/docs/django-seo-suite/guides/sitemaps
Create a sitemap for static pages or views that do not have associated models. The `items` method should return a list of paths, and `location` should return the path itself.
```python
from django.contrib.sitemaps import Sitemap
class StaticViewSitemap(Sitemap):
priority = 0.5
def items(self):
return ["/about/", "/contact/", "/privacy/"]
def location(self, item):
return item
```
--------------------------------
### Configure Specivo Version for Offline Use
Source: https://specivo.io/docs/specivo/install/air-gapped
Set the `SPECIVO_VERSION` in the `.env` file on the offline host to ensure Docker Compose uses the locally loaded image.
```bash
# .env
SPECIVO_VERSION=0.1.10
```
--------------------------------
### Fully Dynamic SEO Metadata with SeoMetadata.partial
Source: https://specivo.io/docs/django-seo-suite/guides/model-less-views
Override `get_seo_metadata` to return a `SeoMetadata.partial` object for complete control over SEO fields. This allows dynamic generation of title, robots, and other metadata based on request or user data.
```python
from seo_suite.mixins import SeoViewMixin
from seo_suite.metadata import SeoMetadata
from django.views.generic import TemplateView
class UserDashboardView(SeoViewMixin, TemplateView):
template_name = "dashboard/index.html"
def get_seo_metadata(self, context=None):
user = self.request.user
return SeoMetadata.partial(
title=f"{user.first_name}'s Dashboard",
robots="noindex,nofollow", # personal pages should not be indexed
)
```
--------------------------------
### Markdown Tables
Source: https://specivo.io/docs/specivo/reference/markdown
Create tables using pipes '|' and hyphens '-' for structure.
```markdown
| Field | Type | Required |
|----------|--------|----------|
| subject | string | yes |
| due date | date | no |
```
--------------------------------
### Constructing a Partial SeoMetadata Object
Source: https://specivo.io/docs/django-seo-suite/reference/seo-metadata
Use SeoMetadata.partial() to create an object with specific fields set. All other fields will be in an UNSET state.
```python
from seo_suite.metadata import SeoMetadata
# Only the named fields are set; all others are UNSET.
md = SeoMetadata.partial(
title="My Page",
meta_description="A description.",
robots="noindex",
)
```
--------------------------------
### Basic DetailView with SeoViewMixin
Source: https://specivo.io/docs/django-seo-suite/guides/detail-views
Integrate SeoViewMixin into a Django DetailView to automatically use SEO metadata from your Article model.
```python
from django.views.generic import DetailView
from seo_suite.mixins import SeoViewMixin
from .models import Article
class ArticleDetail(SeoViewMixin, DetailView):
model = Article
slug_field = "slug"
slug_url_kwarg = "slug"
```
--------------------------------
### Register and Unregister Providers
Source: https://specivo.io/docs/django-seo-suite/extending
Manage providers using the `provider_registry`. Use `register` to add a provider and `unregister` to remove one by its dotted path.
```python
from seo_suite.extension import provider_registry, Provider, SeoMetadata
provider_registry.register(my_provider)
provider_registry.unregister("mypackage.providers.MyProvider")
```
--------------------------------
### Configure AI Tool for Specivo MCP Server
Source: https://specivo.io
Add this configuration to your AI tool's MCP settings to enable it to communicate with the Specivo MCP server. Ensure the URL and apiKey are correctly set for your environment.
```json
// Add to your AI tool's MCP config:
{
"mcpServers": {
"specivo": {
"url": "http://localhost:8000/mcp",
"apiKey": "spv_your_key_here"
}
}
}
```
--------------------------------
### Add hreflang to a Detail View
Source: https://specivo.io/docs/django-seo-suite/guides/hreflang
Integrate hreflang alternates into a Django DetailView using SeoViewMixin and build_hreflang_alternates.
```python
from django.views.generic import DetailView
from seo_suite.mixins import SeoViewMixin
from seo_suite.hreflang import build_hreflang_alternates
from seo_suite.metadata import SeoMetadata
from .models import Article
class ArticleDetail(SeoViewMixin, DetailView):
model = Article
def get_seo_metadata(self, context=None):
alternates = build_hreflang_alternates(
self.request.path,
self.request,
)
return SeoMetadata.partial(hreflang=alternates)
```
--------------------------------
### Static SEO Metadata for TemplateView
Source: https://specivo.io/docs/django-seo-suite/guides/model-less-views
Use class attributes like `seo_title`, `seo_description`, and `seo_canonical` with `SeoViewMixin` and `TemplateView` for static pages. Global defaults will fill in any missing attributes.
```python
from django.views.generic import TemplateView
from seo_suite.mixins import SeoViewMixin
class AboutView(SeoViewMixin, TemplateView):
template_name = "pages/about.html"
seo_title = "About Us"
seo_description = "Learn who we are and what we do."
seo_canonical = "/about/"
class PrivacyPolicyView(SeoViewMixin, TemplateView):
template_name = "pages/privacy.html"
seo_title = "Privacy Policy"
seo_robots = "noindex"
```
--------------------------------
### Markdown Links and Images
Source: https://specivo.io/docs/specivo/reference/markdown
Create hyperlinks with text and URLs, and embed images using alt text and URLs.
```markdown
[Link text](https://specivo.example.com)

```
--------------------------------
### Archive Specivo Data Directory
Source: https://specivo.io/docs/specivo/install/backup-restore
Creates a gzipped tar archive of the Specivo data directory, which contains attachments and bundled database files. Store this archive along with the database dump.
```bash
tar czf specivo-data-backup.tar.gz specivo-data
```
--------------------------------
### Monitor Docker Compose Services
Source: https://specivo.io/docs/specivo/install/docker
Check the status of running services and follow the logs of the API container. The API container automatically handles database migrations and seeding upon startup.
```bash
docker compose ps
```
```bash
docker compose logs -f api
```