tungsten-blog
A blog for your Tungsten panel, built to be found: on Google (SEO), in AI search like ChatGPT, Perplexity and Google AI Overviews (GEO), and in answer boxes and voice assistants (AEO).
What you get
In the panel
- A Blog menu: Posts, Categories, Tags and Authors.
- A post editor with a rich text editor, cover image, draft / publish / schedule, and three tabs: SEO, GEO and AEO.
- A live SEO / GEO / AEO score next to the editor, with a tip for every check that fails. The posts list shows the score too.
- A Preview link for drafts and scheduled posts.
On your site
/blog: the post list with a featured post, categories, search and pages./blog/<slug>: the post, with a summary box, key points, table of contents, how-to steps, FAQs, sources, author box and related posts./blog/category/<slug>,/blog/tag/<slug>,/blog/author/<slug>./blog/feed.xml(RSS),/blog/sitemap.xml, and at the site root/sitemap.xml,/robots.txtand/llms.txt./blog/<slug>.md: a clean Markdown copy of each post, for AI tools.
SEO
Title and meta description, canonical URL, noindex switch, Open Graph and X (Twitter) cards, clean slugs, breadcrumbs, rel=prev/next pages, a sitemap with last-modified dates, and schema.org JSON-LD: BlogPosting, BreadcrumbList, WebSite, Organization and Person.
GEO (generative engine optimization)
What AI search can quote: a short summary (TL;DR) at the top, key points, sources (as citation in the schema), a real author with bio and profile links, "updated" dates, /llms.txt that lists every post with its summary, and a Markdown copy of each post. robots.txt welcomes AI crawlers like GPTBot, ClaudeBot and PerplexityBot (turn off with ai_crawlers=False).
AEO (answer engine optimization)
Direct answers: FAQs shown on the page and as FAQPage schema, how-to steps as HowTo schema, speakable marks for voice assistants, and score checks for question-style headings and short answers.
Install
pip install tungsten-blog
from tungsten import Panel
from tungsten.storage import LocalStorage
from tungsten_blog import BlogPlugin
panel = Panel(
...,
storage=LocalStorage(public=True), # so visitors can see cover images
)
panel.plugin(BlogPlugin(
site_name="Acme",
site_url="https://acme.com",
description="Guides and news from the Acme team.",
logo="https://acme.com/logo.png",
same_as=["https://www.linkedin.com/company/acme"],
nav_links=[("Home", "/"), ("Pricing", "/pricing")],
))
panel.create_tables(engine)
panel.mount(app)
Needs tungsten-admin 0.1.5 or newer.
Options
| Option | Default | What it does |
|---|---|---|
site_name |
"Blog" |
Your site's name, in titles, feeds and schema |
site_url |
panel app_url, else the request host |
Public address used in canonical links, sitemap and schema |
path |
"/blog" |
Where the blog lives |
title |
"Blog" |
Heading of the blog home |
description, logo, language |
Used in meta tags, feeds and schema | |
per_page |
10 |
Posts per page |
site_files |
True |
Serve /sitemap.xml, /robots.txt, /llms.txt at the site root. Turn off if your site has its own |
ai_crawlers |
True |
Allow AI crawlers in robots.txt |
same_as |
[] |
Your organization's profile links |
nav_links |
[] |
Links in the blog header |
twitter |
Your X handle, like @acme |
|
accent |
"#dc2626" |
Link and button color |
llms_intro |
Extra text at the top of llms.txt |
Your own design
The pages are Jinja templates. Copy any of them into one of your panel's template_dirs with the same path to change it:
tungsten_blog/public/layout.html(head tags, header, footer, styles)tungsten_blog/public/index.html(lists)tungsten_blog/public/post.html(a post)tungsten_blog/public/not_found.html
Score in your own code
from tungsten_blog import analyze_post
report = analyze_post(post)
report.score # 0 to 100
report["geo"].checks # each with .ok, .label and .tip
With the MCP plugin
With tungsten-mcp installed, AI assistants like Claude can write and edit posts for you: "Write a draft post about X with 4 FAQs and a summary."
More Tungsten plugins
| Package | What it adds | Docs |
|---|---|---|
tungsten-leads |
Leads list, stages, timeline and your own lead form fields | README |
tungsten-meta-leads |
Facebook and Instagram lead form leads, with one-click setup | Guide |
tungsten-whatsapp |
WhatsApp for leads: click-to-chat, Cloud API or WhatsApp Web | Guide |
tungsten-mcp |
MCP server, so AI assistants like Claude can read and change your data | Guide |
tungsten-tickets |
Help desk: tickets, replies, notes, SLA and a customer support page | Guide |
tungsten-seo-audit |
SEO audit of your website: score, fix tips, AI search checks, history | Guide |
tungsten-security-audit |
Security audit with a score and fix tips, plus a login log with lockout | Guide |
Core package: tungsten-admin. Website and docs: https://tungsten.prisminfoways.com/
Metadata
Release files for tungsten-blog 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| tungsten_blog-0.1.0.tar.gz | 32.7 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| tungsten_blog-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 67.0 kB
Release files / tungsten_blog-0.1.0.tar.gz
| Download URL | tungsten_blog-0.1.0.tar.gz |
|---|---|
| Size | 32.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
8bf941a6a2805147e02294302f701d1e27de85a10832df50df74f4730b6a7891
|
|
BLAKE2b-256 checksum How to use checksums |
d012feecd1045d6c3ced4911395292eb95e325f1d2784580aaad14e13c0cbf56
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Release files / tungsten_blog-0.1.0-py3-none-any.whl
| Download URL | tungsten_blog-0.1.0-py3-none-any.whl |
|---|---|
| Size | 34.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
a055b113e690097ed556554f8f4c3c7f66d1e75750148c4e14156b1a3023fb9b
|
|
BLAKE2b-256 checksum How to use checksums |
09a96b7cc079e6ede543880f1f7948e41c425ee4cb5980439b25dceca9c58669
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|