{
  "schema_version": "2.0",
  "page_type": "crochet_pattern_article",
  "source_id": null,
  "slug": "cupcake-granny-square-crochet-pattern",
  "title": "Cupcake Granny Square Free Crochet Pattern",
  "meta_description": "Crochet the Cupcake Granny Square free pattern — puff stitch frosting, bobble liner ridges and a cherry on top in a sweet 3.7-inch DK square",
  "published_at": "2026-08-11",
  "updated_at": "2026-08-11",
  "author": "Nora",
  "thumbnail_url": "data/images/cupcake-granny-square-crochet-pattern-hero.webp",
  "meta": {
    "title": "Cupcake Granny Square Free Crochet Pattern",
    "pattern_name": "Cupcake Granny Square Free Crochet Pattern",
    "difficulty": "Intermediate",
    "time_needed": "1-2 Hours",
    "rating": 4.8,
    "made_count": "3.1K",
    "taxonomy": {
      "category": "Granny Squares",
      "skill_level": "Intermediate",
      "yarn_weight": "DK",
      "tags": [
        "granny square",
        "cupcake crochet",
        "free crochet pattern",
        "puff stitch",
        "bobble stitch",
        "front post double crochet",
        "dk yarn",
        "textured granny square",
        "blanket square",
        "food themed crochet",
        "3d crochet motif"
      ]
    }
  },
  "cards": [
    {
      "order": 1,
      "card_type": "hero",
      "code": "hero",
      "title": "Cupcake Granny Square Free Crochet Pattern",
      "raw_heading": "",
      "quantity": 1,
      "groups": [],
      "rows": [
        {
          "order": 1,
          "row_type": "info",
          "code": "hero-info-1",
          "label": "Confident Intermediate",
          "value": "Comfortable with post stitches, incomplete bobbles and hdc puffs",
          "raw_text": "Comfortable with post stitches, incomplete bobbles and hdc puffs",
          "round_start": null,
          "round_end": null,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": null,
          "meaning": null
        },
        {
          "order": 2,
          "row_type": "info",
          "code": "hero-info-2",
          "label": "One-Evening Square",
          "value": "About 60 to 90 minutes from the ch11 to the cherry on top",
          "raw_text": "About 60 to 90 minutes from the ch11 to the cherry on top",
          "round_start": null,
          "round_end": null,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": null,
          "meaning": null
        },
        {
          "order": 3,
          "row_type": "info",
          "code": "hero-info-3",
          "label": "Sweet and Sculptural",
          "value": "A 3.7-inch dessert motif that begs to become bunting or a blanket",
          "raw_text": "A 3.7-inch dessert motif that begs to become bunting or a blanket",
          "round_start": null,
          "round_end": null,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": null,
          "meaning": null
        }
      ]
    },
    {
      "order": 2,
      "card_type": "about",
      "code": "about",
      "title": "About",
      "raw_heading": "",
      "quantity": 1,
      "groups": [],
      "rows": [
        {
          "order": 1,
          "row_type": "info",
          "code": "about-info-1",
          "label": "",
          "value": "The Cupcake Granny Square turns a plain 3.7-inch motif into a tiny sculpted dessert. Instead of drawing a cupcake with flat color changes, this pattern builds one out of real texture: the wrapper is a ridged panel of front post and back post double crochet, the frosting is stacked layers of half double crochet puffs that shrink as they climb, and a single hdc3tog forms the cherry on top. It is made for square-of-the-day crocheters, bakery-themed blanket makers, and anyone who wants a motif with genuine dimension rather than a printed-looking picture",
          "raw_text": "The Cupcake Granny Square turns a plain 3.7-inch motif into a tiny sculpted dessert. Instead of drawing a cupcake with flat color changes, this pattern builds one out of real texture: the wrapper is a ridged panel of front post and back post double crochet, the frosting is stacked layers of half double crochet puffs that shrink as they climb, and a single hdc3tog forms the cherry on top. It is made for square-of-the-day crocheters, bakery-themed blanket makers, and anyone who wants a motif with genuine dimension rather than a printed-looking picture",
          "round_start": null,
          "round_end": null,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": null,
          "meaning": null
        },
        {
          "order": 2,
          "row_type": "info",
          "code": "about-info-2",
          "label": "",
          "value": "You will work through a surprising range of techniques for such a small square. Row 1 goes into the top loop of the foundation chain, Rows 3 and 4 use front post and back post double crochet to build the wrapper ridges, and the single crochet row shapes the rim. From there almost everything is built from incomplete stitches: 2-dc and 4-dc bobbles gathered into bobble decreases, 3-hdc and 4-hdc puffs joined the same way, and a final shell layer worked into the front loops of Row 5. Budget 60 to 90 minutes",
          "raw_text": "You will work through a surprising range of techniques for such a small square. Row 1 goes into the top loop of the foundation chain, Rows 3 and 4 use front post and back post double crochet to build the wrapper ridges, and the single crochet row shapes the rim. From there almost everything is built from incomplete stitches: 2-dc and 4-dc bobbles gathered into bobble decreases, 3-hdc and 4-hdc puffs joined the same way, and a final shell layer worked into the front loops of Row 5. Budget 60 to 90 minutes",
          "round_start": null,
          "round_end": null,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": null,
          "meaning": null
        },
        {
          "order": 3,
          "row_type": "info",
          "code": "about-info-3",
          "label": "",
          "value": "Finished, the square measures roughly 3.7 by 3.7 inches in DK yarn on a 3.00 mm hook, which makes it firm, flat-backed, and dense enough to stand up on a shelf. The frosting sits noticeably proud of the surface, the post-stitch wrapper catches light in clean vertical ridges, and the little cherry gives the whole square a face. Make one as a coaster or ornament, string a dozen into bunting, or seam twenty-four into a birthday blanket for the baker in your life",
          "raw_text": "Finished, the square measures roughly 3.7 by 3.7 inches in DK yarn on a 3.00 mm hook, which makes it firm, flat-backed, and dense enough to stand up on a shelf. The frosting sits noticeably proud of the surface, the post-stitch wrapper catches light in clean vertical ridges, and the little cherry gives the whole square a face. Make one as a coaster or ornament, string a dozen into bunting, or seam twenty-four into a birthday blanket for the baker in your life",
          "round_start": null,
          "round_end": null,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": null,
          "meaning": null
        }
      ]
    },
    {
      "order": 3,
      "card_type": "why_love",
      "code": "why-love",
      "title": "Why You'll Love This Pattern",
      "raw_heading": "",
      "quantity": 1,
      "groups": [],
      "rows": [
        {
          "order": 1,
          "row_type": "info",
          "code": "why-love-1",
          "label": "",
          "value": "I have made a lot of picture squares, and most of them are just color changes pretending to be a shape. This one is different, and that is exactly why I keep going back to it. The wrapper is not printed on, it is built: you turn the work, run a row of front post dc up the ridges, turn again for back post dc, and suddenly you are looking at a real fluted cupcake liner. Then the frosting layers stack on top in the back loops, each one narrower than the last, gathered from incomplete bobbles and puffs into those soft rounded swirls. My favorite moment is the tiny hdc3tog at the very top, because the second you close that cherry the whole square reads as a cupcake and you cannot unsee it. The surface shells worked into the front loops of Row 5 are the little flourish that finishes it, like piping around the edge of the icing. It is fiddly in the best way, it eats scraps, and it is done in an evening",
          "raw_text": "I have made a lot of picture squares, and most of them are just color changes pretending to be a shape. This one is different, and that is exactly why I keep going back to it. The wrapper is not printed on, it is built: you turn the work, run a row of front post dc up the ridges, turn again for back post dc, and suddenly you are looking at a real fluted cupcake liner. Then the frosting layers stack on top in the back loops, each one narrower than the last, gathered from incomplete bobbles and puffs into those soft rounded swirls. My favorite moment is the tiny hdc3tog at the very top, because the second you close that cherry the whole square reads as a cupcake and you cannot unsee it. The surface shells worked into the front loops of Row 5 are the little flourish that finishes it, like piping around the edge of the icing. It is fiddly in the best way, it eats scraps, and it is done in an evening",
          "round_start": null,
          "round_end": null,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": null,
          "meaning": null
        }
      ]
    },
    {
      "order": 4,
      "card_type": "switch_things_up",
      "code": "switch-things-up",
      "title": "Switch Things Up",
      "raw_heading": "",
      "quantity": 1,
      "groups": [],
      "rows": [
        {
          "order": 1,
          "row_type": "info",
          "code": "switch-1",
          "label": "",
          "value": "The four-color layout is where this square gets fun. Classic bakery is a cream or caramel wrapper, strawberry pink frosting, a red cherry, and white shells for the piped edge, but try a chocolate wrapper in deep brown with mint green frosting, or a lemon-yellow liner with lavender icing and a purple cherry. For a birthday blanket, keep the wrapper the same neutral in every square and rotate the frosting through a rainbow so the finished piece looks like a bakery display case. Holiday versions are easy: peppermint means red wrapper, white puffs and a green cherry, while a pumpkin-spice square wants a burnt-orange liner with cream frosting. For yarn, the sample is DK on a 3.00 mm hook, and DK is genuinely the sweet spot because puffs need a tight fabric to hold their loft. Paintbox Simply DK, Scheepjes Catona in a doubled strand, or Stylecraft Special DK all behave well. If you want a bigger square, move to worsted with a 4.00 mm hook and you will land near 4.75 inches with no stitch-count changes at all, which is the safest way to scale. If you need it wider instead, start with ch13 and work 10 dc into the top loop, then add one 4-dc bobble to the first frosting layer and one 4-hdc puff to the second so the icing still tapers correctly to the cherry. A cotton version in Ricorumi or Catona makes stiff, cheerful coasters. Mercerised cotton gives the frosting a glossy, almost buttercream sheen that acrylic cannot match",
          "raw_text": "The four-color layout is where this square gets fun. Classic bakery is a cream or caramel wrapper, strawberry pink frosting, a red cherry, and white shells for the piped edge, but try a chocolate wrapper in deep brown with mint green frosting, or a lemon-yellow liner with lavender icing and a purple cherry. For a birthday blanket, keep the wrapper the same neutral in every square and rotate the frosting through a rainbow so the finished piece looks like a bakery display case. Holiday versions are easy: peppermint means red wrapper, white puffs and a green cherry, while a pumpkin-spice square wants a burnt-orange liner with cream frosting. For yarn, the sample is DK on a 3.00 mm hook, and DK is genuinely the sweet spot because puffs need a tight fabric to hold their loft. Paintbox Simply DK, Scheepjes Catona in a doubled strand, or Stylecraft Special DK all behave well. If you want a bigger square, move to worsted with a 4.00 mm hook and you will land near 4.75 inches with no stitch-count changes at all, which is the safest way to scale. If you need it wider instead, start with ch13 and work 10 dc into the top loop, then add one 4-dc bobble to the first frosting layer and one 4-hdc puff to the second so the icing still tapers correctly to the cherry. A cotton version in Ricorumi or Catona makes stiff, cheerful coasters. Mercerised cotton gives the frosting a glossy, almost buttercream sheen that acrylic cannot match",
          "round_start": null,
          "round_end": null,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": null,
          "meaning": null
        }
      ]
    },
    {
      "order": 5,
      "card_type": "common_mistakes",
      "code": "common-mistakes",
      "title": "Common Mistakes & How to Fix Them",
      "raw_heading": "",
      "quantity": 1,
      "groups": [],
      "rows": [
        {
          "order": 1,
          "row_type": "mistake",
          "code": "mistake-1",
          "label": "Working Row 1 into both loops of the foundation chain instead of the top loop only",
          "value": "The pattern is specific: after the ch11 and sk3, the 8 dc go into the top loop of the chain, not under two strands. Flip the chain so the ridge line faces you and insert your hook under that single strand. Working both loops makes the base too dense and leaves you without a clean edge for the wrapper rows to sit on",
          "raw_text": "The pattern is specific: after the ch11 and sk3, the 8 dc go into the top loop of the chain, not under two strands. Flip the chain so the ridge line faces you and insert your hook under that single strand. Working both loops makes the base too dense and leaves you without a clean edge for the wrapper rows to sit on",
          "round_start": null,
          "round_end": null,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": null,
          "meaning": null
        },
        {
          "order": 2,
          "row_type": "mistake",
          "code": "mistake-2",
          "label": "Finishing each bobble or puff component individually instead of leaving it incomplete",
          "value": "Everywhere the pattern says incom dc or incom hdc puff, you stop mid-stitch and leave those loops on the hook. Only when it says yo and pull through all loops do you close the cluster. If you complete each dc as you go, the bobbles will not gather and the frosting will come out as a flat row of stitches with no dome to it",
          "raw_text": "Everywhere the pattern says incom dc or incom hdc puff, you stop mid-stitch and leave those loops on the hook. Only when it says yo and pull through all loops do you close the cluster. If you complete each dc as you go, the bobbles will not gather and the frosting will come out as a flat row of stitches with no dome to it",
          "round_start": null,
          "round_end": null,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": null,
          "meaning": null
        },
        {
          "order": 3,
          "row_type": "mistake",
          "code": "mistake-3",
          "label": "Skipping the turn between the FPdc and BPdc rows, or working both from the same side",
          "value": "The wrapper ridge only pops because Row 3 is front post from one side and Row 4 is back post from the other. Turn over after each row exactly as written. If both rows end up worked the same way, the liner reads as a flat block instead of a fluted cup, and the fix is to rip back to the 8 dc row rather than trying to correct it later",
          "raw_text": "The wrapper ridge only pops because Row 3 is front post from one side and Row 4 is back post from the other. Turn over after each row exactly as written. If both rows end up worked the same way, the liner reads as a flat block instead of a fluted cup, and the fix is to rip back to the 8 dc row rather than trying to correct it later",
          "round_start": null,
          "round_end": null,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": null,
          "meaning": null
        },
        {
          "order": 4,
          "row_type": "mistake",
          "code": "mistake-4",
          "label": "Working the first frosting layer through both loops, which destroys the front loops needed later",
          "value": "The frosting layers are joined in BLO for a reason. The front loops of Row 5 are reserved for the final shell layer of hdc, dc and ch-1 groups that trims the icing. If you use both loops, there is nothing left to hook into and the surface detail cannot be added. Mark Row 5 before you start so you never lose track of which loops are spoken for",
          "raw_text": "The frosting layers are joined in BLO for a reason. The front loops of Row 5 are reserved for the final shell layer of hdc, dc and ch-1 groups that trims the icing. If you use both loops, there is nothing left to hook into and the surface detail cannot be added. Mark Row 5 before you start so you never lose track of which loops are spoken for",
          "round_start": null,
          "round_end": null,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": null,
          "meaning": null
        },
        {
          "order": 5,
          "row_type": "mistake",
          "code": "mistake-5",
          "label": "Pulling puff loops to uneven heights so the frosting looks lumpy rather than swirled",
          "value": "Each loop inside a 3-hdc or 4-hdc puff should be drawn up to about the height of a finished half double crochet, and every loop within one puff should match. Pinch the base of the puff with your left thumb as you pull through all the loops so the cluster cannot stretch. Consistent loop height is the single biggest difference between neat icing and a bumpy mess",
          "raw_text": "Each loop inside a 3-hdc or 4-hdc puff should be drawn up to about the height of a finished half double crochet, and every loop within one puff should match. Pinch the base of the puff with your left thumb as you pull through all the loops so the cluster cannot stretch. Consistent loop height is the single biggest difference between neat icing and a bumpy mess",
          "round_start": null,
          "round_end": null,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": null,
          "meaning": null
        },
        {
          "order": 6,
          "row_type": "mistake",
          "code": "mistake-6",
          "label": "Cutting the yarn short at the many join-and-fasten-off points and letting tails work loose",
          "value": "There are around six separate join, work, and fasten off moments in this square, which means twelve tails. Leave at least 6 inches every time and weave each tail horizontally into a same-color area on the back so it never shows through the puffs. Tails buried inside the frosting will push the puffs out of shape, so route them behind the wrapper instead",
          "raw_text": "There are around six separate join, work, and fasten off moments in this square, which means twelve tails. Leave at least 6 inches every time and weave each tail horizontally into a same-color area on the back so it never shows through the puffs. Tails buried inside the frosting will push the puffs out of shape, so route them behind the wrapper instead",
          "round_start": null,
          "round_end": null,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": null,
          "meaning": null
        }
      ]
    },
    {
      "order": 6,
      "card_type": "materials",
      "code": "materials",
      "title": "Materials",
      "raw_heading": "",
      "quantity": 1,
      "groups": [
        {
          "order": 1,
          "group_code": "group-1",
          "group_name": "",
          "rows": [
            {
              "order": 1,
              "row_type": "item",
              "code": "mat-1-1",
              "label": "",
              "value": "Yarn of your choice- 4 colors; the sample is made with DK Sports. The finished granny square is about 3.7 inches by 3.7 inches.",
              "raw_text": "Yarn of your choice- 4 colors; the sample is made with DK Sports. The finished granny square is about 3.7 inches by 3.7 inches."
            },
            {
              "order": 2,
              "row_type": "item",
              "code": "mat-1-2",
              "label": "",
              "value": "Crochet hook- we are using a 3.00mm hook",
              "raw_text": "Crochet hook- we are using a 3.00mm hook"
            },
            {
              "order": 3,
              "row_type": "item",
              "code": "mat-1-3",
              "label": "",
              "value": "Darning Needle",
              "raw_text": "Darning Needle"
            },
            {
              "order": 4,
              "row_type": "item",
              "code": "mat-1-4",
              "label": "",
              "value": "Scissors",
              "raw_text": "Scissors"
            }
          ]
        }
      ],
      "rows": []
    },
    {
      "order": 7,
      "card_type": "abbreviations",
      "code": "abbreviations",
      "title": "Abbreviations",
      "raw_heading": "",
      "quantity": 1,
      "groups": [],
      "rows": [
        {
          "order": 1,
          "row_type": "abbrev",
          "code": "abbrev-ch",
          "label": "ch",
          "value": "chain stitch",
          "raw_text": "ch = chain stitch",
          "round_start": null,
          "round_end": null,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": "ch",
          "meaning": "chain stitch"
        },
        {
          "order": 2,
          "row_type": "abbrev",
          "code": "abbrev-sc",
          "label": "sc",
          "value": "single crochet",
          "raw_text": "sc = single crochet",
          "round_start": null,
          "round_end": null,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": "sc",
          "meaning": "single crochet"
        },
        {
          "order": 3,
          "row_type": "abbrev",
          "code": "abbrev-hdc",
          "label": "hdc",
          "value": "half double crochet",
          "raw_text": "hdc = half double crochet",
          "round_start": null,
          "round_end": null,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": "hdc",
          "meaning": "half double crochet"
        },
        {
          "order": 4,
          "row_type": "abbrev",
          "code": "abbrev-dc",
          "label": "dc",
          "value": "double crochet",
          "raw_text": "dc = double crochet",
          "round_start": null,
          "round_end": null,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": "dc",
          "meaning": "double crochet"
        },
        {
          "order": 5,
          "row_type": "abbrev",
          "code": "abbrev-inc",
          "label": "inc",
          "value": "increase",
          "raw_text": "inc = increase",
          "round_start": null,
          "round_end": null,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": "inc",
          "meaning": "increase"
        },
        {
          "order": 6,
          "row_type": "abbrev",
          "code": "abbrev-rep",
          "label": "rep",
          "value": "repeat",
          "raw_text": "rep = repeat",
          "round_start": null,
          "round_end": null,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": "rep",
          "meaning": "repeat"
        },
        {
          "order": 7,
          "row_type": "abbrev",
          "code": "abbrev-st",
          "label": "st",
          "value": "stitch",
          "raw_text": "st = stitch",
          "round_start": null,
          "round_end": null,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": "st",
          "meaning": "stitch"
        },
        {
          "order": 8,
          "row_type": "abbrev",
          "code": "abbrev-sk",
          "label": "sk",
          "value": "skip",
          "raw_text": "sk = skip",
          "round_start": null,
          "round_end": null,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": "sk",
          "meaning": "skip"
        },
        {
          "order": 9,
          "row_type": "abbrev",
          "code": "abbrev-slst-/-sl-st",
          "label": "slst / sl st",
          "value": "slip stitch for joining different rounds",
          "raw_text": "slst / sl st = slip stitch for joining different rounds",
          "round_start": null,
          "round_end": null,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": "slst / sl st",
          "meaning": "slip stitch for joining different rounds"
        },
        {
          "order": 10,
          "row_type": "abbrev",
          "code": "abbrev-yo",
          "label": "yo",
          "value": "yarn over",
          "raw_text": "yo = yarn over",
          "round_start": null,
          "round_end": null,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": "yo",
          "meaning": "yarn over"
        },
        {
          "order": 11,
          "row_type": "abbrev",
          "code": "abbrev-tl",
          "label": "TL",
          "value": "third loop",
          "raw_text": "TL = third loop",
          "round_start": null,
          "round_end": null,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": "TL",
          "meaning": "third loop"
        },
        {
          "order": 12,
          "row_type": "abbrev",
          "code": "abbrev-incom",
          "label": "incom",
          "value": "incomplete",
          "raw_text": "incom = incomplete",
          "round_start": null,
          "round_end": null,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": "incom",
          "meaning": "incomplete"
        },
        {
          "order": 13,
          "row_type": "abbrev",
          "code": "abbrev-bo",
          "label": "bo",
          "value": "bobble stitch",
          "raw_text": "bo = bobble stitch",
          "round_start": null,
          "round_end": null,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": "bo",
          "meaning": "bobble stitch"
        },
        {
          "order": 14,
          "row_type": "abbrev",
          "code": "abbrev-puff",
          "label": "puff",
          "value": "puff stitch",
          "raw_text": "puff = puff stitch",
          "round_start": null,
          "round_end": null,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": "puff",
          "meaning": "puff stitch"
        },
        {
          "order": 15,
          "row_type": "abbrev",
          "code": "abbrev-blo",
          "label": "BLO",
          "value": "back loop only",
          "raw_text": "BLO = back loop only",
          "round_start": null,
          "round_end": null,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": "BLO",
          "meaning": "back loop only"
        },
        {
          "order": 16,
          "row_type": "abbrev",
          "code": "abbrev-fl",
          "label": "FL",
          "value": "front loop",
          "raw_text": "FL = front loop",
          "round_start": null,
          "round_end": null,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": "FL",
          "meaning": "front loop"
        },
        {
          "order": 17,
          "row_type": "abbrev",
          "code": "abbrev-bpdc",
          "label": "BPdc",
          "value": "back post double crochet",
          "raw_text": "BPdc = back post double crochet",
          "round_start": null,
          "round_end": null,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": "BPdc",
          "meaning": "back post double crochet"
        },
        {
          "order": 18,
          "row_type": "abbrev",
          "code": "abbrev-fpdc",
          "label": "FPdc",
          "value": "front post double crochet",
          "raw_text": "FPdc = front post double crochet",
          "round_start": null,
          "round_end": null,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": "FPdc",
          "meaning": "front post double crochet"
        },
        {
          "order": 19,
          "row_type": "abbrev",
          "code": "abbrev-hdc3tog",
          "label": "hdc3tog",
          "value": "half double crochet 3 stitches together",
          "raw_text": "hdc3tog = half double crochet 3 stitches together",
          "round_start": null,
          "round_end": null,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": "hdc3tog",
          "meaning": "half double crochet 3 stitches together"
        }
      ]
    },
    {
      "order": 8,
      "card_type": "part",
      "code": "main-pattern",
      "title": "Main Pattern",
      "raw_heading": "",
      "quantity": 1,
      "groups": [],
      "rows": [
        {
          "order": 1,
          "row_type": "round",
          "code": "main-pattern-round-1",
          "label": "Round 1",
          "value": "foundation chain Knot on the hook, ch11.",
          "raw_text": "Row 1- foundation chain Knot on the hook, ch11.",
          "round_start": 1,
          "round_end": 1,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": null,
          "meaning": null
        },
        {
          "order": 2,
          "row_type": "info",
          "code": "main-pattern-info-1",
          "label": "Info",
          "value": "Row 2- start to crochet the cup part Return, sk3.  TL  of the 8ch: 8dc.",
          "raw_text": "Row 2- start to crochet the cup part Return, sk3.  TL  of the 8ch: 8dc.",
          "round_start": null,
          "round_end": null,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": null,
          "meaning": null
        },
        {
          "order": 3,
          "row_type": "info",
          "code": "main-pattern-info-2",
          "label": "Info",
          "value": "Row 3 Turn over.  ch3+1FPdc, 8FPdc.",
          "raw_text": "Row 3 Turn over.  ch3+1FPdc, 8FPdc.",
          "round_start": null,
          "round_end": null,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": null,
          "meaning": null
        },
        {
          "order": 4,
          "row_type": "info",
          "code": "main-pattern-info-3",
          "label": "Info",
          "value": "Row 4 Turn over.  ch3+1BPdc, 9BPdc.",
          "raw_text": "Row 4 Turn over.  ch3+1BPdc, 9BPdc.",
          "round_start": null,
          "round_end": null,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": null,
          "meaning": null
        },
        {
          "order": 5,
          "row_type": "round",
          "code": "main-pattern-round-5",
          "label": "Round 5",
          "value": "Turn Over . ch1+1sc, 8sc, sk1, 1sc, slst, fasten off.",
          "raw_text": "Row 5 Turn Over . ch1+1sc, 8sc, sk1, 1sc, slst, fasten off.",
          "round_start": 5,
          "round_end": 5,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": null,
          "meaning": null
        },
        {
          "order": 6,
          "row_type": "round",
          "code": "main-pattern-round-6",
          "label": "Round 6",
          "value": "crochet the cake part BLO . Join new yarn to the right st.  ch2 (count as incom dc) +incom dc  to form an incom 2-dc-bo.  incom 2-dc-bo  in next st, yo and pull through all loops on the hook to complete (2-dc-bo)dec.  (2-dc-bo)dec ,  (4-dc-bo)×2 ,  (2-dc-bo)dec . ( 2 incom dc) , 1  incom dc , yo and pull through all loops to finish (2dc-dc)dec. ch2, slst  in the end st, fasten off.",
          "raw_text": "Row 6- crochet the cake part BLO . Join new yarn to the right st.  ch2 (count as incom dc) +incom dc  to form an incom 2-dc-bo.  incom 2-dc-bo  in next st, yo and pull through all loops on the hook to complete (2-dc-bo)dec.  (2-dc-bo)dec ,  (4-dc-bo)×2 ,  (2-dc-bo)dec . ( 2 incom dc) , 1  incom dc , yo and pull through all loops to finish (2dc-dc)dec. ch2, slst  in the end st, fasten off.",
          "round_start": 6,
          "round_end": 6,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": null,
          "meaning": null
        },
        {
          "order": 7,
          "row_type": "round",
          "code": "main-pattern-round-7",
          "label": "Round 7",
          "value": "Join new yarn to the right st,  ch1 (count as incom hdc)+ 2 incom hdc  to form incom 3-hdc-puff,  incom 3-hdc-puff  in next st, yo and pull through all loops to complete (3-hdc-puff)dec. ( 4-hdc-puff)×2 ,  incom 3-hdc-puff, incom 2-hdc-puff , yo and pull through all loops to complete a dec.  ch2, slst , fasten off.",
          "raw_text": "Row 7 Join new yarn to the right st,  ch1 (count as incom hdc)+ 2 incom hdc  to form incom 3-hdc-puff,  incom 3-hdc-puff  in next st, yo and pull through all loops to complete (3-hdc-puff)dec. ( 4-hdc-puff)×2 ,  incom 3-hdc-puff, incom 2-hdc-puff , yo and pull through all loops to complete a dec.  ch2, slst , fasten off.",
          "round_start": 7,
          "round_end": 7,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": null,
          "meaning": null
        },
        {
          "order": 8,
          "row_type": "round",
          "code": "main-pattern-round-8",
          "label": "Round 8",
          "value": "Join the new yarn to the right st,  ch1 (count as incom hdc)+ 2 incom hdc  to form incom 3-hdc-puff,  incom 3-hdc-puff  in next st, yo and pull through all loops to complete (3-hdc-puff)dec.  (3-hdc-puff)dec ,  ch1, slst , fasten off.",
          "raw_text": "Row 8 Join the new yarn to the right st,  ch1 (count as incom hdc)+ 2 incom hdc  to form incom 3-hdc-puff,  incom 3-hdc-puff  in next st, yo and pull through all loops to complete (3-hdc-puff)dec.  (3-hdc-puff)dec ,  ch1, slst , fasten off.",
          "round_start": 8,
          "round_end": 8,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": null,
          "meaning": null
        },
        {
          "order": 9,
          "row_type": "round",
          "code": "main-pattern-round-9",
          "label": "Round 9",
          "value": "Join the new yarn to the right st,  ch1  to start,  hdc3tog  over this st, next st, and next ch-sp. ch1, slst to next st, fasten off.",
          "raw_text": "Row 9 Join the new yarn to the right st,  ch1  to start,  hdc3tog  over this st, next st, and next ch-sp. ch1, slst to next st, fasten off.",
          "round_start": 9,
          "round_end": 9,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": null,
          "meaning": null
        },
        {
          "order": 10,
          "row_type": "round",
          "code": "main-pattern-round-10",
          "label": "Round 10",
          "value": "overflowing frosting Work into the  FL  of Row 5's stitches. Join new yarn to the right st, ch1+1hdc+1dc, 1dc+1hdc+ch1. slst+ch2+1dc, 1dc+ch2+slst. slst+ch2+1dc, 1dc+1hdc+ch1+slst. slst+ch2+1dc, 1dc+ch1+slst. slst+ch1+1hdc+1dc, 1dc+1hdc+ch1+slst. Fasten off.",
          "raw_text": "Row 10- overflowing frosting Work into the  FL  of Row 5's stitches. Join new yarn to the right st, ch1+1hdc+1dc, 1dc+1hdc+ch1. slst+ch2+1dc, 1dc+ch2+slst. slst+ch2+1dc, 1dc+1hdc+ch1+slst. slst+ch2+1dc, 1dc+ch1+slst. slst+ch1+1hdc+1dc, 1dc+1hdc+ch1+slst. Fasten off.",
          "round_start": 10,
          "round_end": 10,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": null,
          "meaning": null
        },
        {
          "order": 11,
          "row_type": "info",
          "code": "main-pattern-info-4",
          "label": "Info",
          "value": "Fold the 5 clusters downward with the wrong side facing out, and secure them in place using a long yarn tail.",
          "raw_text": "Fold the 5 clusters downward with the wrong side facing out, and secure them in place using a long yarn tail.",
          "round_start": null,
          "round_end": null,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": null,
          "meaning": null
        },
        {
          "order": 12,
          "row_type": "info",
          "code": "main-pattern-info-5",
          "label": "Info",
          "value": "Frosting Topping",
          "raw_text": "Frosting Topping",
          "round_start": null,
          "round_end": null,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": null,
          "meaning": null
        },
        {
          "order": 13,
          "row_type": "info",
          "code": "main-pattern-info-6",
          "label": "Info",
          "value": "Magic ring, ch2(count as hdc), 7hdc, slst to the top of the first ch2. ch1, 8sc, slst to the first sc, fasten off.",
          "raw_text": "Magic ring, ch2(count as hdc), 7hdc, slst to the top of the first ch2. ch1, 8sc, slst to the first sc, fasten off.",
          "round_start": null,
          "round_end": null,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": null,
          "meaning": null
        },
        {
          "order": 14,
          "row_type": "info",
          "code": "main-pattern-info-7",
          "label": "Info",
          "value": "Background",
          "raw_text": "Background",
          "round_start": null,
          "round_end": null,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": null,
          "meaning": null
        }
      ]
    },
    {
      "order": 9,
      "card_type": "part",
      "code": "part-2",
      "title": "Part 2",
      "raw_heading": "",
      "quantity": 1,
      "groups": [],
      "rows": [
        {
          "order": 1,
          "row_type": "info",
          "code": "part-2-info-1",
          "label": "Info",
          "value": "Round 1: Start with a magic loop. ch3 as a standing st(count as 1dc). 3dc, ch3. *(4dc, ch3) * rep 3 times omitting final ch3, ch1, 1hdc connects back to your starting ch3.",
          "raw_text": "Round 1: Start with a magic loop. ch3 as a standing st(count as 1dc). 3dc, ch3. *(4dc, ch3) * rep 3 times omitting final ch3, ch1, 1hdc connects back to your starting ch3.",
          "round_start": null,
          "round_end": null,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": null,
          "meaning": null
        },
        {
          "order": 2,
          "row_type": "round",
          "code": "part-2-round-2-3",
          "label": "Round 2-3",
          "value": "ch3(counts as dc), 1dc in this corner. (2dc+ch3+2dc) in remaining corners. 1dc in remaining sts. 2dc in the start corner. ch1, 1hdc connect back to the first ch3.",
          "raw_text": "Round 2-3: ch3(counts as dc), 1dc in this corner. (2dc+ch3+2dc) in remaining corners. 1dc in remaining sts. 2dc in the start corner. ch1, 1hdc connect back to the first ch3.",
          "round_start": 2,
          "round_end": 3,
          "is_range": true,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": null,
          "meaning": null
        },
        {
          "order": 3,
          "row_type": "round",
          "code": "part-2-round-4",
          "label": "Round 4",
          "value": "ch3 as a standing st(count as 1dc), 1dc in this corner sp. (2dc+ch3+2dc) in remaining corners. 1dc in remaining sts. 2dc in the starting corner, ch3, sl st to the true dc after first ch3, fasten off.",
          "raw_text": "Round 4: ch3 as a standing st(count as 1dc), 1dc in this corner sp. (2dc+ch3+2dc) in remaining corners. 1dc in remaining sts. 2dc in the starting corner, ch3, sl st to the true dc after first ch3, fasten off.",
          "round_start": 4,
          "round_end": 4,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": null,
          "meaning": null
        },
        {
          "order": 4,
          "row_type": "info",
          "code": "part-2-info-2",
          "label": "Info",
          "value": "Assemble Position the cupcake appliqué at the center of the square and stitch it along the shape to secure.",
          "raw_text": "Assemble Position the cupcake appliqué at the center of the square and stitch it along the shape to secure.",
          "round_start": null,
          "round_end": null,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": null,
          "meaning": null
        },
        {
          "order": 5,
          "row_type": "info",
          "code": "part-2-info-3",
          "label": "Info",
          "value": "Then place the frosting ball on top with the puffy part facing forward. Sew the bottom opening of the frosting ball to the top edge of the cupcake using matching thread.",
          "raw_text": "Then place the frosting ball on top with the puffy part facing forward. Sew the bottom opening of the frosting ball to the top edge of the cupcake using matching thread.",
          "round_start": null,
          "round_end": null,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": null,
          "meaning": null
        }
      ]
    },
    {
      "order": 10,
      "card_type": "important_notes",
      "code": "important-notes",
      "title": "Important Notes",
      "raw_heading": "",
      "quantity": 1,
      "groups": [],
      "rows": [
        {
          "order": 1,
          "row_type": "info",
          "code": "note-1",
          "label": "Note",
          "value": "💡 The 3.00 mm hook is deliberately small for DK yarn, usually a full size or two below the ball band. That tight gauge is what keeps the puffs domed and stops the square curling, so resist the urge to size up for comfort",
          "raw_text": "💡 The 3.00 mm hook is deliberately small for DK yarn, usually a full size or two below the ball band. That tight gauge is what keeps the puffs domed and stops the square curling, so resist the urge to size up for comfort",
          "round_start": null,
          "round_end": null,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": null,
          "meaning": null
        },
        {
          "order": 2,
          "row_type": "info",
          "code": "note-2",
          "label": "Note",
          "value": "💡 Check your square against 3.7 by 3.7 inches after the shell layer. If yours comes out larger, drop to a 2.75 mm hook; if smaller, try 3.25 mm. This matters most if you are making multiples, because mismatched squares are almost impossible to seam neatly",
          "raw_text": "💡 Check your square against 3.7 by 3.7 inches after the shell layer. If yours comes out larger, drop to a 2.75 mm hook; if smaller, try 3.25 mm. This matters most if you are making multiples, because mismatched squares are almost impossible to seam neatly",
          "round_start": null,
          "round_end": null,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": null,
          "meaning": null
        },
        {
          "order": 3,
          "row_type": "info",
          "code": "note-3",
          "label": "Note",
          "value": "💡 Place a stitch marker in every front loop of Row 5 before you start the first frosting layer. Those loops get buried under the icing and are genuinely hard to find again once the puffs are sitting on top of them",
          "raw_text": "💡 Place a stitch marker in every front loop of Row 5 before you start the first frosting layer. Those loops get buried under the icing and are genuinely hard to find again once the puffs are sitting on top of them",
          "round_start": null,
          "round_end": null,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": null,
          "meaning": null
        },
        {
          "order": 4,
          "row_type": "info",
          "code": "note-4",
          "label": "Note",
          "value": "💡 Wind small butterfly bobbins for the four colors rather than pulling from full balls. With six join points across the square, loose strands tangle fast, and a bobbin lets you park a color mid-square and come back to it without cutting",
          "raw_text": "💡 Wind small butterfly bobbins for the four colors rather than pulling from full balls. With six join points across the square, loose strands tangle fast, and a bobbin lets you park a color mid-square and come back to it without cutting",
          "round_start": null,
          "round_end": null,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": null,
          "meaning": null
        },
        {
          "order": 5,
          "row_type": "info",
          "code": "note-5",
          "label": "Note",
          "value": "💡 Recount the 8 dc base row before you move on. Every bobble, puff and decrease above it is spaced off that count, so a single extra or missing stitch throws the frosting taper off and the cherry will not land centered",
          "raw_text": "💡 Recount the 8 dc base row before you move on. Every bobble, puff and decrease above it is spaced off that count, so a single extra or missing stitch throws the frosting taper off and the cherry will not land centered",
          "round_start": null,
          "round_end": null,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": null,
          "meaning": null
        },
        {
          "order": 6,
          "row_type": "info",
          "code": "note-6",
          "label": "Note",
          "value": "💡 Block the square face down on a towel with the edges pinned square, and steam only around the perimeter. Never press the frosting flat, since the whole point of the puffs and bobbles is the height they carry above the wrapper",
          "raw_text": "💡 Block the square face down on a towel with the edges pinned square, and steam only around the perimeter. Never press the frosting flat, since the whole point of the puffs and bobbles is the height they carry above the wrapper",
          "round_start": null,
          "round_end": null,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": null,
          "meaning": null
        }
      ]
    },
    {
      "order": 11,
      "card_type": "faq",
      "code": "faq",
      "title": "FAQ",
      "raw_heading": "",
      "quantity": 1,
      "groups": [],
      "rows": [
        {
          "order": 2,
          "row_type": "faq",
          "code": "faq-2",
          "label": "Does the frosting need stuffing to look puffy?",
          "value": "No stuffing at all. The loft comes entirely from the 3-hdc and 4-hdc puffs and the 2-dc and 4-dc bobbles, which trap yarn volume inside each cluster. If your icing looks flat, the cause is loose loops or too large a hook, not a missing filling",
          "raw_text": "No stuffing at all. The loft comes entirely from the 3-hdc and 4-hdc puffs and the 2-dc and 4-dc bobbles, which trap yarn volume inside each cluster. If your icing looks flat, the cause is loose loops or too large a hook, not a missing filling",
          "round_start": null,
          "round_end": null,
          "is_range": false,
          "stitch_count": null,
          "question": "Does the frosting need stuffing to look puffy?",
          "answer": "No stuffing at all. The loft comes entirely from the 3-hdc and 4-hdc puffs and the 2-dc and 4-dc bobbles, which trap yarn volume inside each cluster. If your icing looks flat, the cause is loose loops or too large a hook, not a missing filling",
          "abbr": null,
          "meaning": null
        },
        {
          "order": 3,
          "row_type": "faq",
          "code": "faq-3",
          "label": "What do the abbreviations incom dc and 2-dc-bo actually mean?",
          "value": "An incomplete dc is a double crochet worked up to the point where two loops remain on your hook, then left there. A 2-dc-bo is two of those gathered together with one final yarn over pulled through everything, which forms a bobble. The larger 4-dc-bo and the hdc puffs follow the same logic with more components",
          "raw_text": "An incomplete dc is a double crochet worked up to the point where two loops remain on your hook, then left there. A 2-dc-bo is two of those gathered together with one final yarn over pulled through everything, which forms a bobble. The larger 4-dc-bo and the hdc puffs follow the same logic with more components",
          "round_start": null,
          "round_end": null,
          "is_range": false,
          "stitch_count": null,
          "question": "What do the abbreviations incom dc and 2-dc-bo actually mean?",
          "answer": "An incomplete dc is a double crochet worked up to the point where two loops remain on your hook, then left there. A 2-dc-bo is two of those gathered together with one final yarn over pulled through everything, which forms a bobble. The larger 4-dc-bo and the hdc puffs follow the same logic with more components",
          "abbr": null,
          "meaning": null
        },
        {
          "order": 4,
          "row_type": "faq",
          "code": "faq-4",
          "label": "Why does the pattern fasten off so many times instead of continuing?",
          "value": "Each frosting layer is a separate horizontal band that starts fresh at the right-hand stitch, so the yarn genuinely has nowhere to travel to. Fastening off keeps the back clean and lets you change color between layers without carrying strands across. Leave generous tails each time and weave them in as you go rather than saving them all for the end",
          "raw_text": "Each frosting layer is a separate horizontal band that starts fresh at the right-hand stitch, so the yarn genuinely has nowhere to travel to. Fastening off keeps the back clean and lets you change color between layers without carrying strands across. Leave generous tails each time and weave them in as you go rather than saving them all for the end",
          "round_start": null,
          "round_end": null,
          "is_range": false,
          "stitch_count": null,
          "question": "Why does the pattern fasten off so many times instead of continuing?",
          "answer": "Each frosting layer is a separate horizontal band that starts fresh at the right-hand stitch, so the yarn genuinely has nowhere to travel to. Fastening off keeps the back clean and lets you change color between layers without carrying strands across. Leave generous tails each time and weave them in as you go rather than saving them all for the end",
          "abbr": null,
          "meaning": null
        },
        {
          "order": 5,
          "row_type": "faq",
          "code": "faq-5",
          "label": "Can I join these squares into a blanket, and how many do I need?",
          "value": "Yes, and they seam well because the back stays flat despite all the front texture. At 3.7 inches each, a 30 by 40 inch baby blanket needs about 8 across by 11 down, or 88 squares, plus a border round to even out the edges. Whipstitch through the back loops from the wrong side so the join disappears behind the wrapper",
          "raw_text": "Yes, and they seam well because the back stays flat despite all the front texture. At 3.7 inches each, a 30 by 40 inch baby blanket needs about 8 across by 11 down, or 88 squares, plus a border round to even out the edges. Whipstitch through the back loops from the wrong side so the join disappears behind the wrapper",
          "round_start": null,
          "round_end": null,
          "is_range": false,
          "stitch_count": null,
          "question": "Can I join these squares into a blanket, and how many do I need?",
          "answer": "Yes, and they seam well because the back stays flat despite all the front texture. At 3.7 inches each, a 30 by 40 inch baby blanket needs about 8 across by 11 down, or 88 squares, plus a border round to even out the edges. Whipstitch through the back loops from the wrong side so the join disappears behind the wrapper",
          "abbr": null,
          "meaning": null
        }
      ]
    }
  ],
  "conflicts": [],
  "validation_warnings": [],
  "images": [
    "data/images/cupcake-granny-square-crochet-pattern-hero.webp",
    "data/images/cupcake-granny-square-crochet-pattern-step-2.webp",
    "data/images/cupcake-granny-square-crochet-pattern-step-3.webp",
    "data/images/cupcake-granny-square-crochet-pattern-step-4.webp"
  ],
  "source_url": null,
  "thumbnail_images": [
    {
      "url": "data/images/cupcake-granny-square-crochet-pattern-hero.webp",
      "alt": "Cupcake Granny Square Free Crochet Pattern — photo 1",
      "is_featured": true
    }
  ],
  "gallery_images": [
    {
      "url": "data/images/cupcake-granny-square-crochet-pattern-hero.webp",
      "alt": "Cupcake Granny Square Free Crochet Pattern — photo 1",
      "is_featured": true
    },
    {
      "url": "data/images/cupcake-granny-square-crochet-pattern-step-2.webp",
      "alt": "Cupcake Granny Square Free Crochet Pattern — photo 2",
      "is_featured": false
    },
    {
      "url": "data/images/cupcake-granny-square-crochet-pattern-step-3.webp",
      "alt": "Cupcake Granny Square Free Crochet Pattern — photo 3",
      "is_featured": false
    },
    {
      "url": "data/images/cupcake-granny-square-crochet-pattern-step-4.webp",
      "alt": "Cupcake Granny Square Free Crochet Pattern — photo 4",
      "is_featured": false
    }
  ],
  "_sanitized_holiday_count": 1
}