{"id":50614458,"url":"https://github.com/algodesigner/mdsend","last_synced_at":"2026-06-06T07:02:04.348Z","repository":{"id":356338048,"uuid":"1232069469","full_name":"algodesigner/mdsend","owner":"algodesigner","description":"mdsend: Offline-first social media posting tool for writers and makers.","archived":false,"fork":false,"pushed_at":"2026-05-07T15:29:59.000Z","size":19,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-07T17:31:52.214Z","etag":null,"topics":["blogging","bluesky","cli","cross-post","linkedin","markdown","mastodon","publishing","python","social-media"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/algodesigner.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,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-07T14:59:48.000Z","updated_at":"2026-05-07T15:42:20.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/algodesigner/mdsend","commit_stats":null,"previous_names":["algodesigner/mdsend"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/algodesigner/mdsend","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/algodesigner%2Fmdsend","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/algodesigner%2Fmdsend/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/algodesigner%2Fmdsend/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/algodesigner%2Fmdsend/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/algodesigner","download_url":"https://codeload.github.com/algodesigner/mdsend/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/algodesigner%2Fmdsend/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33972398,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-06T02:00:07.033Z","response_time":107,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["blogging","bluesky","cli","cross-post","linkedin","markdown","mastodon","publishing","python","social-media"],"created_at":"2026-06-06T07:02:03.749Z","updated_at":"2026-06-06T07:02:04.341Z","avatar_url":"https://github.com/algodesigner.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# mdsend — File-based social media publisher\n\n![mdsend](msend-image.jpeg)\n\nWrite markdown posts, run `mdsend`, and it cross-posts to your social media platforms.\n\nThe main purpose is simple: set up a git repo with a simple directory structure and publish from it to various destinations. Your posts are in a single unified format that works across different social media platforms. You get a version-controlled archive that can be queried and managed by AI should the need arise.\n\nWant to know what you've been focusing on, what your next posts should be, how to improve your writing, or which tags to use? Just ask your AI tool — it can read the repo and answer and provide you with a perspective.\n\nThis approach keeps you disconnected from the destination network so you don't get pulled into everyone else's feeds.\n\n## Supported platforms\n\n| Platform        | Max chars | Max media | API auth            |\n|-----------------|-----------|-----------|---------------------|\n| LinkedIn        | 3,000     | 1 image   | OAuth 2.0 (Bearer)  |\n| Bluesky         | 300       | 4 images  | AT Protocol (App Password) |\n| Mastodon        | 500       | 4 images  | OAuth (Access Token) |\n\n## How it works\n\nEach post is a directory named `YYYY-MM-DD_HH-MM_slug/` containing:\n\n- `post.md` — the post text (markdown or plain text)\n- Optional media files (jpg, png, gif, mp4, mov)\n\n```\nposts/\n├── 2026-05-03_15-30_my-thoughts/\n│   ├── post.md\n│   └── image.jpg\n└── 2026-05-04_18-00_hello-world/\n    └── post.md\n```\n\n## Per-post platform targeting\n\nBy default every post goes to all platforms.  To control this per post,\nadd an optional front matter block at the top of `post.md`:\n\n```\n---\nplatforms: [bluesky]\n---\n\nThis post will only appear on Bluesky.\n```\n\n```\n---\nplatforms: []\n---\n\nThis post is a draft — it will never be published.\n```\n\n## Installation\n\n```bash\npip install mdsend\n```\n\nOr from source:\n\n```bash\ngit clone https://github.com/algodesigner/mdsend\ncd mdsend\npip install -e .\n```\n\n## Setup\n\nCreate a `.env` file with your API credentials:\n\n```bash\ncp .env.example .env\n```\n\nFill in the credentials for the platforms you want to use.  See `.env.example`\nfor the full list of required fields.\n\n## Usage\n\n```bash\n# Preview what would be posted (default — no API calls made)\ncd /path/to/your/posts\nmdsend\n\n# Actually post live\nmdsend --publish\n\n# Post to specific platforms\nmdsend --platforms bluesky\nmdsend --platforms bluesky --publish\n```\n\n### Creating a new post\n\n```bash\n# Create a post directory and open the editor\nmdsend --new \"my-post-slug\"\n```\n\nThis creates a directory like `2026-05-04_21-30_my-post-slug/` with\na `post.md` file containing a front matter template, then opens it in\nyour `$EDITOR` (or `vi` by default).\n\n### Dry run\n\n`mdsend` runs in dry-run mode by default — it prints what would be posted\nwithout calling any API.  Use `--publish` to post live.\n\n### Multi-post threading (Bluesky \u0026 Mastodon)\n\nPosts longer than the platform limit are automatically split into threaded\nreplies.  Each chunk is prefixed with `🧵 (n/N) ` so readers know it's\npart of a multi-part post.  Media is attached to the first chunk only.\nLinks are moved to the first chunk so the preview card appears at the\ntop of the thread.\n\n### Idempotent publishing\n\nEach platform gets its own sentinel file under `posts/.published/`.\nRe-running is safe — already-published platforms are skipped.\n\n## License\n\nBSD 3-Clause. See LICENSE.\n\nHappy microblogging! ☕\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falgodesigner%2Fmdsend","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Falgodesigner%2Fmdsend","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falgodesigner%2Fmdsend/lists"}