# Brigid
A simple blog engine—but not simpler than it should be.
## **Demo**
- My blog: [tiendil.org](https://tiendil.org/) — see it in action with all features.
- Sources of the blog: [tiendil-org-content](https://github.com/Tiendil/tiendil-org-content) — see how the content is organized.
Or run the project from the root of this repository:
```bash
poetry install
./bin/dev-server.sh
```
## Features
- **Monolithic design** — install and run. No need to look for plugins or themes.
- **Extensive tag support** for navigating and organizing content.
- **Markdown as a source code** for posts.
- **Multi-language support** by design.
### Extensive tag support
- Powerful tag filtering for posts. Especially useful if your blog is also your knowledge base.
- Similar post suggestions based on common tags & links (configurable).
- Post collections: for instance, if you want an always-up-to-date list of posts tagged `travels` and `best`.
- Post series: for example, if you want a dedicated set of posts marked by a special tag like `my-cool-experiments-with-chatgpt`.
- Prev/Next post navigation for series of posts.
### Markdown as a source
- Every page is a Markdown file.
- Each Markdown file has a TOML frontmatter with metadata.
- In addition to standard Markdown features, Brigid supports custom blocks:
- Lists of posts in a collection.
- Contents of a post series.
- Image / gallery.
- YouTube video.
- Spoilers / details.
- Info blocks (admonitions).
- Tables.
- Including content from other files (snippets).
### Multi-language support
- Cross-linking between posts/pages in different languages.
- SEO support for multi-language content.
- Configurable translations.
- Configurable per-language site menu.
- Auto-detect language by headers and redirect users to the right entry point, e.g. `my-cool-blog.org` -> `my-cool-blog.org/<language>/`
- Auto-marking links to posts that are not translated yet. For example, if you have a post in German and want to link to your English post that currently lacks a German translation (but might have one later).
### Other features
- Mobile-friendly.
- SEO-friendly.
- No default cookies.
- Custom headers/footers with JS code.
- Last posts block on the post page.
- Configurable redirects on the content side—no need to inject them in your reverse proxy configs.
## How to run
Set environment variables:
```bash
BRIGID_ENVIRONMENT="prod"
# Path to your content directory.
# You can find examples here:
# - ./test-content
# - https://github.com/Tiendil/tiendil-org-content/tree/main/content
BRIGID_LIBRARY_DIRECTORY="<path-to-your-content-dir>"
# Optional: Brigid will store files here for your reverse proxy to serve.
BRIGID_API_CACHE_DIRECTORY="<path-to-your-cache-dir>"
# Python list of allowed origins for CORS:
BRIGID_ORIGINS="[\"https://my-site.org\"]"
```
Install and run the server:
```bash
pip install brigid uvicorn
uvicorn brigid.application.application:app \
--host 0.0.0.0 \
--port 8000 \
--workers 4
```
That’s it! You’ll have a server running on port 8000.
Consider the following for production deployment:
- Process Management: Use a process manager like systemd, supervisord, or Docker to ensure reliable, long-term operation.
- Reverse Proxy: Set up a reverse proxy such as Nginx or Caddy to enhance performance and security.
### Design principles
A subjective list of design principles I follow in this project:
- One solid, stable, simple, up-to-date solution. Just install and run.
- Markdown won ⇒ use Markdown as the primary source for posts.
- TOML won ⇒ use TOML for metadata and frontmatter instead of YAML.
- No unnecessary or unused features.
- Designed for non-trivial posts: long, multi-language, with images, tables, code, etc.
- Server-side rendering is good — use it as the primary approach.
- Use minimal JS only when truly required.
- No CSS experiments—only stable, verified solutions.
Raw data
{
"_id": null,
"home_page": null,
"name": "brigid",
"maintainer": null,
"docs_url": null,
"requires_python": "<4.0,>=3.12",
"maintainer_email": null,
"keywords": "blog, blog-engine, site, markdown, cms, content management system, personal site",
"author": "Aliaksei Yaletski (Tiendil)",
"author_email": "a.eletsky@gmail.com",
"download_url": "https://files.pythonhosted.org/packages/0a/0d/9b26c4d0c6b1142d87905f23152327e589b0b40e5579ed8aece643d17d58/brigid-0.12.1.tar.gz",
"platform": null,
"description": "# Brigid\n\nA simple blog engine\u2014but not simpler than it should be.\n\n## **Demo**\n\n- My blog: [tiendil.org](https://tiendil.org/) \u2014 see it in action with all features.\n- Sources of the blog: [tiendil-org-content](https://github.com/Tiendil/tiendil-org-content) \u2014 see how the content is organized.\n\nOr run the project from the root of this repository:\n\n```bash\npoetry install\n\n./bin/dev-server.sh\n```\n\n## Features\n\n- **Monolithic design** \u2014 install and run. No need to look for plugins or themes.\n- **Extensive tag support** for navigating and organizing content.\n- **Markdown as a source code** for posts.\n- **Multi-language support** by design.\n\n### Extensive tag support\n\n- Powerful tag filtering for posts. Especially useful if your blog is also your knowledge base.\n- Similar post suggestions based on common tags & links (configurable).\n- Post collections: for instance, if you want an always-up-to-date list of posts tagged `travels` and `best`.\n- Post series: for example, if you want a dedicated set of posts marked by a special tag like `my-cool-experiments-with-chatgpt`.\n- Prev/Next post navigation for series of posts.\n\n### Markdown as a source\n\n- Every page is a Markdown file.\n- Each Markdown file has a TOML frontmatter with metadata.\n- In addition to standard Markdown features, Brigid supports custom blocks:\n - Lists of posts in a collection.\n - Contents of a post series.\n - Image / gallery.\n - YouTube video.\n - Spoilers / details.\n - Info blocks (admonitions).\n - Tables.\n - Including content from other files (snippets).\n\n### Multi-language support\n\n- Cross-linking between posts/pages in different languages.\n- SEO support for multi-language content.\n- Configurable translations.\n- Configurable per-language site menu.\n- Auto-detect language by headers and redirect users to the right entry point, e.g. `my-cool-blog.org` -> `my-cool-blog.org/<language>/`\n- Auto-marking links to posts that are not translated yet. For example, if you have a post in German and want to link to your English post that currently lacks a German translation (but might have one later).\n\n### Other features\n\n- Mobile-friendly.\n- SEO-friendly.\n- No default cookies.\n- Custom headers/footers with JS code.\n- Last posts block on the post page.\n- Configurable redirects on the content side\u2014no need to inject them in your reverse proxy configs.\n\n## How to run\n\nSet environment variables:\n\n```bash\nBRIGID_ENVIRONMENT=\"prod\"\n\n# Path to your content directory.\n# You can find examples here:\n# - ./test-content\n# - https://github.com/Tiendil/tiendil-org-content/tree/main/content\nBRIGID_LIBRARY_DIRECTORY=\"<path-to-your-content-dir>\"\n\n# Optional: Brigid will store files here for your reverse proxy to serve.\nBRIGID_API_CACHE_DIRECTORY=\"<path-to-your-cache-dir>\"\n\n# Python list of allowed origins for CORS:\nBRIGID_ORIGINS=\"[\\\"https://my-site.org\\\"]\"\n\n```\n\nInstall and run the server:\n\n```bash\npip install brigid uvicorn\n\nuvicorn brigid.application.application:app \\\n --host 0.0.0.0 \\\n --port 8000 \\\n --workers 4\n```\n\nThat\u2019s it! You\u2019ll have a server running on port 8000.\n\nConsider the following for production deployment:\n\n- Process Management: Use a process manager like systemd, supervisord, or Docker to ensure reliable, long-term operation.\n- Reverse Proxy: Set up a reverse proxy such as Nginx or Caddy to enhance performance and security.\n\n### Design principles\n\nA subjective list of design principles I follow in this project:\n\n- One solid, stable, simple, up-to-date solution. Just install and run.\n- Markdown won \u21d2 use Markdown as the primary source for posts.\n- TOML won \u21d2 use TOML for metadata and frontmatter instead of YAML.\n- No unnecessary or unused features.\n- Designed for non-trivial posts: long, multi-language, with images, tables, code, etc.\n- Server-side rendering is good \u2014 use it as the primary approach.\n- Use minimal JS only when truly required.\n- No CSS experiments\u2014only stable, verified solutions.\n\n",
"bugtrack_url": null,
"license": "BSD-3-Clause",
"summary": "Static site generator.",
"version": "0.12.1",
"project_urls": {
"Repository": "https://github.com/Tiendil/brigid"
},
"split_keywords": [
"blog",
" blog-engine",
" site",
" markdown",
" cms",
" content management system",
" personal site"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "1b79a257a1f20b3a14f60757adfe2e352cd1effc3660d03fc5401e331920645e",
"md5": "1cf2f4c09064392f624b5678a288eabf",
"sha256": "ecc89da996fe8b002ee43b88f5f05cb43f38c7271450022dd5c5ed4eb5444b9e"
},
"downloads": -1,
"filename": "brigid-0.12.1-py3-none-any.whl",
"has_sig": false,
"md5_digest": "1cf2f4c09064392f624b5678a288eabf",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": "<4.0,>=3.12",
"size": 87093,
"upload_time": "2025-01-12T16:15:57",
"upload_time_iso_8601": "2025-01-12T16:15:57.123010Z",
"url": "https://files.pythonhosted.org/packages/1b/79/a257a1f20b3a14f60757adfe2e352cd1effc3660d03fc5401e331920645e/brigid-0.12.1-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "0a0d9b26c4d0c6b1142d87905f23152327e589b0b40e5579ed8aece643d17d58",
"md5": "0c489e2b0dcba309ce31b2f0f750a790",
"sha256": "9ef6ecf1b5a1ac7164efcf5c7f1f775289447e6a769940d1c766e93d5e54efc0"
},
"downloads": -1,
"filename": "brigid-0.12.1.tar.gz",
"has_sig": false,
"md5_digest": "0c489e2b0dcba309ce31b2f0f750a790",
"packagetype": "sdist",
"python_version": "source",
"requires_python": "<4.0,>=3.12",
"size": 56983,
"upload_time": "2025-01-12T16:16:01",
"upload_time_iso_8601": "2025-01-12T16:16:01.692070Z",
"url": "https://files.pythonhosted.org/packages/0a/0d/9b26c4d0c6b1142d87905f23152327e589b0b40e5579ed8aece643d17d58/brigid-0.12.1.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-01-12 16:16:01",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "Tiendil",
"github_project": "brigid",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "brigid"
}