{
  "path": "/3m5twyks37c2p",
  "site": "at://did:plc:57od6g2ic3e3b3kauctjmo3k/site.standard.publication/3m5c6gbf36k2w",
  "$type": "site.standard.document",
  "title": "Week of 2025-11-10",
  "content": {
    "$type": "pub.leaflet.content",
    "pages": [
      {
        "$type": "pub.leaflet.pages.linearDocument",
        "blocks": [
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [],
              "plaintext": "Late fall and winter are a strange time of year. Despite the shorter days, my house actually gets more light. We have a north-facing window that's blocked by a tree for most of the year, but when the leaves fall, there's nothing left to stop the indirect sun."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [],
              "plaintext": "I suppose it helps with mitigating seasonal depression, but I do miss not getting stunlocked every morning..."
            }
          },
          {
            "$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.header",
              "level": 2,
              "facets": [],
              "plaintext": "Pickigus packagus, your registry is full of packages"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [
                {
                  "index": {
                    "byteEnd": 134,
                    "byteStart": 122
                  },
                  "features": [
                    {
                      "$type": "pub.leaflet.richtext.facet#italic"
                    }
                  ]
                }
              ],
              "plaintext": "This last week has been a bit of a packaging frenzy. Not gifts—yet—just stuff I've pushed to JSR because they make it so damn easy. It's been a healing experience to me, in a way."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [
                {
                  "index": {
                    "byteEnd": 52,
                    "byteStart": 24
                  },
                  "features": [
                    {
                      "uri": "https://jsr.io/@puregarlic/randimal",
                      "$type": "pub.leaflet.richtext.facet#link"
                    }
                  ]
                },
                {
                  "index": {
                    "byteEnd": 127,
                    "byteStart": 94
                  },
                  "features": [
                    {
                      "uri": "https://jsr.io/@cistern",
                      "$type": "pub.leaflet.richtext.facet#link"
                    }
                  ]
                }
              ],
              "plaintext": "I pushed up a fix to my random animal name generator, and I pushed up several versions of the packages I've written for Cistern. For Randimal, turns out I did random selection badly. Don't let anybody tell you can't implement randomness badly."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [
                {
                  "index": {
                    "byteEnd": 30,
                    "byteStart": 25
                  },
                  "features": [
                    {
                      "uri": "https://julialang.org/",
                      "$type": "pub.leaflet.richtext.facet#link"
                    }
                  ]
                },
                {
                  "index": {
                    "byteEnd": 79,
                    "byteStart": 65
                  },
                  "features": [
                    {
                      "uri": "https://plutojl.org/",
                      "$type": "pub.leaflet.richtext.facet#link"
                    }
                  ]
                }
              ],
              "plaintext": "I have a friend learning Julia, so I asked him to put together a Pluto notebook to visualize just how bad it was. Here's the graph of how often animal names were selected over 1,000,000 samples:"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.image",
              "image": {
                "$type": "blob",
                "ref": {
                  "$link": "bafkreibk7es5dityrrxldkcyjyujxiqol7cw4fa2ljddiwhbsmfr2o6hza"
                },
                "mimeType": "image/png",
                "size": 24540
              },
              "aspectRatio": {
                "width": 500,
                "height": 500
              }
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [],
              "plaintext": "Yeah, oof. Sample your data correctly, folks. In Seb's words:"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.blockquote",
              "facets": [],
              "plaintext": "the lesson is that uniformally sampling from nonuniform data results in nonuniform data"
            }
          },
          {
            "$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.header",
              "level": 2,
              "facets": [],
              "plaintext": "Cistern lives!"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [],
              "plaintext": "Like I mentioned, I got a bunch of Cistern packages pushed up—but more importantly, I got an end-to-end test passing! That means that the general concept works, and I'm pleasantly surprised to say the records aren't unreasonably large."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [],
              "plaintext": "The next step is to build practical implementations of consumers and producers. So far, I've written an MCP server to act as a consumer, which handles keypair generation and provides tools to your LLM to iterate your stored memos. Now, I just need a way to create memos!"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [
                {
                  "index": {
                    "byteEnd": 150,
                    "byteStart": 143
                  },
                  "features": [
                    {
                      "$type": "pub.leaflet.richtext.facet#italic"
                    }
                  ]
                }
              ],
              "plaintext": "Since my primary use case for Cistern is for quick capture, that means that I need to write a mobile app. Yippee! I've dabbled—and I do mean dabbled—in React Native before, but this will be the first time I have full control of the project. Hopefully it'll be a good learning experience, because I've got a project idea a couple lines down the list that would work best as a React Native app."
            }
          },
          {
            "$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.header",
              "level": 2,
              "facets": [],
              "plaintext": "Client-side server-side"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "src": "https://pfrazee.leaflet.pub/3m5hwua4sh22v",
              "$type": "pub.leaflet.blocks.website",
              "title": "The politics of purely client-side apps - Paul's Leaflets",
              "description": "There's a surprisingly nuanced discussion in development about the political economy of clients and servers in the Atmosphere",
              "previewImage": {
                "$type": "blob",
                "ref": {
                  "$link": "bafkreibldlquwh3lqht6mrkfa6fsakvaeybzgdltruku5zh24nzje6xvd4"
                },
                "mimeType": "image/png",
                "size": 26827
              }
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [],
              "plaintext": "Paul Frazee put out a blog post about client-side vs server-side atproto apps this week, and it's been weighing on my mind. I understand I'm just another \"why not both?\" reply in the list of replies, but it's further convinced me there's a possibility of adding server-side processing whilst having clients talk directly to the PDS."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [
                {
                  "index": {
                    "byteEnd": 150,
                    "byteStart": 133
                  },
                  "features": [
                    {
                      "$type": "pub.leaflet.richtext.facet#italic"
                    }
                  ]
                }
              ],
              "plaintext": "That seems counter-intuitive, but it's motivated by the idea of having the PDS act not only as a store for a user's social data, but also as a gateway to a user's social services—and I think XRPC is uniquely positioned to make it work."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [],
              "plaintext": "At a high level, what I propose is to have the PDS proxy unknown XRPC requests to other AppView servers, using a lookup algorithm. I won't get too into it here, since these are weekly notes, but I'm writing up a standalone blog post to detail what that algorithm would look like, and the upsides/downsides of such."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [],
              "plaintext": "I wouldn't say I have a complete picture of the ramifications of such a feature, as I'm not an atproto expert. However, it's something I've been mulling over for a few months now, and at the very least, maybe it could get some other folks thinking."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [],
              "plaintext": "If you're interested in what I'm talking about and I don't have the post out by next week, by all means poke me on Bluesky."
            }
          },
          {
            "$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 any rate, that was my week—and even a bit of the incoming one. Thanks for reading this far, and here's hoping you have a fantastic week as well!"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [],
              "plaintext": ""
            }
          }
        ]
      }
    ]
  },
  "bskyPostRef": {
    "cid": "bafyreigoy2ob7gpkn6grv4bdnynfpehb5et27n5c27orr3chehpsq4o3gm",
    "uri": "at://did:plc:57od6g2ic3e3b3kauctjmo3k/app.bsky.feed.post/3m5twypyldc2p",
    "commit": {
      "cid": "bafyreib3lfdktkzmk6otidjf7ug737cq7c2wy6ivwudkweaimprnk7ztja",
      "rev": "3m5twyq3hiu2q"
    },
    "validationStatus": "valid"
  },
  "description": "Featuring packages, more Cistern and some XRPC thoughts",
  "publishedAt": "2025-11-17T19:20:21.753Z"
}