A project tracker for decentralized social media platforms, clients, and tools

feat: add 7 new ActivityPub projects with logos

Added comprehensive ActivityPub ecosystem coverage:
- Misskey: TypeScript/Vue microblogging platform
- Pleroma: Lightweight Elixir-based microblogging server
- Friendica: PHP social networking platform with cross-platform support
- Pixelfed: PHP/Vue photo-sharing platform (Instagram alternative)
- BookWyrm: Python social reading and book review platform
- Hubzilla: PHP CMS with multi-protocol federation support
- Funkwhale: Python/JavaScript federated audio and podcast platform

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

+201 -5
public/data/projects.json
···
"languages": ["TypeScript", "React Native"],
"links": [
{ "kind": "homepage", "url": "https://bsky.app" },
-
{ "kind": "repo", "url": "https://github.com/bluesky-social/social-app" }
+
{ "kind": "repo", "url": "https://github.com/bluesky-social/social-app" },
+
{ "kind": "social", "url": "https://bsky.app/profile/bsky.app" }
],
"stars": 7200,
"updatedAt": "2024-12-15"
···
"links": [
{ "kind": "homepage", "url": "https://atproto.com" },
{ "kind": "repo", "url": "https://github.com/bluesky-social/atproto" },
-
{ "kind": "docs", "url": "https://atproto.com/guides/overview" }
+
{ "kind": "docs", "url": "https://atproto.com/guides/overview" },
+
{ "kind": "social", "url": "https://bsky.app/profile/atproto.com" }
],
"stars": 6100,
"updatedAt": "2024-12-14"
},
{
+
"id": "tangled",
+
"name": "Tangled",
+
"network": "atproto",
+
"owner": "tangled-sh",
+
"domain": "tangled.sh",
+
"logoUrl": "/logos/tangled.jpg",
+
"description": "Code hosting platform built on the AT Protocol for decentralized software development and hosting.",
+
"type": "Code Hosting",
+
"tags": ["dev-tool", "collaboration", "code-hosting", "platform"],
+
"languages": ["TypeScript"],
+
"links": [
+
{ "kind": "homepage", "url": "https://tangled.sh/@tangled.sh/core" },
+
{ "kind": "repo", "url": "https://tangled.sh/@tangled.sh/core/tree/master" },
+
{ "kind": "docs", "url": "https://tangled.sh/@tangled.sh/core/tree/master/docs" },
+
{ "kind": "social", "url": "https://bsky.app/profile/tangled.sh" }
+
],
+
"updatedAt": "2024-12-16"
+
},
+
{
+
"id": "anisota",
+
"name": "Anisota",
+
"network": "atproto",
+
"domain": "anisota.net",
+
"logoUrl": "/logos/anisota.jpg",
+
"description": "An alternative client for the AT Protocol network.",
+
"type": "Client",
+
"tags": ["client", "platform"],
+
"links": [
+
{ "kind": "homepage", "url": "https://anisota.net/" },
+
{ "kind": "social", "url": "https://bsky.app/profile/did:plc:lcieujcfkv4jx7gehsvok3pr" }
+
],
+
"updatedAt": "2024-12-16"
+
},
+
{
+
"id": "streamplace",
+
"name": "Stream.place",
+
"network": "atproto",
+
"owner": "streamplace",
+
"domain": "stream.place",
+
"logoUrl": "/logos/stream-place.jpg",
+
"description": "Open-source live streaming platform built on the AT Protocol.",
+
"type": "Streaming Platform",
+
"tags": ["streaming", "video", "platform"],
+
"languages": ["TypeScript"],
+
"links": [
+
{ "kind": "homepage", "url": "https://stream.place" },
+
{ "kind": "repo", "url": "https://github.com/streamplace/streamplace" },
+
{ "kind": "docs", "url": "https://stream.place/docs/" },
+
{ "kind": "social", "url": "https://bsky.app/profile/stream.place" }
+
],
+
"updatedAt": "2024-12-16"
+
},
+
{
+
"id": "deer-social",
+
"name": "Deer Social",
+
"network": "atproto",
+
"owner": "a-viv-a",
+
"domain": "deer.social",
+
"logoUrl": "/logos/deer-social.svg",
+
"description": "Alternative client for the AT Protocol network.",
+
"type": "Client",
+
"tags": ["client", "web"],
+
"links": [
+
{ "kind": "homepage", "url": "https://deer.social/" },
+
{ "kind": "repo", "url": "https://github.com/a-viv-a/deer-social" }
+
],
+
"updatedAt": "2024-12-16"
+
},
+
{
"id": "mastodon",
"name": "Mastodon",
"network": "activitypub",
···
"updatedAt": "2024-12-16"
},
{
+
"id": "misskey",
+
"name": "Misskey",
+
"network": "activitypub",
+
"owner": "misskey-dev",
+
"domain": "misskey-hub.net",
+
"logoUrl": "/logos/misskey.png",
+
"description": "A completely free and open interplanetary microblogging platform. An open source, federated social media platform that's free forever!",
+
"type": "Social Network",
+
"tags": ["microblog", "server"],
+
"languages": ["TypeScript", "Vue", "JavaScript"],
+
"links": [
+
{ "kind": "homepage", "url": "https://misskey-hub.net" },
+
{ "kind": "repo", "url": "https://github.com/misskey-dev/misskey" }
+
],
+
"stars": 10700,
+
"updatedAt": "2025-09-08"
+
},
+
{
+
"id": "pleroma",
+
"name": "Pleroma",
+
"network": "activitypub",
+
"owner": "pleroma-social",
+
"domain": "pleroma.social",
+
"logoUrl": "/logos/pleroma.svg",
+
"description": "A microblogging server software that can federate with other servers supporting ActivityPub. Efficient, lightweight, and runs on low-power devices.",
+
"type": "Social Network",
+
"tags": ["microblog", "server", "lightweight"],
+
"languages": ["Elixir"],
+
"links": [
+
{ "kind": "homepage", "url": "https://pleroma.social" },
+
{ "kind": "repo", "url": "https://git.pleroma.social/pleroma/pleroma" },
+
{ "kind": "docs", "url": "https://docs-develop.pleroma.social" }
+
],
+
"stars": 62,
+
"updatedAt": "2025-09-09"
+
},
+
{
+
"id": "friendica",
+
"name": "Friendica",
+
"network": "activitypub",
+
"owner": "friendica",
+
"domain": "friendi.ca",
+
"logoUrl": "/logos/friendica.png",
+
"description": "A platform for decentralised social communication linking to other independent social and corporate services. Privacy-focused social networking alternative to Facebook.",
+
"type": "Social Network",
+
"tags": ["social-network", "server"],
+
"languages": ["PHP", "JavaScript"],
+
"links": [
+
{ "kind": "homepage", "url": "https://friendi.ca" },
+
{ "kind": "repo", "url": "https://github.com/friendica/friendica" }
+
],
+
"stars": 1600,
+
"updatedAt": "2025-01-01"
+
},
+
{
+
"id": "pixelfed",
+
"name": "Pixelfed",
+
"network": "activitypub",
+
"owner": "pixelfed",
+
"domain": "pixelfed.org",
+
"logoUrl": "/logos/pixelfed.png",
+
"description": "Photo sharing the way it should be. A decentralized photo-sharing platform that puts your casual shots and creative photography first, without algorithmic barriers.",
+
"type": "Photo Platform",
+
"tags": ["photos", "server"],
+
"languages": ["PHP", "Vue", "Blade"],
+
"links": [
+
{ "kind": "homepage", "url": "https://pixelfed.org" },
+
{ "kind": "repo", "url": "https://github.com/pixelfed/pixelfed" }
+
],
+
"stars": 6700,
+
"updatedAt": "2025-09-09"
+
},
+
{
+
"id": "bookwyrm",
+
"name": "BookWyrm",
+
"network": "activitypub",
+
"owner": "bookwyrm-social",
+
"domain": "joinbookwyrm.com",
+
"logoUrl": "/logos/bookwyrm.png",
+
"description": "Social reading and reviewing, decentralized with ActivityPub. Track reading, review books, and follow friends in small, self-determining communities.",
+
"type": "Reading Platform",
+
"tags": ["books", "reading", "reviews"],
+
"languages": ["Python", "HTML"],
+
"links": [
+
{ "kind": "homepage", "url": "https://joinbookwyrm.com" },
+
{ "kind": "repo", "url": "https://github.com/bookwyrm-social/bookwyrm" }
+
],
+
"stars": 2500,
+
"updatedAt": "2025-09-09"
+
},
+
{
+
"id": "hubzilla",
+
"name": "Hubzilla",
+
"network": "activitypub",
+
"owner": "hubzilla",
+
"domain": "hubzilla.org",
+
"logoUrl": "/logos/hubzilla.png",
+
"description": "A general purpose communication server integrated with a web publishing system and decentralised permission system. Build community websites that can interact with one another.",
+
"type": "Social Network",
+
"tags": ["cms", "server", "multi-protocol"],
+
"languages": ["PHP"],
+
"links": [
+
{ "kind": "homepage", "url": "https://hubzilla.org" },
+
{ "kind": "repo", "url": "https://framagit.org/hubzilla/core" }
+
],
+
"updatedAt": "2025-09-09"
+
},
+
{
+
"id": "funkwhale",
+
"name": "Funkwhale",
+
"network": "activitypub",
+
"owner": "funkwhale",
+
"domain": "funkwhale.audio",
+
"logoUrl": "/logos/funkwhale.png",
+
"description": "A federated platform for sharing and listening to music and podcasts. Enjoy your music and podcasts anywhere, share with anyone across the federated web.",
+
"type": "Audio Platform",
+
"tags": ["music", "podcasts", "audio"],
+
"languages": ["Python", "JavaScript"],
+
"links": [
+
{ "kind": "homepage", "url": "https://www.funkwhale.audio" },
+
{ "kind": "repo", "url": "https://dev.funkwhale.audio/funkwhale/funkwhale" }
+
],
+
"updatedAt": "2025-09-09"
+
},
+
{
"id": "lemmy",
"name": "Lemmy",
"network": "activitypub",
···
"logoUrl": "/logos/lemmy.svg",
"description": "A link aggregator and forum for the fediverse. Lemmy is similar to sites like Reddit, Lobste.rs, or Hacker News.",
"type": "Forum",
-
"tags": ["forum", "reddit-like", "server"],
+
"tags": ["forum", "link-aggregator", "server"],
"languages": ["Rust", "TypeScript"],
"links": [
{ "kind": "homepage", "url": "https://join-lemmy.org" },
···
"tags": ["protocol", "w3c", "spec"],
"links": [
{ "kind": "homepage", "url": "https://activitypub.rocks" },
-
{ "kind": "spec", "url": "https://www.w3.org/TR/activitypub" },
-
{ "kind": "docs", "url": "https://activitypub.rocks" }
+
{ "kind": "repo", "url": "https://github.com/w3c/activitypub" },
+
{ "kind": "spec", "url": "https://www.w3.org/TR/activitypub" }
],
"updatedAt": "2024-01-20"
},
public/logos/anisota.jpg

This is a binary file and will not be displayed.

public/logos/bookwyrm.png

This is a binary file and will not be displayed.

+6
public/logos/deer-social.svg
···
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 300 300">
+
<rect width="300" height="300" fill="#2a4a2f" rx="20"/>
+
<g transform="translate(150, 150) scale(0.5, 0.5) translate(-250, -325)">
+
<path fill="#729f7c" d="m 149.96484,186.56641 46.09766,152.95898 c 0,0 -6.30222,-9.61174 -15.60547,-17.47656 -8.87322,-7.50128 -28.4082,-4.04492 -28.4082,-4.04492 0,0 6.14721,39.88867 15.53125,44.39843 10.71251,5.1482 22.19726,0.16993 22.19726,0.16993 0,0 11.7613,-4.87282 22.82032,31.82421 5.26534,17.47196 15.33258,50.877 20.9707,69.58594 2.16717,7.1913 8.83789,7.25781 8.83789,7.25781 0,0 6.67072,-0.0665 8.83789,-7.25781 5.63812,-18.70894 15.70536,-52.11398 20.9707,-69.58594 11.05902,-36.69703 22.82032,-31.82421 22.82032,-31.82421 0,0 11.48475,4.97827 22.19726,-0.16993 9.38404,-4.50976 15.5332,-44.39843 15.5332,-44.39843 0,0 -19.53693,-3.45636 -28.41015,4.04492 -9.30325,7.86482 -15.60547,17.47656 -15.60547,17.47656 l 46.09766,-152.95898 -49.32618,83.84179 -20.34375,-31.1914 6.35547,54.96875 -23.1582,39.36132 c 0,0 -2.97595,5.06226 -5.94336,4.68946 -0.009,-0.001 -0.0169,0.003 -0.0254,0.01 -0.008,-0.007 -0.0167,-0.0109 -0.0254,-0.01 -2.96741,0.3728 -5.94336,-4.68946 -5.94336,-4.68946 l -23.1582,-39.36132 6.35547,-54.96875 -20.34375,31.1914 z"/>
+
</g>
+
</svg>
public/logos/friendica.png

This is a binary file and will not be displayed.

public/logos/funkwhale.png

This is a binary file and will not be displayed.

public/logos/hubzilla.png

This is a binary file and will not be displayed.

+118 -1
public/logos/lemmy.svg
···
-
File not found: /v1/AUTH_mw/wikipedia-commons-local-public.93/9/93/Lemmy_logo.svg
+
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+
<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+
<svg
+
xmlns:dc="http://purl.org/dc/elements/1.1/"
+
xmlns:cc="http://creativecommons.org/ns#"
+
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+
xmlns:svg="http://www.w3.org/2000/svg"
+
xmlns="http://www.w3.org/2000/svg"
+
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+
width="1024"
+
height="1024"
+
viewBox="0 0 1024 1024"
+
version="1.1"
+
id="svg8"
+
inkscape:version="0.92.4 (unknown)"
+
sodipodi:docname="lemmy-logo-border.svg"
+
inkscape:export-filename="/home/andres/Pictures/References/Logos/Lemmy/lemmy-logo-border.png"
+
inkscape:export-xdpi="300"
+
inkscape:export-ydpi="300"
+
enable-background="new">
+
<defs
+
id="defs2" />
+
<sodipodi:namedview
+
id="base"
+
pagecolor="#ffffff"
+
bordercolor="#666666"
+
borderopacity="1.0"
+
inkscape:pageopacity="0.0"
+
inkscape:pageshadow="2"
+
inkscape:zoom="0.49497475"
+
inkscape:cx="452.38625"
+
inkscape:cy="470.53357"
+
inkscape:document-units="px"
+
inkscape:current-layer="layer1"
+
showgrid="false"
+
units="px"
+
inkscape:showpageshadow="false"
+
inkscape:window-width="1366"
+
inkscape:window-height="740"
+
inkscape:window-x="0"
+
inkscape:window-y="0"
+
inkscape:window-maximized="1"
+
showguides="true"
+
inkscape:guide-bbox="true"
+
inkscape:snap-global="true"
+
inkscape:snap-midpoints="false"
+
inkscape:snap-smooth-nodes="false"
+
inkscape:object-paths="false"
+
inkscape:pagecheckerboard="true" />
+
<metadata
+
id="metadata5">
+
<rdf:RDF>
+
<cc:Work
+
rdf:about="">
+
<dc:format>image/svg+xml</dc:format>
+
<dc:type
+
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+
<dc:title />
+
</cc:Work>
+
</rdf:RDF>
+
</metadata>
+
<g
+
inkscape:label="Layer 1"
+
inkscape:groupmode="layer"
+
id="layer1"
+
transform="translate(0,-26.066658)"
+
style="display:inline">
+
<path
+
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:28;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+
d="m 167.03908,270.78735 c -0.94784,-0.002 -1.8939,0.004 -2.83789,0.0215 -4.31538,0.0778 -8.58934,0.3593 -12.8125,0.8457 -33.78522,3.89116 -64.215716,21.86394 -82.871086,53.27344 -18.27982,30.77718 -22.77749,64.66635 -13.46094,96.06837 9.31655,31.40203 31.88488,59.93174 65.296886,82.5332 0.20163,0.13618 0.40678,0.26709 0.61523,0.39258 28.65434,17.27768 57.18167,28.93179 87.74218,34.95508 -0.74566,12.61339 -0.72532,25.5717 0.082,38.84375 2.43989,40.10943 16.60718,77.03742 38.0957,109.67187 l -77.00781,31.4375 c -8.30605,3.25932 -12.34178,12.68234 -8.96967,20.94324 3.37211,8.2609 12.84919,12.16798 21.06342,8.68371 l 84.69727,-34.57617 c 15.70675,18.72702 33.75346,35.68305 53.12109,50.57032 0.74013,0.56891 1.4904,1.12236 2.23437,1.68554 l -49.61132,65.69141 c -5.45446,7.0474 -4.10058,17.19288 3.01098,22.5634 7.11156,5.37052 17.24028,3.89649 22.52612,-3.27824 l 50.38672,-66.71876 c 27.68572,17.53469 57.07524,31.20388 86.07227,40.25196 14.88153,27.28008 43.96965,44.64648 77.58789,44.64648 33.93762,0 63.04252,-18.68693 77.80082,-45.4375 28.7072,-9.21295 57.7527,-22.93196 85.1484,-40.40234 l 51.0977,67.66016 c 5.2858,7.17473 15.4145,8.64876 22.5261,3.27824 7.1115,-5.37052 8.4654,-15.516 3.011,-22.5634 l -50.3614,-66.68555 c 0.334,-0.25394 0.6727,-0.50077 1.0059,-0.75586 19.1376,-14.64919 37.0259,-31.28581 52.7031,-49.63476 l 82.5625,33.70507 c 8.2143,3.48427 17.6913,-0.42281 21.0634,-8.68371 3.3722,-8.2609 -0.6636,-17.68392 -8.9696,-20.94324 l -74.5391,-30.42773 c 22.1722,-32.82971 37.0383,-70.03397 40.1426,-110.46094 1.0253,-13.35251 1.2292,-26.42535 0.6387,-39.17578 30.3557,-6.05408 58.7164,-17.66833 87.2011,-34.84375 0.2085,-0.12549 0.4136,-0.2564 0.6153,-0.39258 33.412,-22.60147 55.9803,-51.13117 65.2968,-82.5332 9.3166,-31.40202 4.8189,-65.29118 -13.4609,-96.06837 -18.6553,-31.40951 -49.0859,-49.38228 -82.8711,-53.27344 -4.2231,-0.4864 -8.4971,-0.76791 -12.8125,-0.8457 -30.2077,-0.54448 -62.4407,8.82427 -93.4316,26.71484 -22.7976,13.16063 -43.3521,33.31423 -59.4375,55.30469 -44.9968,-25.75094 -103.5444,-40.25065 -175.4785,-41.43945 -6.4522,-0.10663 -13.0125,-0.10696 -19.67974,0.002 -80.18875,1.30929 -144.38284,16.5086 -192.87109,43.9922 -0.11914,-0.19111 -0.24287,-0.37932 -0.37109,-0.56446 -16.29,-22.764 -37.41085,-43.73706 -60.89649,-57.29493 -30.02247,-17.33149 -61.21051,-26.66489 -90.59375,-26.73633 z"
+
id="path817-3"
+
inkscape:connector-curvature="0"
+
sodipodi:nodetypes="cccssccccccscccccscccscccscccccsccscccssccscscccscc"
+
inkscape:label="white-border"
+
sodipodi:insensitive="true" />
+
<path
+
id="path1087"
+
style="display:inline;opacity:1;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:28;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+
d="m 716.85595,362.96478 c 15.29075,-21.36763 35.36198,-41.10921 56.50979,-53.31749 66.66377,-38.48393 137.02617,-33.22172 170.08018,22.43043 33.09493,55.72093 14.98656,117.48866 -47.64399,159.85496 -31.95554,19.26819 -62.93318,30.92309 -97.22892,35.54473 M 307.14407,362.96478 C 291.85332,341.59715 271.78209,321.85557 250.63429,309.64729 183.97051,271.16336 113.60811,276.42557 80.554051,332.07772 47.459131,387.79865 65.56752,449.56638 128.19809,491.93268 c 31.95554,19.26819 62.93319,30.92309 97.22893,35.54473"
+
inkscape:connector-curvature="0"
+
inkscape:label="ears"
+
sodipodi:insensitive="true" />
+
<path
+
style="display:inline;opacity:1;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:28;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+
d="M 801.23205,576.8699 C 812.73478,427.06971 720.58431,321.98291 511.99999,325.38859 303.41568,328.79426 213.71393,428.0311 222.76794,576.8699 c 8.64289,142.08048 176.80223,246.40388 288.12038,246.40388 111.31815,0 279.45076,-104.5447 290.34373,-246.40388 z"
+
id="path969"
+
inkscape:connector-curvature="0"
+
sodipodi:nodetypes="szszs"
+
inkscape:label="head"
+
sodipodi:insensitive="true" />
+
<path
+
id="path1084"
+
style="display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+
d="m 610.4991,644.28932 c 0,23.11198 18.70595,41.84795 41.78091,41.84795 23.07495,0 41.7809,-18.73597 41.7809,-41.84795 0,-23.112 -18.70594,-41.84796 -41.7809,-41.84796 -23.07496,0 -41.78091,18.73596 -41.78091,41.84796 z m -280.56002,0 c 0,23.32492 18.87829,42.23352 42.16586,42.23352 23.28755,0 42.16585,-18.9086 42.16585,-42.23352 0,-23.32494 -18.87829,-42.23353 -42.16585,-42.23353 -23.28757,0 -42.16586,18.90859 -42.16586,42.23353 z"
+
inkscape:connector-curvature="0"
+
inkscape:label="eyes"
+
sodipodi:nodetypes="ssssssssss"
+
sodipodi:insensitive="true" />
+
<path
+
id="path1008"
+
style="display:inline;opacity:1;fill:none;stroke:#000000;stroke-width:32;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+
d="m 339.72919,769.2467 -54.54422,72.22481 m 399.08582,-72.22481 54.54423,72.22481 M 263.68341,697.82002 175.92752,733.64353 m 579.85765,-35.82351 87.7559,35.82351"
+
inkscape:connector-curvature="0"
+
inkscape:label="whiskers"
+
sodipodi:nodetypes="cccccccc"
+
sodipodi:insensitive="true" />
+
<path
+
style="display:inline;opacity:1;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:28;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+
d="m 512.00082,713.08977 c -45.86417,0 -75.13006,31.84485 -74.14159,71.10084 1.07048,42.51275 32.46865,71.10323 74.14159,71.10323 41.67296,0 74.05118,-32.99608 74.14161,-71.10323 0.0932,-39.26839 -28.27742,-71.10084 -74.14161,-71.10084 z"
+
id="path1115"
+
inkscape:connector-curvature="0"
+
inkscape:label="nose"
+
sodipodi:nodetypes="zszsz"
+
sodipodi:insensitive="true" />
+
</g>
+
</svg>
public/logos/misskey.png

This is a binary file and will not be displayed.

public/logos/pixelfed.png

This is a binary file and will not be displayed.

+93
public/logos/pleroma.svg
···
+
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+
<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+
<svg
+
xmlns:dc="http://purl.org/dc/elements/1.1/"
+
xmlns:cc="http://creativecommons.org/ns#"
+
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+
xmlns:svg="http://www.w3.org/2000/svg"
+
xmlns="http://www.w3.org/2000/svg"
+
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+
version="1.1"
+
id="svg4485"
+
width="209.00002"
+
height="334"
+
viewBox="0 0 209.00002 334"
+
sodipodi:docname="pleroma_logo_vector_nobg_nopad.svg"
+
inkscape:version="0.92.1 r15371">
+
<metadata
+
id="metadata4491">
+
<rdf:RDF>
+
<cc:Work
+
rdf:about="">
+
<dc:format>image/svg+xml</dc:format>
+
<dc:type
+
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+
<dc:title></dc:title>
+
</cc:Work>
+
</rdf:RDF>
+
</metadata>
+
<defs
+
id="defs4489" />
+
<sodipodi:namedview
+
pagecolor="#ffffff"
+
bordercolor="#666666"
+
borderopacity="1"
+
objecttolerance="10"
+
gridtolerance="10"
+
guidetolerance="10"
+
inkscape:pageopacity="0"
+
inkscape:pageshadow="2"
+
inkscape:window-width="2560"
+
inkscape:window-height="1387"
+
id="namedview4487"
+
showgrid="false"
+
inkscape:zoom="2"
+
inkscape:cx="49.747283"
+
inkscape:cy="227.83408"
+
inkscape:window-x="1912"
+
inkscape:window-y="-8"
+
inkscape:window-maximized="1"
+
inkscape:current-layer="svg4485" />
+
<g
+
id="g4612"
+
transform="translate(-152,-89)">
+
<path
+
sodipodi:nodetypes="cccccc"
+
inkscape:connector-curvature="0"
+
id="path4495"
+
d="M 235,89 V 423 H 152 V 115 l 26,-26 z"
+
style="opacity:1;fill:#fba457;fill-opacity:1;stroke:#009bff;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.17587938" />
+
<circle
+
r="26"
+
cx="178"
+
cy="115"
+
id="path4497"
+
style="opacity:1;fill:#fba457;fill-opacity:1;stroke:#009bff;stroke-width:0;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.17587938" />
+
<circle
+
r="26"
+
cx="335"
+
cy="230"
+
id="path4497-0"
+
style="opacity:1;fill:#fba457;fill-opacity:1;stroke:#009bff;stroke-width:0;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.17587938" />
+
<path
+
sodipodi:nodetypes="cccccc"
+
inkscape:connector-curvature="0"
+
id="path4516"
+
d="M 277,256 V 89 l 84,3e-6 L 361.00002,230 335,256 Z"
+
style="fill:#fba457;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+
<circle
+
r="26"
+
cx="335"
+
cy="397"
+
id="path4497-0-6"
+
style="opacity:1;fill:#fba457;fill-opacity:1;stroke:#009bff;stroke-width:0;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.17587938" />
+
<path
+
sodipodi:nodetypes="cccccc"
+
inkscape:connector-curvature="0"
+
id="path4516-5"
+
d="m 277,423 v -83 h 84 l 2e-5,57 L 335,423 Z"
+
style="opacity:1;fill:#fba457;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+
</g>
+
</svg>
public/logos/stream-place.jpg

This is a binary file and will not be displayed.

public/logos/tangled.jpg

This is a binary file and will not be displayed.

+17 -2
src/components/ProjectCard.tsx
···
}
export default function ProjectCard({ project }: ProjectCardProps) {
-
const getLinkIcon = (kind: string) => {
+
const getLinkIcon = (kind: string, url?: string) => {
+
// Special case: Show Bluesky icon for social links on bsky.app
+
if (kind === 'social' && url?.includes('bsky.app')) {
+
return (
+
<svg className="w-5 h-5" viewBox="0 0 600 530" fill="currentColor">
+
<path d="m135.72 44.03c66.496 49.921 138.02 151.14 164.28 205.46 26.262-54.316 97.782-155.54 164.28-205.46 47.98-36.021 125.72-63.892 125.72 24.795 0 17.712-10.155 148.79-16.111 170.07-20.703 73.984-96.144 92.854-163.25 81.433 117.3 19.964 147.14 86.092 82.697 152.22-122.39 125.59-175.91-31.511-189.63-71.766-2.514-7.4046-3.6904-11.832-3.7077-11.841-.0174.0088-1.1937 4.4368-3.7077 11.841-13.714 40.255-67.236 197.35-189.63 71.766-64.444-66.131-34.605-132.26 82.697-152.22-67.108 11.421-142.55-7.4491-163.25-81.433-5.9562-21.282-16.111-152.36-16.111-170.07 0-88.687 77.742-60.816 125.72-24.795z"/>
+
</svg>
+
);
+
}
+
switch (kind) {
case 'homepage':
return (
···
return (
<svg className="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z" />
+
</svg>
+
);
+
case 'social':
+
return (
+
<svg className="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
+
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M17 8h2a2 2 0 012 2v6a2 2 0 01-2 2h-2v4l-4-4H9a1.994 1.994 0 01-1.414-.586m0 0L11 14h4a2 2 0 002-2V6a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2v4l.586-.586z" />
</svg>
);
default:
···
title={link.kind}
className="p-2 bg-gray-700 hover:bg-gray-600 rounded-lg text-gray-400 hover:text-gray-200 transition-colors"
>
-
{getLinkIcon(link.kind)}
+
{getLinkIcon(link.kind, link.url)}
</a>
))}
</div>
+1 -1
src/types/project.ts
···
export type Network = "atproto" | "activitypub" | "nostr";
export type ProjectLink = {
-
kind: "homepage" | "repo" | "docs" | "demo" | "spec";
+
kind: "homepage" | "repo" | "docs" | "demo" | "spec" | "social";
url: string;
};