{
  "$generatedBy": "BrandSweets tokens.json — fly-io v3",
  "brand": {
    "slug": "fly-io",
    "name": "Fly.io",
    "version": 3,
    "schemaVersion": "1"
  },
  "identity": {
    "name": "Fly.io",
    "tagline": "Sandboxes aren't enough. Give your agent a real computer and get back to building."
  },
  "colors": {
    "primary": {
      "hex": "#7c3aed",
      "usage": "Primary brand color: CTAs, links, active states.",
      "scale": {
        "50": "#f4f0f9",
        "100": "#e2daf1",
        "200": "#c7abf7",
        "300": "#a578f2",
        "400": "#7c3aed",
        "500": "#6a1fea",
        "600": "#5713cd",
        "700": "#4710a8",
        "800": "#380c83",
        "900": "#290f57",
        "950": "#1b0a39"
      }
    },
    "secondary": {
      "hex": "#7c3aed",
      "usage": "Secondary brand color.",
      "scale": {
        "50": "#f4f0f9",
        "100": "#e2daf1",
        "200": "#c7abf7",
        "300": "#a578f2",
        "400": "#7c3aed",
        "500": "#6a1fea",
        "600": "#5713cd",
        "700": "#4710a8",
        "800": "#380c83",
        "900": "#290f57",
        "950": "#1b0a39"
      }
    },
    "surface": {
      "hex": "#ffffff",
      "usage": "Page and card background.",
      "scale": {
        "50": "#ffffff",
        "100": "#e6e6e6",
        "200": "#d1d1d1",
        "300": "#b5b5b5",
        "400": "#9c9c9c",
        "500": "#858585",
        "600": "#707070",
        "700": "#5c5c5c",
        "800": "#474747",
        "900": "#333333",
        "950": "#212121"
      }
    },
    "text": {
      "hex": "#000000",
      "usage": "Body text on surface.",
      "scale": {
        "50": "#f5f5f5",
        "100": "#e6e6e6",
        "200": "#d1d1d1",
        "300": "#b5b5b5",
        "400": "#9c9c9c",
        "500": "#858585",
        "600": "#707070",
        "700": "#5c5c5c",
        "800": "#474747",
        "900": "#333333",
        "950": "#000000"
      }
    }
  },
  "typography": {
    "families": {
      "fricolage-grotesque": {
        "family": "Fricolage Grotesque",
        "source": "custom",
        "stack": "\"Fricolage Grotesque\", ui-sans-serif, system-ui, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\"",
        "weights": [
          325,
          700
        ],
        "licensingNote": "Auto-detected web font; provenance unconfirmed. Reference only — never rehost without a license."
      },
      "mackinac": {
        "family": "Mackinac",
        "source": "custom",
        "stack": "Mackinac, ui-serif, Georgia, Cambria, \"Times New Roman\", Times, serif",
        "weights": [
          400,
          600,
          700
        ],
        "licensingNote": "Auto-detected web font; provenance unconfirmed. Reference only — never rehost without a license."
      }
    },
    "roles": {
      "heading": {
        "familyRef": "mackinac",
        "stack": "Mackinac, ui-serif, Georgia, Cambria, \"Times New Roman\", Times, serif"
      },
      "body": {
        "familyRef": "fricolage-grotesque",
        "stack": "\"Fricolage Grotesque\", ui-sans-serif, system-ui, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\""
      }
    },
    "scale": [
      {
        "name": "sm",
        "sizeRem": 0.875,
        "lineHeight": 1.5
      },
      {
        "name": "base",
        "sizeRem": 1,
        "lineHeight": 1.6
      },
      {
        "name": "lg",
        "sizeRem": 1.25,
        "lineHeight": 1.4
      },
      {
        "name": "xl",
        "sizeRem": 1.75,
        "lineHeight": 1.25
      },
      {
        "name": "2xl",
        "sizeRem": 2.25,
        "lineHeight": 1.15
      },
      {
        "name": "display",
        "sizeRem": 3.5,
        "lineHeight": 1.05,
        "letterSpacingEm": -0.02
      }
    ]
  }
}