Swagger Validator: Failed to process specification
I'm not sure if something is wrong with the spec or if the validator service is broken but:

https://validator.swagger.io/validator/debug?url=https://api.memegen.link/docs/swagger.json

is displaying:

> Failed to process specification

and the `README.md` badge is broken.
diff --git a/app/views/memes.py b/app/views/memes.py
index e484f1dd..05119902 100644
--- a/app/views/memes.py
+++ b/app/views/memes.py
@@ -155,6 +155,7 @@ async def list_custom(request):
 @blueprint.get("/<template_id>.png")
 @doc.tag("Templates")
 @doc.summary("Display a template background")
+@doc.consumes(doc.String(name="template_id"), location="path")
 @doc.produces(
     doc.File(),
     description="Successfully displayed a template background",
@@ -174,6 +175,7 @@ async def blank_png(request, template_id):
 @blueprint.get("/<template_id>.jpg")
 @doc.tag("Templates")
 @doc.summary("Display a template background")
+@doc.consumes(doc.String(name="template_id"), location="path")
 @doc.produces(
     doc.File(),
     description="Successfully displayed a template background",
@@ -192,6 +194,8 @@ async def blank_jpg(request, template_id):
 
 @blueprint.get("/<template_id>/<text_paths:[\\\\s\\\\S]+>.png")
 @doc.summary("Display a custom meme")
+@doc.consumes(doc.String(name="text_paths"), location="path")
+@doc.consumes(doc.String(name="template_id"), location="path")
 @doc.produces(
     doc.File(),
     description="Successfully displayed a custom meme",
@@ -236,6 +240,8 @@ async def text_png(request, template_id, text_paths):
 
 @blueprint.get("/<template_id>/<text_paths:[\\\\s\\\\S]+>.jpg")
 @doc.summary("Display a custom meme")
+@doc.consumes(doc.String(name="text_paths"), location="path")
+@doc.consumes(doc.String(name="template_id"), location="path")
 @doc.produces(
     doc.File(),
     description="Successfully displayed a custom meme",
diff --git a/app/views/shortcuts.py b/app/views/shortcuts.py
index 167cbfad..0bc9eed0 100644
--- a/app/views/shortcuts.py
+++ b/app/views/shortcuts.py
@@ -10,6 +10,7 @@ blueprint = Blueprint("Shortcuts", url_prefix="/")
 
 @blueprint.get("/images/<template_id>")
 @doc.summary("Redirect to an example image")
+@doc.consumes(doc.String(name="template_id"), location="path")
 @doc.response(
     302, doc.File(), description="Successfully redirected to an example image"
 )
@@ -42,6 +43,7 @@ async def example(request, template_id):
 @blueprint.get("/<template_id>.png")
 @doc.exclude(settings.DEPLOYED)
 @doc.summary(settings.PREFIX + "Redirect to an example image")
+@doc.consumes(doc.String(name="template_id"), location="path")
 @doc.response(
     302, doc.File(), description="Successfully redirected to an example image"
 )
@@ -57,6 +59,7 @@ async def example_png(request, template_id):
 @blueprint.get("/<template_id>.jpg")
 @doc.exclude(settings.DEPLOYED)
 @doc.summary(settings.PREFIX + "Redirect to an example image")
+@doc.consumes(doc.String(name="template_id"), location="path")
 @doc.response(
     302, doc.File(), description="Successfully redirected to an example image"
 )
@@ -72,6 +75,7 @@ async def example_jpg(request, template_id):
 @blueprint.get("/<template_id>")
 @doc.exclude(settings.DEPLOYED)
 @doc.summary(settings.PREFIX + "Redirect to an example image")
+@doc.consumes(doc.String(name="template_id"), location="path")
 @doc.response(
     302, doc.File(), description="Successfully redirected to an example image"
 )
@@ -81,6 +85,8 @@ async def example_legacy(request, template_id):
 
 @blueprint.get("/images/<template_id>/<text_paths:[\\\\s\\\\S]+>")
 @doc.summary("Redirect to a custom image")
+@doc.consumes(doc.String(name="text_paths"), location="path")
+@doc.consumes(doc.String(name="template_id"), location="path")
 @doc.produces(
     str,
     description="Successfully displayed a custom meme",
@@ -110,6 +116,8 @@ async def custom(request, template_id, text_paths):
 @blueprint.get("/<template_id>/<text_paths:[\\\\s\\\\S]+>.png")
 @doc.exclude(settings.DEPLOYED)
 @doc.summary(settings.PREFIX + "Redirect to a custom image")
+@doc.consumes(doc.String(name="text_paths"), location="path")
+@doc.consumes(doc.String(name="template_id"), location="path")
 @doc.response(302, doc.File(), description="Successfully redirected to a custom image")
 @doc.response(404, str, description="Template not found")
 async def custom_png(request, template_id, text_paths):
@@ -125,6 +133,8 @@ async def custom_png(request, template_id, text_paths):
 @blueprint.get("/<template_id>/<text_paths:[\\\\s\\\\S]+>.jpg")
 @doc.exclude(settings.DEPLOYED)
 @doc.summary(settings.PREFIX + "Redirect to a custom image")
+@doc.consumes(doc.String(name="text_paths"), location="path")
+@doc.consumes(doc.String(name="template_id"), location="path")
 @doc.response(302, doc.File(), description="Successfully redirected to a custom image")
 @doc.response(404, str, description="Template not found")
 async def custom_jpg(request, template_id, text_paths):
@@ -140,6 +150,8 @@ async def custom_jpg(request, template_id, text_paths):
 @blueprint.get("/<template_id>/<text_paths:[\\\\s\\\\S]+>")
 @doc.exclude(settings.DEPLOYED)
 @doc.summary(settings.PREFIX + "Redirect to a custom image")
+@doc.consumes(doc.String(name="text_paths"), location="path")
+@doc.consumes(doc.String(name="template_id"), location="path")
 @doc.response(302, doc.File(), description="Successfully redirected to a custom image")
 async def custom_legacy(request, template_id, text_paths):
     return response.redirect(f"/images/{template_id}/{text_paths}")
diff --git a/app/views/templates.py b/app/views/templates.py
index 1f3bf022..a17ddbce 100644
--- a/app/views/templates.py
+++ b/app/views/templates.py
@@ -41,6 +41,7 @@ async def index(request):
 
 @blueprint.get("/<id>")
 @doc.summary("View a specific template")
+@doc.consumes(doc.String(name="id"), location="path")
 @doc.produces(
     {
         "id": str,
@@ -67,6 +68,7 @@ async def detail(request, id):
 @doc.operation("Memes.create_from_template")
 @doc.exclude(settings.DEPLOYED)
 @doc.summary(settings.PREFIX + "Create a meme from a template")
+@doc.consumes(doc.String(name="id"), location="path")
 @doc.consumes(
     doc.JsonBody({"text_lines": [str], "extension": str, "redirect": bool}),
     content_type="application/json",
['app/views/memes.py', 'app/views/templates.py', 'app/views/shortcuts.py']