···1212 <language>en-us</language>
1313 <copyright>Creative Commons BY-NC-SA 4.0</copyright>
1414 <item>
1515+<title>Mounting The Atmosphere</title>
1616+<description><p><a href="https://tangled.sh/@oppi.li/pdsfs">pdsfs</a> is a tool that
1717+mounts atproto PDS repositories as a FUSE filesystem.</p>
1818+<p>A PDS repository<a href="#fn1" class="footnote-ref" id="fnref1"
1919+role="doc-noteref"><sup>1</sup></a> contains all data published by a
2020+user to the atmosphere<a href="#fn2" class="footnote-ref" id="fnref2"
2121+role="doc-noteref"><sup>2</sup></a>. It is exportable as a CAR
2222+(content-addressable archive) file. pdsfs is a tool that mounts this CAR
2323+file as a readonly-FUSE filesystem, allowing quick and easy
2424+exploration.</p>
2525+<p>To motivate the need for such a program, we could begin by mounting a
2626+repository:</p>
2727+<pre><code>λ pdsfs oppi.li
2828+mounted at &quot;mnt&quot;
2929+hit enter to unmount and exit...</code></pre>
3030+<p>oppi.li is my handle in the atmosphere. The tool does some hardwork
3131+to determine the location of my PDS repository given my handle, but that
3232+is not important. Let’s have a look around:</p>
3333+<pre><code>λ ls mnt/
3434+did:plc:qfpnj4og54vl56wngdriaxug/</code></pre>
3535+<p>The <code>did:plc:stuff</code> is my DID<a href="#fn3"
3636+class="footnote-ref" id="fnref3" role="doc-noteref"><sup>3</sup></a>.
3737+Digging deeper:</p>
3838+<pre><code>λ ls mnt/did\:plc\:qfpnj4og54vl56wngdriaxug/
3939+app.bsky.actor.profile/ place.stream.chat.message/
4040+app.bsky.actor.status/ place.stream.chat.profile/
4141+app.bsky.feed.generator/ place.stream.key/
4242+app.bsky.feed.like/ place.stream.livestream/
4343+app.bsky.feed.post/ sh.tangled.actor.profile/
4444+app.bsky.feed.repost/ sh.tangled.feed.reaction/
4545+app.bsky.graph.block/ sh.tangled.feed.star/
4646+app.bsky.graph.follow/ sh.tangled.graph.follow/
4747+app.rocksky.album/ sh.tangled.knot/
4848+app.rocksky.artist/ sh.tangled.knot.member/
4949+.
5050+.
5151+.</code></pre>
5252+<p>We have some data from the repository now. These are “collections”.
5353+If I want to publish a post to Bluesky, I would write content to the
5454+<code>app.bsky.feed.post</code> collection in my PDS. This will then be
5555+indexed by a Bluesky appview (such as <a
5656+href="https://bsky.app">bsky.app</a> or <a
5757+href="https://zeppelin.social">zeppelin.social</a>) and show up under my
5858+profile there.</p>
5959+<p>pdsfs is kind enough to deserialize the in the PDS repository (stored
6060+as CBOR normally) to JSON on the filesystem:</p>
6161+<pre><code>λ cat sh.tangled.repo/3ljidbevrjh22 | jq
6262+{
6363+ &quot;$type&quot;: &quot;sh.tangled.repo&quot;,
6464+ &quot;addedAt&quot;: &quot;2025-03-03T16:04:13Z&quot;,
6565+ &quot;knot&quot;: &quot;knot1.tangled.sh&quot;,
6666+ &quot;name&quot;: &quot;hello-world&quot;,
6767+ &quot;owner&quot;: &quot;did:plc:3danwc67lo7obz2fmdg6jxcr&quot;
6868+}</code></pre>
6969+<p>Thanks pdsfs!</p>
7070+<p>I publish my music listening habits to my PDS to the
7171+<code>app.rocksky.scrobble</code> collection, because <a
7272+href="https://rocksky.app">Rocksky</a> recognizes and indexes this
7373+collection. I have wired up my personal navidrome instance to write data
7474+of this form into my PDS everytime I listen to a track. Here are my top
7575+artists in order:</p>
7676+<pre><code>λ jq -r &#39;.artist&#39; app.rocksky.scrobble/* | sort | uniq -c | sort -nr
7777+ 117 Thank You Scientist
7878+ 45 FKJ
7979+ 34 Covet
8080+ 33 VOLA
8181+ 23 Sam Cooke
8282+ 22 Dark Tranquillity
8383+ 21 Piero Piccioni
8484+ 12 Bloodywood
8585+ 11 Frank Sinatra
8686+ 10 Dream Theater</code></pre>
8787+<p>It is true, I love Sam Cooke.</p>
8888+<p>pdsfs allows mounting multiple repositories at a time. Allow me to
8989+introduce my friends:</p>
9090+<pre><code>λ pdsfs icyphox.sh anil.recoil.org steveklabnik.com tangled.sh
9191+using cached CAR file for...did:plc:hwevmowznbiukdf6uk5dwrrq
9292+using cached CAR file for...did:plc:nhyitepp3u4u6fcfboegzcjw
9393+download complete for...did:plc:3danwc67lo7obz2fmdg6jxcr
9494+download complete for...did:plc:wshs7t2adsemcrrd4snkeqli
9595+mounted at &quot;mnt&quot;
9696+hit enter to unmount and exit...
9797+9898+# -- in a separate shell --
9999+100100+λ cat ./mnt/*/app.bsky.actor.profile/* \
101101+ | jq -r &#39;&quot;\(.displayName)\n\(.description)\n---&quot;&#39; \
102102+ | sed &#39;/^$/d&#39;
103103+Steve Klabnik
104104+#rustlang, #jj-vcs, atproto, shitposts, urbanism. I
105105+contain multitudes. Working on #ruelang but just for
106106+fun. Currently in Austin, TX, but from Pittsburgh.
107107+Previously in Bushwick, the Mission, LA.
108108+---
109109+Anirudh Oppiliappan
110110+building @tangled.sh — code collaboration platform built
111111+on atproto helsinki, finland · https://anirudh.fi ·
112112+(somewhat) effective altruist
113113+---
114114+Anil Madhavapeddy
115115+Professor of Planetary Computing at the University of
116116+Cambridge @cst.cam.ac.uk, where I co-lead the
117117+@eeg.cl.cam.ac.uk, and am also to found at
118118+@conservation.cam.ac.uk. Homepage at
119119+https://anil.recoil.org
120120+---
121121+Tangled
122122+https://tangled.sh is a git collaboration platform built
123123+on atproto. Social coding, but for real this time!
124124+Discord: chat.tangled.sh IRC: #tangled @ libera.chat
125125+Built by @oppi.li &amp; @icyphox.sh
126126+---</code></pre>
127127+<p>All my friends use <a href="https://tangled.sh">tangled.sh</a>, which
128128+requires them to publish their ssh public key to their PDii (PDSes?).
129129+Perhaps I would like to add their keys to my allowed_signers file to
130130+verify their commit signatures:</p>
131131+<pre><code>λ for dir in ./*/sh.tangled.publicKey;
132132+ do cat $dir/$(ls -r $dir | head -n1) | jq -r &#39;.key&#39;;
133133+ done | tee allowed_signers
134134+ssh-rsa AAAAB3NzaC1yc2EAAA...dHPqc= steveklabnik@DESKTOP-VV370NK
135135+ssh-ed25519 AAAAC3NzaC1lZD...g9bAdk icy@wyndle
136136+ssh-ed25519 AAAAC3NzaC1lZD...BqlM1u anil@recoil.org</code></pre>
137137+<p>FUSE is quite liberating in that it allows you to represent anything
138138+as a filesystem. When applications like <code>ls</code> and
139139+<code>cat</code> are executed, the syscalls to <code>open</code> and
140140+<code>read</code> are rerouted to your custom fs implementation (pdsfs
141141+in this case). The custom fs implementation is free to as it pleases, in
142142+fact the first iteration of pdsfs accessed the network for each
143143+open/read call to fetch live data from PDii.</p>
144144+<section id="footnotes" class="footnotes footnotes-end-of-document"
145145+role="doc-endnotes">
146146+<hr />
147147+<ol>
148148+<li id="fn1"><p>https://atproto.com/guides/data-repos<a href="#fnref1"
149149+class="footnote-back" role="doc-backlink">↩︎</a></p></li>
150150+<li id="fn2"><p>https://atproto.com<a href="#fnref2"
151151+class="footnote-back" role="doc-backlink">↩︎</a></p></li>
152152+<li id="fn3"><p>https://en.wikipedia.org/wiki/Decentralized_identifier<a
153153+href="#fnref3" class="footnote-back" role="doc-backlink">↩︎</a></p></li>
154154+</ol>
155155+</section></description>
156156+<link>https://oppi.li/posts/mounting_the_atmosphere/</link>
157157+<pubDate>Wed, 30 Jul 2025 20:25:00 +0000</pubDate>
158158+<guid>https://oppi.li/posts/mounting_the_atmosphere/</guid>
159159+</item>
160160+<item>
15161<title>Configuring Jujutsu</title>
16162<description><p>There are a lot of reasons to use <a
17163href="https://github.com/jj-vcs/jj">jujutsu</a>, but this post is not
···11+<!DOCTYPE html>
22+<html lang="en">
33+ <head>
44+ <link rel="stylesheet" href="/style.css">
55+ <link rel="stylesheet" href="/syntax.css">
66+ <meta charset="UTF-8">
77+ <meta name="viewport" content="initial-scale=1">
88+ <meta content="#ffffff" name="theme-color">
99+ <meta name="HandheldFriendly" content="true">
1010+ <meta property="og:title" content="Mounting The Atmosphere">
1111+ <meta property="og:type" content="website">
1212+ <meta property="og:description" content="a static site {for, by, about} me ">
1313+ <meta property="og:url" content="https://oppi.li/posts/mounting_the_atmosphere">
1414+ <link rel="icon" type="image/x-icon" href="/favicon.png">
1515+ <title>Mounting The Atmosphere · oppi.li</title>
1616+ <body>
1717+ <div class="posts">
1818+ <div class="post">
1919+ <a href="/" class="post-end-link">Home</a>
2020+ <span>/</span>
2121+ <a href="/posts" class="post-end-link">Posts</a>
2222+ <span>/</span>
2323+ <a class="post-end-link">Mounting The Atmosphere</a>
2424+ <a class="stats post-end-link" href="https://tangled.sh/@oppi.li/site/raw/main/posts/mounting_the_atmosphere.md
2525+">View Raw</a>
2626+ <div class="separator"></div>
2727+ <div class="date">
2828+ 30/07 — 2025
2929+ <div class="stats">
3030+ <span class="stats-number">
3131+ 60.34
3232+ </span>
3333+ <span class="stats-unit">cm</span>
3434+  
3535+ <span class="stats-number">
3636+ 4.3
3737+ </span>
3838+ <span class="stats-unit">min</span>
3939+ </div>
4040+ </div>
4141+ <h1>
4242+ Mounting The Atmosphere
4343+ </h1>
4444+ <div class="post-text">
4545+ <p><a href="https://tangled.sh/@oppi.li/pdsfs">pdsfs</a> is a tool that
4646+mounts atproto PDS repositories as a FUSE filesystem.</p>
4747+<p>A PDS repository<a href="#fn1" class="footnote-ref" id="fnref1"
4848+role="doc-noteref"><sup>1</sup></a> contains all data published by a
4949+user to the atmosphere<a href="#fn2" class="footnote-ref" id="fnref2"
5050+role="doc-noteref"><sup>2</sup></a>. It is exportable as a CAR
5151+(content-addressable archive) file. pdsfs is a tool that mounts this CAR
5252+file as a readonly-FUSE filesystem, allowing quick and easy
5353+exploration.</p>
5454+<p>To motivate the need for such a program, we could begin by mounting a
5555+repository:</p>
5656+<pre><code>λ pdsfs oppi.li
5757+mounted at "mnt"
5858+hit enter to unmount and exit...</code></pre>
5959+<p>oppi.li is my handle in the atmosphere. The tool does some hardwork
6060+to determine the location of my PDS repository given my handle, but that
6161+is not important. Let’s have a look around:</p>
6262+<pre><code>λ ls mnt/
6363+did:plc:qfpnj4og54vl56wngdriaxug/</code></pre>
6464+<p>The <code>did:plc:stuff</code> is my DID<a href="#fn3"
6565+class="footnote-ref" id="fnref3" role="doc-noteref"><sup>3</sup></a>.
6666+Digging deeper:</p>
6767+<pre><code>λ ls mnt/did\:plc\:qfpnj4og54vl56wngdriaxug/
6868+app.bsky.actor.profile/ place.stream.chat.message/
6969+app.bsky.actor.status/ place.stream.chat.profile/
7070+app.bsky.feed.generator/ place.stream.key/
7171+app.bsky.feed.like/ place.stream.livestream/
7272+app.bsky.feed.post/ sh.tangled.actor.profile/
7373+app.bsky.feed.repost/ sh.tangled.feed.reaction/
7474+app.bsky.graph.block/ sh.tangled.feed.star/
7575+app.bsky.graph.follow/ sh.tangled.graph.follow/
7676+app.rocksky.album/ sh.tangled.knot/
7777+app.rocksky.artist/ sh.tangled.knot.member/
7878+.
7979+.
8080+.</code></pre>
8181+<p>We have some data from the repository now. These are “collections”.
8282+If I want to publish a post to Bluesky, I would write content to the
8383+<code>app.bsky.feed.post</code> collection in my PDS. This will then be
8484+indexed by a Bluesky appview (such as <a
8585+href="https://bsky.app">bsky.app</a> or <a
8686+href="https://zeppelin.social">zeppelin.social</a>) and show up under my
8787+profile there.</p>
8888+<p>pdsfs is kind enough to deserialize the in the PDS repository (stored
8989+as CBOR normally) to JSON on the filesystem:</p>
9090+<pre><code>λ cat sh.tangled.repo/3ljidbevrjh22 | jq
9191+{
9292+ "$type": "sh.tangled.repo",
9393+ "addedAt": "2025-03-03T16:04:13Z",
9494+ "knot": "knot1.tangled.sh",
9595+ "name": "hello-world",
9696+ "owner": "did:plc:3danwc67lo7obz2fmdg6jxcr"
9797+}</code></pre>
9898+<p>Thanks pdsfs!</p>
9999+<p>I publish my music listening habits to my PDS to the
100100+<code>app.rocksky.scrobble</code> collection, because <a
101101+href="https://rocksky.app">Rocksky</a> recognizes and indexes this
102102+collection. I have wired up my personal navidrome instance to write data
103103+of this form into my PDS everytime I listen to a track. Here are my top
104104+artists in order:</p>
105105+<pre><code>λ jq -r '.artist' app.rocksky.scrobble/* | sort | uniq -c | sort -nr
106106+ 117 Thank You Scientist
107107+ 45 FKJ
108108+ 34 Covet
109109+ 33 VOLA
110110+ 23 Sam Cooke
111111+ 22 Dark Tranquillity
112112+ 21 Piero Piccioni
113113+ 12 Bloodywood
114114+ 11 Frank Sinatra
115115+ 10 Dream Theater</code></pre>
116116+<p>It is true, I love Sam Cooke.</p>
117117+<p>pdsfs allows mounting multiple repositories at a time. Allow me to
118118+introduce my friends:</p>
119119+<pre><code>λ pdsfs icyphox.sh anil.recoil.org steveklabnik.com tangled.sh
120120+using cached CAR file for...did:plc:hwevmowznbiukdf6uk5dwrrq
121121+using cached CAR file for...did:plc:nhyitepp3u4u6fcfboegzcjw
122122+download complete for...did:plc:3danwc67lo7obz2fmdg6jxcr
123123+download complete for...did:plc:wshs7t2adsemcrrd4snkeqli
124124+mounted at "mnt"
125125+hit enter to unmount and exit...
126126+127127+# -- in a separate shell --
128128+129129+λ cat ./mnt/*/app.bsky.actor.profile/* \
130130+ | jq -r '"\(.displayName)\n\(.description)\n---"' \
131131+ | sed '/^$/d'
132132+Steve Klabnik
133133+#rustlang, #jj-vcs, atproto, shitposts, urbanism. I
134134+contain multitudes. Working on #ruelang but just for
135135+fun. Currently in Austin, TX, but from Pittsburgh.
136136+Previously in Bushwick, the Mission, LA.
137137+---
138138+Anirudh Oppiliappan
139139+building @tangled.sh — code collaboration platform built
140140+on atproto helsinki, finland · https://anirudh.fi ·
141141+(somewhat) effective altruist
142142+---
143143+Anil Madhavapeddy
144144+Professor of Planetary Computing at the University of
145145+Cambridge @cst.cam.ac.uk, where I co-lead the
146146+@eeg.cl.cam.ac.uk, and am also to found at
147147+@conservation.cam.ac.uk. Homepage at
148148+https://anil.recoil.org
149149+---
150150+Tangled
151151+https://tangled.sh is a git collaboration platform built
152152+on atproto. Social coding, but for real this time!
153153+Discord: chat.tangled.sh IRC: #tangled @ libera.chat
154154+Built by @oppi.li & @icyphox.sh
155155+---</code></pre>
156156+<p>All my friends use <a href="https://tangled.sh">tangled.sh</a>, which
157157+requires them to publish their ssh public key to their PDii (PDSes?).
158158+Perhaps I would like to add their keys to my allowed_signers file to
159159+verify their commit signatures:</p>
160160+<pre><code>λ for dir in ./*/sh.tangled.publicKey;
161161+ do cat $dir/$(ls -r $dir | head -n1) | jq -r '.key';
162162+ done | tee allowed_signers
163163+ssh-rsa AAAAB3NzaC1yc2EAAA...dHPqc= steveklabnik@DESKTOP-VV370NK
164164+ssh-ed25519 AAAAC3NzaC1lZD...g9bAdk icy@wyndle
165165+ssh-ed25519 AAAAC3NzaC1lZD...BqlM1u anil@recoil.org</code></pre>
166166+<p>FUSE is quite liberating in that it allows you to represent anything
167167+as a filesystem. When applications like <code>ls</code> and
168168+<code>cat</code> are executed, the syscalls to <code>open</code> and
169169+<code>read</code> are rerouted to your custom fs implementation (pdsfs
170170+in this case). The custom fs implementation is free to as it pleases, in
171171+fact the first iteration of pdsfs accessed the network for each
172172+open/read call to fetch live data from PDii.</p>
173173+<section id="footnotes" class="footnotes footnotes-end-of-document"
174174+role="doc-endnotes">
175175+<hr />
176176+<ol>
177177+<li id="fn1"><p>https://atproto.com/guides/data-repos<a href="#fnref1"
178178+class="footnote-back" role="doc-backlink">↩︎</a></p></li>
179179+<li id="fn2"><p>https://atproto.com<a href="#fnref2"
180180+class="footnote-back" role="doc-backlink">↩︎</a></p></li>
181181+<li id="fn3"><p>https://en.wikipedia.org/wiki/Decentralized_identifier<a
182182+href="#fnref3" class="footnote-back" role="doc-backlink">↩︎</a></p></li>
183183+</ol>
184184+</section>
185185+186186+ </div>
187187+188188+ <div class="intro">
189189+ Hi.
190190+ <div class="hot-links">
191191+ <a href="/index.xml" class="feed-button">Subscribe</a>
192192+ </div>
193193+ <p>I'm Akshay, programmer, pixel-artist & programming-language enthusiast.</p>
194194+ <p>I am currently building <a href="https://tangled.sh">tangled.sh</a> — a new social-enabled code-collaboration platform.</p>
195195+ <p>Reach out at oppili@libera.chat.</p>
196196+ </div>
197197+198198+ <a href="/" class="post-end-link">Home</a>
199199+ <span>/</span>
200200+ <a href="/posts" class="post-end-link">Posts</a>
201201+ <span>/</span>
202202+ <a class="post-end-link">Mounting The Atmosphere</a>
203203+ <a class="stats post-end-link" href="https://tangled.sh/@oppi.li/site/raw/main/posts/mounting_the_atmosphere.md
204204+">View Raw</a>
205205+ </div>
206206+ </div>
207207+ </body>
208208+</html>
+151
posts/mounting_the_atmosphere.md
···11+[pdsfs](https://tangled.sh/@oppi.li/pdsfs) is a tool that
22+mounts atproto PDS repositories as a FUSE filesystem.
33+44+A PDS repository[^0] contains all data published by a user to
55+the atmosphere[^1]. It is exportable as a CAR
66+(content-addressable archive) file. pdsfs is a tool that
77+mounts this CAR file as a readonly-FUSE filesystem, allowing
88+quick and easy exploration.
99+1010+To motivate the need for such a program, we could begin by
1111+mounting a repository:
1212+1313+ λ pdsfs oppi.li
1414+ mounted at "mnt"
1515+ hit enter to unmount and exit...
1616+1717+oppi.li is my handle in the atmosphere. The tool does some
1818+hardwork to determine the location of my PDS repository
1919+given my handle, but that is not important. Let's have a
2020+look around:
2121+2222+ λ ls mnt/
2323+ did:plc:qfpnj4og54vl56wngdriaxug/
2424+2525+The `did:plc:stuff` is my DID[^2]. Digging deeper:
2626+2727+ λ ls mnt/did\:plc\:qfpnj4og54vl56wngdriaxug/
2828+ app.bsky.actor.profile/ place.stream.chat.message/
2929+ app.bsky.actor.status/ place.stream.chat.profile/
3030+ app.bsky.feed.generator/ place.stream.key/
3131+ app.bsky.feed.like/ place.stream.livestream/
3232+ app.bsky.feed.post/ sh.tangled.actor.profile/
3333+ app.bsky.feed.repost/ sh.tangled.feed.reaction/
3434+ app.bsky.graph.block/ sh.tangled.feed.star/
3535+ app.bsky.graph.follow/ sh.tangled.graph.follow/
3636+ app.rocksky.album/ sh.tangled.knot/
3737+ app.rocksky.artist/ sh.tangled.knot.member/
3838+ .
3939+ .
4040+ .
4141+4242+We have some data from the repository now. These are
4343+"collections". If I want to publish a post to Bluesky, I
4444+would write content to the `app.bsky.feed.post` collection
4545+in my PDS. This will then be indexed by a Bluesky appview
4646+(such as [bsky.app](https://bsky.app) or
4747+[zeppelin.social](https://zeppelin.social)) and show up
4848+under my profile there.
4949+5050+pdsfs is kind enough to deserialize the in the PDS
5151+repository (stored as CBOR normally) to JSON on the
5252+filesystem:
5353+5454+ λ cat sh.tangled.repo/3ljidbevrjh22 | jq
5555+ {
5656+ "$type": "sh.tangled.repo",
5757+ "addedAt": "2025-03-03T16:04:13Z",
5858+ "knot": "knot1.tangled.sh",
5959+ "name": "hello-world",
6060+ "owner": "did:plc:3danwc67lo7obz2fmdg6jxcr"
6161+ }
6262+6363+Thanks pdsfs!
6464+6565+I publish my music listening habits to my PDS to the
6666+`app.rocksky.scrobble` collection, because
6767+[Rocksky](https://rocksky.app) recognizes and indexes this
6868+collection. I have wired up my personal navidrome instance
6969+to write data of this form into my PDS everytime I listen to
7070+a track. Here are my top artists in order:
7171+7272+ λ jq -r '.artist' app.rocksky.scrobble/* | sort | uniq -c | sort -nr
7373+ 117 Thank You Scientist
7474+ 45 FKJ
7575+ 34 Covet
7676+ 33 VOLA
7777+ 23 Sam Cooke
7878+ 22 Dark Tranquillity
7979+ 21 Piero Piccioni
8080+ 12 Bloodywood
8181+ 11 Frank Sinatra
8282+ 10 Dream Theater
8383+8484+It is true, I love Sam Cooke.
8585+8686+pdsfs allows mounting multiple repositories at a time. Allow
8787+me to introduce my friends:
8888+8989+ λ pdsfs icyphox.sh anil.recoil.org steveklabnik.com tangled.sh
9090+ using cached CAR file for...did:plc:hwevmowznbiukdf6uk5dwrrq
9191+ using cached CAR file for...did:plc:nhyitepp3u4u6fcfboegzcjw
9292+ download complete for...did:plc:3danwc67lo7obz2fmdg6jxcr
9393+ download complete for...did:plc:wshs7t2adsemcrrd4snkeqli
9494+ mounted at "mnt"
9595+ hit enter to unmount and exit...
9696+9797+ # -- in a separate shell --
9898+9999+ λ cat ./mnt/*/app.bsky.actor.profile/* \
100100+ | jq -r '"\(.displayName)\n\(.description)\n---"' \
101101+ | sed '/^$/d'
102102+ Steve Klabnik
103103+ #rustlang, #jj-vcs, atproto, shitposts, urbanism. I
104104+ contain multitudes. Working on #ruelang but just for
105105+ fun. Currently in Austin, TX, but from Pittsburgh.
106106+ Previously in Bushwick, the Mission, LA.
107107+ ---
108108+ Anirudh Oppiliappan
109109+ building @tangled.sh — code collaboration platform built
110110+ on atproto helsinki, finland · https://anirudh.fi ·
111111+ (somewhat) effective altruist
112112+ ---
113113+ Anil Madhavapeddy
114114+ Professor of Planetary Computing at the University of
115115+ Cambridge @cst.cam.ac.uk, where I co-lead the
116116+ @eeg.cl.cam.ac.uk, and am also to found at
117117+ @conservation.cam.ac.uk. Homepage at
118118+ https://anil.recoil.org
119119+ ---
120120+ Tangled
121121+ https://tangled.sh is a git collaboration platform built
122122+ on atproto. Social coding, but for real this time!
123123+ Discord: chat.tangled.sh IRC: #tangled @ libera.chat
124124+ Built by @oppi.li & @icyphox.sh
125125+ ---
126126+127127+All my friends use [tangled.sh](https://tangled.sh), which
128128+requires them to publish their ssh public key to their PDii
129129+(PDSes?). Perhaps I would like to add their keys to my
130130+allowed_signers file to verify their commit signatures:
131131+132132+ λ for dir in ./*/sh.tangled.publicKey;
133133+ do cat $dir/$(ls -r $dir | head -n1) | jq -r '.key';
134134+ done | tee allowed_signers
135135+ ssh-rsa AAAAB3NzaC1yc2EAAA...dHPqc= steveklabnik@DESKTOP-VV370NK
136136+ ssh-ed25519 AAAAC3NzaC1lZD...g9bAdk icy@wyndle
137137+ ssh-ed25519 AAAAC3NzaC1lZD...BqlM1u anil@recoil.org
138138+139139+FUSE is quite liberating in that it allows you to represent
140140+anything as a filesystem. When applications like `ls` and
141141+`cat` are executed, the syscalls to `open` and `read` are
142142+rerouted to your custom fs implementation (pdsfs in this
143143+case). The custom fs implementation is free to as it
144144+pleases, in fact the first iteration of pdsfs accessed the
145145+network for each open/read call to fetch live data from
146146+PDii.
147147+148148+149149+[^0]: https://atproto.com/guides/data-repos
150150+[^1]: https://atproto.com
151151+[^2]: https://en.wikipedia.org/wiki/Decentralized_identifier