Skip to main content
The database module handles all Supabase interactions for the llms.txt Generator. It manages site metadata, crawl scheduling, content change detection, and recrawl timing optimization.

Overview

The database module provides functions for:
  • Storing crawl metadata and results
  • Tracking content changes and recrawl intervals
  • Finding sites due for recrawling
  • Adaptive scheduling based on content change frequency
  • Sitemap lastmod tracking

Data Models

CrawlSite

Data class representing a tracked site in the database.
str
required
Unique site identifier (UUID)
str
required
Base URL of the tracked site
int
required
Configured recrawl interval in minutes
int
required
Maximum pages to crawl per run
int
required
Maximum description/snippet length
datetime | None
Timestamp of last crawl attempt
str | None
MD5 hash of latest llms.txt content
str | None
Public URL of latest llms.txt file
datetime | None
Scheduled time for next crawl
datetime | None
Timestamp when content last changed
str | None
URL to check for quick change detection
datetime | None
Most recent lastmod from sitemap entries
float | None
Calculated average time between content changes
str | None
Secret for webhook-triggered crawls

Functions

get_supabase_client()

Creates and returns a Supabase client instance.
Client | None
Supabase client instance, or None if credentials not configured
Configuration: Requires settings.supabase_url and settings.supabase_key to be set.

save_site_metadata()

Saves or updates site metadata after a crawl with content changes.
str
required
Site base URL (used as unique key)
int
required
Recrawl interval in minutes
int
required
Maximum pages to crawl
int
required
Description length setting
str
required
MD5 hash of the llms.txt content
str
required
Public URL of uploaded llms.txt
str | None
default:"None"
Optional sentinel URL (defaults to base_url)
bool
True if save succeeded, False otherwise
Behavior:
  • Uses upsert with base_url as conflict key
  • Sets last_crawled_at and last_changed_at to current time
  • Calculates next_crawl_at by adding recrawl interval
  • Initializes avg_change_interval_minutes to recrawl interval
  • Sets sentinel_url to base_url if not provided

get_due_sites()

Retrieves all sites that are due for recrawling.
list[CrawlSite]
List of sites where next_crawl_at is in the past
Query:
Use Case: Called by scheduler/cron to find sites needing recrawl.

update_scheduling_only()

Updates scheduling metadata without changing content fields (used when content hasn’t changed).
str
required
Site ID to update
datetime
required
Scheduled time for next crawl
datetime | None
required
Latest lastmod from sitemap (if available)
bool
True if update succeeded, False otherwise
Updates:
  • last_crawled_at → current time
  • next_crawl_at → provided value
  • sitemap_newest_lastmod → provided value (if not None)
  • updated_at → current time
Does NOT update:
  • latest_llms_hash
  • latest_llms_url
  • last_changed_at
  • avg_change_interval_minutes

update_crawl_result()

Updates site metadata after a crawl with content changes.
str
required
Site ID to update
str
required
New llms.txt content hash
str
required
Public URL of new llms.txt file
datetime
required
Scheduled time for next crawl
datetime | None
required
When content changed (usually current time)
datetime | None
required
Latest lastmod from sitemap
float | None
required
Calculated average change interval
bool
True if update succeeded, False otherwise
Updates:
  • last_crawled_at → current time
  • next_crawl_at → provided value
  • last_changed_at → provided value
  • avg_change_interval_minutes → provided value
  • latest_llms_hash → new hash
  • latest_llms_url → new URL
  • sitemap_newest_lastmod → provided value (if not None)
  • updated_at → current time

Usage Examples

Initial Site Crawl

Scheduled Recrawl

Adaptive Scheduling

Sitemap-Based Scheduling

Database Schema

The crawl_sites table structure:
  • storage - Provides public URLs stored in latest_llms_url
  • crawler - Uses settings from CrawlSite for recrawls
  • config - Provides Supabase credentials

Notes

  • All datetime values use UTC timezone
  • Upsert uses base_url as unique constraint
  • Returns False on error instead of raising exceptions
  • Client creation is lazy (only when needed)
  • All database operations are gracefully skipped if Supabase not configured