{
 "about": "Meshcast (meshcast.app): free browser-based generators that turn a 3D model or a few settings into a print-ready mold or part. This file lists the settings each tool accepts in its URL.",
 "howToUse": "Build a link as <url>?<param>=<value>&<param>=<value>. The tool opens with those settings applied. Numbers are clamped to min/max and snapped to step; a choice takes one of its option values; toggles take 1 or 0. Unknown params are ignored. Nothing is generated automatically: the person uploads their model where the tool needs one, presses Generate, then Download. Units are millimetres unless the unit says otherwise.",
 "example": "https://meshcast.app/candle-mold?material=soap&wall-input=6",
 "tools": [
  {
   "name": "Silicone mold maker",
   "url": "https://meshcast.app/silicone-mold-maker",
   "description": "Turn any object into a printed silicone-casting mold: a rigid box or a form-hugging contoured shell, plus a shrink-compensated master. Free, no card.",
   "params": [
    {
     "param": "scale-input",
     "label": "Scale your model",
     "kind": "number",
     "default": 1,
     "min": 0.3,
     "max": 3,
     "step": 0.05,
     "unit": "fraction (1 means 100%, 0.03 means 3%)"
    },
    {
     "param": "contour-gap-input",
     "label": "Wall gap from master",
     "kind": "number",
     "default": 6,
     "min": 4,
     "max": 40,
     "step": 1,
     "unit": "mm"
    },
    {
     "param": "split-angle-input",
     "label": "Split plane: split angle",
     "kind": "number",
     "default": 0,
     "min": -90,
     "max": 90,
     "step": 5,
     "unit": "°"
    },
    {
     "param": "split-offset-input",
     "label": "Split plane: split offset",
     "kind": "number",
     "default": 0,
     "min": -40,
     "max": 40,
     "step": 1,
     "unit": "mm"
    },
    {
     "param": "spout-t-input",
     "label": "Split plane: spout t",
     "kind": "number",
     "default": 0,
     "min": -60,
     "max": 60,
     "step": 1,
     "unit": "mm"
    },
    {
     "param": "adaptive-gap-input",
     "label": "Silicone thickness: adaptive gap",
     "kind": "number",
     "default": 10,
     "min": 3,
     "max": 25,
     "step": 1,
     "unit": "mm"
    },
    {
     "param": "pall-input",
     "label": "Silicone thickness: input",
     "kind": "number",
     "default": 12,
     "min": 6,
     "max": 35,
     "step": 1,
     "unit": "mm"
    },
    {
     "param": "pside-input",
     "label": "Sides",
     "kind": "number",
     "default": 12,
     "min": 6,
     "max": 35,
     "step": 1,
     "unit": "mm"
    },
    {
     "param": "pback-input",
     "label": "Seam",
     "kind": "number",
     "default": 12,
     "min": 6,
     "max": 35,
     "step": 1,
     "unit": "mm"
    },
    {
     "param": "pbase-input",
     "label": "Floor",
     "kind": "number",
     "default": 12,
     "min": 12,
     "max": 30,
     "step": 1,
     "unit": "mm"
    },
    {
     "param": "ptop-input",
     "label": "Height above model",
     "kind": "number",
     "default": 12,
     "min": 6,
     "max": 35,
     "step": 1,
     "unit": "mm"
    },
    {
     "param": "pour-input",
     "label": "Pour spout width",
     "kind": "number",
     "default": 40,
     "min": 12,
     "max": 50,
     "step": 1,
     "unit": "mm"
    },
    {
     "param": "shrink-input",
     "label": "Shrinkage compensation",
     "kind": "number",
     "default": 0,
     "min": 0,
     "max": 0.18,
     "step": 0.005,
     "unit": "fraction (1 means 100%, 0.03 means 3%)"
    },
    {
     "param": "wall-input",
     "label": "Shell wall thickness",
     "kind": "number",
     "default": 5,
     "min": 2,
     "max": 10,
     "step": 0.5,
     "unit": "mm"
    },
    {
     "param": "fins-input",
     "label": "Stand-fins",
     "kind": "number",
     "default": 4,
     "min": 0,
     "max": 6,
     "step": 1
    },
    {
     "param": "fin-len-input",
     "label": "Stand-fin length",
     "kind": "number",
     "default": 1,
     "min": 0.5,
     "max": 2,
     "step": 0.1,
     "unit": "×"
    },
    {
     "param": "smooth-input",
     "label": "Shell smoothing",
     "kind": "number",
     "default": 9,
     "min": 0,
     "max": 16,
     "step": 0.5,
     "unit": "mm"
    },
    {
     "param": "msink-input",
     "label": "Sink into the base",
     "kind": "number",
     "default": 1.5,
     "min": 0,
     "max": 5,
     "step": 0.1
    },
    {
     "param": "stick-slot-input",
     "label": "Slot for a lolly stick",
     "kind": "toggle",
     "default": false
    },
    {
     "param": "pressfit-input",
     "label": "Press-fit clearance",
     "kind": "number",
     "default": 0.15,
     "min": 0.05,
     "max": 0.5,
     "step": 0.05,
     "unit": "mm"
    },
    {
     "param": "overhang-input",
     "label": "Printer overhang limit",
     "kind": "number",
     "default": 50,
     "min": 35,
     "max": 65,
     "step": 5,
     "unit": "°"
    }
   ]
  },
  {
   "name": "Rigid box mold",
   "url": "https://meshcast.app/candle-mold",
   "description": "Free online two-part mold generator. Drop in any STL and get a print-ready box mold with a clean pour spout for candles, resin, soap and wax. No card, no CAD.",
   "params": [
    {
     "param": "material",
     "label": "Material",
     "kind": "choice",
     "default": "wax",
     "options": [
      {
       "value": "wax",
       "label": "Candle"
      },
      {
       "value": "resin",
       "label": "Resin"
      },
      {
       "value": "soap",
       "label": "Soap"
      },
      {
       "value": "plaster",
       "label": "Plaster"
      },
      {
       "value": "silicone",
       "label": "Silicone"
      }
     ]
    },
    {
     "param": "scale-input",
     "label": "Scale your model",
     "kind": "number",
     "default": 100,
     "min": 50,
     "max": 200,
     "step": 5,
     "unit": "%"
    },
    {
     "param": "img-thr",
     "label": "Trace",
     "kind": "number",
     "default": 128,
     "min": 10,
     "max": 240,
     "step": 2
    },
    {
     "param": "img-invert",
     "label": "Swap shape and background",
     "kind": "toggle",
     "default": false
    },
    {
     "param": "img-mode",
     "label": "Logo on the front",
     "kind": "choice",
     "default": "raised",
     "options": [
      {
       "value": "raised",
       "label": "Raised"
      },
      {
       "value": "engraved",
       "label": "Engraved"
      },
      {
       "value": "flat",
       "label": "Plain"
      }
     ]
    },
    {
     "param": "img-height",
     "label": "Height",
     "kind": "number",
     "default": 90,
     "min": 40,
     "max": 200,
     "step": 1,
     "unit": "mm"
    },
    {
     "param": "img-thick",
     "label": "Thickness",
     "kind": "number",
     "default": 28,
     "min": 10,
     "max": 80,
     "step": 1,
     "unit": "mm"
    },
    {
     "param": "img-outline",
     "label": "Outline",
     "kind": "number",
     "default": 4,
     "min": 1,
     "max": 20,
     "step": 0.5,
     "unit": "mm"
    },
    {
     "param": "img-relief",
     "label": "Logo depth",
     "kind": "number",
     "default": 3,
     "min": 0.6,
     "max": 8,
     "step": 0.1,
     "unit": "mm"
    },
    {
     "param": "img-join",
     "label": "Join separate pieces",
     "kind": "toggle",
     "default": true
    },
    {
     "param": "mold-kind",
     "label": "Mold type",
     "kind": "choice",
     "default": "two",
     "options": [
      {
       "value": "open",
       "label": "Open moldOne piece, pour from the topRec"
      },
      {
       "value": "two",
       "label": "Two-part moldTwo halves, 3D all roundRec"
      }
     ]
    },
    {
     "param": "open-edge",
     "label": "Mold wall",
     "kind": "choice",
     "default": "outline",
     "options": [
      {
       "value": "outline",
       "label": "Follows the shape"
      },
      {
       "value": "box",
       "label": "Box"
      }
     ]
    },
    {
     "param": "open-wall",
     "label": "Wall thickness: wall",
     "kind": "number",
     "default": 3,
     "min": 2,
     "max": 8,
     "step": 0.5,
     "unit": "mm"
    },
    {
     "param": "offset-input",
     "label": "Seam position",
     "kind": "number",
     "default": 0,
     "min": -30,
     "max": 30,
     "step": 0.5,
     "unit": "mm"
    },
    {
     "param": "up-axis",
     "label": "Up axis",
     "kind": "choice",
     "default": "y",
     "options": [
      {
       "value": "x",
       "label": "X up"
      },
      {
       "value": "y",
       "label": "Y up"
      },
      {
       "value": "z",
       "label": "Z up"
      }
     ]
    },
    {
     "param": "mold-parts",
     "label": "Mold pieces",
     "kind": "choice",
     "default": "2",
     "options": [
      {
       "value": "2",
       "label": "2"
      },
      {
       "value": "3",
       "label": "3"
      },
      {
       "value": "4",
       "label": "4"
      }
     ]
    },
    {
     "param": "pour-count",
     "label": "Number of pour holes",
     "kind": "choice",
     "default": "1",
     "options": [
      {
       "value": "1",
       "label": "1"
      },
      {
       "value": "2",
       "label": "2"
      },
      {
       "value": "3",
       "label": "3"
      },
      {
       "value": "4",
       "label": "4"
      }
     ]
    },
    {
     "param": "pour-input",
     "label": "Pour hole Ø",
     "kind": "number",
     "default": 8,
     "min": 5,
     "max": 15,
     "step": 0.5,
     "unit": "mm"
    },
    {
     "param": "grooves-input",
     "label": "Rubber-band grooves",
     "kind": "toggle",
     "default": true
    },
    {
     "param": "pry-input",
     "label": "Pry pockets",
     "kind": "toggle",
     "default": true
    },
    {
     "param": "pins-input",
     "label": "Registration pins instead of tongue & groove",
     "kind": "toggle",
     "default": false
    },
    {
     "param": "wall-input",
     "label": "Wall thickness: input",
     "kind": "number",
     "default": 5,
     "min": 3,
     "max": 10,
     "step": 0.5,
     "unit": "mm"
    },
    {
     "param": "pour-dx-input",
     "label": "Pour hole X",
     "kind": "number",
     "default": 0,
     "min": -30,
     "max": 30,
     "step": 1,
     "unit": "mm"
    },
    {
     "param": "pour-dz-input",
     "label": "Pour hole Z",
     "kind": "number",
     "default": 0,
     "min": -30,
     "max": 30,
     "step": 1,
     "unit": "mm"
    },
    {
     "param": "pour-depth-input",
     "label": "Pour hole depth",
     "kind": "number",
     "default": 0,
     "min": 0,
     "max": 40,
     "step": 1
    },
    {
     "param": "vent-input",
     "label": "Air vent diameter",
     "kind": "number",
     "default": 0,
     "min": 0,
     "max": 10,
     "step": 0.5,
     "unit": "mm"
    },
    {
     "param": "clr-input",
     "label": "Fit clearance",
     "kind": "number",
     "default": 0.2,
     "min": 0.05,
     "max": 0.6,
     "step": 0.05,
     "unit": "mm"
    },
    {
     "param": "wallmark-input",
     "label": "Meshcast logo",
     "kind": "toggle",
     "default": true
    }
   ]
  },
  {
   "name": "Tray mold",
   "url": "https://meshcast.app/ice-cube-tray-mold",
   "description": "Free multi-cavity tray mold generator. Drop in any STL and get a print-ready tray plus a flexible silicone caster for ice, chocolate, gummies, wax melts and resin.",
   "params": [
    {
     "param": "adaptiveToggle",
     "label": "Shell hugs the master saves silicone",
     "kind": "toggle",
     "default": false
    },
    {
     "param": "silicone-gap",
     "label": "Silicone gap",
     "kind": "number",
     "default": 6,
     "min": 3,
     "max": 12,
     "step": 0.5,
     "unit": "mm"
    },
    {
     "param": "silicone-shell-wall",
     "label": "Shell wall",
     "kind": "number",
     "default": 4,
     "min": 2,
     "max": 6,
     "step": 0.25,
     "unit": "mm"
    },
    {
     "param": "silicone-pour-d",
     "label": "Pour channel diameter",
     "kind": "number",
     "default": 10,
     "min": 6,
     "max": 20,
     "step": 1,
     "unit": "mm"
    },
    {
     "param": "silicone-air-port",
     "label": "Add a pneumatic demold port",
     "kind": "toggle",
     "default": false
    },
    {
     "param": "silicone-needle-d",
     "label": "Needle diameter",
     "kind": "number",
     "default": 3.5,
     "min": 2,
     "max": 6,
     "step": 0.5,
     "unit": "mm"
    },
    {
     "param": "tray-silicone-wall",
     "label": "Silicone wall thickness",
     "kind": "number",
     "default": 3,
     "min": 1.5,
     "max": 8,
     "step": 0.5,
     "unit": "mm"
    },
    {
     "param": "tray-vent-dia",
     "label": "Vent hole diameter",
     "kind": "number",
     "default": 3,
     "min": 2,
     "max": 16,
     "step": 0.5,
     "unit": "mm"
    },
    {
     "param": "tray-cols",
     "label": "Columns",
     "kind": "number",
     "default": 3,
     "min": 1,
     "max": 8,
     "step": 1
    },
    {
     "param": "tray-rows",
     "label": "Rows",
     "kind": "number",
     "default": 3,
     "min": 1,
     "max": 8,
     "step": 1
    },
    {
     "param": "tray-stick-slot",
     "label": "Slot for a lolly stick",
     "kind": "toggle",
     "default": false
    },
    {
     "param": "adaptive-silicone-gap",
     "label": "Silicone around object",
     "kind": "number",
     "default": 10,
     "min": 5,
     "max": 25,
     "step": 0.5,
     "unit": "mm"
    },
    {
     "param": "adaptive-shell-wall",
     "label": "Printed wall thickness",
     "kind": "number",
     "default": 3,
     "min": 2,
     "max": 6,
     "step": 0.25,
     "unit": "mm"
    },
    {
     "param": "adaptive-pour-d",
     "label": "Pour hole diameter",
     "kind": "number",
     "default": 16,
     "min": 6,
     "max": 25,
     "step": 0.5,
     "unit": "mm"
    },
    {
     "param": "adaptive-opt-flat-base",
     "label": "Print a base plate too 3rd part",
     "kind": "toggle",
     "default": false
    },
    {
     "param": "twopart-wall",
     "label": "Wall thickness",
     "kind": "number",
     "default": 4,
     "min": 2,
     "max": 8,
     "step": 0.5,
     "unit": "mm"
    },
    {
     "param": "twopart-pry-enabled",
     "label": "Add a pry notch to the seam",
     "kind": "toggle",
     "default": true
    },
    {
     "param": "twopart-pry-size",
     "label": "Pry notch size",
     "kind": "number",
     "default": 1,
     "min": 0.5,
     "max": 1.6,
     "step": 0.1,
     "unit": "×"
    },
    {
     "param": "tray-removable-floor",
     "label": "Split the base off as its own part",
     "kind": "toggle",
     "default": false
    },
    {
     "param": "tray-fit",
     "label": "Locating key clearance",
     "kind": "number",
     "default": 0.15,
     "min": 0.05,
     "max": 0.5,
     "step": 0.05,
     "unit": "mm"
    },
    {
     "param": "tray-draft",
     "label": "Cavity draft angle",
     "kind": "number",
     "default": 1.5,
     "min": 0,
     "max": 5,
     "step": 0.25,
     "unit": "°"
    },
    {
     "param": "wall-thickness",
     "label": "Build settings",
     "kind": "number",
     "default": 4,
     "min": 2,
     "max": 8,
     "step": 0.5,
     "unit": "mm"
    },
    {
     "param": "masterScale",
     "label": "Master scale",
     "kind": "number",
     "default": 100,
     "min": 25,
     "max": 800,
     "step": 1
    },
    {
     "param": "offsetOverlayAcc",
     "label": "Cut offset",
     "kind": "number",
     "default": 0,
     "min": -50,
     "max": 50,
     "step": 0.5,
     "unit": "mm"
    },
    {
     "param": "pourD",
     "label": "pourD",
     "kind": "number",
     "default": 8,
     "min": 0,
     "max": 15,
     "step": 0.5,
     "unit": "mm"
    },
    {
     "param": "pourPosX",
     "label": "Pour hole position X",
     "kind": "number",
     "default": 0,
     "min": -50,
     "max": 50,
     "step": 0.5,
     "unit": "mm"
    },
    {
     "param": "pourPosZ",
     "label": "Pour hole position Z",
     "kind": "number",
     "default": 0,
     "min": -50,
     "max": 50,
     "step": 0.5,
     "unit": "mm"
    },
    {
     "param": "smoothing",
     "label": "Master smoothing",
     "kind": "number",
     "default": 0,
     "min": 0,
     "max": 10,
     "step": 1
    },
    {
     "param": "adaptive-opt-open-base",
     "label": "Open Base 3rd part",
     "kind": "toggle",
     "default": false
    },
    {
     "param": "adaptive-opt-master-pin",
     "label": "Master-base pin",
     "kind": "toggle",
     "default": false
    },
    {
     "param": "adaptive-opt-feet",
     "label": "Casting feet",
     "kind": "toggle",
     "default": false
    },
    {
     "param": "adaptive-opt-hollow",
     "label": "Hollow shell wall save filament",
     "kind": "toggle",
     "default": false
    },
    {
     "param": "adaptive-opt-channels",
     "label": "Channels spine",
     "kind": "toggle",
     "default": false
    },
    {
     "param": "adaptive-channel-width",
     "label": "Channel width",
     "kind": "number",
     "default": 5,
     "min": 3,
     "max": 10,
     "step": 0.5,
     "unit": "mm"
    },
    {
     "param": "adaptive-channel-depth",
     "label": "Channel depth",
     "kind": "number",
     "default": 6,
     "min": 3,
     "max": 10,
     "step": 0.5,
     "unit": "mm"
    },
    {
     "param": "adaptive-opt-channel-contour",
     "label": "Contour Adapted",
     "kind": "toggle",
     "default": false
    },
    {
     "param": "adaptive-opt-channel-larger-back",
     "label": "Larger Back",
     "kind": "toggle",
     "default": false
    },
    {
     "param": "cost-endmaterial",
     "label": "Casting material",
     "kind": "choice",
     "default": "concrete",
     "options": [
      {
       "value": "concrete",
       "label": "Concrete"
      },
      {
       "value": "plaster",
       "label": "Plaster"
      },
      {
       "value": "resin",
       "label": "Resin"
      },
      {
       "value": "wax",
       "label": "Wax"
      }
     ]
    },
    {
     "param": "cost-pla-input",
     "label": "PLA ($/kg)",
     "kind": "number",
     "min": 0,
     "max": 200,
     "step": 0.5
    },
    {
     "param": "cost-wax-input",
     "label": "Wax ($/kg)",
     "kind": "number",
     "min": 0,
     "max": 200,
     "step": 0.5
    },
    {
     "param": "cost-silicone-input",
     "label": "Silicone ($/kg)",
     "kind": "number",
     "min": 0,
     "max": 500,
     "step": 0.5
    },
    {
     "param": "cost-lifetime-input",
     "label": "Mold lifetime (pours)",
     "kind": "number",
     "min": 1,
     "max": 1000,
     "step": 1
    }
   ]
  },
  {
   "name": "Vase & planter mold",
   "url": "https://meshcast.app/vase-mold",
   "description": "Turn any pot or planter into printable formwork for a flexible silicone mold, plus a draft-tapered inner core so concrete and plaster casts come out hollow.",
   "params": [
    {
     "param": "core-dia-input",
     "label": "Wall & hollow core: dia",
     "kind": "number",
     "default": 40,
     "min": 5,
     "max": 150,
     "step": 1,
     "unit": "mm"
    },
    {
     "param": "core-height-input",
     "label": "Wall & hollow core: height",
     "kind": "number",
     "default": 90,
     "min": 10,
     "max": 300,
     "step": 1,
     "unit": "mm"
    },
    {
     "param": "min-wall-input",
     "label": "Wall & hollow core: wall",
     "kind": "number",
     "default": 6,
     "min": 2,
     "max": 15,
     "step": 0.5,
     "unit": "mm"
    },
    {
     "param": "wall-input",
     "label": "Silicone wall thickness",
     "kind": "number",
     "default": 12,
     "min": 6,
     "max": 30,
     "step": 1,
     "unit": "mm"
    },
    {
     "param": "shrink-input",
     "label": "Casting shrinkage compensation",
     "kind": "number",
     "default": 0,
     "min": 0,
     "max": 0.05,
     "step": 0.005,
     "unit": "fraction (1 means 100%, 0.03 means 3%)"
    },
    {
     "param": "cast-wall-input",
     "label": "Core safety gap",
     "kind": "number",
     "default": 4,
     "min": 2,
     "max": 25,
     "step": 0.5,
     "unit": "mm"
    },
    {
     "param": "saver-draft-input",
     "label": "Saver cone angle",
     "kind": "number",
     "default": 1,
     "min": 0,
     "max": 5,
     "step": 0.5,
     "unit": "°"
    },
    {
     "param": "saver-clr-input",
     "label": "Saver fit clearance",
     "kind": "number",
     "default": 0.3,
     "min": 0.1,
     "max": 1.5,
     "step": 0.05,
     "unit": "mm"
    },
    {
     "param": "yoke-bevel-input",
     "label": "Yoke bevel",
     "kind": "number",
     "default": 8,
     "min": 0,
     "max": 15,
     "step": 0.5,
     "unit": "mm"
    }
   ]
  },
  {
   "name": "Plaster slip-cast mold",
   "url": "https://meshcast.app/plaster-mold",
   "description": "Free plaster mold generator: upload any STL and download multi-part 3D-printable master shells for plaster casting and ceramic slipcasting. No card, no CAD.",
   "params": [
    {
     "param": "scale-input",
     "label": "Scale your model",
     "kind": "number",
     "default": 100,
     "min": 50,
     "max": 200,
     "step": 5,
     "unit": "%"
    },
    {
     "param": "up-axis",
     "label": "Orientation?: axis",
     "kind": "choice",
     "default": "z",
     "options": [
      {
       "value": "x",
       "label": "X up"
      },
      {
       "value": "y",
       "label": "Y up"
      },
      {
       "value": "z",
       "label": "Z up"
      }
     ]
    },
    {
     "param": "zrot-input",
     "label": "Fine rotation",
     "kind": "number",
     "default": 0,
     "min": -180,
     "max": 180,
     "step": 1,
     "unit": "°"
    },
    {
     "param": "split-axis",
     "label": "Orientation?: split axis",
     "kind": "choice",
     "default": "y",
     "options": [
      {
       "value": "auto",
       "label": "Auto"
      },
      {
       "value": "x",
       "label": "X"
      },
      {
       "value": "y",
       "label": "Y"
      },
      {
       "value": "z",
       "label": "Z"
      }
     ]
    },
    {
     "param": "master-fill",
     "label": "Orientation?: master fill",
     "kind": "choice",
     "default": "hollow",
     "options": [
      {
       "value": "hollow",
       "label": "As uploaded"
      },
      {
       "value": "solid",
       "label": "Fill it"
      }
     ]
    },
    {
     "param": "pour-hole",
     "label": "Pour hole?",
     "kind": "choice",
     "default": "on",
     "options": [
      {
       "value": "on",
       "label": "Funnel"
      },
      {
       "value": "rim",
       "label": "Open rim"
      },
      {
       "value": "off",
       "label": "None"
      }
     ]
    },
    {
     "param": "sprue-input",
     "label": "Pour opening",
     "kind": "number",
     "default": 20,
     "min": 10,
     "max": 50,
     "step": 2,
     "unit": "mm"
    },
    {
     "param": "sprue-lift-input",
     "label": "Funnel lift",
     "kind": "number",
     "default": 0,
     "min": 0,
     "max": 5,
     "step": 0.5,
     "unit": "mm"
    },
    {
     "param": "ridge-depth-input",
     "label": "Ridge depth",
     "kind": "number",
     "default": 0,
     "min": 0,
     "max": 30,
     "step": 1
    },
    {
     "param": "ridge-width-input",
     "label": "Ridge width",
     "kind": "number",
     "default": 2,
     "min": 0,
     "max": 10,
     "step": 0.5,
     "unit": "mm"
    },
    {
     "param": "num-parts",
     "label": "Housing settings: parts",
     "kind": "choice",
     "default": "2",
     "options": [
      {
       "value": "2",
       "label": "2"
      },
      {
       "value": "3",
       "label": "3"
      },
      {
       "value": "4",
       "label": "4"
      }
     ]
    },
    {
     "param": "clamp-mode",
     "label": "Housing settings: clamp mode",
     "kind": "choice",
     "default": "0",
     "options": [
      {
       "value": "0",
       "label": "Ends"
      },
      {
       "value": "1",
       "label": "Corners"
      }
     ]
    },
    {
     "param": "material",
     "label": "Casting material",
     "kind": "choice",
     "default": "plaster",
     "options": [
      {
       "value": "slipcast",
       "label": "Slipcast"
      },
      {
       "value": "plaster",
       "label": "Plaster"
      },
      {
       "value": "concrete",
       "label": "Concrete"
      }
     ]
    },
    {
     "param": "shrink-input",
     "label": "Clay shrinkage",
     "kind": "number",
     "default": 0,
     "min": 0,
     "max": 20,
     "step": 1,
     "unit": "%"
    },
    {
     "param": "pwall-input",
     "label": "Plaster thickness",
     "kind": "number",
     "default": 20,
     "min": 6,
     "max": 60,
     "step": 1,
     "unit": "mm"
    },
    {
     "param": "boxr-input",
     "label": "V-trough depth",
     "kind": "number",
     "default": 50,
     "min": 30,
     "max": 120,
     "step": 5,
     "unit": "mm"
    },
    {
     "param": "wall-input",
     "label": "Wall thickness",
     "kind": "number",
     "default": 4,
     "min": 2,
     "max": 10,
     "step": 0.5,
     "unit": "mm"
    },
    {
     "param": "rimw-input",
     "label": "Floor rim",
     "kind": "number",
     "default": 20,
     "min": 3,
     "max": 40,
     "step": 1,
     "unit": "mm"
    },
    {
     "param": "margin-input",
     "label": "End margin",
     "kind": "number",
     "default": 20,
     "min": 12,
     "max": 40,
     "step": 1,
     "unit": "mm"
    },
    {
     "param": "clr-input",
     "label": "Clamp clearance",
     "kind": "number",
     "default": 0.35,
     "min": 0.1,
     "max": 0.8,
     "step": 0.05,
     "unit": "mm"
    },
    {
     "param": "keyr-input",
     "label": "Natch radius",
     "kind": "number",
     "default": 9,
     "min": 5,
     "max": 14,
     "step": 0.5,
     "unit": "mm"
    },
    {
     "param": "keytol-input",
     "label": "Natch fit",
     "kind": "number",
     "default": 0.6,
     "min": 0.2,
     "max": 2,
     "step": 0.05,
     "unit": "mm"
    },
    {
     "param": "keydraft-input",
     "label": "Natch draft",
     "kind": "number",
     "default": 10,
     "min": 4,
     "max": 25,
     "step": 1,
     "unit": "°"
    },
    {
     "param": "keypos-input",
     "label": "Natch position",
     "kind": "number",
     "default": 50,
     "min": 0,
     "max": 100,
     "step": 5,
     "unit": "%"
    },
    {
     "param": "seamfit-input",
     "label": "Housing seam fit",
     "kind": "number",
     "default": 0.2,
     "min": 0.05,
     "max": 0.5,
     "step": 0.05,
     "unit": "mm"
    },
    {
     "param": "clampgrip-input",
     "label": "Clamp grip",
     "kind": "number",
     "default": 0.25,
     "min": 0,
     "max": 0.8,
     "step": 0.05,
     "unit": "mm"
    }
   ]
  },
  {
   "name": "Mesh former",
   "url": "https://meshcast.app/mesh-former",
   "description": "Upload a logo or silhouette and get a flat printable mesh plus a plug and cavity, ready to heat and press into a curved basket or bowl.",
   "params": [
    {
     "param": "mf-size",
     "label": "Longest side",
     "kind": "number",
     "default": 120,
     "min": 40,
     "max": 250,
     "step": 2,
     "unit": "mm"
    },
    {
     "param": "mf-cell",
     "label": "Hole size",
     "kind": "number",
     "default": 5,
     "min": 2,
     "max": 14,
     "step": 0.5,
     "unit": "mm"
    },
    {
     "param": "mf-strut",
     "label": "Strand width",
     "kind": "number",
     "default": 1.2,
     "min": 0.4,
     "max": 3,
     "step": 0.1,
     "unit": "mm"
    },
    {
     "param": "mf-frame",
     "label": "Width",
     "kind": "number",
     "default": 4,
     "min": 1.5,
     "max": 12,
     "step": 0.5,
     "unit": "mm"
    },
    {
     "param": "mf-frame-h",
     "label": "Height",
     "kind": "number",
     "default": 3,
     "min": 1,
     "max": 8,
     "step": 0.2,
     "unit": "mm"
    },
    {
     "param": "mf-form",
     "label": "Include the press form",
     "kind": "toggle",
     "default": true
    },
    {
     "param": "mf-form-h",
     "label": "Depth",
     "kind": "number",
     "default": 12,
     "min": 5,
     "max": 60,
     "step": 1,
     "unit": "mm"
    },
    {
     "param": "mf-draft",
     "label": "Wall angle",
     "kind": "number",
     "default": 12,
     "min": 3,
     "max": 30,
     "step": 1,
     "unit": "°"
    },
    {
     "param": "mf-halves",
     "label": "Two halves that fit together",
     "kind": "toggle",
     "default": true
    },
    {
     "param": "mf-hang",
     "label": "Hanging hole at the top",
     "kind": "toggle",
     "default": true
    },
    {
     "param": "mf-mesh-t",
     "label": "Mesh thickness",
     "kind": "number",
     "default": 1,
     "min": 0.6,
     "max": 1.6,
     "step": 0.1,
     "unit": "mm"
    },
    {
     "param": "mf-form-base",
     "label": "Form base",
     "kind": "number",
     "default": 3,
     "min": 1.5,
     "max": 8,
     "step": 0.5,
     "unit": "mm"
    },
    {
     "param": "mf-smooth",
     "label": "Smoothing",
     "kind": "number",
     "default": 0.3,
     "min": 0,
     "max": 1.5,
     "step": 0.1,
     "unit": "mm"
    }
   ]
  },
  {
   "name": "Photo candle",
   "url": "https://meshcast.app/photo-candle-mold",
   "description": "Free photo candle designer: wrap a photo around a candle as a backlit lithophane relief, no STL needed. Send it straight to a mold generator.",
   "params": [
    {
     "param": "diameter",
     "label": "Diameter",
     "kind": "number",
     "default": 70,
     "min": 40,
     "max": 120,
     "step": 1,
     "unit": "mm"
    },
    {
     "param": "height",
     "label": "Height",
     "kind": "number",
     "default": 100,
     "min": 40,
     "max": 220,
     "step": 1,
     "unit": "mm"
    },
    {
     "param": "img-rot",
     "label": "Rotate image (seam placement)",
     "kind": "number",
     "default": 0,
     "min": -180,
     "max": 180,
     "step": 5,
     "unit": "°"
    },
    {
     "param": "detail",
     "label": "Detail",
     "kind": "choice",
     "default": "440",
     "options": [
      {
       "value": "300",
       "label": "Fast"
      },
      {
       "value": "440",
       "label": "Balanced"
      },
      {
       "value": "600",
       "label": "Fine"
      }
     ]
    },
    {
     "param": "contrast",
     "label": "Contrast",
     "kind": "number",
     "default": 1.15,
     "min": 0.5,
     "max": 2.5,
     "step": 0.05,
     "unit": "×"
    },
    {
     "param": "brightness",
     "label": "Brightness",
     "kind": "number",
     "default": 1,
     "min": 0.6,
     "max": 1.8,
     "step": 0.05,
     "unit": "×"
    },
    {
     "param": "invert-toggle",
     "label": "Invert (negative)",
     "kind": "toggle",
     "default": false
    },
    {
     "param": "max-relief",
     "label": "Max relief",
     "kind": "number",
     "default": 3,
     "min": 1.5,
     "max": 6,
     "step": 0.1,
     "unit": "mm"
    },
    {
     "param": "min-relief",
     "label": "Min relief",
     "kind": "number",
     "default": 0.8,
     "min": 0.4,
     "max": 2,
     "step": 0.1,
     "unit": "mm"
    }
   ]
  },
  {
   "name": "Custom candle",
   "url": "https://meshcast.app/candle-designer",
   "description": "Free parametric candle designer. Shape a candle with an editable profile, flutes, facets and twist, then send it straight to a mold generator. No CAD, no card.",
   "params": [
    {
     "param": "cd-height",
     "label": "Height",
     "kind": "number",
     "default": 140,
     "min": 30,
     "max": 300,
     "step": 1,
     "unit": "mm"
    },
    {
     "param": "cd-base",
     "label": "Base diameter",
     "kind": "number",
     "default": 70,
     "min": 20,
     "max": 200,
     "step": 1,
     "unit": "mm"
    },
    {
     "param": "cd-top",
     "label": "Top diameter",
     "kind": "number",
     "default": 55,
     "min": 10,
     "max": 200,
     "step": 1,
     "unit": "mm"
    },
    {
     "param": "cd-bulge",
     "label": "Waist",
     "kind": "number",
     "default": 0,
     "min": -40,
     "max": 40,
     "step": 1
    },
    {
     "param": "cd-lip",
     "label": "Top edge rounding",
     "kind": "number",
     "default": 2,
     "min": 0,
     "max": 20,
     "step": 0.5,
     "unit": "mm"
    },
    {
     "param": "cd-count",
     "label": "Pattern count",
     "kind": "number",
     "default": 14,
     "min": 3,
     "max": 48,
     "step": 1
    },
    {
     "param": "cd-depth",
     "label": "Pattern depth",
     "kind": "number",
     "default": 2.5,
     "min": 0.5,
     "max": 8,
     "step": 0.1,
     "unit": "mm"
    },
    {
     "param": "cd-twist",
     "label": "Twist",
     "kind": "number",
     "default": 0,
     "min": -360,
     "max": 360,
     "step": 5,
     "unit": "°"
    }
   ]
  },
  {
   "name": "Vase designer",
   "url": "https://meshcast.app/vase-designer",
   "description": "Free parametric vase designer. Shape a vase with an editable silhouette, flutes and facets, then hollow it out to print, or send it solid to a mold generator.",
   "params": [
    {
     "param": "cd-height",
     "label": "Height",
     "kind": "number",
     "default": 200,
     "min": 30,
     "max": 300,
     "step": 1,
     "unit": "mm"
    },
    {
     "param": "cd-base",
     "label": "Base diameter",
     "kind": "number",
     "default": 80,
     "min": 20,
     "max": 200,
     "step": 1,
     "unit": "mm"
    },
    {
     "param": "cd-top",
     "label": "Top diameter",
     "kind": "number",
     "default": 70,
     "min": 10,
     "max": 200,
     "step": 1,
     "unit": "mm"
    },
    {
     "param": "cd-bulge",
     "label": "Waist",
     "kind": "number",
     "default": 0,
     "min": -40,
     "max": 40,
     "step": 1
    },
    {
     "param": "cd-lip",
     "label": "Top edge rounding",
     "kind": "number",
     "default": 3,
     "min": 0,
     "max": 20,
     "step": 0.5,
     "unit": "mm"
    },
    {
     "param": "cd-count",
     "label": "Pattern count",
     "kind": "number",
     "default": 12,
     "min": 3,
     "max": 48,
     "step": 1
    },
    {
     "param": "cd-depth",
     "label": "Pattern depth",
     "kind": "number",
     "default": 3,
     "min": 0.5,
     "max": 8,
     "step": 0.1,
     "unit": "mm"
    },
    {
     "param": "cd-twist",
     "label": "Twist",
     "kind": "number",
     "default": 0,
     "min": -360,
     "max": 360,
     "step": 5,
     "unit": "°"
    },
    {
     "param": "cd-hollow-on",
     "label": "Make it a real vase",
     "kind": "toggle",
     "default": true
    },
    {
     "param": "cd-hollow-wall",
     "label": "Wall thickness",
     "kind": "number",
     "default": 4,
     "min": 1.2,
     "max": 12,
     "step": 0.2,
     "unit": "mm"
    },
    {
     "param": "cd-hollow-floor",
     "label": "Floor thickness",
     "kind": "number",
     "default": 5,
     "min": 1.5,
     "max": 25,
     "step": 0.5,
     "unit": "mm"
    }
   ]
  },
  {
   "name": "Trays",
   "url": "https://meshcast.app/tray-designer",
   "description": "Free parametric tray designer. Round, oval or rectangular concrete trays, dishes and bowls with a real recess. Send it straight to a mold generator, no CAD.",
   "params": [
    {
     "param": "cd-width",
     "label": "Width",
     "kind": "number",
     "default": 180,
     "min": 60,
     "max": 360,
     "step": 1,
     "unit": "mm"
    },
    {
     "param": "cd-depth",
     "label": "Depth",
     "kind": "number",
     "default": 180,
     "min": 60,
     "max": 360,
     "step": 1,
     "unit": "mm"
    },
    {
     "param": "cd-height",
     "label": "Height",
     "kind": "number",
     "default": 20,
     "min": 8,
     "max": 140,
     "step": 1,
     "unit": "mm"
    },
    {
     "param": "cd-corner",
     "label": "Corner radius",
     "kind": "number",
     "default": 14,
     "min": 0,
     "max": 60,
     "step": 1,
     "unit": "mm"
    },
    {
     "param": "cd-wall",
     "label": "Rim width",
     "kind": "number",
     "default": 7,
     "min": 2,
     "max": 30,
     "step": 0.5,
     "unit": "mm"
    },
    {
     "param": "cd-floor",
     "label": "Floor thickness",
     "kind": "number",
     "default": 7,
     "min": 2,
     "max": 30,
     "step": 0.5,
     "unit": "mm"
    },
    {
     "param": "cd-draft",
     "label": "Wall angle",
     "kind": "number",
     "default": 6,
     "min": 0,
     "max": 25,
     "step": 1,
     "unit": "°"
    },
    {
     "param": "cd-edge",
     "label": "Edge rounding",
     "kind": "number",
     "default": 2.5,
     "min": 0,
     "max": 12,
     "step": 0.5,
     "unit": "mm"
    },
    {
     "param": "cd-inner",
     "label": "Inside fillet",
     "kind": "number",
     "default": 4,
     "min": 0,
     "max": 20,
     "step": 0.5,
     "unit": "mm"
    },
    {
     "param": "cd-flutes",
     "label": "Flutes",
     "kind": "number",
     "default": 0,
     "min": 0,
     "max": 72,
     "step": 1
    },
    {
     "param": "cd-flute-depth",
     "label": "Flute depth",
     "kind": "number",
     "default": 1.8,
     "min": 0.4,
     "max": 5,
     "step": 0.1,
     "unit": "mm"
    }
   ]
  },
  {
   "name": "Custom soap bar",
   "url": "https://meshcast.app/soap-designer",
   "description": "Free parametric soap bar designer. Set the size, corner and edge rounding and the draft, then send it to a mold generator. No CAD, no card.",
   "params": [
    {
     "param": "cd-width",
     "label": "Width",
     "kind": "number",
     "default": 85,
     "min": 15,
     "max": 300,
     "step": 1,
     "unit": "mm"
    },
    {
     "param": "cd-depth",
     "label": "Depth",
     "kind": "number",
     "default": 58,
     "min": 15,
     "max": 300,
     "step": 1,
     "unit": "mm"
    },
    {
     "param": "cd-height",
     "label": "Height",
     "kind": "number",
     "default": 28,
     "min": 3,
     "max": 150,
     "step": 1,
     "unit": "mm"
    },
    {
     "param": "cd-corner",
     "label": "Corner radius",
     "kind": "number",
     "default": 10,
     "min": 0,
     "max": 60,
     "step": 0.5,
     "unit": "mm"
    },
    {
     "param": "cd-sides",
     "label": "Sides",
     "kind": "number",
     "default": 6,
     "min": 3,
     "max": 12,
     "step": 1
    },
    {
     "param": "cd-edge",
     "label": "Edge rounding",
     "kind": "number",
     "default": 4,
     "min": 0,
     "max": 20,
     "step": 0.5,
     "unit": "mm"
    },
    {
     "param": "cd-roundbase",
     "label": "Round the bottom edge too",
     "kind": "toggle",
     "default": false
    },
    {
     "param": "cd-draft",
     "label": "Draft angle",
     "kind": "number",
     "default": 3,
     "min": 0,
     "max": 12,
     "step": 0.5,
     "unit": "°"
    },
    {
     "param": "cd-panel",
     "label": "Recessed panel on the top face",
     "kind": "toggle",
     "default": true
    },
    {
     "param": "cd-text",
     "label": "Text on the top face",
     "kind": "text",
     "default": "SOAP"
    },
    {
     "param": "cd-font",
     "label": "Font",
     "kind": "choice",
     "default": "helvetiker_bold",
     "options": [
      {
       "value": "helvetiker_bold",
       "label": "Bold & Blocky"
      },
      {
       "value": "helvetiker_regular",
       "label": "Clean Sans"
      },
      {
       "value": "droid_sans_bold",
       "label": "Bold Rounded"
      },
      {
       "value": "droid_serif_bold",
       "label": "Bold Serif"
      },
      {
       "value": "gentilis_bold",
       "label": "Bold Elegant"
      }
     ]
    },
    {
     "param": "cd-line-gap",
     "label": "Line spacing",
     "kind": "number",
     "default": 1.2,
     "min": 0.8,
     "max": 2,
     "step": 0.05,
     "unit": "x"
    },
    {
     "param": "cd-text-h",
     "label": "Text relief height",
     "kind": "number",
     "default": 1.2,
     "min": 0.4,
     "max": 3,
     "step": 0.1,
     "unit": "mm"
    },
    {
     "param": "cd-logo-size",
     "label": "Logo size",
     "kind": "number",
     "default": 90,
     "min": 20,
     "max": 100,
     "step": 1,
     "unit": "%"
    },
    {
     "param": "cd-logo-x",
     "label": "Logo left/right",
     "kind": "number",
     "default": 0,
     "min": -40,
     "max": 40,
     "step": 0.5,
     "unit": "mm"
    },
    {
     "param": "cd-logo-y",
     "label": "Logo up/down",
     "kind": "number",
     "default": 0,
     "min": -40,
     "max": 40,
     "step": 0.5,
     "unit": "mm"
    },
    {
     "param": "cd-logo-h",
     "label": "Logo relief height",
     "kind": "number",
     "default": 1.2,
     "min": 0.4,
     "max": 3,
     "step": 0.1,
     "unit": "mm"
    },
    {
     "param": "cd-logo-thr",
     "label": "Trace threshold",
     "kind": "number",
     "default": 128,
     "min": 10,
     "max": 240,
     "step": 2
    },
    {
     "param": "cd-logo-invert",
     "label": "Swap what is cut out",
     "kind": "toggle",
     "default": false
    },
    {
     "param": "cd-relief-draft",
     "label": "Draft on text and logo flanks",
     "kind": "number",
     "default": 8,
     "min": 0,
     "max": 25,
     "step": 1,
     "unit": "°"
    }
   ]
  },
  {
   "name": "Text sign",
   "url": "https://meshcast.app/text-sign-designer",
   "description": "Free text sign designer. Type one or more lines, pick a font and two colours, and download a print-ready STL or a two-colour 3MF. No card, no install.",
   "params": [
    {
     "param": "cd-text",
     "label": "Your text",
     "kind": "text",
     "default": "LOVE"
    },
    {
     "param": "cd-font",
     "label": "Font",
     "kind": "choice",
     "default": "ttf:titanone",
     "options": [
      {
       "value": "ttf:titanone",
       "label": "Bold Playful"
      },
      {
       "value": "ttf:bungee",
       "label": "Bold Poster"
      },
      {
       "value": "ttf:alfaslabone",
       "label": "Bold Slab"
      },
      {
       "value": "ttf:graduate",
       "label": "Bold Collegiate"
      },
      {
       "value": "bangers",
       "label": "Comic Punch"
      },
      {
       "value": "helvetiker_bold",
       "label": "Bold & Blocky"
      },
      {
       "value": "ttf:pacifico",
       "label": "Playful Script"
      },
      {
       "value": "ttf:lobster",
       "label": "Casual Script"
      },
      {
       "value": "ttf:greatvibes",
       "label": "Flowing Script"
      },
      {
       "value": "ttf:sacramento",
       "label": "Signature Script"
      },
      {
       "value": "kalam_bold",
       "label": "Handwritten"
      },
      {
       "value": "helvetiker_regular",
       "label": "Clean Sans"
      },
      {
       "value": "gentilis_bold",
       "label": "Rounded Sans"
      },
      {
       "value": "droid_serif_bold",
       "label": "Classic Serif"
      },
      {
       "value": "optimer_bold",
       "label": "Elegant Serif"
      }
     ]
    },
    {
     "param": "cd-line-spacing",
     "label": "Line spacing",
     "kind": "number",
     "default": 1.25,
     "min": 0.9,
     "max": 2,
     "step": 0.05,
     "unit": "x"
    },
    {
     "param": "cd-height",
     "label": "Letter height",
     "kind": "number",
     "default": 60,
     "min": 20,
     "max": 300,
     "step": 1,
     "unit": "mm"
    },
    {
     "param": "cd-thick",
     "label": "Sign depth",
     "kind": "number",
     "default": 20,
     "min": 4,
     "max": 50,
     "step": 1,
     "unit": "mm"
    },
    {
     "param": "cd-relief-depth",
     "label": "Relief depth",
     "kind": "number",
     "default": 4,
     "min": 1,
     "max": 15,
     "step": 0.5,
     "unit": "mm"
    },
    {
     "param": "cd-frame",
     "label": "Frame",
     "kind": "number",
     "default": 0,
     "min": 0,
     "max": 6,
     "step": 0.5
    },
    {
     "param": "cd-bg-margin-x",
     "label": "Side margin",
     "kind": "number",
     "default": 15,
     "min": 4,
     "max": 60,
     "step": 1,
     "unit": "mm"
    },
    {
     "param": "cd-bg-margin-y",
     "label": "Height margin",
     "kind": "number",
     "default": 15,
     "min": 4,
     "max": 60,
     "step": 1,
     "unit": "mm"
    },
    {
     "param": "cd-text-offset-y",
     "label": "Text position",
     "kind": "number",
     "default": 0,
     "min": -40,
     "max": 40,
     "step": 1,
     "unit": "mm"
    },
    {
     "param": "cd-corner-radius",
     "label": "Corner radius",
     "kind": "number",
     "default": 10,
     "min": 0,
     "max": 30,
     "step": 1,
     "unit": "mm"
    },
    {
     "param": "cd-wave-amount",
     "label": "Wave amount",
     "kind": "number",
     "default": 10,
     "min": 2,
     "max": 25,
     "step": 1,
     "unit": "mm"
    },
    {
     "param": "cd-wave-cycles",
     "label": "Wave cycles",
     "kind": "number",
     "default": 1.5,
     "min": 0.5,
     "max": 4,
     "step": 0.5
    },
    {
     "param": "cd-hole-dia",
     "label": "Hole size",
     "kind": "number",
     "default": 4,
     "min": 2,
     "max": 10,
     "step": 0.5,
     "unit": "mm"
    },
    {
     "param": "cd-stand",
     "label": "Desk base",
     "kind": "number",
     "default": 0,
     "min": 0,
     "max": 30,
     "step": 1
    },
    {
     "param": "cd-smooth",
     "label": "Corners",
     "kind": "number",
     "default": 0.5,
     "min": 0,
     "max": 4,
     "step": 0.25,
     "unit": "mm"
    },
    {
     "param": "cd-bevel",
     "label": "Front edges",
     "kind": "number",
     "default": 1.5,
     "min": 0,
     "max": 6,
     "step": 0.25,
     "unit": "mm"
    },
    {
     "param": "cd-overlap",
     "label": "Letter spacing",
     "kind": "number",
     "default": 2,
     "min": 0.5,
     "max": 8,
     "step": 0.5,
     "unit": "mm"
    },
    {
     "param": "cd-bold",
     "label": "Letter weight",
     "kind": "number",
     "default": 0,
     "min": 0,
     "max": 2,
     "step": 0.1,
     "unit": "mm"
    }
   ]
  },
  {
   "name": "Silicone part mold",
   "url": "https://meshcast.app/silicone-part-mold",
   "description": "Turn any STL into a 3D printable two-part mold with a pour lid. Fill it with silicone and the silicone is your finished part: grips, stoppers, squishies, figures.",
   "params": [
    {
     "param": "up-axis",
     "label": "Which way is up??The end resting on the plate is where the lid goes and where yo",
     "kind": "choice",
     "default": "z",
     "options": [
      {
       "value": "x",
       "label": "X up"
      },
      {
       "value": "y",
       "label": "Y up"
      },
      {
       "value": "z",
       "label": "Z up"
      }
     ]
    },
    {
     "param": "scale-input",
     "label": "Scale your model",
     "kind": "number",
     "default": 100,
     "min": 25,
     "max": 300,
     "step": 5,
     "unit": "%"
    },
    {
     "param": "wall-input",
     "label": "Wall",
     "kind": "number",
     "default": 12,
     "min": 8,
     "max": 20,
     "step": 1,
     "unit": "mm"
    },
    {
     "param": "flat-input",
     "label": "Flat base",
     "kind": "number",
     "default": 0,
     "min": 0,
     "max": 40,
     "step": 1
    },
    {
     "param": "pour-input",
     "label": "Pour hole",
     "kind": "number",
     "default": 10,
     "min": 6,
     "max": 16,
     "step": 1,
     "unit": "mm"
    },
    {
     "param": "cup-input",
     "label": "Cupped underside",
     "kind": "toggle",
     "default": false
    },
    {
     "param": "follow-input",
     "label": "Follow the shape (less plastic)",
     "kind": "toggle",
     "default": true
    },
    {
     "param": "bolt-input",
     "label": "M4 bolt holes",
     "kind": "toggle",
     "default": true
    },
    {
     "param": "show-model",
     "label": "Show the part",
     "kind": "toggle",
     "default": true
    }
   ]
  },
  {
   "name": "Clay & soap press mold",
   "url": "https://meshcast.app/press-mold",
   "description": "Free online press mold generator. Drop in any STL and get a print-ready die and piston: pack it, press it, release. For clay, pressed soap bars and bath bombs.",
   "params": [
    {
     "param": "diameter-input",
     "label": "Scale your model",
     "kind": "number",
     "default": 100,
     "min": 65,
     "max": 150,
     "step": 5,
     "unit": "%"
    },
    {
     "param": "mold-shape",
     "label": "Mold settings",
     "kind": "choice",
     "default": "auto",
     "options": [
      {
       "value": "auto",
       "label": "Auto"
      },
      {
       "value": "round",
       "label": "Round"
      },
      {
       "value": "rect",
       "label": "Rectangular"
      }
     ]
    },
    {
     "param": "wall-input",
     "label": "Wall thickness",
     "kind": "number",
     "default": 2.5,
     "min": 2.5,
     "max": 4,
     "step": 0.1,
     "unit": "mm"
    },
    {
     "param": "eject-input",
     "label": "Ejector hole Pin hole through the die floor to",
     "kind": "toggle",
     "default": false
    },
    {
     "param": "seam-input",
     "label": "Seam position",
     "kind": "number",
     "default": 50,
     "min": 0,
     "max": 100,
     "step": 1
    },
    {
     "param": "up-axis",
     "label": "Up axis",
     "kind": "choice",
     "default": "y",
     "options": [
      {
       "value": "x",
       "label": "X up"
      },
      {
       "value": "y",
       "label": "Y up"
      },
      {
       "value": "z",
       "label": "Z up"
      }
     ]
    },
    {
     "param": "clr-input",
     "label": "Fit clearance",
     "kind": "number",
     "default": 0.4,
     "min": 0.2,
     "max": 0.5,
     "step": 0.05,
     "unit": "mm"
    },
    {
     "param": "pad-input",
     "label": "Padding around model",
     "kind": "number",
     "default": 4,
     "min": 2.5,
     "max": 12,
     "step": 0.5,
     "unit": "mm"
    }
   ]
  },
  {
   "name": "Texture roller",
   "url": "https://meshcast.app/texture-roller",
   "description": "Free roller generator: emboss a pattern into clay, dough and fondant, raised or recessed. 3D-printable, in your browser, no card.",
   "params": [
    {
     "param": "invert-toggle",
     "label": "Invert (swap shape / background)",
     "kind": "toggle",
     "default": false
    },
    {
     "param": "fit-mode",
     "label": "Image type",
     "kind": "choice",
     "default": "fill",
     "options": [
      {
       "value": "fill",
       "label": "Full pattern (fills the tile)"
      },
      {
       "value": "fit",
       "label": "Single icon (inset + margin)"
      }
     ]
    },
    {
     "param": "threshold",
     "label": "Threshold (0 = smooth relief)",
     "kind": "number",
     "default": 0,
     "min": 0,
     "max": 0.9,
     "step": 0.05
    },
    {
     "param": "handle-toggle",
     "label": "Include both handles (print once)",
     "kind": "toggle",
     "default": true
    },
    {
     "param": "sleeve-fit",
     "label": "Sleeve clearance",
     "kind": "number",
     "default": 0.3,
     "min": 0.15,
     "max": 0.6,
     "step": 0.05,
     "unit": "mm"
    },
    {
     "param": "dia",
     "label": "Diameter",
     "kind": "number",
     "default": 36,
     "min": 35,
     "max": 70,
     "step": 1,
     "unit": "mm"
    },
    {
     "param": "len",
     "label": "Length",
     "kind": "number",
     "default": 90,
     "min": 40,
     "max": 120,
     "step": 1,
     "unit": "mm"
    },
    {
     "param": "bore",
     "label": "Axle bore",
     "kind": "number",
     "default": 8,
     "min": 4,
     "max": 20,
     "step": 1,
     "unit": "mm"
    },
    {
     "param": "depth",
     "label": "Pattern depth",
     "kind": "number",
     "default": 1.2,
     "min": 0.4,
     "max": 3,
     "step": 0.1,
     "unit": "mm"
    },
    {
     "param": "scale",
     "label": "Texture scale",
     "kind": "number",
     "default": 1,
     "min": 0.5,
     "max": 2.5,
     "step": 0.1,
     "unit": "×"
    },
    {
     "param": "around",
     "label": "Repeats around",
     "kind": "number",
     "default": 9,
     "min": 1,
     "max": 24,
     "step": 1
    },
    {
     "param": "along",
     "label": "Repeats along",
     "kind": "number",
     "default": 7,
     "min": 1,
     "max": 24,
     "step": 1
    }
   ]
  },
  {
   "name": "Golf ball stencil",
   "url": "https://meshcast.app/golf-ball-stencil",
   "description": "Make a 3D-printable golf ball stencil: your initials, a logo, or an alignment line (straight, triple track, T or cross). Free STL, no card, in your browser.",
   "params": [
    {
     "param": "gbs-linelen-input",
     "label": "Length",
     "kind": "number",
     "default": 32,
     "min": 14,
     "max": 40,
     "step": 1
    },
    {
     "param": "gbs-linew-input",
     "label": "Line width",
     "kind": "number",
     "default": 1.6,
     "min": 0.8,
     "max": 3,
     "step": 0.1
    },
    {
     "param": "gbs-linegap-input",
     "label": "Track gap",
     "kind": "number",
     "default": 4,
     "min": 2,
     "max": 8,
     "step": 0.5
    },
    {
     "param": "gbs-line-left",
     "label": "line left",
     "kind": "text"
    },
    {
     "param": "gbs-line-right",
     "label": "line right",
     "kind": "text"
    },
    {
     "param": "gbs-linetext-input",
     "label": "Text size",
     "kind": "number",
     "default": 9,
     "min": 5,
     "max": 14,
     "step": 0.5
    },
    {
     "param": "gbs-text",
     "label": "Initials",
     "kind": "text",
     "default": "MC"
    },
    {
     "param": "gbs-tpl-text",
     "label": "tpl text",
     "kind": "text",
     "default": "NY"
    },
    {
     "param": "gbs-font",
     "label": "Font",
     "kind": "choice",
     "default": "helvetiker_bold",
     "options": [
      {
       "value": "helvetiker_bold",
       "label": "Bold & Blocky"
      },
      {
       "value": "helvetiker_regular",
       "label": "Clean Sans"
      },
      {
       "value": "optimer_bold",
       "label": "Bold Serif"
      },
      {
       "value": "optimer_regular",
       "label": "Classic Serif"
      },
      {
       "value": "gentilis_bold",
       "label": "Bold Elegant"
      },
      {
       "value": "gentilis_regular",
       "label": "Elegant Serif"
      },
      {
       "value": "droid_sans_bold",
       "label": "Bold Rounded"
      },
      {
       "value": "droid_sans_regular",
       "label": "Rounded Sans"
      },
      {
       "value": "droid_serif_bold",
       "label": "Bold Newspaper"
      },
      {
       "value": "droid_serif_regular",
       "label": "Newspaper Serif"
      }
     ]
    },
    {
     "param": "gbs-threshold-input",
     "label": "Threshold",
     "kind": "number",
     "default": 128,
     "min": 10,
     "max": 240,
     "step": 2
    },
    {
     "param": "gbs-invert",
     "label": "Invert (cut the background instead)",
     "kind": "toggle",
     "default": false
    },
    {
     "param": "gbs-size-input",
     "label": "Size",
     "kind": "number",
     "default": 20,
     "min": 8,
     "max": 32,
     "step": 0.5
    },
    {
     "param": "gbs-bridges",
     "label": "Stencil bridges",
     "kind": "toggle",
     "default": true
    },
    {
     "param": "gbs-ball-input",
     "label": "Ball size",
     "kind": "number",
     "default": 42.67,
     "min": 40,
     "max": 46,
     "step": 0.01
    },
    {
     "param": "gbs-clr-input",
     "label": "Clearance",
     "kind": "number",
     "default": 0.5,
     "min": 0.1,
     "max": 1.5,
     "step": 0.05
    },
    {
     "param": "gbs-skirt-input",
     "label": "Skirt",
     "kind": "number",
     "default": 12,
     "min": 0,
     "max": 26,
     "step": 1
    },
    {
     "param": "gbs-wall-input",
     "label": "Wall",
     "kind": "number",
     "default": 2.4,
     "min": 1.6,
     "max": 4,
     "step": 0.1
    },
    {
     "param": "gbs-funnel-input",
     "label": "Pen funnel",
     "kind": "number",
     "default": 0,
     "min": 0,
     "max": 1.2,
     "step": 0.1
    },
    {
     "param": "gbs-bridgew-input",
     "label": "Bridge width",
     "kind": "number",
     "default": 1.4,
     "min": 0.6,
     "max": 3,
     "step": 0.1
    },
    {
     "param": "gbs-tabs",
     "label": "Grip tabs with band holes",
     "kind": "toggle",
     "default": true
    },
    {
     "param": "gbs-tabw-input",
     "label": "Tab width",
     "kind": "number",
     "default": 24,
     "min": 12,
     "max": 34,
     "step": 1
    },
    {
     "param": "gbs-hole-input",
     "label": "Hole",
     "kind": "number",
     "default": 7,
     "min": 3,
     "max": 10,
     "step": 0.5
    }
   ]
  },
  {
   "name": "Cookie cutter",
   "url": "https://meshcast.app/cutter",
   "description": "Free cookie cutter generator: upload any PNG, JPG, or SVG silhouette and get a print-ready cookie or clay cutter STL. No card, runs in your browser.",
   "params": [
    {
     "param": "ct-text",
     "label": "Your shape",
     "kind": "text",
     "default": "Cookie"
    },
    {
     "param": "ct-font",
     "label": "Font",
     "kind": "choice",
     "default": "ttf:titanone",
     "options": [
      {
       "value": "ttf:titanone",
       "label": "Bold Playful"
      },
      {
       "value": "ttf:bungee",
       "label": "Bold Poster"
      },
      {
       "value": "ttf:alfaslabone",
       "label": "Bold Slab"
      },
      {
       "value": "ttf:graduate",
       "label": "Bold Collegiate"
      },
      {
       "value": "bangers",
       "label": "Comic Punch"
      },
      {
       "value": "helvetiker_bold",
       "label": "Bold & Blocky"
      },
      {
       "value": "ttf:pacifico",
       "label": "Playful Script"
      },
      {
       "value": "ttf:lobster",
       "label": "Casual Script"
      },
      {
       "value": "ttf:greatvibes",
       "label": "Flowing Script"
      },
      {
       "value": "ttf:sacramento",
       "label": "Signature Script"
      },
      {
       "value": "kalam_bold",
       "label": "Handwritten"
      },
      {
       "value": "helvetiker_regular",
       "label": "Clean Sans"
      },
      {
       "value": "gentilis_bold",
       "label": "Rounded Sans"
      },
      {
       "value": "droid_serif_bold",
       "label": "Classic Serif"
      },
      {
       "value": "optimer_bold",
       "label": "Elegant Serif"
      }
     ]
    },
    {
     "param": "threshold",
     "label": "Detection threshold",
     "kind": "number",
     "default": 128,
     "min": 10,
     "max": 240,
     "step": 2
    },
    {
     "param": "smooth-amt",
     "label": "Outline smoothing",
     "kind": "number",
     "default": 0,
     "min": 0,
     "max": 3,
     "step": 0.1,
     "unit": "mm"
    },
    {
     "param": "rotate-deg",
     "label": "Rotate",
     "kind": "number",
     "default": 0,
     "min": -180,
     "max": 180,
     "step": 1,
     "unit": "°"
    },
    {
     "param": "mirror-toggle",
     "label": "Mirror",
     "kind": "toggle",
     "default": false
    },
    {
     "param": "invert-toggle",
     "label": "Invert colors",
     "kind": "toggle",
     "default": false
    },
    {
     "param": "roller-dia",
     "label": "Diameter",
     "kind": "number",
     "default": 60,
     "min": 20,
     "max": 70,
     "step": 1,
     "unit": "mm"
    },
    {
     "param": "roller-len",
     "label": "Length",
     "kind": "number",
     "default": 100,
     "min": 30,
     "max": 140,
     "step": 1,
     "unit": "mm"
    },
    {
     "param": "roller-bore",
     "label": "Axle bore",
     "kind": "number",
     "default": 8,
     "min": 4,
     "max": 20,
     "step": 1,
     "unit": "mm"
    },
    {
     "param": "roller-blade-h",
     "label": "Dough thickness",
     "kind": "number",
     "default": 6,
     "min": 2,
     "max": 12,
     "step": 0.5,
     "unit": "mm"
    },
    {
     "param": "roller-blade-t",
     "label": "Blade thickness: roller blade t",
     "kind": "number",
     "default": 1.6,
     "min": 0.8,
     "max": 3,
     "step": 0.1,
     "unit": "mm"
    },
    {
     "param": "roller-around",
     "label": "Cookies around",
     "kind": "number",
     "default": 4,
     "min": 1,
     "max": 12,
     "step": 1
    },
    {
     "param": "roller-along",
     "label": "Cookies along",
     "kind": "number",
     "default": 3,
     "min": 1,
     "max": 10,
     "step": 1
    },
    {
     "param": "roller-shape",
     "label": "Shape size",
     "kind": "number",
     "default": 88,
     "min": 50,
     "max": 98,
     "step": 1,
     "unit": "%"
    },
    {
     "param": "roller-pad",
     "label": "Push-out pad",
     "kind": "toggle",
     "default": true
    },
    {
     "param": "roller-handle",
     "label": "Include fork handle",
     "kind": "toggle",
     "default": true
    },
    {
     "param": "stamp-toggle",
     "label": "Generate stamp",
     "kind": "toggle",
     "default": false
    },
    {
     "param": "stamp-depth",
     "label": "Detail depth",
     "kind": "number",
     "default": 1.5,
     "min": 0.5,
     "max": 3,
     "step": 0.1,
     "unit": "mm"
    },
    {
     "param": "stamp-base-t",
     "label": "Base thickness",
     "kind": "number",
     "default": 3,
     "min": 1,
     "max": 8,
     "step": 0.5,
     "unit": "mm"
    },
    {
     "param": "frame-toggle",
     "label": "Add frame border",
     "kind": "toggle",
     "default": false
    },
    {
     "param": "frame-shape",
     "label": "Frame shape",
     "kind": "choice",
     "default": "adaptive",
     "options": [
      {
       "value": "adaptive",
       "label": "Adaptive"
      },
      {
       "value": "circle",
       "label": "Circle"
      },
      {
       "value": "roundrect",
       "label": "Rounded"
      },
      {
       "value": "rect",
       "label": "Rect"
      }
     ]
    },
    {
     "param": "frame-pad",
     "label": "Frame padding",
     "kind": "number",
     "default": 12,
     "min": 5,
     "max": 30,
     "step": 1,
     "unit": "mm"
    },
    {
     "param": "detail-toggle",
     "label": "Cut detail into cutter",
     "kind": "toggle",
     "default": false
    },
    {
     "param": "blade-h",
     "label": "Blade height",
     "kind": "number",
     "default": 14,
     "min": 6,
     "max": 25,
     "step": 0.5,
     "unit": "mm"
    },
    {
     "param": "blade-t",
     "label": "Blade thickness: blade t",
     "kind": "number",
     "default": 0.8,
     "min": 0.4,
     "max": 1.5,
     "step": 0.05,
     "unit": "mm"
    },
    {
     "param": "rim-w",
     "label": "Top rim",
     "kind": "number",
     "default": 4,
     "min": 0,
     "max": 10,
     "step": 0.5,
     "unit": "mm"
    }
   ]
  },
  {
   "name": "Custom stamps",
   "url": "https://meshcast.app/stamp",
   "description": "Design a custom 3D-printable rubber stamp. Add text, pick a shape and font, set depth and border, then download the STL.",
   "params": [
    {
     "param": "stamp-text",
     "label": "Text",
     "kind": "text",
     "default": "MESHCAST"
    },
    {
     "param": "stamp-font",
     "label": "Font",
     "kind": "choice",
     "default": "helvetiker_bold",
     "options": [
      {
       "value": "helvetiker_bold",
       "label": "Bold & Blocky"
      },
      {
       "value": "helvetiker_regular",
       "label": "Clean Sans"
      },
      {
       "value": "optimer_bold",
       "label": "Bold Serif"
      },
      {
       "value": "optimer_regular",
       "label": "Classic Serif"
      },
      {
       "value": "gentilis_bold",
       "label": "Bold Elegant"
      },
      {
       "value": "gentilis_regular",
       "label": "Elegant Serif"
      },
      {
       "value": "droid_sans_bold",
       "label": "Bold Rounded"
      },
      {
       "value": "droid_sans_regular",
       "label": "Rounded Sans"
      },
      {
       "value": "droid_serif_bold",
       "label": "Bold Newspaper"
      },
      {
       "value": "droid_serif_regular",
       "label": "Newspaper Serif"
      }
     ]
    },
    {
     "param": "stamp-textscale-input",
     "label": "Text scale",
     "kind": "number",
     "default": 80,
     "min": 30,
     "max": 100,
     "step": 1
    },
    {
     "param": "stamp-logo-threshold-input",
     "label": "Threshold",
     "kind": "number",
     "default": 128,
     "min": 10,
     "max": 240,
     "step": 2
    },
    {
     "param": "stamp-width-input",
     "label": "Width: stamp width",
     "kind": "number",
     "default": 60,
     "min": 20,
     "max": 120,
     "step": 1
    },
    {
     "param": "stamp-height-input",
     "label": "Height",
     "kind": "number",
     "default": 30,
     "min": 20,
     "max": 120,
     "step": 1
    },
    {
     "param": "stamp-corner-input",
     "label": "Rounding",
     "kind": "number",
     "default": 0,
     "min": 0,
     "max": 40,
     "step": 1
    },
    {
     "param": "stamp-border-enable",
     "label": "Add border ring",
     "kind": "toggle",
     "default": false
    },
    {
     "param": "stamp-border-input",
     "label": "Width: stamp border",
     "kind": "number",
     "default": 2.5,
     "min": 1,
     "max": 8,
     "step": 0.5
    },
    {
     "param": "stamp-handle-enable",
     "label": "Add handle",
     "kind": "toggle",
     "default": true
    },
    {
     "param": "stamp-twopart",
     "label": "Print in two parts (screw-on handle)",
     "kind": "toggle",
     "default": true
    },
    {
     "param": "stamp-pattern-enable",
     "label": "Sand casting pattern instead",
     "kind": "toggle",
     "default": false
    },
    {
     "param": "stamp-relief-input",
     "label": "Relief",
     "kind": "number",
     "default": 2,
     "min": 0.5,
     "max": 3,
     "step": 0.25
    },
    {
     "param": "stamp-base-input",
     "label": "Base",
     "kind": "number",
     "default": 3,
     "min": 1.5,
     "max": 8,
     "step": 0.5
    },
    {
     "param": "stamp-fillet-enable",
     "label": "Round the base edge",
     "kind": "toggle",
     "default": false
    },
    {
     "param": "stamp-chamfer-enable",
     "label": "Chamfer relief edges",
     "kind": "toggle",
     "default": true
    },
    {
     "param": "stamp-draft-input",
     "label": "Draft angle",
     "kind": "number",
     "default": 10,
     "min": 0,
     "max": 20,
     "step": 0.1
    },
    {
     "param": "stamp-footfillet-enable",
     "label": "Round the relief feet",
     "kind": "toggle",
     "default": true
    },
    {
     "param": "stamp-autokern-enable",
     "label": "Open letter spacing for the draft",
     "kind": "toggle",
     "default": true
    },
    {
     "param": "stamp-kern-input",
     "label": "Letter spacing",
     "kind": "number",
     "default": 0,
     "min": -3,
     "max": 6,
     "step": 0.1
    },
    {
     "param": "stamp-feet-enable",
     "label": "Show letter feet in the preview",
     "kind": "toggle",
     "default": true
    },
    {
     "param": "stamp-holes-enable",
     "label": "Add mounting holes",
     "kind": "toggle",
     "default": false
    },
    {
     "param": "stamp-holes-dia",
     "label": "Diameter",
     "kind": "number",
     "default": 8,
     "min": 3,
     "max": 20,
     "step": 0.1
    },
    {
     "param": "stamp-index-enable",
     "label": "Orientation notch",
     "kind": "toggle",
     "default": false
    }
   ]
  },
  {
   "name": "Dart holder",
   "url": "https://meshcast.app/dart",
   "description": "Free dart holder generator: customize a personalized 3D-printable dart stand. Set your name, font, and size, then download the STL. No card, in your browser.",
   "params": [
    {
     "param": "text-input",
     "label": "Your text",
     "kind": "text",
     "default": "JAMES"
    },
    {
     "param": "font-select",
     "label": "Font",
     "kind": "choice",
     "default": "helvetiker_bold",
     "options": [
      {
       "value": "helvetiker_bold",
       "label": "Bold & Blocky"
      },
      {
       "value": "helvetiker_regular",
       "label": "Clean Sans"
      },
      {
       "value": "droid_sans_bold",
       "label": "Bold Rounded"
      },
      {
       "value": "optimer_bold",
       "label": "Bold Serif"
      },
      {
       "value": "gentilis_bold",
       "label": "Bold Elegant"
      }
     ]
    },
    {
     "param": "size-input",
     "label": "Text size",
     "kind": "number",
     "default": 14,
     "min": 6,
     "max": 24,
     "step": 0.5,
     "unit": "mm"
    },
    {
     "param": "depth-input",
     "label": "Emboss depth",
     "kind": "number",
     "default": 1.5,
     "min": 0.5,
     "max": 4,
     "step": 0.1,
     "unit": "mm"
    }
   ]
  },
  {
   "name": "Christmas ornament",
   "url": "https://meshcast.app/christmas-ornament",
   "description": "Put any name on a 3D printable Christmas ornament: a bauble, star or gingerbread man with a ribbon loop and raised trim. Free STL and multicolor 3MF.",
   "params": [
    {
     "param": "orn-line1",
     "label": "Name",
     "kind": "text",
     "default": "Emma"
    },
    {
     "param": "orn-line2",
     "label": "Second line",
     "kind": "text"
    },
    {
     "param": "orn-font",
     "label": "Font",
     "kind": "choice",
     "default": "lobster",
     "options": [
      {
       "value": "lobster",
       "label": "Retro Script"
      },
      {
       "value": "pacifico",
       "label": "Brush Script"
      },
      {
       "value": "sergio_trendy",
       "label": "Fun & Bold"
      },
      {
       "value": "droid_serif_bold",
       "label": "Headline Serif"
      },
      {
       "value": "helvetiker_bold",
       "label": "Chunky Sans"
      },
      {
       "value": "bungee",
       "label": "Poster Block"
      }
     ]
    },
    {
     "param": "orn-size-input",
     "label": "Height",
     "kind": "number",
     "default": 80,
     "min": 50,
     "max": 120,
     "step": 1,
     "unit": "mm"
    },
    {
     "param": "orn-border",
     "label": "Raised trim along the edge",
     "kind": "toggle",
     "default": true
    },
    {
     "param": "orn-base-input",
     "label": "Thickness",
     "kind": "number",
     "default": 2.4,
     "min": 1.6,
     "max": 4,
     "step": 0.2,
     "unit": "mm"
    },
    {
     "param": "orn-rise-input",
     "label": "Raised",
     "kind": "number",
     "default": 1,
     "min": 0.4,
     "max": 2,
     "step": 0.2,
     "unit": "mm"
    },
    {
     "param": "orn-bw-input",
     "label": "Trim width",
     "kind": "number",
     "default": 2.4,
     "min": 1.2,
     "max": 5,
     "step": 0.2,
     "unit": "mm"
    },
    {
     "param": "orn-hole-input",
     "label": "Ribbon hole",
     "kind": "number",
     "default": 5,
     "min": 0,
     "max": 8,
     "step": 0.5,
     "unit": "mm"
    }
   ]
  },
  {
   "name": "I love you keychain",
   "url": "https://meshcast.app/custom-love-keychain",
   "description": "Make an \"I heart\" keychain with any name or word. Three colours from a single-nozzle printer: pause and swap filament twice. Free STL and 3MF, in your browser.",
   "params": [
    {
     "param": "lk-line1",
     "label": "First line",
     "kind": "text",
     "default": "NAME"
    },
    {
     "param": "lk-line2",
     "label": "Second line",
     "kind": "text"
    },
    {
     "param": "lk-font",
     "label": "Font",
     "kind": "choice",
     "default": "sergio_trendy",
     "options": [
      {
       "value": "sergio_trendy",
       "label": "Fun & Bold"
      },
      {
       "value": "droid_serif_bold",
       "label": "Headline Serif"
      },
      {
       "value": "helvetiker_bold",
       "label": "Chunky Sans"
      },
      {
       "value": "bungee",
       "label": "Poster Block"
      },
      {
       "value": "bangers",
       "label": "Comic Bold"
      },
      {
       "value": "lobster",
       "label": "Retro Script"
      }
     ]
    },
    {
     "param": "lk-width-input",
     "label": "Width",
     "kind": "number",
     "default": 45,
     "min": 28,
     "max": 80,
     "step": 1
    },
    {
     "param": "lk-border-input",
     "label": "Border",
     "kind": "number",
     "default": 2.2,
     "min": 1,
     "max": 6,
     "step": 0.1
    },
    {
     "param": "lk-smooth-input",
     "label": "Smoothing",
     "kind": "number",
     "default": 4,
     "min": 0,
     "max": 10,
     "step": 0.5
    },
    {
     "param": "lk-base-input",
     "label": "Black base",
     "kind": "number",
     "default": 2,
     "min": 1,
     "max": 4,
     "step": 0.1
    },
    {
     "param": "lk-text-input",
     "label": "White rise",
     "kind": "number",
     "default": 0.7,
     "min": 0.2,
     "max": 2,
     "step": 0.01
    },
    {
     "param": "lk-heart-input",
     "label": "Red rise",
     "kind": "number",
     "default": 0.77,
     "min": 0.2,
     "max": 2,
     "step": 0.01
    },
    {
     "param": "lk-layer-input",
     "label": "Layer height",
     "kind": "number",
     "default": 0.2,
     "min": 0.08,
     "max": 0.32,
     "step": 0.02
    },
    {
     "param": "lk-hole-input",
     "label": "Diameter",
     "kind": "number",
     "default": 4,
     "min": 2,
     "max": 8,
     "step": 0.5
    },
    {
     "param": "lk-ringwall-input",
     "label": "Ring wall",
     "kind": "number",
     "default": 2,
     "min": 1,
     "max": 5,
     "step": 0.1
    },
    {
     "param": "lk-heartsize-input",
     "label": "Heart size",
     "kind": "number",
     "default": 1.02,
     "min": 0.7,
     "max": 1.5,
     "step": 0.02
    },
    {
     "param": "lk-rowgap-input",
     "label": "Row gap",
     "kind": "number",
     "default": 0.09,
     "min": 0,
     "max": 0.4,
     "step": 0.01
    }
   ]
  },
  {
   "name": "Photo lithophane",
   "url": "https://meshcast.app/lithophane",
   "description": "Free lithophane generator: upload any photo and turn it into a 3D-printable lithophane that reveals the image when backlit. Runs entirely in your browser, no card.",
   "params": [
    {
     "param": "width",
     "label": "Width",
     "kind": "number",
     "default": 100,
     "min": 40,
     "max": 200,
     "step": 1,
     "unit": "mm"
    },
    {
     "param": "detail",
     "label": "Detail",
     "kind": "choice",
     "default": "190",
     "options": [
      {
       "value": "140",
       "label": "Fast"
      },
      {
       "value": "190",
       "label": "Balanced"
      },
      {
       "value": "270",
       "label": "Fine"
      }
     ]
    },
    {
     "param": "contrast",
     "label": "Contrast",
     "kind": "number",
     "default": 1.15,
     "min": 0.5,
     "max": 2.5,
     "step": 0.05,
     "unit": "×"
    },
    {
     "param": "brightness",
     "label": "Brightness",
     "kind": "number",
     "default": 1,
     "min": 0.6,
     "max": 1.8,
     "step": 0.05,
     "unit": "×"
    },
    {
     "param": "invert-toggle",
     "label": "Invert (negative)",
     "kind": "toggle",
     "default": false
    },
    {
     "param": "mirror-toggle",
     "label": "Mirror (flip left-right)",
     "kind": "toggle",
     "default": false
    },
    {
     "param": "max-thick",
     "label": "Max thickness",
     "kind": "number",
     "default": 3,
     "min": 2,
     "max": 6,
     "step": 0.1,
     "unit": "mm"
    },
    {
     "param": "min-thick",
     "label": "Min thickness",
     "kind": "number",
     "default": 0.8,
     "min": 0.6,
     "max": 1.6,
     "step": 0.1,
     "unit": "mm"
    },
    {
     "param": "frame-toggle",
     "label": "Add a border frame",
     "kind": "toggle",
     "default": false
    },
    {
     "param": "frame-w",
     "label": "Frame width",
     "kind": "number",
     "default": 4,
     "min": 2,
     "max": 10,
     "step": 0.5,
     "unit": "mm"
    }
   ]
  },
  {
   "name": "Name sign",
   "url": "https://meshcast.app/nameplate",
   "description": "Free nameplate generator: design a custom name sign or desk plate with a bold initial and flowing script name. No card, in your browser, download STL or 3MF.",
   "params": [
    {
     "param": "np-mount-on",
     "label": "Mounting: mount on",
     "kind": "toggle",
     "default": false
    },
    {
     "param": "np-mount",
     "label": "Mounting: mount",
     "kind": "choice",
     "default": "none",
     "options": [
      {
       "value": "none",
       "label": "None"
      },
      {
       "value": "keyhole1",
       "label": "1 keyhole slot"
      },
      {
       "value": "keyhole2",
       "label": "2 keyhole slots"
      },
      {
       "value": "holes2",
       "label": "2 screw holes"
      },
      {
       "value": "cleat",
       "label": "French cleat (separate wall bar)"
      },
      {
       "value": "stand",
       "label": "Desk wedge (separate part)"
      }
     ]
    },
    {
     "param": "np-screw-input",
     "label": "Screw head",
     "kind": "number",
     "default": 8,
     "min": 5,
     "max": 14,
     "step": 0.5
    },
    {
     "param": "np-mount-manual",
     "label": "Position them myself",
     "kind": "toggle",
     "default": false
    },
    {
     "param": "np-mtop-input",
     "label": "From top",
     "kind": "number",
     "default": 25,
     "min": 4,
     "max": 300,
     "step": 0.5
    },
    {
     "param": "np-mgap-input",
     "label": "Apart",
     "kind": "number",
     "default": 60,
     "min": 10,
     "max": 400,
     "step": 0.5
    },
    {
     "param": "np-cleat-angle-input",
     "label": "Angle",
     "kind": "number",
     "default": 45,
     "min": 30,
     "max": 60,
     "step": 1
    },
    {
     "param": "np-cleat-width-input",
     "label": "Bar width",
     "kind": "number",
     "default": 60,
     "min": 20,
     "max": 300,
     "step": 1
    },
    {
     "param": "np-cleat-depth-input",
     "label": "Groove depth",
     "kind": "number",
     "default": 5,
     "min": 3,
     "max": 20,
     "step": 0.5
    },
    {
     "param": "np-cleat-screws-input",
     "label": "Wall screws",
     "kind": "number",
     "default": 2,
     "min": 1,
     "max": 4,
     "step": 1
    }
   ]
  },
  {
   "name": "Paper embosser",
   "url": "https://meshcast.app/embosser",
   "description": "Turn your logo, monogram or text into a 3D-printable paper embosser. Matched die pair with a print-in-place hinge or magnet closure. Download the STL free.",
   "params": [
    {
     "param": "emb-magnet-size",
     "label": "magnet size",
     "kind": "choice",
     "default": "6x2",
     "options": [
      {
       "value": "5x2",
       "label": "5 × 2 mm discs"
      },
      {
       "value": "6x2",
       "label": "6 × 2 mm discs"
      },
      {
       "value": "8x3",
       "label": "8 × 3 mm discs"
      },
      {
       "value": "10x3",
       "label": "10 × 3 mm discs"
      }
     ]
    },
    {
     "param": "emb-text",
     "label": "Text / Monogram",
     "kind": "text",
     "default": "MC"
    },
    {
     "param": "emb-font",
     "label": "Font",
     "kind": "choice",
     "default": "gentilis_bold",
     "options": [
      {
       "value": "helvetiker_bold",
       "label": "Bold & Blocky"
      },
      {
       "value": "helvetiker_regular",
       "label": "Clean Sans"
      },
      {
       "value": "optimer_bold",
       "label": "Bold Serif"
      },
      {
       "value": "optimer_regular",
       "label": "Classic Serif"
      },
      {
       "value": "gentilis_bold",
       "label": "Bold Elegant"
      },
      {
       "value": "gentilis_regular",
       "label": "Elegant Serif"
      },
      {
       "value": "droid_sans_bold",
       "label": "Bold Rounded"
      },
      {
       "value": "droid_sans_regular",
       "label": "Rounded Sans"
      },
      {
       "value": "droid_serif_bold",
       "label": "Bold Newspaper"
      },
      {
       "value": "droid_serif_regular",
       "label": "Newspaper Serif"
      }
     ]
    },
    {
     "param": "emb-threshold-input",
     "label": "Threshold",
     "kind": "number",
     "default": 128,
     "min": 10,
     "max": 240,
     "step": 2
    },
    {
     "param": "emb-invert",
     "label": "Invert (emboss the background)",
     "kind": "toggle",
     "default": false
    },
    {
     "param": "emb-scale-input",
     "label": "Scale",
     "kind": "number",
     "default": 78,
     "min": 40,
     "max": 100,
     "step": 1
    },
    {
     "param": "emb-width-input",
     "label": "Width",
     "kind": "number",
     "default": 50,
     "min": 30,
     "max": 90,
     "step": 1
    },
    {
     "param": "emb-height-input",
     "label": "Depth",
     "kind": "number",
     "default": 45,
     "min": 30,
     "max": 90,
     "step": 1
    },
    {
     "param": "emb-relief-input",
     "label": "Emboss depth",
     "kind": "number",
     "default": 1,
     "min": 0.4,
     "max": 2,
     "step": 0.1
    },
    {
     "param": "emb-clr-input",
     "label": "Paper gap",
     "kind": "number",
     "default": 0.25,
     "min": 0.1,
     "max": 0.6,
     "step": 0.05
    },
    {
     "param": "emb-base-input",
     "label": "Plate thickness",
     "kind": "number",
     "default": 4,
     "min": 3,
     "max": 6,
     "step": 0.5
    },
    {
     "param": "emb-corner-input",
     "label": "Corner radius",
     "kind": "number",
     "default": 4,
     "min": 0,
     "max": 15,
     "step": 0.5
    }
   ]
  },
  {
   "name": "Keychain & tags",
   "url": "https://meshcast.app/keychain",
   "description": "Free keychain generator: design a custom 3D-printed keychain tag. Type your text, pick a shape and font, then download STL or 3MF. No card, in your browser.",
   "params": [
    {
     "param": "kc-text",
     "label": "Keychain text",
     "kind": "text",
     "default": "MAX"
    },
    {
     "param": "kc-font",
     "label": "Font",
     "kind": "choice",
     "default": "droid_serif_bold",
     "options": [
      {
       "value": "droid_serif_bold",
       "label": "Bold Newspaper"
      },
      {
       "value": "droid_serif_regular",
       "label": "Newspaper Serif"
      },
      {
       "value": "optimer_bold",
       "label": "Bold Serif"
      },
      {
       "value": "optimer_regular",
       "label": "Classic Serif"
      },
      {
       "value": "gentilis_bold",
       "label": "Bold Elegant"
      },
      {
       "value": "helvetiker_bold",
       "label": "Bold & Blocky"
      },
      {
       "value": "droid_sans_bold",
       "label": "Bold Rounded"
      },
      {
       "value": "lobster",
       "label": "Retro Script"
      },
      {
       "value": "pacifico",
       "label": "Bold Script"
      },
      {
       "value": "kalam_bold",
       "label": "Casual Script"
      },
      {
       "value": "bangers",
       "label": "Comic Bold"
      },
      {
       "value": "bungee",
       "label": "Poster Block"
      }
     ]
    },
    {
     "param": "kc-tsize",
     "label": "Text size",
     "kind": "number",
     "default": 11,
     "min": 3,
     "max": 20,
     "step": 0.5,
     "unit": "mm"
    },
    {
     "param": "kc-depth",
     "label": "Emboss depth",
     "kind": "number",
     "default": 0.8,
     "min": 0.3,
     "max": 2,
     "step": 0.1,
     "unit": "mm"
    },
    {
     "param": "kc-border",
     "label": "Border",
     "kind": "number",
     "default": 3.5,
     "min": 2,
     "max": 14,
     "step": 0.5,
     "unit": "mm"
    },
    {
     "param": "kc-radius",
     "label": "Corner radius",
     "kind": "number",
     "default": 6,
     "min": 2,
     "max": 15,
     "step": 0.5,
     "unit": "mm"
    },
    {
     "param": "kc-thick",
     "label": "Thickness",
     "kind": "number",
     "default": 3,
     "min": 1.5,
     "max": 6,
     "step": 0.25,
     "unit": "mm"
    },
    {
     "param": "kc-bevel",
     "label": "Edge rounding",
     "kind": "number",
     "default": 0.4,
     "min": 0,
     "max": 0.8,
     "step": 0.05,
     "unit": "mm"
    },
    {
     "param": "kc-hole-enabled",
     "label": "Add keyring hole",
     "kind": "toggle",
     "default": true
    },
    {
     "param": "kc-hole",
     "label": "Keyring hole diameter",
     "kind": "number",
     "default": 4,
     "min": 2,
     "max": 8,
     "step": 0.25,
     "unit": "mm"
    }
   ]
  },
  {
   "name": "Head generator",
   "url": "https://meshcast.app/head-generator",
   "description": "Turn a photo of a person into a 3D printable head: a bust, keychain, can holder, planter or mini figure. STL or colour 3MF.",
   "params": [
    {
     "param": "hg-a-innerD",
     "label": "Opening width",
     "kind": "number",
     "default": 67.5,
     "min": 30,
     "max": 100,
     "step": 0.5,
     "unit": "mm"
    },
    {
     "param": "hg-a-depth",
     "label": "Cup depth",
     "kind": "number",
     "default": 95,
     "min": 40,
     "max": 170,
     "step": 5,
     "unit": "mm"
    },
    {
     "param": "hg-a-headsize",
     "label": "Head size",
     "kind": "number",
     "default": 100,
     "min": 60,
     "max": 170,
     "step": 5,
     "unit": "%"
    },
    {
     "param": "hg-a-headX",
     "label": "Head left/right",
     "kind": "number",
     "default": 0,
     "min": -20,
     "max": 20,
     "step": 1,
     "unit": "mm"
    },
    {
     "param": "hg-a-headY",
     "label": "Head front/back",
     "kind": "number",
     "default": 0,
     "min": -20,
     "max": 20,
     "step": 1,
     "unit": "mm"
    },
    {
     "param": "hg-a-headLift",
     "label": "Head up",
     "kind": "number",
     "default": 0,
     "min": -40,
     "max": 40,
     "step": 2,
     "unit": "mm"
    },
    {
     "param": "hg-a-drain",
     "label": "Drain hole",
     "kind": "toggle",
     "default": true
    },
    {
     "param": "hg-a-drainD",
     "label": "Drain hole size",
     "kind": "number",
     "default": 6,
     "min": 3,
     "max": 12,
     "step": 1,
     "unit": "mm"
    },
    {
     "param": "hg-a-bowlsize",
     "label": "Bowl size",
     "kind": "number",
     "default": 100,
     "min": 40,
     "max": 160,
     "step": 5,
     "unit": "%"
    },
    {
     "param": "hg-a-rimPct",
     "label": "Rim height",
     "kind": "number",
     "default": 86,
     "min": 70,
     "max": 95,
     "step": 1,
     "unit": "%"
    },
    {
     "param": "hg-a-bowlDepth",
     "label": "Bowl depth",
     "kind": "number",
     "default": 100,
     "min": 40,
     "max": 180,
     "step": 5,
     "unit": "%"
    },
    {
     "param": "hg-a-bowlX",
     "label": "Bowl left/right",
     "kind": "number",
     "default": 0,
     "min": -40,
     "max": 40,
     "step": 1,
     "unit": "mm"
    },
    {
     "param": "hg-a-bowlY",
     "label": "Bowl front/back",
     "kind": "number",
     "default": 0,
     "min": -40,
     "max": 40,
     "step": 1,
     "unit": "mm"
    },
    {
     "param": "hg-a-bowlZ",
     "label": "Bowl up/down",
     "kind": "number",
     "default": 0,
     "min": -40,
     "max": 40,
     "step": 1,
     "unit": "mm"
    },
    {
     "param": "hg-showcan",
     "label": "Show the can in the preview",
     "kind": "toggle",
     "default": true
    },
    {
     "param": "hg-brush",
     "label": "Size: brush",
     "kind": "number",
     "default": 4,
     "min": 1,
     "max": 15,
     "step": 0.5,
     "unit": "mm"
    },
    {
     "param": "hg-fill-angle",
     "label": "Edge angle",
     "kind": "number",
     "default": 30,
     "min": 10,
     "max": 60,
     "step": 1,
     "unit": "°"
    },
    {
     "param": "hg-sc-size",
     "label": "Size: sc size",
     "kind": "number",
     "default": 4,
     "min": 1,
     "max": 15,
     "step": 0.5,
     "unit": "mm"
    },
    {
     "param": "hg-sc-str",
     "label": "Strength",
     "kind": "number",
     "default": 50,
     "min": 10,
     "max": 100,
     "step": 5,
     "unit": "%"
    },
    {
     "param": "hg-a-bustBaseH",
     "label": "Stand height",
     "kind": "number",
     "default": 12,
     "min": 6,
     "max": 30,
     "step": 1,
     "unit": "%"
    },
    {
     "param": "hg-a-standW",
     "label": "Stand width",
     "kind": "number",
     "default": 100,
     "min": 70,
     "max": 160,
     "step": 5,
     "unit": "%"
    },
    {
     "param": "hg-a-plinthPct",
     "label": "Plinth height",
     "kind": "number",
     "default": 20,
     "min": 10,
     "max": 40,
     "step": 1,
     "unit": "%"
    },
    {
     "param": "hg-a-plinthW",
     "label": "Plinth width",
     "kind": "number",
     "default": 100,
     "min": 70,
     "max": 160,
     "step": 5,
     "unit": "%"
    },
    {
     "param": "hg-a-loopsize",
     "label": "Loop size",
     "kind": "number",
     "default": 100,
     "min": 60,
     "max": 180,
     "step": 10,
     "unit": "%"
    },
    {
     "param": "hg-a-loopThick",
     "label": "Ring thickness",
     "kind": "number",
     "default": 2,
     "min": 2,
     "max": 5,
     "step": 0.1,
     "unit": "mm"
    },
    {
     "param": "hg-a-socketX",
     "label": "Left/right",
     "kind": "number",
     "default": 0,
     "min": -12,
     "max": 12,
     "step": 0.5,
     "unit": "mm"
    },
    {
     "param": "hg-a-socketY",
     "label": "Front/back",
     "kind": "number",
     "default": 0,
     "min": -12,
     "max": 12,
     "step": 0.5,
     "unit": "mm"
    },
    {
     "param": "hg-a-saucerGap",
     "label": "Room around the head",
     "kind": "number",
     "default": 4,
     "min": 3,
     "max": 25,
     "step": 1,
     "unit": "mm"
    },
    {
     "param": "hg-a-saucerH",
     "label": "Saucer height",
     "kind": "number",
     "default": 10,
     "min": 7,
     "max": 30,
     "step": 1,
     "unit": "mm"
    },
    {
     "param": "hg-name",
     "label": "Name on the base",
     "kind": "text"
    },
    {
     "param": "hg-a-textScale",
     "label": "Text size",
     "kind": "number",
     "default": 100,
     "min": 50,
     "max": 200,
     "step": 5,
     "unit": "%"
    },
    {
     "param": "hg-height",
     "label": "Size: height",
     "kind": "number",
     "default": 70,
     "min": 30,
     "max": 160,
     "unit": "%"
    },
    {
     "param": "hg-base",
     "label": "Flat base",
     "kind": "number",
     "default": 6,
     "min": 0,
     "max": 30,
     "step": 1,
     "unit": "%"
    },
    {
     "param": "hg-a-turn",
     "label": "Turn",
     "kind": "number",
     "default": 0,
     "min": -180,
     "max": 180,
     "step": 5,
     "unit": "°"
    },
    {
     "param": "hg-a-tilt",
     "label": "Tilt",
     "kind": "number",
     "default": 0,
     "min": -30,
     "max": 30,
     "step": 1,
     "unit": "°"
    }
   ]
  },
  {
   "name": "Fidget slider",
   "url": "https://meshcast.app/fidget-slider",
   "description": "Design your own magnetic fidget slider: pick a pattern, roll a random one or upload a texture, set the size and magnet size, and download a free STL or 2-colour 3MF.",
   "params": [
    {
     "param": "fs-tile",
     "label": "Tile size",
     "kind": "number",
     "default": 12,
     "min": 4,
     "max": 40,
     "step": 1,
     "unit": "mm"
    },
    {
     "param": "fs-blur",
     "label": "Smooth",
     "kind": "number",
     "default": 1.5,
     "min": 0,
     "max": 4,
     "step": 0.5
    },
    {
     "param": "fs-pitch",
     "label": "Pattern size",
     "kind": "number",
     "default": 6,
     "min": 2,
     "max": 12,
     "step": 0.1,
     "unit": "mm"
    },
    {
     "param": "fs-angle",
     "label": "Rotation",
     "kind": "number",
     "default": 0,
     "min": 0,
     "max": 180,
     "step": 15,
     "unit": "°"
    },
    {
     "param": "fs-depth",
     "label": "Depth",
     "kind": "number",
     "default": 0.8,
     "min": 0.3,
     "max": 1.6,
     "step": 0.1,
     "unit": "mm"
    },
    {
     "param": "fs-invert",
     "label": "Raised pattern (invert)",
     "kind": "toggle",
     "default": false
    },
    {
     "param": "fs-width",
     "label": "Width",
     "kind": "number",
     "default": 35,
     "min": 25,
     "max": 60,
     "step": 1,
     "unit": "mm"
    },
    {
     "param": "fs-length",
     "label": "Length",
     "kind": "number",
     "default": 45,
     "min": 32,
     "max": 90,
     "step": 1,
     "unit": "mm"
    },
    {
     "param": "fs-height",
     "label": "Plate height",
     "kind": "number",
     "default": 5.8,
     "min": 4,
     "max": 10,
     "step": 0.1,
     "unit": "mm"
    },
    {
     "param": "fs-corner",
     "label": "Corners",
     "kind": "number",
     "default": 8,
     "min": 3,
     "max": 20,
     "step": 0.5,
     "unit": "mm"
    },
    {
     "param": "fs-mag-d",
     "label": "Diameter",
     "kind": "number",
     "default": 6,
     "min": 3,
     "max": 12,
     "step": 0.5,
     "unit": "mm"
    },
    {
     "param": "fs-mag-t",
     "label": "Thickness",
     "kind": "number",
     "default": 2,
     "min": 1,
     "max": 5,
     "step": 0.5,
     "unit": "mm"
    },
    {
     "param": "fs-fit",
     "label": "Magnet fit",
     "kind": "number",
     "default": 0.1,
     "min": 0,
     "max": 0.4,
     "step": 0.05,
     "unit": "mm"
    },
    {
     "param": "fs-floor",
     "label": "Magnet cover",
     "kind": "number",
     "default": 0.4,
     "min": 0.2,
     "max": 1,
     "step": 0.05,
     "unit": "mm"
    },
    {
     "param": "fs-margin",
     "label": "Border",
     "kind": "number",
     "default": 1,
     "min": 0.4,
     "max": 4,
     "step": 0.1,
     "unit": "mm"
    }
   ]
  }
 ]
}