+4
app/app.vue
+4
app/app.vue
+148
-7
content/posts/0-draft-embracing-atproto-pt-1-hosting-pds.md
+148
-7
content/posts/0-draft-embracing-atproto-pt-1-hosting-pds.md
···description: In this series of posts, I'll explore my journey into setting up my workflows and services for atproto. The first step is setting up my PDS. Let's start with a bit of explanation for all this lingo.···-Atproto is decentralised in a different way to other solutions like [ActivityPub](https://en.wikipedia.org/wiki/ActivityPub), which services like Mastodon implement.-When you host a Mastodon instance, you immediately control and manage the different parts: you control your data, your web interface and API.-However, the ActivityPub principle is to make different instances communicate with each other, so everyone communicates with everyone directly
···description: In this series of posts, I'll explore my journey into setting up my workflows and services for atproto. The first step is setting up my PDS. Let's start with a bit of explanation for all this lingo.···+Atproto is decentralised in a way that differs from other solutions like [ActivityPub](https://en.wikipedia.org/wiki/ActivityPub), which services like Mastodon implement.+Let's go over some rough definitions for the important bits, you'll find better explanations in the [atproto docs](https://atproto.com/guides/glossary).+A relay is the part of the stack that ingests all the information sent from the PDSes, and exposes it for use in AppViews.+It's an optimisation in the network to avoid many-to-many connections between PDSes and AppViews.+[Bluesky](https://bsky.social/about) is an AppView, so are [tangled.sh](https://tangled.sh/) and [Smoke Signals](https://smokesignal.events/).+They receive all the information from the Relays, and filter out only what they need in order to display it into a usable application.+The smallest—and most common—part to self-host is the PDS, enabling you to own your data, while still using Bluesky and the same atproto apps.+- A server connected to the internet running Debian or Ubuntu (a VPS, a Raspberry Pi, a laptop that's always on, whatever)+I chose to get a new [UpCloud](https://upcloud.com/) VPS, and use a `pds.finxol.io` subdomain of my usual domain.+I could've used one of the other VPSes I have, but I've been meaning to migrate off of Digital Ocean for some time, mainly because it's a bit too expensive for me, but also because I prefer to use European services whenever possible.+The setup process is super easy and very well explained [in their docs](https://github.com/bluesky-social/pds/blob/main/README.md#self-hosting-pds).+I did have to make a couple tweaks to it to make it play well with the rest of my setup though.+Since it's not one of the required Debian 11 or 12, the script won't let me continue the install.+I didn't want [watchtower](https://github.com/containrrr/watchtower) to update all my containers constantly, and I was running caddy externally for all my other stuff,+so I just removed those lines in the compose file and moved the Caddy directives to my root Caddyfile.+Once the script finished and everything was running, I simply pinged the pds with `curl https://pds.finxol.io/xrpc/_health`,+tested the websocket connection as stated in the docs, only with [`websocat`](https://github.com/vi/websocat),+If you mess up your account migration, you might lose your existing data (which I'd prefer not to).+I chose to go the easy way and follow [Tophhie's blog post](https://blog.tophhie.cloud/host-your-own-bluesky-pds-a-complete-azure-powered-guide/#%F0%9F%8F%83%E2%80%8D%E2%99%80%EF%B8%8F%E2%80%8D%E2%9E%A1%EF%B8%8F-4-migration-from-blueskys-pds).+This makes use of Bluesky's very convenient [goat](https://github.com/bluesky-social/goat) atproto CLI tool,+Following these steps, I gathered the required info, ran the migration command, and boom, I now own my atproto identity!+Since a PDS is basically your entire identity on atproto, it's rather important not to lose it.+I chose a very simple path again: use [restic](https://restic.net/) to throw the data into an S3 bucket periodically with crontab.+it works with "repositories", so you get encrypted versioned backups on a multitude of supported storage types.+I know I won't be filling that up with backups any time soon, but I've got some other buckets in there taking up space.+restic -r s3:https://top-secret.upcloudobjects.com/akhaten-bckp/pds backup /pds --skip-if-unchanged+I know storing the keys as raw values in there isn't very safe, but I've restricted the S3 access key as much as I can.+I might also back it up to something else, maybe Hetzner Object Storage, Proton Drive ([through rclone](https://rclone.org/protondrive/)), Scaleway Storage, or some other server over SFTP.+As an added bonus, since your PDS stores and serves your identity on the atproto network, you can also have it [lie about your age verification status](https://bsky.app/profile/mary.my.id/post/3ltwlpjciecsq),+and bypass the age check requirements recently put in place [in the UK](https://en.wikipedia.org/wiki/Online_Safety_Act_2023#Age_verification) and other places.
+2
public/posts/embracing-atproto-pt1/atproto.svg
+2
public/posts/embracing-atproto-pt1/atproto.svg
···
···+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1245.0708356447292 639.6871647725627" width="3735.2125069341873" height="1919.0614943176881"><!-- svg-source:excalidraw --><metadata></metadata><defs><style class="style-fonts">+@font-face { font-family: Excalifont; src: url(data:font/woff2;base64,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); }</style></defs><g stroke-linecap="round" transform="translate(12.53589454114109 208.60045122253916) rotate(0 141.15093591431628 33.64519569117522)"><path d="M16.82 0 C85.91 -1.61, 153.73 0.01, 265.48 0 M16.82 0 C112.31 1.08, 206.38 0.7, 265.48 0 M265.48 0 C278.47 -0.72, 283.37 4.47, 282.3 16.82 M265.48 0 C278.18 1.24, 282.18 7.3, 282.3 16.82 M282.3 16.82 C281.87 22.8, 282.21 28.84, 282.3 50.47 M282.3 16.82 C282.59 29.93, 282.23 43.46, 282.3 50.47 M282.3 50.47 C283.58 60.5, 276.84 65.96, 265.48 67.29 M282.3 50.47 C280.91 62.39, 278.15 66.28, 265.48 67.29 M265.48 67.29 C185.41 69.47, 106.86 68.47, 16.82 67.29 M265.48 67.29 C206.25 69.69, 148.22 68.56, 16.82 67.29 M16.82 67.29 C4.72 69.03, 0.62 60.57, 0 50.47 M16.82 67.29 C5.96 65.65, -0.23 60.72, 0 50.47 M0 50.47 C-1.25 41.02, 0.33 37.1, 0 16.82 M0 50.47 C-0.79 38.44, 0.94 25.05, 0 16.82 M0 16.82 C-1.65 7.29, 7.03 -1.19, 16.82 0 M0 16.82 C1.84 4.34, 6.86 1.37, 16.82 0" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(27.7201632801644 232.24564691371438) rotate(0 125.96666717529297 10)"><text x="125.96666717529297" y="14.096" font-family="Excalifont, Xiaolai, sans-serif, Segoe UI Emoji" font-size="16px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">magic.us-west.host.bsky.network</text></g><g transform="translate(99.86302055486436 63.98124599448033) rotate(0 52.52342980777212 31.263946945168527)"><text x="0" y="44.06965961390956" font-family="Excalifont, Xiaolai, sans-serif, Segoe UI Emoji" font-size="50.022315112269645px" fill="#1e1e1e" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">PDS</text></g><g transform="translate(1058.6471613190301 10) rotate(0 87.94532149509178 28.81004180052136)"><text x="0" y="40.61063492201491" font-family="Excalifont, Xiaolai, sans-serif, Segoe UI Emoji" font-size="46.09606688083418px" fill="#1e1e1e" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">AppView</text></g><g stroke-linecap="round" transform="translate(11.746379013078524 320.1739808560354) rotate(0 141.15093591431628 33.64519569117522)"><path d="M16.82 0 C113.59 -1.39, 210.73 -1.77, 265.48 0 M16.82 0 C99.79 1.28, 183.37 2.25, 265.48 0 M265.48 0 C275.99 -1.75, 283.47 4.68, 282.3 16.82 M265.48 0 C277.73 -1.64, 282.01 6.76, 282.3 16.82 M282.3 16.82 C283.65 28.59, 282.62 41.64, 282.3 50.47 M282.3 16.82 C281.44 23.31, 282.67 30.97, 282.3 50.47 M282.3 50.47 C283.22 59.94, 276.4 67.61, 265.48 67.29 M282.3 50.47 C284.4 61.03, 276.79 69.31, 265.48 67.29 M265.48 67.29 C203.32 64.35, 137.75 64.07, 16.82 67.29 M265.48 67.29 C182.6 67.47, 98.44 67.41, 16.82 67.29 M16.82 67.29 C5.05 66.47, 1.77 62.16, 0 50.47 M16.82 67.29 C4.92 66.34, -0.28 62.07, 0 50.47 M0 50.47 C1.83 42.99, -0.98 32.54, 0 16.82 M0 50.47 C-0.82 44.14, 0.47 36.35, 0 16.82 M0 16.82 C1.8 5.92, 4.71 -0.5, 16.82 0 M0 16.82 C-0.88 7.23, 4.68 -1.14, 16.82 0" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(20.59731187563699 343.81917654721065) rotate(0 132.3000030517578 10)"><text x="132.3000030517578" y="14.096" font-family="Excalifont, Xiaolai, sans-serif, Segoe UI Emoji" font-size="16px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">button.us-west.host.bsky.network</text></g><g stroke-linecap="round" transform="translate(11.74637901307841 436.8340536924983) rotate(0 141.15093591431628 33.64519569117522)"><path d="M16.82 0 C75.77 2.01, 136.46 0.07, 265.48 0 M16.82 0 C80.74 -0.03, 145.95 0.46, 265.48 0 M265.48 0 C277.66 -0.85, 281.24 3.89, 282.3 16.82 M265.48 0 C277.18 1.17, 280.59 7.62, 282.3 16.82 M282.3 16.82 C282.71 27.84, 281.9 39.87, 282.3 50.47 M282.3 16.82 C283.04 29.28, 281.42 41.64, 282.3 50.47 M282.3 50.47 C283.09 60.18, 275.43 65.3, 265.48 67.29 M282.3 50.47 C282.61 60.4, 274.47 68.91, 265.48 67.29 M265.48 67.29 C184.28 65.41, 100 67.42, 16.82 67.29 M265.48 67.29 C191.36 66.51, 116.79 66.75, 16.82 67.29 M16.82 67.29 C4.98 66.28, 0.78 59.69, 0 50.47 M16.82 67.29 C6.02 65.11, 1.63 59.94, 0 50.47 M0 50.47 C0.78 40.37, -0.64 30.7, 0 16.82 M0 50.47 C-0.13 37.32, -0.61 23.19, 0 16.82 M0 16.82 C1.26 5.88, 4.04 -1.42, 16.82 0 M0 16.82 C-0.08 4.06, 4.04 -0.45, 16.82 0" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(29.980650803859533 460.4792493836735) rotate(0 122.91666412353516 10)"><text x="122.91666412353516" y="14.096" font-family="Excalifont, Xiaolai, sans-serif, Segoe UI Emoji" font-size="16px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">coral.us-east.host.bsky.network</text></g><g stroke-linecap="round" transform="translate(10 540.6942622166188) rotate(0 141.1509359143163 33.64519569117522)"><path d="M16.82 0 C97.87 0.85, 177.85 0.08, 265.48 0 M16.82 0 C70.24 -0.86, 124.92 -0.82, 265.48 0 M265.48 0 C275.33 -0.39, 283.51 4.87, 282.3 16.82 M265.48 0 C275.65 -0.98, 281.74 7.37, 282.3 16.82 M282.3 16.82 C282.44 27.68, 280.05 38.02, 282.3 50.47 M282.3 16.82 C282.36 24.76, 282.42 30.79, 282.3 50.47 M282.3 50.47 C283.38 60.33, 275.08 66.01, 265.48 67.29 M282.3 50.47 C280.53 61, 276.82 68.3, 265.48 67.29 M265.48 67.29 C166.25 69.85, 68.32 67.22, 16.82 67.29 M265.48 67.29 C190.78 67.21, 115.99 68, 16.82 67.29 M16.82 67.29 C3.97 66.94, -0.98 61.84, 0 50.47 M16.82 67.29 C6.09 66.85, -0.03 62.95, 0 50.47 M0 50.47 C-1.84 40, -1.64 29.05, 0 16.82 M0 50.47 C-0.63 40.06, 0.29 30.05, 0 16.82 M0 16.82 C-0.59 5.54, 6.47 1.52, 16.82 0 M0 16.82 C0.65 7.19, 7.38 -1.74, 16.82 0" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(105.05093744019518 564.339457907794) rotate(0 46.09999847412112 10)"><text x="46.099998474121094" y="14.096" font-family="Excalifont, Xiaolai, sans-serif, Segoe UI Emoji" font-size="16px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">pds.finxol.io</text></g><g stroke-linecap="round" transform="translate(587.458972508402 251.32456520512858) rotate(0 112.77308616408953 110.32414046837806)"><path d="M141.25 27.75 C155.53 39.19, 166.17 53.27, 197.3 83.25 M141.25 27.75 C161.02 46.22, 179.1 66.41, 197.3 83.25 M197.3 83.25 C225.35 112.85, 226.68 110.63, 197.3 138.75 M197.3 83.25 C226.82 110.82, 225.98 109.07, 197.3 138.75 M197.3 138.75 C179.9 154.03, 160.31 171.13, 141.25 192.9 M197.3 138.75 C184.53 150.87, 172.5 162.61, 141.25 192.9 M141.25 192.9 C113.94 219.84, 111.7 222.19, 84.75 192.9 M141.25 192.9 C113.42 222.84, 113.22 220.64, 84.75 192.9 M84.75 192.9 C72.18 181.2, 62.11 169.45, 28.25 138.75 M84.75 192.9 C67.63 175.1, 48.56 158.37, 28.25 138.75 M28.25 138.75 C1.23 112.48, 1.97 112.47, 28.25 83.25 M28.25 138.75 C0.46 109.85, -0.7 109.51, 28.25 83.25 M28.25 83.25 C47.81 65.12, 66.53 45.24, 84.75 27.75 M28.25 83.25 C48.32 63.9, 67.35 43.86, 84.75 27.75 M84.75 27.75 C113.9 -0.31, 111.01 1.04, 141.25 27.75 M84.75 27.75 C113.16 -1.8, 115 -1.84, 141.25 27.75" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(653.4788507039721 338.9866354393176) rotate(0 46.86666488647461 22.5)"><text x="46.86666488647461" y="31.716" font-family="Excalifont, Xiaolai, sans-serif, Segoe UI Emoji" font-size="36px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">Relay</text></g><g stroke-linecap="round" transform="translate(1084.3309481878302 147.31952491048608) rotate(0 72.21492282818883 71.51380707257532)"><path d="M70.98 0.85 C81.02 -0.42, 93.79 1.83, 103.37 5.89 C112.95 9.95, 121.98 17.25, 128.45 25.19 C134.91 33.14, 139.81 43.44, 142.14 53.56 C144.47 63.69, 144.72 75.53, 142.44 85.92 C140.15 96.31, 134.69 107.78, 128.42 115.9 C122.15 124.01, 113.9 130.05, 104.82 134.61 C95.74 139.17, 84.54 143.12, 73.95 143.26 C63.36 143.41, 50.82 139.85, 41.27 135.48 C31.72 131.11, 23.25 124.77, 16.64 117.06 C10.02 109.36, 4.22 99.19, 1.57 89.26 C-1.07 79.33, -1.3 67.74, 0.79 57.49 C2.87 47.23, 7.4 36.18, 14.08 27.73 C20.76 19.28, 29.78 11.22, 40.85 6.77 C51.92 2.32, 72.33 1.51, 80.48 1.03 C88.64 0.55, 89.86 2.66, 89.78 3.9 M83.14 -0.41 C93.37 0.03, 106.11 5.41, 114.99 11.83 C123.87 18.25, 131.67 28.84, 136.42 38.1 C141.16 47.36, 143.03 57.35, 143.45 67.41 C143.87 77.47, 142.83 89.1, 138.94 98.45 C135.05 107.81, 127.83 116.68, 120.12 123.54 C112.42 130.39, 102.67 136.69, 92.71 139.58 C82.76 142.47, 70.52 142.56, 60.4 140.87 C50.28 139.18, 40.32 135.1, 32 129.43 C23.68 123.75, 15.81 115.99, 10.46 106.83 C5.11 97.67, 0.98 84.71, -0.07 74.48 C-1.13 64.25, 0.41 55.03, 4.16 45.46 C7.9 35.88, 14.45 24.07, 22.42 17.02 C30.38 9.97, 41.53 5.78, 51.94 3.17 C62.36 0.56, 79.43 1.4, 84.9 1.37 C90.37 1.33, 84.88 2.1, 84.78 2.99" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(1123.7988750307577 208.76543405357688) rotate(0 32.68333435058594 10)"><text x="32.68333435058594" y="14.096" font-family="Excalifont, Xiaolai, sans-serif, Segoe UI Emoji" font-size="16px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">bsky.app</text></g><g stroke-linecap="round" transform="translate(1088.5376427215112 322.59846381385694) rotate(0 72.21492282818883 71.51380707257533)"><path d="M99.48 4.89 C109.18 7.44, 118.36 14.86, 125.46 22.47 C132.55 30.07, 139.02 40.55, 142.05 50.5 C145.09 60.46, 145.37 71.99, 143.66 82.21 C141.94 92.43, 137.62 103.13, 131.77 111.82 C125.92 120.5, 117.53 129.1, 108.56 134.33 C99.59 139.57, 88.35 142.65, 77.96 143.21 C67.56 143.77, 55.83 141.61, 46.18 137.68 C36.53 133.75, 27.21 127.26, 20.06 119.64 C12.91 112.01, 6.49 101.84, 3.28 91.94 C0.08 82.04, -0.59 70.5, 0.86 60.23 C2.3 49.96, 6.21 38.77, 11.97 30.31 C17.72 21.86, 26.14 14.57, 35.39 9.47 C44.63 4.37, 55.67 -0.19, 67.44 -0.26 C79.22 -0.33, 98.48 6.82, 106.02 9.05 C113.55 11.28, 113.32 12.31, 112.66 13.1 M100.5 4.56 C109.72 7.61, 117.67 17.13, 124.78 24.8 C131.89 32.48, 139.87 40.62, 143.16 50.61 C146.45 60.59, 146.58 74.4, 144.52 84.7 C142.45 94.99, 137.24 103.99, 130.75 112.37 C124.27 120.75, 114.91 129.82, 105.6 134.99 C96.29 140.16, 85.26 142.73, 74.88 143.38 C64.5 144.04, 52.95 143.13, 43.31 138.93 C33.68 134.72, 23.74 126.34, 17.06 118.13 C10.38 109.93, 5.98 99.72, 3.24 89.69 C0.49 79.67, -1.31 67.9, 0.61 57.99 C2.53 48.09, 8.57 38.49, 14.77 30.26 C20.97 22.03, 29.02 13.64, 37.81 8.6 C46.61 3.57, 57.15 0.48, 67.55 0.05 C77.96 -0.37, 94.86 4.87, 100.24 6.05 C105.62 7.22, 100.19 6.2, 99.83 7.09" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(1121.0222359767922 384.04437295694777) rotate(0 39.66666793823242 10)"><text x="39.66666793823242" y="14.096" font-family="Excalifont, Xiaolai, sans-serif, Segoe UI Emoji" font-size="16px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">tangled.sh</text></g><g stroke-linecap="round" transform="translate(1090.6409899883515 486.65955062741205) rotate(0 72.21492282818883 71.51380707257533)"><path d="M83.27 1.58 C93.23 2.1, 105.37 7.01, 114.08 12.82 C122.8 18.64, 130.4 27.37, 135.57 36.47 C140.73 45.58, 144.53 57.01, 145.08 67.47 C145.62 77.93, 142.72 89.59, 138.84 99.24 C134.95 108.88, 129.44 118.67, 121.78 125.35 C114.12 132.04, 103.19 136.54, 92.87 139.33 C82.54 142.13, 70.04 143.47, 59.84 142.11 C49.64 140.75, 40.18 137, 31.66 131.17 C23.13 125.35, 13.79 116.37, 8.7 107.14 C3.61 97.91, 1.66 86.04, 1.13 75.79 C0.61 65.54, 1.72 55.06, 5.54 45.63 C9.37 36.2, 16.31 26.42, 24.07 19.22 C31.84 12.03, 40.16 4.86, 52.14 2.44 C64.12 0.01, 87.28 3.47, 95.94 4.66 C104.61 5.84, 104.54 8.66, 104.1 9.56 M38.87 7.56 C47.24 2.52, 61.49 1.34, 72.11 1.16 C82.72 0.98, 93.01 2.09, 102.55 6.49 C112.08 10.89, 122.74 19.44, 129.33 27.55 C135.92 35.67, 139.69 45.1, 142.07 55.16 C144.46 65.22, 145.58 78.01, 143.64 87.93 C141.69 97.85, 136.84 106.68, 130.42 114.67 C124.01 122.65, 114.54 131.12, 105.14 135.85 C95.74 140.58, 84.78 142.87, 74.02 143.04 C63.26 143.2, 50.06 141.1, 40.59 136.87 C31.12 132.63, 23.87 125.9, 17.19 117.63 C10.51 109.37, 3.15 97.4, 0.5 87.26 C-2.14 77.11, -1.05 66.9, 1.3 56.75 C3.66 46.61, 7.93 34.57, 14.64 26.39 C21.36 18.21, 37.05 10.54, 41.6 7.66 C46.15 4.78, 41.47 8.16, 41.94 9.12" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(1136.1922508003952 548.1054597705029) rotate(0 26.600000381469727 10)"><text x="26.600000381469727" y="14.096" font-family="Excalifont, Xiaolai, sans-serif, Segoe UI Emoji" font-size="16px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">teal.fm</text></g><g stroke-linecap="round"><g transform="translate(294.8746073670483 239.8668046514656) rotate(0 150.6198089186571 60.64598973965181)"><path d="M-0.14 -0.42 C50.3 20.09, 251.86 102.08, 302.29 122.47 M-1.68 -1.69 C48.73 18.58, 251.23 100.7, 301.89 120.97" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g></g><mask></mask><g stroke-linecap="round"><g transform="translate(294.8746073670483 356.25202008330393) rotate(0 149.21770818765884 2.920618153836813)"><path d="M0.46 0.25 C49.88 1.42, 247.45 5.28, 297.27 6.17 M-0.76 -0.66 C48.95 0.2, 249.4 2.99, 299.37 4.22" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g></g><mask></mask><g stroke-linecap="round"><g transform="translate(296.2768388782753 471.93611975952865) rotate(0 149.21744662720147 -54.103114555450105)"><path d="M-0.53 -0.15 C49.16 -17.89, 249.32 -89.55, 299.05 -107.66 M1.39 -1.27 C50.9 -19.27, 249.19 -91.73, 298.42 -109.5" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g></g><mask></mask><g stroke-linecap="round"><g transform="translate(292.07014434459444 577.8045988571646) rotate(0 150.9703667964639 -107.50485179482956)"><path d="M-0.5 0.46 C50.09 -35.45, 252.64 -179.18, 303.14 -215.27 M1.43 -0.34 C52 -36.09, 252.73 -178.04, 302.82 -213.88" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g></g><mask></mask><g stroke-linecap="round"><g transform="translate(805.0600599605011 360.92542762617444) rotate(0 138.93432835805118 -68.2415847991027)"><path d="M-0.74 0.42 C45.6 -22.45, 231.99 -113.78, 278.25 -136.59 M1.07 -0.41 C47.26 -23.13, 231.15 -112.67, 277.5 -135.11" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g></g><mask></mask><g stroke-linecap="round"><g transform="translate(805.7606525951999 364.89850409480323) rotate(0 141.73905294096244 14.606883395814407)"><path d="M0.15 -0.48 C47.58 4.35, 236.98 24.67, 284.22 29.63 M-1.23 -1.78 C46.14 2.63, 236.3 22.33, 283.67 27.73" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g></g><mask></mask><g stroke-linecap="round"><g transform="translate(1090.6409899883517 558.8744734556005) rotate(0 -141.9726710060147 -95.23493373090767)"><path d="M-0.31 0.97 C-47.96 -30.74, -237.81 -157.93, -285.01 -189.77 M1.73 0.43 C-45.64 -31.66, -235.22 -159.42, -282.86 -191.53" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g></g><mask></mask></svg>