{
  "openapi": "3.1.1",
  "info": {
    "title": "OpenType Feature Playground API",
    "version": "1.0.0",
    "summary": "See which OpenType features and variable axes a font has, and what they do to your text.",
    "description": "Every endpoint performs the same calculation as the human page and returns inputs, result, units, assumptions, sources, warnings and computedAt. MCP endpoint: /mcp."
  },
  "servers": [
    {
      "url": "https://luminafontfeatures.usefulweb.site"
    }
  ],
  "paths": {
    "/api/v1/calculate": {
      "post": {
        "operationId": "calculate",
        "summary": "See which OpenType features and variable axes a font has, and what they do to your text.",
        "description": "Upload a TTF, OTF or WOFF font to list its scripts, languages and OpenType features (ligatures, small caps, figures, stylistic sets, kerning …) and its variation axes. Switch features on or off and set axis values: the text is shaped with the font's own GSUB and GPOS lookups and drawn from its outlines, next to the browser defaults, with the features that change your text marked.\n\nMethodology:\n- Scripts, language systems and features are read from the ScriptList and FeatureList of GSUB and GPOS; names follow the OpenType Layout tag registry (ssXX = stylistic set, cvXX = character variant).\n- Default features match what browsers apply to horizontal text (ccmp, locl, rlig, rclt, calt, liga, clig, rvrn, kern, mark, mkmk, dist, abvm, blwm, curs); your switches turn features on (smcp) or off (-liga). All selected GSUB lookups run in lookup-list order (types 1–7, the first alternate for type 3), then GPOS (types 1, 2 and 4–9).\n- Arabic and Devanagari text first gets Lumina's required shaping (joining forms, Indic reordering); other scripts are shaped from the character map in logical order on one line without bidi reordering.\n- Axis values are clamped to each axis range; outlines and advances come from gvar and HVAR at that location. GPOS adjustments are the default-instance values (variation deltas of GPOS are not applied). A feature \"changes this text\" when toggling it alone changes a glyph or a position.\n\nOutlines are drawn for TrueType (glyf) fonts; CFF fonts list their features but are not drawn. WOFF2 is not read. Browsers can differ in details (font fallback, bidi, justification).",
        "tags": [
          "apps"
        ],
        "x-mcp-tool": "lumina_font_features",
        "x-owner-app": "lumina",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LuminaFontFeaturesInput"
              },
              "examples": {
                "example1": {
                  "summary": "Variable starter font: kerning off at a bold weight",
                  "value": {
                    "font": {
                      "filename": "LuminaStarter-VF.ttf",
                      "contentType": "font/ttf",
                      "contentBase64": "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"
                    },
                    "text": "VOLT TOT",
                    "features": "-kern",
                    "axes": "wght=650",
                    "script": "auto",
                    "lang": ""
                  }
                },
                "example2": {
                  "summary": "Ligature font: standard ligatures on and off",
                  "value": {
                    "font": {
                      "filename": "LuminaStarterLigature.ttf",
                      "contentType": "font/ttf",
                      "contentBase64": "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"
                    },
                    "text": "HOLT VOLT",
                    "features": "-liga",
                    "axes": "",
                    "script": "auto",
                    "lang": ""
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculation result envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LuminaFontFeaturesResult"
                }
              }
            }
          },
          "400": {
            "description": "Malformed JSON body.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "422": {
            "description": "Invalid input (see errors[]).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded (see Retry-After).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tool": {
      "get": {
        "operationId": "getToolDefinition",
        "summary": "Inputs, output schema and examples for this tool",
        "responses": {
          "200": {
            "description": "Tool definition.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "Problem": {
        "type": "object",
        "description": "RFC 9457 problem details. 422 responses include per-field `errors`.",
        "required": [
          "type",
          "title",
          "status",
          "detail"
        ],
        "properties": {
          "type": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "status": {
            "type": "integer"
          },
          "detail": {
            "type": "string"
          },
          "code": {
            "type": "string"
          },
          "errors": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "field",
                "message"
              ],
              "properties": {
                "field": {
                  "type": "string"
                },
                "message": {
                  "type": "string"
                }
              }
            }
          }
        }
      },
      "LuminaFontFeaturesInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "font": {
            "title": "Font (TTF, OTF or WOFF; up to 10 MB; uploaded to the server)",
            "type": "object",
            "description": "Upload as {filename, contentType?, contentBase64}. Max 9766 KiB. Accepts .ttf,.otf,.woff.",
            "additionalProperties": false,
            "required": [
              "filename",
              "contentBase64"
            ],
            "properties": {
              "filename": {
                "type": "string"
              },
              "contentType": {
                "type": "string"
              },
              "contentBase64": {
                "type": "string"
              }
            }
          },
          "text": {
            "title": "Sample text",
            "type": "string",
            "maxLength": 200,
            "default": "Office 1/2 AVATAR"
          },
          "features": {
            "title": "Feature switches (e.g. smcp, onum, -liga, ss01)",
            "type": "string",
            "maxLength": 600,
            "default": ""
          },
          "axes": {
            "title": "Axis values for variable fonts (e.g. wght=650, wdth=90)",
            "type": "string",
            "maxLength": 300,
            "default": ""
          },
          "script": {
            "title": "OpenType script tag (auto = from the text)",
            "type": "string",
            "maxLength": 4,
            "default": "auto"
          },
          "lang": {
            "title": "OpenType language system tag (optional, e.g. DEU, TRK)",
            "type": "string",
            "maxLength": 4,
            "default": ""
          }
        },
        "required": [
          "font"
        ]
      },
      "LuminaFontFeaturesResult": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "schemaVersion",
          "tool",
          "computedAt",
          "inputs",
          "summary",
          "result",
          "units",
          "assumptions",
          "sources",
          "warnings",
          "presentation",
          "links"
        ],
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1.0"
          },
          "tool": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "id",
              "name",
              "version"
            ],
            "properties": {
              "id": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "version": {
                "type": "string"
              }
            }
          },
          "computedAt": {
            "type": "string",
            "format": "date-time"
          },
          "inputs": {
            "type": "object",
            "description": "Normalised inputs actually used, including applied defaults."
          },
          "summary": {
            "type": "string"
          },
          "result": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "family",
              "style",
              "unitsPerEm",
              "glyphCount",
              "outlines",
              "axes",
              "instances",
              "location",
              "scripts",
              "features",
              "base",
              "shaped",
              "changed",
              "missing"
            ],
            "properties": {
              "family": {
                "type": "string"
              },
              "style": {
                "type": "string"
              },
              "unitsPerEm": {
                "type": "integer"
              },
              "glyphCount": {
                "type": "integer"
              },
              "outlines": {
                "enum": [
                  "TrueType",
                  "OpenType CFF"
                ]
              },
              "axes": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "tag",
                    "name",
                    "min",
                    "default",
                    "max"
                  ],
                  "properties": {
                    "tag": {
                      "type": "string"
                    },
                    "name": {
                      "type": "string"
                    },
                    "min": {
                      "type": "number"
                    },
                    "default": {
                      "type": "number"
                    },
                    "max": {
                      "type": "number"
                    }
                  }
                }
              },
              "instances": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "name",
                    "location"
                  ],
                  "properties": {
                    "name": {
                      "type": "string"
                    },
                    "location": {
                      "type": "object",
                      "additionalProperties": {
                        "type": "number"
                      }
                    }
                  }
                }
              },
              "location": {
                "type": "object",
                "additionalProperties": {
                  "type": "number"
                }
              },
              "scripts": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "table",
                    "script",
                    "languages"
                  ],
                  "properties": {
                    "table": {
                      "enum": [
                        "GSUB",
                        "GPOS"
                      ]
                    },
                    "script": {
                      "type": "string"
                    },
                    "languages": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    }
                  }
                }
              },
              "features": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "tag",
                    "name",
                    "tables",
                    "lookups",
                    "defaultOn",
                    "on",
                    "changesText"
                  ],
                  "properties": {
                    "tag": {
                      "type": "string"
                    },
                    "name": {
                      "type": "string"
                    },
                    "tables": {
                      "type": "array",
                      "items": {
                        "enum": [
                          "GSUB",
                          "GPOS"
                        ]
                      }
                    },
                    "lookups": {
                      "type": "integer"
                    },
                    "defaultOn": {
                      "type": "boolean"
                    },
                    "on": {
                      "type": "boolean"
                    },
                    "changesText": {
                      "type": "boolean"
                    }
                  }
                }
              },
              "base": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "width",
                  "features",
                  "glyphs"
                ],
                "properties": {
                  "width": {
                    "type": "number"
                  },
                  "features": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  },
                  "glyphs": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "additionalProperties": false,
                      "required": [
                        "gid",
                        "name",
                        "text",
                        "x",
                        "y",
                        "advance"
                      ],
                      "properties": {
                        "gid": {
                          "type": "integer"
                        },
                        "name": {
                          "type": "string"
                        },
                        "text": {
                          "type": "string"
                        },
                        "x": {
                          "type": "number"
                        },
                        "y": {
                          "type": "number"
                        },
                        "advance": {
                          "type": "number"
                        }
                      }
                    }
                  }
                }
              },
              "shaped": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "width",
                  "features",
                  "glyphs"
                ],
                "properties": {
                  "width": {
                    "type": "number"
                  },
                  "features": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  },
                  "glyphs": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "additionalProperties": false,
                      "required": [
                        "gid",
                        "name",
                        "text",
                        "x",
                        "y",
                        "advance"
                      ],
                      "properties": {
                        "gid": {
                          "type": "integer"
                        },
                        "name": {
                          "type": "string"
                        },
                        "text": {
                          "type": "string"
                        },
                        "x": {
                          "type": "number"
                        },
                        "y": {
                          "type": "number"
                        },
                        "advance": {
                          "type": "number"
                        }
                      }
                    }
                  }
                }
              },
              "changed": {
                "type": "integer"
              },
              "missing": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              }
            }
          },
          "units": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "assumptions": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "sources": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "title"
              ],
              "properties": {
                "title": {
                  "type": "string"
                },
                "url": {
                  "type": "string"
                },
                "publisher": {
                  "type": "string"
                },
                "retrievedAt": {
                  "type": "string"
                },
                "note": {
                  "type": "string"
                }
              }
            }
          },
          "warnings": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "presentation": {
            "type": "array",
            "items": {
              "type": "object"
            },
            "description": "Display blocks used by the human page (same data)."
          },
          "links": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "human",
              "api",
              "openapi",
              "methodology"
            ],
            "properties": {
              "human": {
                "type": "string",
                "format": "uri"
              },
              "api": {
                "type": "string",
                "format": "uri"
              },
              "openapi": {
                "type": "string",
                "format": "uri"
              },
              "methodology": {
                "type": "string",
                "format": "uri"
              }
            }
          }
        }
      }
    }
  }
}