{"id":15653287,"url":"https://github.com/musingstudio/pherephone","last_synced_at":"2025-04-30T17:02:59.363Z","repository":{"id":64318651,"uuid":"198967103","full_name":"musingstudio/pherephone","owner":"musingstudio","description":"An ActivityPub server that reblogs all the statuses of certain actors.","archived":false,"fork":false,"pushed_at":"2025-04-14T21:20:50.000Z","size":130,"stargazers_count":33,"open_issues_count":0,"forks_count":2,"subscribers_count":4,"default_branch":"develop","last_synced_at":"2025-04-19T07:46:41.006Z","etag":null,"topics":["activitypub","activitystreams","federation","golang"],"latest_commit_sha":null,"homepage":"https://pherephone.org","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/musingstudio.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-07-26T07:16:23.000Z","updated_at":"2025-04-14T21:20:48.000Z","dependencies_parsed_at":"2024-11-06T11:39:03.665Z","dependency_job_id":"ef53fbfa-3d21-44f8-9de1-2200016d4cde","html_url":"https://github.com/musingstudio/pherephone","commit_stats":{"total_commits":78,"total_committers":2,"mean_commits":39.0,"dds":"0.10256410256410253","last_synced_commit":"265ea8d602d39b35427d39e085050ba1c995aeb3"},"previous_names":["writeas/pherephone"],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/musingstudio%2Fpherephone","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/musingstudio%2Fpherephone/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/musingstudio%2Fpherephone/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/musingstudio%2Fpherephone/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/musingstudio","download_url":"https://codeload.github.com/musingstudio/pherephone/tar.gz/refs/heads/develop","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":250806329,"owners_count":21490298,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["activitypub","activitystreams","federation","golang"],"created_at":"2024-10-03T12:45:14.974Z","updated_at":"2025-04-30T17:02:59.233Z","avatar_url":"https://github.com/musingstudio.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Pherephone\n\nA _Pherephonon_ in Greek is someone who doesn't have his own voice and just repeats things other said. _Pherephone_ is an ActivityPub relay. You set it up to follow a few accounts and it Announces everything they post.\n\n## Use cases\n\nPherephone is meant to bring multiple fediverse accounts, even across platforms, into a single followable ActivityPub Actor.\n\nFor example, you might have multiple [Mastodon](https://joinmastodon.org) accounts, or mix them with [PixelFed](https://pixelfed.org/) profiles, [WriteFreely](https://writefreely.org) blogs, and [PeerTube](https://joinpeertube.org/) channels. Pherephone makes it easy to give your audience a single handle to follow all of them at once.\n\n## How to run \n\nDownload the binary, edit `config.ini` and `actors.json` to your liking and run it.\nFor the time being only the ActivityPub actor endpoint is supported. Usually the url of the user profile page will work. If it doesn't you will have to find it out using **webfinger** yourself. Here is an example on how to find my actor endpoint on _fosstodon_.\n\n[https://fosstodon.org/.well-known/webfinger?resource=acct:qwazix@fosstodon.org](https://fosstodon.org/.well-known/webfinger?resource=acct:qwazix@fosstodon.org)\n\nThere's a `-debug` flag if you want more verbose output. \n\n### Actors configuration\n\n``` json\n{\n    \"writefreelyAndFriends\" : {\n        \"summary\": \"a list of favorite writers\",\n        \"follow\": [\n            \"https://write.as/api/collections/blog\",\n            \"https://writing.exchange/users/write_as\"\n        ]\n    },\n    \"all_about_qwazix\" : {\n        \"summary\": \"wanna stalk me?\",\n        \"follow\": [\n            \"https://pixelfed.social/users/qwazix\",\n            \"https://print3d.social/users/qwazix\",\n            \"https://mixt.qwazix.com/api/collections/qwazix\",\n            \"https://fosstodon.org/api/collections/qwazix\"\n        ]\n    }\n}\n```\n\n_Pherephone_ will create the accounts **writefreelyAndFriends@example.com** and **all_about_qwazix@example.com** and follow the users listed under each one. If you want to unfollow someone just remove any entry. Unfortunately `json` doesn't support comments so you'll have to delete it altogether. Mind the commas (there's no comma after the last entry)\n\n### Web server configuration and https\n\nYou will probably want to run it behind a reverse proxy with a *Let's Encrypt* certificate.\n\nHere's the configuration for *apache*. You can find similar *nginx* configuration in the [writefreely documentation](https://writefreely.org/start#production)\n\n```\n\u003cVirtualHost *:443\u003e\n    ServerAdmin q@qzx.gr\n    ProxyRequests off\n    DocumentRoot /var/www\n    ProxyPreserveHost On\n\n    ServerName pherephone.example.com\n\n    ErrorLog /var/log/httpd/error.log\n    CustomLog /var/log/httpd/access.log combined\n\n    SSLEngine on\n\tSSLCertificateFile \"/etc/letsencrypt/live/pherephone.example.com/fullchain.pem\"\n\tSSLCertificateKeyFile \"/etc/letsencrypt/live/pherephone.example.com/privkey.pem\"\n\n    # Possible values include: debug, info, notice, warn, error, crit,\n    # alert, emerg.\n    LogLevel error\n\n    \u003cLocation /\u003e\n        ProxyPass http://localhost:8081/\n        ProxyPassReverse http://localhost:8081/\n        Order allow,deny\n        Allow from all\n    \u003c/Location\u003e\n\u003c/VirtualHost\u003e\n```\n\n## General Configuration\n\nThere are four configuration values in _Pherephone_\n\n``` ini\n[general]\n\nbaseURL = https://example.com\nstorage = storage ; can be relative or absolute path\nuserAgent = \"pherephone\"\nannounce_replies = false ; whether to boost replies of followers by default\n```\n\nThe `baseURL` which is, erm, self-explanatory. Set it to your (sub)domain.\n`storage` which is the path where pherephone will save its data. Pherephone only uses json files in a directory structure to save its data.\n`userAgent` just sets the user agent string reported by the software\n`announce_replies` controls whether pherephone will boost everything the actors it follows post or only original posts.","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmusingstudio%2Fpherephone","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmusingstudio%2Fpherephone","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmusingstudio%2Fpherephone/lists"}