heartwood every commit a ring

Revert post URLs to /posts/<slug>/ with 301 redirects from /blog/<slug>/

fd321be3 by Isaac Bythewood · 12 days ago

Revert post URLs to /posts/<slug>/ with 301 redirects from /blog/<slug>/

Old /blog/<slug>/ URLs (and /pdf/, /md/ variants) now permanent-redirect
to the original /posts/ prefix. Listing routes (/blog/, /blog/tag/,
/blog/year/) are unchanged.
modified CLAUDE.md
@@ -32,8 +32,9 @@ There are no tests or linters configured.## Key Routes- `/blog/<slug>/` — single post- `/blog/<slug>/pdf/` — PDF export via WeasyPrint- `/blog/<slug>/md/` — raw markdown download- `/posts/<slug>/` — single post (old `/blog/<slug>/` 301-redirects here)- `/posts/<slug>/pdf/` — PDF export via WeasyPrint- `/posts/<slug>/md/` — raw markdown download- `/blog/` — post index (also `/blog/tag/<tag>/` and `/blog/year/<year>/`)- `/search/live/` — JSON endpoint for live search- `/og/<slug>.svg` — dynamic OG image generation
modified app.py
@@ -17,6 +17,7 @@ from flask import (    Response,    abort,    jsonify,    redirect,    render_template,    request,    send_from_directory,
@@ -280,7 +281,7 @@ def blog_index():    )@app.route("/blog/<slug>/")@app.route("/posts/<slug>/")def blog_post(slug):    post = POSTS_BY_SLUG.get(slug)    if not post or post["publish_date"] > date.today().isoformat():
@@ -298,7 +299,7 @@ def blog_post(slug):    )@app.route("/blog/<slug>/pdf/")@app.route("/posts/<slug>/pdf/")def blog_post_pdf(slug):    post = POSTS_BY_SLUG.get(slug)    if not post or post["publish_date"] > date.today().isoformat():
@@ -315,7 +316,7 @@ def blog_post_pdf(slug):    )@app.route("/blog/<slug>/md/")@app.route("/posts/<slug>/md/")def blog_post_md(slug):    post = POSTS_BY_SLUG.get(slug)    if not post or post["publish_date"] > date.today().isoformat():
@@ -330,6 +331,21 @@ def blog_post_md(slug):    )@app.route("/blog/<slug>/")def blog_post_redirect(slug):    return redirect(url_for("blog_post", slug=slug), code=301)@app.route("/blog/<slug>/pdf/")def blog_post_pdf_redirect(slug):    return redirect(url_for("blog_post_pdf", slug=slug), code=301)@app.route("/blog/<slug>/md/")def blog_post_md_redirect(slug):    return redirect(url_for("blog_post_md", slug=slug), code=301)@app.route("/blog/tag/<tag>/")def blog_tag(tag):    posts = get_published_posts()
modified templates/sitemap.xml
@@ -10,7 +10,7 @@  </url>  {% for post in posts %}  <url>    <loc>{{ request.url_root }}blog/{{ post.slug }}/</loc>    <loc>{{ request.url_root }}posts/{{ post.slug }}/</loc>    <lastmod>{{ post.date }}</lastmod>    <changefreq>yearly</changefreq>  </url>