texsite
texsite delivers great and ready-to-use page templates for the modern, flexible and user-focused web content management system Wagtail CMS backed by the popular Django web framework, both written in Python.
Based on the amazing StreamField introduced with Wagtail release 1.0, which texsite uses extensively, it has never been easier for editors to author awesome pages. Read more on how this concept works in the great blog article Rich text fields and faster horses written by Matt Westcott, lead technical developer of Wagtail.
Project scope
texsite is developed primarily as our own deployable Wagtail application, serving multiple themed sites from a single instance. It is published to PyPI for provenance and reuse, and its themes and blocks are free to draw on. Standalone third-party integration into another Wagtail project is provided as-is and is not a primary supported path.
Features
- Themes:
- Outstanding test coverage
- Continuously integrated codebase
Technical requirements
New feature releases frequently add support for newer versions of underlying technologies and drop support for older ones. The compatible versions of Wagtail, Django and Python for each texsite release are:
| Release | Wagtail | Django | Python |
|---|---|---|---|
| 6.0+ | 7.4 LTS | 5.2 LTS | 3.13 |
| 5.0+ | 6.3 LTS | 4.2 LTS | 3.9, 3.10, 3.11, 3.12, 3.13 |
| 4.0+ | 4.1 LTS | 3.2 LTS | 3.8, 3.9, 3.10, 3.11 |
| 3.0 | 2.11 LTS | 3.1 | 3.8 |
| 2.0 | 2.7 LTS | 2.2 LTS | 3.6, 3.7, 3.8 |
| 1.0 | 2.3 LTS | 1.11 LTS | 3.4, 3.5, 3.6 |
texsite only supports SQLite databases.
Code and contribution
The code is open source and released under the ISC License (ISCL). It is available on Gitlab and follows the guidelines about Semantic Versioning for transparency within the release cycle and backward compatibility whenever possible.
All contributions are welcome, whether bug reports, code contributions and reviews, documentation or feature requests.
If you're a developer, fork the repo and prepare a merge request:
# Prepare your environment
uv sync
git config core.hooksPath .githooks
# Running tests
uv run python -m django test --settings=tests.settings
# Code quality
uv run ruff format texsite tests
uv run ruff check texsite tests
# Translations
uv run python -m django makemessages --all
uv run python -m django compilemessages
Data migrations that transform body JSON via raw SQL must unwrap block items: Wagtail serializes every StreamField block and ListBlock item as a {"type": ..., "value": ..., "id": ...} wrapper, so read item['value'] to reach the actual field value. See texsite/core/migrations/0008_migrate_pages_to_universal.py and 0015_convert_xperience_hero_images.py for the pattern.
Installation
Install texsite directly from PyPI using pip:
pip install texsite
Configuration
All configuration details can be found in texsite/settings/config.py. The available environment variables and their defaults are defined there.
We recommend using a .env file to set the environment variables. manage.py loads it automatically, and it is also recognised by Docker compose.
If you need more flexibility, you may provide your own settings module. This is done by setting the DJANGO_SETTINGS_MODULE environment variable to the path of your custom settings module.
Local development
Run the development server locally without Docker:
cp .env.example .env
mkdir -p .data
uv run python manage.py migrate
uv run python manage.py createsuperuser
uv run python manage.py runserver 127.0.0.1:8000
See the Configuration section above for available environment variables.
Docker
We provide a Dockerfile to build a production-ready image. Production routing lives outside this repository; compose.yml covers local development and pre-release testing — see it for services, ports and mounts.
docker compose run --rm cli migrate # management commands run through `cli`
docker compose up # hot-reloading dev server
docker compose --profile release up --build # prod-like image test
Verifying rendering changes
For template and markup changes, compare screenshots of the live production sites (the known-good baseline) with the local dev server running on a copy of production data. Not every theme has production content for every block type; blocks without a production baseline can only be checked on dev.
For styling changes, the screenshots service shoots a site from the dev server before and after the change and pairs the results side by side. The dev server must accept the site's hostname, for example with TEXSITE_ALLOWED_HOSTS=* in .env.
docker compose run --rm screenshots shoot before www.example.com /,/about/ --selector '.my-class'
# make the change
docker compose run --rm screenshots shoot after www.example.com /,/about/ --selector '.my-class'
docker compose run --rm screenshots compare before after # .screenshots/compare-*.png
Multi-Tenant Hosting
texsite supports multi-tenant hosting where a single instance serves multiple customer domains. Each tenant gets their own:
- Wagtail Site with custom root page
- Collection for media isolation
- User group with scoped permissions
- Site branding (logo/favicon) via Wagtail admin
New Tenant Setup (Wagtail Admin)
- Create root page under the Root page
- Create Wagtail Site pointing to the new root page with correct hostname/port
- Create Collection for tenant media (Images/Documents)
- Create Group with permissions:
add_page,change_page,publish_pageon root pageadd_image,change_image,choose_imageon collectionadd_document,change_document,choose_documenton collection
- Create users and assign to the tenant group
- Configure SiteBranding (Settings > Site branding)
Metadata
Release files for texsite 6.11.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| texsite-6.11.0-py3-none-any.whl | Python 3 | none | any | Details for texsite-6.11.0-py3-none-any.whl |
Release files / texsite-6.11.0-py3-none-any.whl
| Download URL | texsite-6.11.0-py3-none-any.whl |
|---|---|
| Size | 896.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
0363acd71c2e04dc6364cfbd6cbbe9bff8304f4a8dfef29633a7810330dc2675
|
|
BLAKE2b-256 checksum How to use checksums |
471e891b53c1b39db7e08af886348b490e3c656725d4cc9a40f11d03feba37d9
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.9.30 {"installer":{"name":"uv","version":"0.9.30","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"12","id":"bookworm","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Security for texsite 6.11.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.