{
  "$schema": "https://next.mdxui.dev/schema.json",
  "theme": "quaypoint",
  "template": "post",
  "title": "A tide window is a promise · Harbor tides",
  "description": "Why the API answers with the hours a draft clears, and never with a table to read by hand.",
  "meta": { "type": "article" },
  "frame": "none",
  "sections": [
    {
      "kind": "nav",
      "shell": { "inset": "bleed", "density": "none", "surface": "glass", "sticky": true },
      "block": {
        "type": "nav",
        "menu": "none",
        "brand": { "href": "/", "text": "Harbor tides", "mark": "waves" },
        "links": [
          ["/pricing", "Pricing"],
          ["/integrations", "Integrations"],
          ["/blog", "Blog"]
        ],
        "cta": { "href": "/contact", "label": "Talk to the harbor" }
      }
    },
    {
      "kind": "article",
      "shell": { "inset": "article", "density": "article" },
      "block": {
        "type": "article",
        "head": {
          "back": { "href": "/blog", "label": "Blog" },
          "tag": "Windows",
          "dateline": {
            "date": "2026-10-20",
            "read": { "minutes": 3, "unit": "min read" }
          },
          "title": "A tide window is a promise",
          "dek": "Why the API answers with the hours a draft clears, and never with a table to read by hand."
        },
        "body": "A tide table lists heights. A crew needs hours: when the water over the sill is deep enough for the keel, and when it stops being so.\n\n## From heights to hours\n\nThe window route takes a berth and a draft. It adds the charted depth to each predicted height, keeps the hours the sum clears the draft plus a margin, and returns the first and last.\n\n```json\n{ \"draft\": 3.2, \"opens\": \"08:05\", \"closes\": \"12:50\" }\n```\n\n## Why a promise\n\nA window names its datum and its station, so a crew can check it. When the gauge disagrees with the prediction, the next call says so."
      }
    },
    {
      "kind": "footer",
      "shell": { "inset": "contained", "density": "footer" },
      "block": {
        "type": "footer",
        "layout": "row",
        "brand": { "href": "/", "text": "Harbor tides", "mark": "waves" },
        "blurb": "Tide tables for every berth, as one API.",
        "columns": [
          {
            "title": "Product",
            "links": [
              ["/pricing", "Pricing"],
              ["/integrations", "Integrations"]
            ]
          },
          {
            "title": "Harbor",
            "links": [
              ["/blog", "Blog"],
              ["/contact", "Contact"],
              ["/terms", "Terms"]
            ]
          }
        ],
        "note": ["Harbor tides is a worked example on mdxui.dev, not a customer.", "Rendered by @mdxui/site. Forms here do not send."]
      }
    }
  ]
}
