{"id":20597453,"url":"https://github.com/loveduckie/blog-tool","last_synced_at":"2026-05-05T04:36:48.274Z","repository":{"id":65278282,"uuid":"583669982","full_name":"LoveDuckie/blog-tool","owner":"LoveDuckie","description":"A command-line Python application for managing, exporting, and publishing your blogs to multiple platforms from Markdown format.","archived":false,"fork":false,"pushed_at":"2024-11-02T12:12:43.000Z","size":12584,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-06-10T16:12:51.339Z","etag":null,"topics":["blog","blog-engine","blogging","blogs","devto","hashnode","markdown","python"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/LoveDuckie.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":"2022-12-30T14:13:35.000Z","updated_at":"2024-11-02T12:12:47.000Z","dependencies_parsed_at":"2024-10-23T01:11:28.728Z","dependency_job_id":"4fd0d2f4-8ff0-477b-bf54-31a67d51f794","html_url":"https://github.com/LoveDuckie/blog-tool","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/LoveDuckie/blog-tool","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LoveDuckie%2Fblog-tool","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LoveDuckie%2Fblog-tool/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LoveDuckie%2Fblog-tool/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LoveDuckie%2Fblog-tool/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/LoveDuckie","download_url":"https://codeload.github.com/LoveDuckie/blog-tool/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LoveDuckie%2Fblog-tool/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32635936,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-04T10:08:07.713Z","status":"online","status_checked_at":"2026-05-05T02:00:06.033Z","response_time":54,"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":["blog","blog-engine","blogging","blogs","devto","hashnode","markdown","python"],"created_at":"2024-11-16T08:22:32.430Z","updated_at":"2026-05-05T04:36:48.240Z","avatar_url":"https://github.com/LoveDuckie.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv id=\"header\" align=\"center\"\u003e\n    \u003ch1 align=\"center\"\u003eBlog Tool\u003c/h1\u003e\n    \u003cp align=\"center\"\u003e\u003ci\u003e(for lack of imagination)\u003c/i\u003e\u003c/p\u003e\n    \u003cimg src=\"https://img.shields.io/github/actions/workflow/status/loveduckie/blog-tool/tests.yml?label=tests\"\u003e\n\u003c/div\u003e\n\n---\n\nA command-line Python application for managing, exporting, and publishing your blogs to multiple platforms from Markdown format. :sparkles:\n\nIntended to be used by developers looking to centralise and publish their blog content from a \"single source of truth\".\n\n## FAQ\n\n- What is Markdown? :memo:\n  - \u003e Markdown is a lightweight markup language that you can use to add formatting elements to plaintext text documents. Created by John Gruber in 2004, Markdown is now one of the world’s most popular markup languages.\n- What is Python? :snake:\n  - \u003e Python is a high-level, general-purpose programming language. Its design philosophy emphasizes code readability with the use of significant indentation.\n\n## Features\n\n- Manage, export, and publish your blog posts as Markdown files, along with associated image and video assets.\n- Automatically generate impression images for your blogs.\n- Automatically optimise image assets before publishing.\n- Upload image assets to remote sources before publishing blogs.\n- Export blogs as standalone static pages.\n- Publish your blogs to multiple platforms simultaneously, including self-hosted WordPress, Hashnode, and Dev.to.\n\n## Repository\n\n```bash\n.\n├── _build\n│   ├── doctrees\n│   └── html\n│       ├── _sources\n│       └── _static\n├── _static\n├── _templates\n├── blog_tool\n│   ├── cli\n│   ├── data\n│   │   ├── assets\n│   │   ├── config\n│   │   ├── headers\n│   │   └── templates\n│   ├── errors\n│   ├── exporters\n│   │   ├── decorators\n│   │   └── markdown\n│   ├── git\n│   ├── images\n│   │   ├── processors\n│   │   └── uploaders\n│   ├── logging\n│   │   └── formatters\n│   ├── markdown\n│   ├── models\n│   │   ├── configuration\n│   │   ├── images\n│   │   └── metadata\n│   ├── publishers\n│   └── utility\n│       ├── blogs\n│       ├── click\n│       ├── config\n│       ├── exporters\n│       ├── images\n│       ├── paths\n│       ├── rich\n│       ├── types\n│       └── uploaders\n├── docker\n│   └── wordpress\n│       └── containers\n├── logs\n├── scripts\n└── tests\n    ├── cli\n    └── click\n```\n\n## Support\n\nThis sections outlines the support for third-party tooling and services.\n\n### Platforms\n\nFind below the number of platforms that are (currently) supported.\n\n- **Hashnode**\n  - A blogging platform for developers.\n  - [https://hashnode.com/](https://hashnode.com/)\n- **Dev.to**\n  - A blogging platform for developers.\n  - [https://dev.to/](https://dev.to/)\n- **Silverstripe**\n  - An extensible content management system and framework.\n  - [https://silverstripe.org](https://www.silverstripe.org/)\n- **WordPress**\n  - A blogging and content management system.\n  - **Note:** Support available for self-hosted installations.\n  - [https://wordpress.org](https://www.wordpress.org/)\n\n## Publishers\n\nAn \"Uploader\" is a Python type responsible for uploading a blog to a target platform after it has been rendered or rasterized. It forms part of a pipeline for rendering and ultimately publishing the blog content to the platform specified.\n\n## Exporters\n\nAn \"Exporter\" is a Python type responsible for \"rendering\" a blog written in Markdown as another output, such as HTML or PDF.\n\n- **PDF**\n  - Render a PDF document form a Markdown source file. The rendered output is customizable with various parameters.\n- **HTML**\n  - Render a HTML page or collection of pages from a Markdown source file.\n- **Silverstripe (HTML)**\n  - Renders the Markdown source file as a HTML page, with syntax highlighting and image assets available. Supports the [silverstripe/blog](https://addons.silverstripe.org/add-ons/silverstripe/blog) module.\n\n## Structure\n\nThis tool manages blog posts or articles by placing them into \"collections\". A \"collection\" can be considered as a series of related blog posts. They are synonymous with a book whereby a \"chapter\" from a book represents a single blog post or article.\n\n### Example\n\nInsert example here.\n\n## Usage\n\nThis tool is installable from PyPi by running the following command.\n\n```bash\n#!/usr/bin/env bash\n\npip install blog-tool\n```\n\nThe tool should then be usable from the command-line by running the following.\n\n### Creating a Blog Collection\n\n```bash\n#!/usr/bin/env bash\n\npython -m blog-tool collections create \u003ccollection name\u003e\n```\n\nAlternatively, the same command can be expressed as the following.\n\n```bash\n#!/usr/bin/env bash\n\nblog-tool collections create \u003ccollection name\u003e\n```\n\n```bash\n#!/usr/bin/env bash\n\nblog-tool collections list\n```\n\n### Images\n\nImages are automatically uploaded to image sharing websites should there be configured API keys.\n\n### Configuration\n\nThe default configuration file is found under `blog-tool/data/config/default.ini`.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Floveduckie%2Fblog-tool","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Floveduckie%2Fblog-tool","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Floveduckie%2Fblog-tool/lists"}