pub.leaflet.document

leaflet.pub

Samples

1277 randomly sampled records from the AT Protocol firehose

pub.leaflet.document (100 samples)
{
  "$type": "pub.leaflet.document",
  "author": "did:plc:5qpp5odgl345akjumlmbq6u3",
  "description": "Ordering a hot drink in a British café should be simple, yet visitors are often caught out. \"Tea\" arrives with milk unless you say otherwise, a \"regular\" coffee might be a latte, and the question \"do you want it in a pot?\" can leave you wondering what you've agreed to. This guide",
  "pages": [
    {
      "$type": "pub.leaflet.pages.linearDocument",
      "blocks": [
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "Ordering a hot drink in a British café should be simple, yet visitors are often caught out. \"Tea\" arrives with milk unless you say otherwise, a \"regular\" coffee might be a latte, and the question \"do you want it in a pot?\" can leave you wondering what you've agreed to. This guide covers the basics of hot drinks in everyday British cafés, from supermarket cafés to high-street chains, so you can order with confidence."
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.header",
            "level": 2,
            "plaintext": "Tea: the default drink"
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "When someone in Britain says \"a cup of tea\", they almost always mean black tea, usually a strong blend like English Breakfast, served with milk. In a café you'll typically be asked:"
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.unorderedList",
            "children": [
              {
                "$type": "pub.leaflet.blocks.unorderedList#listItem",
                "content": {
                  "$type": "pub.leaflet.blocks.text",
                  "facets": [
                    {
                      "$type": "pub.leaflet.richtext.facet",
                      "features": [
                        {
                          "$type": "pub.leaflet.richtext.facet#bold"
                        }
                      ],
                      "index": {
                        "byteEnd": 7,
                        "byteStart": 0
                      }
                    }
                  ],
                  "plaintext": "\"Milk?\" Most people say yes. Cold milk is added to the tea, not hot or frothed."
                }
              },
              {
                "$type": "pub.leaflet.blocks.unorderedList#listItem",
                "content": {
                  "$type": "pub.leaflet.blocks.text",
                  "facets": [
                    {
                      "$type": "pub.leaflet.richtext.facet",
                      "features": [
                        {
                          "$type": "pub.leaflet.richtext.facet#bold"
                        }
                      ],
                      "index": {
                        "byteEnd": 8,
                        "byteStart": 0
                      }
                    }
                  ],
                  "plaintext": "\"Sugar?\" Sugar is often on the table in sachets rather than added for you."
                }
              },
              {
                "$type": "pub.leaflet.blocks.unorderedList#listItem",
                "content": {
                  "$type": "pub.leaflet.blocks.text",
                  "facets": [
                    {
                      "$type": "pub.leaflet.richtext.facet",
                      "features": [
                        {
                          "$type": "pub.leaflet.richtext.facet#bold"
                        }
                      ],
                      "index": {
                        "byteEnd": 13,
                        "byteStart": 0
                      }
                    }
                  ],
                  "plaintext": "\"Cup or pot?\" A pot of tea is a small teapot with a tea bag or loose tea, a cup, and a jug of milk. It's usually enough for two cups, which makes it good value if you want to linger."
                }
              }
            ]
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "If you want tea without milk, ask for it \"black\" or \"no milk\". Herbal and fruit teas, which many Britons call \"herbal teas\" or \"infusions\", are widely available: peppermint, camomile and fruit blends are the most common. Green tea is on most menus too. If you like your tea weak, ask for the bag to be taken out quickly, or ask for a pot so you control the strength yourself."
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.header",
            "level": 2,
            "plaintext": "Coffee: what the names mean"
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "British cafés use the same Italian-style names as coffee shops worldwide, though sizes and strength vary:"
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.unorderedList",
            "children": [
              {
                "$type": "pub.leaflet.blocks.unorderedList#listItem",
                "content": {
                  "$type": "pub.leaflet.blocks.text",
                  "facets": [
                    {
                      "$type": "pub.leaflet.richtext.facet",
                      "features": [
                        {
                          "$type": "pub.leaflet.richtext.facet#bold"
                        }
                      ],
                      "index": {
                        "byteEnd": 10,
                        "byteStart": 0
                      }
                    }
                  ],
                  "plaintext": "Americano: espresso topped up with hot water; add milk if you like. Closest to filter coffee."
                }
              },
              {
                "$type": "pub.leaflet.blocks.unorderedList#listItem",
                "content": {
                  "$type": "pub.leaflet.blocks.text",
                  "facets": [
                    {
                      "$type": "pub.leaflet.richtext.facet",
                      "features": [
                        {
                          "$type": "pub.leaflet.richtext.facet#bold"
                        }
                      ],
                      "index": {
                        "byteEnd": 6,
                        "byteStart": 0
                      }
                    }
                  ],
                  "plaintext": "Latte: espresso with a lot of steamed milk and a thin layer of foam."
                }
              },
              {
                "$type": "pub.leaflet.blocks.unorderedList#listItem",
                "content": {
                  "$type": "pub.leaflet.blocks.text",
                  "facets": [
                    {
                      "$type": "pub.leaflet.richtext.facet",
                      "features": [
                        {
                          "$type": "pub.leaflet.richtext.facet#bold"
                        }
                      ],
                      "index": {
                        "byteEnd": 11,
                        "byteStart": 0
                      }
                    }
                  ],
                  "plaintext": "Cappuccino: espresso with steamed milk and a thicker layer of foam, often dusted with chocolate."
                }
              },
              {
                "$type": "pub.leaflet.blocks.unorderedList#listItem",
                "content": {
                  "$type": "pub.leaflet.blocks.text",
                  "facets": [
                    {
                      "$type": "pub.leaflet.richtext.facet",
                      "features": [
                        {
                          "$type": "pub.leaflet.richtext.facet#bold"
                        }
                      ],
                      "index": {
                        "byteEnd": 11,
                        "byteStart": 0
                      }
                    }
                  ],
                  "plaintext": "Flat white: a smaller, stronger milky coffee with a thin, velvety layer of milk."
                }
              },
              {
                "$type": "pub.leaflet.blocks.unorderedList#listItem",
                "content": {
                  "$type": "pub.leaflet.blocks.text",
                  "facets": [
                    {
                      "$type": "pub.leaflet.richtext.facet",
                      "features": [
                        {
                          "$type": "pub.leaflet.richtext.facet#bold"
                        }
                      ],
                      "index": {
                        "byteEnd": 6,
                        "byteStart": 0
                      }
                    }
                  ],
                  "plaintext": "Mocha: a latte with chocolate."
                }
              }
            ]
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "Filter coffee is less common in the UK than in North America, and \"white coffee\" simply means coffee with milk. Instant coffee is still found in some smaller cafés, so if you want espresso-based coffee, it's worth checking the machine on the counter."
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "Plant milks such as oat, soya and almond are widely available, sometimes for a small extra charge."
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.header",
            "level": 2,
            "plaintext": "Hot chocolate and other options"
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "Hot chocolate is standard on nearly every café menu and often comes with optional cream and marshmallows. Some cafés also offer chai lattes, babyccinos (frothed milk for young children) and seasonal specials."
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.header",
            "level": 2,
            "plaintext": "Are refills free?"
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [
              {
                "$type": "pub.leaflet.richtext.facet",
                "features": [
                  {
                    "$type": "pub.leaflet.richtext.facet#bold"
                  }
                ],
                "index": {
                  "byteEnd": 85,
                  "byteStart": 82
                }
              }
            ],
            "plaintext": "This is the question visitors ask most. In the UK, free refills on hot drinks are not a general custom the way they are in some other countries. Some cafés, including some supermarket cafés and loyalty-scheme members at certain chains, have offered refills or free hot drinks with conditions attached, but these offers vary between chains and change over time. The safe approach is to assume a second cup costs extra, and ask at the till if you're unsure. A pot of tea is often the best way to get two cups for the price of one."
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.header",
            "level": 2,
            "plaintext": "Sizes and prices"
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [
              {
                "$type": "pub.leaflet.richtext.facet",
                "features": [
                  {
                    "$type": "pub.leaflet.richtext.facet#link",
                    "uri": "https://www.morrisonscafemenu.com/"
                  }
                ],
                "index": {
                  "byteEnd": 317,
                  "byteStart": 275
                }
              }
            ],
            "plaintext": "Sizes are usually small, regular and large, but \"regular\" at one chain may equal \"medium\" or \"tall\" at another. Supermarket cafés tend to be cheaper than high-street coffee chains, especially for tea. If you'd like an idea of typical café drinks and dishes before a visit, this unofficial Morrisons café menu guide lists common items; it's an independent fan site, not affiliated with Morrisons, so check current prices in store."
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.header",
            "level": 2,
            "plaintext": "A few etiquette tips"
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.unorderedList",
            "children": [
              {
                "$type": "pub.leaflet.blocks.unorderedList#listItem",
                "content": {
                  "$type": "pub.leaflet.blocks.text",
                  "facets": [
                    {
                      "$type": "pub.leaflet.richtext.facet",
                      "features": [
                        {
                          "$type": "pub.leaflet.richtext.facet#bold"
                        }
                      ],
                      "index": {
                        "byteEnd": 21,
                        "byteStart": 0
                      }
                    }
                  ],
                  "plaintext": "Order at the counter. In most everyday cafés you order and pay at the till, then take a seat. Table service is more common in restaurants and some independent cafés."
                }
              },
              {
                "$type": "pub.leaflet.blocks.unorderedList#listItem",
                "content": {
                  "$type": "pub.leaflet.blocks.text",
                  "facets": [
                    {
                      "$type": "pub.leaflet.richtext.facet",
                      "features": [
                        {
                          "$type": "pub.leaflet.richtext.facet#bold"
                        }
                      ],
                      "index": {
                        "byteEnd": 6,
                        "byteStart": 0
                      }
                    }
                  ],
                  "plaintext": "Queue. Britons take queuing seriously, even for coffee."
                }
              },
              {
                "$type": "pub.leaflet.blocks.unorderedList#listItem",
                "content": {
                  "$type": "pub.leaflet.blocks.text",
                  "facets": [
                    {
                      "$type": "pub.leaflet.richtext.facet",
                      "features": [
                        {
                          "$type": "pub.leaflet.richtext.facet#bold"
                        }
                      ],
                      "index": {
                        "byteEnd": 19,
                        "byteStart": 0
                      }
                    }
                  ],
                  "plaintext": "Clearing your table is appreciated in self-service cafés; there's usually a tray station."
                }
              },
              {
                "$type": "pub.leaflet.blocks.unorderedList#listItem",
                "content": {
                  "$type": "pub.leaflet.blocks.text",
                  "facets": [
                    {
                      "$type": "pub.leaflet.richtext.facet",
                      "features": [
                        {
                          "$type": "pub.leaflet.richtext.facet#bold"
                        }
                      ],
                      "index": {
                        "byteEnd": 7,
                        "byteStart": 0
                      }
                    }
                  ],
                  "plaintext": "Tipping isn't expected at a counter-service café, though a tip jar may be on the counter."
                }
              }
            ]
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.header",
            "level": 2,
            "plaintext": "Quick phrasebook"
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.unorderedList",
            "children": [
              {
                "$type": "pub.leaflet.blocks.unorderedList#listItem",
                "content": {
                  "$type": "pub.leaflet.blocks.text",
                  "plaintext": "\"A pot of tea for two, please.\""
                }
              },
              {
                "$type": "pub.leaflet.blocks.unorderedList#listItem",
                "content": {
                  "$type": "pub.leaflet.blocks.text",
                  "plaintext": "\"A white coffee\" means coffee with milk."
                }
              },
              {
                "$type": "pub.leaflet.blocks.unorderedList#listItem",
                "content": {
                  "$type": "pub.leaflet.blocks.text",
                  "plaintext": "\"Can I have that with oat milk?\""
                }
              },
              {
                "$type": "pub.leaflet.blocks.unorderedList#listItem",
                "content": {
                  "$type": "pub.leaflet.blocks.text",
                  "plaintext": "\"Is there a charge for a refill?\""
                }
              }
            ]
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "With these basics, you'll get exactly the drink you want, and perhaps discover why a proper pot of tea is a national institution."
          }
        }
      ]
    }
  ],
  "publishedAt": "2026-09-28T04:14:10.000Z",
  "tags": [
    "UK travel",
    "tea",
    "coffee",
    "cafés"
  ],
  "title": "Tea, Coffee and Refills: A Visitor's Guide to Hot Drinks at British Cafés"
}

did:plc:5qpp5odgl345akjumlmbq6u3 | at://did:plc:5qpp5odgl345akjumlmbq6u3/pub.leaflet.document/3mwkha6bu2eho

app.bsky.feed.post (nested within pub.leaflet.document) (100 samples)
{
  "$type": "pub.leaflet.document",
  "author": "did:plc:llumonvbk6mrkn3myaxpnsje",
  "description": "(STOP IT, GET SOME HELP) \"Mother of the Year\" -Her Imagination",
  "pages": [
    {
      "$type": "pub.leaflet.pages.linearDocument",
      "blocks": [
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [
              {
                "features": [
                  {
                    "$type": "pub.leaflet.richtext.facet#bold"
                  }
                ],
                "index": {
                  "byteEnd": 36,
                  "byteStart": 0
                }
              },
              {
                "features": [
                  {
                    "$type": "pub.leaflet.richtext.facet#bold"
                  },
                  {
                    "$type": "pub.leaflet.richtext.facet#italic"
                  }
                ],
                "index": {
                  "byteEnd": 68,
                  "byteStart": 36
                }
              },
              {
                "features": [
                  {
                    "$type": "pub.leaflet.richtext.facet#bold"
                  }
                ],
                "index": {
                  "byteEnd": 69,
                  "byteStart": 68
                }
              }
            ],
            "plaintext": "Hello everyone, and welcome back to Dialogue with Cristobal Martinez!"
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.image",
            "aspectRatio": {
              "height": 200,
              "width": 200
            },
            "image": {
              "$type": "blob",
              "mimeType": "image/png",
              "ref": {
                "$link": "bafkreigdpi66rf7b56e2nhkjni5nuly43l4dcx66etsmub4cb7z2ixjqsu"
              },
              "size": 46928
            }
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": "Let me give you a recap of my mom's delusional celebrity status."
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [
              {
                "features": [
                  {
                    "$type": "pub.leaflet.richtext.facet#italic"
                  }
                ],
                "index": {
                  "byteEnd": 112,
                  "byteStart": 107
                }
              }
            ],
            "plaintext": "You see, when my mom talks to members of her side of the family, she tends to see herself as a panelist on Maury. And Maury Povich doesn't have panelists on his tabloid talk show."
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": "If my mom has her own tabloid talk show, here's the theme song for her imaginary show:"
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.iframe",
            "height": 300,
            "url": "https://www.youtube.com/embed/ZhJe4_gBxHg?rel=0"
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [
              {
                "features": [
                  {
                    "$type": "pub.leaflet.richtext.facet#italic"
                  }
                ],
                "index": {
                  "byteEnd": 46,
                  "byteStart": 25
                }
              }
            ],
            "plaintext": "Her show would be called The House of Tantrums because she clearly lives in her delusion that a tantrum can be applied to any form of anger she sees. My mom is an immature, dumb bitch."
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": "If her main character energy, from appearing in the local news, taught my mom anything, it should've been that having fifteen minutes of fame needs to stay for fifteen minutes. That wasn't what happened, and she became this entitled control freak."
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [
              {
                "features": [
                  {
                    "$type": "pub.leaflet.richtext.facet#italic"
                  }
                ],
                "index": {
                  "byteEnd": 110,
                  "byteStart": 85
                }
              }
            ],
            "plaintext": "When my mom, my siblings, and I went to Target. There, I decided to find content for This Month With Cristobal. Somewhere along the way, my mom nearly made a scene at me over the store alarms going off, even though it's faulty at best. Does she realize I have an imaginary audience that watches me take in her ridiculous tantrum?"
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [
              {
                "features": [
                  {
                    "$type": "pub.leaflet.richtext.facet#bold"
                  }
                ],
                "index": {
                  "byteEnd": 68,
                  "byteStart": 0
                }
              }
            ],
            "plaintext": "\"BuT, cRiStObAl, YoU'rE cOmPlEtElY iN tHe WaY oF tHe ShOpPiNg CaRt!\" BITCH, YOU'RE MAKING A SCENE OVER THE ALARM GOING OFF! And you have the audacity to involve me in your drama."
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": "But no, she's the executive producer of her only TV show that should be seen by God and God alone. She has an imaginary audience that still watches her, right?"
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.image",
            "aspectRatio": {
              "height": 473,
              "width": 842
            },
            "image": {
              "$type": "blob",
              "mimeType": "image/png",
              "ref": {
                "$link": "bafkreiftxy524hl5d6imhgjkttdgokxrfp4qo5qoxux4grko6i33f6wfby"
              },
              "size": 315370
            }
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": "And before I conclude the article, since my mom likes to promote content creators she's watching on her phone to me, thinking that I'll be interested in their content, I'm going to join her and share some content creators I like."
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": "I recommend the YouTuber named Darling Desi. She started out as a BookTuber (maybe?) and then turned into an aesthetic vlog channel. I enjoy her seasonal content, starter packs, and specials. If you haven't checked out Darling Desi's channel, please do and subscribe!"
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.website",
            "description": "Just a creator and filmmaker who enjoys making aesthetic and vintage inspired slow living videos  🕯Email for business inquires: thedesimoore@gmail.com 🍂 Patreon: https://www.patreon.com/darlingdesi 🧺 Instagram: https://www.instagram.com/darling_desi_/ 🧸  My P.o. box is currently closed but I will update you when/if I open it again.",
            "src": "https://youtube.com/@darlingdesi?si=UpDbWh7NFBIC56Kl",
            "title": "Darling Desi"
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.horizontalRule"
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": "If you enjoyed anything about this article and want to support me in any way, please consider leaving me a tip on my Ko-fi page. Your contribution helps support my writing career on Leaflet."
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.button",
            "text": "Tip Me!",
            "url": "https://ko-fi.com/thisiscristobal"
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [
              {
                "features": [
                  {
                    "$type": "pub.leaflet.richtext.facet#italic"
                  }
                ],
                "index": {
                  "byteEnd": 46,
                  "byteStart": 14
                }
              }
            ],
            "plaintext": "That's it for Dialogue with Cristobal Martinez. Thank you so much for reading, and I'll catch you guys in the next one. Later!"
          }
        }
      ],
      "id": "019aad66-0ce9-7663-99a4-73de95f52cf2"
    }
  ],
  "postRef": {
    "cid": "bafyreih7unqurmd5nkdsgfd4ptoo35xvagego7kfm7nzjq4bdjkw5cfgxu",
    "commit": {
      "cid": "bafyreid77z3egyk4oujsug22rwih46c7o5fzgzlpxqu75nydoxciii6fsu",
      "rev": "3m6xba7zljx2r"
    },
    "uri": "at://did:plc:llumonvbk6mrkn3myaxpnsje/app.bsky.feed.post/3m6xba7wwak25",
    "validationStatus": "valid"
  },
  "publication": "at://did:plc:llumonvbk6mrkn3myaxpnsje/pub.leaflet.publication/3m2anfdxjyc2z",
  "publishedAt": "2025-12-01T20:26:40.266Z",
  "title": "My Mom | A Dramatic Mother with Main Character Syndrome and Executive Producer Disorder"
}

did:plc:llumonvbk6mrkn3myaxpnsje | at://did:plc:llumonvbk6mrkn3myaxpnsje/pub.leaflet.document/3m6xb7zh5sk25

app.bsky.richtext.facet (nested within pub.leaflet.document) (1 sample)
{
  "$type": "pub.leaflet.document",
  "author": "did:plc:iq44hcebgqaom6jvtcd3ln73",
  "description": "",
  "pages": [
    {
      "$type": "pub.leaflet.pages.linearDocument",
      "blocks": [
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": "Body"
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [
              {
                "features": [
                  {
                    "$type": "app.bsky.richtext.facet#link",
                    "uri": "https://bsky.network/xrpc/com.atproto.sync.getBlob?did=did:plc:iq44hcebgqaom6jvtcd3ln73&cid=bafkreihxsazqjsm3dqs34e36odw4ngeb57i6nqqyo37g3pkgje2rzsopzm"
                  }
                ],
                "index": {
                  "byteEnd": 29,
                  "byteStart": 0
                }
              }
            ],
            "plaintext": "🖼️ View Image attachment"
          }
        }
      ]
    }
  ],
  "publishedAt": "2026-04-17T12:54:24.692Z",
  "title": "Hello image 2"
}

did:plc:iq44hcebgqaom6jvtcd3ln73 | at://did:plc:iq44hcebgqaom6jvtcd3ln73/pub.leaflet.document/3mjoxth6e2z2e

blog.pckt.richtext.facet (nested within pub.leaflet.document) (1 sample)
{
  "$type": "pub.leaflet.document",
  "author": "did:plc:qtapiembzpxlzsiagnc7eyy3",
  "createdAt": "2026-09-21T00:00:00Z",
  "pages": [
    {
      "$type": "pub.leaflet.pages.linearDocument",
      "blocks": [
        {
          "$type": "pub.leaflet.blocks.header",
          "level": 1,
          "plaintext": "How to Take Back Control of Social Media"
        },
        {
          "$type": "pub.leaflet.blocks.text",
          "plaintext": "This blog post has been a long time coming, so hydrate and get comfy, because we're diving into custom feeds today. Custom feeds give users the power to take back their algorithm and regain control over their social media experience. In this post, you'll learn what feeds are, how to create and use them, and why they're essential to getting the most out of Bluesky."
        },
        {
          "$type": "pub.leaflet.blocks.header",
          "level": 3,
          "plaintext": "⟢ What are custom feeds?"
        },
        {
          "$type": "pub.leaflet.blocks.text",
          "plaintext": "Custom feeds are algorithms curated by community members and presented to users through the AT Protocol. By default, when you join Bluesky, you see Discover and Following, two feeds built by Bluesky. On Instagram, TikTok, and other legacy platforms, your options end there. The algorithm decides what you see. Bluesky differs fundamentally: you're not locked in, you can subscribe to community built feeds or build your own. Instead of letting bros and CEOs decide what content you see, you get to choose."
        },
        {
          "$type": "pub.leaflet.blocks.header",
          "level": 3,
          "plaintext": "⟢ How are custom feeds made?"
        },
        {
          "$type": "pub.leaflet.blocks.text",
          "facets": [
            {
              "features": [
                {
                  "$type": "blog.pckt.richtext.facet#link",
                  "uri": "https://docs.bsky.app/docs/starter-templates/custom-feeds"
                }
              ],
              "index": {
                "byteEnd": 194,
                "byteStart": 165
              }
            },
            {
              "features": [
                {
                  "$type": "blog.pckt.richtext.facet#link",
                  "uri": "https://graze.social"
                }
              ],
              "index": {
                "byteEnd": 266,
                "byteStart": 261
              }
            },
            {
              "features": [
                {
                  "$type": "blog.pckt.richtext.facet#link",
                  "uri": "https://skyfeed.app"
                }
              ],
              "index": {
                "byteEnd": 275,
                "byteStart": 268
              }
            },
            {
              "features": [
                {
                  "$type": "blog.pckt.richtext.facet#link",
                  "uri": "https://blueskyfeedcreator.com"
                }
              ],
              "index": {
                "byteEnd": 297,
                "byteStart": 277
              }
            },
            {
              "features": [
                {
                  "$type": "blog.pckt.richtext.facet#link",
                  "uri": "http://attie.ai/feeds"
                }
              ],
              "index": {
                "byteEnd": 304,
                "byteStart": 299
              }
            }
          ],
          "plaintext": "Custom feeds can be created using a few different methods.  Self-hosting is the most involved method but also offers the most control and flexibility (see Bluesky's Custom Feeds Starter Template for instructions). Alternatively, feed generator services such as Graze, Skyfeed, Bluesky Feed Creator, Attie, make the process beginner-friendly."
        },
        {
          "$type": "pub.leaflet.blocks.header",
          "level": 3,
          "plaintext": "⟢ How to appear in custom feeds?"
        },
        {
          "$type": "pub.leaflet.blocks.text",
          "facets": [
            {
              "features": [
                {
                  "$type": "blog.pckt.richtext.facet#link",
                  "uri": "https://bsky.app/profile/did:plc:65isvpdvlh7ttv5tyk5jir4t/feed/aaajr6s7yxz4g"
                }
              ],
              "index": {
                "byteEnd": 133,
                "byteStart": 119
              }
            }
          ],
          "plaintext": "Custom feed creators typically specify in the description or pinned post what qualifies an account or post for a feed. Funky Foragers, for example, uses hashtags like #FantasticFungi, #foraging, and #herbalism. Other feeds might require users to be on a user list, followed by a specific account, or include keywords in a post or alt text."
        },
        {
          "$type": "pub.leaflet.blocks.header",
          "level": 3,
          "plaintext": "⟢ Why are custom feeds significant?"
        },
        {
          "$type": "pub.leaflet.blocks.text",
          "plaintext": "Custom feeds are an integral part of the Bluesky experience that let users decide what they want to see. Other popular social media apps often employ confusing and sometimes (intentionally) polarizing algorithms, which keep their users tucked away in echo chambers or thrown out into constant discourse, negativity, and intolerance. "
        },
        {
          "$type": "pub.leaflet.blocks.text",
          "plaintext": "Some may enjoy feeds like \"Quiet Posters\", \"Following\", and \"Mutuals\" to keep up with close friends and connections, creating genuinely social experiences without the algorithm."
        },
        {
          "$type": "pub.leaflet.blocks.text",
          "facets": [
            {
              "features": [
                {
                  "$type": "blog.pckt.richtext.facet#link",
                  "uri": "https://bsky.app/profile/did:plc:geoqe3qls5mwezckxxsewys2/feed/aaabrbjcg4hmk"
                }
              ],
              "index": {
                "byteEnd": 219,
                "byteStart": 212
              }
            },
            {
              "features": [
                {
                  "$type": "blog.pckt.richtext.facet#link",
                  "uri": "https://bsky.app/profile/did:plc:65isvpdvlh7ttv5tyk5jir4t/feed/aaagtnmy4lyic"
                }
              ],
              "index": {
                "byteEnd": 264,
                "byteStart": 258
              }
            }
          ],
          "plaintext": "Alternatively, custom feeds are great for building and maintaining communities on Bluesky, whether for popular topics or niche special interests. For those with an affinity for burying their nose in a good book? Booksky awaits. Got the gift of gab? Join the Yapsky community. "
        },
        {
          "$type": "pub.leaflet.blocks.text",
          "plaintext": "For content creators, feeds offer real growth potential. Use feeds to find your niche, connect with creators in your industry, and contribute meaningful content to the feeds you enjoy. "
        },
        {
          "$type": "pub.leaflet.blocks.text",
          "facets": [
            {
              "features": [
                {
                  "$type": "blog.pckt.richtext.facet#link",
                  "uri": "https://bsky.app/profile/did:plc:odqmsar3ikz5ubokya4sempk/feed/aaabfn4o34jdi"
                }
              ],
              "index": {
                "byteEnd": 161,
                "byteStart": 146
              }
            },
            {
              "features": [
                {
                  "$type": "blog.pckt.richtext.facet#link",
                  "uri": "https://bsky.app/profile/did:plc:qtapiembzpxlzsiagnc7eyy3/feed/babesky-algo"
                }
              ],
              "index": {
                "byteEnd": 233,
                "byteStart": 215
              }
            },
            {
              "features": [
                {
                  "$type": "blog.pckt.richtext.facet#link",
                  "uri": "https://bsky.app/feeds"
                }
              ],
              "index": {
                "byteEnd": 288,
                "byteStart": 283
              }
            },
            {
              "features": [
                {
                  "$type": "blog.pckt.richtext.facet#link",
                  "uri": "https://blueskydirectory.com/feeds"
                }
              ],
              "index": {
                "byteEnd": 312,
                "byteStart": 295
              }
            },
            {
              "features": [
                {
                  "$type": "blog.pckt.richtext.facet#link",
                  "uri": "https://goodfeeds.co/"
                }
              ],
              "index": {
                "byteEnd": 323,
                "byteStart": 314
              }
            }
          ],
          "plaintext": "For everyone else, feeds help you find your community! Like and pin feeds on topics you enjoy. If you enjoy looking at pretty art, you can peruse Art: What's Hot. If you enjoy looking at pretty (scandalous) people, Discover Real NSFW is at your service. Find new feeds via Bluesky's Feeds page, Bluesky Directory, Goodfeeds, or in your favorite creator's profile. "
        },
        {
          "$type": "pub.leaflet.blocks.text",
          "plaintext": ""
        },
        {
          "$type": "pub.leaflet.blocks.text",
          "facets": [
            {
              "features": [
                {
                  "$type": "blog.pckt.richtext.facet#link",
                  "uri": "https://bsky.app/profile/seductivelysoul.art"
                }
              ],
              "index": {
                "byteEnd": 12,
                "byteStart": 0
              }
            }
          ],
          "plaintext": "~ xoxo, soul"
        }
      ]
    }
  ],
  "publication": "at://did:plc:qtapiembzpxlzsiagnc7eyy3/pub.leaflet.publication/3m6apyszppk23",
  "title": "Reclaim Your Algorithm"
}

did:plc:qtapiembzpxlzsiagnc7eyy3 | at://did:plc:qtapiembzpxlzsiagnc7eyy3/pub.leaflet.document/3mihqfqs6no43

com.atproto.label.defs (nested within pub.leaflet.document) (1 sample)
{
  "$type": "pub.leaflet.document",
  "author": "did:plc:2atpw7zrdrdptzqo7jw63rzv",
  "description": "Kagami visits Konata while she is in the midst of withdrawing into yet another video game. What could’ve been harmless escapism has turned into something else, and it falls upon Kagami to pull her out of it.",
  "labels": {
    "$type": "com.atproto.label.defs#selfLabels",
    "values": [
      {
        "val": "sexual"
      }
    ]
  },
  "pages": [
    {
      "$type": "pub.leaflet.pages.linearDocument",
      "blocks": [
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": "It was raining and Kagami was stuck at Konata’s house."
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": ""
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [
              {
                "features": [
                  {
                    "$type": "pub.leaflet.richtext.facet#italic"
                  }
                ],
                "index": {
                  "byteEnd": 296,
                  "byteStart": 286
                }
              }
            ],
            "plaintext": "Just hours prior it hardly looked like it would rain, the sky was as blue as it had ever been and what clouds were there did not give any indication of what was to come, and yet the showers came - creating an ambient sound that would almost have been relaxing were it not for the inane video game that was being played."
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": ""
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": "No, clouding the tranquil sound of rain falling was a soundtrack of murder and mayhem."
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": ""
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": "Kagami was hardly one to credit Konata for her taste in video games, but this felt like a turn from what she usually got up to - a shooter game full of blood, guts, and not much else. Not that she understood Konata’s video game habits all that well to begin with, but still… she wondered if she should be concerned or not."
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": ""
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [
              {
                "features": [
                  {
                    "$type": "pub.leaflet.richtext.facet#italic"
                  }
                ],
                "index": {
                  "byteEnd": 257,
                  "byteStart": 250
                }
              }
            ],
            "plaintext": "“So this is the new game, huh?” Kagami asked, as she could faintly recall Konata mentioning the title of an upcoming game she was gonna pick up ‘at some point.’ Judging by what she was seeing on screen, the title she was remembering at least sounded like it could’ve been the one she had now."
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": ""
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": "“Hm,” Konata replied, affirmatively, not looking away from her game."
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": ""
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [
              {
                "features": [
                  {
                    "$type": "pub.leaflet.richtext.facet#italic"
                  }
                ],
                "index": {
                  "byteEnd": 11,
                  "byteStart": 9
                }
              },
              {
                "features": [
                  {
                    "$type": "pub.leaflet.richtext.facet#italic"
                  }
                ],
                "index": {
                  "byteEnd": 196,
                  "byteStart": 190
                }
              }
            ],
            "plaintext": "What was up with her? It felt sometimes like Kagami knew way more about Konata than she’d ever asked to know, entirely against her will, and yet the blue-haired otaku could be an absolute enigma when she wanted to be - leaving Kagami to wonder…"
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": ""
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [
              {
                "features": [
                  {
                    "$type": "pub.leaflet.richtext.facet#italic"
                  }
                ],
                "index": {
                  "byteEnd": 158,
                  "byteStart": 152
                }
              },
              {
                "features": [
                  {
                    "$type": "pub.leaflet.richtext.facet#italic"
                  }
                ],
                "index": {
                  "byteEnd": 185,
                  "byteStart": 182
                }
              },
              {
                "features": [
                  {
                    "$type": "pub.leaflet.richtext.facet#italic"
                  }
                ],
                "index": {
                  "byteEnd": 220,
                  "byteStart": 216
                }
              },
              {
                "features": [
                  {
                    "$type": "pub.leaflet.richtext.facet#italic"
                  }
                ],
                "index": {
                  "byteEnd": 333,
                  "byteStart": 325
                }
              }
            ],
            "plaintext": "Konata had been picking up a lot of games, lately, so it had gotten harder for Kagami to keep track of what she was onto next. Not that she was keeping track, just… well, it was a lot of games. Konata used to have some weird sense of discernment, much as it pained Kagami to admit, but it felt like now she was just buying anything she could get her hands on as soon as she could get her hands on it."
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": ""
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": "“Been playing much of that online game lately?” Kagami asked, pivoting away from the game Konata was currently on. She just didn’t really know how to make conversation about the violence that was as senseless as it was monotonous."
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": ""
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": "“Sorta,” Konata replied, “Ms. Kuroi’s been weirdly busy, and then the rest of the party is full of schedules that never line up anymore, so I haven’t had much to do besides getting my log-in bonuses every day.”"
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": ""
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": "Kagami sighed. As weird as it all was for her, even she could understand on some level that this group Konata got together with was some sort of positive thing to have in her life."
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": ""
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": "“That sucks,” she sympathized, “I guess everyone has to move on from playing the same game eventually,” she figured, eliciting a very low hum of acknowledgement from Konata, “but wasn’t there one person on your team who you were close with besides Ms. Kuroi?”"
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": ""
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": "“Hm?” Konata responded, curiously."
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": ""
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [
              {
                "features": [
                  {
                    "$type": "pub.leaflet.richtext.facet#italic"
                  }
                ],
                "index": {
                  "byteEnd": 118,
                  "byteStart": 115
                }
              }
            ],
            "plaintext": "“Yeah,” Kagami said, as the knowledge came back to her, “I think you said you had a wife? Who was a guy? But you were playing a guy, even though you’re a girl, and you were married inside the game… or something weird like that.” It felt so convoluted when she said it all back to her."
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": ""
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": "“Not anymore,” Konata corrected her, near-monotone, “‘got divorced.”"
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": ""
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [
              {
                "features": [
                  {
                    "$type": "pub.leaflet.richtext.facet#italic"
                  }
                ],
                "index": {
                  "byteEnd": 41,
                  "byteStart": 35
                }
              },
              {
                "features": [
                  {
                    "$type": "pub.leaflet.richtext.facet#italic"
                  }
                ],
                "index": {
                  "byteEnd": 189,
                  "byteStart": 185
                }
              }
            ],
            "plaintext": "“D-divorced?! You weren’t even really married to begin wi—” Kagami started to say, before catching herself as she realized she could’ve hurt Konata’s feelings, “I mean… ugh, I’m sorry Konata,” she apologized, before offering, “do you wanna talk at all about it?”"
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": ""
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": "“Not much to talk about,” Konata replied, not breaking eye contact with her game and barely modulating her voice as she spoke, “his stupid wife didn’t like it.”"
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": ""
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [
              {
                "features": [
                  {
                    "$type": "pub.leaflet.richtext.facet#italic"
                  }
                ],
                "index": {
                  "byteEnd": 73,
                  "byteStart": 60
                }
              },
              {
                "features": [
                  {
                    "$type": "pub.leaflet.richtext.facet#italic"
                  }
                ],
                "index": {
                  "byteEnd": 109,
                  "byteStart": 101
                }
              }
            ],
            "plaintext": "“Wait… you married someone in your game who was married in real-life? Doesn’t that mean he was cheating on her with you?” questioned Kagami, a little shocked."
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": ""
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": "“They weren’t married when we got married,” Konata answered, relieving Kagami somewhat, “actually, he met her afterward. She was ok with us being married in-game until she wasn’t, he likes her more than he likes me, so yeah. Divorce.”"
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": ""
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [
              {
                "features": [
                  {
                    "$type": "pub.leaflet.richtext.facet#italic"
                  }
                ],
                "index": {
                  "byteEnd": 50,
                  "byteStart": 42
                }
              }
            ],
            "plaintext": "It turned out the situation was the exact opposite of what Kagami assumed, and the bluntness with which Konata spoke was almost painful."
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": ""
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [
              {
                "features": [
                  {
                    "$type": "pub.leaflet.richtext.facet#italic"
                  }
                ],
                "index": {
                  "byteEnd": 17,
                  "byteStart": 11
                }
              },
              {
                "features": [
                  {
                    "$type": "pub.leaflet.richtext.facet#italic"
                  }
                ],
                "index": {
                  "byteEnd": 222,
                  "byteStart": 219
                }
              }
            ],
            "plaintext": "“That… really sucks…” Kagami frowned, “I mean, to go back on what she said when you weren’t even standing in the way of her relationship… it’s not like you were waiting and hoping he’d decide he liked you better, right?”"
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": ""
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": "Silence."
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": ""
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [
              {
                "features": [
                  {
                    "$type": "pub.leaflet.richtext.facet#italic"
                  }
                ],
                "index": {
                  "byteEnd": 12,
                  "byteStart": 3
                }
              }
            ],
            "plaintext": "“Konata…”"
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": ""
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": "“It’s whatever,” Konata replies, conspicuously pressing the buttons on her controller more harshly. It didn’t seem like it was really ‘whatever’ and Kagami didn’t feel right letting her drop the subject that quickly."
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": ""
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": "“You don’t have t—”"
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": ""
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": "“It’s fine,” Konata stopped her, before being startled as Kagami reached over her shoulder to pause the game. Finally Konata turned around, only for Kagami to put her hand on her shoulder as they at last made direct eye contact."
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": ""
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [
              {
                "features": [
                  {
                    "$type": "pub.leaflet.richtext.facet#italic"
                  }
                ],
                "index": {
                  "byteEnd": 21,
                  "byteStart": 16
                }
              }
            ],
            "plaintext": "“It doesn’t sound fine,” Kagami told her, as the vulnerability in Konata’s depressed heart began to well up like the tears in her green eyes. She could tell it made Konata uncomfortable, but she didn’t let that stop her from holding her gaze in hers."
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": ""
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": "“You… it…” Konata began to say a couple times, until finally…"
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": ""
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [
              {
                "features": [
                  {
                    "$type": "pub.leaflet.richtext.facet#italic"
                  }
                ],
                "index": {
                  "byteEnd": 12,
                  "byteStart": 7
                }
              }
            ],
            "plaintext": "“… Fuck,” she sobbed, not offering any resistance when Kagami pulled her into a hug. Konata could hear nothing but the rain and the sound of her own weeping, now that the game had been paused, leaving her with no more distractions."
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": ""
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": "Her escape from her feelings was foiled - despite her best efforts, she was feeling them again."
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": ""
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [
              {
                "features": [
                  {
                    "$type": "pub.leaflet.richtext.facet#italic"
                  }
                ],
                "index": {
                  "byteEnd": 43,
                  "byteStart": 41
                }
              }
            ],
            "plaintext": "“I just wish that someone would choose me one time, y’know?” Konata admitted, her voice muffled against Kagami’s chest, “it feels like I’ve been the second-most important person, at best, to anyone I’ve met my whole life…"
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": ""
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [
              {
                "features": [
                  {
                    "$type": "pub.leaflet.richtext.facet#italic"
                  }
                ],
                "index": {
                  "byteEnd": 43,
                  "byteStart": 36
                }
              }
            ],
            "plaintext": "“Why does there always have to be someone anyone would rather be with than me?” she wept, not knowing if there was an answer to her question or that she would even want to hear it."
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": ""
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": "Not quite sure what to say to that, Kagami rubbed her back and held her. She really wasn’t used to seeing Konata like this, it was like there was an air of irreverence surrounding everything she did and said most of the time. Did she miss that irreverence? Did she want her to feel better just so she could go back to not talking about how she felt?"
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": ""
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [
              {
                "features": [
                  {
                    "$type": "pub.leaflet.richtext.facet#italic"
                  }
                ],
                "index": {
                  "byteEnd": 227,
                  "byteStart": 221
                }
              },
              {
                "features": [
                  {
                    "$type": "pub.leaflet.richtext.facet#italic"
                  }
                ],
                "index": {
                  "byteEnd": 285,
                  "byteStart": 280
                }
              }
            ],
            "plaintext": "That didn’t feel right. Despite how unserious Konata so often was, and how inscrutable she could be with her weird interests, Kagami had gotten to know her surprisingly well - to the point where she’d decide she even wanted to hang out with her. That was why she was there… wait."
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": ""
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": "“No,” Kagami responded, “that’s not true,” she told her, causing Konata to let out a questioning whimper, “if it was, I wouldn’t be here with you right now.”"
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": ""
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": "“That’s really nice of you to say, Kagamin… but you wouldn’t be here if you knew it was gonna rain and you’d be stuck with me,” countered Konata, with a sad smile, the depression still convincing her of the truth of her misery."
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": ""
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [
              {
                "features": [
                  {
                    "$type": "pub.leaflet.richtext.facet#underline"
                  }
                ],
                "index": {
                  "byteEnd": 9,
                  "byteStart": 3
                }
              }
            ],
            "plaintext": "“Forget that,” replied Kagami, “I still chose to come hang out with you and I’m not sorry I did,” she told her, “even if I’m probably ‘triggering a flag’ or whatever you’d call it.” She felt stupid saying it, but she figured it might cheer Konata up."
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": ""
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": "Konata looked back at her with those tired green eyes of hers, but no witty comeback came out. Instead, Kagami watched the sadness ever so subtly drain away from her smile. It was probably one of the most beautiful things Kagami had ever seen, but she’d never admit to it."
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": ""
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [
              {
                "features": [
                  {
                    "$type": "pub.leaflet.richtext.facet#italic"
                  }
                ],
                "index": {
                  "byteEnd": 119,
                  "byteStart": 115
                }
              }
            ],
            "plaintext": "“You actually remembered the terminology…” was, for some reason, what Konata said back to her after what had felt like a very meaningful pause."
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": ""
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [
              {
                "features": [
                  {
                    "$type": "pub.leaflet.richtext.facet#italic"
                  }
                ],
                "index": {
                  "byteEnd": 16,
                  "byteStart": 8
                }
              },
              {
                "features": [
                  {
                    "$type": "pub.leaflet.richtext.facet#italic"
                  }
                ],
                "index": {
                  "byteEnd": 160,
                  "byteStart": 155
                }
              }
            ],
            "plaintext": "“Ugh, that’s your takeaway?” Kagami reacted, “You mention it often enough I’d have a hard time forgetting it, it’s practically drilled into my skull at this point,” she complained half-heartedly, though she honestly couldn’t be too mad even at Konata’s gaming nonsense in that moment."
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": ""
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": "The incorrigible otaku nestled her face back into Kagami’s chest and relaxed, with her latest lonely battle with depression won after receiving some much-needed reinforcements. It felt good to have another person in the house again, even if she was only visiting."
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": ""
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": "“Thanks, Kagamin…” Konata said, her muffled voice coming through clearly enough, “I guess it doesn’t really matter whether you’re here by choice or not, just how you feel about it, y’know?”"
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": ""
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": "“Yeah… how I feel about it…” Kagami echoed, thinking back to what went through her mind earlier that day - back when the sun was still out."
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": ""
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.horizontalRule"
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": ""
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [
              {
                "features": [
                  {
                    "$type": "pub.leaflet.richtext.facet#italic"
                  }
                ],
                "index": {
                  "byteEnd": 8,
                  "byteStart": 3
                }
              }
            ],
            "plaintext": "“Sure.” That was all Konata had written when Kagami had offered to come over. She’d been meaning to spend some time with her again for a while, but one thing or another would come up and she’d have to try and find another time to go and do it. Being holed up all alone for that long couldn’t be good for her."
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": ""
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [
              {
                "features": [
                  {
                    "$type": "pub.leaflet.richtext.facet#italic"
                  }
                ],
                "index": {
                  "byteEnd": 59,
                  "byteStart": 0
                }
              }
            ],
            "plaintext": "“God knows she’s hardly going out enough these days,” thought Kagami, as she slipped into her shoes. She was just about to head out when she heard Tsukasa call after her."
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": ""
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": "“Sis!” Tsukasa said, “Before you go, I checked the weather app on my phone and it said there was a 30% chance of rain starting this evening!”"
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": ""
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": "At that, Kagami looked outside. Barely a cloud in sight."
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": ""
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": "“Are you sure there isn’t a setting wrong with your phone, Tsukasa?” Kagami asked, skeptically. She knew she had a habit of getting deep into her phone, but she still wasn’t above the occasional bout of absentmindedness."
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": ""
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [
              {
                "features": [
                  {
                    "$type": "pub.leaflet.richtext.facet#italic"
                  }
                ],
                "index": {
                  "byteEnd": 204,
                  "byteStart": 191
                }
              },
              {
                "features": [
                  {
                    "$type": "pub.leaflet.richtext.facet#italic"
                  }
                ],
                "index": {
                  "byteEnd": 316,
                  "byteStart": 311
                }
              }
            ],
            "plaintext": "“No, see? It says Saitama, and it could last all night after it starts,” Tsukasa replied, showing her screen, before her phone jingled as it notified her of a new text, “ahh, wait, no, don’t look!” she squeaked, turning her phone back around and attending to whomever had messaged her. Phones had the worst timing, sometimes."
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": ""
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [
              {
                "features": [
                  {
                    "$type": "pub.leaflet.richtext.facet#italic"
                  }
                ],
                "index": {
                  "byteEnd": 21,
                  "byteStart": 17
                }
              },
              {
                "features": [
                  {
                    "$type": "pub.leaflet.richtext.facet#italic"
                  }
                ],
                "index": {
                  "byteEnd": 114,
                  "byteStart": 111
                }
              }
            ],
            "plaintext": "30% wasn’t all that likely, but it gave Kagami pause. If she went out without an umbrella or raincoat and it did rain, she’d be stuck at Konata’s. Would probably have to stay there overnight, by the sound of it…"
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": ""
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [
              {
                "features": [
                  {
                    "$type": "pub.leaflet.richtext.facet#italic"
                  }
                ],
                "index": {
                  "byteEnd": 162,
                  "byteStart": 139
                }
              }
            ],
            "plaintext": "“I’m sure it’ll be fine,” Kagami told her sister, who offered a smile and nod before getting back to tapping out her next message. “Same old Tsukasa,” she thought, as she wondered if she could find the same old Konata in the house she was visiting."
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": ""
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": ""
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.horizontalRule"
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": ""
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [
              {
                "features": [
                  {
                    "$type": "pub.leaflet.richtext.facet#italic"
                  }
                ],
                "index": {
                  "byteEnd": 204,
                  "byteStart": 200
                }
              }
            ],
            "plaintext": "It took some digging, sure, but eventually she did sorta find her. They were both a bit older, some time had passed, but she could still recognize the girl whose face was planted firmly in her chest. Very firmly, actually."
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": ""
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [
              {
                "features": [
                  {
                    "$type": "pub.leaflet.richtext.facet#italic"
                  }
                ],
                "index": {
                  "byteEnd": 79,
                  "byteStart": 73
                }
              },
              {
                "features": [
                  {
                    "$type": "pub.leaflet.richtext.facet#italic"
                  }
                ],
                "index": {
                  "byteEnd": 214,
                  "byteStart": 211
                }
              }
            ],
            "plaintext": "“Say…” Kagami started, suspiciously, “you’ve been down there a while, y’know…” she mentioned, only to hear a giggle she hadn’t heard in a long time… and could probably have gone a bit longer not hearing, honestly."
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": ""
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": "“You’ve put on some pounds, I see,” Konata remarked, mischievously, “your boobs are fuller than usual~”"
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": ""
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [
              {
                "features": [
                  {
                    "$type": "pub.leaflet.richtext.facet#italic"
                  }
                ],
                "index": {
                  "byteEnd": 23,
                  "byteStart": 13
                }
              }
            ],
            "plaintext": "Yep. She had definitely found the ‘same old Konata.’ God help her, she found her."
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": ""
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": "“I’m only letting that one slide because you’re too pathetic to hit on the head, tonight, got it?” Kagami replied."
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": ""
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [
              {
                "features": [
                  {
                    "$type": "pub.leaflet.richtext.facet#italic"
                  }
                ],
                "index": {
                  "byteEnd": 239,
                  "byteStart": 227
                }
              }
            ],
            "plaintext": "“If you say so, Kagamin~” sighed Konata, wrapping her arms around her in a hug that elicited what would’ve been the cutest blush Konata had ever seen on Kagami’s face… had she seen it. The boobs giveth, and the boobs taketh away."
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": ""
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": "She was going to be stuck there the rest of the night, Kagami realized. A whole night spent with the most inscrutable and annoying person she’d ever met. That was what she’d chosen."
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": ""
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": "With any luck, the night wouldn’t run out too quickly."
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": ""
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [
              {
                "features": [
                  {
                    "$type": "pub.leaflet.richtext.facet#bold"
                  }
                ],
                "index": {
                  "byteEnd": 8,
                  "byteStart": 0
                }
              }
            ],
            "plaintext": "The End."
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": ""
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.horizontalRule"
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [
              {
                "features": [
                  {
                    "$type": "pub.leaflet.richtext.facet#bold"
                  }
                ],
                "index": {
                  "byteEnd": 17,
                  "byteStart": 0
                }
              }
            ],
            "plaintext": "Author’s Notes: It’s my first Lucky Star fan-fic, and it’s of course dedicated to my favorite ship of the show - KonaKaga! I know I don’t have them officially start a relationship here or kiss, but this is a KonaKaga fan-fic and you are not allowed to enjoy it while imagining it’s just platonic. If you were doing so before you reached these notes, no you didn’t! I reach into the past and steal your enjoyment away! Mwahahaha! >:D"
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": "Something readers may notice that I am a little self-conscious of is that, for a Lucky Star fan-fic, this doesn’t really have the casual conversational vibe of the source material nor is it authentically Japanese. Lucky Star has had more dramatic parts to it, though, and I like to think I stayed true enough to the characters and setting at least."
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": "Hope you enjoyed reading! I’d love if you shared any thoughts you had while doing so! Thanks!"
          }
        }
      ]
    }
  ],
  "publication": "at://did:plc:2atpw7zrdrdptzqo7jw63rzv/pub.leaflet.publication/3lvroq6qmac2o",
  "publishedAt": "2025-07-30T22:03:27.969Z",
  "title": "A Chance of Rain"
}

did:plc:2atpw7zrdrdptzqo7jw63rzv | at://did:plc:2atpw7zrdrdptzqo7jw63rzv/pub.leaflet.document/3lygpwotxqk2d

pub.leaflet.blocks.blockquote (nested within pub.leaflet.document) (59 samples)
{
  "$type": "pub.leaflet.document",
  "author": "did:plc:6dis2hlap2lhwohabb2tniln",
  "description": "Manual spreadsheet workflow: best for a small number of campaigns with stable requirements, provided one owner maintains the source of truth and every status change is dated. Its advantage is flexibility; its weakness is duplicate data entry, inconsistent definitions, and fragile",
  "pages": [
    {
      "$type": "pub.leaflet.pages.linearDocument",
      "blocks": [
        {
          "block": {
            "$type": "pub.leaflet.blocks.blockquote",
            "plaintext": "Manual spreadsheet workflow: best for a small number of campaigns with stable requirements, provided one owner maintains the source of truth and every status change is dated. Its advantage is flexibility; its weakness is duplicate data entry, inconsistent definitions, and fragile formulas.Structured software workflow: best when multiple people manage outreach, approvals, suppliers, payments, and client updates. Its advantage is a consistent record and repeatable reporting; its weakness is setup effort and the risk of blindly trusting imported or automated data.Hybrid workflow: often the best choice for growing agencies. Use software for campaign records, quotas, tasks, and evidence, then export a concise client report after an account manager reviews exceptions and quality."
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.unorderedList",
            "children": [
              {
                "content": {
                  "$type": "pub.leaflet.blocks.text",
                  "plaintext": "Unit: the item being measured, such as a live referring page, approved placement, digital PR mention, or completed outreach opportunity."
                }
              },
              {
                "content": {
                  "$type": "pub.leaflet.blocks.text",
                  "plaintext": "Quality threshold: the minimum relevance, editorial standard, traffic evidence, authority signal, or geographic fit required."
                }
              },
              {
                "content": {
                  "$type": "pub.leaflet.blocks.text",
                  "plaintext": "Counting event: the exact point at which work becomes billable or quota-eligible."
                }
              },
              {
                "content": {
                  "$type": "pub.leaflet.blocks.text",
                  "plaintext": "Time window: the calendar month, billing cycle, or rolling 30-day period used for delivery."
                }
              },
              {
                "content": {
                  "$type": "pub.leaflet.blocks.text",
                  "plaintext": "Exception policy: how rejected, removed, delayed, duplicate, or substituted placements are handled."
                }
              }
            ]
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.unorderedList",
            "children": [
              {
                "content": {
                  "$type": "pub.leaflet.blocks.text",
                  "plaintext": "Quota: the agreed target for the reporting period."
                }
              },
              {
                "content": {
                  "$type": "pub.leaflet.blocks.text",
                  "plaintext": "Verified live: placements that meet the counting definition and passed review."
                }
              },
              {
                "content": {
                  "$type": "pub.leaflet.blocks.text",
                  "plaintext": "Pending: approved or contracted opportunities not yet live."
                }
              },
              {
                "content": {
                  "$type": "pub.leaflet.blocks.text",
                  "plaintext": "Rejected or disqualified: items removed because they failed quality or campaign rules."
                }
              },
              {
                "content": {
                  "$type": "pub.leaflet.blocks.text",
                  "plaintext": "Carry-forward: work explicitly moved to the next period under the agreed policy."
                }
              },
              {
                "content": {
                  "$type": "pub.leaflet.blocks.text",
                  "plaintext": "Remaining: the difference between the quota and verified live placements, if applicable."
                }
              }
            ]
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.unorderedList",
            "children": [
              {
                "content": {
                  "$type": "pub.leaflet.blocks.text",
                  "plaintext": "Confirm the quota definition and qualification rules for each client."
                }
              },
              {
                "content": {
                  "$type": "pub.leaflet.blocks.text",
                  "plaintext": "Freeze the reporting period so late edits are visible rather than silently overwriting history."
                }
              },
              {
                "content": {
                  "$type": "pub.leaflet.blocks.text",
                  "plaintext": "Verify every counted placement is live, relevant, and associated with the correct campaign."
                }
              },
              {
                "content": {
                  "$type": "pub.leaflet.blocks.text",
                  "plaintext": "Remove duplicates and confirm that one placement is not being counted for multiple clients."
                }
              },
              {
                "content": {
                  "$type": "pub.leaflet.blocks.text",
                  "plaintext": "Reconcile publisher, writer, and tool payments with the approved campaign budget."
                }
              },
              {
                "content": {
                  "$type": "pub.leaflet.blocks.text",
                  "plaintext": "Separate live, pending, rejected, replaced, and carried-forward work."
                }
              },
              {
                "content": {
                  "$type": "pub.leaflet.blocks.text",
                  "plaintext": "Review unusual changes in anchor text, destination pages, domain types, or geography."
                }
              },
              {
                "content": {
                  "$type": "pub.leaflet.blocks.text",
                  "plaintext": "Write a short explanation for every shortfall, exception, or material quality concern."
                }
              }
            ]
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.unorderedList",
            "children": [
              {
                "content": {
                  "$type": "pub.leaflet.blocks.text",
                  "plaintext": "Counting promises as placements: an acceptance email or paid invoice is not necessarily a live deliverable."
                }
              },
              {
                "content": {
                  "$type": "pub.leaflet.blocks.text",
                  "plaintext": "Changing definitions mid-cycle: adding a new quality requirement after delivery creates avoidable conflict; update the next period instead."
                }
              },
              {
                "content": {
                  "$type": "pub.leaflet.blocks.text",
                  "plaintext": "Reporting only totals: a number without URLs, statuses, or qualification notes cannot be audited."
                }
              },
              {
                "content": {
                  "$type": "pub.leaflet.blocks.text",
                  "plaintext": "Hiding carry-forward work: moving unfinished placements into the next month without labeling them undermines trust."
                }
              },
              {
                "content": {
                  "$type": "pub.leaflet.blocks.text",
                  "plaintext": "Using third-party scores as guarantees: screening metrics do not establish relevance, editorial quality, or future performance."
                }
              },
              {
                "content": {
                  "$type": "pub.leaflet.blocks.text",
                  "plaintext": "Mixing client and agency expenses: shared cards and uncategorized invoices make campaign profitability difficult to measure."
                }
              },
              {
                "content": {
                  "$type": "pub.leaflet.blocks.text",
                  "plaintext": "Automating approval decisions: software can organize evidence, but a person should review brand fit, policy concerns, and unusual placements."
                }
              },
              {
                "content": {
                  "$type": "pub.leaflet.blocks.text",
                  "plaintext": "Ignoring removals: define how a link that disappears shortly after publication is monitored and replaced."
                }
              }
            ]
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.orderedList",
            "children": [
              {
                "content": {
                  "$type": "pub.leaflet.blocks.text",
                  "plaintext": "Headline summary: state the quota, verified live total, status against target, and one sentence explaining the result."
                }
              },
              {
                "content": {
                  "$type": "pub.leaflet.blocks.text",
                  "plaintext": "Delivery table: list live URLs, linking domains, target pages, anchor or mention type, publication date, and qualification notes."
                }
              },
              {
                "content": {
                  "$type": "pub.leaflet.blocks.text",
                  "plaintext": "Pipeline: show approved, in-production, and awaiting-approval items separately from live work."
                }
              },
              {
                "content": {
                  "$type": "pub.leaflet.blocks.text",
                  "plaintext": "Quality review: identify any placements that need monitoring, replacement, or client confirmation."
                }
              },
              {
                "content": {
                  "$type": "pub.leaflet.blocks.text",
                  "plaintext": "Budget reconciliation: show approved, committed, paid, and remaining spend where relevant."
                }
              },
              {
                "content": {
                  "$type": "pub.leaflet.blocks.text",
                  "plaintext": "Next actions: request approvals, confirm priorities, or explain any change to the next quota."
                }
              }
            ]
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.header",
            "level": 2,
            "plaintext": "Define the quota before choosing the reporting workflow"
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.header",
            "level": 2,
            "plaintext": "Use one status model from outreach to client approval"
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.header",
            "level": 2,
            "plaintext": "Choose reporting metrics that explain delivery, not just volume"
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.header",
            "level": 2,
            "plaintext": "Compare manual reporting with a structured software workflow"
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.header",
            "level": 2,
            "plaintext": "Connect quotas to approvals, budgets, and payment controls"
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.header",
            "level": 2,
            "plaintext": "Build a client report that supports decisions"
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.header",
            "level": 2,
            "plaintext": "Apply this quota and reporting checklist every month"
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.header",
            "level": 2,
            "plaintext": "Avoid the reporting mistakes that create client disputes"
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.header",
            "level": 2,
            "plaintext": "FAQ: client reporting and link quotas"
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.header",
            "level": 3,
            "plaintext": "Should a link count when it is published or when it is indexed?"
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.header",
            "level": 3,
            "plaintext": "How should an agency handle a month where it misses the quota?"
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.header",
            "level": 3,
            "plaintext": "Can automated software produce the final client report without human review?"
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.header",
            "level": 3,
            "plaintext": "What is the best way to control supplier payments for link campaigns?"
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.header",
            "level": 3,
            "plaintext": "When should a small agency invest in dedicated workflow software?"
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.header",
            "level": 2,
            "plaintext": "Take the next seven days to make quotas auditable"
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "The most reliable way to manage client reporting and quotas is to treat link building as an operating system, not a monthly spreadsheet. Define what counts toward a quota, assign every placement to a client and campaign, record quality evidence as work happens, and report delivered, pending, rejected, and carried-forward work separately. link building software for agencies (https://linkpilot-ai.ramerlabs.com/#pricing) can make that process easier, but only when the underlying rules are clear."
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "Start with a quota model that clients can understand: a monthly target, a qualification standard, a status definition, and a policy for substitutions or shortfalls. Then connect prospecting, outreach, approvals, payments, and reporting to the same campaign record. This prevents the common agency problem where the delivery team says a quota is complete while the client sees a list of links that includes duplicates, unapproved domains, or pages that are not live."
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "A quota is not simply “20 links per month.” That phrase leaves too many decisions unresolved. Does a link count when a publisher accepts the article, when the page is published, or only when the link is indexed? Are nofollow links included? What happens if a site is later removed? Unless these conditions are written into the service scope, reporting becomes a negotiation every month."
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "A practical quota definition has five parts:"
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "For example, an agency might define a counted link as a live, indexable editorial placement on a relevant domain that meets the client’s approved criteria. A publisher acceptance would remain “committed” rather than “delivered” until the page is live. This distinction makes both the internal queue and the client report more honest."
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "Client reporting becomes dependable when every opportunity moves through the same limited set of statuses. Avoid creating a dozen labels that mean different things to different account managers. A compact workflow might include prospect, contacted, negotiating, approved, in production, live, rejected, and replaced."
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "The key is to separate activity from outcomes. An outreach email is activity. A publisher response is an opportunity update. A live, verified page is a deliverable. If a report combines all three, clients cannot tell whether they received value or merely saw evidence of effort."
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "For each live placement, capture the URL, target page, anchor text, publication date, link attribute when relevant, domain, campaign, approval record, cost, and verification date. Add a short note explaining why the placement qualifies. This evidence can be stored in an internal record even if the client-facing report only shows the fields that matter to them."
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "AI link building software (https://linkpilot-ai.ramerlabs.com/#features) can support a more organized workflow by helping teams centralize campaign information and reduce manual handoffs. It should not replace human review of relevance, editorial fit, or compliance with a client’s search strategy."
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "A strong monthly report answers four questions: What was promised? What was delivered? What is still in progress? What decision or action is needed next? The report should make those answers visible before presenting secondary metrics."
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "Use a delivery summary with at least these categories:"
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "Do not use “completed” as a substitute for “live” unless your contract defines completion that way. A report can show both, but the labels must be unambiguous. For example, “14 live, 4 in production, 2 awaiting publisher confirmation” gives a client a much more useful view than “20 completed.”"
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "Quality metrics should support the delivery summary rather than obscure it. Useful fields include topical relevance, destination-page distribution, brand or product mention, country, estimated traffic source, and whether the placement was pre-approved. Avoid presenting third-party scores as objective truth; describe them as screening signals and explain the review criteria behind them."
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "The right approach depends on client volume, reporting complexity, and how often the team repeats the same process. Manual reporting is not automatically wrong. It becomes risky when the agency cannot reproduce how a number was calculated."
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "A simple decision rule is this: stay mostly manual when the same person owns delivery and reporting for a few low-complexity accounts. Move to a structured system when clients have different quotas, several specialists touch each campaign, or monthly reconciliation takes more time than campaign planning. automated link building software (https://linkpilot-ai.ramerlabs.com/#how) may reduce repetitive administration, but automation should stop short of making unreviewed quality decisions for you."
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "Quotas and budgets are related but not interchangeable. A campaign can reach its link quota while exceeding the approved placement budget, or spend its budget without producing enough qualifying links. Track both at the campaign level and show the relationship in internal reporting."
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "For teams paying publishers, writers, tools, or suppliers, use payment controls that match the operating model. A dedicated reloadable vcc (https://linkpilot-ai.ramerlabs.com/reloadable-vcc) can help separate approved campaign spend from general company expenses, while a reloadable link building (https://linkpilot-ai.ramerlabs.com/reloadable-virtual-credit-card) workflow can make recurring supplier payments easier to reconcile. The card itself does not prove that a placement is valid; it only helps create a cleaner financial trail."
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "Set a rule that every payment request includes a client, campaign, supplier, expected deliverable, amount, and approval status. Reconcile the payment against the final placement record after publication. If a supplier invoice is paid but the placement is rejected or never goes live, mark the financial exception separately rather than silently counting it toward quota."
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "Reloadable payment instruments also need ordinary controls: named users, spending limits, transaction review, receipt retention, and compliance with the issuer’s terms and the platform’s rules. Do not use a card to bypass account verification, advertising restrictions, publisher policies, or contractual approval requirements."
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "A client-facing report should be shorter than the internal production dashboard. Clients usually need a clear executive summary, a delivery table, notable wins or risks, and next-month recommendations. They do not need every internal comment or every failed prospect unless those items affect the strategy."
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "A useful structure is:"
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "Use plain language for shortfalls. “Three placements moved to next month because two publishers delayed publication and one domain failed the relevance review” is more credible than “delivery was impacted by external factors.” Pair the explanation with a remedy, such as replacement outreach, revised topic approvals, or a mutually agreed carry-forward."
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "Use the following checklist before sending a report or closing a billing cycle:"
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "Most quota disputes are process failures rather than difficult SEO disagreements. Watch for these recurring mistakes:"
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "Agencies that need client-specific access or branded deliverables may also evaluate white label link building software (https://linkpilot-ai.ramerlabs.com/#plan-features). The practical question is not whether the interface carries your logo; it is whether the underlying records, permissions, exports, and audit trail are consistent enough to support your promises."
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "Use the event stated in the agreement, but publication is usually easier to verify and control than indexing. If indexation matters to the client, report it as a separate monitoring field rather than quietly changing the quota rule. A sensible model is “live and technically accessible” for delivery, followed by an indexation check after an agreed observation period."
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "Report the verified total, identify the cause, and show the recovery plan. Separate delays caused by publisher timelines from items rejected during quality review. Then agree whether the remaining work will carry forward, be replaced, or be credited under the contract. Do not inflate the current month with unverified placements or conceal the shortfall in a blended quarterly total."
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "It can assemble much of the report, but a human should approve the final version. Automated systems may import duplicate URLs, retain stale statuses, misclassify a domain, or miss a brand-safety issue. Use software to calculate consistent totals and gather evidence, then have an account manager review exceptions, quality, narrative, and client-specific requirements."
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "Assign each transaction to a client and campaign before payment, set a spending limit, require an approval record, and reconcile the transaction after the placement is verified. A reloadable virtual card (https://linkpilot-ai.ramerlabs.com/reloadable-virtual-card) or other controlled payment method may help with separation and budgeting, but it does not replace supplier due diligence, receipts, contractual terms, or review of the resulting page."
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "Consider it when reporting repeatedly consumes several hours, multiple people update the same campaigns, clients require different quota rules, or payment and delivery records are difficult to reconcile. Before buying, document the current workflow and test whether the tool supports campaign-level quotas, status history, exports, permissions, and exception handling. A Windows link building app (https://linkpilot-ai.ramerlabs.com/#download) may suit teams that prefer a desktop workflow, but fit depends on the complete process rather than the device alone."
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "On day one, list every active client, quota, qualification rule, reporting period, and exception policy. On days two and three, create one shared status model and clean the current placement records so every item has an owner, campaign, and evidence. On day four, reconcile recent supplier and tool payments, using a reloadable virtual visa card (https://linkpilot-ai.ramerlabs.com/virtual-visa-reloadable) only within the issuer’s permitted use and your normal approval controls."
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "On day five, build a report template with quota, verified live work, pipeline, exceptions, budget, and next actions. On day six, run it against one client and ask whether a neutral reader could reproduce the totals. On day seven, document the corrections and make the template standard for the next billing cycle. The result should be a reporting process that shows not only how much work was delivered, but why it qualifies and what happens next."
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.horizontalRule"
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "Published for vccbusiness.com (https://vccbusiness.com)"
          }
        }
      ]
    }
  ],
  "publishedAt": "2026-10-01T22:04:33.000Z",
  "tags": [
    "client reporting",
    "link quotas",
    "link building agencies",
    "agency operations",
    "SEO workflow",
    "payment controls",
    "virtual cards",
    "link building software for agencies"
  ],
  "title": "How link building software for agencies Makes Client Quotas Reportable"
}

did:plc:6dis2hlap2lhwohabb2tniln | at://did:plc:6dis2hlap2lhwohabb2tniln/pub.leaflet.document/3mwtugxlffw23

pub.leaflet.blocks.bskyPost (nested within pub.leaflet.document) (33 samples)
{
  "$type": "pub.leaflet.document",
  "author": "did:plc:tbzfsowmg4zj234pws47u3x6",
  "description": "I created a small tool that can convert leaflet posts to markdown and sync them with my hugo based blog",
  "pages": [
    {
      "$type": "pub.leaflet.pages.linearDocument",
      "blocks": [
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [
              {
                "features": [
                  {
                    "$type": "pub.leaflet.richtext.facet#link",
                    "uri": "https://gohugo.io/"
                  }
                ],
                "index": {
                  "byteEnd": 188,
                  "byteStart": 184
                }
              }
            ],
            "plaintext": "A few days ago I announced on BlueSky that I created a small tool to convert my leaflet posts (like the one you are reading right now) to markdown, so that they can also show up on my hugo based blog."
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.bskyPost",
            "postRef": {
              "cid": "bafyreig4zol7lqtzoxuzfti3sxhxdhhs7j6lczlilf3ay2iiueihsjbgnu",
              "uri": "at://did:plc:tbzfsowmg4zj234pws47u3x6/app.bsky.feed.post/3mbrxzvw36c22"
            }
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": "\nI promised to follow up with an article about how I use it and that's what you are reading now. "
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [
              {
                "features": [
                  {
                    "$type": "pub.leaflet.richtext.facet#code"
                  }
                ],
                "index": {
                  "byteEnd": 87,
                  "byteStart": 69
                }
              }
            ],
            "plaintext": "In the root directory of your hugo blog you'll need to create a file .leaflet-sync.yaml - here is what mine looks like."
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.code",
            "language": "yaml",
            "plaintext": "source:\n  handle: \"mariuskimmina.com\"\n  collection: \"pub.leaflet.document\"\n  publication_name: \"Marius Toolbox\"\n\noutput:\n  posts_dir: \"content/posts/leaflet\"\n  images_dir: \"static/images/leaflet\"\n  image_path_prefix: \"/images/leaflet\"\n\ntemplate:\n  frontmatter: |\n    ---\n    title: \"{{ .Title }}\"\n    date: {{ .CreatedAt }}\n    original_url: \"https://toolbox.leaflet.pub/{{ .Slug }}\"\n    author: \"{{ .Handle }}\"\n    ---\n  content: |\n    *Originally published at [Marius Toolbox](https://toolbox.leaflet.pub/{{ .Slug }})*\n\n    {{ .Content }}\n\n    ---\n    *Originally published at [Marius Toolbox](https://toolbox.leaflet.pub/{{ .Slug }})*"
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [
              {
                "features": [
                  {
                    "$type": "pub.leaflet.richtext.facet#code"
                  }
                ],
                "index": {
                  "byteEnd": 60,
                  "byteStart": 43
                }
              }
            ],
            "plaintext": "In this same directory you now need to run leaflet-hugo-sync - my recommendation for now would be to just use "
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.code",
            "language": "yaml",
            "plaintext": "nix run github:mariuskimmina/leaflet-hugo-sync"
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": "But I might also look into producing an official release soon."
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [
              {
                "features": [
                  {
                    "$type": "pub.leaflet.richtext.facet#code"
                  }
                ],
                "index": {
                  "byteEnd": 47,
                  "byteStart": 26
                }
              }
            ],
            "plaintext": "This will create a folder content/posts/leaflet containing all your leaflet posts with sanitized version of the post name as the file name."
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [
              {
                "features": [
                  {
                    "$type": "pub.leaflet.richtext.facet#code"
                  }
                ],
                "index": {
                  "byteEnd": 37,
                  "byteStart": 21
                }
              }
            ],
            "plaintext": "If you leave out the publication_name it will get all your leaflets which may or may not what you want."
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [
              {
                "features": [
                  {
                    "$type": "pub.leaflet.richtext.facet#code"
                  }
                ],
                "index": {
                  "byteEnd": 29,
                  "byteStart": 21
                }
              }
            ],
            "plaintext": "You can then use the template section to customize the content a bit, I for example added links back to the leaflet at the top and bottom of the posts. "
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [
              {
                "features": [
                  {
                    "$type": "pub.leaflet.richtext.facet#link",
                    "uri": "https://mariuskimmina.com"
                  }
                ],
                "index": {
                  "byteEnd": 174,
                  "byteStart": 157
                }
              }
            ],
            "plaintext": "If you actually use this I would love to hear feedback <3\nI will also soon publish another post to detail the entire setup of how I now host my hugo blog on mariuskimmina.com and keep it sync with my leaflet posts. \n\nSource:"
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [
              {
                "features": [
                  {
                    "$type": "pub.leaflet.richtext.facet#link",
                    "uri": "https://tangled.org/mariuskimmina.com/leaflet-hugo-sync"
                  }
                ],
                "index": {
                  "byteEnd": 55,
                  "byteStart": 0
                }
              }
            ],
            "plaintext": "https://tangled.org/mariuskimmina.com/leaflet-hugo-sync"
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [
              {
                "features": [
                  {
                    "$type": "pub.leaflet.richtext.facet#link",
                    "uri": "https://github.com/mariuskimmina/leaflet-hugo-sync"
                  }
                ],
                "index": {
                  "byteEnd": 50,
                  "byteStart": 0
                }
              },
              {
                "features": [
                  {
                    "$type": "pub.leaflet.richtext.facet#link",
                    "uri": "https://mariuskimmina.com/posts/"
                  }
                ],
                "index": {
                  "byteEnd": 132,
                  "byteStart": 100
                }
              }
            ],
            "plaintext": "https://github.com/mariuskimmina/leaflet-hugo-sync\n\nYou can find my blog, including this posts, on \nhttps://mariuskimmina.com/posts/"
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": ""
          }
        }
      ],
      "id": "019b9a13-413b-700d-99d7-9c3ad47d1b50"
    }
  ],
  "publication": "at://did:plc:tbzfsowmg4zj234pws47u3x6/pub.leaflet.publication/3mb25gdgmj22r",
  "publishedAt": "2026-01-07T21:11:39.039Z",
  "tags": [
    "bluesky",
    "hugo",
    "markdown",
    "leaflet"
  ],
  "title": "Leaflet to Markdown or why you can now read this post on my Hugo blog too - Toolbox #3"
}

did:plc:tbzfsowmg4zj234pws47u3x6 | at://did:plc:tbzfsowmg4zj234pws47u3x6/pub.leaflet.document/3mbueyjaxc22b

pub.leaflet.blocks.button (nested within pub.leaflet.document) (6 samples)
{
  "$type": "pub.leaflet.document",
  "author": "did:plc:llumonvbk6mrkn3myaxpnsje",
  "description": "(A LITTLE BIT DISTURBED, NOW) A problem with unwinding, you say?",
  "pages": [
    {
      "$type": "pub.leaflet.pages.linearDocument",
      "blocks": [
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [
              {
                "features": [
                  {
                    "$type": "pub.leaflet.richtext.facet#bold"
                  }
                ],
                "index": {
                  "byteEnd": 36,
                  "byteStart": 0
                }
              },
              {
                "features": [
                  {
                    "$type": "pub.leaflet.richtext.facet#bold"
                  },
                  {
                    "$type": "pub.leaflet.richtext.facet#italic"
                  }
                ],
                "index": {
                  "byteEnd": 68,
                  "byteStart": 36
                }
              },
              {
                "features": [
                  {
                    "$type": "pub.leaflet.richtext.facet#bold"
                  }
                ],
                "index": {
                  "byteEnd": 69,
                  "byteStart": 68
                }
              }
            ],
            "plaintext": "Hello everyone, and welcome back to Dialogue with Cristobal Martinez!"
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.image",
            "aspectRatio": {
              "height": 200,
              "width": 200
            },
            "image": {
              "$type": "blob",
              "mimeType": "image/png",
              "ref": {
                "$link": "bafkreigdpi66rf7b56e2nhkjni5nuly43l4dcx66etsmub4cb7z2ixjqsu"
              },
              "size": 46928
            }
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.horizontalRule"
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": "Child, when I tell you, the sitcom gods should lose their soul privileges after this article is published."
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": "For some reason, the sitcom gods want my TV show of a life to be interesting. And by interesting, I mean they want me to suffer from being a disaster, causing everything to drop or fall down, make me become forgetful, make me lose my balance."
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [
              {
                "features": [
                  {
                    "$type": "pub.leaflet.richtext.facet#bold"
                  }
                ],
                "index": {
                  "byteEnd": 263,
                  "byteStart": 237
                }
              }
            ],
            "plaintext": "The sitcom gods have been watching my show, among others, from Hell. Whenever I decide to romanticize my life by prioritizing me, one of them stomps around the floor of whichever floor of Hell they're on, and screams to the hellish air, \"Oh My GoD! dO sOmEtHiNg!\""
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.image",
            "aspectRatio": {
              "height": 258,
              "width": 320
            },
            "image": {
              "$type": "blob",
              "mimeType": "image/gif",
              "ref": {
                "$link": "bafkreiej3l2rrzrd2sa6aycay7yrhvwh2up6p6ouqtlq4gig25nsvc2jai"
              },
              "size": 573637
            }
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": "While I unwind, the sitcom gods are simmering with rage to the point of selling their souls like swiping their credit card for something to happen. And when a minor inconvenience, mishap, misfortune, or misstep occurs in my show, the sitcom gods can finally laugh."
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.image",
            "aspectRatio": {
              "height": 365,
              "width": 500
            },
            "image": {
              "$type": "blob",
              "mimeType": "image/gif",
              "ref": {
                "$link": "bafkreid5zmgvxvhxbrsm4reiitpe6nw2wyr2wvn4a4rhuxlifmvkrt2bbe"
              },
              "size": 278605
            }
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": "I'm currently attending my own personal curriculum called Aesthetic Living. I learned that the simple and mundane of everyday life can still be exciting and new. That means that the moments that I have that aren't special still counts as something engaging. The sitcom gods, the dumbasses that they are, should really take note."
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": "The only thing funny about my everyday life, also known as subsequent episodes, that I DO enjoy is my inner chihuahua going goo-goo ga-ga for the cute men I see on my godmother Drew Barrymore's internet."
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.image",
            "aspectRatio": {
              "height": 480,
              "width": 424
            },
            "image": {
              "$type": "blob",
              "mimeType": "image/gif",
              "ref": {
                "$link": "bafkreici5mzzo74uk3jx3s4qc3nmgrcgtwxu7jqottsfw3wwvzzzysgrxq"
              },
              "size": 1006261
            }
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": "One of the cute guys on the internet is a Chicago-based playwright, stage actor, musician, and artist named Alexander Attea. He has a website that I do recommend exploring, especially to my fellow gays with inner chihuahuas."
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.website",
            "description": "",
            "previewImage": {
              "$type": "blob",
              "mimeType": "image/png",
              "ref": {
                "$link": "bafkreie5varhkcua5ihv2mnzn4rbidfam6j54apr57ov2ryvo42hlbqoee"
              },
              "size": 44663
            },
            "src": "https://www.alexanderattea.com/",
            "title": "Home | Alexander Attea"
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": "I do want to acknowledge, and I know I'm going on a tangent, that I consider Alexander Attea as cute like a chihuahua. And that's an honor from me and my inner chihuahua. Is it silly for me to say? Absolutely. But, I consider it as the only thing funny that I enjoy, yet I have others. Still, I enjoy staying up to date on Alexander and making him a regular on my show of a life. The sitcom gods could never."
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.image",
            "aspectRatio": {
              "height": 270,
              "width": 480
            },
            "image": {
              "$type": "blob",
              "mimeType": "image/gif",
              "ref": {
                "$link": "bafkreihmgqg2dbfefu2c43sghv7dntovrb6wza65lsc2bnrhy7qg3rg4pq"
              },
              "size": 976245
            }
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.horizontalRule"
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [
              {
                "features": [
                  {
                    "$type": "pub.leaflet.richtext.facet#italic"
                  }
                ],
                "index": {
                  "byteEnd": 137,
                  "byteStart": 129
                }
              },
              {
                "features": [
                  {
                    "$type": "pub.leaflet.richtext.facet#italic"
                  }
                ],
                "index": {
                  "byteEnd": 265,
                  "byteStart": 240
                }
              }
            ],
            "plaintext": "If you enjoyed any part of this article, please consider leaving a comment on your thoughts. If you want to keep up with more of Dialogue, you can subscribe below this article. And if you want my monthly lifestyle updates, please check out This Month With Cristobal here:"
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.button",
            "text": "This Month With Cristobal",
            "url": "https://this-month-with-cristobal.leaflet.pub"
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [
              {
                "features": [
                  {
                    "$type": "pub.leaflet.richtext.facet#bold"
                  }
                ],
                "index": {
                  "byteEnd": 14,
                  "byteStart": 0
                }
              },
              {
                "features": [
                  {
                    "$type": "pub.leaflet.richtext.facet#bold"
                  },
                  {
                    "$type": "pub.leaflet.richtext.facet#italic"
                  }
                ],
                "index": {
                  "byteEnd": 46,
                  "byteStart": 14
                }
              },
              {
                "features": [
                  {
                    "$type": "pub.leaflet.richtext.facet#bold"
                  }
                ],
                "index": {
                  "byteEnd": 91,
                  "byteStart": 46
                }
              }
            ],
            "plaintext": "That's it for Dialogue with Cristobal Martinez. I'll catch you guys in the next one. Later!"
          }
        }
      ],
      "id": "019b0145-6b9e-7aa5-a834-fc34f62443a7"
    }
  ],
  "postRef": {
    "cid": "bafyreidwwbxik4kzjfjjf3n5ee25dgl4cjk4pfqhaoxdga5se7o3qi3rsi",
    "commit": {
      "cid": "bafyreib2rp7qxzpx7gc7qjgjzugp2zd6yxmr3h5e3s2fzsqfcskopm5lmq",
      "rev": "3mckrijye7g2u"
    },
    "uri": "at://did:plc:llumonvbk6mrkn3myaxpnsje/app.bsky.feed.post/3mckrijwits2e",
    "validationStatus": "valid"
  },
  "publication": "at://did:plc:llumonvbk6mrkn3myaxpnsje/pub.leaflet.publication/3m2anfdxjyc2z",
  "publishedAt": "2026-01-16T18:53:23.262Z",
  "tags": [
    "gossip",
    "tea ",
    "opinion"
  ],
  "title": "The Sitcom Gods | When Desperate Deities Stew at Peace and Quiet"
}

did:plc:llumonvbk6mrkn3myaxpnsje | at://did:plc:llumonvbk6mrkn3myaxpnsje/pub.leaflet.document/3mckrhkwnlk2e

pub.leaflet.blocks.code (nested within pub.leaflet.document) (25 samples)
{
  "$type": "pub.leaflet.document",
  "author": "did:plc:by3jhwdqgbtrcc7q4tkkv3cf",
  "pages": [
    {
      "$type": "pub.leaflet.pages.linearDocument",
      "blocks": [
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.header",
            "facets": [],
            "level": 1,
            "plaintext": "Sort a 42 GB CSV quickly"
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [
              {
                "features": [
                  {
                    "$type": "pub.leaflet.richtext.facet#link",
                    "uri": "https://emojistats.bsky.sh"
                  }
                ],
                "index": {
                  "byteEnd": 99,
                  "byteStart": 35
                }
              },
              {
                "features": [
                  {
                    "$type": "pub.leaflet.richtext.facet#link",
                    "uri": "https://www.timescale.com/"
                  }
                ],
                "index": {
                  "byteEnd": 207,
                  "byteStart": 198
                }
              }
            ],
            "plaintext": "Say you're, I don't know, building a website that shows the most popular emojis on Bluesky realtime. Further assume that you want to move the MVP architecture that's mostly just Redis to Postgres + Timescale which unlocks a lot of potential for resilience and features."
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [
              {
                "features": [
                  {
                    "$type": "pub.leaflet.richtext.facet#link",
                    "uri": "https://docs.timescale.com/use-timescale/latest/hypertables/"
                  }
                ],
                "index": {
                  "byteEnd": 119,
                  "byteStart": 109
                }
              }
            ],
            "plaintext": "Of course, you want to validate and test your architecture, and for that, you create a bunch of mock data, a hypertable of about 550m emojis, which is about 5x more than what's currently on Bluesky. You gather two days' worth of of data from the firehose, then run"
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.code",
            "language": "sql",
            "plaintext": "BEGIN;\nINSERT INTO emojis\nSELECT * FROM emojis;\nCOMMIT;"
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": "on repeat until you have enough test data."
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": "And for something quick and dirty, this does the job. But oh! You're working with time series data. Bluesky has been around for two years, so it'd be worth stretching all this data out, time-wise, from 2 days to 2 years."
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": "So you dump your table in a CSV:"
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.code",
            "language": "sql",
            "plaintext": "COPY (SELECT * from emojis) TO '/path/to/emojis.csv' WITH (FORMAT CSV, DELIMITER ',', HEADER TRUE);"
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": "And now you have a file that looks something like this:"
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.code",
            "language": "csv",
            "plaintext": "$ head emojis.csv\ndid,rkey,emoji,lang,created_at\ndid:plc:pfgs64jdrbznui4qktarwvvz,3l7aowcsbgj23,🫶,en,2024-01-31T13:47:33Z\ndid:plc:4ojtgthev5iexawd7k63ri43,3l7aowe6e3x2z,💥,en,2024-06-06T21:18:01Z\ndid:plc:4ojtgthev5iexawd7k63ri43,3l7aowe6e3x2z,💥,en,2024-05-10T02:16:11Z\ndid:plc:4ojtgthev5iexawd7k63ri43,3l7aowe6e3x2z,💥,en,2023-06-19T16:46:21Z\ndid:plc:oemwnvl3bdhbglqsu4vtutg4,3l7aowe6tvz2y,⁉️,ja,2024-03-17T23:13:22Z\ndid:plc:enbbvjkhuzg3bzmlxjjdko2a,3l7aowejtcc24,🥶,en,2024-05-16T03:36:28Z\ndid:plc:sdx2znbevuvup2osq5ng24yf,3l7aowd44ts2a,✌️,ja,2022-12-22T10:52:09Z\ndid:plc:yfozqgqtw7shp23rgj2lb57o,3l7aowf2mqv27,🥰,es,2024-10-14T02:14:23Z\ndid:plc:yfcrcqqhqzt7h6aikn4ehypj,3l7aowfa3tk2j,😵‍💫,zh,2023-04-04T10:53:03Z"
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": "Now, how do you stretch this out to two years? You ask o1-mini to write a Go program that does it as fast as possible for you."
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.code",
            "language": "go",
            "plaintext": "package main\n\nimport (\n\t\"bufio\"\n\t\"encoding/csv\"\n\t\"fmt\"\n\t\"io\"\n\t\"log\"\n\t\"math/rand\"\n\t\"os\"\n\t\"runtime\"\n\t\"strconv\"\n\t\"strings\"\n\t\"sync\"\n\t\"time\"\n)\n\n// Configuration Constants\nconst (\n\tINPUT_CSV         = \"/path/to/emojis_dump.csv\"     // Path to the exported CSV\n\tOUTPUT_CSV        = \"/path/to/emojis_modified.csv\" // Path for the modified CSV\n\tNUM_WORKERS       = 8                                      // Number of concurrent worker goroutines\n\tCHANNEL_BUFFER    = 10000                                  // Buffer size for channels\n\tPROGRESS_INTERVAL = 1000000                                // Log progress every 1,000,000 records\n)\n\n// Record represents a single CSV record\ntype Record struct {\n\tFields []string\n\tLine   int // Line number for logging purposes\n}\n\n// ProcessedRecord represents a processed CSV record ready to be written\ntype ProcessedRecord struct {\n\tFields []string\n\tLine   int // Line number for logging purposes\n}\n\nfunc main() {\n\tstartTime := time.Now()\n\tfmt.Println(\"Starting processing...\")\n\n\t// Ensure output directory exists\n\toutputDir := \"/path/to/tmp/\" // Adjust based on OUTPUT_CSV path\n\tif err := os.MkdirAll(outputDir, os.ModePerm); err != nil {\n\t\tlog.Fatalf(\"Error creating output directory: %v\", err)\n\t}\n\n\t// Open input CSV file\n\tinputFile, err := os.Open(INPUT_CSV)\n\tif err != nil {\n\t\tlog.Fatalf(\"Error opening input CSV file: %v\", err)\n\t}\n\tdefer inputFile.Close()\n\n\t// Create output CSV file\n\toutputFile, err := os.Create(OUTPUT_CSV)\n\tif err != nil {\n\t\tlog.Fatalf(\"Error creating output CSV file: %v\", err)\n\t}\n\tdefer outputFile.Close()\n\n\t// Initialize CSV reader and writer with buffered I/O\n\treader := csv.NewReader(bufio.NewReaderSize(inputFile, 16*1024*1024))  // 10MB buffer\n\twriter := csv.NewWriter(bufio.NewWriterSize(outputFile, 16*1024*1024)) // 10MB buffer\n\n\t// Read header\n\theader, err := reader.Read()\n\tif err != nil {\n\t\tlog.Fatalf(\"Error reading CSV header: %v\", err)\n\t}\n\n\t// Identify the index of 'created_at' column\n\tcreatedAtIdx := -1\n\tfor idx, col := range header {\n\t\tif strings.TrimSpace(col) == \"created_at\" {\n\t\t\tcreatedAtIdx = idx\n\t\t\tbreak\n\t\t}\n\t}\n\tif createdAtIdx == -1 {\n\t\tlog.Fatalf(\"'created_at' column not found in CSV header.\")\n\t}\n\n\t// Write header to output CSV\n\tif err := writer.Write(header); err != nil {\n\t\tlog.Fatalf(\"Error writing header to output CSV: %v\", err)\n\t}\n\twriter.Flush()\n\n\t// Channels for pipeline\n\trecordChan := make(chan Record, CHANNEL_BUFFER)\n\tprocessedChan := make(chan ProcessedRecord, CHANNEL_BUFFER)\n\n\t// WaitGroups to synchronize goroutines\n\tvar wgWorkers sync.WaitGroup\n\tvar wgWriter sync.WaitGroup\n\n\t// Start worker goroutines\n\tfor i := 0; i < NUM_WORKERS; i++ {\n\t\twgWorkers.Add(1)\n\t\tgo worker(&wgWorkers, recordChan, processedChan, createdAtIdx, len(header))\n\t}\n\n\t// Start writer goroutine\n\twgWriter.Add(1)\n\tgo writerGoroutine(&wgWriter, writer, processedChan)\n\n\t// Read and dispatch records\n\tlineNumber := 1 // Starting after header\n\tfor {\n\t\trecordFields, err := reader.Read()\n\t\tif err == io.EOF {\n\t\t\tbreak\n\t\t}\n\t\tif err != nil {\n\t\t\tlog.Printf(\"Error reading record at line %d: %v\", lineNumber+1, err)\n\t\t\tcontinue\n\t\t}\n\n\t\trec := Record{\n\t\t\tFields: recordFields,\n\t\t\tLine:   lineNumber + 1,\n\t\t}\n\n\t\trecordChan <- rec\n\t\tlineNumber++\n\n\t\t// Optional: Implement early termination or error handling if needed\n\t}\n\n\t// Close the record channel to signal workers no more records are coming\n\tclose(recordChan)\n\n\t// Wait for all workers to finish processing\n\twgWorkers.Wait()\n\n\t// Close the processed channel to signal writer no more records are coming\n\tclose(processedChan)\n\n\t// Wait for writer to finish\n\twgWriter.Wait()\n\n\t// Flush any remaining data in the writer buffer\n\twriter.Flush()\n\tif err := writer.Error(); err != nil {\n\t\tlog.Fatalf(\"Error flushing writer: %v\", err)\n\t}\n\n\tendTime := time.Now()\n\telapsed := endTime.Sub(startTime)\n\tfmt.Printf(\"Processing completed in %s.\\n\", elapsed)\n}\n\n// worker processes records: updates 'created_at' with a random timestamp\nfunc worker(wg *sync.WaitGroup, recordChan <-chan Record, processedChan chan<- ProcessedRecord, createdAtIdx int, expectedFields int) {\n\tdefer wg.Done()\n\n\t// Initialize a new rand.Rand instance with a unique seed to avoid race conditions\n\tr := rand.New(rand.NewSource(time.Now().UnixNano() + int64(rand.Intn(1000)))) // Adding randomness to the seed\n\n\t// Calculate time range for random timestamp\n\tnow := time.Now().UTC()\n\tstartTime := now.AddDate(-2, 0, 0).Unix()\n\tendTime := now.Unix()\n\n\t// Initialize local counters\n\tlocalCount := 0\n\n\tfor rec := range recordChan {\n\t\t// Validate field count\n\t\tif len(rec.Fields) != expectedFields {\n\t\t\tlog.Printf(\"Warning: Record at line %d has %d fields; expected %d. Skipping.\", rec.Line, len(rec.Fields), expectedFields)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Parse and replace 'created_at' field\n\t\tnewTimestamp := randomTimestamp(r, startTime, endTime)\n\t\trec.Fields[createdAtIdx] = newTimestamp\n\n\t\t// Send the processed record to the writer\n\t\tprocessedChan <- ProcessedRecord{\n\t\t\tFields: rec.Fields,\n\t\t\tLine:   rec.Line,\n\t\t}\n\n\t\tlocalCount++\n\t\tif localCount%PROGRESS_INTERVAL == 0 {\n\t\t\tlog.Printf(\"[Worker %d] Processed %d records.\", getGID(), localCount)\n\t\t}\n\t}\n}\n\n// writerGoroutine writes processed records to the output CSV\nfunc writerGoroutine(wg *sync.WaitGroup, writer *csv.Writer, processedChan <-chan ProcessedRecord) {\n\tdefer wg.Done()\n\n\ttotalWritten := 0\n\n\tfor procRec := range processedChan {\n\t\tif err := writer.Write(procRec.Fields); err != nil {\n\t\t\tlog.Printf(\"Error writing record at line %d: %v\", procRec.Line, err)\n\t\t\tcontinue\n\t\t}\n\t\ttotalWritten++\n\n\t\t// Flush periodically to ensure data is written to disk\n\t\tif totalWritten%1000000 == 0 {\n\t\t\twriter.Flush()\n\t\t\tif err := writer.Error(); err != nil {\n\t\t\t\tlog.Printf(\"Error flushing writer at record %d: %v\", totalWritten, err)\n\t\t\t}\n\t\t\tlog.Printf(\"[Writer] Written %d records.\", totalWritten)\n\t\t}\n\t}\n\n\t// Final flush\n\twriter.Flush()\n\tif err := writer.Error(); err != nil {\n\t\tlog.Printf(\"Error during final flush: %v\", err)\n\t}\n\tlog.Printf(\"[Writer] Completed writing %d records.\", totalWritten)\n}\n\n// randomTimestamp generates a random ISO8601 timestamp between start and end Unix timestamps\nfunc randomTimestamp(r *rand.Rand, start, end int64) string {\n\trandSec := r.Int63n(end-start+1) + start\n\trandomTime := time.Unix(randSec, 0).UTC()\n\treturn randomTime.Format(time.RFC3339)\n}\n\n// getGID returns the goroutine ID for logging purposes\nfunc getGID() int {\n\t// WARNING: This uses a hack to get goroutine ID and is not recommended for production use\n\t// It's used here solely for logging purposes as per the user's request\n\tvar buf [64]byte\n\tn := runtime.Stack(buf[:], false)\n\tstack := strings.TrimPrefix(string(buf[:n]), \"goroutine \")\n\tidField := strings.Fields(stack)[0]\n\tid, err := strconv.Atoi(idField)\n\tif err != nil {\n\t\treturn 0\n\t}\n\treturn id\n}"
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [
              {
                "features": [
                  {
                    "$type": "pub.leaflet.richtext.facet#code"
                  }
                ],
                "index": {
                  "byteEnd": 53,
                  "byteStart": 49
                }
              }
            ],
            "plaintext": "Now you have the right data, but when you try to COPY it back, it goes very slowly and you realize that this is the worst possible thing you can do to a time-series database: filling it up with completely random data, time-wise. A good way to make this a lot less bad is to sort the whole thing ascending by date, making it optimal for importing."
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": "For this, we'll ~~ask o1-mini to write another go program that will take several hours to complete haha who would do that the first time not me~~ use GNU sort:"
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.code",
            "language": "bash",
            "plaintext": "LC_ALL=C tail -n +2 emojis_modified.csv | gsort -t',' -k5,5 --parallel=$(nproc) --buffer-size=16G --temporary-directory=/path/to/tmp > sorted_emojis_modified.csv"
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": "This took a little over 49 minutes on my M1 Pro MBP, which is pretty damn good."
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": "After which importing was a breeze, somewhere in the ballpark of 20-25 minutes:"
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.code",
            "language": "sql",
            "plaintext": "COPY emojis_new FROM '/path/to/sorted_emojis_modified.csv' WITH (FORMAT CSV, DELIMITER ',', HEADER FALSE);"
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [],
            "plaintext": "And there! Two years of test data, ready for benchmarking."
          }
        }
      ]
    }
  ],
  "publication": "at://did:plc:by3jhwdqgbtrcc7q4tkkv3cf/pub.leaflet.publication/3lpqyl2axis2y",
  "title": "Sort a 42 GB CSV quickly"
}

did:plc:by3jhwdqgbtrcc7q4tkkv3cf | at://did:plc:by3jhwdqgbtrcc7q4tkkv3cf/pub.leaflet.document/3muoxsdg56r3p

pub.leaflet.blocks.header (nested within pub.leaflet.document) (100 samples)
{
  "$type": "pub.leaflet.document",
  "author": "did:plc:5qpp5odgl345akjumlmbq6u3",
  "description": "When you finance a car, the dealer's first question is usually \"what monthly payment are you comfortable with?\" It sounds helpful, but it's the wrong place to start. Almost any car can be made to fit almost any monthly budget by stretching the loan over more years, and that stret",
  "pages": [
    {
      "$type": "pub.leaflet.pages.linearDocument",
      "blocks": [
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "When you finance a car, the dealer's first question is usually \"what monthly payment are you comfortable with?\" It sounds helpful, but it's the wrong place to start. Almost any car can be made to fit almost any monthly budget by stretching the loan over more years, and that stretch is where the real cost hides. Understanding three numbers, the amount borrowed, the APR and the term, lets you see the whole picture."
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.header",
            "level": 2,
            "plaintext": "The three numbers that matter"
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.unorderedList",
            "children": [
              {
                "$type": "pub.leaflet.blocks.unorderedList#listItem",
                "content": {
                  "$type": "pub.leaflet.blocks.text",
                  "facets": [
                    {
                      "$type": "pub.leaflet.richtext.facet",
                      "features": [
                        {
                          "$type": "pub.leaflet.richtext.facet#bold"
                        }
                      ],
                      "index": {
                        "byteEnd": 16,
                        "byteStart": 0
                      }
                    }
                  ],
                  "plaintext": "Amount financed: the price of the car plus any taxes, fees and add-ons you roll into the loan, minus your down payment and any trade-in value."
                }
              },
              {
                "$type": "pub.leaflet.blocks.unorderedList#listItem",
                "content": {
                  "$type": "pub.leaflet.blocks.text",
                  "facets": [
                    {
                      "$type": "pub.leaflet.richtext.facet",
                      "features": [
                        {
                          "$type": "pub.leaflet.richtext.facet#bold"
                        }
                      ],
                      "index": {
                        "byteEnd": 29,
                        "byteStart": 0
                      }
                    }
                  ],
                  "plaintext": "APR (annual percentage rate): the yearly cost of borrowing, including interest and certain fees, expressed as a percentage. It's the fairest way to compare offers."
                }
              },
              {
                "$type": "pub.leaflet.blocks.unorderedList#listItem",
                "content": {
                  "$type": "pub.leaflet.blocks.text",
                  "facets": [
                    {
                      "$type": "pub.leaflet.richtext.facet",
                      "features": [
                        {
                          "$type": "pub.leaflet.richtext.facet#bold"
                        }
                      ],
                      "index": {
                        "byteEnd": 5,
                        "byteStart": 0
                      }
                    }
                  ],
                  "plaintext": "Term: how many months you'll be paying. Common terms run from 36 to 72 months, and 84-month loans are increasingly offered."
                }
              }
            ]
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "The monthly payment is simply the result of those three. Change any one and the payment changes."
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.header",
            "level": 2,
            "plaintext": "How the payment is calculated"
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "Most car loans are simple-interest, fixed-rate loans repaid in equal monthly instalments. The payment uses the same formula as a mortgage:"
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "Payment = P × r × (1 + r)ⁿ ÷ ((1 + r)ⁿ − 1)"
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "where P is the amount financed, r is the monthly rate (APR ÷ 12, as a decimal) and n is the number of months."
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "Take a $25,000 loan at 7% APR. The monthly rate is 0.07 ÷ 12 ≈ 0.005833."
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.unorderedList",
            "children": [
              {
                "$type": "pub.leaflet.blocks.unorderedList#listItem",
                "content": {
                  "$type": "pub.leaflet.blocks.text",
                  "facets": [
                    {
                      "$type": "pub.leaflet.richtext.facet",
                      "features": [
                        {
                          "$type": "pub.leaflet.richtext.facet#bold"
                        }
                      ],
                      "index": {
                        "byteEnd": 10,
                        "byteStart": 0
                      }
                    },
                    {
                      "$type": "pub.leaflet.richtext.facet",
                      "features": [
                        {
                          "$type": "pub.leaflet.richtext.facet#bold"
                        }
                      ],
                      "index": {
                        "byteEnd": 24,
                        "byteStart": 17
                      }
                    }
                  ],
                  "plaintext": "48 months: about $598.66 a month. Total repaid: about $28,735, so roughly $3,735 in interest."
                }
              },
              {
                "$type": "pub.leaflet.blocks.unorderedList#listItem",
                "content": {
                  "$type": "pub.leaflet.blocks.text",
                  "facets": [
                    {
                      "$type": "pub.leaflet.richtext.facet",
                      "features": [
                        {
                          "$type": "pub.leaflet.richtext.facet#bold"
                        }
                      ],
                      "index": {
                        "byteEnd": 10,
                        "byteStart": 0
                      }
                    },
                    {
                      "$type": "pub.leaflet.richtext.facet",
                      "features": [
                        {
                          "$type": "pub.leaflet.richtext.facet#bold"
                        }
                      ],
                      "index": {
                        "byteEnd": 24,
                        "byteStart": 17
                      }
                    }
                  ],
                  "plaintext": "60 months: about $495.03 a month. Total: about $29,702, or $4,702 in interest."
                }
              },
              {
                "$type": "pub.leaflet.blocks.unorderedList#listItem",
                "content": {
                  "$type": "pub.leaflet.blocks.text",
                  "facets": [
                    {
                      "$type": "pub.leaflet.richtext.facet",
                      "features": [
                        {
                          "$type": "pub.leaflet.richtext.facet#bold"
                        }
                      ],
                      "index": {
                        "byteEnd": 10,
                        "byteStart": 0
                      }
                    },
                    {
                      "$type": "pub.leaflet.richtext.facet",
                      "features": [
                        {
                          "$type": "pub.leaflet.richtext.facet#bold"
                        }
                      ],
                      "index": {
                        "byteEnd": 24,
                        "byteStart": 17
                      }
                    }
                  ],
                  "plaintext": "72 months: about $426.23 a month. Total: about $30,688, or $5,688 in interest."
                }
              }
            ]
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "Going from 48 to 72 months cuts the payment by more than $170, which feels like a big win. But it adds almost $2,000 in interest, and you're making payments for two extra years."
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.header",
            "level": 2,
            "plaintext": "Why early payments are mostly interest"
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "Each month, interest is charged on the remaining balance. At the start, the balance is at its highest, so a bigger share of each payment goes to interest and a smaller share reduces what you owe. In the 60-month example, the first month's interest is about $146 of the $495 payment. By the final year, almost all of each payment goes to principal."
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "This matters if you might sell or trade in the car early. On a long loan, the balance falls slowly while the car loses value quickly, and it's easy to end up owing more than the car is worth. That's called negative equity, and it often gets rolled into the next loan, making it more expensive still."
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.header",
            "level": 2,
            "plaintext": "What pushes the APR up or down"
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.unorderedList",
            "children": [
              {
                "$type": "pub.leaflet.blocks.unorderedList#listItem",
                "content": {
                  "$type": "pub.leaflet.blocks.text",
                  "facets": [
                    {
                      "$type": "pub.leaflet.richtext.facet",
                      "features": [
                        {
                          "$type": "pub.leaflet.richtext.facet#bold"
                        }
                      ],
                      "index": {
                        "byteEnd": 13,
                        "byteStart": 0
                      }
                    }
                  ],
                  "plaintext": "Credit score: the biggest single factor. Borrowers with strong credit are offered much lower rates."
                }
              },
              {
                "$type": "pub.leaflet.blocks.unorderedList#listItem",
                "content": {
                  "$type": "pub.leaflet.blocks.text",
                  "facets": [
                    {
                      "$type": "pub.leaflet.richtext.facet",
                      "features": [
                        {
                          "$type": "pub.leaflet.richtext.facet#bold"
                        }
                      ],
                      "index": {
                        "byteEnd": 12,
                        "byteStart": 0
                      }
                    }
                  ],
                  "plaintext": "New vs used: used-car loans usually carry higher rates."
                }
              },
              {
                "$type": "pub.leaflet.blocks.unorderedList#listItem",
                "content": {
                  "$type": "pub.leaflet.blocks.text",
                  "facets": [
                    {
                      "$type": "pub.leaflet.richtext.facet",
                      "features": [
                        {
                          "$type": "pub.leaflet.richtext.facet#bold"
                        }
                      ],
                      "index": {
                        "byteEnd": 5,
                        "byteStart": 0
                      }
                    }
                  ],
                  "plaintext": "Term: longer loans often come with higher APRs as well as more months of interest."
                }
              },
              {
                "$type": "pub.leaflet.blocks.unorderedList#listItem",
                "content": {
                  "$type": "pub.leaflet.blocks.text",
                  "facets": [
                    {
                      "$type": "pub.leaflet.richtext.facet",
                      "features": [
                        {
                          "$type": "pub.leaflet.richtext.facet#bold"
                        }
                      ],
                      "index": {
                        "byteEnd": 17,
                        "byteStart": 0
                      }
                    }
                  ],
                  "plaintext": "Where you borrow: banks, credit unions and dealer finance can quote very different rates for the same person. Getting pre-approved before visiting a dealer gives you a benchmark."
                }
              }
            ]
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.header",
            "level": 2,
            "plaintext": "Try different scenarios"
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "facets": [
              {
                "$type": "pub.leaflet.richtext.facet",
                "features": [
                  {
                    "$type": "pub.leaflet.richtext.facet#link",
                    "uri": "https://www.quickcalculators.org/finance-calculators/auto-loan-calculator/"
                  }
                ],
                "index": {
                  "byteEnd": 128,
                  "byteStart": 108
                }
              }
            ],
            "plaintext": "Before signing anything, run the numbers for several combinations of price, down payment, rate and term. An Auto Loan Calculator shows the monthly payment, total interest and full repayment schedule side by side, which makes it obvious how much a longer term or a slightly higher rate really costs. Compare the total repaid, not just the monthly figure."
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.header",
            "level": 2,
            "plaintext": "Watch the extras"
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "Add-ons such as extended warranties, paint protection, GAP insurance and service plans are often rolled into the loan, which means you pay interest on them for years. Some can be worthwhile, but decide on each one separately, and ask for the price with and without it. Also check for early repayment fees before you sign; being able to pay the loan off early is valuable."
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.header",
            "level": 2,
            "plaintext": "A simple plan"
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.orderedList",
            "children": [
              {
                "$type": "pub.leaflet.blocks.orderedList#listItem",
                "content": {
                  "$type": "pub.leaflet.blocks.text",
                  "plaintext": "Decide on a total budget for the car, not a monthly payment."
                }
              },
              {
                "$type": "pub.leaflet.blocks.orderedList#listItem",
                "content": {
                  "$type": "pub.leaflet.blocks.text",
                  "plaintext": "Get pre-approved to know your likely APR."
                }
              },
              {
                "$type": "pub.leaflet.blocks.orderedList#listItem",
                "content": {
                  "$type": "pub.leaflet.blocks.text",
                  "plaintext": "Put down as large a deposit as you comfortably can."
                }
              },
              {
                "$type": "pub.leaflet.blocks.orderedList#listItem",
                "content": {
                  "$type": "pub.leaflet.blocks.text",
                  "plaintext": "Choose the shortest term whose payment fits your budget."
                }
              },
              {
                "$type": "pub.leaflet.blocks.orderedList#listItem",
                "content": {
                  "$type": "pub.leaflet.blocks.text",
                  "plaintext": "Compare total cost across offers before agreeing."
                }
              }
            ]
          }
        },
        {
          "$type": "pub.leaflet.pages.linearDocument#block",
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "The cheapest car loan isn't the one with the lowest monthly payment. It's the one where you pay the least in total for a car you can comfortably afford."
          }
        }
      ]
    }
  ],
  "publishedAt": "2026-09-28T04:16:42.000Z",
  "tags": [
    "personal finance",
    "car loans",
    "budgeting",
    "interest"
  ],
  "title": "How Car Loan Interest Works: APR, Term and the True Cost of Financing"
}

did:plc:5qpp5odgl345akjumlmbq6u3 | at://did:plc:5qpp5odgl345akjumlmbq6u3/pub.leaflet.document/3mwkhepjzfbce

pub.leaflet.blocks.horizontalRule (nested within pub.leaflet.document) (74 samples)
{
  "$type": "pub.leaflet.document",
  "author": "did:plc:6dis2hlap2lhwohabb2tniln",
  "description": "Practical rule: If you cannot explain what a bot is allowed to do, where it may operate, how fast it may act, and when it must stop, it is not ready to run unattended.",
  "pages": [
    {
      "$type": "pub.leaflet.pages.linearDocument",
      "blocks": [
        {
          "block": {
            "$type": "pub.leaflet.blocks.blockquote",
            "plaintext": "Practical rule: If you cannot explain what a bot is allowed to do, where it may operate, how fast it may act, and when it must stop, it is not ready to run unattended."
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.unorderedList",
            "children": [
              {
                "content": {
                  "$type": "pub.leaflet.blocks.text",
                  "plaintext": "Attribution: You can connect a placement batch to a target page, source, anchor group, and time period. If referral traffic or conversions change, the campaign has a traceable history."
                }
              },
              {
                "content": {
                  "$type": "pub.leaflet.blocks.text",
                  "plaintext": "Risk containment: A poor source list or faulty rule affects a limited batch instead of the whole operation. Pausing one campaign does not have to interrupt unrelated client or product work."
                }
              },
              {
                "content": {
                  "$type": "pub.leaflet.blocks.text",
                  "plaintext": "Learning: You can compare placement quality before increasing volume, rather than guessing after a large automated run. Each batch becomes a controlled experiment."
                }
              }
            ]
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.unorderedList",
            "children": [
              {
                "content": {
                  "$type": "pub.leaflet.blocks.text",
                  "plaintext": "Controlled fan-out: Small batches, approved sources, capped actions, varied but intentional anchors, review gates, and reversible settings. Best when quality and accountability matter."
                }
              },
              {
                "content": {
                  "$type": "pub.leaflet.blocks.text",
                  "plaintext": "Uncapped bot: Unlimited or poorly defined expansion, minimal review, broad source discovery, and volume-led reporting. Tempting when the goal is a fast count, but difficult to govern and diagnose."
                }
              },
              {
                "content": {
                  "$type": "pub.leaflet.blocks.text",
                  "plaintext": "Hybrid workflow: Automation discovers, organizes, and prepares opportunities; a person approves sources and final placements. Best for teams that need efficiency without surrendering editorial control."
                }
              }
            ]
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.unorderedList",
            "children": [
              {
                "content": {
                  "$type": "pub.leaflet.blocks.text",
                  "plaintext": "Campaign cap: Set the maximum number of opportunities or placements for the campaign period. This prevents a successful-looking experiment from expanding indefinitely."
                }
              },
              {
                "content": {
                  "$type": "pub.leaflet.blocks.text",
                  "plaintext": "Source cap: Limit how many actions can come from one domain, publisher category, account, or content template. This reduces concentration and makes source quality easier to inspect."
                }
              },
              {
                "content": {
                  "$type": "pub.leaflet.blocks.text",
                  "plaintext": "Target cap: Control how many links point to one URL and how quickly a new page receives attention. Important commercial pages should not absorb every available placement."
                }
              },
              {
                "content": {
                  "$type": "pub.leaflet.blocks.text",
                  "plaintext": "Anchor cap: Define approved brand, URL, topical, and descriptive anchor groups. Keep exact-match commercial phrases limited and never let a bot invent anchors without review."
                }
              },
              {
                "content": {
                  "$type": "pub.leaflet.blocks.text",
                  "plaintext": "Time cap: Use a schedule with pauses between batches. Spacing is not a guarantee of natural behavior, but it gives your team time to detect errors before the next run."
                }
              }
            ]
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.unorderedList",
            "children": [
              {
                "content": {
                  "$type": "pub.leaflet.blocks.text",
                  "plaintext": "Starting with the maximum volume: A large first run hides quality problems. Begin with a batch small enough to inspect completely and expand only after the failure rate and source quality are understood."
                }
              },
              {
                "content": {
                  "$type": "pub.leaflet.blocks.text",
                  "plaintext": "Using one anchor pattern everywhere: Anchor variation should follow editorial relevance, not a randomizer or a single commercial phrase. Brand and descriptive wording may be more appropriate than forcing a target keyword."
                }
              },
              {
                "content": {
                  "$type": "pub.leaflet.blocks.text",
                  "plaintext": "Measuring only placement count: Count approved, relevant placements separately from attempted submissions or generated prospects. A completed action is not automatically a useful outcome."
                }
              },
              {
                "content": {
                  "$type": "pub.leaflet.blocks.text",
                  "plaintext": "Ignoring source concentration: A campaign can look broad while most activity comes from a small group of related domains or templates. Review the distribution, not just the total."
                }
              },
              {
                "content": {
                  "$type": "pub.leaflet.blocks.text",
                  "plaintext": "Letting automation invent claims: Require fact checks and approval for product descriptions, statistics, guarantees, and regulated topics. A polished sentence can still be inaccurate or misleading."
                }
              },
              {
                "content": {
                  "$type": "pub.leaflet.blocks.text",
                  "plaintext": "Leaving billing open-ended: A software subscription or service account should have an owner, renewal review, and a payment limit appropriate to the work. Unused accounts should be paused or canceled."
                }
              },
              {
                "content": {
                  "$type": "pub.leaflet.blocks.text",
                  "plaintext": "Failing to preserve evidence: Keep campaign settings, approvals, published URLs, and change history so you can audit or explain the work later. This is especially important when several clients or contractors share a workflow."
                }
              },
              {
                "content": {
                  "$type": "pub.leaflet.blocks.text",
                  "plaintext": "Confusing pauses with reversals: Stopping new placements does not remove existing ones or correct inaccurate content. Define how the team handles takedown requests, broken links, outdated claims, and source exclusions."
                }
              }
            ]
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.orderedList",
            "children": [
              {
                "content": {
                  "$type": "pub.leaflet.blocks.text",
                  "plaintext": "Define one business objective: Choose qualified referral traffic, brand discovery, support for a specific content cluster, or another measurable outcome. Write down what evidence would justify continuing."
                }
              },
              {
                "content": {
                  "$type": "pub.leaflet.blocks.text",
                  "plaintext": "Approve the source set: Remove irrelevant, deceptive, inaccessible, or policy-conflicting sources before automation begins. Keep a reason for each exclusion so the same problem does not return later."
                }
              },
              {
                "content": {
                  "$type": "pub.leaflet.blocks.text",
                  "plaintext": "Map target URLs: Assign each source opportunity to a page and record why that destination is appropriate. Check that the page is live, useful, and aligned with the proposed context."
                }
              },
              {
                "content": {
                  "$type": "pub.leaflet.blocks.text",
                  "plaintext": "Set four caps: Document campaign, source, target, and anchor limits, plus a schedule and a hard stop date. Add a budget ceiling and a rule for who can authorize an increase."
                }
              },
              {
                "content": {
                  "$type": "pub.leaflet.blocks.text",
                  "plaintext": "Prepare content rules: Specify required facts, tone, disclosure, linking context, prohibited claims, and who approves publication. Do not allow generated copy to invent product capabilities or customer evidence."
                }
              },
              {
                "content": {
                  "$type": "pub.leaflet.blocks.text",
                  "plaintext": "Separate budgets: Use project-level accounting and, where appropriate, a dedicated payment method or controlled reloadable budget that cannot silently draw from unrelated funds."
                }
              },
              {
                "content": {
                  "$type": "pub.leaflet.blocks.text",
                  "plaintext": "Schedule the review: Decide who checks the first batch, what triggers a pause, and how results will be reported to stakeholders. Put the review appointment on the calendar before launching."
                }
              }
            ]
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.header",
            "level": 2,
            "plaintext": "Why controlled fan-out beats uncapped automation"
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.header",
            "level": 2,
            "plaintext": "What an uncapped bot gets wrong about scale"
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.header",
            "level": 2,
            "plaintext": "Use a simple decision framework before increasing volume"
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.header",
            "level": 2,
            "plaintext": "Design the fan-out limits at four levels"
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.header",
            "level": 2,
            "plaintext": "Build a review loop that catches problems early"
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.header",
            "level": 2,
            "plaintext": "Choose tools that support limits, not just output"
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.header",
            "level": 2,
            "plaintext": "Follow this controlled-fan-out checklist"
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.header",
            "level": 2,
            "plaintext": "Avoid these common automation mistakes"
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.header",
            "level": 2,
            "plaintext": "FAQ: controlled fan-out and uncapped bots"
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.header",
            "level": 3,
            "plaintext": "Is controlled fan-out just slower link building?"
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.header",
            "level": 3,
            "plaintext": "How many backlinks should an automated campaign create?"
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.header",
            "level": 3,
            "plaintext": "Can an automated backlink placer publish without human approval?"
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.header",
            "level": 3,
            "plaintext": "Should agencies give every client the same fan-out settings?"
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.header",
            "level": 3,
            "plaintext": "Can a virtual card prevent backlink campaign problems?"
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.header",
            "level": 2,
            "plaintext": "Your next seven days to a safer rollout"
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "The safer way to scale an automated backlink placer (https://linkpilot-ai.ramerlabs.com/) is controlled fan-out: define how many placements each source can generate, cap the daily and weekly pace, review quality signals, and expand only when results remain stable. Uncapped bots optimize for volume, not durable visibility. They can create duplicate patterns, place links on irrelevant pages, exhaust budgets, and make it difficult to identify which campaign caused a problem."
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "Controlled fan-out does not mean abandoning automation. It means turning automation into a measured production system. Start with a small group of approved targets, use explicit limits for domains and anchors, separate experiments from core campaigns, and keep a pause mechanism for both links and payment sources. The objective is not to create the largest possible backlink footprint. It is to produce relevant, reviewable placements at a pace your site, team, and budget can responsibly support."
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "For example, an agency launching a campaign for a software client might begin with a limited group of industry publications, partner resources, and genuinely relevant community pages. It can then compare accepted placements, referral visits, topical fit, and client feedback before adding more sources. That is more informative than sending the same asset to every available destination and discovering weeks later that most outputs were duplicated, irrelevant, or impossible to audit."
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "Fan-out describes how one campaign, target URL, or source account expands into multiple backlink placements. A narrow fan-out might send one article or outreach asset to a small set of highly relevant websites. A broad fan-out might distribute many variations across directories, blogs, profiles, and partner pages. The more aggressively the system expands, the more important it becomes to control inputs and inspect outputs."
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "Uncapped bots commonly fail in predictable ways. They may repeat the same anchor text, publish near-identical content, target sites with weak topical relevance, or keep spending after a campaign has stopped producing useful discoveries. Even when every individual placement looks acceptable, the aggregate pattern can appear manufactured or low quality. A failure in a template, source filter, or API connection can multiply across hundreds of actions before anyone notices."
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "Controlled fan-out provides three operational advantages:"
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "This approach also makes billing easier to manage. If software, domains, content services, or subscriptions are paid through separate virtual cards, spending limits can mirror campaign limits. A payment control is not a substitute for compliance or quality review, but it can prevent an unattended process from consuming an open-ended budget. It also makes reconciliation easier when an agency needs to explain which client or project paid for a particular service."
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "Controlled fan-out is not automatically good simply because it is limited. A small number of irrelevant or deceptive placements is still a poor campaign. The control system must therefore include source standards, approval rules, monitoring, and a clear definition of success."
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "Uncapped automation treats more outputs as the primary success metric. That is a weak assumption for link building because the value of a placement depends on relevance, editorial context, indexability, destination quality, and the surrounding link profile. Ten poorly matched links can be less useful than one relevant mention that sends qualified visitors and supports a clear topic."
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "The first problem is quality dilution. As a system exhausts its best sources, it tends to move toward weaker ones unless the source pool is refreshed and scored. The second is pattern concentration. Identical anchors, repeated templates, and synchronized publication dates can make a campaign look mechanical. The third is operational opacity. When thousands of actions happen without a batch structure, it becomes difficult to determine which sources should be retained, excluded, or reviewed."
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "There is also a strategic problem: uncapped bots can make teams optimize for a dashboard number instead of an audience. A campaign may report hundreds of completed submissions while producing no useful referral traffic, no qualified leads, and no meaningful relationships with publishers. If the reporting system counts attempted actions and approved placements together, the apparent performance can be especially misleading."
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "There are legitimate reasons not to automate a particular task. Do not use a bot to impersonate editors, bypass access controls, fabricate endorsements, submit deceptive testimonials, or violate a publisher's terms. Automation should handle repeatable, authorized work such as prospect organization, status updates, approved content workflows, and reporting. Human judgment remains necessary for relevance, consent, editorial standards, and exceptions."
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "A useful example is a product comparison campaign. Automation may collect suitable comparison pages and identify contact information, but a person should verify that the product is actually relevant, that the page accepts outside contributions, and that the proposed information is accurate. The system can reduce repetitive research without turning every discovered URL into an automatic publication target."
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "Choose controlled fan-out when the campaign has a defined audience, a vetted source list, measurable landing pages, and someone responsible for reviewing outputs. It is especially suitable for agencies managing multiple clients, e-commerce teams testing category pages, and SaaS companies building relationships in a narrow industry."
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "Consider broader automation only for low-risk internal work, such as deduplicating prospects, checking response statuses, assembling reports, or preparing drafts for human approval. Do not confuse a larger automation queue with permission to publish everywhere. The following comparison helps make the choice explicit:"
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "A useful go-or-no-go test is to score the campaign from zero to two on five dimensions: source relevance, authority or trust signals, anchor diversity, monitoring capability, and reversal capability. A low score on monitoring or reversal should block scale even if the source list looks strong. You should also document the reason for each target page. If nobody can say why a page deserves a link, the campaign is likely optimizing a proxy rather than a business outcome."
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "Use the framework in stages. If source relevance is high but monitoring is weak, improve reporting before increasing activity. If monitoring is strong but the target page is commercially aggressive and the content offers little value, revise the campaign concept. If the source list is small but excellent, keep the fan-out narrow rather than forcing it to support an arbitrary volume target."
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "For an agency, the decision should also account for client expectations. A client that values brand safety and editorial relationships may prefer ten carefully reviewed opportunities over a large automated report. A new e-commerce store may need broader discovery, but it still benefits from separate tests for category pages, buying guides, and brand assets instead of one uncapped stream aimed at every URL."
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "One global daily limit is not enough. A robust system applies caps at several levels so one bad rule cannot multiply across the entire operation. Limits should be written in the campaign brief and reviewed when the objective or source pool changes."
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "These caps work best when they are connected. Suppose a campaign has a reasonable overall limit but no source cap. One source category could still dominate the run. Similarly, a source cap does not protect a single target page if every approved domain points to the same commercial URL. The purpose of layered controls is to prevent concentration at the campaign, source, destination, and wording levels."
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "Include the allowed sources, excluded categories, target URLs, anchor rules, content requirements, approval owner, start date, stop date, and escalation path in the brief. If the system supports it, require a confirmation before a campaign changes from discovery to execution. Make the stop condition explicit: a spike in rejected placements, duplicate content, unexpected billing, or a policy complaint should pause the workflow automatically or trigger immediate human review."
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "Payment controls can reinforce these boundaries. For example, a dedicated reloadable vcc (https://linkpilot-ai.ramerlabs.com/reloadable-vcc) may help separate a test budget from core operating funds, subject to the issuer's terms and verification requirements. Set a balance or spending limit that reflects the approved batch, review transactions, and pause the card when the test ends. Do not use a card to conceal activity, evade platform restrictions, or bypass required identity checks."
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "A payment method should also have an owner and a reconciliation process. Record the service, campaign, billing period, approved amount, and renewal date. If a vendor charges by usage, keep enough balance for an approved run but avoid treating an open balance as permission to continue indefinitely. Financial separation is useful operational hygiene; it does not make unauthorized or low-quality activity acceptable."
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "Automation becomes safer when every batch produces a reviewable record. At minimum, log the source URL, referring domain, target URL, anchor, publication date, campaign identifier, approval status, and any payment or service reference needed for reconciliation. This makes it possible to remove weak placements from future consideration and explain results to a client."
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "Review samples rather than pretending every automated output receives equal attention. A practical process is to inspect every item in the first batch, a meaningful sample in the next few batches, and then maintain a recurring audit percentage. The exact sample should reflect risk, source quality, and client expectations. Higher-risk industries, new vendors, and unfamiliar publishers deserve more manual review."
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "Look for relevance before metrics. Ask whether the linking page serves a real audience that could reasonably benefit from the destination. Then check whether the page is accessible, coherent, not overloaded with unrelated outbound links, and consistent with the publisher's stated standards. A high authority score cannot make an irrelevant or deceptive placement appropriate."
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "Also review the destination experience. A link can be contextually relevant while pointing to a thin page, a broken URL, an outdated offer, or a page that does not answer the implied question. Before scaling, confirm that target pages load correctly, explain the topic clearly, and provide a reasonable next action. This protects the audience and improves the usefulness of the placement."
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "Track outcomes in three layers. Execution metrics show whether the system did what it was instructed to do. Quality metrics show whether the placements meet your standards. Business metrics show whether the work supports qualified traffic, assisted conversions, branded discovery, or another defined objective. This separation prevents a large number of completed actions from being mistaken for business value."
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "Give each layer a review cadence. Execution can be checked after every batch. Quality should be reviewed during the first several batches and at regular intervals afterward. Business outcomes may require a longer observation period, especially when the objective is awareness or content discovery. Avoid changing five variables at once; otherwise, you will not know whether a result came from the source category, destination page, content angle, or fan-out speed."
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "When evaluating an AI link building software (https://linkpilot-ai.ramerlabs.com/#features) workflow, ask how it handles source organization, campaign segmentation, approvals, reporting, and exclusions. A tool that only accelerates submission can increase the cost of mistakes. A useful system should make it easier to keep campaigns distinct, review records, and stop activity without hunting through multiple interfaces."
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "Teams should also distinguish between discovery automation and placement automation. Discovery can identify prospects, classify pages, and suggest angles. Placement involves public representation, editorial judgment, and often a publisher's permission. The latter deserves stricter controls and more human involvement. A system that labels both activities as the same type of “automation” can encourage teams to apply insufficient review to the higher-risk step."
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "For repeatable processes, compare the workflow described by automated link building software (https://linkpilot-ai.ramerlabs.com/#how) with your own approval requirements. Can you set limits per client? Can you export records? Can you exclude a domain permanently? Can you pause a run? Can you see what changed between batches? These questions are more important than a headline feature claiming unlimited scale."
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "Agencies need additional separation. A link building software for agencies (https://linkpilot-ai.ramerlabs.com/#pricing) setup should support client-level workspaces or at least clear project boundaries, permission control, and reports that do not mix one customer's sources with another's. If clients expect their own branding, investigate whether a white label link building software (https://linkpilot-ai.ramerlabs.com/#plan-features) option fits the agency's reporting process, while still keeping internal quality and compliance records available."
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "For operators who work primarily on a desktop, a Windows link building app (https://linkpilot-ai.ramerlabs.com/#download) may be convenient, but the platform choice should come after the process design. A desktop application cannot compensate for weak source standards, absent approval rules, or an uncapped budget. Confirm how data is stored, who can change settings, and whether your team can recover campaign records if a user leaves or a subscription changes."
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "Tool selection should therefore begin with a process map. Write down what happens from prospect discovery to approval, publication, monitoring, reporting, and billing reconciliation. Then identify which steps are repetitive and authorized. Automate those first. Keep decisions involving editorial fit, factual claims, permissions, and exceptions in a human-controlled queue until the process has demonstrated consistent quality."
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "Use this checklist before activating a new automated backlink campaign or increasing an existing one:"
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "Run the checklist with the person who owns the business outcome, not only the person operating the tool. A media buyer may understand spending controls while a content lead understands editorial risk. Combining both perspectives produces better limits than asking one operator to optimize every dimension alone."
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "Another common mistake is changing the campaign immediately after a disappointing result. First determine whether the problem came from source relevance, content quality, target-page fit, publication timing, tracking, or the underlying offer. A controlled system gives you enough records to diagnose the issue. An uncapped system often leaves only an inflated count and a long list of URLs."
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "It can be slower at the beginning because the first batches include more review. However, the goal is better learning per action, not simply fewer actions. Once a source category proves relevant and reliable, you can increase its cap while keeping other controls in place. This often reduces rework, cleanup, and wasted spend compared with an uncapped run that must later be audited from scratch. The process also gives clients clearer evidence for why a campaign should expand."
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "There is no universal safe number. Set the limit from your source capacity, content quality, target-page needs, review resources, and campaign objective. A new campaign should begin with a pilot batch that the team can inspect fully. Increase volume only after reviewing relevance, anchor distribution, publication quality, and business signals. Never use a competitor's apparent link count as an automatic quota. If the team cannot review the next batch properly, the next batch is too large."
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "It may be technically possible in some workflows, but unattended publication is rarely the best default for new sources or sensitive industries. Keep human approval for publisher selection, claims, editorial fit, disclosures, and exceptions. Automation can handle approved, repeatable steps after the rules are proven. Any workflow that impersonates a person, bypasses permission, or violates a publisher's terms should not be automated. A clear approval record is also valuable when a client asks how a placement was selected."
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "No. Settings should reflect the client's industry, brand risk, content maturity, source availability, and reporting requirements. A local service business, regulated provider, and fast-moving e-commerce store may need different source standards and review frequency. Agencies can use a common baseline policy, then create client-specific caps, exclusions, approval owners, and escalation rules rather than applying one universal bot configuration. Reuse the governance framework, not necessarily the same volume or source mix."
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "No. A virtual or reloadable card can help separate budgets, limit exposure, and simplify reconciliation, but it does not improve source quality or make prohibited activity acceptable. Use payment controls alongside campaign caps, approvals, and monitoring. Confirm that the card provider and merchant terms permit the intended use, complete required verification, and pause or close the funding source when the approved test or subscription ends. Treat payment controls as financial safeguards, not as a way to hide activity or bypass platform rules."
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "Day one: Write the campaign objective, target URLs, source criteria, and prohibited actions. Day two: Build a vetted source list and remove anything that lacks topical relevance or clear editorial fit. Day three: Configure campaign, source, target, anchor, time, and budget caps. Day four: Prepare content rules, approval ownership, and a reporting template."
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "Day five: Run a small pilot and inspect every output. Day six: Record failures, update exclusions, and compare execution, quality, and business metrics. Day seven: Decide whether to pause, revise, or expand one controlled segment. If you cannot identify the cause of a bad result, do not increase the fan-out yet. Scale the parts you can explain, review, and stop."
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "Before expanding, save the final campaign settings and note who approved the change. That simple record creates a baseline for the next test and prevents accidental drift. The best automation workflow is not the one that produces the most activity; it is the one that gives your team useful output, clear accountability, controlled spending, and a reliable way to stop when the evidence says to stop."
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "For related guides, start with AI link building software (https://linkpilot-ai.ramerlabs.com/#features), automated link building software (https://linkpilot-ai.ramerlabs.com/#how), link building software for agencies (https://linkpilot-ai.ramerlabs.com/#pricing) or browse more options at linkpilot-ai.ramerlabs.com (https://linkpilot-ai.ramerlabs.com)."
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.horizontalRule"
          }
        },
        {
          "block": {
            "$type": "pub.leaflet.blocks.text",
            "plaintext": "Published for vccbusiness.com (https://vccbusiness.com)"
          }
        }
      ]
    }
  ],
  "publishedAt": "2026-10-08T22:03:26.000Z",
  "tags": [
    "automated backlink placer",
    "controlled fan-out",
    "link building automation",
    "SEO operations",
    "backlink quality",
    "agency workflows",
    "payment controls"
  ],
  "title": "How to Scale an automated backlink placer With Controlled Fan-Out"
}

did:plc:6dis2hlap2lhwohabb2tniln | at://did:plc:6dis2hlap2lhwohabb2tniln/pub.leaflet.document/3mxfhnfkeeq24

Lexicon Garden

@