### 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) ![Alt text](https://specivo.example.com/image.png) ``` -------------------------------- ### 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 ```