summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichał M. Sapka <michal@sapka.me>2023-06-09 21:58:15 +0200
committerMichał M. Sapka <michal@sapka.me>2023-06-09 21:58:15 +0200
commit9ca0cbd5f93eaaefd9c494245fa8318d6f15f73e (patch)
tree95ea19364b351d80d50d3c78037fa8cb7a4e7614
parent27e4321d3710cc0c196368aa4655c1d584337f11 (diff)
feat: Mastodon article
-rw-r--r--assets/content_images/activitypub-pm.svg405
-rw-r--r--assets/content_images/activitypub-w.svg393
-rw-r--r--content/2023/mastodon-activity-pub.md111
-rw-r--r--content/about.md5
-rw-r--r--static/style.css2
5 files changed, 913 insertions, 3 deletions
diff --git a/assets/content_images/activitypub-pm.svg b/assets/content_images/activitypub-pm.svg
new file mode 100644
index 0000000..96fd219
--- /dev/null
+++ b/assets/content_images/activitypub-pm.svg
@@ -0,0 +1,405 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ width="889.7998"
+ height="212.2184"
+ viewBox="0 0 529.79188 126.35604"
+ version="1.1"
+ id="svg5"
+ inkscape:version="1.2.2 (b0a84865, 2022-12-01)"
+ sodipodi:docname="activity-pub-pm.svg"
+ inkscape:export-filename="activitypub-pm.svg"
+ inkscape:export-xdpi="96"
+ inkscape:export-ydpi="96"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:svg="http://www.w3.org/2000/svg">
+ <sodipodi:namedview
+ id="namedview7"
+ pagecolor="#ffffff"
+ bordercolor="#000000"
+ borderopacity="0.25"
+ inkscape:showpageshadow="2"
+ inkscape:pageopacity="0.0"
+ inkscape:pagecheckerboard="0"
+ inkscape:deskcolor="#d1d1d1"
+ inkscape:document-units="mm"
+ showgrid="true"
+ inkscape:zoom="0.67751946"
+ inkscape:cx="553.48964"
+ inkscape:cy="154.9771"
+ inkscape:window-width="1805"
+ inkscape:window-height="814"
+ inkscape:window-x="886"
+ inkscape:window-y="656"
+ inkscape:window-maximized="0"
+ inkscape:current-layer="layer1"
+ inkscape:lockguides="true"
+ guidecolor="#00e51f"
+ guideopacity="0.6"
+ inkscape:connector-spacing="100"
+ showguides="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid297"
+ spacingx="13.229166"
+ spacingy="6.6145832"
+ dotted="false"
+ originx="-12.915683"
+ originy="225.30132" />
+ </sodipodi:namedview>
+ <defs
+ id="defs2">
+ <marker
+ style="overflow:visible"
+ id="RoundedArrow"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="RoundedArrow"
+ markerWidth="6.1347523"
+ markerHeight="5.9304953"
+ viewBox="0 0 6.1347524 5.9304951"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="m -0.21114562,-4.1055728 6.42229122,3.21114561 a 1,1 90 0 1 0,1.78885438 L -0.21114562,4.1055728 A 1.236068,1.236068 31.717474 0 1 -2,3 v -6 a 1.236068,1.236068 148.28253 0 1 1.78885438,-1.1055728 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="path1367" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="RoundedArrow-4"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="RoundedArrow"
+ markerWidth="6.1347523"
+ markerHeight="5.9304953"
+ viewBox="0 0 6.1347524 5.9304951"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="m -0.21114562,-4.1055728 6.42229122,3.21114561 a 1,1 90 0 1 0,1.78885438 L -0.21114562,4.1055728 A 1.236068,1.236068 31.717474 0 1 -2,3 v -6 a 1.236068,1.236068 148.28253 0 1 1.78885438,-1.1055728 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="path1367-1" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="RoundedArrow-1"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="RoundedArrow"
+ markerWidth="6.1347523"
+ markerHeight="5.9304953"
+ viewBox="0 0 6.1347524 5.9304951"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="m -0.21114562,-4.1055728 6.42229122,3.21114561 a 1,1 90 0 1 0,1.78885438 L -0.21114562,4.1055728 A 1.236068,1.236068 31.717474 0 1 -2,3 v -6 a 1.236068,1.236068 148.28253 0 1 1.78885438,-1.1055728 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="path1367-2" />
+ </marker>
+ </defs>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(-12.884936,-12.683673)">
+ <rect
+ style="fill:#e3dbdb;fill-opacity:1;stroke:#000000;stroke-width:0.535763;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+ id="rect9107-8"
+ width="132.0789"
+ height="118.91182"
+ x="277.93201"
+ y="12.951554"
+ inkscape:export-filename="activity-pub-pm.svg"
+ inkscape:export-xdpi="96"
+ inkscape:export-ydpi="96" />
+ <rect
+ style="fill:#c8b7b7;fill-opacity:1;stroke:#000000;stroke-width:0.535771;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+ id="rect9107-8-7"
+ width="131.9003"
+ height="119.07645"
+ x="410.50864"
+ y="13.054808"
+ inkscape:export-filename="./rect9107-8.svg"
+ inkscape:export-xdpi="96"
+ inkscape:export-ydpi="96" />
+ <rect
+ style="fill:#ffd5d5;fill-opacity:1;stroke:#000000;stroke-width:0.536038;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+ id="rect9107-3"
+ width="131.98431"
+ height="119.11877"
+ x="145.84129"
+ y="13.01248" />
+ <text
+ xml:space="preserve"
+ style="font-size:12.7px;letter-spacing:0px;fill:#241c1c;stroke-width:3.565;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+ x="179.23112"
+ y="92.251518"
+ id="text6393-2-4-1-9-8"><tspan
+ sodipodi:role="line"
+ id="tspan6391-3-5-0-9-8"
+ style="font-size:12.7px;fill:#241c1c;stroke-width:3.565"
+ x="179.23112"
+ y="92.251518">Outbox</tspan><tspan
+ sodipodi:role="line"
+ style="font-size:12.7px;fill:#241c1c;stroke-width:3.565"
+ x="179.23112"
+ y="108.12652"
+ id="tspan18510-0" /><tspan
+ sodipodi:role="line"
+ style="font-size:12.7px;fill:#241c1c;stroke-width:3.565"
+ x="179.23112"
+ y="124.00152"
+ id="tspan18516-7" /></text>
+ <text
+ xml:space="preserve"
+ style="font-size:12.7px;letter-spacing:0px;fill:#241c1c;stroke-width:3.565;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+ x="52.216663"
+ y="95.478195"
+ id="text6393-2-4-1-9-8-8"><tspan
+ sodipodi:role="line"
+ id="tspan6391-3-5-0-9-8-3"
+ style="font-size:12.7px;fill:#241c1c;stroke-width:3.565"
+ x="52.216663"
+ y="95.478195">Outbox</tspan><tspan
+ sodipodi:role="line"
+ style="font-size:12.7px;fill:#241c1c;stroke-width:3.565"
+ x="52.216663"
+ y="111.3532"
+ id="tspan18510-0-0" /><tspan
+ sodipodi:role="line"
+ style="font-size:12.7px;fill:#241c1c;stroke-width:3.565"
+ x="52.216663"
+ y="127.2282"
+ id="tspan18516-7-6">n</tspan></text>
+ <rect
+ style="fill:#ffaaaa;fill-opacity:1;stroke:#000000;stroke-width:0.535682;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+ id="rect9107"
+ width="132.06946"
+ height="118.88419"
+ x="13.152777"
+ y="12.979234" />
+ <text
+ xml:space="preserve"
+ style="font-size:12.7px;letter-spacing:2.64583px;fill:#d35f5f;stroke-width:3.565;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+ x="25.820345"
+ y="30.105446"
+ id="text6393"><tspan
+ sodipodi:role="line"
+ id="tspan6391"
+ style="font-size:12.7px;fill:#000000;stroke-width:3.565"
+ x="25.820345"
+ y="30.105446">User A:</tspan><tspan
+ sodipodi:role="line"
+ style="font-size:12.7px;fill:#000000;stroke-width:3.565"
+ x="25.820345"
+ y="45.980446"
+ id="tspan1038">client</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:12.7px;letter-spacing:0px;fill:#d35f5f;stroke-width:3.565;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+ x="329.89273"
+ y="92.251518"
+ id="text6393-2"><tspan
+ sodipodi:role="line"
+ id="tspan6391-3"
+ style="font-size:12.7px;fill:#000000;stroke-width:3.565"
+ x="329.89273"
+ y="92.251518">Inbox</tspan></text>
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 251.35415,138.90744 v 0"
+ id="path18964"
+ inkscape:connector-type="polyline"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 251.35415,138.90744 v 0"
+ id="path18966"
+ inkscape:connector-type="polyline"
+ inkscape:connector-curvature="0" />
+ <text
+ xml:space="preserve"
+ style="font-size:12.7px;letter-spacing:2.64583px;fill:#d35f5f;stroke-width:3.565;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+ x="158.112"
+ y="30.105446"
+ id="text6393-8"><tspan
+ sodipodi:role="line"
+ id="tspan6391-0"
+ style="font-size:12.7px;fill:#000000;stroke-width:3.565"
+ x="158.112"
+ y="30.105446">User A:</tspan><tspan
+ sodipodi:role="line"
+ style="font-size:12.7px;fill:#000000;stroke-width:3.565"
+ x="158.112"
+ y="45.980446"
+ id="tspan1038-4">server</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:12.7px;letter-spacing:2.64583px;fill:#d35f5f;stroke-width:3.565;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+ x="282.42484"
+ y="30.105446"
+ id="text6393-6"><tspan
+ sodipodi:role="line"
+ id="tspan6391-03"
+ style="font-size:12.7px;fill:#000000;stroke-width:3.565"
+ x="282.42484"
+ y="30.105446">User B:</tspan><tspan
+ sodipodi:role="line"
+ style="font-size:12.7px;fill:#000000;stroke-width:3.565"
+ x="282.42484"
+ y="45.980446"
+ id="tspan1038-2">server</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:12.7px;letter-spacing:2.64583px;fill:#d35f5f;stroke-width:3.565;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+ x="414.71649"
+ y="30.105446"
+ id="text6393-69"><tspan
+ sodipodi:role="line"
+ id="tspan6391-4"
+ style="font-size:12.7px;fill:#000000;stroke-width:3.565"
+ x="414.71649"
+ y="30.105446">User B:</tspan><tspan
+ sodipodi:role="line"
+ style="font-size:12.7px;fill:#000000;stroke-width:3.565"
+ x="414.71649"
+ y="45.980446"
+ id="tspan1038-1">client</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:12.7px;letter-spacing:0px;fill:#241c1c;stroke-width:3.565;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+ x="37.474415"
+ y="92.282524"
+ id="text6393-2-4-1-9-8-87"><tspan
+ sodipodi:role="line"
+ id="tspan6391-3-5-0-9-8-6"
+ style="font-size:12.7px;fill:#241c1c;stroke-width:3.565"
+ x="37.474415"
+ y="92.282524">Device</tspan><tspan
+ sodipodi:role="line"
+ style="font-size:12.7px;fill:#241c1c;stroke-width:3.565"
+ x="37.474415"
+ y="108.15752"
+ id="tspan18510-0-00" /><tspan
+ sodipodi:role="line"
+ style="font-size:12.7px;fill:#241c1c;stroke-width:3.565"
+ x="37.474415"
+ y="124.03252"
+ id="tspan18516-7-9" /></text>
+ <text
+ xml:space="preserve"
+ style="font-size:12.7px;letter-spacing:0px;fill:#241c1c;stroke-width:3.565;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+ x="461.7937"
+ y="92.282524"
+ id="text6393-2-4-1-9-8-87-3"><tspan
+ sodipodi:role="line"
+ id="tspan6391-3-5-0-9-8-6-9"
+ style="font-size:12.7px;fill:#241c1c;stroke-width:3.565"
+ x="461.7937"
+ y="92.282524">Device</tspan><tspan
+ sodipodi:role="line"
+ style="font-size:12.7px;fill:#241c1c;stroke-width:3.565"
+ x="461.7937"
+ y="108.15752"
+ id="tspan18510-0-00-0" /><tspan
+ sodipodi:role="line"
+ style="font-size:12.7px;fill:#241c1c;stroke-width:3.565"
+ x="461.7937"
+ y="124.03252"
+ id="tspan18516-7-9-5" /></text>
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.595406px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#RoundedArrow)"
+ d="M 92.617299,85.829173 H 171.99229"
+ id="path10998"
+ inkscape:connector-type="polyline"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.595406px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#RoundedArrow-4)"
+ d="m 238.13813,85.829174 h 79.37499"
+ id="path10998-6"
+ inkscape:connector-type="polyline"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.532723px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#RoundedArrow-1)"
+ d="m 449.80478,85.829174 h -63.5417"
+ id="path10998-0"
+ inkscape:connector-type="polyline"
+ inkscape:connector-curvature="0" />
+ <text
+ xml:space="preserve"
+ style="font-size:12.7px;letter-spacing:0px;fill:#241c1c;stroke-width:3.565;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+ x="104.60623"
+ y="79.022354"
+ id="text6393-2-4-1-9-8-87-38"><tspan
+ sodipodi:role="line"
+ id="tspan6391-3-5-0-9-8-6-0"
+ style="font-size:12.7px;fill:#241c1c;stroke-width:3.565"
+ x="104.60623"
+ y="79.022354">POST</tspan><tspan
+ sodipodi:role="line"
+ style="font-size:12.7px;fill:#241c1c;stroke-width:3.565"
+ x="104.60623"
+ y="94.897354"
+ id="tspan18510-0-00-2" /><tspan
+ sodipodi:role="line"
+ style="font-size:12.7px;fill:#241c1c;stroke-width:3.565"
+ x="104.60623"
+ y="110.77235"
+ id="tspan18516-7-9-4" /></text>
+ <text
+ xml:space="preserve"
+ style="font-size:12.7px;letter-spacing:0px;fill:#241c1c;stroke-width:3.565;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+ x="243.66336"
+ y="79.022354"
+ id="text6393-2-4-1-9-8-87-38-3"><tspan
+ sodipodi:role="line"
+ id="tspan6391-3-5-0-9-8-6-0-7"
+ style="font-size:12.7px;fill:#241c1c;stroke-width:3.565"
+ x="243.66336"
+ y="79.022354">POST</tspan><tspan
+ sodipodi:role="line"
+ style="font-size:12.7px;fill:#241c1c;stroke-width:3.565"
+ x="243.66336"
+ y="94.897354"
+ id="tspan18510-0-00-2-9" /><tspan
+ sodipodi:role="line"
+ style="font-size:12.7px;fill:#241c1c;stroke-width:3.565"
+ x="243.66336"
+ y="110.77235"
+ id="tspan18516-7-9-4-0" /></text>
+ <text
+ xml:space="preserve"
+ style="font-size:12.7px;letter-spacing:0px;fill:#241c1c;stroke-width:3.565;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+ x="410.87177"
+ y="82.000984"
+ id="text6393-2-4-1-9-8-87-38-3-9"><tspan
+ sodipodi:role="line"
+ id="tspan6391-3-5-0-9-8-6-0-7-7"
+ style="font-size:12.7px;fill:#241c1c;stroke-width:3.565"
+ x="410.87177"
+ y="82.000984">GET</tspan><tspan
+ sodipodi:role="line"
+ style="font-size:12.7px;fill:#241c1c;stroke-width:3.565"
+ x="410.87177"
+ y="97.875984"
+ id="tspan18510-0-00-2-9-0" /><tspan
+ sodipodi:role="line"
+ style="font-size:12.7px;fill:#241c1c;stroke-width:3.565"
+ x="410.87177"
+ y="113.75098"
+ id="tspan18516-7-9-4-0-3" /></text>
+ </g>
+</svg>
diff --git a/assets/content_images/activitypub-w.svg b/assets/content_images/activitypub-w.svg
new file mode 100644
index 0000000..7dc2c47
--- /dev/null
+++ b/assets/content_images/activitypub-w.svg
@@ -0,0 +1,393 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ width="889.7998"
+ height="201.06557"
+ viewBox="0 0 529.79188 119.71558"
+ version="1.1"
+ id="svg5"
+ inkscape:version="1.2.2 (b0a84865, 2022-12-01)"
+ sodipodi:docname="activity-pub-pm.svg"
+ inkscape:export-filename="activitypub-w.svg"
+ inkscape:export-xdpi="96"
+ inkscape:export-ydpi="96"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:svg="http://www.w3.org/2000/svg">
+ <sodipodi:namedview
+ id="namedview7"
+ pagecolor="#ffffff"
+ bordercolor="#000000"
+ borderopacity="0.25"
+ inkscape:showpageshadow="2"
+ inkscape:pageopacity="0.0"
+ inkscape:pagecheckerboard="0"
+ inkscape:deskcolor="#d1d1d1"
+ inkscape:document-units="mm"
+ showgrid="true"
+ inkscape:zoom="0.67751946"
+ inkscape:cx="553.48964"
+ inkscape:cy="154.9771"
+ inkscape:window-width="1805"
+ inkscape:window-height="814"
+ inkscape:window-x="886"
+ inkscape:window-y="656"
+ inkscape:window-maximized="0"
+ inkscape:current-layer="layer1"
+ inkscape:lockguides="true"
+ guidecolor="#00e51f"
+ guideopacity="0.6"
+ inkscape:connector-spacing="100"
+ showguides="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid297"
+ spacingx="13.229166"
+ spacingy="6.6145832"
+ dotted="false"
+ originx="-12.915683"
+ originy="225.30132" />
+ </sodipodi:namedview>
+ <defs
+ id="defs2">
+ <marker
+ style="overflow:visible"
+ id="RoundedArrow"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="RoundedArrow"
+ markerWidth="6.1347523"
+ markerHeight="5.9304953"
+ viewBox="0 0 6.1347524 5.9304951"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="m -0.21114562,-4.1055728 6.42229122,3.21114561 a 1,1 90 0 1 0,1.78885438 L -0.21114562,4.1055728 A 1.236068,1.236068 31.717474 0 1 -2,3 v -6 a 1.236068,1.236068 148.28253 0 1 1.78885438,-1.1055728 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="path1367" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="RoundedArrow-4"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="RoundedArrow"
+ markerWidth="6.1347523"
+ markerHeight="5.9304953"
+ viewBox="0 0 6.1347524 5.9304951"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="m -0.21114562,-4.1055728 6.42229122,3.21114561 a 1,1 90 0 1 0,1.78885438 L -0.21114562,4.1055728 A 1.236068,1.236068 31.717474 0 1 -2,3 v -6 a 1.236068,1.236068 148.28253 0 1 1.78885438,-1.1055728 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="path1367-1" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="RoundedArrow-1"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="RoundedArrow"
+ markerWidth="6.1347523"
+ markerHeight="5.9304953"
+ viewBox="0 0 6.1347524 5.9304951"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="m -0.21114562,-4.1055728 6.42229122,3.21114561 a 1,1 90 0 1 0,1.78885438 L -0.21114562,4.1055728 A 1.236068,1.236068 31.717474 0 1 -2,3 v -6 a 1.236068,1.236068 148.28253 0 1 1.78885438,-1.1055728 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="path1367-2" />
+ </marker>
+ </defs>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(-12.884936,-12.683673)">
+ <rect
+ style="fill:#e3dbdb;fill-opacity:1;stroke:#000000;stroke-width:0.535763;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+ id="rect9107-8"
+ width="132.0789"
+ height="118.91182"
+ x="277.93201"
+ y="12.951554"
+ inkscape:export-filename="activitypub-pm.svg"
+ inkscape:export-xdpi="96"
+ inkscape:export-ydpi="96" />
+ <rect
+ style="fill:#c8b7b7;fill-opacity:1;stroke:#000000;stroke-width:0.535771;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+ id="rect9107-8-7"
+ width="131.9003"
+ height="119.07645"
+ x="410.50864"
+ y="13.054808"
+ inkscape:export-filename="./rect9107-8.svg"
+ inkscape:export-xdpi="96"
+ inkscape:export-ydpi="96" />
+ <rect
+ style="fill:#ffd5d5;fill-opacity:1;stroke:#000000;stroke-width:0.536038;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+ id="rect9107-3"
+ width="131.98431"
+ height="119.11877"
+ x="145.84129"
+ y="13.01248" />
+ <text
+ xml:space="preserve"
+ style="font-size:12.7px;letter-spacing:0px;fill:#241c1c;stroke-width:3.565;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+ x="179.23112"
+ y="92.251518"
+ id="text6393-2-4-1-9-8"><tspan
+ sodipodi:role="line"
+ id="tspan6391-3-5-0-9-8"
+ style="font-size:12.7px;fill:#241c1c;stroke-width:3.565"
+ x="179.23112"
+ y="92.251518">Outbox</tspan><tspan
+ sodipodi:role="line"
+ style="font-size:12.7px;fill:#241c1c;stroke-width:3.565"
+ x="179.23112"
+ y="108.12652"
+ id="tspan18510-0" /><tspan
+ sodipodi:role="line"
+ style="font-size:12.7px;fill:#241c1c;stroke-width:3.565"
+ x="179.23112"
+ y="124.00152"
+ id="tspan18516-7" /></text>
+ <text
+ xml:space="preserve"
+ style="font-size:12.7px;letter-spacing:0px;fill:#241c1c;stroke-width:3.565;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+ x="52.216663"
+ y="95.478195"
+ id="text6393-2-4-1-9-8-8"><tspan
+ sodipodi:role="line"
+ id="tspan6391-3-5-0-9-8-3"
+ style="font-size:12.7px;fill:#241c1c;stroke-width:3.565"
+ x="52.216663"
+ y="95.478195">Outbox</tspan><tspan
+ sodipodi:role="line"
+ style="font-size:12.7px;fill:#241c1c;stroke-width:3.565"
+ x="52.216663"
+ y="111.3532"
+ id="tspan18510-0-0" /><tspan
+ sodipodi:role="line"
+ style="font-size:12.7px;fill:#241c1c;stroke-width:3.565"
+ x="52.216663"
+ y="127.2282"
+ id="tspan18516-7-6">n</tspan></text>
+ <rect
+ style="fill:#ffaaaa;fill-opacity:1;stroke:#000000;stroke-width:0.535682;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+ id="rect9107"
+ width="132.06946"
+ height="118.88419"
+ x="13.152777"
+ y="12.979234" />
+ <text
+ xml:space="preserve"
+ style="font-size:12.7px;letter-spacing:2.64583px;fill:#d35f5f;stroke-width:3.565;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+ x="25.820345"
+ y="30.105446"
+ id="text6393"><tspan
+ sodipodi:role="line"
+ id="tspan6391"
+ style="font-size:12.7px;fill:#000000;stroke-width:3.565"
+ x="25.820345"
+ y="30.105446">User A:</tspan><tspan
+ sodipodi:role="line"
+ style="font-size:12.7px;fill:#000000;stroke-width:3.565"
+ x="25.820345"
+ y="45.980446"
+ id="tspan1038">client</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:12.7px;letter-spacing:0px;fill:#d35f5f;stroke-width:3.565;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+ x="329.89273"
+ y="92.251518"
+ id="text6393-2"><tspan
+ sodipodi:role="line"
+ id="tspan6391-3"
+ style="font-size:12.7px;fill:#000000;stroke-width:3.565"
+ x="329.89273"
+ y="92.251518">Inbox</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:12.7px;letter-spacing:2.64583px;fill:#d35f5f;stroke-width:3.565;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+ x="158.112"
+ y="30.105446"
+ id="text6393-8"><tspan
+ sodipodi:role="line"
+ id="tspan6391-0"
+ style="font-size:12.7px;fill:#000000;stroke-width:3.565"
+ x="158.112"
+ y="30.105446">User A:</tspan><tspan
+ sodipodi:role="line"
+ style="font-size:12.7px;fill:#000000;stroke-width:3.565"
+ x="158.112"
+ y="45.980446"
+ id="tspan1038-4">server</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:12.7px;letter-spacing:2.64583px;fill:#d35f5f;stroke-width:3.565;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+ x="282.42484"
+ y="30.105446"
+ id="text6393-6"><tspan
+ sodipodi:role="line"
+ id="tspan6391-03"
+ style="font-size:12.7px;fill:#000000;stroke-width:3.565"
+ x="282.42484"
+ y="30.105446">User B:</tspan><tspan
+ sodipodi:role="line"
+ style="font-size:12.7px;fill:#000000;stroke-width:3.565"
+ x="282.42484"
+ y="45.980446"
+ id="tspan1038-2">server</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:12.7px;letter-spacing:2.64583px;fill:#d35f5f;stroke-width:3.565;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+ x="414.71649"
+ y="30.105446"
+ id="text6393-69"><tspan
+ sodipodi:role="line"
+ id="tspan6391-4"
+ style="font-size:12.7px;fill:#000000;stroke-width:3.565"
+ x="414.71649"
+ y="30.105446">User B:</tspan><tspan
+ sodipodi:role="line"
+ style="font-size:12.7px;fill:#000000;stroke-width:3.565"
+ x="414.71649"
+ y="45.980446"
+ id="tspan1038-1">client</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:12.7px;letter-spacing:0px;fill:#241c1c;stroke-width:3.565;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+ x="37.474415"
+ y="92.282524"
+ id="text6393-2-4-1-9-8-87"><tspan
+ sodipodi:role="line"
+ id="tspan6391-3-5-0-9-8-6"
+ style="font-size:12.7px;fill:#241c1c;stroke-width:3.565"
+ x="37.474415"
+ y="92.282524">Device</tspan><tspan
+ sodipodi:role="line"
+ style="font-size:12.7px;fill:#241c1c;stroke-width:3.565"
+ x="37.474415"
+ y="108.15752"
+ id="tspan18510-0-00" /><tspan
+ sodipodi:role="line"
+ style="font-size:12.7px;fill:#241c1c;stroke-width:3.565"
+ x="37.474415"
+ y="124.03252"
+ id="tspan18516-7-9" /></text>
+ <text
+ xml:space="preserve"
+ style="font-size:12.7px;letter-spacing:0px;fill:#241c1c;stroke-width:3.565;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+ x="461.7937"
+ y="92.282524"
+ id="text6393-2-4-1-9-8-87-3"><tspan
+ sodipodi:role="line"
+ id="tspan6391-3-5-0-9-8-6-9"
+ style="font-size:12.7px;fill:#241c1c;stroke-width:3.565"
+ x="461.7937"
+ y="92.282524">Device</tspan><tspan
+ sodipodi:role="line"
+ style="font-size:12.7px;fill:#241c1c;stroke-width:3.565"
+ x="461.7937"
+ y="108.15752"
+ id="tspan18510-0-00-0" /><tspan
+ sodipodi:role="line"
+ style="font-size:12.7px;fill:#241c1c;stroke-width:3.565"
+ x="461.7937"
+ y="124.03252"
+ id="tspan18516-7-9-5" /></text>
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.595406px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#RoundedArrow)"
+ d="M 92.617299,85.829173 H 171.99229"
+ id="path10998"
+ inkscape:connector-type="polyline"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.595407px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#RoundedArrow-4)"
+ d="m 317.51312,85.829174 h -79.375"
+ id="path10998-6"
+ inkscape:connector-type="polyline"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.532723px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#RoundedArrow-1)"
+ d="m 449.80478,85.829174 h -63.5417"
+ id="path10998-0"
+ inkscape:connector-type="polyline"
+ inkscape:connector-curvature="0" />
+ <text
+ xml:space="preserve"
+ style="font-size:12.7px;letter-spacing:0px;fill:#241c1c;stroke-width:3.565;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+ x="104.60623"
+ y="79.022354"
+ id="text6393-2-4-1-9-8-87-38"><tspan
+ sodipodi:role="line"
+ id="tspan6391-3-5-0-9-8-6-0"
+ style="font-size:12.7px;fill:#241c1c;stroke-width:3.565"
+ x="104.60623"
+ y="79.022354">POST</tspan><tspan
+ sodipodi:role="line"
+ style="font-size:12.7px;fill:#241c1c;stroke-width:3.565"
+ x="104.60623"
+ y="94.897354"
+ id="tspan18510-0-00-2" /><tspan
+ sodipodi:role="line"
+ style="font-size:12.7px;fill:#241c1c;stroke-width:3.565"
+ x="104.60623"
+ y="110.77235"
+ id="tspan18516-7-9-4" /></text>
+ <text
+ xml:space="preserve"
+ style="font-size:12.7px;letter-spacing:0px;fill:#241c1c;stroke-width:3.565;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+ x="278.58011"
+ y="79.03476"
+ id="text6393-2-4-1-9-8-87-38-3"><tspan
+ sodipodi:role="line"
+ id="tspan6391-3-5-0-9-8-6-0-7"
+ style="font-size:12.7px;fill:#241c1c;stroke-width:3.565"
+ x="278.58011"
+ y="79.03476">GET</tspan><tspan
+ sodipodi:role="line"
+ style="font-size:12.7px;fill:#241c1c;stroke-width:3.565"
+ x="278.58011"
+ y="94.90976"
+ id="tspan18510-0-00-2-9" /><tspan
+ sodipodi:role="line"
+ style="font-size:12.7px;fill:#241c1c;stroke-width:3.565"
+ x="278.58011"
+ y="110.78476"
+ id="tspan18516-7-9-4-0" /></text>
+ <text
+ xml:space="preserve"
+ style="font-size:12.7px;letter-spacing:0px;fill:#241c1c;stroke-width:3.565;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+ x="422.6333"
+ y="79.03476"
+ id="text6393-2-4-1-9-8-87-38-3-9"><tspan
+ sodipodi:role="line"
+ id="tspan6391-3-5-0-9-8-6-0-7-7"
+ style="font-size:12.7px;fill:#241c1c;stroke-width:3.565"
+ x="422.6333"
+ y="79.03476">GET</tspan><tspan
+ sodipodi:role="line"
+ style="font-size:12.7px;fill:#241c1c;stroke-width:3.565"
+ x="422.6333"
+ y="94.90976"
+ id="tspan18510-0-00-2-9-0" /><tspan
+ sodipodi:role="line"
+ style="font-size:12.7px;fill:#241c1c;stroke-width:3.565"
+ x="422.6333"
+ y="110.78476"
+ id="tspan18516-7-9-4-0-3" /></text>
+ </g>
+</svg>
diff --git a/content/2023/mastodon-activity-pub.md b/content/2023/mastodon-activity-pub.md
new file mode 100644
index 0000000..1423bed
--- /dev/null
+++ b/content/2023/mastodon-activity-pub.md
@@ -0,0 +1,111 @@
+---
+title: "Mastodon and ActivityPub"
+category: "engineering"
+abstract: Digging into Mastodon and Activity Pub
+date: 2023-06-09T21:16:39+02:00
+year:
+draft: false
+tags:
+- Mastodon
+- ActivityPub
+- W3C
+- Social-Media
+---
+After lengthy deliberations, I joined Mastodon. This website still has an auto-posting account on Twitter[^twitter], but I don't read anything there. Mastodon, on the other hand, is an open-source set of communities without Elon. May be interesting
+[^twitter]: [Michal Sapka's blog on Twitter](https://twitter.com/d_s_blog)
+
+I was not sure which instance I wanted to join, but in the end, the list was limited to:
+https://bsd.network/
+https://emacs.ch
+
+The question was, am I more of an Emacs type of person or more of a BSD one? Well, I spend hours in Emacs daily, and I tinkered with it much more, so without further delay, you can find me under
+
+https://emacs.ch/@ms
+
+However, I am still against social media, as it warps the mind and steals time. I don't want Mastodon to take too much of my time and mind, so I have decided:
+- I will not use Mastodon on mobile
+- On the desktop, I will use it via an Emacs package[^emacs]
+- I will regularly evaluate if I get anything valuable from this service.
+[^emacs]: [mastodon.el code repository](https://codeberg.org/martianh/mastodon.el)
+
+For now, you can find me there, and I will respond to messages. We will see what the future brings.
+
+This is also an excellent opportunity to learn about the underlying technology.
+
+### What is a Mastodon?
+
+Mastodon is a decentralized social media platform. Instead of a central server (think twitter.com), anyone can spin up their Mastodon instance. You can easily create one for bread bakers, Emacs users, or your neighborhood.
+
+What is cool and what makes Mastodon interesting is the fact that a user exists on a given instance (like me on emacs.ch), but he can follow and communicate with any other user having an account on any other server (like Ruben on bsd.network[^ruben])
+[^ruben]: https://bsd.network/@rubenerd
+
+This intercommunication is called **federation**. In fact, Mastodon can communicate not only with other instances of Mastodon but any other service implementing ActivityPub standard[^activity-pub]. Such services are sometimes referred to as *fediverse*[^fediverse]/
+[^activity-pub]: [W3C ActivityPub Standard text](https://www.w3.org/TR/activitypub/)
+
+[^fediverse]: There's even a [website](https://fediverse.party/) listing services on the Fediverse.
+
+Yeah, open standards!
+
+Though it's worth mentioning that in its current form, Fediverse is dominated by Mastodon.
+
+### Activity Pub
+
+ActivityPub is a protocol for decentralized social networks based on ActivityStreams vocabulary and syntax[^activity-streams] supported by W3C organization.
+[^activity-streams]: [W3C Activity Streams 2.0 standard text](https://www.w3.org/TR/activitystreams-core/).
+
+The standard defines two layers:
+1. A server-to-server protocol. This is what makes the federation work, as it allows instances to exchange data.
+2. A client-to-server protocol. This, on the other hand, allows a client application, be it web, mobile, or Emacs, to communicate with the server so a user can actually use the service.
+
+An implementation may support one or both of those layers so that we may create a complete set of a server with a UI, but it's also completely valid to have an entirely automated instance without any human interaction.
+
+I won't dissect the entire standard; I only want to grasp the general mechanics.
+
+#### Actors
+
+In ActivityPub, a "user" is represented as an Actor on a given server. The same person may have identical accounts on multiple servers, but each of those accounts is a separate Actor[^impersonation]
+[^impersonation]: I have yet to learn about any mechanism preventing abuse here. Anyone can create an account with the same username on a server I don't use and pose as me. Some Web of Trust here would be very beneficial.
+
+Servers in ActivityPub communicate via simple REST requests.
+
+Each Actor has unique endpoints representing:
+- an inbox
+- an outbox
+
+#### Delivery
+
+When a User wants to send a message to the world:
+
+{{<svg-full-width "activitypub-w.svg" "Public message sendout">}}
+
+1. User A's client sends a POST message to their own outbox. The message has left the client and is ready to be delivered to a different server.
+2. Any server can call the outbox with a GET request. This is how public messages are delivered between servers.
+3. Users on that server can then read the message in their own inbox.
+
+When User A wants to send a message to User B:
+
+{{<svg-full-width "activitypub-pm.svg" "Private message exchange">}}
+
+1. User A's client sends a POST message to their own outbox. The message has left the client and is ready to be delivered to a different server.
+2. User A's server sends a POST message to the inbox of User B. The message is delivered to the Actor.
+3. User B can then call GET on their inbox to read it. The message is delivered to a Client.
+
+Those requests are authenticated as a given Actor so that we can read only messages addressed to this user. The messages are addressed via "collections" - an Outbox is a collection, an Inbox is a collection, or a follower list is a collection.
+
+The server knows who a given Actor is following, so only messages accessible by any user on this server will be fetched.
+
+There is also a special "Public" collection, void of permissions. Any user on any server can fetch any message sent to "fPublic" without any authentication. This is how federated messages in Mastodon are propagated - someone follows a user on a different instance, so the person's server knows about the outbox collection and can fetch messages. Since it's aimed at the public, it will be available to each user on this server.
+
+We now know how private and public messages are propagated.
+
+### Activities
+
+Outbox and inbox don't contain the messages, but rather *Activities*. An activity is a request to Create a message, Edit it, Delete it, and so on. This mechanism allows users to edit their messages; in time, all servers should display the latest version.
+
+### Impressions
+
+ActivityPub is interesting as it allows for a decentralized social network closer to how Email works than something like Twitter. However, with this comes two downsides:
+- Chattiness between servers. So many requests!
+- Disregard for space. Servers contain copies of messages. With thousands of users, this may become a problem.
+
+There's much more to unpack here, but this is something for people developing software using ActivityPub. I am not yet one of those brave folks.
diff --git a/content/about.md b/content/about.md
index 433193f..beba585 100644
--- a/content/about.md
+++ b/content/about.md
@@ -28,9 +28,10 @@ All content here is grouped under a number of categories: {{<categories>}}
### Contact
-I don't use social media except for YouTube. Therefore, you won't find me on Twitter, TikTok, nor Mastodon. The best way to contact me is via email:
+I try not use social media except for YouTube. Therefore, you won't find me on Twitter, TikTok.
-[contact@michal.sapka.me](mailto:contact@michal.sapka.me).
+**Email**: [contact@michal.sapka.me](mailto:contact@michal.sapka.me)
+**Mastodon**: [https://emacs.ch/@ms](https://emacs.ch/@ms)
### Causes
diff --git a/static/style.css b/static/style.css
index 4a390a7..b61fc37 100644
--- a/static/style.css
+++ b/static/style.css
@@ -207,7 +207,7 @@ a[href^="#fn:"]:after{ content: ']' }
display: none
}
.footnotes::before {
- content: "References";
+ content: "Footnotes";
border: 0;
border-bottom-width: 1px;
border-style: solid;