{"id":28371464,"url":"https://github.com/jessehouwing/blogger2ghost","last_synced_at":"2026-02-27T08:34:41.823Z","repository":{"id":40919811,"uuid":"135827316","full_name":"jessehouwing/Blogger2Ghost","owner":"jessehouwing","description":".NET based conversion tool to migrate from Blogger to Ghost.","archived":false,"fork":false,"pushed_at":"2022-11-29T17:52:13.000Z","size":345,"stargazers_count":8,"open_issues_count":0,"forks_count":3,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-07-22T13:44:26.347Z","etag":null,"topics":["blogger","ghost-blog","markdown","migration-tool"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jessehouwing.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null},"funding":{"github":"jessehouwing","patreon":null,"open_collective":null,"ko_fi":null,"tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"otechie":null,"custom":"https://www.paypal.me/jessehouwing/5"}},"created_at":"2018-06-02T15:03:17.000Z","updated_at":"2024-01-12T03:44:55.000Z","dependencies_parsed_at":"2023-01-21T09:48:17.504Z","dependency_job_id":null,"html_url":"https://github.com/jessehouwing/Blogger2Ghost","commit_stats":null,"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/jessehouwing/Blogger2Ghost","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jessehouwing%2FBlogger2Ghost","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jessehouwing%2FBlogger2Ghost/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jessehouwing%2FBlogger2Ghost/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jessehouwing%2FBlogger2Ghost/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jessehouwing","download_url":"https://codeload.github.com/jessehouwing/Blogger2Ghost/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jessehouwing%2FBlogger2Ghost/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29888182,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-27T08:34:21.514Z","status":"ssl_error","status_checked_at":"2026-02-27T08:32:38.035Z","response_time":57,"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":["blogger","ghost-blog","markdown","migration-tool"],"created_at":"2025-05-29T09:18:59.148Z","updated_at":"2026-02-27T08:34:41.818Z","avatar_url":"https://github.com/jessehouwing.png","language":"C#","funding_links":["https://github.com/sponsors/jessehouwing","https://www.paypal.me/jessehouwing/5"],"categories":[],"sub_categories":[],"readme":"# Blogger2Ghost.NET\n\nI personally used this project to move my blog from Blogger to Ghost. I tried using a number of \nexisting migration tools, but none did everything I wanted and all were written in a language I \ndon't know well enough to quickly fix their shortcomings.\n\n**[It will import from Blogger to Ghost v1.0. If you want to migrate to Ghost v2.0 or v3.0, you'll need to import to a v1.0 instance and then upgrade Ghost to the latest version.](https://github.com/jessehouwing/Blogger2Ghost/issues/13)**\n\n## Features\n\n - Use the blogger export feature and don't rely on the public atom/rss feeds.\n - Remap blogger tags to ghost tags (incl redirects)\n - Remap multiple blogger tags to a single ghost tag\n - Delete redundant tags\n - Auto-order tags based on priority\n - Remap old urls to new ones (incl redirects)\n - Convert HTML to Markdown\n - Download all images from blogger (and other sources)\n - Detect missing/broken images\n - Detect malformed links\n - Retain the old RSS feed urls\n - Retain the Google+ comments\n - Fixes internal links\n - Converts `\u003cpre\u003e` tags to code blocks\n - Generate easy to import zip file\n\n## Uses\n\nThis project relies on \n\n - ManyConsole to provide rudimentary help information\n - Newtonsoft.Json to build the mapping and export files\n - ReverseMarkdown to convert HTML to Markdown\n\n## Sample conversion\n\n 1. Download [blogger backup from blogger admin panel.](https://www.blogger.com/blogger.g#othersettings)\n 2. Generate all the mapping files\n    * Run \n       ```\n      blogger2ghost mapping -i bloggerbackup.xml -o .\\migration --all\n      ```\n       * Include `--include-drafts` to migrate draft posts as well.\n       * Include `--from` and `--to` to change the urls of each post using Regex.\n       * Include `--force` to overwrite any existing mapping file.\n       * Replace `--all` with `--tags`, `--urls` or `--authors` to (re)generate individual files.\n    * Run \n       ```\n      blogger2ghost images -i bloggerbackup.xml -o .\\migration\n      ```\n       * Include `--include-drafts` to migrate draft posts as well.\n       * Include `--force` to overwrite any existing mapping file.\n 3. Create the required users in Ghost and set their email and slug.\n 4. Manually edit the `authors.json` to map your Google+ account to your Ghost email and slug.\n 5. Manually edit the `tags.json` to map your blogger tags to ghost tags.\n    * Map multiple tags by adding them to the blogger tags array.\n    * If the blogger tag is different than the ghost slug also add the blogger tag to the aliases array.\n    * Create parent/child tags by nesting child tags in the child_tags array.\n 6. Manually edit the `urls.json` to update the slug (ToUrl) to use on Ghost (don't change the blogger urls).\n 7. Manually edit the `images.json` to update image file names or external locations\n    * If you want to rename your images, change the file name in the `.\\migration\\images` folder and update the `images.json` accordingly.\n    * If images failed to download optionally download alternate images yourself and update the `.\\migration\\images` accordingly.\n 8. Optionally resize your images using your favorite image editor.\n 9. Upload your custom theme containing the `custom-blogger.hbs` template.\n 9. At this point you're ready to generate the import file for Ghost.\n    \n    ```\n    blogger2ghost convert -i bloggerbackup.xml -o .\\migration \n    ```    \n\n    Optionally add:\n     * Include `--force` to overwrite any existing export files.\n     * Include `--template blogger` to assign the `custom-blogger.hbs` template to each post\n     * Include `--zip` to zip up the `.\\migration\\ghost.json` and all images in `.\\migration\\images` for import.\n     * Include `--markdown` to convert your blogger HTML to markdown.\n     * Include `--include-drafts` to migrate draft posts as well.\n     * Include `--redirect-permanent` to generate 301 type redirects.\n 10. Upload the final `ghost.json` or `ghost.zip` to your ghost blog.\n 11. Upload the final `redirects.json` to your ghost blog.\n \n## Trying again\n\nIt took me a few attempts to get everything right. You can use the \"Delete all content\" option in the Ghost admin panel to start over.\n\n## Google+ Comments\n\nTo include Google+ comments from your old blog, include:\n\n```\n\u003cscript src=\"https://apis.google.com/js/plusone.js\"\u003e\u003c/script\u003e\n\u003cdiv id=\"comments\"\u003e\u003c/div\u003e\n\u003cscript\u003e\n    if (bloggerUrl){\n\t\tgapi.comments.render('comments', {\n    \t\thref: bloggerUrl,\n    \t\twidth: '624',\n    \t\tfirst_party_property: 'BLOGGER',\n    \t\tview_type: 'FILTERED_POSTMOD'\n\t\t});\n    }\n\u003c/script\u003e\n```\n\nin your `custom-blogger.hbs` in the comment section. The `bloggerUrl` variable will automatically be added in the post's code injection header section.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjessehouwing%2Fblogger2ghost","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjessehouwing%2Fblogger2ghost","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjessehouwing%2Fblogger2ghost/lists"}