{"id":13569605,"url":"https://github.com/pubcast/pubcast","last_synced_at":"2025-06-24T23:08:34.510Z","repository":{"id":57500502,"uuid":"150330160","full_name":"pubcast/pubcast","owner":"pubcast","description":" An experimental ActivityPub based podcasting platform.","archived":false,"fork":false,"pushed_at":"2019-03-07T02:41:30.000Z","size":2131,"stargazers_count":116,"open_issues_count":8,"forks_count":5,"subscribers_count":12,"default_branch":"master","last_synced_at":"2025-06-10T12:49:42.645Z","etag":null,"topics":["activitypub","fediverse","golang","podcasts"],"latest_commit_sha":null,"homepage":"https://pubcast.pub/","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mpl-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/pubcast.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}},"created_at":"2018-09-25T21:14:40.000Z","updated_at":"2025-03-09T09:26:18.000Z","dependencies_parsed_at":"2022-08-30T21:00:23.760Z","dependency_job_id":null,"html_url":"https://github.com/pubcast/pubcast","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/pubcast/pubcast","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pubcast%2Fpubcast","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pubcast%2Fpubcast/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pubcast%2Fpubcast/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pubcast%2Fpubcast/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/pubcast","download_url":"https://codeload.github.com/pubcast/pubcast/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pubcast%2Fpubcast/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":261119541,"owners_count":23112206,"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","fediverse","golang","podcasts"],"created_at":"2024-08-01T14:00:41.875Z","updated_at":"2025-06-24T23:08:34.481Z","avatar_url":"https://github.com/pubcast.png","language":"Go","funding_links":[],"categories":["Go","Protocols"],"sub_categories":[],"readme":"# 🎙 Pubcast\n\n[![Gitter chat](https://badges.gitter.im/gitterHQ/gitter.png)](https://gitter.im/metapodcasts)\n\nAn _experimental_ (Read: not-usable or in anyway done) distributed/federated podcasting platform based on [ActivityPub.](https://raw.githubusercontent.com/w3c/activitypub/gh-pages/activitypub-tutorial.txt)\n\n## Usage\n\nGetting started:\n\nEnsure that you're using go11 with go-modules turned on.\n\n```sh\nexport GO111MODULE=on # Put this in your .zshrc or .bash_profile or whatnot\n```\n\nClone/Download the project with:\n\n```sh\ngo get github.com/pubcast/pubcast\n```\n\nBuilding a binary with make (or [mmake](https://github.com/tj/mmake) if you're fancy):\n\n```sh\nmake\n```\n\nBuilding and then running that binary:\n\n```sh\nmake run\n```\n\nRunning tests:\n\n```sh\nmake test\n```\n\nSetting up your database (this works best if you have postgres already [running locally](https://postgresapp.com/)):\n\n```sh\nmake database\n```\n\nCreating a new migration in `db/migrations`:\n\n```sh\nmake migration NAME=some_name_here\n```\n\n## Learning about ActivityPub\n\n![explaination](https://i.imgur.com/ShgecWe.png)\n\n### Basic Description\n\nActivityPub gives every user (or `actor` in it's vocab) on a server an \"inbox\" and an \"outbox\". But these are really just endpoints:\n\n```\nhttps://myactpub.site/activity/user/flaque/inbox\nhttps://myactpub.site/activity/user/flaque/outbox\n```\n\nActivityPub asks that you accept `GET` and `POST` requests to these endpoints where a `POST` tells a the server to put that in a user's queue or feed and `GET` lets the user retrieve info from the feed.\n\nYou send messages called `ActivityStreams` that are really just a special spec of JSON:\n\n```json\n{\"@context\": \"https://www.w3.org/ns/activitystreams\",\n \"type\": \"Create\",\n \"id\": \"https://social.example/alyssa/posts/a29a6843-9feb-4c74-a7f7-081b9c9201d3\",\n \"to\": [\"https://chatty.example/ben/\"],\n \"author\": \"https://social.example/alyssa/\",\n \"object\": {\"type\": \"Note\",\n            \"id\": \"https://social.example/alyssa/posts/49e2d03d-b53a-4c4c-a95c-94a6abf45a19\",\n            \"attributedTo\": \"https://social.example/alyssa/\",\n            \"to\": [\"https://chatty.example/ben/\"],\n            \"content\": \"Say, did you finish reading that book I lent you?\"}\n```\n\n#### Objects, Actors, and Activities\n\n(**Note:** Pubcast uses a slightly different internal naming than ActivityPub. To have more understandable code in the context of podcasts, ActivityPub's `Organization` actor type is a `Show` inside Pubcast. Additionally, the `Object` type is a Pubcast `Episode`.)\n\nActivityPub is based on [a formalized vocabulary](https://www.w3.org/TR/activitystreams-vocabulary/) of data types, actions and folks doing the actions.\n\nAn `Object` is a generic data type written in JSON:\n\n```json\n{\n  \"@context\": \"https://www.w3.org/ns/activitystreams\",\n  \"type\": \"Object\",\n  \"id\": \"http://www.test.example/object/1\",\n  \"name\": \"A Simple, non-specific object\"\n}\n```\n\nObjects have [a set collection of formalized properties](https://www.w3.org/TR/activitystreams-vocabulary/#properties) such as `id`, `name`, `url`, etc but you technically can create your own. Objects serve as a base type for other Activity Steam's core set of types.\n\nFor example, there are a set of [actor types](https://www.w3.org/TR/activitystreams-vocabulary/#actor-types) that themselves are `Objects`.\n\n```json\n/* A \"Person\" actor type */\n{\n  \"@context\": \"https://www.w3.org/ns/activitystreams\",\n  \"type\": \"Person\",\n  \"name\": \"Sally Smith\"\n}\n```\n\n[Activities](https://www.w3.org/TR/activitystreams-vocabulary/#h-activity-types) are also subtypes of `Object`, and are used to describe relationships between objects. Some examples of activities include:\n\n- Accept\n- Create\n- Move\n- Question\n- Undo\n- Follow\n- View\n\nAn `Activity` json might look something like this:\n\n```json\n{\n  \"@context\": \"https://www.w3.org/ns/activitystreams\",\n  \"summary\": \"Sally created a note\",\n  \"type\": \"Create\",\n  \"actor\": {\n    \"type\": \"Person\",\n    \"name\": \"Sally\"\n  },\n  \"object\": {\n    \"type\": \"Note\",\n    \"name\": \"A Simple Note\",\n    \"content\": \"This is a simple note\"\n  }\n}\n```\n\n### Links\n\n- [ActivityPub tutorial](https://raw.githubusercontent.com/w3c/activitypub/gh-pages/activitypub-tutorial.txt)\n- [ActivityPub.rocks explaination](https://activitypub.rocks/)\n- [W3 ActivityPub Spec](https://www.w3.org/TR/activitypub/)\n- [W3 ActivityPub Vocabulary Spec](https://www.w3.org/TR/activitystreams-vocabulary/)\n- [Other Golang implementations of this spec](https://github.com/go-fed/activity#who-is-using-this-library-currently)\n\n## Design\n\n### Podcast Object\n\nPodcasts include four main pieces of information: the `header` info, the `shownotes`, the `preview`, and the `audio`. A Header includes the title and date of the show. Shownotes are a collection of info about the show; they're basically an HTML supported description. A preview is an image thumbnail for the show. Audio is the actual stuff you're listening to.\n\nA Podcast ActivityStream Object can therefore look something like this:\n\n```json\n\"object\" : {\n \"id\": \"https://example.org/activity/organization/npr/planet-money\",\n \"type\": \"Podcast\",\n \"name\": \"This American Life\",\n \"date\": \"2008-09-15T15:53:00\",\n \"shownotes\": \"Check out our \u003ca href='foo.com'\u003ewebsite!\u003c/a\u003e\",\n \"preview\": {\n    \"type\": \"Image\",\n    \"href\": \"http://example.org/album/máiréad.jpg\",\n    \"mediaType\": \"image/jpeg\"\n  },\n  \"audio\": {\n    \"type\": \"Audio\",\n    \"href\": \"https://example.org/activity/organization/npr/planet-money/episodes/1.mp4\",\n    \"mediaType\": \"audio/mp4\"\n  }\n}\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpubcast%2Fpubcast","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpubcast%2Fpubcast","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpubcast%2Fpubcast/lists"}