{
"path": "/3memw5gdbok2x",
"site": "at://did:plc:3i6uzuatdyk7rwfkrybynf5j/site.standard.publication/3m72xt2lank2r",
"tags": [],
"$type": "site.standard.document",
"title": "How I Came Up with Margin",
"content": {
"$type": "pub.leaflet.content",
"pages": [
{
"id": "019c4f8c-879d-7993-8876-3a6746619de2",
"$type": "pub.leaflet.pages.linearDocument",
"blocks": [
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.image",
"image": {
"$type": "blob",
"ref": {
"$link": "bafkreicuy7mhk6mvxjvixmw7z2fhlk463rxvycyua6qezpxelhsvvvyq2q"
},
"mimeType": "image/png",
"size": 265951
},
"aspectRatio": {
"width": 3000,
"height": 1000
}
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.header",
"level": 2,
"facets": [],
"plaintext": "Introduction"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [],
"plaintext": "A couple of months ago, I had an idea: what if I built my own AT Protocol app?"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [],
"plaintext": "I was browsing atproto app directories and thought: what if I made something like Hypothes.is, but more social and feature-rich?"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [],
"plaintext": "That idea became Margin."
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.header",
"level": 2,
"facets": [],
"plaintext": "v0.1"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [],
"plaintext": "The initial design focused on annotating, highlighting, bookmarking, and collecting content."
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [],
"plaintext": "I liked the concept, so I started building it."
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [],
"plaintext": "Once the app was fairly usable, I announced it, and the word spread fast. People were excited about a new AT Protocol app, which gave me a huge motivation boost."
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.bskyPost",
"postRef": {
"cid": "bafyreifhkjwvujg2huslbfgghddxrembpewxedc3wro7avcoa344fqvqze",
"uri": "at://did:plc:rjqn3agdb74cszhqcpii4sne/app.bsky.feed.post/3mbm4g2usyc2o"
}
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [],
"plaintext": "A few days later, I started invite-only pre-testing. Features were tested, bugs were found, and eventually, The first version of Margin was released."
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.header",
"level": 2,
"facets": [],
"plaintext": "Browser Extension"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [],
"plaintext": "With support from the community, I was able to fund a Chrome Developer account and started working on the Margin browser extension."
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [],
"plaintext": "It began as a simple, raw extension with no framework, but later we migrated to wxt.dev to make it more modular and maintainable."
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.bskyPost",
"postRef": {
"cid": "bafyreicn6fgnkbqreu37e7ravlox6h7ntxixwqatfsfs7evjhlxlhrexeq",
"uri": "at://did:plc:rjqn3agdb74cszhqcpii4sne/app.bsky.feed.post/3mdsdaa7b5k2x"
}
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [],
"plaintext": "The AT Protocol has been really fun to work with, and interoperability with Semble showed how powerful it can be."
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.header",
"level": 2,
"facets": [],
"plaintext": "Conclusion"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [],
"plaintext": "That’s how Margin came to life, through feedback, feature requests, and community support."
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [],
"plaintext": "I’m excited to see where Margin goes next."
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [
{
"index": {
"byteEnd": 83,
"byteStart": 61
},
"features": [
{
"uri": "https://ko-fi.com/scan",
"$type": "pub.leaflet.richtext.facet#link"
}
]
}
],
"plaintext": "If you want to support development, you can donate on Ko-Fi: https://ko-fi.com/scan"
}
},
{
"$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": ""
}
}
]
}
]
},
"publishedAt": "2026-02-12T02:12:50.998Z"
}