{"id":24748011,"url":"https://github.com/codingitwrong/log2blog","last_synced_at":"2026-04-11T11:02:42.250Z","repository":{"id":97570216,"uuid":"49073578","full_name":"CodingItWrong/log2blog","owner":"CodingItWrong","description":"Convert git logs to a blog post","archived":false,"fork":false,"pushed_at":"2016-07-28T10:26:06.000Z","size":89,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2025-10-19T11:35:15.020Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Ruby","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/CodingItWrong.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","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":"2016-01-05T15:15:01.000Z","updated_at":"2016-08-17T14:44:10.000Z","dependencies_parsed_at":null,"dependency_job_id":"115844a2-a46b-4c03-a2d7-5e134da27b0a","html_url":"https://github.com/CodingItWrong/log2blog","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/CodingItWrong/log2blog","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CodingItWrong%2Flog2blog","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CodingItWrong%2Flog2blog/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CodingItWrong%2Flog2blog/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CodingItWrong%2Flog2blog/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/CodingItWrong","download_url":"https://codeload.github.com/CodingItWrong/log2blog/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CodingItWrong%2Flog2blog/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31677819,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-11T08:18:19.405Z","status":"ssl_error","status_checked_at":"2026-04-11T08:17:08.892Z","response_time":54,"last_error":"SSL_read: 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":[],"created_at":"2025-01-28T05:18:19.865Z","updated_at":"2026-04-11T11:02:42.237Z","avatar_url":"https://github.com/CodingItWrong.png","language":"Ruby","funding_links":[],"categories":[],"sub_categories":[],"readme":"# log2blog\n\n`log2blog` generates a Markdown version of your git commit history suitable for publishing as an article or blog post. This allows you to keep programming tutorial blog posts in sync with their corresponding git repo. If you have good descriptions of your steps in each commit message, you'll end up with a blog post with headings, file diffs, and descriptions matching your commits. Plus, you can regenerate the post any time your git log changes to ensure they're always in sync.\n\n## Example\n\nSay you're writing a blog post on how to create a todo list app in Rails. In a project repo, for each step you want to appear in the blog post, make a separate commit with those changes and a verbose commit message. For example, say you have one commit in your todo list app that adds the line `belongs_to :user` to the following file:\n\n#### app/models/todo.rb\n\n```ruby\nclass Todo \u003c ApplicationRecord\n  belongs_to :user\nend\n```\n\nWith the commit message:\n\n```\nRelate todo to user\n\nCreates the many-to-one relationship between the todo and the user.\n```\n\nWhen you're ready to generate a post from your git commit history, run:\n\n`log2blog YourGitUserName/YourToDoListAppName`\n\nThis will output markdown corresponding to each commit, oldest to newest. It might render in a Jekyll blog, for example, as:\n\n\u003cimg src=\"https://raw.githubusercontent.com/CodingItWrong/log2blog/master/docs/images/output-example.png\" style=\"border: solid 2px black\" /\u003e\n\nFor a real-world example of an article generated via Log2Blog, see [learntdd.in/rails](http://learntdd.in/rails/).\n\n## Installation\n\nTo install log2blog globally so you can run `log2blog` from anywhere, clone or download the repo from GitHub.\n\nIf you'd like to install `log2blog` locally in a Ruby project, add it to your Gemfile:\n\n```ruby\ngem \"log2blog\", github: \"CodingItWrong/log2blog\", branch: \"master\"\n```\n\nThen run `bundle install`.\n\nIf log2blog is installed locally, you can run it with `bundle exec log2blog`.\n\n## Usage\n\nTo connect to GitHub you'll need a GitHub OAuth token. You can create one for your account on the [Personal Access Tokens page](https://github.com/settings/tokens).\n\nTo output the entire history of the repo converted to markdown:\n\n```\nbin/log2blog GITHUB_USERNAME/REPO_NAME --token GITHUB_OAUTH_TOKEN\n```\n\nYou can also specify a commit hash to start from:\n\n```\nbin/log2blog GITHUB_USERNAME/REPO_NAME 4342fbec671ab2ce202aa4997e1388b8bcbb48a1 --token GITHUB_OAUTH_TOKEN\n```\n\nYou can skip outputting files matching certain names in all commits:\n\n```\nbin/log2blog GITHUB_USERNAME/REPO_NAME 4342fbec671ab2ce202aa4997e1388b8bcbb48a1 --skip db/schema.rb --token GITHUB_OAUTH_TOKEN\n```\n\n## Contributing\n\nContributions to log2blog's code, tests, and documentation are welcome! To contribute:\n\n1. Fork the project ( http://github.com/CodingItWrong/log2blog/fork )\n2. Create your feature branch (git checkout -b my-new-feature)\n3. Commit your changes (git commit -am 'Add some feature')\n4. Push to the branch (git push origin my-new-feature)\n5. Create a new Pull Request\n\n## License\n\nMIT. See `LICENSE.txt` for details.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcodingitwrong%2Flog2blog","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcodingitwrong%2Flog2blog","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcodingitwrong%2Flog2blog/lists"}