{"id":15016764,"url":"https://github.com/aitorres/barkr","last_synced_at":"2026-01-25T07:04:12.039Z","repository":{"id":192974880,"uuid":"687843069","full_name":"aitorres/barkr","owner":"aitorres","description":"Yet another social media cross-posting tool in Python","archived":false,"fork":false,"pushed_at":"2026-01-13T21:26:36.000Z","size":1939,"stargazers_count":13,"open_issues_count":10,"forks_count":2,"subscribers_count":3,"default_branch":"main","last_synced_at":"2026-01-13T23:55:12.828Z","etag":null,"topics":["bluesky","communications","crosspost","discord","fediverse","mastodon","rss","social","social-media","telegram","twitter"],"latest_commit_sha":null,"homepage":"","language":"Python","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/aitorres.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","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,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2023-09-06T05:58:03.000Z","updated_at":"2026-01-13T21:26:39.000Z","dependencies_parsed_at":"2023-09-06T07:27:55.818Z","dependency_job_id":"7ca777dc-bde3-4812-bfcf-ed549482e5c5","html_url":"https://github.com/aitorres/barkr","commit_stats":null,"previous_names":["aitorres/hermes","aitorres/barkr"],"tags_count":44,"template":false,"template_full_name":null,"purl":"pkg:github/aitorres/barkr","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aitorres%2Fbarkr","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aitorres%2Fbarkr/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aitorres%2Fbarkr/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aitorres%2Fbarkr/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/aitorres","download_url":"https://codeload.github.com/aitorres/barkr/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aitorres%2Fbarkr/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28747308,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-25T05:12:38.112Z","status":"ssl_error","status_checked_at":"2026-01-25T05:04:50.338Z","response_time":113,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":["bluesky","communications","crosspost","discord","fediverse","mastodon","rss","social","social-media","telegram","twitter"],"created_at":"2024-09-24T19:49:21.258Z","updated_at":"2026-01-25T07:04:12.023Z","avatar_url":"https://github.com/aitorres.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Barkr\n\n**Barkr**[^1] is a social media cross-posting tool written in Python: set it up and never worry about manually posting the same message to multiple channels ever again!\n\nWith **Barkr** you can setup a series of channels (e.g. social media accounts) to read messages from and / or post messages to. You can mix and match read / write modes, and add multiple accounts of the same type of channel as well without worrying that the same message will be re-posted to a channel it comes from.\n\nNote that **Barkr** is limited to text posts only. Want to see that change? Start a discussion on a new issue!\n\n[^1]: \"Barkr\" (missing \"e\") as in \"entity that barks\". See: [dogs](https://en.wikipedia.org/wiki/Dog).\n\n## Motivation\n\nI wrote **Barkr** for a personal use case after noting how much fragmentation there currently is (as of 2023) in the social media space, as a way to reduce the cost of engaging with multiple social media platforms, and also as a (very simple) way to practice using threads in Python.\n\n## Installation\n\nUse the package manager [pip](https://pip.pypa.io/en/stable/) to install `barkr`.\n\n```bash\npip install barkr\n```\n\n## Usage\n\nCreate a Python script and specify all the channels you want to use. Channel connections are present in the [`barkr.connections`](./barkr/connections/) module.\n\nA simple script showcasing how to set up three Mastodon connections with multiple modes that can run in the background is outlined below:\n\n```python\nfrom barkr.main import Barkr\n\nfrom barkr.connections import (\n    ConnectionMode,\n    BlueskyConnection,\n    DiscordConnection,\n    MastodonConnection,\n    RSSConnection,\n    TelegramConnection,\n    TwitterConnection,\n)\n\nfrom barkr.models import Message\n\nbarkr = Barkr(\n    [\n        # Barkr will read new messages posted by this account, and queue them to\n        # other accounts on write mode, but will not post anything to it.\n        MastodonConnection(\n            \"Read only connection\",\n            [ConnectionMode.READ],\n            \"\u003cACCESS TOKEN HERE\u003e\",\n            \"\u003cINSTANCE URL HERE\u003e\",\n        ),\n        # Barkr will write queued messages to this account, but will not read anything\n        # new posted to this account or queue anything from this account to other ones.\n        DiscordConnection(\n            \"Write only connection\",\n            [ConnectionMode.WRITE],\n            \"\u003cBOT TOKEN ID HERE\u003e\",\n            \"\u003cCHANNEL ID HERE\u003e\",\n        ),\n        # Barkr will read new messages from this account to be queued onto others, and will\n        # post new messages from other channels into this one as well.\n        BlueskyConnection(\n            \"R/W connection\",\n            [ConnectionMode.READ, ConnectionMode.WRITE],\n            \"\u003cBLUESKY HANDLE HERE\u003e\",\n            \"\u003cPASSWORD / APP PASSWORD HERE\u003e\",\n        ),\n        # Another example using Twitter -- note that the TwitterConnection only\n        # supports write-only mode through the Twitter V2 API\n        TwitterConnection(\n            \"Write only Twitter Connection\",\n            [ConnectionMode.WRITE],\n            \"\u003cCONSUMER KEY HERE\u003e\",\n            \"\u003cCONSUMER SECRET HERE\u003e\",\n            \"\u003cACCESS KEY HERE\u003e\",\n            \"\u003cACCESS SECRET HERE\u003e\",\n            \"\u003cBEARER TOKEN HERE\u003e\",\n        ),\n        # One more, showcasing a Telegram write-only connection\n        TelegramConnection(\n            \"Write only Telegram connection\",\n            [ConnectionMode.WRITE],\n            \"\u003cTELEGRAM BOT TOKEN HERE\u003e\",\n            \"\u003cTELEGRAM CHAT / CHANNEL ID HERE\u003e\",\n        ),\n        # You can also read from an RSS feed!\n        RSSConnection(\n            \"Read only RSS connection\",\n            [ConnectionMode.READ],\n            \"\u003cRSS FEED URL HERE\u003e\"\n        ),\n    ]\n)\n\n# Blocking: will start reading and writing threads to keep the connections in sync\nbarkr.start()\n\n# Non-blocking, if you only need to write messages to your connections\nbarkr.write_message(\n    Message(\n        id=\"123456\",\n        message=\"Hello, world!\",\n    )\n)\n```\n\nAlways keep in mind proper secret management practices when using Barkr: instead of hardcoding access tokens / cookies / user and passwords, use tools like environment variables, `dotenv` or other secret managers!\n\n## Contributing\n\nPull requests are welcome. For major changes, please open an issue first to discuss what you would like to change. Contributions for issues that are already open by maintainers are welcome and encouraged.\n\nPlease make sure to update tests as appropriate; a minimum coverage of 80% is expected (and enforced by Github Actions!).\n\n## License\n\nThis project is licensed under the [GNU Affero General Public License v3.0](./LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faitorres%2Fbarkr","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Faitorres%2Fbarkr","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faitorres%2Fbarkr/lists"}